From c95a47ca97edb99f4c1b482a0574d37b27009b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Fri, 15 Mar 2024 21:34:27 -0300 Subject: [PATCH 001/429] fix #4430. Shift+D whem selecting all the objects of a linked aggregate creates a normal copy that is not linked --- .../bim/module/geometry/operator.py | 90 +++++++++++-------- 1 file changed, 54 insertions(+), 36 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 54111eed24..79ed1e1b32 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -843,7 +843,7 @@ class OverrideDuplicateMove(bpy.types.Operator): # Recreate decompositions tool.Root.recreate_decompositions(decomposition_relationships, old_to_new) - OverrideDuplicateMove.handle_linked_aggregates(old_to_new) + OverrideDuplicateMove.remove_linked_aggregate_data(old_to_new) blenderbim.bim.handler.refresh_ui_data() return old_to_new @@ -896,25 +896,21 @@ class OverrideDuplicateMove(bpy.types.Operator): if entity in old_to_new.keys(): core.remove_connection(tool.Geometry, connection=connection) - @staticmethod - def handle_linked_aggregates(old_to_new): + def remove_linked_aggregate_data(old_to_new): for old, new in old_to_new.items(): pset = ifcopenshell.util.element.get_pset(new[0], "BBIM_Linked_Aggregate") if pset: - old_aggregate = ifcopenshell.util.element.get_aggregate(old) - new_aggregate = ifcopenshell.util.element.get_aggregate(new[0]) - if old_aggregate == new_aggregate: - parts = ifcopenshell.util.element.get_parts(new_aggregate) - if parts: - index = DuplicateMoveLinkedAggregate.get_max_index(parts) - index += 1 - pset = tool.Ifc.get().by_id(pset['id']) - ifcopenshell.api.run( - "pset.edit_pset", - tool.Ifc.get(), - pset=pset, - properties={"Index": index}, - ) + pset = tool.Ifc.get().by_id(pset["id"]) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + + if new[0].is_a("IfcElementAssembly"): + linked_aggregate_group = [ + r.RelatingGroup + for r in getattr(new[0], "HasAssignments", []) or [] + if r.is_a("IfcRelAssignsToGroup") + if "BBIM_Linked_Aggregate" in r.RelatingGroup.Name + ] + tool.Ifc.run("group.unassign_group", group=linked_aggregate_group[0], product=new[0]) class OverrideDuplicateMoveLinkedMacro(bpy.types.Macro): @@ -974,15 +970,15 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): obj.select_set(True) parts = ifcopenshell.util.element.get_parts(element) if parts: - index = DuplicateMoveLinkedAggregate.get_max_index(parts) + index = get_max_index(parts) add_linked_aggregate_pset(element, index) index +=1 for part in parts: if part.is_a("IfcElementAssembly"): select_objects_and_add_data(part) else: - add_linked_aggregate_pset(part, index) - index += 1 + index = add_linked_aggregate_pset(part, index) + # index += 1 obj = tool.Ifc.get_object(part) obj.select_set(True) @@ -1002,6 +998,8 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): pset=pset, properties={"Index": index}, ) + + index += 1 else: pass @@ -1042,7 +1040,39 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): if re.findall(pattern2, new_obj.name): split_name = new_obj.name.split(".") new_obj.name = split_name[0] + "_" + number + + def get_max_index(parts): + psets = [ifcopenshell.util.element.get_pset(p, "BBIM_Linked_Aggregate") for p in parts] + index = [i['Index'] for i in psets if i] + if len(index) > 0: + index = max(index) + return index + else: + return 0 + def copy_linked_aggregate_data(old_to_new): + for old, new in old_to_new.items(): + pset = ifcopenshell.util.element.get_pset(old, "BBIM_Linked_Aggregate") + if pset: + new_pset = ifcopenshell.api.run( + "pset.add_pset", tool.Ifc.get(), product=new[0], name=self.pset_name + ) + + ifcopenshell.api.run( + "pset.edit_pset", + tool.Ifc.get(), + pset=new_pset, + properties={"Index": pset["Index"]}, + ) + + if new[0].is_a("IfcElementAssembly"): + linked_aggregate_group = [ + r.RelatingGroup + for r in getattr(old, "HasAssignments", []) or [] + if r.is_a("IfcRelAssignsToGroup") + if "BBIM_Linked_Aggregate" in r.RelatingGroup.Name + ] + tool.Ifc.run("group.assign_group", group=linked_aggregate_group[0], products=new) if len(context.selected_objects) != 1: return {"FINISHED"} @@ -1063,28 +1093,18 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): select_objects_and_add_data(selected_element) old_to_new = OverrideDuplicateMove.execute_ifc_duplicate_operator(self, context, linked=True) + + tool.Root.recreate_aggregate(old_to_new) + + copy_linked_aggregate_data(old_to_new) custom_incremental_naming_for_element_assembly(old_to_new) - # Recreate aggregate relationship - for old in old_to_new.keys(): - if old.is_a("IfcElementAssembly"): - tool.Root.recreate_aggregate(old_to_new) - blenderbim.bim.handler.refresh_ui_data() return old_to_new - @staticmethod - def get_max_index(parts): - psets = [ifcopenshell.util.element.get_pset(p, "BBIM_Linked_Aggregate") for p in parts] - index = [i['Index'] for i in psets if i] - if len(index) > 0: - index = max(index) - return index - else: - return 0 @@ -1176,8 +1196,6 @@ class RefreshLinkedAggregate(bpy.types.Operator): obj.name = original_names[group][index] except: return - - def get_element_assembly(element): if element.is_a("IfcElementAssembly"): From 3bf4a8ef529f83ba1755690175891a104e7e9209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Sat, 16 Mar 2024 12:44:26 -0300 Subject: [PATCH 002/429] small refactor --- .../bim/module/geometry/operator.py | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 79ed1e1b32..1ffad9df69 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -1238,6 +1238,23 @@ class RefreshLinkedAggregate(bpy.types.Operator): return list(set(linked_aggregate_groups)), selected_parents + def get_original_matrix(element, base_instance): + selected_obj = tool.Ifc.get_object(base_instance) + selected_matrix = selected_obj.matrix_world + object_duplicate = tool.Ifc.get_object(element) + duplicate_matrix = object_duplicate.matrix_world.decompose() + + return selected_matrix, duplicate_matrix + + def set_new_matrix(selected_matrix, duplicate_matrix, old_to_new): + for old, new in old_to_new.items(): + new_obj = tool.Ifc.get_object(new[0]) + new_base_matrix = Matrix.LocRotScale(*duplicate_matrix) + matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world + new_obj_matrix = new_base_matrix @ matrix_diff + new_obj.matrix_world = new_obj_matrix + + active_element = tool.Ifc.get_entity(context.active_object) if not active_element: self.report({"INFO"}, "Object has no Ifc metadata.") @@ -1277,10 +1294,11 @@ class RefreshLinkedAggregate(bpy.types.Operator): element_aggregate = ifcopenshell.util.element.get_aggregate(element) - selected_obj = tool.Ifc.get_object(base_instance) - selected_matrix = selected_obj.matrix_world - object_duplicate = tool.Ifc.get_object(element) - duplicate_matrix = object_duplicate.matrix_world.decompose() + # selected_obj = tool.Ifc.get_object(base_instance) + # selected_matrix = selected_obj.matrix_world + # object_duplicate = tool.Ifc.get_object(element) + # duplicate_matrix = object_duplicate.matrix_world.decompose() + selected_matrix, duplicate_matrix = get_original_matrix(element, base_instance) original_names = get_original_names(element) @@ -1292,12 +1310,14 @@ class RefreshLinkedAggregate(bpy.types.Operator): tool.Ifc.get_object(base_instance).select_set(True) old_to_new = DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context) - for old, new in old_to_new.items(): - new_obj = tool.Ifc.get_object(new[0]) - new_base_matrix = Matrix.LocRotScale(*duplicate_matrix) - matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world - new_obj_matrix = new_base_matrix @ matrix_diff - new_obj.matrix_world = new_obj_matrix + + set_new_matrix(selected_matrix, duplicate_matrix, old_to_new) + # for old, new in old_to_new.items(): + # new_obj = tool.Ifc.get_object(new[0]) + # new_base_matrix = Matrix.LocRotScale(*duplicate_matrix) + # matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world + # new_obj_matrix = new_base_matrix @ matrix_diff + # new_obj.matrix_world = new_obj_matrix for old, new in old_to_new.items(): if element_aggregate and new[0].is_a("IfcElementAssembly"): From 4829c4c02bb27cb18798f78c72eadfed736423f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Sat, 16 Mar 2024 15:27:04 -0300 Subject: [PATCH 003/429] fix: when subaggregate that is a linked aggregate is unassinged from the main aggregate, it remains a linked aggregate. --- .../blenderbim/bim/module/aggregate/operator.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index bf336ad69b..9e26e78db0 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -91,10 +91,11 @@ class BIM_OT_aggregate_unassign_object(bpy.types.Operator, Operator): ) # Removes Pset related to Linked Aggregates - pset = ifcopenshell.util.element.get_pset(element, 'BBIM_Linked_Aggregate') - if pset: - pset = tool.Ifc.get().by_id(pset["id"]) - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + if not element.is_a('IfcElementAssembly'): + pset = ifcopenshell.util.element.get_pset(element, 'BBIM_Linked_Aggregate') + if pset: + pset = tool.Ifc.get().by_id(pset["id"]) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) class BIM_OT_enable_editing_aggregate(bpy.types.Operator, Operator): From e6bef16c45d6dcbab712c97598269afebe31d9d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Mon, 18 Mar 2024 23:39:06 -0300 Subject: [PATCH 004/429] small deletions --- .../blenderbim/bim/module/geometry/operator.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 1ffad9df69..50ad245ac0 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -1294,10 +1294,6 @@ class RefreshLinkedAggregate(bpy.types.Operator): element_aggregate = ifcopenshell.util.element.get_aggregate(element) - # selected_obj = tool.Ifc.get_object(base_instance) - # selected_matrix = selected_obj.matrix_world - # object_duplicate = tool.Ifc.get_object(element) - # duplicate_matrix = object_duplicate.matrix_world.decompose() selected_matrix, duplicate_matrix = get_original_matrix(element, base_instance) original_names = get_original_names(element) @@ -1312,12 +1308,6 @@ class RefreshLinkedAggregate(bpy.types.Operator): old_to_new = DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context) set_new_matrix(selected_matrix, duplicate_matrix, old_to_new) - # for old, new in old_to_new.items(): - # new_obj = tool.Ifc.get_object(new[0]) - # new_base_matrix = Matrix.LocRotScale(*duplicate_matrix) - # matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world - # new_obj_matrix = new_base_matrix @ matrix_diff - # new_obj.matrix_world = new_obj_matrix for old, new in old_to_new.items(): if element_aggregate and new[0].is_a("IfcElementAssembly"): From fc5bb230a9807f99ebc825b866a4e2830a6a52fc Mon Sep 17 00:00:00 2001 From: Bruno Postle Date: Sun, 21 Apr 2024 11:12:24 +0100 Subject: [PATCH 005/429] Abandon SVG layout generation on missing drawings Drawings need to be generated before layout can be generated, so remove a partial failed layout caused by missing drawings. --- src/blenderbim/blenderbim/core/drawing.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index 36cec23daa..9d000bec1d 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -94,7 +94,12 @@ def add_sheet(ifc, drawing, titleblock=None): def regenerate_sheet(drawing, sheet=None): titleblock_uri = drawing.get_document_uri(sheet, "TITLEBLOCK") drawing.create_svg_sheet(sheet, drawing.sanitise_filename(Path(titleblock_uri).stem)) - drawing.add_drawings(sheet) + try: + drawing.add_drawings(sheet) + except FileNotFoundError: + path_layout = drawing.get_document_uri(sheet, "LAYOUT") + if drawing.does_file_exist(path_layout): + drawing.delete_file(path_layout) def open_sheet(drawing, sheet=None): From 589b98053e62ee14b6817e7d2b9f5b6b527310b7 Mon Sep 17 00:00:00 2001 From: Kristof Semjen Date: Sun, 21 Apr 2024 10:55:50 +0200 Subject: [PATCH 006/429] Fixes #4261 SWIG_Python_str_AsChar and SWIG_Python_str_DelForPy3 are no longer available in swig 4.2 (see : https://github.com/swig/swig/commit/f89dd59d4b82ece899087682fdb86e94d2611513 ), this commit fixes the build for swig versions > 4.2. --- src/ifcwrap/utils/type_conversion.i | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ifcwrap/utils/type_conversion.i b/src/ifcwrap/utils/type_conversion.i index af9f5a1a9d..25c89bf404 100644 --- a/src/ifcwrap/utils/type_conversion.i +++ b/src/ifcwrap/utils/type_conversion.i @@ -72,9 +72,16 @@ template <> std::string cast_pyobject(PyObject* element) { + #if SWIG_VERSION >= 0x040200 + PyObject *pbytes = NULL; + const char* str_data = SWIG_PyUnicode_AsUTF8AndSize(element, NULL, &pbytes); + std::string str = str_data; + Py_XDECREF(pbytes); + #else char* str_data = SWIG_Python_str_AsChar(element); std::string str = str_data; SWIG_Python_str_DelForPy3(str_data); + #endif return str; } From 9e794995325fdc17f0bbe51cbc4502004708bbae Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 19 Apr 2024 18:46:44 +0500 Subject: [PATCH 007/429] small optimization --- src/blenderbim/blenderbim/bim/import_ifc.py | 26 +++++++-------- .../ifcopenshell/util/placement.py | 4 +-- .../ifcopenshell/util/sequence.py | 33 ++++++++++--------- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 02173e2681..64846215e4 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -1627,27 +1627,27 @@ class IfcImporter: if self.ifc_import_settings.has_filter: rel_aggregates = set() for element in self.elements: - if element.IsDecomposedBy: - rel_aggregates.add(element.IsDecomposedBy[0]) - elif element.Decomposes: - rel_aggregates.add(element.Decomposes[0]) - elif getattr(element, "IsNestedBy", []): # IFC2X3 does not have IsNestedBy - if [e for e in element.IsNestedBy[0].RelatedObjects if not e.is_a("IfcPort")]: - rel_aggregates.add(element.IsNestedBy[0]) - elif getattr(element, "Nests", []): - rel_aggregates.add(element.Nests[0]) + if decomposed_by := element.IsDecomposedBy: + rel_aggregates.add(decomposed_by[0]) + elif decomposes := element.Decomposes: + rel_aggregates.add(decomposes[0]) + elif nested_by := getattr(element, "IsNestedBy", []): # IFC2X3 does not have IsNestedBy + if next((e for e in nested_by[0].RelatedObjects if not e.is_a("IfcPort")), None): + rel_aggregates.add(nested_by[0]) + elif nests := getattr(element, "Nests", []): + rel_aggregates.add(nests[0]) else: rel_aggregates = [ r for r in self.file.by_type("IfcRelAggregates") - if r.RelatingObject.is_a("IfcElement") or r.RelatingObject.is_a("IfcElementType") + if (relating_obj := r.RelatingObject).is_a("IfcElement") or relating_obj.is_a("IfcElementType") ] + [ r for r in self.file.by_type("IfcRelNests") if ( - r.RelatingObject.is_a("IfcElement") - or r.RelatingObject.is_a("IfcElementType") - or (r.RelatingObject.is_a("IfcPositioningElement") and not r.RelatingObject.is_a("IfcGrid")) + (relating_obj := r.RelatingObject).is_a("IfcElement") + or relating_obj.is_a("IfcElementType") + or (relating_obj.is_a("IfcPositioningElement") and not relating_obj.is_a("IfcGrid")) ) and [e for e in r.RelatedObjects if not e.is_a("IfcPort")] ] diff --git a/src/ifcopenshell-python/ifcopenshell/util/placement.py b/src/ifcopenshell-python/ifcopenshell/util/placement.py index 1bf35ed07b..abbffc5b96 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/placement.py +++ b/src/ifcopenshell-python/ifcopenshell/util/placement.py @@ -121,10 +121,10 @@ def get_local_placement(placement: ifcopenshell.entity_instance) -> MatrixType: """ if placement is None: return np.eye(4) - if placement.PlacementRelTo is None: + if (rel_to := placement.PlacementRelTo) is None: parent = np.eye(4) else: - parent = get_local_placement(placement.PlacementRelTo) + parent = get_local_placement(rel_to) return np.dot(parent, get_axis2placement(placement.RelativePlacement)) diff --git a/src/ifcopenshell-python/ifcopenshell/util/sequence.py b/src/ifcopenshell-python/ifcopenshell/util/sequence.py index 720b81c151..5b254d973c 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/util/sequence.py @@ -181,14 +181,16 @@ def is_day_in_work_time(day, work_time): is_day_in_work_time = True if isinstance(day, datetime.datetime): day = datetime.date(day.year, day.month, day.day) - if work_time[4]: - start = ifcopenshell.util.date.ifc2datetime(work_time[4]) + # 4 IfcWorktime Start + if start := work_time[4]: + start = ifcopenshell.util.date.ifc2datetime(start) if day > start: is_day_in_work_time = True else: is_day_in_work_time = False - if work_time[5]: - finish = ifcopenshell.util.date.ifc2datetime(work_time[5]) + # 5 IfcWorktime Finish + if finish := work_time[5]: + finish = ifcopenshell.util.date.ifc2datetime(finish) if day < finish: is_day_in_work_time = True else: @@ -205,36 +207,39 @@ def is_work_time_applicable_to_day(work_time, day): if isinstance(day, datetime.datetime): day = datetime.date(day.year, day.month, day.day) recurrence = work_time.RecurrencePattern - if recurrence.RecurrenceType == "DAILY": + recurrence_type: RECURRENCE_TYPE = recurrence.RecurrenceType + if recurrence_type == "DAILY": if not recurrence.Interval and not recurrence.Occurrences: return True + # 4 IfcWorktime Start if not work_time[4]: return False return False # TODO - elif recurrence.RecurrenceType == "WEEKLY": + elif recurrence_type == "WEEKLY": if not recurrence.Interval and not recurrence.Occurrences: return (day.weekday() + 1) in recurrence.WeekdayComponent + # 4 IfcWorktime Start if not work_time[4]: return False return False # TODO - elif recurrence.RecurrenceType == "MONTHLY_BY_DAY_OF_MONTH": + elif recurrence_type == "MONTHLY_BY_DAY_OF_MONTH": if not recurrence.Interval and not recurrence.Occurrences: return day.day in recurrence.DayComponent return False # TODO - elif recurrence.RecurrenceType == "MONTHLY_BY_POSITION": + elif recurrence_type == "MONTHLY_BY_POSITION": if not recurrence.Interval and not recurrence.Occurrences: return (day.weekday() + 1) in recurrence.WeekdayComponent and floor( day.day / 7 ) + 1 == recurrence["Position"] return False # TODO - elif recurrence.RecurrenceType == "YEARLY_BY_DAY_OF_MONTH": + elif recurrence_type == "YEARLY_BY_DAY_OF_MONTH": if not recurrence.Interval and not recurrence.Occurrences: return ( day.month in recurrence.MonthComponent and day.day in recurrence.DayComponent ) return False # TODO - elif recurrence.RecurrenceType == "YEARLY_BY_POSITION": + elif recurrence_type == "YEARLY_BY_POSITION": if not recurrence.Interval and not recurrence.Occurrences: return ( day.month in recurrence.MonthComponent @@ -262,11 +267,9 @@ def get_nested_tasks(task): def get_parent_task(task): - return ( - task.Nests[0].RelatingObject - if task.Nests and task.Nests[0].RelatingObject.is_a("IfcTask") - else None - ) + nests = task.Nests + if nests and (obj := nests[0].RelatingObject).is_a("IfcTask"): + return obj def get_all_nested_tasks(task): From 889c9a9e9f31e7ab320b3cdd71a7252a0670b299 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 22 Apr 2024 17:01:28 +0500 Subject: [PATCH 008/429] typing --- src/blenderbim/blenderbim/bim/import_ifc.py | 20 ++--- src/blenderbim/blenderbim/tool/geometry.py | 2 +- .../ifcopenshell/__init__.py | 11 ++- .../api/sequence/edit_task_time.py | 17 +++-- .../api/sequence/edit_work_time.py | 12 ++- src/ifcopenshell-python/ifcopenshell/file.py | 6 +- .../ifcopenshell/util/sequence.py | 75 ++++++++++++------- 7 files changed, 92 insertions(+), 51 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 64846215e4..fb7c07d7cd 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -199,7 +199,7 @@ class MaterialCreator: class IfcImporter: - def __init__(self, ifc_import_settings): + def __init__(self, ifc_import_settings: IfcImportSettings): self.ifc_import_settings = ifc_import_settings self.diff = None self.file: ifcopenshell.file = None @@ -725,7 +725,7 @@ class IfcImporter: if len(subelement.Coordinates) == 3 and self.is_point_far_away(subelement, is_meters=False): return True - def apply_blender_offset_to_matrix_world(self, obj, matrix): + def apply_blender_offset_to_matrix_world(self, obj: bpy.types.Object, matrix: np.ndarray) -> mathutils.Matrix: props = bpy.context.scene.BIMGeoreferenceProperties if props.has_blender_offset: if obj.data and obj.data.get("has_cartesian_point_offset", None): @@ -953,7 +953,9 @@ class IfcImporter: self.create_product(element, mesh=mesh) def create_products( - self, products, settings: Optional[ifcopenshell.geom.main.settings] = None + self, + products: set[ifcopenshell.entity_instance], + settings: Optional[ifcopenshell.geom.main.settings] = None, ) -> set[ifcopenshell.entity_instance]: results = set() if not products: @@ -1810,7 +1812,7 @@ class IfcImporter: if rel.is_a("IfcRelAssignsToGroup") and rel.RelatingGroup.ObjectType == "DRAWING": return rel.RelatingGroup - def get_element_matrix(self, element: ifcopenshell.entity_instance) -> np.array: + def get_element_matrix(self, element: ifcopenshell.entity_instance) -> np.ndarray: if isinstance(element, ifcopenshell.sqlite_entity): result = self.geometry_cache["shapes"][element.id()]["matrix"] else: @@ -1959,14 +1961,14 @@ class IfcImporter: print(traceback.format_exc()) - def a2p(self, o, z, x): + def a2p(self, o: mathutils.Vector, z: mathutils.Vector, x: mathutils.Vector) -> mathutils.Matrix: y = z.cross(x) r = mathutils.Matrix((x, y, z, o)) r.resize_4x4() r.transpose() return r - def get_axis2placement(self, plc): + def get_axis2placement(self, plc: ifcopenshell.entity_instance) -> mathutils.Matrix: if plc.is_a("IfcAxis2Placement3D"): z = mathutils.Vector(plc.Axis.DirectionRatios if plc.Axis else (0, 0, 1)) x = mathutils.Vector(plc.RefDirection.DirectionRatios if plc.RefDirection else (1, 0, 0)) @@ -1986,7 +1988,7 @@ class IfcImporter: o = plc.LocalOrigin.Coordinates return self.a2p(o, z, x) - def get_local_placement(self, plc): + def get_local_placement(self, plc: Optional[ifcopenshell.entity_instance] = None) -> mathutils.Matrix: if plc is None: return mathutils.Matrix() if plc.PlacementRelTo is None: @@ -2001,11 +2003,11 @@ class IfcImporter: bpy.context.scene.BIMRootProperties.contexts = str(subcontext.id()) break - def link_element(self, element, obj): + def link_element(self, element: ifcopenshell.entity_instance, obj: IFC_CONNECTED_TYPE) -> None: self.added_data[element.id()] = obj tool.Ifc.link(element, obj) - def set_matrix_world(self, obj, matrix_world): + def set_matrix_world(self, obj: bpy.types.Object, matrix_world: mathutils.Matrix) -> None: obj.matrix_world = matrix_world tool.Geometry.record_object_position(obj) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 0a3ff34fdf..7acd2429ed 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -622,7 +622,7 @@ class Geometry(blenderbim.core.tool.Geometry): obj.data.BIMMeshProperties.material_checksum = str([s.id() for s in cls.get_styles(obj) if s]) @classmethod - def record_object_position(cls, obj): + def record_object_position(cls, obj: bpy.types.Object) -> None: # These are recorded separately because they have different numerical tolerances obj.BIMObjectProperties.location_checksum = repr(np.array(obj.matrix_world.translation).tobytes()) obj.BIMObjectProperties.rotation_checksum = repr(np.array(obj.matrix_world.to_3x3()).tobytes()) diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py index f23d64d933..fb984b7176 100644 --- a/src/ifcopenshell-python/ifcopenshell/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/__init__.py @@ -39,6 +39,7 @@ import sys import tempfile import zipfile from pathlib import Path +from typing import Optional import ifcopenshell.util.file @@ -197,12 +198,14 @@ def register_schema(schema): register_schema_attributes(schema.schema) -def schema_by_name(schema=None, schema_version=None): +def schema_by_name( + schema: Optional[str] = None, schema_version: Optional[tuple[int, ...]] = None +) -> ifcopenshell_wrapper.schema_definition: """Returns an object allowing you to query the IFC schema itself :param schema: Which IFC schema to use, chosen from "IFC2X3", "IFC4", or "IFC4X3". These refer to the ISO approved versions of IFC. - :type schema: string + :type schema: string, optional :param schema_version: If you want to specify an exact version of IFC that may not be an ISO approved version, use this argument instead of ``schema``. IFC versions on technical.buildingsmart.org are @@ -211,7 +214,9 @@ def schema_by_name(schema=None, schema_version=None): ADD2 TC1, which is the official version approved by ISO when people refer to "IFC4". Generally you should not use this argument unless you are testing non-ISO IFC releases. - :type schema_version: tuple[int] + :type schema_version: tuple[int, ...], optional + :return: Schema definition object. + :rtype: ifocpenshell_wrapper.schema_definition """ if schema_version: prefixes = ("IFC", "X", "_ADD", "_TC") diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py index 4aed2fd050..68b5d59bbb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py @@ -17,12 +17,19 @@ # along with IfcOpenShell. If not, see . import datetime +import ifcopenshell.util.constraint import ifcopenshell.util.date import ifcopenshell.util.sequence +from typing import Any, Optional class Usecase: - def __init__(self, file, task_time=None, attributes=None): + def __init__( + self, + file: ifcopenshell.file, + task_time: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, + ): """Edits the attributes of an IfcTaskTime For more information about the attributes and data types of an @@ -55,7 +62,7 @@ class Usecase: self.file = file self.settings = {"task_time": task_time, "attributes": attributes or {}} - def execute(self): + def execute(self) -> None: self.task = self.get_task() self.calendar = ifcopenshell.util.sequence.derive_calendar(self.task) @@ -169,12 +176,12 @@ class Usecase: duration, "IfcDuration" ) - def get_task(self): - return [ + def get_task(self) -> ifcopenshell.entity_instance: + return next( e for e in self.file.get_inverse(self.settings["task_time"]) if e.is_a("IfcTask") - ][0] + ) def handle_resource_calculation(self): resources = ifcopenshell.util.sequence.get_task_resources(self.task, is_deep=False) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py index 76a0521478..4512789fdb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py @@ -17,10 +17,16 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.date +from typing import Any, Optional class Usecase: - def __init__(self, file, work_time=None, attributes=None): + def __init__( + self, + file: ifcopenshell.file, + work_time: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, + ): """Edits the attributes of an IfcWorkTime For more information about the attributes and data types of an @@ -53,13 +59,15 @@ class Usecase: self.file = file self.settings = {"work_time": work_time, "attributes": attributes or {}} - def execute(self): + def execute(self) -> None: for name, value in self.settings["attributes"].items(): if name in ("Start", "StartDate"): value = ifcopenshell.util.date.datetime2ifc(value, "IfcDate") + # 4 IfcWorktime Start self.settings["work_time"][4] = value elif name in ("Finish", "FinishDate"): value = ifcopenshell.util.date.datetime2ifc(value, "IfcDate") + # 5 IfcWorktime Finish self.settings["work_time"][5] = value else: setattr(self.settings["work_time"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index 8c7914a8b0..d5446d731e 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -28,7 +28,7 @@ import numbers import zipfile import functools from pathlib import Path -from typing import List, Optional +from typing import Optional, Any import ifcopenshell.util.element import ifcopenshell.util.file @@ -52,7 +52,7 @@ class Transaction: self.batch_delete_ids = set() self.batch_inverses = [] - def serialise_entity_instance(self, element): + def serialise_entity_instance(self, element: ifcopenshell.entity_instance) -> dict[str, Any]: info = element.get_info() for key, value in info.items(): info[key] = self.serialise_value(element, value) @@ -103,7 +103,7 @@ class Transaction: } ) - def store_delete(self, element): + def store_delete(self, element: ifcopenshell.entity_instance) -> None: inverses = {} if self.is_batched: if element.id() not in self.batch_delete_ids: diff --git a/src/ifcopenshell-python/ifcopenshell/util/sequence.py b/src/ifcopenshell-python/ifcopenshell/util/sequence.py index 5b254d973c..db98be456f 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/util/sequence.py @@ -20,7 +20,20 @@ import datetime import ifcopenshell.util.date from math import floor from functools import lru_cache -from collections import namedtuple +from typing import Union, Literal, Optional, Iterator + + +DURATION_TYPE = Literal["ELAPSEDTIME", "WORKTIME", "NOTDEFINED"] +RECURRENCE_TYPE = Literal[ + "BY_DAY_COUNT", + "BY_WEEKDAY_COUNT", + "DAILY", + "MONTHLY_BY_DAY_OF_MONTH", + "MONTHLY_BY_POSITION", + "WEEKLY", + "YEARLY_BY_DAY_OF_MONTH", + "YEARLY_BY_POSITION", +] def derive_date(task, attribute_name, date=None, is_earliest=False, is_latest=False): @@ -49,7 +62,7 @@ def derive_date(task, attribute_name, date=None, is_earliest=False, is_latest=Fa return date -def derive_calendar(task): +def derive_calendar(task: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: calendar = get_calendar(task) if calendar: return calendar @@ -57,7 +70,7 @@ def derive_calendar(task): return derive_calendar(rel.RelatingObject) -def get_calendar(task): +def get_calendar(task: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: calendar = [ rel.RelatingControl for rel in task.HasAssignments or [] @@ -68,7 +81,7 @@ def get_calendar(task): return calendar[0] -def count_working_days(start, finish, calendar): +def count_working_days(start, finish, calendar: ifcopenshell.entity_instance) -> int: result = 0 if start == finish: return 0 @@ -88,7 +101,11 @@ def count_working_days(start, finish, calendar): def get_start_or_finish_date( - start, duration, duration_type, calendar, date_type="FINISH" + start, + duration, + duration_type: DURATION_TYPE, + calendar: ifcopenshell.entity_instance, + date_type: Literal["START", "FINISH"] = "FINISH", ): if not duration.days: # Typically a milestone will have zero duration, so the start == finish @@ -107,7 +124,7 @@ def get_start_or_finish_date( return datetime.datetime.combine(result, datetime.time(17)) -def offset_date(start, duration, duration_type, calendar): +def offset_date(start, duration, duration_type: DURATION_TYPE, calendar: ifcopenshell.entity_instance): current_date = start months = getattr(duration, "months", 0) years = getattr(duration, "years", 0) @@ -129,7 +146,7 @@ def offset_date(start, duration, duration_type, calendar): return current_date -def get_soonest_working_day(start, duration_type, calendar): +def get_soonest_working_day(start, duration_type: DURATION_TYPE, calendar: ifcopenshell.entity_instance): if duration_type == "ELAPSEDTIME" or not is_calendar_applicable(start, calendar): return start while not is_working_day(start, calendar): @@ -139,7 +156,7 @@ def get_soonest_working_day(start, duration_type, calendar): return start -def get_recent_working_day(start, duration_type, calendar): +def get_recent_working_day(start, duration_type: DURATION_TYPE, calendar: ifcopenshell.entity_instance): if duration_type == "ELAPSEDTIME" or not is_calendar_applicable(start, calendar): return start while not is_working_day(start, calendar): @@ -150,7 +167,7 @@ def get_recent_working_day(start, duration_type, calendar): @lru_cache(maxsize=None) -def is_working_day(day, calendar): +def is_working_day(day, calendar: ifcopenshell.entity_instance) -> bool: is_working_day = False for work_time in calendar.WorkingTimes or []: if is_work_time_applicable_to_day(work_time, day): @@ -166,7 +183,7 @@ def is_working_day(day, calendar): @lru_cache(maxsize=None) -def is_calendar_applicable(day, calendar): +def is_calendar_applicable(day, calendar: ifcopenshell.entity_instance) -> bool: if not calendar or not calendar.WorkingTimes: return False is_applicable = False @@ -177,7 +194,7 @@ def is_calendar_applicable(day, calendar): return is_applicable -def is_day_in_work_time(day, work_time): +def is_day_in_work_time(day, work_time: ifcopenshell.entity_instance) -> bool: is_day_in_work_time = True if isinstance(day, datetime.datetime): day = datetime.date(day.year, day.month, day.day) @@ -198,7 +215,7 @@ def is_day_in_work_time(day, work_time): return is_day_in_work_time -def is_work_time_applicable_to_day(work_time, day): +def is_work_time_applicable_to_day(work_time: ifcopenshell.entity_instance, day) -> bool: if not is_day_in_work_time(day, work_time): return False if not work_time.RecurrencePattern: @@ -249,7 +266,7 @@ def is_work_time_applicable_to_day(work_time, day): return False # TODO -def get_task_work_schedule(task): +def get_task_work_schedule(task: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: parent_task = get_parent_task(task) if parent_task: return get_task_work_schedule(parent_task) or get_task_work_schedule(task) @@ -262,23 +279,23 @@ def get_task_work_schedule(task): return None -def get_nested_tasks(task): +def get_nested_tasks(task: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return [object for rel in task.IsNestedBy or [] for object in rel.RelatedObjects] -def get_parent_task(task): +def get_parent_task(task: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: nests = task.Nests if nests and (obj := nests[0].RelatingObject).is_a("IfcTask"): return obj -def get_all_nested_tasks(task): +def get_all_nested_tasks(task: ifcopenshell.entity_instance) -> Iterator[ifcopenshell.entity_instance]: for nested_task in get_nested_tasks(task): yield nested_task yield from get_all_nested_tasks(nested_task) -def get_work_schedule_tasks(work_schedule): +def get_work_schedule_tasks(work_schedule: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: tasks = [] for root_task in get_root_tasks(work_schedule): nested_tasks = get_all_nested_tasks(root_task) @@ -286,7 +303,7 @@ def get_work_schedule_tasks(work_schedule): return tasks -def get_root_tasks(work_schedule): +def get_root_tasks(work_schedule: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return [ obj for rel in work_schedule.Controls @@ -295,7 +312,7 @@ def get_root_tasks(work_schedule): ] -def get_root_tasks_ids(work_schedule): +def get_root_tasks_ids(work_schedule: ifcopenshell.entity_instance) -> list[int]: return [ obj.id() for rel in work_schedule.Controls @@ -304,7 +321,7 @@ def get_root_tasks_ids(work_schedule): ] -def guess_date_range(work_schedule): +def guess_date_range(work_schedule: ifcopenshell.entity_instance): earliest = None latest = None root_tasks = get_root_tasks(work_schedule) @@ -326,7 +343,7 @@ def guess_date_range(work_schedule): return earliest, latest -def get_direct_task_outputs(task): +def get_direct_task_outputs(task: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return [ rel.RelatingProduct for rel in task.HasAssignments @@ -334,7 +351,7 @@ def get_direct_task_outputs(task): ] -def get_task_outputs(task, is_deep=False): +def get_task_outputs(task: ifcopenshell.entity_instance, is_deep=False): if not is_deep: return get_direct_task_outputs(task) else: @@ -345,7 +362,7 @@ def get_task_outputs(task, is_deep=False): ] -def get_task_inputs(task, is_deep=False): +def get_task_inputs(task: ifcopenshell.entity_instance, is_deep=False): if not is_deep: return [ object @@ -368,7 +385,7 @@ def get_task_inputs(task, is_deep=False): ] -def get_task_resources(task, is_deep=False): +def get_task_resources(task: ifcopenshell.entity_instance, is_deep=False): if not is_deep: return [ object @@ -391,15 +408,17 @@ def get_task_resources(task, is_deep=False): ] -def has_task_outputs(task): +def has_task_outputs(task: ifcopenshell.entity_instance) -> bool: return len(get_task_outputs(task)) > 0 -def has_task_inputs(task): +def has_task_inputs(task: ifcopenshell.entity_instance) -> bool: return len(get_task_inputs(task)) > 0 -def get_tasks_for_product(product, schedule=None): +def get_tasks_for_product( + product: ifcopenshell.entity_instance, schedule: Optional[ifcopenshell.entity_instance] = None +) -> tuple[list[ifcopenshell.entity_instance], list[ifcopenshell.entity_instance]]: """ Get all tasks assigned to or referenced by the given product. @@ -441,7 +460,7 @@ def get_tasks_for_product(product, schedule=None): return inputs, outputs -def get_sequence_assignment(task, sequence="successor"): +def get_sequence_assignment(task: ifcopenshell.entity_instance, sequence="successor"): if sequence == "successor": relationship_attr = "IsPredecessorTo" elif sequence == "predecessor": From 34a4e3f37a1429b048ee10039209dd6e019b1297 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 22 Apr 2024 16:48:36 +0500 Subject: [PATCH 009/429] util.doc - use release schema version for IFC4X3 As it will be more like to be available in the ifcopenshell package. Related to #4565 --- .../ifcopenshell/util/doc.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/doc.py b/src/ifcopenshell-python/ifcopenshell/util/doc.py index d041d6b628..5a8115eb30 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/doc.py +++ b/src/ifcopenshell-python/ifcopenshell/util/doc.py @@ -20,8 +20,10 @@ import json from pathlib import Path import copy import ifcopenshell +import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper import ifcopenshell.util.attribute import ifcopenshell.util.schema +from typing import Optional, Literal try: import glob @@ -58,8 +60,8 @@ IFC4x3_SPEC_URL_TEMPLATE = "https://ifc43-docs.standards.buildingsmart.org/IFC/R # child -> description # note: in IFC4x3 there is no children[] for properties - -SCHEMA_FILES = { +SUPPORTED_SCHEMA = Literal["IFC2X3", "IFC4", "IFC4X3"] +SCHEMA_FILES: dict[SUPPORTED_SCHEMA, dict] = { "IFC2X3": { "entities": BASE_MODULE_PATH / "schema/ifc2x3_entities.json", "properties": BASE_MODULE_PATH / "schema/ifc2x3_properties.json", @@ -81,7 +83,11 @@ SCHEMA_FILES = { } db = None -schema_by_name = {"IFC2X3": None, "IFC4": None, "IFC4X3": None} +schema_by_name: dict[SUPPORTED_SCHEMA, Optional[ifcopenshell_wrapper.schema_definition]] = { + "IFC2X3": None, + "IFC4": None, + "IFC4X3": None, +} def get_db(version): @@ -103,11 +109,12 @@ def get_db(version): return db.get(version) -def get_schema_by_name(version: str): +def get_schema_by_name(version: str) -> ifcopenshell_wrapper.schema_definition: global schema_by_name version = ifcopenshell.util.schema.get_fallback_schema(version) if not schema_by_name[version]: - schema_by_name[version] = ifcopenshell.ifcopenshell_wrapper.schema_by_name(version) + schema_name = "IFC4X3_ADD2" if version == "IFC4X3" else version + schema_by_name[version] = ifcopenshell_wrapper.schema_by_name(schema_name) return schema_by_name[version] From 4efe2843389e02441aa933d0f743bf0a3329c1bd Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 22 Apr 2024 16:55:22 +0500 Subject: [PATCH 010/429] use IFC4X3_ADD2 for ifcopenshell.schema_by_name as it is the main IFC4X3 schema --- src/ifcopenshell-python/ifcopenshell/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py index fb984b7176..3f4a6acaa2 100644 --- a/src/ifcopenshell-python/ifcopenshell/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/__init__.py @@ -222,7 +222,7 @@ def schema_by_name( prefixes = ("IFC", "X", "_ADD", "_TC") schema = "".join("".join(map(str, t)) if t[1] else "" for t in zip(prefixes, schema_version)) else: - schema = {"IFC4X3": "IFC4X3_ADD1"}.get(schema, schema) + schema = {"IFC4X3": "IFC4X3_ADD2"}.get(schema, schema) return ifcopenshell_wrapper.schema_by_name(schema) From 377676f881789441593f56c8c6864b44d6ed79d4 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 23 Apr 2024 15:23:16 +0500 Subject: [PATCH 011/429] dev environment - add libs/desktop and bsdd --- src/blenderbim/docs/devs/installation.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/blenderbim/docs/devs/installation.rst b/src/blenderbim/docs/devs/installation.rst index a9b5135e66..ba881b51f5 100644 --- a/src/blenderbim/docs/devs/installation.rst +++ b/src/blenderbim/docs/devs/installation.rst @@ -103,6 +103,7 @@ For Linux or Mac: # Remove and link other IfcOpenShell utilities $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifccsv.py $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifcdiff.py + $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/bsdd.py $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifc4d $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifc5d $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifccityjson @@ -110,9 +111,11 @@ For Linux or Mac: $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifcpatch $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifctester $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifcfm + $ rm -r $BLENDER_ADDON_PATH/libs/Desktop $ ln -s $PWD/src/ifccsv/ifccsv.py $BLENDER_ADDON_PATH/libs/site/packages/ifccsv.py $ ln -s $PWD/src/ifcdiff/ifcdiff.py $BLENDER_ADDON_PATH/libs/site/packages/ifcdiff.py + $ ln -s $PWD/src/bsdd/bsdd.py $BLENDER_ADDON_PATH/libs/site/packages/bsdd.py $ ln -s $PWD/src/ifc4d/ifc4d $BLENDER_ADDON_PATH/libs/site/packages/ifc4d $ ln -s $PWD/src/ifc5d/ifc5d $BLENDER_ADDON_PATH/libs/site/packages/ifc5d $ ln -s $PWD/src/ifccityjson/ifccityjson $BLENDER_ADDON_PATH/libs/site/packages/ifccityjson @@ -120,6 +123,7 @@ For Linux or Mac: $ ln -s $PWD/src/ifcpatch/ifcpatch $BLENDER_ADDON_PATH/libs/site/packages/ifcpatch $ ln -s $PWD/src/ifctester/ifctester $BLENDER_ADDON_PATH/libs/site/packages/ifctester $ ln -s $PWD/src/ifcfm/ifcfm $BLENDER_ADDON_PATH/libs/site/packages/ifcfm + $ ln -s $PWD/src/blenderbim/blenderbim/libs/desktop $BLENDER_ADDON_PATH/libs/Desktop # Manually download some third party dependencies $ cd $BLENDER_ADDON_PATH/bim/data/gantt @@ -168,6 +172,7 @@ Before running it follow the instructions descibed after `rem` tags. echo Remove and link other IfcOpenShell utilities... del "%blenderbim%\libs\site\packages\ifccsv.py" del "%blenderbim%\libs\site\packages\ifcdiff.py" + del "%blenderbim%\libs\site\packages\bsdd.py" rd /S /Q "%blenderbim%\libs\site\packages\ifc4d" rd /S /Q "%blenderbim%\libs\site\packages\ifc5d" rd /S /Q "%blenderbim%\libs\site\packages\ifccityjson" @@ -175,9 +180,11 @@ Before running it follow the instructions descibed after `rem` tags. rd /S /Q "%blenderbim%\libs\site\packages\ifcpatch" rd /S /Q "%blenderbim%\libs\site\packages\ifctester" rd /S /Q "%blenderbim%\libs\site\packages\ifcfm" + rd /S /Q "%blenderbim%\libs\desktop" mklink "%blenderbim%\libs\site\packages\ifccsv.py" "%cd%\src\ifccsv\ifccsv.py" mklink "%blenderbim%\libs\site\packages\ifcdiff.py" "%cd%\src\ifcdiff\ifcdiff.py" + mklink "%blenderbim%\libs\site\packages\bsdd.py" "%cd%\src\bsdd\bsdd.py" mklink /D "%blenderbim%\libs\site\packages\ifc4d" "%cd%\src\ifc4d\ifc4d" mklink /D "%blenderbim%\libs\site\packages\ifc5d" "%cd%\src\ifc5d\ifc5d" mklink /D "%blenderbim%\libs\site\packages\ifccityjson" "%cd%\src\ifccityjson\ifccityjson" @@ -185,6 +192,7 @@ Before running it follow the instructions descibed after `rem` tags. mklink /D "%blenderbim%\libs\site\packages\ifcpatch" "%cd%\src\ifcpatch\ifcpatch" mklink /D "%blenderbim%\libs\site\packages\ifctester" "%cd%\src\ifctester\ifctester" mklink /D "%blenderbim%\libs\site\packages\ifcfm" "%cd%\src\ifcfm\ifcfm" + mklink /D "%blenderbim%\libs\desktop" "%cd%\src\blenderbim\blenderbim\libs\desktop" echo Manually downloading some third party dependencies... curl https://raw.githubusercontent.com/jsGanttImproved/jsgantt-improved/master/dist/jsgantt.js -o "%blenderbim%\bim\data\gantt\jsgantt.js" From 8beb1bef983ca3edd9ab930e3351226c3ec4917b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 23 Apr 2024 16:01:15 +0500 Subject: [PATCH 012/429] preserve selected profile index removing profiles --- src/blenderbim/blenderbim/bim/module/profile/operator.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/profile/operator.py b/src/blenderbim/blenderbim/bim/module/profile/operator.py index 839e6a49ae..188cceaf26 100644 --- a/src/blenderbim/blenderbim/bim/module/profile/operator.py +++ b/src/blenderbim/blenderbim/bim/module/profile/operator.py @@ -66,9 +66,15 @@ class RemoveProfileDef(bpy.types.Operator, tool.Ifc.Operator): profile: bpy.props.IntProperty() def _execute(self, context): + props = context.scene.BIMProfileProperties + current_index = props.active_profile_index ifcopenshell.api.run("profile.remove_profile", tool.Ifc.get(), profile=tool.Ifc.get().by_id(self.profile)) bpy.ops.bim.load_profiles() + # preserve selected index if possible + if props.profiles: + props.active_profile_index = min(current_index, len(props.profiles) - 1) + class EnableEditingProfile(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.enable_editing_profile" From b8a9674483bcfa96455c9590fcb938081b07a239 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 23 Apr 2024 16:39:46 +0500 Subject: [PATCH 013/429] bim.duplicate_profile simple operator for profile duplication example - https://imgur.com/a/dsP78iV --- .../blenderbim/bim/module/profile/__init__.py | 1 + .../blenderbim/bim/module/profile/operator.py | 21 +++++++++++++++++++ .../blenderbim/bim/module/profile/ui.py | 1 + src/blenderbim/blenderbim/tool/profile.py | 5 +++++ 4 files changed, 28 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/profile/__init__.py b/src/blenderbim/blenderbim/bim/module/profile/__init__.py index 69a153e315..89e20c8af7 100644 --- a/src/blenderbim/blenderbim/bim/module/profile/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/profile/__init__.py @@ -21,6 +21,7 @@ from . import ui, prop, operator, data classes = ( operator.AddProfileDef, + operator.DuplicateProfileDef, operator.DisableEditingArbitraryProfile, operator.DisableEditingProfile, operator.DisableProfileEditingUI, diff --git a/src/blenderbim/blenderbim/bim/module/profile/operator.py b/src/blenderbim/blenderbim/bim/module/profile/operator.py index 188cceaf26..6886d6e77c 100644 --- a/src/blenderbim/blenderbim/bim/module/profile/operator.py +++ b/src/blenderbim/blenderbim/bim/module/profile/operator.py @@ -132,6 +132,27 @@ class AddProfileDef(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.bim.load_profiles() +class DuplicateProfileDef(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.duplicate_profile_def" + bl_label = "Duplicate Profile" + bl_options = {"REGISTER", "UNDO"} + + @classmethod + def poll(cls, context): + props = context.scene.BIMProfileProperties + if len(props.profiles) > props.active_profile_index: + return True + cls.poll_message_set("No profile selected to duplicate.") + return False + + def _execute(self, context): + props = context.scene.BIMProfileProperties + ifc_file = tool.Ifc.get() + profile = ifc_file.by_id(props.profiles[props.active_profile_index].ifc_definition_id) + tool.Profile.duplicate_profile(profile) + bpy.ops.bim.load_profiles() + + class EnableEditingArbitraryProfile(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.enable_editing_arbitrary_profile" bl_label = "Enable Editing Arbitrary Profile" diff --git a/src/blenderbim/blenderbim/bim/module/profile/ui.py b/src/blenderbim/blenderbim/bim/module/profile/ui.py index 85e407b2e3..f1bce17c83 100644 --- a/src/blenderbim/blenderbim/bim/module/profile/ui.py +++ b/src/blenderbim/blenderbim/bim/module/profile/ui.py @@ -70,6 +70,7 @@ class BIM_PT_profiles(Panel): row = self.layout.row(align=True) row.prop(self.props, "profile_classes", text="") row.operator("bim.add_profile_def", text="", icon="ADD") + row.operator("bim.duplicate_profile_def", icon="DUPLICATE", text="") self.layout.template_list( "BIM_UL_profiles", diff --git a/src/blenderbim/blenderbim/tool/profile.py b/src/blenderbim/blenderbim/tool/profile.py index 92086a91ca..fdce5011e9 100644 --- a/src/blenderbim/blenderbim/tool/profile.py +++ b/src/blenderbim/blenderbim/tool/profile.py @@ -17,6 +17,7 @@ # along with BlenderBIM Add-on. If not, see . import ifcopenshell +import ifcopenshell.util.element import ifcopenshell.util.unit import ifcopenshell.util.placement import ifcopenshell.util.representation @@ -75,3 +76,7 @@ class Profile(blenderbim.core.tool.Profile): @classmethod def get_model_profiles(cls): return tool.Ifc.get().by_type("IfcProfileDef") + + @classmethod + def duplicate_profile(cls, profile: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: + return ifcopenshell.util.element.copy_deep(tool.Ifc.get(), profile) From cd013079f410dac3cf461bf30cba23affba6f6f1 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 23 Apr 2024 16:09:26 +0500 Subject: [PATCH 014/429] bim.duplicate_material --- .../blenderbim/bim/module/material/__init__.py | 1 + .../blenderbim/bim/module/material/operator.py | 13 +++++++++++++ src/blenderbim/blenderbim/bim/module/material/ui.py | 2 ++ src/blenderbim/blenderbim/tool/material.py | 4 ++++ 4 files changed, 20 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/material/__init__.py b/src/blenderbim/blenderbim/bim/module/material/__init__.py index 8757f86c55..037befdbfd 100644 --- a/src/blenderbim/blenderbim/bim/module/material/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/material/__init__.py @@ -24,6 +24,7 @@ classes = ( operator.AddLayer, operator.AddListItem, operator.AddMaterial, + operator.DuplicateMaterial, operator.AddMaterialSet, operator.AddProfile, operator.AssignMaterial, diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 77241afef5..b132332e5d 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -134,6 +134,19 @@ class AddMaterial(bpy.types.Operator, tool.Ifc.Operator): material_prop_purge() +class DuplicateMaterial(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.duplicate_material" + bl_label = "Diplicate Material" + bl_options = {"REGISTER", "UNDO"} + material: bpy.props.IntProperty(name="Material ID") + + def _execute(self, context): + ifc_file = tool.Ifc.get() + tool.Material.duplicate_material(ifc_file.by_id(self.material)) + material_prop_purge() + bpy.ops.bim.load_materials() + + class AddMaterialSet(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_material_set" bl_label = "Add Material Set" diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index 1f24392af2..6273596940 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -61,6 +61,8 @@ class BIM_PT_materials(Panel): if self.props.materials and self.props.active_material_index < len(self.props.materials): material = self.props.materials[self.props.active_material_index] if material.ifc_definition_id: + op = row.operator("bim.duplicate_material", text="", icon="DUPLICATE") + op.material = material.ifc_definition_id op = row.operator("bim.select_by_material", text="", icon="RESTRICT_SELECT_OFF") op.material = material.ifc_definition_id op = row.operator("bim.enable_editing_material", text="", icon="GREASEPENCIL") diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index 8ebb745fa0..a6e0391030 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -38,6 +38,10 @@ class Material(blenderbim.core.tool.Material): def disable_editing_materials(cls): bpy.context.scene.BIMMaterialProperties.is_editing = False + @classmethod + def duplicate_material(cls, material: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: + return ifcopenshell.util.element.copy_deep(tool.Ifc.get(), material) + @classmethod def enable_editing_materials(cls): bpy.context.scene.BIMMaterialProperties.is_editing = True From 3ff31b577cb227af396f04d280144bd1292a1eec Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 23 Apr 2024 16:18:44 +0500 Subject: [PATCH 015/429] bim.duplicate_style --- .../blenderbim/bim/module/style/__init__.py | 1 + .../blenderbim/bim/module/style/operator.py | 16 ++++++++++++++++ src/blenderbim/blenderbim/bim/module/style/ui.py | 1 + src/blenderbim/blenderbim/tool/style.py | 5 +++++ 4 files changed, 23 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/style/__init__.py b/src/blenderbim/blenderbim/bim/module/style/__init__.py index 7871feabac..becd598f33 100644 --- a/src/blenderbim/blenderbim/bim/module/style/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/style/__init__.py @@ -30,6 +30,7 @@ classes = ( operator.DisableAddingPresentationStyle, operator.DisableEditingStyle, operator.DisableEditingStyles, + operator.DuplicateStyle, operator.EditStyle, operator.EditSurfaceStyle, operator.EnableAddingPresentationStyle, diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index db679a6cf8..8133f16a5a 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -493,6 +493,22 @@ class EnableAddingPresentationStyle(bpy.types.Operator, tool.Ifc.Operator): props.is_adding = True +class DuplicateStyle(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.duplicate_style" + bl_label = "Duplicate Style" + bl_options = {"REGISTER", "UNDO"} + + style: bpy.props.IntProperty(name="Style ID") + + def _execute(self, context): + style_type = context.scene.BIMStylesProperties.style_type + ifc_file = tool.Ifc.get() + style = ifc_file.by_id(self.style) + tool.Style.duplicate_style(style) + bpy.ops.bim.disable_editing_styles() + bpy.ops.bim.load_styles(style_type=style_type) + + class DisableAddingPresentationStyle(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.disable_adding_presentation_style" bl_label = "Disable Add Presentation Style" diff --git a/src/blenderbim/blenderbim/bim/module/style/ui.py b/src/blenderbim/blenderbim/bim/module/style/ui.py index 404bf3e26c..0804098577 100644 --- a/src/blenderbim/blenderbim/bim/module/style/ui.py +++ b/src/blenderbim/blenderbim/bim/module/style/ui.py @@ -85,6 +85,7 @@ class BIM_PT_styles(Panel): op = row.operator("bim.enable_editing_style", text="Edit Style", icon="GREASEPENCIL") op.style = style.ifc_definition_id + row.operator("bim.duplicate_style", text="", icon="DUPLICATE").style = style.ifc_definition_id row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF").style = style.ifc_definition_id row.operator("bim.remove_style", text="", icon="X").style = style.ifc_definition_id diff --git a/src/blenderbim/blenderbim/tool/style.py b/src/blenderbim/blenderbim/tool/style.py index 30628cb1ef..88d6c23a77 100644 --- a/src/blenderbim/blenderbim/tool/style.py +++ b/src/blenderbim/blenderbim/tool/style.py @@ -19,6 +19,7 @@ import bpy import numpy as np import ifcopenshell +import ifcopenshell.util.element import blenderbim.core.tool import blenderbim.tool as tool import blenderbim.bim.helper @@ -59,6 +60,10 @@ class Style(blenderbim.core.tool.Style): def disable_editing_styles(cls): bpy.context.scene.BIMStylesProperties.is_editing = False + @classmethod + def duplicate_style(cls, style: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: + return ifcopenshell.util.element.copy_deep(tool.Ifc.get(), style) + @classmethod def enable_editing(cls, obj): obj.BIMStyleProperties.is_editing = True From 998f9c6a1ebae8da8f041d50a240cdd76506c8d1 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 23 Apr 2024 16:25:29 +0500 Subject: [PATCH 016/429] make styles ui more similar to profiles and materials ui before - https://i.imgur.com/bTbyt2t.png after - https://i.imgur.com/U53h8Yh.png --- .../blenderbim/bim/module/style/ui.py | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/style/ui.py b/src/blenderbim/blenderbim/bim/module/style/ui.py index 0804098577..5c1bdf06a9 100644 --- a/src/blenderbim/blenderbim/bim/module/style/ui.py +++ b/src/blenderbim/blenderbim/bim/module/style/ui.py @@ -44,19 +44,33 @@ class BIM_PT_styles(Panel): self.props = context.scene.BIMStylesProperties - if self.props.is_editing: - row = self.layout.row(align=True) - row.label(text="{} {}s".format(len(self.props.styles), self.props.style_type), icon="SHADING_RENDERED") - if not self.props.is_adding: - row.operator("bim.enable_adding_presentation_style", text="", icon="ADD") - row.operator("bim.disable_editing_styles", text="", icon="CANCEL") - else: + if not self.props.is_editing: row = self.layout.row(align=True) row.label(text="{} Styles".format(StylesData.data["total_styles"]), icon="SHADING_RENDERED") blenderbim.bim.helper.prop_with_search(row, self.props, "style_type", text="") row.operator("bim.load_styles", text="", icon="IMPORT").style_type = self.props.style_type return + active_style = self.props.styles and self.props.active_style_index < len(self.props.styles) + row = self.layout.row(align=True) + row.label(text="{} {}s".format(len(self.props.styles), self.props.style_type), icon="SHADING_RENDERED") + row.operator("bim.disable_editing_styles", text="", icon="CANCEL") + + row = self.layout.row(align=True) + row.alignment = "RIGHT" + if not self.props.is_adding: + row.operator("bim.enable_adding_presentation_style", text="", icon="ADD") + if active_style: + style = self.props.styles[self.props.active_style_index] + material_name = StylesData.data["styles_to_blender_material_names"][self.props.active_style_index] + material = bpy.data.materials[material_name] + + row.operator("bim.duplicate_style", text="", icon="DUPLICATE").style = style.ifc_definition_id + row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF").style = style.ifc_definition_id + op = row.operator("bim.enable_editing_style", text="", icon="GREASEPENCIL") + op.style = style.ifc_definition_id + row.operator("bim.remove_style", text="", icon="X").style = style.ifc_definition_id + self.layout.template_list("BIM_UL_styles", "", self.props, "styles", self.props, "active_style_index") # adding a new IfcSurfaceStyle @@ -77,18 +91,7 @@ class BIM_PT_styles(Panel): row.operator("bim.disable_adding_presentation_style", text="", icon="CANCEL") # style ui tools - if self.props.styles and self.props.active_style_index < len(self.props.styles): - row = self.layout.row(align=True) - style = self.props.styles[self.props.active_style_index] - material_name = StylesData.data["styles_to_blender_material_names"][self.props.active_style_index] - material = bpy.data.materials[material_name] - - op = row.operator("bim.enable_editing_style", text="Edit Style", icon="GREASEPENCIL") - op.style = style.ifc_definition_id - row.operator("bim.duplicate_style", text="", icon="DUPLICATE").style = style.ifc_definition_id - row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF").style = style.ifc_definition_id - row.operator("bim.remove_style", text="", icon="X").style = style.ifc_definition_id - + if active_style: row = self.layout.row(align=True) row.prop(material.BIMStyleProperties, "active_style_type", icon="SHADING_RENDERED", text="") op = row.operator("bim.update_current_style", icon="FILE_REFRESH", text="") From ae62ac27777ee0edf77b9f2236fc147a26242fce Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Tue, 23 Apr 2024 07:42:02 -0500 Subject: [PATCH 017/429] small tweak to b8a9674483bcfa96455c9590fcb938081b07a239 - duplicate profile has '_copy' suffix. --- src/blenderbim/blenderbim/tool/profile.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/tool/profile.py b/src/blenderbim/blenderbim/tool/profile.py index fdce5011e9..c0295be0c7 100644 --- a/src/blenderbim/blenderbim/tool/profile.py +++ b/src/blenderbim/blenderbim/tool/profile.py @@ -79,4 +79,6 @@ class Profile(blenderbim.core.tool.Profile): @classmethod def duplicate_profile(cls, profile: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: - return ifcopenshell.util.element.copy_deep(tool.Ifc.get(), profile) + new_profile = ifcopenshell.util.element.copy_deep(tool.Ifc.get(), profile) + new_profile.ProfileName = profile.ProfileName + "_copy" + return new_profile From d03b47e1e6ed5972e129ae4abef77a2056231043 Mon Sep 17 00:00:00 2001 From: stefkeB Date: Tue, 23 Apr 2024 17:38:59 +0200 Subject: [PATCH 018/429] Fix HDF5 conditional inclusion in GeomTree IfcGeomTree uses HDF5, but this is an optional module, so we have to wrap it with #ifdef WITH_HDF5 --- src/ifcgeom_schema_agnostic/IfcGeomTree.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ifcgeom_schema_agnostic/IfcGeomTree.h b/src/ifcgeom_schema_agnostic/IfcGeomTree.h index c72da5e59f..7426f92c92 100644 --- a/src/ifcgeom_schema_agnostic/IfcGeomTree.h +++ b/src/ifcgeom_schema_agnostic/IfcGeomTree.h @@ -62,7 +62,9 @@ #include #include "clash_utils.h" +#ifdef WITH_HDF5 #include "H5Cpp.h" +#endif namespace IfcGeom { @@ -1504,6 +1506,7 @@ namespace IfcGeom { } } +#ifdef WITH_HDF5 void write_h5() { H5::H5File file("filename.h5", H5F_ACC_TRUNC); H5::Group shapes = file.createGroup("/shapes"); @@ -1714,6 +1717,7 @@ namespace IfcGeom { colours_dataset.write(flat_colours.data(), H5::PredType::NATIVE_FLOAT); } } +#endif template void apply_matrix_to_flat_verts(const std::vector& flat_list, const std::vector& matrix, std::vector& result) { From db31574103685d8035b1a216e52047e4a323c01f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 23 Apr 2024 17:05:25 +0500 Subject: [PATCH 019/429] typing --- .../api/unit/add_conversion_based_unit.py | 7 +-- .../ifcopenshell/api/unit/add_si_unit.py | 5 ++- .../ifcopenshell/api/unit/assign_unit.py | 22 +++++++--- .../ifcopenshell/api/unit/unassign_unit.py | 4 +- .../ifcopenshell/util/unit.py | 43 ++++++++++--------- .../ifcpatch/recipes/ConvertLengthUnit.py | 8 +++- 6 files changed, 56 insertions(+), 33 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py index 8908c9b51f..3102a482fa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py @@ -18,10 +18,11 @@ import ifcopenshell import ifcopenshell.util.unit +from typing import Optional class Usecase: - def __init__(self, file, name="foot", conversion_offset=None): + def __init__(self, file: ifcopenshell.file, name: str = "foot", conversion_offset: Optional[float] = None): """Add a conversion based unit If you're in one of those countries who don't use SI units, you're @@ -41,7 +42,7 @@ class Usecase: that this is just an example and you don't actually need to specify that for fahrenheit as it's built into this API function. For advanced users only. - :type conversion_offset: float + :type conversion_offset: float, optional :return: The new IfcConversionBasedUnit or IfcConversionBasedUnitWithOffset :rtype: ifcopenshell.entity_instance.entity_instance @@ -60,7 +61,7 @@ class Usecase: self.file = file self.settings = {"name": name, "conversion_offset": conversion_offset} - def execute(self): + def execute(self) -> ifcopenshell.entity_instance: unit_type = ifcopenshell.util.unit.imperial_types.get(self.settings["name"], "USERDEFINED") dimensions = ifcopenshell.util.unit.named_dimensions[unit_type] exponents = self.file.createIfcDimensionalExponents(*dimensions) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py index 82a7b5f66a..bd0cd26e39 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py @@ -17,10 +17,11 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.unit +from typing import Optional class Usecase: - def __init__(self, file, unit_type="LENGTHUNIT", prefix=None): + def __init__(self, file: ifcopenshell.file, unit_type: str = "LENGTHUNIT", prefix: Optional[str] = None): """Add a new SI unit The supported types are ABSORBEDDOSEUNIT, AMOUNTOFSUBSTANCEUNIT, @@ -59,7 +60,7 @@ class Usecase: self.file = file self.settings = {"unit_type": unit_type, "prefix": prefix} - def execute(self): + def execute(self) -> ifcopenshell.entity_instance: name = ifcopenshell.util.unit.si_type_names.get(self.settings["unit_type"], None) return self.file.create_entity( "IfcSIUnit", UnitType=self.settings["unit_type"], Name=name, Prefix=self.settings["prefix"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py index 779dc6826d..bca68744d7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py @@ -18,10 +18,18 @@ import ifcopenshell import ifcopenshell.util.unit +from typing import Optional class Usecase: - def __init__(self, file, units=None, length=None, area=None, volume=None): + def __init__( + self, + file: ifcopenshell.file, + units: Optional[list[ifcopenshell.entity_instance]] = None, + length: Optional[dict] = None, + area: Optional[dict] = None, + volume: Optional[dict] = None, + ): """Assign default project units Whenever a unitised quantity is specified, such as a length, area, @@ -67,7 +75,7 @@ class Usecase: self.settings["area"] = area or {"is_metric": True, "raw": "METERS"} self.settings["volume"] = volume or {"is_metric": True, "raw": "METERS"} - def execute(self): + def execute(self) -> ifcopenshell.entity_instance: # We're going to refactor this to split unit creation and assignment if self.settings["units"]: units = self.settings["units"] @@ -84,7 +92,7 @@ class Usecase: self.assign_units(unit_assignment, units) return unit_assignment - def get_unit_assignment(self): + def get_unit_assignment(self) -> ifcopenshell.entity_instance: unit_assignment = self.file.by_type("IfcUnitAssignment") if unit_assignment: unit_assignment = unit_assignment[0] @@ -97,13 +105,15 @@ class Usecase: self.file.by_type("IfcContext")[0].UnitsInContext = unit_assignment return unit_assignment - def assign_units(self, unit_assignment, new_units): + def assign_units( + self, unit_assignment: ifcopenshell.entity_instance, new_units: list[ifcopenshell.entity_instance] + ) -> None: units = set(unit_assignment.Units or []) for unit in new_units: units.add(unit) unit_assignment.Units = list(units) - def create_metric_unit(self, unit_type, data): + def create_metric_unit(self, unit_type: str, data: dict) -> ifcopenshell.entity_instance: type_prefix = "" if unit_type == "area": type_prefix = "SQUARE_" @@ -116,7 +126,7 @@ class Usecase: type_prefix + ifcopenshell.util.unit.get_unit_name(data["raw"]), ) - def create_imperial_unit(self, unit_type, data): + def create_imperial_unit(self, unit_type: str, data: dict) -> ifcopenshell.entity_instance: if unit_type == "length": dimensional_exponents = self.file.createIfcDimensionalExponents(1, 0, 0, 0, 0, 0, 0) name_prefix = "" diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py index 0876921d84..fb1dcafb02 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py @@ -15,10 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional class Usecase: - def __init__(self, file, units=None): + def __init__(self, file: ifcopenshell.file, units: Optional[list[ifcopenshell.entity_instance]] = None): """Unassigns units as default units for the project :param units: A list of units to assign as project defaults. diff --git a/src/ifcopenshell-python/ifcopenshell/util/unit.py b/src/ifcopenshell-python/ifcopenshell/util/unit.py index 102b7b0d61..8b2ec3c167 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/unit.py +++ b/src/ifcopenshell-python/ifcopenshell/util/unit.py @@ -21,6 +21,7 @@ from math import pi from typing import Iterable, Any, Union, Literal, Optional import ifcopenshell +import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper import ifcopenshell.api prefixes = { @@ -353,7 +354,7 @@ def get_prefix_multiplier(text): return 1 -def get_unit_name(text): +def get_unit_name(text: str) -> Union[str, None]: text = text.upper().replace("METER", "METRE") for name in unit_names: if name.replace("_", " ") in text: @@ -368,13 +369,13 @@ def get_named_dimensions(name): return named_dimensions.get(name, (0, 0, 0, 0, 0, 0, 0)) -def get_unit_assignment(ifc_file): +def get_unit_assignment(ifc_file: ifcopenshell.file) -> Union[ifcopenshell.entity_instance, None]: unit_assignments = ifc_file.by_type("IfcUnitAssignment") if unit_assignments: return unit_assignments[0] -def get_project_unit(ifc_file, unit_type): +def get_project_unit(ifc_file: ifcopenshell.file, unit_type: str) -> Union[ifcopenshell.entity_instance, None]: """Get the default project unit of a particular unit type :param ifc_file: The IFC file. @@ -384,7 +385,7 @@ def get_project_unit(ifc_file, unit_type): :type unit_type: str :return: The IFC unit entity, or nothing if there is no default project unit defined. - :rtype: ifcopenshell.entity_instance,None + :rtype: Union[ifcopenshell.entity_instance, None] """ unit_assignment = get_unit_assignment(ifc_file) if unit_assignment: @@ -393,7 +394,9 @@ def get_project_unit(ifc_file, unit_type): return unit -def get_property_unit(prop, ifc_file): +def get_property_unit( + prop: ifcopenshell.entity_instance, ifc_file: ifcopenshell.file +) -> Union[ifcopenshell.entity_instance, None]: unit = getattr(prop, "Unit", None) if unit: return unit @@ -446,14 +449,14 @@ def get_property_unit(prop, ifc_file): return units[0] -def get_unit_measure_class(unit_type): +def get_unit_measure_class(unit_type: str) -> str: if unit_type == "USERDEFINED": # See https://github.com/buildingSMART/IFC4.3.x-development/issues/71 return "IfcNumericMeasure" return "Ifc" + unit_type[0:-4].lower().capitalize() + "Measure" -def get_measure_unit_type(measure_class): +def get_measure_unit_type(measure_class: str) -> str: if measure_class == "IfcNumericMeasure": # See https://github.com/buildingSMART/IFC4.3.x-development/issues/71 return "USERDEFINED" @@ -462,7 +465,7 @@ def get_measure_unit_type(measure_class): return measure_class.upper() + "UNIT" -def get_symbol_measure_class(symbol): +def get_symbol_measure_class(symbol: Optional[str] = None) -> str: # Dumb, but everybody gets it, unlike regex golf if not symbol: return "IfcNumericMeasure" @@ -480,7 +483,7 @@ def get_symbol_measure_class(symbol): return "IfcNumericMeasure" -def get_symbol_quantity_class(symbol): +def get_symbol_quantity_class(symbol: Optional[str] = None) -> str: # Dumb, but everybody gets it, unlike regex golf if not symbol: return "IfcQuantityCount" @@ -498,7 +501,7 @@ def get_symbol_quantity_class(symbol): return "IfcQuantityCount" -def get_unit_symbol(unit): +def get_unit_symbol(unit: ifcopenshell.entity_instance) -> str: symbol = "" if unit.is_a("IfcSIUnit"): symbol += prefix_symbols.get(unit.Prefix, "") @@ -508,7 +511,7 @@ def get_unit_symbol(unit): return symbol -def convert_unit(value, from_unit, to_unit): +def convert_unit(value: float, from_unit: ifcopenshell.entity_instance, to_unit: ifcopenshell.entity_instance) -> float: """Convert from one unit to another unit :param value: The numeric value you want to convert @@ -668,9 +671,9 @@ def format_length( def is_attr_type( - content_type: Union[ifcopenshell.ifcopenshell_wrapper.named_type, ifcopenshell.ifcopenshell_wrapper.type_declaration], + content_type: ifcopenshell_wrapper.parameter_type, ifc_unit_type_name: str, -) -> Union[ifcopenshell.ifcopenshell_wrapper.type_declaration, None]: +) -> Union[ifcopenshell_wrapper.type_declaration, None]: cur_decl = content_type while hasattr(cur_decl, "declared_type") is True: cur_decl = cur_decl.declared_type() @@ -679,7 +682,7 @@ def is_attr_type( if cur_decl.name() == ifc_unit_type_name: return cur_decl - if isinstance(cur_decl, ifcopenshell.ifcopenshell_wrapper.aggregation_type): + if isinstance(cur_decl, ifcopenshell_wrapper.aggregation_type): res = cur_decl.type_of_element() cur_decl = res.declared_type() if hasattr(cur_decl, "name") and cur_decl.name() == ifc_unit_type_name: @@ -696,13 +699,13 @@ def is_attr_type( def iter_element_and_attributes_per_type( ifc_file: ifcopenshell.file, attr_type_name: str -) -> Iterable[tuple[ifcopenshell.entity_instance, ifcopenshell.ifcopenshell_wrapper.attribute, Any, str]]: - schema = ifcopenshell.ifcopenshell_wrapper.schema_by_name(ifc_file.schema) +) -> Iterable[tuple[ifcopenshell.entity_instance, ifcopenshell_wrapper.attribute, Any]]: + schema: ifcopenshell_wrapper.schema_definition = ifcopenshell_wrapper.schema_by_name(ifc_file.schema) for element in ifc_file: entity = schema.declaration_by_name(element.is_a()) attrs = entity.all_attributes() - for i, (attr, val, is_derived) in enumerate(zip(attrs, list(element), entity.derived())): + for attr, val, is_derived in zip(attrs, list(element), entity.derived()): if is_derived: continue @@ -725,7 +728,7 @@ def convert_file_length_units(ifc_file: ifcopenshell.file, target_units: str) -> # Copy all elements from the original file to the patched file file_patched = ifcopenshell.file.from_string(ifc_file.wrapped_data.to_string()) - unit_assignment = ifcopenshell.util.unit.get_unit_assignment(file_patched) + unit_assignment = get_unit_assignment(file_patched) old_length = [u for u in unit_assignment.Units if getattr(u, "UnitType", None) == "LENGTHUNIT"][0] new_length = ifcopenshell.api.run("unit.add_si_unit", file_patched, unit_type="LENGTHUNIT", prefix=prefix) @@ -733,10 +736,10 @@ def convert_file_length_units(ifc_file: ifcopenshell.file, target_units: str) -> # Traverse all elements and their nested attributes in the file and convert them for element, attr, val in iter_element_and_attributes_per_type(file_patched, "IfcLengthMeasure"): if isinstance(val, tuple): - new_value = [ifcopenshell.util.unit.convert_unit(v, old_length, new_length) for v in val] + new_value = [convert_unit(v, old_length, new_length) for v in val] setattr(element, attr.name(), tuple(new_value)) else: - new_value = ifcopenshell.util.unit.convert_unit(val, old_length, new_length) + new_value = convert_unit(val, old_length, new_length) setattr(element, attr.name(), new_value) file_patched.remove(old_length) diff --git a/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py b/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py index 7483569122..e50bbed478 100644 --- a/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py +++ b/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py @@ -26,7 +26,13 @@ from logging import Logger class Patcher: - def __init__(self, src: str, file: ifcopenshell.file, logger: Logger, unit: str = "METERS"): + def __init__( + self, + src: str, + file: ifcopenshell.file, + logger: Logger, + unit: str = "METERS", + ): """Converts the length unit of a model to the specified unit Allowed metric units include METERS, MILLIMETERS, CENTIMETERS, etc. From 1c729a74d133d7aced87b195b9f2f9e09a7ead16 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 23 Apr 2024 17:51:39 +0500 Subject: [PATCH 020/429] util.unit to support converting aggregate of aggregates --- .../ifcopenshell/util/unit.py | 24 ++++-- .../test/fixtures/units/polygonal-faces.ifc | 79 +++++++++++++++++++ .../test/util/test_unit_conversion.py | 13 +-- 3 files changed, 102 insertions(+), 14 deletions(-) create mode 100644 src/ifcopenshell-python/test/fixtures/units/polygonal-faces.ifc diff --git a/src/ifcopenshell-python/ifcopenshell/util/unit.py b/src/ifcopenshell-python/ifcopenshell/util/unit.py index 8b2ec3c167..5caff307a8 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/unit.py +++ b/src/ifcopenshell-python/ifcopenshell/util/unit.py @@ -683,8 +683,14 @@ def is_attr_type( return cur_decl if isinstance(cur_decl, ifcopenshell_wrapper.aggregation_type): - res = cur_decl.type_of_element() - cur_decl = res.declared_type() + # support aggregate of aggregates, as in IfcCartesianPointList3D.CoordList + def get_declared_type_from_aggregate(cur_decl): + cur_decl = cur_decl.type_of_element() + if not isinstance(cur_decl, ifcopenshell_wrapper.aggregation_type): + return cur_decl.declared_type() + return get_declared_type_from_aggregate(cur_decl) + + cur_decl = get_declared_type_from_aggregate(cur_decl) if hasattr(cur_decl, "name") and cur_decl.name() == ifc_unit_type_name: return cur_decl while hasattr(cur_decl, "declared_type") is True: @@ -733,14 +739,16 @@ def convert_file_length_units(ifc_file: ifcopenshell.file, target_units: str) -> old_length = [u for u in unit_assignment.Units if getattr(u, "UnitType", None) == "LENGTHUNIT"][0] new_length = ifcopenshell.api.run("unit.add_si_unit", file_patched, unit_type="LENGTHUNIT", prefix=prefix) + # support tuple of tuples, as in IfcCartesianPointList3D.CoordList + def convert_value(value): + if not isinstance(value, tuple): + return convert_unit(value, old_length, new_length) + return tuple(convert_value(v) for v in value) + # Traverse all elements and their nested attributes in the file and convert them for element, attr, val in iter_element_and_attributes_per_type(file_patched, "IfcLengthMeasure"): - if isinstance(val, tuple): - new_value = [convert_unit(v, old_length, new_length) for v in val] - setattr(element, attr.name(), tuple(new_value)) - else: - new_value = convert_unit(val, old_length, new_length) - setattr(element, attr.name(), new_value) + new_value = convert_value(val) + setattr(element, attr.name(), new_value) file_patched.remove(old_length) unit_assignment.Units = tuple([new_length, *unit_assignment.Units]) diff --git a/src/ifcopenshell-python/test/fixtures/units/polygonal-faces.ifc b/src/ifcopenshell-python/test/fixtures/units/polygonal-faces.ifc new file mode 100644 index 0000000000..acf56d68b8 --- /dev/null +++ b/src/ifcopenshell-python/test/fixtures/units/polygonal-faces.ifc @@ -0,0 +1,79 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); +FILE_NAME('mill.ifc','2024-04-23T16:52:20+05:00',(),(),'IfcOpenShell v0.7.0-f7c03db75','BlenderBIM 0.0.240422-998f9c6','Nobody'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('3Q4HLVId9C$OJq2NqKnvVO',$,'My Project',$,$,$,$,(#14,#26),#9); +#2=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#3=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#4=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); +#5=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0); +#6=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); +#7=IFCMEASUREWITHUNIT(IFCREAL(0.0174532925199433),#6); +#8=IFCCONVERSIONBASEDUNIT(#5,.PLANEANGLEUNIT.,'degree',#7); +#9=IFCUNITASSIGNMENT((#4,#2,#8,#3)); +#10=IFCCARTESIANPOINT((0.,0.,0.)); +#11=IFCDIRECTION((0.,0.,1.)); +#12=IFCDIRECTION((1.,0.,0.)); +#13=IFCAXIS2PLACEMENT3D(#10,#11,#12); +#14=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#13,$); +#15=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#14,$,.MODEL_VIEW.,$); +#16=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Model',*,*,*,*,#14,$,.GRAPH_VIEW.,$); +#17=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Box','Model',*,*,*,*,#14,$,.MODEL_VIEW.,$); +#18=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Model',*,*,*,*,#14,$,.SECTION_VIEW.,$); +#19=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Model',*,*,*,*,#14,$,.ELEVATION_VIEW.,$); +#20=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Model',*,*,*,*,#14,$,.MODEL_VIEW.,$); +#21=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Model',*,*,*,*,#14,$,.PLAN_VIEW.,$); +#22=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Profile','Model',*,*,*,*,#14,$,.ELEVATION_VIEW.,$); +#23=IFCCARTESIANPOINT((0.,0.)); +#24=IFCDIRECTION((1.,0.)); +#25=IFCAXIS2PLACEMENT2D(#23,#24); +#26=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Plan',2,1.E-05,#25,$); +#27=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Plan',*,*,*,*,#26,$,.GRAPH_VIEW.,$); +#28=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Plan',*,*,*,*,#26,$,.PLAN_VIEW.,$); +#29=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Annotation','Plan',*,*,*,*,#26,$,.PLAN_VIEW.,$); +#30=IFCSITE('1T8u08wvPCnhfVRFeG_Je7',$,'My Site',$,$,#53,$,$,$,$,$,$,$,$); +#36=IFCBUILDING('0AGAIai5z9HOTud5I6CjMh',$,'My Building',$,$,#59,$,$,$,$,$,$); +#42=IFCBUILDINGSTOREY('2lMUoFnMv5KOSnzZ9_MPZv',$,'My Storey',$,$,#65,$,$,$,$); +#48=IFCRELAGGREGATES('0cjacslobAjw8I_uTLtTuK',$,$,$,#1,(#30)); +#49=IFCCARTESIANPOINT((0.,0.,0.)); +#50=IFCDIRECTION((0.,0.,1.)); +#51=IFCDIRECTION((1.,0.,0.)); +#52=IFCAXIS2PLACEMENT3D(#49,#50,#51); +#53=IFCLOCALPLACEMENT($,#52); +#54=IFCRELAGGREGATES('126VmVXPD0pAP2uJz6QYat',$,$,$,#30,(#36)); +#55=IFCCARTESIANPOINT((0.,0.,0.)); +#56=IFCDIRECTION((0.,0.,1.)); +#57=IFCDIRECTION((1.,0.,0.)); +#58=IFCAXIS2PLACEMENT3D(#55,#56,#57); +#59=IFCLOCALPLACEMENT(#53,#58); +#60=IFCRELAGGREGATES('1KLZsOP9zAivCjkiTn31bt',$,$,$,#36,(#42)); +#61=IFCCARTESIANPOINT((0.,0.,0.)); +#62=IFCDIRECTION((0.,0.,1.)); +#63=IFCDIRECTION((1.,0.,0.)); +#64=IFCAXIS2PLACEMENT3D(#61,#62,#63); +#65=IFCLOCALPLACEMENT(#59,#64); +#66=IFCACTUATOR('3RT$GBDjj6VhZQ2OYV3P13',$,'Cube',$,$,#95,#84,$,.ELECTRICACTUATOR.); +#72=IFCINDEXEDPOLYGONALFACE((1,2,4,3)); +#73=IFCINDEXEDPOLYGONALFACE((3,4,8,7)); +#74=IFCINDEXEDPOLYGONALFACE((7,8,6,5)); +#75=IFCINDEXEDPOLYGONALFACE((5,6,2,1)); +#76=IFCINDEXEDPOLYGONALFACE((3,7,5,1)); +#77=IFCINDEXEDPOLYGONALFACE((8,4,2,6)); +#78=IFCCARTESIANPOINTLIST3D(((-999.999938964844,-999.999938964844,-999.999938964844),(-999.999938964844,-999.999938964844,999.999938964844),(-999.999938964844,999.999938964844,-999.999938964844),(-999.999938964844,999.999938964844,999.999938964844),(999.999938964844,-999.999938964844,-999.999938964844),(999.999938964844,-999.999938964844,999.999938964844),(999.999938964844,999.999938964844,-999.999938964844),(999.999938964844,999.999938964844,999.999938964844))); +#79=IFCPOLYGONALFACESET(#78,.T.,(#72,#73,#74,#75,#76,#77),$); +#80=IFCSHAPEREPRESENTATION(#15,'Body','Tessellation',(#79)); +#81=IFCCARTESIANPOINT((-1000.,-1000.,-1000.)); +#82=IFCBOUNDINGBOX(#81,2000.,2000.,2000.); +#83=IFCSHAPEREPRESENTATION(#17,'Box','BoundingBox',(#82)); +#84=IFCPRODUCTDEFINITIONSHAPE($,$,(#83,#80)); +#85=IFCRELCONTAINEDINSPATIALSTRUCTURE('107zrsI95BsfGJXI83megf',$,$,$,(#66),#42); +#91=IFCCARTESIANPOINT((0.,5000.,0.)); +#92=IFCDIRECTION((0.,0.,1.)); +#93=IFCDIRECTION((1.,0.,0.)); +#94=IFCAXIS2PLACEMENT3D(#91,#92,#93); +#95=IFCLOCALPLACEMENT(#65,#94); +ENDSEC; +END-ISO-10303-21; diff --git a/src/ifcopenshell-python/test/util/test_unit_conversion.py b/src/ifcopenshell-python/test/util/test_unit_conversion.py index af84677647..22e750c507 100644 --- a/src/ifcopenshell-python/test/util/test_unit_conversion.py +++ b/src/ifcopenshell-python/test/util/test_unit_conversion.py @@ -41,9 +41,10 @@ def test_file_units_length_convert(ifc_file): elem_id = element.id() original_element = f.by_id(elem_id) original_val = getattr(original_element, attr.name()) - if isinstance(original_val, tuple): - # assert element is equal to original element times scale - assert val == tuple([v * scale for v in original_val]) - else: - # assert element is equal to original element times scale - assert val == original_val * scale + def convert_value(value): + if not isinstance(value, tuple): + return value * scale + return tuple(convert_value(v) for v in value) + + # assert element is equal to original element times scale + assert val == convert_value(original_val) From 606a0b46f2fe389fd85dd7e9641ebe12cb1ae5ff Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 24 Apr 2024 11:28:49 +0500 Subject: [PATCH 021/429] MergeProject - support merging projects with different units --- src/ifcpatch/ifcpatch/recipes/MergeProject.py | 19 ++++++ src/ifcpatch/test/test_MergeProject.py | 66 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 src/ifcpatch/test/test_MergeProject.py diff --git a/src/ifcpatch/ifcpatch/recipes/MergeProject.py b/src/ifcpatch/ifcpatch/recipes/MergeProject.py index 260affcfa3..25b6a9b4c9 100644 --- a/src/ifcpatch/ifcpatch/recipes/MergeProject.py +++ b/src/ifcpatch/ifcpatch/recipes/MergeProject.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.util.element +import ifcopenshell.util.unit from typing import Union from logging import Logger @@ -30,6 +31,9 @@ class Patcher: further processing will be done. This means that you may end up with duplicate spatial hierarchies (i.e. 2 sites, 2 buildings, etc). + Will automatically convert length units in the second model to the main + model's unit before merging. + :param filepath: The filepath of the second IFC model to merge into the first. The first model is already specified as the input to IfcPatch. @@ -48,6 +52,10 @@ class Patcher: def patch(self): source = ifcopenshell.open(self.filepath) + # make sure models units will match + if (main_unit := self.get_unit_name(self.file)) != self.get_unit_name(source): + source = ifcopenshell.util.unit.convert_file_length_units(source, main_unit) + self.existing_contexts: list[ifcopenshell.entity_instance] = self.file.by_type( "IfcGeometricRepresentationContext" ) @@ -69,6 +77,17 @@ class Patcher: self.reuse_existing_contexts() + def get_unit_name(self, ifc_file: ifcopenshell.file) -> str: + length_unit = ifcopenshell.util.unit.get_project_unit(ifc_file, "LENGTHUNIT") + names = { + "METRE": "METERS", + "FOOT": "FEET", + "INCH": "INCHES", + "MILE": "MILES", + } + prefix = getattr(length_unit, "Prefix", None) or "" + return prefix + names[length_unit.Name.upper()] + def reuse_existing_contexts(self): to_delete = set() diff --git a/src/ifcpatch/test/test_MergeProject.py b/src/ifcpatch/test/test_MergeProject.py new file mode 100644 index 0000000000..93e9b9bbb5 --- /dev/null +++ b/src/ifcpatch/test/test_MergeProject.py @@ -0,0 +1,66 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import ifcpatch +import ifcopenshell +import ifcopenshell.api +import ifcopenshell.util.placement +import test.bootstrap +import tempfile +import numpy as np +from pathlib import Path +from typing import Optional + + +class TestMergeProject(test.bootstrap.IFC4): + def setup_project(self, ifc_file: Optional[ifcopenshell.file] = None): + prefix = None if ifc_file else "MILLI" + if ifc_file is None: + ifc_file = ifcopenshell.file(schema=self.file.schema) + + project = ifcopenshell.api.run("root.create_entity", ifc_file, ifc_class="IfcProject") + unit = ifcopenshell.api.run("unit.add_si_unit", ifc_file, unit_type="LENGTHUNIT", prefix=prefix) + ifcopenshell.api.run("unit.assign_unit", ifc_file, units=[unit]) + + matrix = np.eye(4) + matrix[:, 3] = (1, 2, 3, 1) + wall = ifcopenshell.api.run("root.create_entity", ifc_file, ifc_class="IfcWall") + ifcopenshell.api.run("geometry.edit_object_placement", ifc_file, product=wall, matrix=matrix, is_si=True) + return ifc_file + + def test_run(self): + self.file = self.setup_project(self.file) + second_file = self.setup_project() + temp_path = Path(tempfile.gettempdir()) / "second.ifc" + second_file.write(temp_path) + output = ifcpatch.execute({"file": self.file, "recipe": "MergeProject", "arguments": [str(temp_path)]}) + + assert len(output.by_type("IfcWall")) == 2 + wall1, wall2 = output.by_type("IfcWall") + + # test that units are converted + placement1 = ifcopenshell.util.placement.get_local_placement(wall1.ObjectPlacement) + placement2 = ifcopenshell.util.placement.get_local_placement(wall2.ObjectPlacement) + to_tuple = lambda arr: tuple(map(tuple, arr)) + matrix = np.eye(4) + matrix[:, 3] = (1, 2, 3, 1) + assert to_tuple(placement1) == to_tuple(placement2) == to_tuple(matrix) + + +class TestMergeProjectIFC2X3(test.bootstrap.IFC2X3, TestMergeProject): + pass From c5f084a4af0b73db7941dea479264814a7a7efaa Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 24 Apr 2024 12:08:40 +0500 Subject: [PATCH 022/429] ConvertLengthUnit test --- src/ifcpatch/test/test_ConvertLengthUnit.py | 39 +++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/ifcpatch/test/test_ConvertLengthUnit.py diff --git a/src/ifcpatch/test/test_ConvertLengthUnit.py b/src/ifcpatch/test/test_ConvertLengthUnit.py new file mode 100644 index 0000000000..e1d5ad2502 --- /dev/null +++ b/src/ifcpatch/test/test_ConvertLengthUnit.py @@ -0,0 +1,39 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api +import ifcopenshell.util.unit +import ifcpatch + + +class TestConvertLengthUnit(test.bootstrap.IFC4): + # NOTE: conversion itself is covered by `ifcopenshell.util.unit.convert_file_length_units` tests + def test_run(self): + project = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") + unit = ifcopenshell.api.run("unit.add_si_unit", self.file, unit_type="LENGTHUNIT", prefix="MILLI") + ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit]) + output = ifcpatch.execute( + {"input": "input.ifc", "file": self.file, "recipe": "ConvertLengthUnit", "arguments": ["METERS"]} + ) + unit = ifcopenshell.util.unit.get_project_unit(output, "LENGTHUNIT") + assert unit.Prefix == None + + +class TestConvertLengthUnitIFC2X3(test.bootstrap.IFC2X3, TestConvertLengthUnit): + pass From 716a33f347dfa3727f77a416cded4d49b279c34d Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 24 Apr 2024 15:15:30 +0500 Subject: [PATCH 023/429] convert_file_length_units - fix issue converting to imperial units ifcpatch ConvertLengthUnit - change used units from plural to singular names, to make it consistent across the api more test coverage - test converting to more units and back from them --- .../ifcopenshell/util/unit.py | 37 ++++++++++-- .../test/util/test_unit_conversion.py | 59 ++++++++++++------- .../ifcpatch/recipes/ConvertLengthUnit.py | 12 ++-- src/ifcpatch/ifcpatch/recipes/MergeProject.py | 9 +-- src/ifcpatch/test/test_ConvertLengthUnit.py | 4 +- 5 files changed, 80 insertions(+), 41 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/unit.py b/src/ifcopenshell-python/ifcopenshell/util/unit.py index 5caff307a8..0e2604e481 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/unit.py +++ b/src/ifcopenshell-python/ifcopenshell/util/unit.py @@ -355,12 +355,31 @@ def get_prefix_multiplier(text): def get_unit_name(text: str) -> Union[str, None]: + """Get unit name from str, if unit is in SI.""" text = text.upper().replace("METER", "METRE") for name in unit_names: if name.replace("_", " ") in text: return name +def get_unit_name_universal(text: str) -> Union[str, None]: + """Get unit name from str, supports both SI and imperial system. + + Can be used to provide units for `convert()`""" + text = text.upper().replace("METER", "METRE") + for name in unit_names: + if name.replace("_", " ") in text: + return name + for name in imperial_types: + if name.upper() in text: + return name + + +def get_full_unit_name(unit: ifcopenshell.entity_instance) -> str: + prefix = getattr(unit, "Prefix", None) or "" + return prefix + unit.Name.upper() + + def get_si_dimensions(name): return si_dimensions.get(name, si_dimensions["OTHERWISE"]) @@ -727,17 +746,27 @@ def iter_element_and_attributes_per_type( yield element, attr, val -def convert_file_length_units(ifc_file: ifcopenshell.file, target_units: str) -> ifcopenshell.file: +def convert_file_length_units(ifc_file: ifcopenshell.file, target_units: str = "METER") -> ifcopenshell.file: """Converts all units in an IFC file to the specified target units. Returns a new file.""" - prefix = "MILLI" if target_units == "MILLIMETERS" else None + prefix = get_prefix(target_units) + si_unit = get_unit_name(target_units) # Copy all elements from the original file to the patched file file_patched = ifcopenshell.file.from_string(ifc_file.wrapped_data.to_string()) unit_assignment = get_unit_assignment(file_patched) - old_length = [u for u in unit_assignment.Units if getattr(u, "UnitType", None) == "LENGTHUNIT"][0] - new_length = ifcopenshell.api.run("unit.add_si_unit", file_patched, unit_type="LENGTHUNIT", prefix=prefix) + old_length = next(u for u in unit_assignment.Units if getattr(u, "UnitType", None) == "LENGTHUNIT") + if si_unit: + new_length = ifcopenshell.api.run("unit.add_si_unit", file_patched, unit_type="LENGTHUNIT", prefix=prefix) + else: + target_units = target_units.lower() + if imperial_types.get(target_units) != "LENGTHUNIT": + raise Exception( + f'Couldn\'t identify target units "{target_units}". ' + 'The method supports singular unit names like "CENTIMETER", "METER", "FOOT", etc.' + ) + new_length = ifcopenshell.api.run("unit.add_conversion_based_unit", file_patched, name=target_units) # support tuple of tuples, as in IfcCartesianPointList3D.CoordList def convert_value(value): diff --git a/src/ifcopenshell-python/test/util/test_unit_conversion.py b/src/ifcopenshell-python/test/util/test_unit_conversion.py index 22e750c507..fa95260607 100644 --- a/src/ifcopenshell-python/test/util/test_unit_conversion.py +++ b/src/ifcopenshell-python/test/util/test_unit_conversion.py @@ -16,35 +16,52 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . import pathlib - import pytest - import ifcopenshell.util.unit +import numpy as np UNITS_FIXTURE_DIR = pathlib.Path(__file__).parent.parent / "fixtures" / "units" @pytest.mark.parametrize("ifc_file", UNITS_FIXTURE_DIR.glob("*.ifc")) -def test_file_units_length_convert(ifc_file): +def test_file_units_length_convert(ifc_file: str): f = ifcopenshell.open(ifc_file) - project_unit = ifcopenshell.util.unit.get_project_unit(f, "LENGTHUNIT") - if project_unit.Prefix == "MILLI": - target_units = "METERS" - scale = 0.001 - else: - target_units = "MILLIMETERS" - scale = 1000 - new_f = ifcopenshell.util.unit.convert_file_length_units(f, target_units) + def get_project_unit(f: ifcopenshell.file) -> str: + unit = ifcopenshell.util.unit.get_project_unit(f, "LENGTHUNIT") + return ifcopenshell.util.unit.get_full_unit_name(unit) - for element, attr, val in ifcopenshell.util.unit.iter_element_and_attributes_per_type(new_f, "IfcLengthMeasure"): - elem_id = element.id() - original_element = f.by_id(elem_id) - original_val = getattr(original_element, attr.name()) - def convert_value(value): - if not isinstance(value, tuple): - return value * scale - return tuple(convert_value(v) for v in value) + base_project_unit = get_project_unit(f) + target_units = ["MILLIMETRE", "METRE", "CENTIMETRE", "INCH", "FOOT"] - # assert element is equal to original element times scale - assert val == convert_value(original_val) + def convert_file_and_test(f: ifcopenshell.file, project_unit: str, target_unit: str) -> ifcopenshell.file: + scale = ifcopenshell.util.unit.convert( + value=1, + from_prefix=ifcopenshell.util.unit.get_prefix(project_unit), + from_unit=ifcopenshell.util.unit.get_unit_name_universal(project_unit), + to_prefix=ifcopenshell.util.unit.get_prefix(target_unit), + to_unit=ifcopenshell.util.unit.get_unit_name_universal(target_unit), + ) + new_f = ifcopenshell.util.unit.convert_file_length_units(f, target_unit) + + for element, attr, val in ifcopenshell.util.unit.iter_element_and_attributes_per_type( + new_f, "IfcLengthMeasure" + ): + elem_id = element.id() + original_element = f.by_id(elem_id) + original_val = getattr(original_element, attr.name()) + + def convert_value(value): + if not isinstance(value, tuple): + return value * scale + return tuple(convert_value(v) for v in value) + + # assert element is equal to original element times scale + assert np.allclose([val], [convert_value(original_val)]) + + assert get_project_unit(new_f) == target_unit + return new_f + + for target_unit in target_units: + new_f = convert_file_and_test(f, base_project_unit, target_unit) + convert_file_and_test(new_f, target_unit, base_project_unit) diff --git a/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py b/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py index e50bbed478..4445f2ddc0 100644 --- a/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py +++ b/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py @@ -31,14 +31,14 @@ class Patcher: src: str, file: ifcopenshell.file, logger: Logger, - unit: str = "METERS", + unit: str = "METER", ): """Converts the length unit of a model to the specified unit - Allowed metric units include METERS, MILLIMETERS, CENTIMETERS, etc. - Allowed imperial units include INCHES, FEET, MILES. + Allowed metric units include METER, MILLIMETER, CENTIMETER, etc. + Allowed imperial units include INCH, FOOT, MILE. - :param unit: The name of the desired unit, defaults to "METERS" + :param unit: The name of the desired unit, defaults to "METER" :type unit: str Example: @@ -46,10 +46,10 @@ class Patcher: .. code:: python # Convert to millimeters - ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "ConvertLengthUnit", "arguments": ["MILLIMETERS"]}) + ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "ConvertLengthUnit", "arguments": ["MILLIMETER"]}) # Convert to feet - ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "ConvertLengthUnit", "arguments": ["FEET"]}) + ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "ConvertLengthUnit", "arguments": ["FOOT"]}) """ self.src = src self.file = file diff --git a/src/ifcpatch/ifcpatch/recipes/MergeProject.py b/src/ifcpatch/ifcpatch/recipes/MergeProject.py index 25b6a9b4c9..d5a5fe191c 100644 --- a/src/ifcpatch/ifcpatch/recipes/MergeProject.py +++ b/src/ifcpatch/ifcpatch/recipes/MergeProject.py @@ -79,14 +79,7 @@ class Patcher: def get_unit_name(self, ifc_file: ifcopenshell.file) -> str: length_unit = ifcopenshell.util.unit.get_project_unit(ifc_file, "LENGTHUNIT") - names = { - "METRE": "METERS", - "FOOT": "FEET", - "INCH": "INCHES", - "MILE": "MILES", - } - prefix = getattr(length_unit, "Prefix", None) or "" - return prefix + names[length_unit.Name.upper()] + return ifcopenshell.util.unit.get_full_unit_name(length_unit) def reuse_existing_contexts(self): to_delete = set() diff --git a/src/ifcpatch/test/test_ConvertLengthUnit.py b/src/ifcpatch/test/test_ConvertLengthUnit.py index e1d5ad2502..7ffc01fa83 100644 --- a/src/ifcpatch/test/test_ConvertLengthUnit.py +++ b/src/ifcpatch/test/test_ConvertLengthUnit.py @@ -29,10 +29,10 @@ class TestConvertLengthUnit(test.bootstrap.IFC4): unit = ifcopenshell.api.run("unit.add_si_unit", self.file, unit_type="LENGTHUNIT", prefix="MILLI") ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit]) output = ifcpatch.execute( - {"input": "input.ifc", "file": self.file, "recipe": "ConvertLengthUnit", "arguments": ["METERS"]} + {"input": "input.ifc", "file": self.file, "recipe": "ConvertLengthUnit", "arguments": ["METER"]} ) unit = ifcopenshell.util.unit.get_project_unit(output, "LENGTHUNIT") - assert unit.Prefix == None + assert ifcopenshell.util.unit.get_full_unit_name(unit) == "METRE" class TestConvertLengthUnitIFC2X3(test.bootstrap.IFC2X3, TestConvertLengthUnit): From e14d96e6ee2a12dff7c3526ebe9cde548c8f5bab Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 24 Apr 2024 15:41:33 +0500 Subject: [PATCH 024/429] Use .Name instead of .Description if IFC2X3 for sheets #4576 As Description was added only in IFC4 --- .../blenderbim/bim/module/drawing/operator.py | 60 +++++++++++-------- .../bim/module/drawing/svgwriter.py | 3 +- src/blenderbim/blenderbim/core/drawing.py | 22 +++---- src/blenderbim/blenderbim/core/tool.py | 1 + src/blenderbim/blenderbim/tool/drawing.py | 33 ++++++++-- src/blenderbim/test/core/test_drawing.py | 24 ++++++-- 6 files changed, 97 insertions(+), 46 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index f11837dba4..dac6d513be 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -1241,12 +1241,14 @@ class AddDrawingToSheet(bpy.types.Operator, Operator): return reference = tool.Ifc.run("document.add_reference", information=sheet) - id_attr = "ItemReference" if tool.Ifc.get_schema() == "IFC2X3" else "Identification" - attributes = { - id_attr: str(len([r for r in references if r.Description in ("DRAWING", "SCHEDULE")]) + 1), - "Location": drawing_reference.Location, - "Description": "DRAWING", - } + attributes = tool.Drawing.generate_reference_attributes( + reference, + Identification=str( + len([r for r in references if tool.Drawing.get_reference_description(r) in ("DRAWING", "SCHEDULE")]) + 1 + ), + Location=drawing_reference.Location, + Description="DRAWING", + ) tool.Ifc.run("document.edit_reference", reference=reference, attributes=attributes) sheet_builder = sheeter.SheetBuilder() sheet_builder.data_dir = context.scene.BIMProperties.data_dir @@ -1314,9 +1316,10 @@ class CreateSheets(bpy.types.Operator, Operator): has_sheet_reference = False for reference in tool.Drawing.get_document_references(sheet): - if reference.Description == "SHEET": + reference_description = tool.Drawing.get_reference_description(reference) + if reference == "SHEET": has_sheet_reference = True - elif reference.Description == "RASTER": + elif reference == "RASTER": if reference.Location in raster_references: raster_references.remove(reference.Location) else: @@ -1327,7 +1330,9 @@ class CreateSheets(bpy.types.Operator, Operator): tool.Ifc.run( "document.edit_reference", reference=reference, - attributes={"Location": tool.Ifc.get_relative_uri(svg), "Description": "SHEET"}, + attributes=tool.Drawing.generate_reference_attributes( + reference, Location=tool.Ifc.get_relative_uri(svg), Description="SHEET" + ), ) for raster_reference in raster_references: @@ -1335,7 +1340,9 @@ class CreateSheets(bpy.types.Operator, Operator): tool.Ifc.run( "document.edit_reference", reference=reference, - attributes={"Location": tool.Ifc.get_relative_uri(raster_reference), "Description": "RASTER"}, + attributes=tool.Drawing.generate_reference_attributes( + reference, Location=tool.Ifc.get_relative_uri(raster_reference), Description="RASTER" + ), ) svg2pdf_command = context.preferences.addons["blenderbim"].preferences.svg2pdf_command @@ -1988,12 +1995,14 @@ class AddScheduleToSheet(bpy.types.Operator, Operator): return reference = tool.Ifc.run("document.add_reference", information=sheet) - id_attr = "ItemReference" if tool.Ifc.get_schema() == "IFC2X3" else "Identification" - attributes = { - id_attr: str(len([r for r in references if r.Description in ("DRAWING", "SCHEDULE")]) + 1), - "Location": schedule_location, - "Description": "SCHEDULE", - } + attributes = tool.Drawing.generate_reference_attributes( + reference, + Identification=str( + len([r for r in references if tool.Drawing.get_reference_description(r) in ("DRAWING", "SCHEDULE")]) + 1 + ), + Location=schedule_location, + Description="SCHEDULE", + ) tool.Ifc.run("document.edit_reference", reference=reference, attributes=attributes) sheet_builder = sheeter.SheetBuilder() @@ -2042,12 +2051,15 @@ class AddReferenceToSheet(bpy.types.Operator, Operator): return reference = tool.Ifc.run("document.add_reference", information=sheet) - id_attr = "ItemReference" if tool.Ifc.get_schema() == "IFC2X3" else "Identification" - attributes = { - id_attr: str(len([r for r in references if r.Description in ("DRAWING", "REFERENCE")]) + 1), - "Location": extref_location, - "Description": "REFERENCE", - } + attributes = tool.Drawing.generate_reference_attributes( + reference, + Identification=str( + len([r for r in references if tool.Drawing.get_reference_description(r) in ("DRAWING", "REFERENCE")]) + + 1 + ), + Location=extref_location, + Description="REFERENCE", + ) tool.Ifc.run("document.edit_reference", reference=reference, attributes=attributes) sheet_builder = sheeter.SheetBuilder() @@ -2393,7 +2405,7 @@ class EditSheet(bpy.types.Operator, Operator): self.document_type = "SHEET" self.name = sheet.Name self.identification = sheet.Identification - elif sheet.is_a("IfcDocumentReference") and sheet.Description == "TITLEBLOCK": + elif sheet.is_a("IfcDocumentReference") and tool.Drawing.get_reference_description(sheet) == "TITLEBLOCK": self.document_type = "TITLEBLOCK" else: self.document_type = "EMBEDDED" @@ -2419,7 +2431,7 @@ class EditSheet(bpy.types.Operator, Operator): if self.document_type == "SHEET": core.rename_sheet(tool.Ifc, tool.Drawing, sheet=sheet, identification=self.identification, name=self.name) elif self.document_type == "EMBEDDED": - core.rename_reference(tool.Ifc, reference=sheet, identification=self.identification) + core.rename_reference(tool.Ifc, tool.Drawing, reference=sheet, identification=self.identification) elif self.document_type == "TITLEBLOCK": titleblock = self.props.titleblock reference = sheet diff --git a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py index 21220f3971..10e6c04494 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py @@ -726,7 +726,8 @@ class SvgWriter: reference = tool.Drawing.get_drawing_reference(drawing) if reference: for sheet_reference in tool.Ifc.get().by_type("IfcDocumentReference"): - if sheet_reference.Description != "DRAWING" or sheet_reference.Location != reference.Location: + reference_description = tool.Drawing.get_reference_description(reference) + if reference_description != "DRAWING" or sheet_reference.Location != reference.Location: continue sheet = tool.Drawing.get_reference_document(sheet_reference) if sheet: diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index 9d000bec1d..6c4bf6905c 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -77,16 +77,17 @@ def add_sheet(ifc, drawing, titleblock=None): else: attributes = {"Identification": identification, "Name": "UNTITLED", "Scope": "SHEET"} ifc.run("document.edit_information", information=sheet, attributes=attributes) - ifc.run( - "document.edit_reference", - reference=layout, - attributes={"Location": drawing.get_default_layout_path(identification, "UNTITLED"), "Description": "LAYOUT"}, + + attributes = drawing.generate_reference_attributes( + layout, Location=drawing.get_default_layout_path(identification, "UNTITLED"), Description="LAYOUT" ) - ifc.run( - "document.edit_reference", - reference=titleblock_reference, - attributes={"Location": drawing.get_default_titleblock_path(titleblock), "Description": "TITLEBLOCK"}, + ifc.run("document.edit_reference", reference=layout, attributes=attributes) + + attributes = drawing.generate_reference_attributes( + layout, Location=drawing.get_default_titleblock_path(titleblock), Description="TITLEBLOCK" ) + ifc.run("document.edit_reference", reference=titleblock_reference, attributes=attributes) + drawing.create_svg_sheet(sheet, titleblock) drawing.import_sheets() @@ -138,8 +139,9 @@ def rename_sheet(ifc, drawing, sheet=None, identification=None, name=None): drawing.move_file(old_location, ifc.resolve_uri(new_location)) -def rename_reference(ifc, reference=None, identification=None): - ifc.run("document.edit_reference", reference=reference, attributes={"Identification": identification}) +def rename_reference(ifc, drawing, reference=None, identification=None): + attributes = drawing.generate_reference_attributes(reference, Identifiaction=identification) + ifc.run("document.edit_reference", reference=reference, attributes=attributes) def load_schedules(drawing): diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index c3688ab283..ef5fcc883f 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -329,6 +329,7 @@ class Drawing: def get_name(cls, element): pass def get_path_filename(cls, uri): pass def get_reference_description(cls, reference): pass + def generate_reference_attributes(cls, reference, **attributes): pass def get_reference_document(cls, reference): pass def get_reference_location(cls, reference): pass def get_references_with_location(cls, location): pass diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index a5d67e5aed..9494bef86e 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -254,9 +254,10 @@ class Drawing(blenderbim.core.tool.Drawing): sheet_reference = None drawing_names = [] for reference in cls.get_document_references(sheet): - if reference.Description == "LAYOUT": + reference_description = cls.get_reference_description(reference) + if reference_description == "LAYOUT": sheet_reference = reference - elif reference.Description == "DRAWING": + elif reference_description == "DRAWING": drawing_names.append(Path(reference.Location).stem) for annotation in [e for e in tool.Ifc.get().by_type("IfcAnnotation") if e.ObjectType == "DRAWING"]: if annotation.Name in drawing_names: @@ -421,7 +422,7 @@ class Drawing(blenderbim.core.tool.Drawing): else: references = document.HasDocumentReferences for reference in references: - if description and reference.Description != description: + if description and cls.get_reference_description(reference) != description: continue location = cls.get_document_uri(reference) if location: @@ -823,7 +824,8 @@ class Drawing(blenderbim.core.tool.Drawing): continue for reference in cls.get_document_references(sheet): - if reference.Description in ("SHEET", "LAYOUT", "RASTER"): + reference_description = cls.get_reference_description(reference) + if reference_description in ("SHEET", "LAYOUT", "RASTER"): # These references are an internal detail and should not be visible to users continue new = props.sheets.add() @@ -836,7 +838,7 @@ class Drawing(blenderbim.core.tool.Drawing): new.identification = reference.Identification or "" new.name = os.path.basename(reference.Location) - new.reference_type = reference.Description + new.reference_type = reference_description @classmethod def get_active_sheet(cls, context): @@ -1568,9 +1570,28 @@ class Drawing(blenderbim.core.tool.Drawing): tree.write(uri, pretty_print=True, xml_declaration=True, encoding="utf-8") @classmethod - def get_reference_description(cls, reference): + def get_reference_description(cls, reference: ifcopenshell.entity_instance) -> Union[str, None]: + if reference.file.schema == "IFC2X3": + return reference.Name return reference.Description + @classmethod + def generate_reference_attributes(cls, reference: ifcopenshell.entity_instance, **attributes: Any) -> dict[str, Any]: + """will automatically convert attributes below for IFC2X3 compatibility: + + - Identification -> ItemReference + + - Description -> Name + """ + if reference.file.schema == "IFC2X3": + if "Description" in attributes: + attributes["Name"] = attributes["Description"] + del attributes["Description"] + if "Identification" in attributes: + attributes["ItemReference"] = attributes["Identification"] + del attributes["Identification"] + return attributes + @classmethod def get_reference_location(cls, reference): return reference.Location diff --git a/src/blenderbim/test/core/test_drawing.py b/src/blenderbim/test/core/test_drawing.py index a2b6608f5d..cbbf5f5414 100644 --- a/src/blenderbim/test/core/test_drawing.py +++ b/src/blenderbim/test/core/test_drawing.py @@ -95,15 +95,21 @@ class TestAddSheet: information="sheet", attributes={"Identification": "u_identification", "Name": "UNTITLED", "Scope": "SHEET"}, ).should_be_called() + drawing.generate_reference_attributes( + "reference", Location="layout_path", Description="LAYOUT" + ).should_be_called().will_return("attributes") ifc.run( "document.edit_reference", reference="reference", - attributes={"Location": "layout_path", "Description": "LAYOUT"}, + attributes="attributes", ).should_be_called() + drawing.generate_reference_attributes( + "reference", Location="titleblock_path", Description="TITLEBLOCK" + ).should_be_called().will_return("attributes2") ifc.run( "document.edit_reference", reference="reference", - attributes={"Location": "titleblock_path", "Description": "TITLEBLOCK"}, + attributes="attributes2", ).should_be_called() drawing.create_svg_sheet("sheet", "titleblock").should_be_called() drawing.import_sheets().should_be_called() @@ -122,15 +128,21 @@ class TestAddSheet: information="sheet", attributes={"DocumentId": "u_identification", "Name": "UNTITLED", "Scope": "SHEET"}, ).should_be_called() + drawing.generate_reference_attributes( + "reference", Location="layout_path", Description="LAYOUT" + ).should_be_called().will_return("attributes") ifc.run( "document.edit_reference", reference="reference", - attributes={"Location": "layout_path", "Description": "LAYOUT"}, + attributes="attributes", ).should_be_called() + drawing.generate_reference_attributes( + "reference", Location="titleblock_path", Description="TITLEBLOCK" + ).should_be_called().will_return("attributes2") ifc.run( "document.edit_reference", reference="reference", - attributes={"Location": "titleblock_path", "Description": "TITLEBLOCK"}, + attributes="attributes2", ).should_be_called() drawing.create_svg_sheet("sheet", "titleblock").should_be_called() drawing.import_sheets().should_be_called() @@ -490,7 +502,9 @@ class TestUpdateDrawingName: ) ifc.resolve_uri("relative_layout_uri").should_be_called().will_return("absolute_layout_uri") drawing.does_file_exist("absolute_layout_uri").should_be_called().will_return(True) - drawing.update_embedded_svg_location("absolute_layout_uri", "reference_with_old_location", "new_uri").should_be_called() + drawing.update_embedded_svg_location( + "absolute_layout_uri", "reference_with_old_location", "new_uri" + ).should_be_called() drawing.is_editing_sheets().should_be_called().will_return(True) drawing.import_sheets().should_be_called() From f41fbf24c353ac1a5f9b272714dd74d75d8ed5d6 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 24 Apr 2024 18:19:20 +0500 Subject: [PATCH 025/429] small fix for e14d96e6e --- src/blenderbim/blenderbim/bim/module/drawing/operator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index dac6d513be..e1603450c8 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -1317,9 +1317,9 @@ class CreateSheets(bpy.types.Operator, Operator): has_sheet_reference = False for reference in tool.Drawing.get_document_references(sheet): reference_description = tool.Drawing.get_reference_description(reference) - if reference == "SHEET": + if reference_description == "SHEET": has_sheet_reference = True - elif reference == "RASTER": + elif reference_description == "RASTER": if reference.Location in raster_references: raster_references.remove(reference.Location) else: From c0b4e099af3c966c941a3c764780b21b2c64fb3f Mon Sep 17 00:00:00 2001 From: Bruno Postle Date: Wed, 24 Apr 2024 23:05:44 +0100 Subject: [PATCH 026/429] fix sheet regeneration missing drawing Identifier Was passing LAYOUT document reference to sheeter instead of DRAWING document reference --- src/blenderbim/blenderbim/tool/drawing.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 9494bef86e..90b6cd211a 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -251,17 +251,16 @@ class Drawing(blenderbim.core.tool.Drawing): def add_drawings(cls, sheet): sheet_builder = sheeter.SheetBuilder() sheet_builder.data_dir = bpy.context.scene.BIMProperties.data_dir - sheet_reference = None + drawing_references = {} drawing_names = [] for reference in cls.get_document_references(sheet): reference_description = cls.get_reference_description(reference) - if reference_description == "LAYOUT": - sheet_reference = reference - elif reference_description == "DRAWING": + if reference_description == "DRAWING": + drawing_references[Path(reference.Location).stem] = reference drawing_names.append(Path(reference.Location).stem) - for annotation in [e for e in tool.Ifc.get().by_type("IfcAnnotation") if e.ObjectType == "DRAWING"]: - if annotation.Name in drawing_names: - sheet_builder.add_drawing(sheet_reference, annotation, sheet) + for drawing_annotation in [e for e in tool.Ifc.get().by_type("IfcAnnotation") if e.ObjectType == "DRAWING"]: + if drawing_annotation.Name in drawing_names: + sheet_builder.add_drawing(drawing_references[drawing_annotation.Name], drawing_annotation, sheet) @classmethod def delete_collection(cls, collection): From 47116721700f761a946a507df89b8c19ba648aae Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Wed, 24 Apr 2024 21:48:26 -0500 Subject: [PATCH 027/429] small tweak to 3ff31b577cb227af396f04d280144bd1292a1eec and cd013079f410dac3cf461bf30cba23affba6f6f1 - duplicate material and duplicate style have '_copy' suffix. --- src/blenderbim/blenderbim/tool/material.py | 4 +++- src/blenderbim/blenderbim/tool/style.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index a6e0391030..e49b6a3d61 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -40,7 +40,9 @@ class Material(blenderbim.core.tool.Material): @classmethod def duplicate_material(cls, material: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: - return ifcopenshell.util.element.copy_deep(tool.Ifc.get(), material) + new_material = ifcopenshell.util.element.copy_deep(tool.Ifc.get(), material) + new_material.Name = material.Name + "_copy" + return new_material @classmethod def enable_editing_materials(cls): diff --git a/src/blenderbim/blenderbim/tool/style.py b/src/blenderbim/blenderbim/tool/style.py index 88d6c23a77..9ff8c9aa4c 100644 --- a/src/blenderbim/blenderbim/tool/style.py +++ b/src/blenderbim/blenderbim/tool/style.py @@ -62,7 +62,9 @@ class Style(blenderbim.core.tool.Style): @classmethod def duplicate_style(cls, style: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: - return ifcopenshell.util.element.copy_deep(tool.Ifc.get(), style) + new_style = ifcopenshell.util.element.copy_deep(tool.Ifc.get(), style) + new_style.Name = style.Name + "_copy" + return new_style @classmethod def enable_editing(cls, obj): From f1037de14dc864b7aa7c49b0ad4e288154df0722 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 25 Apr 2024 17:45:14 +0500 Subject: [PATCH 028/429] small fix for 60a70f523 --- src/ifcopenshell-python/ifcopenshell/util/placement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/placement.py b/src/ifcopenshell-python/ifcopenshell/util/placement.py index abbffc5b96..19fd3835f8 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/placement.py +++ b/src/ifcopenshell-python/ifcopenshell/util/placement.py @@ -69,7 +69,7 @@ def get_axis2placement(placement: ifcopenshell.entity_instance) -> MatrixType: if coordinates := getattr(location, "Coordinates", None): o = coordinates else: - ifc_class = location.is_a("IfcPointByDistanceExpression") + ifc_class = location.is_a() print( f'WARNING. Placement location of type "{ifc_class}" ' f'is not yet supported and placement {placement} may be placed incorrectly.' From 087d55f02a88b2834da8159cd558eb9340aa9f8a Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 25 Apr 2024 11:12:46 +0500 Subject: [PATCH 029/429] fix editing sheets in ifc2x3 #4576 --- src/blenderbim/blenderbim/bim/module/drawing/operator.py | 2 +- src/blenderbim/blenderbim/core/drawing.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index e1603450c8..844100c12e 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -2404,7 +2404,7 @@ class EditSheet(bpy.types.Operator, Operator): if sheet.is_a("IfcDocumentInformation"): self.document_type = "SHEET" self.name = sheet.Name - self.identification = sheet.Identification + self.identification = sheet.DocumentId if tool.Ifc.get_schema() == "IFC2X3" else sheet.Identification elif sheet.is_a("IfcDocumentReference") and tool.Drawing.get_reference_description(sheet) == "TITLEBLOCK": self.document_type = "TITLEBLOCK" else: diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index 6c4bf6905c..b2c1b890bf 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -118,7 +118,11 @@ def remove_sheet(ifc, drawing, sheet=None): def rename_sheet(ifc, drawing, sheet=None, identification=None, name=None): - ifc.run("document.edit_information", information=sheet, attributes={"Identification": identification, "Name": name}) + if ifc.get_schema() == "IFC2X3": + attributes = {"DocumentId": identification, "Name": name} + else: + attributes = {"Identification": identification, "Name": name} + ifc.run("document.edit_information", information=sheet, attributes=attributes) for reference in drawing.get_document_references(sheet): description = drawing.get_reference_description(reference) if description == "SHEET": From cce2fee1fadbe8fda533f804d5c273ee05af6eed Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 25 Apr 2024 12:14:55 +0500 Subject: [PATCH 030/429] More descriptive error setting non-present attributes Example: ``` import ifcopenshell ifc_file = ifcopenshell.file(schema="IFC2X3") # ifc_file.begin_transaction() wall = ifc_file.createIfcWall() wall.Identification = "25" # Before: # Traceback (most recent call last): # File "test.py", line 4, in # wall.Identification = "25" # ^^^^^^^^^^^^^^^^^^^ # File "\ifcopenshell\entity_instance.py", line 279, in __setattr__ # self[index] = value # ~~~~^^^^^^^ # File "\ifcopenshell\entity_instance.py", line 293, in __setitem__ # method = self.method_list[idx] # ~~~~~~~~~~~~~~~~^^^^^ # IndexError: list index out of range # or this (if file had a transaction going) # File "\ifcopenshell\entity_instance.py", line 279, in __setattr__ # self[index] = value # ~~~~^^^^^^^ # File "\ifcopenshell\entity_instance.py", line 288, in __setitem__ # self.wrapped_data.file.transaction.store_edit(self, idx, value) # File "\ifcopenshell\file.py", line 101, in store_edit # "old": self.serialise_value(element, element[index]), # ~~~~~~~^^^^^^^ # File "\ifcopenshell\entity_instance.py", line 283, in __getitem__ # raise IndexError("Attribute index {} out of range for instance of type {}".format(key, self.is_a())) # IndexError: Attribute index 4294967295 out of range for instance of type IfcWall # After: # Traceback (most recent call last): # File "test.py", line 4, in # wall.Identification = "25" # ^^^^^^^^^^^^^^^^^^^ # File "ifcopenshell\entity_instance.py", line 283, in __setattr__ # raise AttributeError( # AttributeError: entity instance of type 'IFC2X3.IfcWall' has no attribute 'Identification' ``` --- .../ifcopenshell/entity_instance.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index 00e441d9ac..c6802aa4a3 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -276,7 +276,15 @@ class entity_instance(object): def __setattr__(self, key: str, value: Any) -> None: index = self.wrapped_data.get_argument_index(key) - self[index] = value + try: + self[index] = value + except IndexError as e: + # get_argument_index returns 0xFFFFFFFF if attribute is not found + if index == 0xFFFFFFFF: + raise AttributeError( + "entity instance of type '%s' has no attribute '%s'" % (self.wrapped_data.is_a(True), key) + ) + raise e def __getitem__(self, key: int) -> Any: if key < 0 or key >= len(self): From 721466c4293c9c7c477792c654554c98684dae29 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 25 Apr 2024 11:24:42 +0500 Subject: [PATCH 031/429] typing --- src/blenderbim/blenderbim/bim/import_ifc.py | 1 + .../bim/module/boundary/operator.py | 1 + .../blenderbim/bim/module/drawing/sheeter.py | 46 +++++++++++-------- src/blenderbim/blenderbim/core/drawing.py | 5 +- src/blenderbim/blenderbim/tool/drawing.py | 2 +- src/blenderbim/test/core/bootstrap.py | 17 +++---- .../api/document/edit_information.py | 11 ++++- .../api/document/edit_reference.py | 11 ++++- src/ifcopenshell-python/ifcopenshell/file.py | 2 +- .../ifcopenshell/util/shape_builder.py | 4 ++ 10 files changed, 66 insertions(+), 34 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index fb7c07d7cd..481e23817e 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -34,6 +34,7 @@ import ifcopenshell.util.element import ifcopenshell.util.geolocation import ifcopenshell.util.placement import ifcopenshell.util.representation +import ifcopenshell.util.shape import blenderbim.tool as tool import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper from itertools import chain, accumulate diff --git a/src/blenderbim/blenderbim/bim/module/boundary/operator.py b/src/blenderbim/blenderbim/bim/module/boundary/operator.py index 6a20852f06..d0b90221f5 100644 --- a/src/blenderbim/blenderbim/bim/module/boundary/operator.py +++ b/src/blenderbim/blenderbim/bim/module/boundary/operator.py @@ -20,6 +20,7 @@ import bpy import bmesh import logging import shapely +import shapely.ops import mathutils import numpy as np import multiprocessing diff --git a/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py b/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py index 55de457f39..45e7d0883c 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py @@ -41,7 +41,7 @@ class SheetBuilder: self.data_dir = None self.scale = "NTS" - def create(self, layout_path, titleblock_name): + def create(self, layout_path: str, titleblock_name: str) -> None: root = ET.Element("svg") root.attrib["xmlns"] = "http://www.w3.org/2000/svg" root.attrib["xmlns:xlink"] = "http://www.w3.org/1999/xlink" @@ -76,7 +76,12 @@ class SheetBuilder: with open(layout_path, "w") as f: f.write(minidom.parseString(ET.tostring(root)).toprettyxml(indent=" ")) - def add_drawing(self, reference, drawing, sheet): + def add_drawing( + self, + reference: ifcopenshell.entity_instance, + drawing: ifcopenshell.entity_instance, + sheet: ifcopenshell.entity_instance, + ) -> None: filename = drawing.Name layout_path = tool.Drawing.get_document_uri(sheet, "LAYOUT") layout_dir = os.path.dirname(layout_path) @@ -131,7 +136,7 @@ class SheetBuilder: ) layout_tree.write(layout_path) - def update_sheet_drawing_sizes(self, sheet): + def update_sheet_drawing_sizes(self, sheet: ifcopenshell.entity_instance) -> None: ET.register_namespace("", "http://www.w3.org/2000/svg") layout_path = tool.Drawing.get_document_uri(sheet, "LAYOUT") @@ -171,7 +176,7 @@ class SheetBuilder: layout_tree.write(layout_path) - def remove_drawing(self, reference, sheet): + def remove_drawing(self, reference: ifcopenshell.entity_instance, sheet: ifcopenshell.entity_instance) -> None: ET.register_namespace("", "http://www.w3.org/2000/svg") layout_path = tool.Drawing.get_document_uri(sheet, "LAYOUT") @@ -187,7 +192,12 @@ class SheetBuilder: layout_tree.write(layout_path) - def add_document(self, reference, document, sheet): + def add_document( + self, + reference: ifcopenshell.entity_instance, + document: ifcopenshell.entity_instance, + sheet: ifcopenshell.entity_instance, + ) -> None: view_path = tool.Drawing.get_path_with_ext(tool.Drawing.get_document_uri(document), "svg") if not os.path.exists(view_path): tool.Drawing.create_svg_document(document) @@ -224,7 +234,7 @@ class SheetBuilder: ) layout_tree.write(layout_path) - def add_view_title(self, x, y, parent, layout_dir): + def add_view_title(self, x: float, y: float, parent: ET.Element, layout_dir: str) -> None: title_path = os.path.join(layout_dir, "assets", "view-title.svg") os.makedirs(os.path.dirname(title_path), exist_ok=True) if not os.path.exists(title_path): @@ -241,7 +251,7 @@ class SheetBuilder: title.attrib["width"] = str(self.convert_to_mm(title_root.attrib.get("width"))) title.attrib["height"] = str(self.convert_to_mm(title_root.attrib.get("height"))) - def build(self, sheet): + def build(self, sheet: ifcopenshell.entity_instance) -> dict: self.references = {"SHEET": None, "RASTER": []} layout_path = tool.Drawing.get_document_uri(sheet, "LAYOUT") @@ -272,7 +282,7 @@ class SheetBuilder: return self.references - def build_titleblock(self, root, sheet): + def build_titleblock(self, root: ET.Element, sheet: ifcopenshell.entity_instance) -> None: titleblock = root.findall('{http://www.w3.org/2000/svg}g[@data-type="titleblock"]')[0] image = titleblock.findall("{http://www.w3.org/2000/svg}image")[0] g = self.parse_embedded_svg(image, sheet.get_info()) @@ -285,7 +295,7 @@ class SheetBuilder: titleblock.append(g) titleblock.remove(image) - def ensure_drawing_unique_styles(self, svg, drawing_id): + def ensure_drawing_unique_styles(self, svg: ET.Element, drawing_id: int) -> ET.Element: """ensures all drawing's classes and ids will be unique for the whole sheet by adding `drawing_id` based prefix """ @@ -313,7 +323,7 @@ class SheetBuilder: brackets_level -= 1 text += l - def replace_urls(text): + def replace_urls(text: str) -> str: """replace urls `url(#marker)` with `url(#prefix-marker)` since `url(#marker.prefix)` doesn't seem to work """ @@ -343,7 +353,7 @@ class SheetBuilder: return svg - def build_drawings(self, root, sheet): + def build_drawings(self, root: ET.Element, sheet: ifcopenshell.entity_instance): for view in root.findall('{http://www.w3.org/2000/svg}g[@data-type="drawing"]'): drawing_id = int(view.attrib["data-id"]) try: @@ -390,7 +400,7 @@ class SheetBuilder: for image in images: view.remove(image) - def build_documents(self, root, sheet): + def build_documents(self, root: ET.Element, sheet: ifcopenshell.entity_instance) -> None: schedules = root.findall('{http://www.w3.org/2000/svg}g[@data-type="schedule"]') references = root.findall('{http://www.w3.org/2000/svg}g[@data-type="reference"]') documents = schedules + references @@ -427,10 +437,10 @@ class SheetBuilder: for image in images: view.remove(image) - def get_href(self, element): - return urllib.parse.unquote(element.attrib.get("{http://www.w3.org/1999/xlink}href")).replace('\\','/') + def get_href(self, element: ET.Element) -> str: + return urllib.parse.unquote(element.attrib.get("{http://www.w3.org/1999/xlink}href")).replace("\\", "/") - def parse_embedded_svg(self, image, data): + def parse_embedded_svg(self, image: ET.Element, data: dict) -> ET.Element: group = ET.Element("g") group.attrib["transform"] = "translate({},{})".format( self.convert_to_mm(image.attrib.get("x")), self.convert_to_mm(image.attrib.get("y")) @@ -466,7 +476,7 @@ class SheetBuilder: group.append(child) return group - def change_titleblock(self, sheet, titleblock_name): + def change_titleblock(self, sheet: ifcopenshell.entity_instance, titleblock_name: str) -> None: ootb_titleblock_path = os.path.join(self.data_dir, "templates", "titleblocks", titleblock_name + ".svg") titleblock_path = tool.Drawing.get_default_titleblock_path(titleblock_name) sheet_path = tool.Drawing.get_document_uri(sheet, "LAYOUT") @@ -499,7 +509,7 @@ class SheetBuilder: sheet_tree.write(sheet_path) - def convert_to_mm(self, value): + def convert_to_mm(self, value: str) -> float: # CSS is what defines these possibilities # https://www.w3.org/TR/SVG/refs.html#ref-css-values-3 # https://www.w3.org/TR/css-values-3/#absolute-lengths @@ -520,5 +530,5 @@ class SheetBuilder: return float(value[0:-2]) * (1 / 96) * 2.54 * 10 return float(value) - def mm_to_px(self, value): + def mm_to_px(self, value: float) -> float: return (value / 25.4) * 96 diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index b2c1b890bf..b61f469bea 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -17,6 +17,7 @@ # along with BlenderBIM Add-on. If not, see . from pathlib import Path +import ifcopenshell def enable_editing_text(drawing, obj=None): @@ -66,7 +67,7 @@ def disable_editing_sheets(drawing): drawing.disable_editing_sheets() -def add_sheet(ifc, drawing, titleblock=None): +def add_sheet(ifc, drawing, titleblock: ifcopenshell.entity_instance): sheet = ifc.run("document.add_information") layout = ifc.run("document.add_reference", information=sheet) titleblock_reference = ifc.run("document.add_reference", information=sheet) @@ -117,7 +118,7 @@ def remove_sheet(ifc, drawing, sheet=None): drawing.import_sheets() -def rename_sheet(ifc, drawing, sheet=None, identification=None, name=None): +def rename_sheet(ifc, drawing, sheet: ifcopenshell.entity_instance, identification: str, name: str) -> None: if ifc.get_schema() == "IFC2X3": attributes = {"DocumentId": identification, "Name": name} else: diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 90b6cd211a..b013e62854 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -240,7 +240,7 @@ class Drawing(blenderbim.core.tool.Drawing): ) @classmethod - def create_svg_sheet(cls, document, titleblock): + def create_svg_sheet(cls, document: ifcopenshell.entity_instance, titleblock: str) -> str: sheet_builder = sheeter.SheetBuilder() sheet_builder.data_dir = bpy.context.scene.BIMProperties.data_dir uri = cls.get_document_uri(document, "LAYOUT") diff --git a/src/blenderbim/test/core/bootstrap.py b/src/blenderbim/test/core/bootstrap.py index 3b48e66c80..6ec9c206ce 100644 --- a/src/blenderbim/test/core/bootstrap.py +++ b/src/blenderbim/test/core/bootstrap.py @@ -19,6 +19,7 @@ import json import pytest import blenderbim.core.tool +from typing import Any, Self, Optional @pytest.fixture @@ -241,12 +242,12 @@ def voider(): class Prophecy: def __init__(self, cls): self.subject = cls - self.predictions = [] - self.calls = [] - self.return_values = {} - self.should_call = None + self.predictions: list[dict] = [] + self.calls: list[dict] = [] + self.return_values: dict[str, Any] = {} + self.should_call: Optional[dict] = None - def __getattr__(self, attr): + def __getattr__(self, attr: str): if not hasattr(self.subject, attr): raise AttributeError(f"Prophecy {self.subject} has no attribute {attr}") @@ -270,12 +271,12 @@ class Prophecy: self.predictions.append({"type": "SHOULD_BE_CALLED", "number": number, "call": self.should_call}) return self - def will_return(self, value): + def will_return(self, value: Any) -> Self: key = json.dumps(self.should_call, sort_keys=True) self.return_values[key] = value return self - def verify(self): + def verify(self) -> None: predicted_calls = [] for prediction in self.predictions: predicted_calls.append(prediction["call"]) @@ -285,7 +286,7 @@ class Prophecy: if call not in predicted_calls: raise Exception(f"Unpredicted call: {call}") - def verify_should_be_called(self, prediction): + def verify_should_be_called(self, prediction: dict) -> None: if prediction["number"]: count = self.calls.count(prediction["call"]) if count != prediction["number"]: diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py index 5d2665741b..1d7af0c1b8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py @@ -15,10 +15,17 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any, Optional class Usecase: - def __init__(self, file, information=None, attributes=None): + def __init__( + self, + file: ifcopenshell.file, + information: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, + ): """Edits the attributes of an IfcDocumentInformation For more information about the attributes and data types of an @@ -44,6 +51,6 @@ class Usecase: self.file = file self.settings = {"information": information, "attributes": attributes or {}} - def execute(self): + def execute(self) -> None: for name, value in self.settings["attributes"].items(): setattr(self.settings["information"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py index 98d4a0233a..538c8d2854 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py @@ -15,10 +15,17 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any, Optional class Usecase: - def __init__(self, file, reference=None, attributes=None): + def __init__( + self, + file: ifcopenshell.file, + reference: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, + ): """Edits the attributes of an IfcDocumentReference For more information about the attributes and data types of an @@ -47,6 +54,6 @@ class Usecase: self.file = file self.settings = {"reference": reference, "attributes": attributes or {}} - def execute(self): + def execute(self) -> None: for name, value in self.settings["attributes"].items(): setattr(self.settings["reference"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index d5446d731e..e87663612b 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -259,7 +259,7 @@ class file(object): self.history_size = 64 self.history = [] self.future = [] - self.transaction = None + self.transaction: Optional[Transaction] = None import weakref diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py index dd1104c780..13efca8da5 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py @@ -18,8 +18,12 @@ import numpy as np import collections +import collections.abc import ifcopenshell import ifcopenshell.api +import ifcopenshell.util.element +import ifcopenshell.util.representation +import ifcopenshell.util.unit from math import cos, sin, pi, tan, radians, degrees, atan, sqrt, ceil from typing import List, Tuple, Type, Union from itertools import chain From 5b877b549afe43b6600602a74e495659ef50ba16 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 25 Apr 2024 15:55:32 +0500 Subject: [PATCH 032/429] fix numpy typing #4579 On older numpy versions, np.ndarray was less forgiving and wasn't allowing passing 1 argument instead of required 2. And turned out numpy doesn't yet have typing for shapes (https://github.com/numpy/numpy/issues/16544), so all matrices and other shapes specified as `npt.NDArray[np.float64]`. Fixed type discrepancies for `get_edges` and `get_faces` and also had to fix `import_ifc` as Blender apparently has problems with storing np.int32 in custom attributes (https://projects.blender.org/blender/blender/issues/121072), tested that Blender is okay with np.int32 in other cases we had (addressing BMesh.verts[i] where `i` is np.int32). --- src/blenderbim/blenderbim/bim/import_ifc.py | 4 +- .../ifcopenshell/util/placement.py | 19 ++++---- .../ifcopenshell/util/shape.py | 43 +++++++++++-------- .../ifcopenshell/util/shape_builder.py | 5 ++- 4 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 481e23817e..d7b6bb915b 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -1935,7 +1935,9 @@ class IfcImporter: # See bug 3546 # ios_edges holds true edges that aren't triangulated. - mesh["ios_edges"] = list(set(tuple(e) for e in ifcopenshell.util.shape.get_edges(geometry))) + # + # we do `.tolist()` because Blender can't assign `np.int32` to it's custom attributes + mesh["ios_edges"] = list(set(tuple(e) for e in ifcopenshell.util.shape.get_edges(geometry).tolist())) mesh.vertices.add(num_vertices) mesh.vertices.foreach_set("co", verts) diff --git a/src/ifcopenshell-python/ifcopenshell/util/placement.py b/src/ifcopenshell-python/ifcopenshell/util/placement.py index 19fd3835f8..a5c3312dab 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/placement.py +++ b/src/ifcopenshell-python/ifcopenshell/util/placement.py @@ -17,10 +17,13 @@ # along with IfcOpenShell. If not, see . import numpy as np +import numpy.typing as npt import ifcopenshell from typing import Literal, Iterable -MatrixType = np.ndarray[np.ndarray[float]] + +MatrixType = npt.NDArray[np.float64] +"""`npt.NDArray[np.float64]`""" def a2p(o: Iterable[float], z: Iterable[float], x: Iterable[float]) -> MatrixType: @@ -36,7 +39,7 @@ def a2p(o: Iterable[float], z: Iterable[float], x: Iterable[float]) -> MatrixTyp :param x: The +X vector / axis of the matrix :type x: iterable[float] :return: A 4x4 numpy matrix - :rtype: np.ndarray[np.ndarray[float]] + :rtype: MatrixType """ x = x / np.linalg.norm(x) z = z / np.linalg.norm(z) @@ -59,7 +62,7 @@ def get_axis2placement(placement: ifcopenshell.entity_instance) -> MatrixType: :param placement: The IfcLocalPlacement enitity :type placement: ifcopenshell.entity_instance.entity_instance :return: A 4x4 numpy matrix - :rtype: np.ndarray[np.ndarray[float]] + :rtype: MatrixType """ ifc_class = placement.is_a() if ifc_class in ("IfcAxis2Placement3D", "IfcAxis2PlacementLinear"): @@ -72,7 +75,7 @@ def get_axis2placement(placement: ifcopenshell.entity_instance) -> MatrixType: ifc_class = location.is_a() print( f'WARNING. Placement location of type "{ifc_class}" ' - f'is not yet supported and placement {placement} may be placed incorrectly.' + f"is not yet supported and placement {placement} may be placed incorrectly." ) o = (0.0, 0.0, 0.0) @@ -117,7 +120,7 @@ def get_local_placement(placement: ifcopenshell.entity_instance) -> MatrixType: :param placement: The IfcLocalPlacement entity :type placement: ifcopenshell.entity_instance.entity_instance :return: A 4x4 numpy matrix - :rtype: np.ndarray[np.ndarray[float]] + :rtype: MatrixType """ if placement is None: return np.eye(4) @@ -137,7 +140,7 @@ def get_cartesiantransformationoperator3d(inst: ifcopenshell.entity_instance) -> :param item: The IfcCartesianTransformationOperator entity :type item: ifcopenshell.entity_instance.entity_instance :return: A 4x4 numpy transformation matrix - :rtype: np.ndarray[np.ndarray[float]] + :rtype: MatrixType """ origin = np.array(inst.LocalOrigin.Coordinates) axis1 = np.array((1.0, 0.0, 0.0)) @@ -183,7 +186,7 @@ def get_mappeditem_transformation(item: ifcopenshell.entity_instance) -> MatrixT :param item: The IfcMappedItem entity :type item: ifcopenshell.entity_instance.entity_instance :return: A 4x4 numpy transformation matrix - :rtype: np.ndarray[np.ndarray[float]] + :rtype: MatrixType """ m4 = get_axis2placement(item.MappingSource.MappingOrigin) # TODO 2d @@ -219,7 +222,7 @@ def rotation(angle: float, axis: Literal["X", "Y", "Z"], is_degrees=True) -> Mat radians. Defaults to true (i.e. degrees). :type is_degrees: bool :return: A 4x4 numpy rotation matrix - :rtype: np.ndarray[np.ndarray[float]] + :rtype: MatrixType """ theta = np.radians(angle) if is_degrees else angle cos, sin = np.cos(theta), np.sin(theta) diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape.py b/src/ifcopenshell-python/ifcopenshell/util/shape.py index 798000005a..931f4c0327 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape.py @@ -19,6 +19,7 @@ import shapely import shapely.ops import numpy as np +import numpy.typing as npt import ifcopenshell.util.element import ifcopenshell.util.placement import ifcopenshell.util.representation @@ -28,6 +29,9 @@ tol = 1e-6 AXIS_LITERAL = Literal["X", "Y", "Z"] VECTOR_3D = tuple[float, float, float] +MatrixType = npt.NDArray[np.float64] +"""`npt.NDArray[np.float64]`""" + def is_x(value: float, x: float, tolerance: Optional[float] = None) -> bool: """Checks whether a value is equivalent to X given a tolerance @@ -113,19 +117,19 @@ def get_z(geometry) -> float: return max(z_values) - min(z_values) -def get_shape_matrix(shape) -> np.ndarray: +def get_shape_matrix(shape) -> MatrixType: """Formats the transformation matrix of a shape as a 4x4 numpy array :param shape: Shape output calculated by IfcOpenShell :type shape: shape :return: A 4x4 numpy array representing the transformation matrix - :rtype: np.array + :rtype: MatrixType """ m = shape.transformation.matrix.data return np.array(([m[0], m[3], m[6], m[9]], [m[1], m[4], m[7], m[10]], [m[2], m[5], m[8], m[11]], [0, 0, 0, 1])) -def get_bbox_centroid(geometry) -> tuple[float]: +def get_bbox_centroid(geometry) -> tuple[float, float, float]: """Calculates the bounding box centroid of the geometry The centroid is in local coordinates relative to the object's placement. @@ -133,11 +137,14 @@ def get_bbox_centroid(geometry) -> tuple[float]: :param geometry: Geometry output calculated by IfcOpenShell :type geometry: geometry :return: A tuple representing the XYZ centroid - :rtype: tuple[float] + :rtype: tuple[float, float, float] """ x_values = [geometry.verts[i] for i in range(0, len(geometry.verts), 3)] y_values = [geometry.verts[i + 1] for i in range(0, len(geometry.verts), 3)] z_values = [geometry.verts[i + 2] for i in range(0, len(geometry.verts), 3)] + x_values: list[float] + y_values: list[float] + z_values: list[float] minx = min(x_values) maxx = max(x_values) miny = min(y_values) @@ -147,7 +154,7 @@ def get_bbox_centroid(geometry) -> tuple[float]: return (minx + ((maxx - minx) / 2), miny + ((maxy - miny) / 2), minz + ((maxz - minz) / 2)) -def get_element_bbox_centroid(element: ifcopenshell.entity_instance, geometry) -> tuple[float]: +def get_element_bbox_centroid(element: ifcopenshell.entity_instance, geometry) -> npt.NDArray[np.float64]: """Calculates the element's bounding box centroid The centroid is in global coordinates. Note that if you have the shape, it @@ -158,16 +165,16 @@ def get_element_bbox_centroid(element: ifcopenshell.entity_instance, geometry) - :param geometry: Geometry output calculated by IfcOpenShell :type geometry: geometry :return: A tuple representing the XYZ centroid - :rtype: tuple[float] + :rtype: npt.NDArray[np.float64] """ centroid = get_bbox_centroid(geometry) if not element.ObjectPlacement or not element.ObjectPlacement.is_a("IfcLocalPlacement"): - return centroid + return np.array(centroid) mat = ifcopenshell.util.placement.get_local_placement(element.ObjectPlacement) return (mat @ np.array([*centroid, 1.0]))[0:3] -def get_shape_bbox_centroid(shape, geometry) -> tuple[float]: +def get_shape_bbox_centroid(shape, geometry) -> npt.NDArray[np.float64]: """Calculates the shape's bounding box centroid The centroid is in global coordinates. Note that if you do not have the @@ -178,13 +185,13 @@ def get_shape_bbox_centroid(shape, geometry) -> tuple[float]: :param geometry: Geometry output calculated by IfcOpenShell :type geometry: geometry :return: A tuple representing the XYZ centroid - :rtype: tuple[float] + :rtype: npt.NDArray[np.float64] """ centroid = get_bbox_centroid(geometry) return (get_shape_matrix(shape) @ np.array([*centroid, 1.0]))[0:3] -def get_vertices(geometry) -> np.ndarray[np.ndarray[float]]: +def get_vertices(geometry) -> npt.NDArray[np.float64]: """Get all the vertices as a numpy array Vertices are in local coordinates. @@ -200,7 +207,7 @@ def get_vertices(geometry) -> np.ndarray[np.ndarray[float]]: return np.array([np.array([verts[i], verts[i + 1], verts[i + 2]]) for i in range(0, len(verts), 3)]) -def get_edges(geometry) -> np.ndarray[np.ndarray[int]]: +def get_edges(geometry) -> npt.NDArray[np.int32]: """Get all the edges as a numpy array Results are a nested numpy array e.g. [[e1v1, e1v2], [e2v1, e2v2], ...] @@ -215,10 +222,10 @@ def get_edges(geometry) -> np.ndarray[np.ndarray[int]]: :rtype: np.array[np.array[int]] """ edges = geometry.edges - return [[edges[i], edges[i + 1]] for i in range(0, len(edges), 2)] + return np.array([[edges[i], edges[i + 1]] for i in range(0, len(edges), 2)]) -def get_faces(geometry) -> np.ndarray[np.ndarray[int]]: +def get_faces(geometry) -> npt.NDArray[np.int32]: """Get all the faces as a numpy array Faces are always triangulated. If the shape is a BRep and you want to get @@ -232,10 +239,10 @@ def get_faces(geometry) -> np.ndarray[np.ndarray[int]]: :rtype: np.array[np.array[int]] """ faces = geometry.faces - return [[faces[i], faces[i + 1], faces[i + 2]] for i in range(0, len(faces), 3)] + return np.array([[faces[i], faces[i + 1], faces[i + 2]] for i in range(0, len(faces), 3)]) -def get_shape_vertices(shape, geometry) -> np.ndarray[np.ndarray[float]]: +def get_shape_vertices(shape, geometry) -> npt.NDArray[np.float64]: """Get the shape's vertices as a numpy array Vertices are in global coordinates. If you do not have the shape, you can @@ -255,7 +262,7 @@ def get_shape_vertices(shape, geometry) -> np.ndarray[np.ndarray[float]]: return np.delete((mat @ np.hstack((verts, np.ones((len(verts), 1)))).T).T, -1, axis=1) -def get_element_vertices(element: ifcopenshell.entity_instance, geometry) -> np.ndarray[np.ndarray[float]]: +def get_element_vertices(element: ifcopenshell.entity_instance, geometry) -> npt.NDArray[np.float64]: """Get the element's vertices as a numpy array Vertices are in global coordinates. Note that if you have the shape, it is @@ -365,7 +372,7 @@ def get_element_top_elevation(element: ifcopenshell.entity_instance, geometry) - return max([v[2] for v in get_element_vertices(element, geometry)]) -def get_bbox(vertices: Iterable[VECTOR_3D]) -> tuple[np.ndarray[float]]: +def get_bbox(vertices: Iterable[VECTOR_3D]) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]: """Gets the bounding box of vertices :param vertices: An iterable of vertices @@ -388,7 +395,7 @@ def get_bbox(vertices: Iterable[VECTOR_3D]) -> tuple[np.ndarray[float]]: return (np.array([minx, miny, minz]), np.array([maxx, maxy, maxz])) -def get_area_vf(vertices: np.ndarray[VECTOR_3D], faces: np.ndarray[Iterable[int]]) -> float: +def get_area_vf(vertices: npt.NDArray[np.float64], faces: npt.NDArray[np.int32]) -> float: """Calculates the surface area given a list of vertices and triangulated faces :param vertices: A list of 3D vertices, such as returned from get_vertices. diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py index 13efca8da5..fdea29fe14 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import numpy as np +import numpy.typing as npt import collections import collections.abc import ifcopenshell @@ -533,13 +534,13 @@ class ShapeBuilder: def create_axis2_placement_3d_from_matrix( self, - matrix: Union[np.ndarray, None] = None, + matrix: Union[npt.NDArray[np.float64], None] = None, ) -> ifcopenshell.entity_instance: """ Create IfcAxis2Placement3D from numpy matrix. :param matrix: 4x4 transformation matrix, defaults to `np.eye(4)` - :type matrix: np.array[np.array[float]], optional + :type matrix: npt.NDArray[np.float64], optional :return: IfcAxis2Placement3D :rtype: ifcopenshell.entity_instance """ From 29352092aa4d6814c3309e9433c49dc8fc5c5c5b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 25 Apr 2024 16:28:41 +0500 Subject: [PATCH 033/429] fix issue creating 3d location for 2d placement in ifc2x3 --- src/blenderbim/blenderbim/bim/module/geometry/helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/helper.py b/src/blenderbim/blenderbim/bim/module/geometry/helper.py index 3b7281a1a8..0f6bb73329 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/helper.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/helper.py @@ -538,7 +538,7 @@ class Helper: ) position = None if self.file.schema == "IFC2X3": - position = self.file.createIfcAxis2Placement2D(self.file.createIfcCartesianPoint([0.0, 0.0, 0.0])) + position = self.file.createIfcAxis2Placement2D(self.file.createIfcCartesianPoint([0.0, 0.0])) curve = self.file.createIfcRectangleProfileDef("AREA", None, position, xdim, ydim) return {"curve_ucs": curve_ucs, "curve": curve} From 640320f70d3c9097d6f4e104abb2e0338bf35ec7 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 25 Apr 2024 16:35:05 +0500 Subject: [PATCH 034/429] shape_builder - create non-optional position for profiles in ifc2x3 --- .../ifcopenshell/util/shape_builder.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py index fdea29fe14..29ed257cc8 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py @@ -344,6 +344,16 @@ class ShapeBuilder: "Ref: https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcArbitraryClosedProfileDef.htm#8.15.3.1.4-Formal-propositions" ) + kwargs = { + "ProfileName": name, + "ProfileType": profile_type, + "OuterCurve": outer_curve, + } + if self.file.schema == "IFC2X3": + kwargs["Position"] = self.file.create_entity( + "IfcAxis2Placement2D", self.file.create_entity("IfcCartesianPoint", [0.0, 0.0]) + ) + if inner_curves: if not isinstance(inner_curves, collections.abc.Iterable): inner_curves = [inner_curves] @@ -354,13 +364,9 @@ class ShapeBuilder: "Ref: https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcArbitraryClosedProfileDef.htm#8.15.3.1.4-Formal-propositions" ) - profile = self.file.createIfcArbitraryProfileDefWithVoids( - ProfileName=name, ProfileType=profile_type, OuterCurve=outer_curve, InnerCurves=inner_curves - ) + profile = self.file.create_entity("IfcArbitraryProfileDefWithVoids", InnerCurves=inner_curves, **kwargs) else: - profile = self.file.createIfcArbitraryClosedProfileDef( - ProfileName=name, ProfileType=profile_type, OuterCurve=outer_curve - ) + profile = self.file.create_entity("IfcArbitraryClosedProfileDef", **kwargs) return profile def translate(self, curve_or_item, translation: Vector, create_copy=False): From 1cea3d21e8136ce39253be14ea65f2aacdbd3ef4 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 25 Apr 2024 18:31:07 +0500 Subject: [PATCH 035/429] BBIM support importing IfcRelAdheresToElement #4565 --- src/blenderbim/blenderbim/bim/import_ifc.py | 14 +++++++++++--- src/blenderbim/blenderbim/tool/collector.py | 10 ++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index d7b6bb915b..086827f1d5 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -431,7 +431,7 @@ class IfcImporter: self.annotations = set([a for a in self.file.by_type("IfcAnnotation")]) self.annotations -= drawing_annotations - self.elements = [e for e in self.elements if not e.is_a("IfcFeatureElement")] + self.elements = [e for e in self.elements if not e.is_a("IfcFeatureElement") or e.is_a("IfcSurfaceFeature")] if self.ifc_import_settings.is_coordinating: self.elements = [e for e in self.elements if e.Representation] @@ -863,7 +863,6 @@ class IfcImporter: else: self.create_generic_elements(self.spatial_elements, unselectable=False) - def create_elements(self) -> None: self.create_generic_elements(self.elements) tmp = self.context_settings @@ -1639,6 +1638,8 @@ class IfcImporter: rel_aggregates.add(nested_by[0]) elif nests := getattr(element, "Nests", []): rel_aggregates.add(nests[0]) + elif element.is_a("IfcSurfaceFeature") and self.file.schema == "IFC4X3": + rel_aggregates.add(element.AdheresToElement[0]) else: rel_aggregates = [ r @@ -1654,6 +1655,8 @@ class IfcImporter: ) and [e for e in r.RelatedObjects if not e.is_a("IfcPort")] ] + if self.file.schema == "IFC4X3": + rel_aggregates += [r for r in self.file.by_type("IfcRelAdheresToElement")] if len(rel_aggregates) > 10000: # More than 10,000 collections makes Blender unhappy @@ -1663,7 +1666,9 @@ class IfcImporter: aggregates: dict[str, dict] = {} for rel_aggregate in rel_aggregates: - element: ifcopenshell.entity_instance = rel_aggregate.RelatingObject + element: ifcopenshell.entity_instance = getattr(rel_aggregate, "RelatingObject", None) or getattr( + rel_aggregate, "RelatingElement" + ) collection = bpy.data.collections.new(tool.Loader.get_name(element)) aggregates[element.GlobalId] = {"element": element, "collection": collection} self.collections[element.GlobalId] = collection @@ -1764,6 +1769,9 @@ class IfcImporter: elif getattr(element, "Nests", None) and not element.is_a("IfcPort"): nest = ifcopenshell.util.element.get_nest(element) return self.collections[nest.GlobalId].objects.link(obj) + elif element.is_a("IfcSurfaceFeature") and self.file.schema == "IFC4X3": + adherend = element.AdheresToElement[0].RelatingElement + return self.collections[adherend.GlobalId].objects.link(obj) return self.place_object_in_spatial_decomposition_collection(element, obj) diff --git a/src/blenderbim/blenderbim/tool/collector.py b/src/blenderbim/blenderbim/tool/collector.py index 095d56ea1d..738b7d1cc6 100644 --- a/src/blenderbim/blenderbim/tool/collector.py +++ b/src/blenderbim/blenderbim/tool/collector.py @@ -187,6 +187,9 @@ class Collector(blenderbim.core.tool.Collector): if any(e for e in element.IsNestedBy[0].RelatedObjects if not e.is_a("IfcPort")): return cls._create_own_collection(obj) + if getattr(element, "HasSurfaceFeatures", None): + return cls._create_own_collection(obj) + @classmethod def _get_collection(cls, element: ifcopenshell.entity_instance, obj: bpy.types.Object) -> bpy.types.Collection: """get or create collection for the element based on it's type""" @@ -247,6 +250,13 @@ class Collector(blenderbim.core.tool.Collector): if collection: return collection + if element.is_a("IfcSurfaceFeature") and element.file.schema == "IFC4X3": + adherend = element.AdheresToElement[0].RelatingElement + adherend_obj = tool.Ifc.get_object(adherend) + collection = adherend_obj.BIMObjectProperties.collection + if collection: + return collection + if element.is_a("IfcProject"): return bpy.context.scene.collection From 344cc1fb7de42680bae19472f7684843adc4d3f7 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 26 Apr 2024 11:49:44 +0500 Subject: [PATCH 036/429] file.by_type docs note --- src/ifcopenshell-python/ifcopenshell/file.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index e87663612b..3ca1854db9 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -457,6 +457,9 @@ class file(object): :type type: string :param include_subtypes: Whether or not to return subtypes of the IFC class :type include_subtypes: bool + + :raises RuntimeError: If `type` is not found in IFC schema. + :returns: A list of ifcopenshell.entity_instance.entity_instance objects :rtype: list[ifcopenshell.entity_instance.entity_instance] """ From 31d85b715abea778256de085d1be0de8abfc3b80 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 26 Apr 2024 15:14:00 +0500 Subject: [PATCH 037/429] typing --- src/blenderbim/blenderbim/bim/handler.py | 4 +- src/blenderbim/blenderbim/tool/owner.py | 4 +- .../api/geometry/edit_object_placement.py | 44 +++++++++++++------ .../api/owner/add_organisation.py | 5 ++- .../ifcopenshell/api/owner/add_person.py | 11 ++++- .../api/owner/add_person_and_organisation.py | 10 ++++- .../api/owner/create_owner_history.py | 10 +++-- .../ifcopenshell/api/void/add_opening.py | 12 +++-- .../ifcopenshell/api/void/remove_opening.py | 5 ++- .../ifcopenshell/entity_instance.py | 3 +- 10 files changed, 75 insertions(+), 33 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/handler.py b/src/blenderbim/blenderbim/bim/handler.py index 28306671de..9ebe90c5e7 100644 --- a/src/blenderbim/blenderbim/bim/handler.py +++ b/src/blenderbim/blenderbim/bim/handler.py @@ -223,7 +223,7 @@ def redo_post(scene): tool.Ifc.rebuild_element_maps() -def get_application(ifc): +def get_application(ifc: ifcopenshell.file) -> ifcopenshell.entity_instance: # TODO: cache this for even faster application retrieval. It honestly makes a difference on long scripts. version = get_application_version() for element in ifc.by_type("IfcApplication"): @@ -238,7 +238,7 @@ def get_application(ifc): ) -def get_application_version(): +def get_application_version() -> str: return ".".join( [ str(x) diff --git a/src/blenderbim/blenderbim/tool/owner.py b/src/blenderbim/blenderbim/tool/owner.py index bd5f068adc..b805112689 100644 --- a/src/blenderbim/blenderbim/tool/owner.py +++ b/src/blenderbim/blenderbim/tool/owner.py @@ -19,6 +19,8 @@ import bpy import blenderbim.core.tool import blenderbim.tool as tool +import ifcopenshell +from typing import Union class Owner(blenderbim.core.tool.Owner): @@ -27,7 +29,7 @@ class Owner(blenderbim.core.tool.Owner): bpy.context.scene.BIMOwnerProperties.active_user_id = user.id() @classmethod - def get_user(cls): + def get_user(cls) -> Union[ifcopenshell.entity_instance, None]: if bpy.context.scene.BIMOwnerProperties.active_user_id: return tool.Ifc.get().by_id(bpy.context.scene.BIMOwnerProperties.active_user_id) elif tool.Ifc.get_schema() == "IFC2X3": diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py index 0e71411464..23b07f0c03 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py @@ -17,20 +17,34 @@ # along with IfcOpenShell. If not, see . import numpy as np +import numpy.typing as npt import ifcopenshell.api import ifcopenshell.util.unit import ifcopenshell.util.element import ifcopenshell.util.placement +from typing import Optional, Union + +NPArrayOfFloats = npt.NDArray[np.float64] class Usecase: - def __init__(self, file, **settings): + def __init__( + self, + file: ifcopenshell.file, + product: ifcopenshell.entity_instance, + matrix: Optional[NPArrayOfFloats] = None, + is_si=True, + should_transform_children=False, + ): self.file = file - self.settings = {"product": None, "matrix": np.eye(4), "is_si": True, "should_transform_children": False} - for key, value in settings.items(): - self.settings[key] = value + self.settings = { + "product": product, + "matrix": matrix if matrix is not None else np.eye(4), + "is_si": is_si, + "should_transform_children": should_transform_children, + } - def execute(self): + def execute(self) -> ifcopenshell.entity_instance: if not hasattr(self.settings["product"], "ObjectPlacement"): return self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file) @@ -69,12 +83,12 @@ class Usecase: return new_placement - def convert_matrix_to_si(self, matrix): + def convert_matrix_to_si(self, matrix: NPArrayOfFloats): matrix[0][3] *= self.unit_scale matrix[1][3] *= self.unit_scale matrix[2][3] *= self.unit_scale - def get_placement_rel_to(self): + def get_placement_rel_to(self) -> Union[ifcopenshell.entity_instance, None]: if getattr(self.settings["product"], "Decomposes", None): relating_object = self.settings["product"].Decomposes[0].RelatingObject return relating_object.ObjectPlacement if hasattr(relating_object, "ObjectPlacement") else None @@ -96,7 +110,7 @@ class Usecase: elif getattr(self.settings["product"], "ContainedInStructure", None): return self.settings["product"].ContainedInStructure[0].RelatingStructure.ObjectPlacement - def get_children_settings(self, placement): + def get_children_settings(self, placement: Union[ifcopenshell.entity_instance, None]) -> list[dict]: if not placement: return [] results = [] @@ -116,7 +130,9 @@ class Usecase: results.append({"product": obj, "matrix": matrix, "is_si": False, "should_transform_children": True}) return results - def get_relative_placement(self, placement_rel_to): + def get_relative_placement( + self, placement_rel_to: Union[ifcopenshell.entity_instance, None] + ) -> ifcopenshell.entity_instance: if placement_rel_to: relating_object_matrix = ifcopenshell.util.placement.get_local_placement(placement_rel_to) relating_object_matrix[0][3] = self.convert_unit_to_si(relating_object_matrix[0][3]) @@ -136,19 +152,21 @@ class Usecase: relative_placement_matrix[:, 0][0:3], ) - def create_ifc_axis_2_placement_3d(self, point, up, forward): + def create_ifc_axis_2_placement_3d( + self, point: NPArrayOfFloats, up: NPArrayOfFloats, forward: NPArrayOfFloats + ) -> ifcopenshell.entity_instance: return self.file.createIfcAxis2Placement3D( self.create_cartesian_point(point), self.file.createIfcDirection(up.tolist()), self.file.createIfcDirection(forward.tolist()), ) - def create_cartesian_point(self, co): + def create_cartesian_point(self, co: NPArrayOfFloats) -> ifcopenshell.entity_instance: co = self.convert_si_to_unit(co) return self.file.createIfcCartesianPoint(co.tolist()) - def convert_si_to_unit(self, co): + def convert_si_to_unit(self, co: NPArrayOfFloats) -> NPArrayOfFloats: return co / self.unit_scale - def convert_unit_to_si(self, co): + def convert_unit_to_si(self, co: NPArrayOfFloats) -> NPArrayOfFloats: return co * self.unit_scale diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py index db4121d9cb..0e6f676fbc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py @@ -15,10 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell class Usecase: - def __init__(self, file, identification="APTR", name="Aperture Science"): + def __init__(self, file: ifcopenshell.file, identification: str = "APTR", name: str = "Aperture Science"): """Adds a new organisation Organisations are the main way to identify manufacturers, suppliers, and @@ -45,7 +46,7 @@ class Usecase: self.file = file self.settings = {"identification": identification, "name": name} - def execute(self): + def execute(self) -> ifcopenshell.entity_instance: data = {"Name": self.settings["name"]} if self.file.schema == "IFC2X3": data["Id"] = self.settings["identification"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py index 308d771e21..268568c80d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py @@ -15,10 +15,17 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell class Usecase: - def __init__(self, file, identification="HSeldon", family_name="Seldon", given_name="Hari"): + def __init__( + self, + file: ifcopenshell.entity_instance, + identification: str = "HSeldon", + family_name: str = "Seldon", + given_name: str = "Hari", + ): """Adds a new person Persons are used to identify a legal or liable representative of an @@ -48,7 +55,7 @@ class Usecase: "given_name": given_name, } - def execute(self): + def execute(self) ->ifcopenshell.entity_instance: data = {"FamilyName": self.settings["family_name"], "GivenName": self.settings["given_name"]} if self.file.schema == "IFC2X3": data["Id"] = self.settings["identification"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py index 05c137b516..3e0b372690 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py @@ -15,10 +15,16 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell class Usecase: - def __init__(self, file, person=None, organisation=None): + def __init__( + self, + file: ifcopenshell.entity_instance, + person: ifcopenshell.entity_instance, + organisation: ifcopenshell.entity_instance, + ): """Adds a paired person and organisation A person and an organisation may be paired to create a representative @@ -47,5 +53,5 @@ class Usecase: self.file = file self.settings = {"person": person, "organisation": organisation} - def execute(self): + def execute(self) -> ifcopenshell.entity_instance: return self.file.createIfcPersonAndOrganization(self.settings["person"], self.settings["organisation"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py index 4ae66cb45e..31491feeaa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py @@ -19,10 +19,11 @@ import time import ifcopenshell import ifcopenshell.api.owner.settings +from typing import Union class Usecase: - def __init__(self, file): + def __init__(self, file: ifcopenshell.entity_instance): """Creates a new owner history indicating an element was added Any object in IFC with a unique ID and name (such as physical products, @@ -59,8 +60,9 @@ class Usecase: are writing your own advanced scripts and want to take advantage of the easier ownership tracking. - :return: The newly created IfcOwnerHistory element. - :rtype: ifcopenshell.entity_instance.entity_instance + :return: The newly created IfcOwnerHistory element or `None` if it's + not IFC2X3 and user or application is not found in the current project. + :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] Example: @@ -99,7 +101,7 @@ class Usecase: self.file = file self.settings = {} - def execute(self): + def execute(self) -> Union[ifcopenshell.entity_instance, None]: user = ifcopenshell.api.owner.settings.get_user(self.file) if self.file.schema != "IFC2X3" and not user: return diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py index de479a1d39..3a260a08f7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py @@ -23,7 +23,9 @@ import ifcopenshell.util.placement class Usecase: - def __init__(self, file, opening=None, element=None): + def __init__( + self, file: ifcopenshell.file, opening: ifcopenshell.entity_instance, element: ifcopenshell.entity_instance + ): """Create an opening in an element It is often necessary to cut out openings in elements like walls and @@ -103,18 +105,18 @@ class Usecase: self.file = file self.settings = {"opening": opening, "element": element} - def execute(self): + def execute(self) -> ifcopenshell.entity_instance: voids_elements = self.settings["opening"].VoidsElements if voids_elements: if voids_elements[0].RelatingBuildingElement == self.settings["element"]: - return + return voids_elements[0] history = voids_elements[0].OwnerHistory self.file.remove(voids_elements[0]) if history: ifcopenshell.util.element.remove_deep2(self.file, history) - self.file.create_entity( + rel = self.file.create_entity( "IfcRelVoidsElement", **{ "GlobalId": ifcopenshell.guid.new(), @@ -133,3 +135,5 @@ class Usecase: matrix=ifcopenshell.util.placement.get_local_placement(self.settings["opening"].ObjectPlacement), is_si=False, ) + + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py index 6ed1079b41..3735d2e735 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py @@ -17,10 +17,11 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +import ifcopenshell.util.element class Usecase: - def __init__(self, file, opening=None): + def __init__(self, file: ifcopenshell.entity_instance, opening: ifcopenshell.entity_instance): """Remove an opening Fillings are retained as orphans. Voided elements remain. Openings @@ -47,7 +48,7 @@ class Usecase: self.file = file self.settings = {"opening": opening} - def execute(self): + def execute(self) -> None: for rel in self.settings["opening"].VoidsElements: history = rel.OwnerHistory self.file.remove(rel) diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index c6802aa4a3..6fba487e6c 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -67,8 +67,9 @@ def set_unsupported_attribute(*args): _method_dict = {} -def register_schema_attributes(schema): +def register_schema_attributes(schema: ifcopenshell_wrapper.schema_definition) -> None: for decl in schema.declarations(): + decl: ifcopenshell_wrapper.declaration if hasattr(decl, "argument_types"): fq_name = ".".join((schema.name(), decl.name())) From 21e153087a4ddcb6dfe941be60729ac019b7c407 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 26 Apr 2024 15:15:17 +0500 Subject: [PATCH 038/429] edit_object_placement - adherence support Update edit_object_placement.py --- .../ifcopenshell/api/geometry/edit_object_placement.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py index 23b07f0c03..c8c4a3823f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py @@ -107,6 +107,10 @@ class Usecase: elif getattr(self.settings["product"], "ProjectsElements", None): relating_object = self.settings["product"].ProjectsElements[0].RelatingElement return relating_object.ObjectPlacement if hasattr(relating_object, "ObjectPlacement") else None + # TODO: add tests when there will be adherence api + elif getattr(self.settings["product"], "AdheresToElement", None): + relating_object = self.settings["product"].AdheresToElement[0].RelatingElement + return relating_object.ObjectPlacement if hasattr(relating_object, "ObjectPlacement") else None elif getattr(self.settings["product"], "ContainedInStructure", None): return self.settings["product"].ContainedInStructure[0].RelatingStructure.ObjectPlacement From f726708815e5b1b227deeec9a61af1edb6ea5b2e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 26 Apr 2024 15:19:59 +0500 Subject: [PATCH 039/429] edit_object_placement - small optimizations --- .../api/geometry/edit_object_placement.py | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py index c8c4a3823f..2f442388b6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py @@ -89,30 +89,29 @@ class Usecase: matrix[2][3] *= self.unit_scale def get_placement_rel_to(self) -> Union[ifcopenshell.entity_instance, None]: - if getattr(self.settings["product"], "Decomposes", None): - relating_object = self.settings["product"].Decomposes[0].RelatingObject - return relating_object.ObjectPlacement if hasattr(relating_object, "ObjectPlacement") else None - elif getattr(self.settings["product"], "Nests", None): - relating_object = self.settings["product"].Nests[0].RelatingObject - return relating_object.ObjectPlacement if hasattr(relating_object, "ObjectPlacement") else None - elif getattr(self.settings["product"], "ContainedIn", None): - related_element = self.settings["product"].ContainedIn[0].RelatedElement - return related_element.ObjectPlacement if hasattr(related_element, "ObjectPlacement") else None - elif getattr(self.settings["product"], "VoidsElements", None): - relating_object = self.settings["product"].VoidsElements[0].RelatingBuildingElement - return relating_object.ObjectPlacement if hasattr(relating_object, "ObjectPlacement") else None - elif getattr(self.settings["product"], "FillsVoids", None): - relating_object = self.settings["product"].FillsVoids[0].RelatingOpeningElement - return relating_object.ObjectPlacement if hasattr(relating_object, "ObjectPlacement") else None - elif getattr(self.settings["product"], "ProjectsElements", None): - relating_object = self.settings["product"].ProjectsElements[0].RelatingElement - return relating_object.ObjectPlacement if hasattr(relating_object, "ObjectPlacement") else None + product = self.settings["product"] + relating_object = None + + if rels := getattr(product, "Decomposes", None): + relating_object = rels[0].RelatingObject + elif rels := getattr(product, "Nests", None): + relating_object = rels[0].RelatingObject + elif rels := getattr(product, "ContainedIn", None): + relating_object = rels[0].RelatedElement + elif rels := getattr(product, "VoidsElements", None): + relating_object = rels[0].RelatingBuildingElement + elif rels := getattr(product, "FillsVoids", None): + relating_object = rels[0].RelatingOpeningElement + elif rels := getattr(product, "ProjectsElements", None): + relating_object = rels[0].RelatingElement # TODO: add tests when there will be adherence api - elif getattr(self.settings["product"], "AdheresToElement", None): - relating_object = self.settings["product"].AdheresToElement[0].RelatingElement - return relating_object.ObjectPlacement if hasattr(relating_object, "ObjectPlacement") else None - elif getattr(self.settings["product"], "ContainedInStructure", None): - return self.settings["product"].ContainedInStructure[0].RelatingStructure.ObjectPlacement + elif rels := getattr(product, "AdheresToElement", None): + relating_object = rels[0].RelatingElement + elif rels := getattr(product, "ContainedInStructure", None): + return rels[0].RelatingStructure.ObjectPlacement + + if relating_object: + return getattr(relating_object, "ObjectPlacement", None) def get_children_settings(self, placement: Union[ifcopenshell.entity_instance, None]) -> list[dict]: if not placement: From 3ac69043d696e0e4480ec9bcfa8390892254e0c5 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 26 Apr 2024 17:50:28 +0500 Subject: [PATCH 040/429] bbim to provide default user and organisation in ifc2x3 #4574 previously every operation that would try to create owner history would fail with the error below if there wasn't IfcPersonAndOrganisation in the project. --- src/blenderbim/blenderbim/bim/handler.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/handler.py b/src/blenderbim/blenderbim/bim/handler.py index 9ebe90c5e7..49cb42cf9b 100644 --- a/src/blenderbim/blenderbim/bim/handler.py +++ b/src/blenderbim/blenderbim/bim/handler.py @@ -238,6 +238,19 @@ def get_application(ifc: ifcopenshell.file) -> ifcopenshell.entity_instance: ) +def get_user(ifc: ifcopenshell.file) -> Union[ifcopenshell.entity_instance, None]: + # TODO: cache this for even faster application retrieval. It honestly makes a difference on long scripts. + if pao := next(iter(ifc.by_type("IfcPersonAndOrganization")), None): + return pao + elif ifc.schema == "IFC2X3": + if (person := next(iter(ifc.by_type("IfcPerson")), None)) is None: + person = tool.Ifc.run("owner.add_person") + if (organization := next(iter(ifc.by_type("IfcOrganization")), None)) is None: + organization = tool.Ifc.run("owner.add_organisation") + pao = tool.Ifc.run("owner.add_person_and_organisation", person=person, organisation=organization) + return pao + + def get_application_version() -> str: return ".".join( [ @@ -279,7 +292,7 @@ def load_post(scene): key=key, owner=global_subscription_owner, args=(area,), notify=viewport_shading_changed_callback ) - ifcopenshell.api.owner.settings.get_user = lambda ifc: core_owner.get_user(tool.Owner) + ifcopenshell.api.owner.settings.get_user = get_user ifcopenshell.api.owner.settings.get_application = get_application AuthoringData.type_thumbnails = {} From 2b926f790676b274287163b9afef99fdf00cab76 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 26 Apr 2024 18:16:38 +0500 Subject: [PATCH 041/429] more descriptive error setting non-optional attributes with None Example: ``` import ifcopenshell import ifcopenshell.api.owner.settings ifc_file = ifcopenshell.file(schema="IFC2X3") ifc_file.createIfcOwnerHistory(OwningUser=None) # Before: # Traceback (most recent call last): # File "\test.py", line 16, in # ifcopenshell.api.run("owner.create_owner_history", ifc_file) # File "\ifcopenshell\api\__init__.py", line 172, in run # result = usecase_class(ifc_file, **settings).execute() # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # File "\ifcopenshell\api\owner\create_owner_history.py", line 111, in execute # return self.file.create_entity( # ^^^^^^^^^^^^^^^^^^^^^^^^ # File "\ifcopenshell\file.py", line 350, in create_entity # e[idx] = arg # ~^^^^^ # File "\ifcopenshell\entity_instance.py", line 305, in __setitem__ # self.wrapped_data.setArgumentAsNull(idx) # File "\ifcopenshell\ifcopenshell_wrapper.py", line 5285, in setArgumentAsNull # return _ifcopenshell_wrapper.entity_instance_setArgumentAsNull(self, i) # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # RuntimeError: Attribute not set # After: # Traceback (most recent call last): # File "\test.py", line 16, in # ifcopenshell.api.run("owner.create_owner_history", ifc_file) # File "\ifcopenshell\api\__init__.py", line 172, in run # result = usecase_class(ifc_file, **settings).execute() # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # File "\ifcopenshell\api\owner\create_owner_history.py", line 111, in execute # return self.file.create_entity( # ^^^^^^^^^^^^^^^^^^^^^^^^ # File "\ifcopenshell\file.py", line 350, in create_entity # e[idx] = arg # ~^^^^^ # File "\ifcopenshell\entity_instance.py", line 316, in __setitem__ # raise ValueError( # ValueError: attribute 'OwningUser' is not optional for entity instance of type 'IFC2X3.IfcOwnerHistory' ``` --- .../ifcopenshell/entity_instance.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index 6fba487e6c..b94aedac41 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -303,7 +303,15 @@ class entity_instance(object): if value is None: if method is not set_derived_attribute: - self.wrapped_data.setArgumentAsNull(idx) + try: + self.wrapped_data.setArgumentAsNull(idx) + except RuntimeError as e: + if e.args == ("Attribute not set",): + raise ValueError( + "attribute '%s' is not optional for entity instance of type '%s'" + % (self.wrapped_data.get_argument_name(idx), self.wrapped_data.is_a(True)) + ) + raise e else: self.method_list[idx](self.wrapped_data, idx, entity_instance.unwrap_value(value)) From c05d2df1162fd003aa7ebedc06ab1e699c5cf3ee Mon Sep 17 00:00:00 2001 From: Massimo Fabbro Date: Sat, 6 Apr 2024 16:30:42 +0200 Subject: [PATCH 042/429] now spaces created with spatial tool have relative zero elevation origin point --- src/blenderbim/blenderbim/core/spatial.py | 2 +- src/blenderbim/blenderbim/core/tool.py | 1 + src/blenderbim/blenderbim/tool/spatial.py | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/core/spatial.py b/src/blenderbim/blenderbim/core/spatial.py index 171642900a..1d7c79246b 100644 --- a/src/blenderbim/blenderbim/core/spatial.py +++ b/src/blenderbim/blenderbim/core/spatial.py @@ -214,7 +214,7 @@ def generate_spaces_from_walls(ifc, spatial, collector): obj = spatial.get_named_obj_from_bmesh(name, bmesh=bm) - spatial.set_obj_origin_to_bboxcenter(obj) + spatial.set_obj_origin_to_bboxcenter_and_zero_elevation(obj) spatial.traslate_obj_to_z_location(obj, z) spatial.link_obj_to_active_collection(obj) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index ef5fcc883f..470987661a 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -872,6 +872,7 @@ class Spatial: def get_transformed_mesh_from_local_to_global(cls, mesh): pass def edit_active_space_obj_from_mesh(cls, mesh): pass def set_obj_origin_to_bboxcenter(cls, obj): pass + def set_obj_origin_to_bboxcenter_and_zero_elevation(cls, obj): pass def set_obj_origin_to_cursor_position(cls, obj): pass def get_selected_objects(cls): pass def get_active_obj(cls): pass diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index 48d2b54274..0f2dc4d9c4 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -582,6 +582,24 @@ class Spatial(blenderbim.core.tool.Spatial): vert.co = inverted @ aux_vector obj.location = newLoc + @classmethod + def set_obj_origin_to_bboxcenter_and_zero_elevation(cls, obj): + mat = obj.matrix_world + inverted = mat.inverted() + local_bbox_center = 0.125 * sum((Vector(b) for b in obj.bound_box), Vector()) + global_bbox_center = mat @ local_bbox_center + global_obj_origin = global_bbox_center + global_obj_origin.z = 0 + + oldLoc = obj.location + newLoc = global_obj_origin + diff = newLoc - oldLoc + for vert in obj.data.vertices: + aux_vector = mat @ vert.co + aux_vector = aux_vector - diff + vert.co = inverted @ aux_vector + obj.location = newLoc + @classmethod def set_obj_origin_to_cursor_position(cls, obj): mat = obj.matrix_world From f021041b31ef90ec9fc7f73c07e561d9a6ed35a7 Mon Sep 17 00:00:00 2001 From: Massimo Fabbro Date: Sun, 7 Apr 2024 16:29:53 +0200 Subject: [PATCH 043/429] Remove the (maybe) unnecessary poll functions for spatial tool and cleaner error messages --- .../blenderbim/bim/module/model/space.py | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/space.py b/src/blenderbim/blenderbim/bim/module/model/space.py index 90ada213a6..1875efa31f 100644 --- a/src/blenderbim/blenderbim/bim/module/model/space.py +++ b/src/blenderbim/blenderbim/bim/module/model/space.py @@ -27,7 +27,7 @@ import blenderbim.core.type class GenerateSpace(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.generate_space" - bl_label = "Generate Space" + bl_label = "Generate Space from Cursor" bl_options = {"REGISTER"} bl_description = ( "Create a space from the cursor position. " @@ -35,30 +35,34 @@ class GenerateSpace(bpy.types.Operator, tool.Ifc.Operator): "select the right space collection and run the operator" ) - @classmethod - def poll(cls, context): - collection = context.view_layer.active_layer_collection.collection - collection_obj = collection.BIMCollectionProperties.obj - active_obj = context.active_object - element = tool.Ifc.get_entity(active_obj) - return tool.Ifc.get_entity(collection_obj) and not element.is_a("IfcWall") +# @classmethod +# def poll(cls, context): +# print(context) +# collection = context.view_layer.active_layer_collection.collection +# collection_obj = collection.BIMCollectionProperties.obj +# active_obj = context.active_object +# element = tool.Ifc.get_entity(active_obj) +# return tool.Ifc.get_entity(collection_obj) and not element.is_a("IfcWall") def _execute(self, context): # This works as a 2.5 extruded polygon based on a cutting plane. Note # that rooms exclude walls (i.e. not to wall midpoint or exterior / # exterior edge. - def msg(self, context): - self.layout.label(text="NO ACTIVE STOREY") + def msg_no_collection(self, context): + self.layout.label(text="NO ACTIVE COLLECTION. PLEASE SELECT A SPATIAL COLLECTION OBJECT OR A WALL") + + def msg_no_active_storey(self, context): + self.layout.label(text="NO ACTIVE STOREY. PLEASE SELECT A SPATIAL COLLECTION OBJECT") collection = context.view_layer.active_layer_collection.collection collection_obj = collection.BIMCollectionProperties.obj if not collection_obj: - context.window_manager.popup_menu(msg, title="Error", icon="ERROR") + context.window_manager.popup_menu(msg_no_collection, title="Error", icon="ERROR") return spatial_element = tool.Ifc.get_entity(collection_obj) - if not spatial_element: - context.window_manager.popup_menu(msg, title="Error", icon="ERROR") + if not spatial_element or not spatial_element.is_a("IfcBuildingStorey"): + context.window_manager.popup_menu(msg_no_active_storey, title="Error", icon="ERROR") return core.generate_space(tool.Ifc, tool.Spatial, tool.Model, tool.Type) @@ -70,12 +74,12 @@ class GenerateSpacesFromWalls(bpy.types.Operator, tool.Ifc.Operator): bl_options = {"REGISTER", "UNDO"} bl_description = "Generate spaces from selected walls. The active object must be a wall" - @classmethod - def poll(cls, context): - active_obj = context.active_object - element = tool.Ifc.get_entity(active_obj) - if element: - return context.selected_objects and element.is_a("IfcWall") +# @classmethod +# def poll(cls, context): +# active_obj = context.active_object +# element = tool.Ifc.get_entity(active_obj) +# if element: +# return context.selected_objects and element.is_a("IfcWall") def _execute(self, context): # This only works based on a 2D plan only considering the standard @@ -87,19 +91,30 @@ class GenerateSpacesFromWalls(bpy.types.Operator, tool.Ifc.Operator): element = tool.Ifc.get_entity(active_obj) container = tool.Spatial.get_container(element) + def msg_no_active_object(self, context): + self.layout.label(text="No active object. Please select a wall") + def msg_no_active_wall(self, context): + self.layout.label(text="The active object is not a wall. Please select a wall.") + def msg_no_container(self, context): + self.layout.label(text="The wall is not contained. Please the selected wall in a building container") + def msg_no_selected_objects(self, context): + self.layout.label(text="No selected objects found. Please select walls.") + if not active_obj: - self.report({"ERROR"}, "No active object. Please select a wall") + context.window_manager.popup_menu(msg_no_active_object, title="Error", icon="ERROR") return element = tool.Ifc.get_entity(active_obj) if element and not element.is_a("IfcWall"): - return self.report({"ERROR"}, "The active object is not a wall. Please select a wall.") + context.window_manager.popup_menu(msg_no_active_wall, title="Error", icon="ERROR") + return if not container: - self.report({"ERROR"}, "The wall is not contained.") + context.window_manager.popup_menu(msg_no_container, title="Error", icon="ERROR") + return if not context.selected_objects: - self.report({"ERROR"}, "No selected objects found. Please select walls.") + context.window_manager.popup_menu(msg_no_selected_objects, title="Error", icon="ERROR") return core.generate_spaces_from_walls(tool.Ifc, tool.Spatial, tool.Collector) From 74da3278030ff940cf329cb4c556357c4d61f1f6 Mon Sep 17 00:00:00 2001 From: Massimo Fabbro Date: Tue, 9 Apr 2024 20:43:29 +0200 Subject: [PATCH 044/429] Fix create space from cursor bug where spaces were created always in zero elevation --- src/blenderbim/blenderbim/core/spatial.py | 3 ++- src/blenderbim/blenderbim/core/tool.py | 2 +- src/blenderbim/blenderbim/tool/spatial.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/core/spatial.py b/src/blenderbim/blenderbim/core/spatial.py index 1d7c79246b..139eeef46a 100644 --- a/src/blenderbim/blenderbim/core/spatial.py +++ b/src/blenderbim/blenderbim/core/spatial.py @@ -189,7 +189,8 @@ def generate_space(ifc, spatial, model, Type): name = "Space" obj = spatial.get_named_obj_from_mesh(name, mesh) - spatial.set_obj_origin_to_cursor_position(obj) + spatial.set_obj_origin_to_cursor_position_and_zero_elevation(obj) + spatial.traslate_obj_to_z_location(obj, z) spatial.link_obj_to_active_collection(obj) spatial.assign_ifcspace_class_to_obj(obj) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 470987661a..d832bae89b 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -873,7 +873,7 @@ class Spatial: def edit_active_space_obj_from_mesh(cls, mesh): pass def set_obj_origin_to_bboxcenter(cls, obj): pass def set_obj_origin_to_bboxcenter_and_zero_elevation(cls, obj): pass - def set_obj_origin_to_cursor_position(cls, obj): pass + def set_obj_origin_to_cursor_position_and_zero_elevation(cls, obj): pass def get_selected_objects(cls): pass def get_active_obj(cls): pass def get_active_obj_z(cls): pass diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index 0f2dc4d9c4..94fde8ab6e 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -601,14 +601,14 @@ class Spatial(blenderbim.core.tool.Spatial): obj.location = newLoc @classmethod - def set_obj_origin_to_cursor_position(cls, obj): + def set_obj_origin_to_cursor_position_and_zero_elevation(cls, obj): mat = obj.matrix_world inverted = mat.inverted() collection = bpy.context.view_layer.active_layer_collection.collection collection_obj = collection.BIMCollectionProperties.obj x, y = bpy.context.scene.cursor.location.xy - z = collection_obj.matrix_world.translation.z + z = 0 oldLoc = obj.location newLoc = Vector((x, y, z)) From d212344c5448027f7bbc58da121889b4b76eb88b Mon Sep 17 00:00:00 2001 From: Massimo Fabbro Date: Sun, 14 Apr 2024 14:59:10 +0200 Subject: [PATCH 045/429] Covering tool more user friendly UI ... --- .../bim/module/covering/workspace.py | 147 +++++++++++------- .../blenderbim/bim/module/model/covering.py | 18 ++- src/blenderbim/blenderbim/core/covering.py | 9 +- 3 files changed, 106 insertions(+), 68 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/covering/workspace.py b/src/blenderbim/blenderbim/bim/module/covering/workspace.py index cf4218a40e..d71d04f3fb 100644 --- a/src/blenderbim/blenderbim/bim/module/covering/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/covering/workspace.py @@ -107,59 +107,88 @@ class CoveringToolUI: # elif element and bpy.context.selected_objects and element.is_a("IfcSpace"): # op. = row.operator("bim.add_istance_flooring_from_spaces"): - if (type_material_usage == "IfcMaterialLayerSet" and - not bpy.context.selected_objects): - row = cls.layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_A") - if tool.Ifc.get_entity(collection_obj): - if AuthoringData.data["predefined_type"] == "FLOORING": - op = row.operator("bim.add_instance_flooring_covering_from_cursor") - elif AuthoringData.data["predefined_type"] == "CEILING": - op = row.operator("bim.add_instance_ceiling_covering_from_cursor") - else: - op = row.operator("bim.add_constr_type_instance", text="Add") - op.from_invoke = True - if cls.props.relating_type_id.isnumeric(): - op.relating_type_id = int(cls.props.relating_type_id) - - else: - op = row.operator("bim.add_constr_type_instance", text="Add") - op.from_invoke = True - if cls.props.relating_type_id.isnumeric(): - op.relating_type_id = int(cls.props.relating_type_id) - - elif (AuthoringData.data["predefined_type"] == "FLOORING" and - type_material_usage == "IfcMaterialLayerSet" and - element and - bpy.context.selected_objects and - element.is_a("IfcWall")): - row = cls.layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_A") - op = row.operator("bim.add_instance_flooring_coverings_from_walls") - - elif (AuthoringData.data["predefined_type"] == "CEILING" and - type_material_usage == "IfcMaterialLayerSet" and - element and - bpy.context.selected_objects and - element.is_a("IfcWall")): - row = cls.layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_A") - op = row.operator("bim.add_instance_ceiling_coverings_from_walls") - - elif (element and - bpy.context.selected_objects and - element.is_a("IfcCovering") and -# AuthoringData.data["predefined_type"] == "FLOORING" and - AuthoringData.data["active_material_usage"] == "LAYER3"): - row = cls.layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_G") - op = row.operator("bim.regen_selected_covering_object") +# if (type_material_usage == "IfcMaterialLayerSet" and +# not bpy.context.selected_objects): +# row = cls.layout.row(align=True) +# row.label(text="", icon="EVENT_SHIFT") +# row.label(text="", icon="EVENT_A") +# if tool.Ifc.get_entity(collection_obj): +# if AuthoringData.data["predefined_type"] == "FLOORING": +# op = row.operator("bim.add_instance_flooring_covering_from_cursor") +# elif AuthoringData.data["predefined_type"] == "CEILING": +# op = row.operator("bim.add_instance_ceiling_covering_from_cursor") +# else: +# op = row.operator("bim.add_constr_type_instance", text="Add") +# op.from_invoke = True +# if cls.props.relating_type_id.isnumeric(): +# op.relating_type_id = int(cls.props.relating_type_id) +# +# else: +# op = row.operator("bim.add_constr_type_instance", text="Add") +# op.from_invoke = True +# if cls.props.relating_type_id.isnumeric(): +# op.relating_type_id = int(cls.props.relating_type_id) +# +# elif (AuthoringData.data["predefined_type"] == "FLOORING" and +# type_material_usage == "IfcMaterialLayerSet" and +# element and +# bpy.context.selected_objects and +# element.is_a("IfcWall")): +# row = cls.layout.row(align=True) +# row.label(text="", icon="EVENT_SHIFT") +# row.label(text="", icon="EVENT_A") +# op = row.operator("bim.add_instance_flooring_coverings_from_walls") +# +# elif (AuthoringData.data["predefined_type"] == "CEILING" and +# type_material_usage == "IfcMaterialLayerSet" and +# element and +# bpy.context.selected_objects and +# element.is_a("IfcWall")): +# row = cls.layout.row(align=True) +# row.label(text="", icon="EVENT_SHIFT") +# row.label(text="", icon="EVENT_A") +# op = row.operator("bim.add_instance_ceiling_coverings_from_walls") +# +# elif (element and +# bpy.context.selected_objects and +# element.is_a("IfcCovering") and +## AuthoringData.data["predefined_type"] == "FLOORING" and +# AuthoringData.data["active_material_usage"] == "LAYER3"): +# row = cls.layout.row(align=True) +# row.label(text="", icon="EVENT_SHIFT") +# row.label(text="", icon="EVENT_G") +# op = row.operator("bim.regen_selected_covering_object") + row = cls.layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_A") + op = row.operator("bim.add_constr_type_instance", text="Add") + + row = cls.layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_A") + op = row.operator("bim.add_instance_flooring_covering_from_cursor") + + row = cls.layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_A") + op = row.operator("bim.add_instance_ceiling_covering_from_cursor") + + row = cls.layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_A") + op = row.operator("bim.add_instance_flooring_coverings_from_walls") + + row = cls.layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_A") + op = row.operator("bim.add_instance_ceiling_coverings_from_walls") + + row = cls.layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_G") + op = row.operator("bim.regen_selected_covering_object") # elif AuthoringData.data["predefined_type"] == "CEILING": # row = cls.layout.row(align=True) @@ -174,14 +203,14 @@ class CoveringToolUI: # op.from_invoke = True # if cls.props.relating_type_id.isnumeric(): # op.relating_type_id = int(cls.props.relating_type_id) - else: - row = cls.layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_A") - op = row.operator("bim.add_constr_type_instance", text="Add") - op.from_invoke = True - if cls.props.relating_type_id.isnumeric(): - op.relating_type_id = int(cls.props.relating_type_id) +# else: +# row = cls.layout.row(align=True) +# row.label(text="", icon="EVENT_SHIFT") +# row.label(text="", icon="EVENT_A") +# op = row.operator("bim.add_constr_type_instance", text="Add") +# op.from_invoke = True +# if cls.props.relating_type_id.isnumeric(): +# op.relating_type_id = int(cls.props.relating_type_id) @classmethod def draw_type_selection_interface(cls): diff --git a/src/blenderbim/blenderbim/bim/module/model/covering.py b/src/blenderbim/blenderbim/bim/module/model/covering.py index 9d9729be56..c5791e9c13 100644 --- a/src/blenderbim/blenderbim/bim/module/model/covering.py +++ b/src/blenderbim/blenderbim/bim/module/model/covering.py @@ -32,7 +32,9 @@ class AddInstanceFlooringCoveringFromCursor(bpy.types.Operator, tool.Ifc.Operato def poll(cls, context): collection = context.view_layer.active_layer_collection.collection collection_obj = collection.BIMCollectionProperties.obj - return tool.Ifc.get_entity(collection_obj) + relating_type_id = int(bpy.data.scenes["Scene"].BIMModelProperties.relating_type_id) + relating_type = ifcopenshell.util.element.get_predefined_type(tool.Ifc.get().by_id(relating_type_id)) + return tool.Ifc.get_entity(collection_obj) and relating_type == "FLOORING" def _execute(self, context): @@ -61,7 +63,9 @@ class AddInstanceCeilingCoveringFromCursor(bpy.types.Operator, tool.Ifc.Operator def poll(cls, context): collection = context.view_layer.active_layer_collection.collection collection_obj = collection.BIMCollectionProperties.obj - return tool.Ifc.get_entity(collection_obj) + relating_type_id = int(bpy.data.scenes["Scene"].BIMModelProperties.relating_type_id) + relating_type = ifcopenshell.util.element.get_predefined_type(tool.Ifc.get().by_id(relating_type_id)) + return tool.Ifc.get_entity(collection_obj) and relating_type == "CEILING" def _execute(self, context): @@ -116,9 +120,11 @@ class AddInstanceFlooringCoveringsFromWalls(bpy.types.Operator, tool.Ifc.Operato def poll(cls, context): active_obj = bpy.context.active_object element = tool.Ifc.get_entity(active_obj) + relating_type_id = int(bpy.data.scenes["Scene"].BIMModelProperties.relating_type_id) + relating_type = ifcopenshell.util.element.get_predefined_type(tool.Ifc.get().by_id(relating_type_id)) if element: if element.is_a("IfcWall") and tool.Model.get_usage_type(element) == "LAYER2": - return context.selected_objects + return context.selected_objects and relating_type == "FLOORING" def _execute(self, context): # This only works based on a 2D plan only considering the standard @@ -147,7 +153,7 @@ class AddInstanceFlooringCoveringsFromWalls(bpy.types.Operator, tool.Ifc.Operato class AddInstanceCeilingCoveringsFromWalls(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_instance_ceiling_coverings_from_walls" - bl_label = "Add Ceilings From Walls" + bl_label = "Add Ceiling From Walls" bl_options = {"REGISTER", "UNDO"} bl_description = "Add instance ceiling coverings from selected walls. The active object must be a wall and layered vertically" @@ -155,9 +161,11 @@ class AddInstanceCeilingCoveringsFromWalls(bpy.types.Operator, tool.Ifc.Operator def poll(cls, context): active_obj = bpy.context.active_object element = tool.Ifc.get_entity(active_obj) + relating_type_id = int(bpy.data.scenes["Scene"].BIMModelProperties.relating_type_id) + relating_type = ifcopenshell.util.element.get_predefined_type(tool.Ifc.get().by_id(relating_type_id)) if element: if element.is_a("IfcWall") and tool.Model.get_usage_type(element) == "LAYER2": - return context.selected_objects + return context.selected_objects and relating_type == "CEILING" def _execute(self, context): # This only works based on a 2D plan only considering the standard diff --git a/src/blenderbim/blenderbim/core/covering.py b/src/blenderbim/blenderbim/core/covering.py index f98cbe267a..a182ed57b9 100644 --- a/src/blenderbim/blenderbim/core/covering.py +++ b/src/blenderbim/blenderbim/core/covering.py @@ -46,7 +46,8 @@ def add_instance_flooring_covering_from_cursor(ifc, spatial, model, Type, geomet obj = spatial.get_named_obj_from_mesh(name, mesh) - spatial.set_obj_origin_to_cursor_position(obj) + spatial.set_obj_origin_to_cursor_position_and_zero_elevation(obj) + spatial.traslate_obj_to_z_location(obj, z) spatial.link_obj_to_active_collection(obj) points = spatial.get_2d_vertices_from_obj(obj) points = spatial.get_scaled_2d_vertices(points) @@ -74,7 +75,7 @@ def add_instance_ceiling_covering_from_cursor(ifc, spatial, model, Type, geometr else: x, y, z, h, mat = spatial.get_x_y_z_h_mat_from_cursor() - z = covering.get_z_from_ceiling_height() + ceiling_height = covering.get_z_from_ceiling_height() space_polygon = spatial.get_space_polygon_from_context_visible_objects(x, y) @@ -87,8 +88,8 @@ def add_instance_ceiling_covering_from_cursor(ifc, spatial, model, Type, geometr obj = spatial.get_named_obj_from_mesh(name, mesh) - spatial.set_obj_origin_to_cursor_position(obj) - spatial.traslate_obj_to_z_location(obj, z) + spatial.set_obj_origin_to_cursor_position_and_zero_elevation(obj) + spatial.traslate_obj_to_z_location(obj, z+ceiling_height) spatial.link_obj_to_active_collection(obj) points = spatial.get_2d_vertices_from_obj(obj) points = spatial.get_scaled_2d_vertices(points) From 677324927c23706ada371d34df1dcba71903f9cc Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Fri, 26 Apr 2024 20:09:20 -0500 Subject: [PATCH 046/429] fix #4431: prompt for name, when creating aggregate --- .../blenderbim/bim/module/aggregate/operator.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index 7c9b2d5fd1..2c3fbef38e 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -132,6 +132,7 @@ class BIM_OT_add_aggregate(bpy.types.Operator, tool.Ifc.Operator): bl_options = {"REGISTER", "UNDO"} obj: bpy.props.StringProperty() ifc_class: bpy.props.StringProperty(name="IFC Class", default="IfcElementAssembly") + aggregate_name: bpy.props.StringProperty(name="Name", default="Default_Name") def invoke(self, context, event): return context.window_manager.invoke_props_dialog(self) @@ -139,13 +140,15 @@ class BIM_OT_add_aggregate(bpy.types.Operator, tool.Ifc.Operator): def draw(self, context): row = self.layout row.prop(self, "ifc_class") + row = self.layout + row.prop(self, "aggregate_name") def _execute(self, context): try: ifc_class = tool.Ifc.schema().declaration_by_name(self.ifc_class).name() except: return - aggregate = self.create_aggregate(context, ifc_class) + aggregate = self.create_aggregate(context, ifc_class, self.aggregate_name) for obj in context.selected_objects: element = tool.Ifc.get_entity(obj) @@ -173,8 +176,8 @@ class BIM_OT_add_aggregate(bpy.types.Operator, tool.Ifc.Operator): ) core.assign_object(tool.Ifc, tool.Aggregate, tool.Collector, relating_obj=aggregate, related_obj=obj) - def create_aggregate(self, context, ifc_class): - aggregate = bpy.data.objects.new("Assembly", None) + def create_aggregate(self, context, ifc_class, aggregate_name): + aggregate = bpy.data.objects.new(aggregate_name, None) aggregate.location = context.scene.cursor.location bpy.ops.bim.assign_class(obj=aggregate.name, ifc_class=ifc_class) return aggregate From 44c28e9a4cbf345f0f17a2d77f5d76e39395e59c Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Fri, 26 Apr 2024 20:48:59 -0500 Subject: [PATCH 047/429] fix #4327: reorder format as well --- src/blenderbim/blenderbim/bim/module/csv/operator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/csv/operator.py b/src/blenderbim/blenderbim/bim/module/csv/operator.py index c2343220bc..34beeb5e27 100644 --- a/src/blenderbim/blenderbim/bim/module/csv/operator.py +++ b/src/blenderbim/blenderbim/bim/module/csv/operator.py @@ -72,7 +72,7 @@ class ReorderCsvAttribute(bpy.types.Operator): 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"] + props = ["name", "header", "sort", "group", "varies_value", "summary", "formatting"] for prop in props: value = getattr(new, prop) setattr(new, prop, getattr(old, prop)) From 8af37cb4ece5f589db1baf45907a3fcf59fdd8f1 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Sat, 27 Apr 2024 12:03:56 +0500 Subject: [PATCH 048/429] Fix #4586 occurred after e14d96e6e --- src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py index 10e6c04494..39de461c70 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py @@ -726,7 +726,7 @@ class SvgWriter: reference = tool.Drawing.get_drawing_reference(drawing) if reference: for sheet_reference in tool.Ifc.get().by_type("IfcDocumentReference"): - reference_description = tool.Drawing.get_reference_description(reference) + reference_description = tool.Drawing.get_reference_description(sheet_reference) if reference_description != "DRAWING" or sheet_reference.Location != reference.Location: continue sheet = tool.Drawing.get_reference_document(sheet_reference) From 3848a2113622b32ca9827f7ae4ae6f47fb2b768b Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sat, 27 Apr 2024 11:31:39 -0500 Subject: [PATCH 049/429] fix #4361: Have the aggregate empty turn on too, if at least one object in the aggregate, is turned on as well --- src/blenderbim/blenderbim/tool/drawing.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index b013e62854..4a417c52b2 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -1657,8 +1657,21 @@ class Drawing(blenderbim.core.tool.Drawing): base_elements = set(ifc_file.by_type("IfcElement") + ifc_file.by_type("IfcSpatialElement")) elements = {e for e in (elements & base_elements) if e.is_a() != "IfcSpace"} - # exclude annotations to avoid including annotations from other drawings - elements = {i for i in elements if not i.is_a("IfcAnnotation")} + + updated_set = set() + + for i in elements: + # exclude annotations to avoid including annotations from other drawings + if not i.is_a("IfcAnnotation"): + updated_set.add(i) + #add aggregate too, if element is host by one + if i.Decomposes: + aggregate = i.Decomposes[0].RelatingObject + updated_set.add(aggregate) + + # After the iteration is complete, update elements with updated set + elements.update(updated_set) + # add annotations from the current drawing annotations = tool.Drawing.get_group_elements(tool.Drawing.get_drawing_group(drawing)) elements.update(annotations) @@ -1836,8 +1849,8 @@ class Drawing(blenderbim.core.tool.Drawing): has_context = True break - # Don't hide IfcAnnotations as some of them might exist without representations - if has_context or element.is_a("IfcAnnotation"): + # Don't hide IfcAnnotations or Aggregates as some of them might exist without representations + if has_context or element.is_a("IfcAnnotation") or element.IsDecomposedBy: element_obj_names.add(obj.name) # Note that render visibility is only set on drawing generation time for speed. From dcbd6a925d623adb41f625d36c8cbb7f27d3f17b Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sat, 27 Apr 2024 18:13:38 -0500 Subject: [PATCH 050/429] small fix for #4361. remove IfcProject for class iterator. See https://github.com/IfcOpenShell/IfcOpenShell/issues/4361#issuecomment-2081223615 --- src/blenderbim/blenderbim/tool/drawing.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 4a417c52b2..7cdb5adfbd 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -1667,7 +1667,9 @@ class Drawing(blenderbim.core.tool.Drawing): #add aggregate too, if element is host by one if i.Decomposes: aggregate = i.Decomposes[0].RelatingObject - updated_set.add(aggregate) + #remove IfcProject for class iterator. See https://github.com/IfcOpenShell/IfcOpenShell/issues/4361#issuecomment-2081223615 + if not aggregate.is_a("IfcProject"): + updated_set.add(aggregate) # After the iteration is complete, update elements with updated set elements.update(updated_set) From 41df6410bdd5b96fb62db06cf62c2b3211f78973 Mon Sep 17 00:00:00 2001 From: Kaare Hansen Date: Sat, 27 Apr 2024 17:52:10 +0200 Subject: [PATCH 051/429] Comment std::cout causing console spam --- src/ifcgeom_schema_agnostic/IfcGeomTree.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ifcgeom_schema_agnostic/IfcGeomTree.h b/src/ifcgeom_schema_agnostic/IfcGeomTree.h index 7426f92c92..47c141011d 100644 --- a/src/ifcgeom_schema_agnostic/IfcGeomTree.h +++ b/src/ifcgeom_schema_agnostic/IfcGeomTree.h @@ -1780,9 +1780,11 @@ namespace IfcGeom { aabb.Add(vs_transformed.back()); } + /* std::cout << "aabb: "; aabb.DumpJson(std::cout); std::cout << std::endl; + */ std::unordered_map, std::vector, boost::hash>> quantized_normal_counts; @@ -1867,9 +1869,11 @@ namespace IfcGeom { obb.SetZComponent(ax3.Direction(), halfsize.Z()); obb.SetCenter(cent.Transformed(trsf2.Inverted())); + /* std::cout << "obb: "; obb.DumpJson(std::cout); std::cout << std::endl; + */ } const auto& t = elem->product(); From f857c513c5e5cb7310d3fe217fb2d451abd1ae29 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Sun, 28 Apr 2024 10:17:35 +0200 Subject: [PATCH 052/429] submodule --- src/svgfill | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/svgfill b/src/svgfill index 927a91e2c5..80155ec088 160000 --- a/src/svgfill +++ b/src/svgfill @@ -1 +1 @@ -Subproject commit 927a91e2c5b767c7b7f520cee09f515f2f85119a +Subproject commit 80155ec08824c7db097273c979e8db34dce32987 From 4b56b341243d6b0eed82e8533848b124e82e1344 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sun, 28 Apr 2024 10:34:52 -0500 Subject: [PATCH 053/429] Tweaked UI for Linked Aggregates https://imgur.com/a/rExISKO --- .../blenderbim/bim/module/aggregate/ui.py | 36 +++++++++++-------- .../bim/module/geometry/operator.py | 1 + 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py index bc691e3908..b3d80817d7 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py @@ -20,6 +20,7 @@ from bpy.types import Panel from blenderbim.bim.module.aggregate.data import AggregateData from blenderbim.bim.module.group.data import GroupsData, ObjectGroupsData from blenderbim.bim.ifc import IfcStore +import blenderbim.tool as tool class BIM_PT_aggregate(Panel): @@ -131,22 +132,29 @@ class BIM_PT_linked_aggregate(Panel): if not AggregateData.is_loaded: AggregateData.load() - props = context.active_object.BIMObjectAggregateProperties + obj = context.active_object + element = tool.Ifc.get_entity(obj) + props = obj.BIMObjectAggregateProperties row = layout.row(align=True) - row.label(text="Advanced Users Only", icon="ERROR") - row = layout.row(align=True) - - if type(AggregateData.data['total_linked_aggregate']) is int: - if AggregateData.data['total_linked_aggregate'] > 0: - row.label(text=f"{AggregateData.data['total_linked_aggregate']} Linked Aggregates") - op = row.operator("bim.select_linked_aggregates", text="", icon="OUTLINER_DATA_POINTCLOUD") - op.select_parts = False - op = row.operator("bim.select_linked_aggregates", text="", icon="OUTLINER_OB_POINTCLOUD") - op.select_parts = True - row.operator("bim.refresh_linked_aggregate", text="", icon="FILE_REFRESH") - op = row.operator("bim.break_link_to_other_aggregates", text="", icon="X") + + + if element.Decomposes: + Number_Linked_Aggregates = AggregateData.data['total_linked_aggregate'] + if not Number_Linked_Aggregates: + row.label(text="Not a Linked Aggregate") + else: + row.label(text=f"{Number_Linked_Aggregates} Linked Aggregates") + op = row.operator("bim.object_duplicate_move_linked_aggregate_macro", text="", icon="DUPLICATE") + if type(Number_Linked_Aggregates) is int: + if Number_Linked_Aggregates > 0: + op = row.operator("bim.select_linked_aggregates", text="", icon="OUTLINER_DATA_POINTCLOUD") + op.select_parts = False + op = row.operator("bim.select_linked_aggregates", text="", icon="OUTLINER_OB_POINTCLOUD") + op.select_parts = True + row.operator("bim.refresh_linked_aggregate", text="", icon="FILE_REFRESH") + op = row.operator("bim.break_link_to_other_aggregates", text="", icon="X") else: - row.label(text="No Linked Aggregates") + row.label(text="Not an Aggregate") diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index b3ce642269..4071d2a882 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -940,6 +940,7 @@ class OverrideDuplicateMoveLinked(bpy.types.Operator): class DuplicateMoveLinkedAggregateMacro(bpy.types.Macro): + bl_description = "Create a new linked aggregate" bl_idname = "bim.object_duplicate_move_linked_aggregate_macro" bl_label = "IFC Duplicate Linked Aggregate" bl_options = {"REGISTER", "UNDO"} From 9962a0c9053c6771b9960285055bcd21f0ed97e5 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sun, 28 Apr 2024 18:57:42 -0500 Subject: [PATCH 054/429] small fix to previous commit. Solves https://github.com/IfcOpenShell/IfcOpenShell/commit/4b56b341243d6b0eed82e8533848b124e82e1344#commitcomment-141442796 --- src/blenderbim/blenderbim/bim/module/aggregate/ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py index b3d80817d7..e7b47eefc3 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py @@ -144,7 +144,7 @@ class BIM_PT_linked_aggregate(Panel): row.label(text="Not a Linked Aggregate") else: row.label(text=f"{Number_Linked_Aggregates} Linked Aggregates") - op = row.operator("bim.object_duplicate_move_linked_aggregate_macro", text="", icon="DUPLICATE") + op = row.operator("bim.object_duplicate_move_linked_aggregate", text="", icon="DUPLICATE") if type(Number_Linked_Aggregates) is int: if Number_Linked_Aggregates > 0: op = row.operator("bim.select_linked_aggregates", text="", icon="OUTLINER_DATA_POINTCLOUD") From 8dde98f54351fa278568d7adfdf501a4d9827c99 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 29 Apr 2024 15:18:20 +0500 Subject: [PATCH 055/429] fix #4592 (after 0da3270) Before IFC4 Shape Aspects counldn't be part of IfcRepresentationMap --- src/ifcopenshell-python/ifcopenshell/util/element.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index f8b8791787..e93a22907b 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -512,6 +512,9 @@ def get_shape_aspects(element: ifcopenshell.entity_instance) -> list[ifcopenshel if (representation := getattr(element, "Representation", ...)) != ...: return representation.HasShapeAspects + if element.file.schema == "IFC2X3": + return [] + # IfcTypeProduct shape_aspects = [] for repersentation_map in element.RepresentationMaps: From 04172a87cbc87b2fe2247b4f4fff3eed39e2e2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Tue, 30 Apr 2024 17:50:31 -0300 Subject: [PATCH 056/429] when bpy.ops.bim.object_duplicate_move_linked_aggregate is called from the panel, the new objects are placed based on the 3d cursor position --- .../blenderbim/bim/module/aggregate/ui.py | 1 + .../blenderbim/bim/module/geometry/operator.py | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py index e7b47eefc3..4a6c3c4ae0 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py @@ -145,6 +145,7 @@ class BIM_PT_linked_aggregate(Panel): else: row.label(text=f"{Number_Linked_Aggregates} Linked Aggregates") op = row.operator("bim.object_duplicate_move_linked_aggregate", text="", icon="DUPLICATE") + op.location_from_3d_cursor = True if type(Number_Linked_Aggregates) is int: if Number_Linked_Aggregates > 0: op = row.operator("bim.select_linked_aggregates", text="", icon="OUTLINER_DATA_POINTCLOUD") diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index f953c1d743..f2ac8ddcd4 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -947,6 +947,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): bl_label = "IFC Duplicate Linked Aggregate" bl_options = {"REGISTER", "UNDO"} is_interactive: bpy.props.BoolProperty(name="Is Interactive", default=True) + location_from_3d_cursor: bpy.props.BoolProperty(name="Position Duplicate Based on 3d cursor", default=False) @classmethod def poll(cls, context): @@ -1073,7 +1074,19 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): if "BBIM_Linked_Aggregate" in r.RelatingGroup.Name ] tool.Ifc.run("group.assign_group", group=linked_aggregate_group[0], products=new) - + + def get_location_from_3d_cursor(old_to_new): + for new in old_to_new.values(): + aggregate = ifcopenshell.util.element.get_aggregate(new[0]) + if aggregate: + base_obj = tool.Ifc.get_object(aggregate) + base_obj_location = base_obj.location.copy() + break + + for new in old_to_new.values(): + new_obj = tool.Ifc.get_object(new[0]) + location_diff = new_obj.location - base_obj_location + new_obj.location = context.scene.cursor.location + location_diff if len(context.selected_objects) != 1: return {"FINISHED"} @@ -1101,6 +1114,9 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): custom_incremental_naming_for_element_assembly(old_to_new) + if self.location_from_3d_cursor: + get_location_from_3d_cursor(old_to_new) + blenderbim.bim.handler.refresh_ui_data() return old_to_new From fc0ffd1c02d6785f50d9de8accfeed5713208949 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 1 May 2024 15:40:45 +0500 Subject: [PATCH 057/429] =?UTF-8?q?fix=20a=20typo=20#4596=20=F0=9F=98=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/blenderbim/blenderbim/core/drawing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index b61f469bea..d4f6adab9b 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -145,7 +145,7 @@ def rename_sheet(ifc, drawing, sheet: ifcopenshell.entity_instance, identificati def rename_reference(ifc, drawing, reference=None, identification=None): - attributes = drawing.generate_reference_attributes(reference, Identifiaction=identification) + attributes = drawing.generate_reference_attributes(reference, Identification=identification) ifc.run("document.edit_reference", reference=reference, attributes=attributes) From 137a3062698ed4c9eed0a0ad4c476b74b6f12291 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 30 Apr 2024 12:17:23 +0500 Subject: [PATCH 058/429] typing --- src/blenderbim/blenderbim/bim/export_ifc.py | 14 +++++++++----- src/blenderbim/blenderbim/bim/import_ifc.py | 2 +- .../blenderbim/bim/module/drawing/operator.py | 1 + .../blenderbim/bim/module/drawing/svgwriter.py | 2 +- .../blenderbim/bim/module/geometry/data.py | 1 + .../blenderbim/bim/module/material/data.py | 1 + .../blenderbim/bim/module/model/product.py | 5 +++-- src/blenderbim/blenderbim/tool/geometry.py | 5 +++++ .../api/geometry/add_representation.py | 18 +++++++++++------- .../ifcopenshell/api/material/add_profile.py | 16 ++++++++++++---- .../api/owner/update_owner_history.py | 5 +++-- .../ifcpatch/recipes/RegenerateGlobalIds.py | 3 ++- 12 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/export_ifc.py b/src/blenderbim/blenderbim/bim/export_ifc.py index 5efaefa4b1..94d457918d 100644 --- a/src/blenderbim/blenderbim/bim/export_ifc.py +++ b/src/blenderbim/blenderbim/bim/export_ifc.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from __future__ import annotations import os import bpy import json @@ -36,6 +37,7 @@ import blenderbim.core.style from blenderbim.bim.ifc import IfcStore from mathutils import Vector from typing import Union +from logging import Logger class IfcExporter: @@ -163,10 +165,10 @@ class IfcExporter: bpy.ops.bim.update_representation(obj=obj.name) tool.Geometry.record_object_position(obj) - def get_application_name(self): + def get_application_name(self) -> str: return "BlenderBIM" - def get_application_version(self): + def get_application_version(self) -> str: version = ".".join( [ str(x) @@ -184,11 +186,13 @@ class IfcExporter: class IfcExportSettings: def __init__(self): - self.logger = None - self.output_file = None + self.logger: Logger = None + self.output_file: str = None + self.json_version: str = None + self.json_compact: bool = None @staticmethod - def factory(context, output_file, logger): + def factory(context: bpy.types.Context, output_file: str, logger: Logger) -> IfcExportSettings: settings = IfcExportSettings() settings.output_file = output_file settings.logger = logger diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 086827f1d5..c64b9058d4 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -2041,7 +2041,7 @@ class IfcImporter: class IfcImportSettings: def __init__(self): - self.logger = None + self.logger: logging.Logger = None self.input_file = None self.diff_file = None self.should_use_cpu_multiprocessing = True diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 844100c12e..7da481f1b4 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -29,6 +29,7 @@ import subprocess import numpy as np import multiprocessing import ifcopenshell +import ifcopenshell.ifcopenshell_wrapper import ifcopenshell.geom import ifcopenshell.util.selector import ifcopenshell.util.representation diff --git a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py index 39de461c70..4f5b40a52f 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py @@ -719,7 +719,7 @@ class SvgWriter: self.svg.text(sheet_id, insert=(text_position[0], text_position[1] + 2.5), class_="ELEVATION", **text_style) ) - def get_reference_and_sheet_id_from_annotation(self, element): + def get_reference_and_sheet_id_from_annotation(self, element: ifcopenshell.entity_instance) -> tuple[str, str]: reference_id = "-" sheet_id = "-" drawing = tool.Drawing.get_annotation_element(element) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/data.py b/src/blenderbim/blenderbim/bim/module/geometry/data.py index 4925a482f4..bbf10b8392 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/data.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/data.py @@ -17,6 +17,7 @@ # along with BlenderBIM Add-on. If not, see . import bpy +import ifcopenshell.util.element import blenderbim.tool as tool import ifcopenshell.util.placement from mathutils import Vector diff --git a/src/blenderbim/blenderbim/bim/module/material/data.py b/src/blenderbim/blenderbim/bim/module/material/data.py index cfdf3a8058..5e395438c8 100644 --- a/src/blenderbim/blenderbim/bim/module/material/data.py +++ b/src/blenderbim/blenderbim/bim/module/material/data.py @@ -19,6 +19,7 @@ import os import bpy import ifcopenshell +import ifcopenshell.util.element import ifcopenshell.util.doc import ifcopenshell.util.schema import blenderbim.tool as tool diff --git a/src/blenderbim/blenderbim/bim/module/model/product.py b/src/blenderbim/blenderbim/bim/module/model/product.py index 8c66e838d9..5da0e79283 100644 --- a/src/blenderbim/blenderbim/bim/module/model/product.py +++ b/src/blenderbim/blenderbim/bim/module/model/product.py @@ -39,6 +39,7 @@ from mathutils import Vector, Matrix from bpy_extras.object_utils import AddObjectHelper from . import prop import json +from typing import Any class EnableAddType(bpy.types.Operator, tool.Ifc.Operator): @@ -511,7 +512,7 @@ def regenerate_profile_usage(usecase_path, ifc_file, settings): ) -def ensure_material_assigned(usecase_path, ifc_file, settings): +def ensure_material_assigned(usecase_path: str, ifc_file: ifcopenshell.file, settings: dict[str, Any]) -> None: if usecase_path == "material.assign_material": if not settings.get("material", None): return @@ -550,7 +551,7 @@ def ensure_material_assigned(usecase_path, ifc_file, settings): obj.data.materials.append(IfcStore.get_element(material[0].id())) -def ensure_material_unassigned(usecase_path, ifc_file, settings): +def ensure_material_unassigned(usecase_path: str, ifc_file: ifcopenshell.file, settings: dict[str, Any]) -> None: elements = settings["products"] if elements[0].is_a("IfcElementType"): elements.extend(ifcopenshell.util.element.get_types(elements[0])) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 7acd2429ed..eed3d3412b 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -23,9 +23,14 @@ import hashlib import logging import numpy as np import ifcopenshell +import ifcopenshell.api +import ifcopenshell.util.element +import ifcopenshell.util.system import blenderbim.core.tool +import blenderbim.core.drawing import blenderbim.core.style import blenderbim.core.spatial +import blenderbim.core.system import blenderbim.core.geometry import blenderbim.tool as tool import blenderbim.bim.import_ifc diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index b435cf685b..2bd501cb49 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -29,7 +29,7 @@ EPSILON = 1e-6 class Usecase: - def __init__(self, file, **settings): + def __init__(self, file: ifcopenshell.file, **settings): # TODO: This usecase currently depends on Blender's data model self.file = file self.settings = { @@ -58,7 +58,7 @@ class Usecase: for key, value in settings.items(): self.settings[key] = value - def execute(self): + def execute(self) -> ifcopenshell.entity_instance: self.is_manifold = None if ( isinstance(self.settings["geometry"], bpy.types.Mesh) @@ -379,7 +379,7 @@ class Usecase: Axis=self.file.createIfcDirection(polygon.normal), )) - def create_annotation_fill_areas(self, is_2d=False): + def create_annotation_fill_areas(self, is_2d=False) -> list[ifcopenshell.entity_instance]: items = [] if self.file.schema != "IFC2X3": points = self.create_cartesian_point_list_from_vertices(self.settings["geometry"].vertices, is_2d=is_2d) @@ -391,7 +391,9 @@ class Usecase: items.append(self.file.createIfcAnnotationFillArea(OuterBoundary=curve)) return items - def create_curve_from_polygon(self, points, polygon, is_2d=False): + def create_curve_from_polygon( + self, points: ifcopenshell.entity_instance, polygon: bpy.types.MeshPolygon, is_2d=False + ) -> ifcopenshell.entity_instance: indices = list(polygon.vertices) indices.append(indices[0]) edge_loop = [self.file.createIfcLineIndex((v1 + 1, v2 + 1)) for v1, v2 in zip(indices, indices[1:])] @@ -460,7 +462,7 @@ class Usecase: return False return True - def create_curves(self, should_exclude_faces=False, is_2d=False): + def create_curves(self, should_exclude_faces=False, is_2d=False, ignore_non_loose_edges=False): geom_data = self.settings["geometry"] if isinstance(geom_data, bpy.types.Mesh): @@ -530,7 +532,9 @@ class Usecase: bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.0001) tool.Blender.apply_bmesh(mesh, bm) - def create_curves_from_mesh_ifc2x3(self, should_exclude_faces=False, is_2d=False): + def create_curves_from_mesh_ifc2x3( + self, should_exclude_faces=False, is_2d=False + ) -> list[ifcopenshell.entity_instance]: geom_data = self.settings["geometry"].copy() self.remove_doubles_from_mesh(geom_data) curves = [] @@ -810,7 +814,7 @@ class Usecase: z = self.convert_si_to_unit(z) return self.file.createIfcCartesianPoint((x, y, z)) - def create_cartesian_point_list_from_vertices(self, vertices, is_2d=False): + def create_cartesian_point_list_from_vertices(self, vertices: list[bpy.types.MeshVertex], is_2d=False): if is_2d: return self.file.createIfcCartesianPointList2D([self.convert_si_to_unit(v.co.xy) for v in vertices]) return self.file.createIfcCartesianPointList3D([self.convert_si_to_unit(v.co) for v in vertices]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py index 8b322b71f7..51b622b3f3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py @@ -15,10 +15,18 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional class Usecase: - def __init__(self, file, profile_set=None, material=None, profile=None): + def __init__( + self, + file: ifcopenshell.file, + profile_set: ifcopenshell.entity_instance, + material: Optional[ifcopenshell.entity_instance] = None, + profile: Optional[ifcopenshell.entity_instance] = None, + ): """Add a new profile item to a profile set A profile item in a profile set represents an extruded 2D profile curve @@ -41,10 +49,10 @@ class Usecase: how to add a profile set. :type profile_set: ifcopenshell.entity_instance.entity_instance :param material: The IfcMaterial that the profile item is made out of. - :type material: ifcopenshell.entity_instance.entity_instance + :type material: ifcopenshell.entity_instance.entity_instance, optional :param profile: The IfcProfileDef that represents the 2D cross section of the the profile item. - :type profile: ifcopenshell.entity_instance.entity_instance + :type profile: ifcopenshell.entity_instance.entity_instance, optional :return: The newly created IfcMaterialProfile :rtype: ifcopenshell.entity_instance.entity_instance @@ -84,7 +92,7 @@ class Usecase: self.file = file self.settings = {"profile_set": profile_set, "material": material, "profile": profile} - def execute(self): + def execute(self) -> ifcopenshell.entity_instance: profiles = list(self.settings["profile_set"].MaterialProfiles or []) profile = self.file.create_entity("IfcMaterialProfile") if self.settings["material"]: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py index 01f39410d9..15c13d98f0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py @@ -21,10 +21,11 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.api.owner.settings import ifcopenshell.util.element +from typing import Union class Usecase: - def __init__(self, file, element=None): + def __init__(self, file: ifcopenshell.file, element: ifcopenshell.entity_instance): """Updates the owner that is assigned to an object This ensures that the owner is tracked to have modified the object last, @@ -60,7 +61,7 @@ class Usecase: self.file = file self.settings = {"element": element} - def execute(self): + def execute(self) -> Union[ifcopenshell.entity_instance, None]: if not hasattr(self.settings["element"], "OwnerHistory"): return user = ifcopenshell.api.owner.settings.get_user(self.file) diff --git a/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py b/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py index 58e35cb2c3..9556c38544 100644 --- a/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py +++ b/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py @@ -17,10 +17,11 @@ # along with IfcPatch. If not, see . import ifcopenshell +from logging import Logger class Patcher: - def __init__(self, src, file, logger, only_duplicates=False): + def __init__(self, src: str, file: ifcopenshell.file, logger: Logger, only_duplicates=False): """Regenerate GlobalIds in an IFC model All root elements in an IFC model must be identified by a unique Global From 0ef683013a01fc7900511df3e23c515fdb4a60b7 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 30 Apr 2024 16:53:35 +0500 Subject: [PATCH 059/429] RegenerateGlobalIds - more informative fixing duplicates --- src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py b/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py index 9556c38544..947efbfa1a 100644 --- a/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py +++ b/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py @@ -54,18 +54,27 @@ class Patcher: def patch(self): if self.only_duplicates: + duplicates = 0 + invalid_ids = 0 + guids = set() for element in self.file.by_type("IfcRoot"): if element.GlobalId in guids: element.GlobalId = ifcopenshell.guid.new() + duplicates += 1 elif len(element.GlobalId) != 22 or element.GlobalId[0] not in "0123": element.GlobalId = ifcopenshell.guid.new() + invalid_ids += 1 else: try: ifcopenshell.guid.expand(element.GlobalId) except: element.GlobalId = ifcopenshell.guid.new() + invalid_ids += 1 guids.add(element.GlobalId) + + print("Replaced %s duplicate GlobalIds" % duplicates) + print("Replaced %s invalid GlobalIds" % invalid_ids) else: for element in self.file.by_type("IfcRoot"): element.GlobalId = ifcopenshell.guid.new() From addcf531f08dab5495b90632ae563050a72b9131 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 30 Apr 2024 16:37:43 +0500 Subject: [PATCH 060/429] owner.update_owner_history - optimization as it may be used very often --- .../api/owner/update_owner_history.py | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py index 15c13d98f0..27230372fb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py @@ -62,7 +62,8 @@ class Usecase: self.settings = {"element": element} def execute(self) -> Union[ifcopenshell.entity_instance, None]: - if not hasattr(self.settings["element"], "OwnerHistory"): + element = self.settings["element"] + if not element.is_a("IfcRoot"): return user = ifcopenshell.api.owner.settings.get_user(self.file) if not user: @@ -70,14 +71,24 @@ class Usecase: application = ifcopenshell.api.owner.settings.get_application(self.file) if not application: return - if not self.settings["element"].OwnerHistory: - self.settings["element"].OwnerHistory = ifcopenshell.api.run("owner.create_owner_history", self.file) - return self.settings["element"].OwnerHistory - if self.file.get_total_inverses(self.settings["element"].OwnerHistory) > 1: - new = ifcopenshell.util.element.copy(self.file, self.settings["element"].OwnerHistory) - self.settings["element"].OwnerHistory = new - self.settings["element"].OwnerHistory.ChangeAction = "MODIFIED" - self.settings["element"].OwnerHistory.LastModifiedDate = int(time.time()) - self.settings["element"].OwnerHistory.LastModifyingUser = user - self.settings["element"].OwnerHistory.LastModifyingApplication = application - return self.settings["element"].OwnerHistory + + # 1 IfcRoot IfcOwnerHistory + owner_history = element[1] + if not owner_history: + owner_history = ifcopenshell.api.run("owner.create_owner_history", self.file) + element[1] = owner_history + return owner_history + + if self.file.get_total_inverses(owner_history) > 1: + owner_history = ifcopenshell.util.element.copy(self.file, owner_history) + element[1] = owner_history + + # 3 IfcOwnerHistory ChangeAction + owner_history[3] = "MODIFIED" + # 4 IfcOwnerHistory LastModifiedDate + owner_history[4] = int(time.time()) + # 5 IfcOwnerHistory LastModifyingUser + owner_history[5] = user + # 6 IfcOwnerHistory LastModifyingApplication + owner_history[6] = application + return owner_history From b42f6b182773f56f593e4e2841f9fb2fffd24dc8 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 30 Apr 2024 17:45:37 +0500 Subject: [PATCH 061/429] ifc delete to show time it took if it was more than 10 secs --- src/blenderbim/blenderbim/bim/module/geometry/operator.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index f953c1d743..9dd2b04ea1 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -538,6 +538,8 @@ class OverrideDelete(bpy.types.Operator): row.prop(self, "is_batch", text="Enable Faster Deletion") def _execute(self, context): + start_time = time() + if self.is_batch: ifcopenshell.util.element.batch_remove_deep2(tool.Ifc.get()) @@ -562,6 +564,11 @@ class OverrideDelete(bpy.types.Operator): IfcStore.add_transaction_operation(self) # Required otherwise gizmos are still visible context.view_layer.objects.active = None + + operator_time = time() - start_time + if operator_time > 10: + self.report({"INFO"}, "IFC Delete was finished in {:.2f} seconds".format(operator_time)) + return {"FINISHED"} def rollback(self, data): From 374348bb817278b12a8ee29e5b48019a6b581040 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 30 Apr 2024 18:05:29 +0500 Subject: [PATCH 062/429] IfcImporter small optimization --- src/blenderbim/blenderbim/bim/import_ifc.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index c64b9058d4..93ebe4b4ee 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -299,6 +299,7 @@ class IfcImporter: if self.ifc_import_settings.should_setup_viewport_camera: self.setup_viewport_camera() self.setup_arrays() + self.profile_code("Setup arrays") self.update_progress(100) bpy.context.window_manager.progress_end() @@ -602,6 +603,9 @@ class IfcImporter: return products def predict_dense_mesh(self): + if self.ifc_import_settings.should_use_native_meshes: + return + threshold = 10000 # Just from experience. faces = [len(e.CfsFaces) for e in self.file.by_type("IfcClosedShell")] From 0f548eb93e57e6f69c82d7e0ad0a1db8c4f67f83 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 1 May 2024 14:40:34 +0500 Subject: [PATCH 063/429] Indicate in UI if type material was overridden by occurrence material Example - https://i.imgur.com/T1hidJg.png +small optimization in material_name --- .../blenderbim/bim/module/material/data.py | 21 +++++++++++++++++-- .../blenderbim/bim/module/material/ui.py | 8 ++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/data.py b/src/blenderbim/blenderbim/bim/module/material/data.py index 5e395438c8..69015b1390 100644 --- a/src/blenderbim/blenderbim/bim/module/material/data.py +++ b/src/blenderbim/blenderbim/bim/module/material/data.py @@ -167,6 +167,9 @@ class ObjectMaterialData: cls.data["type_material"] = cls.type_material() cls.data["material_type"] = cls.material_type() cls.data["active_material_constituents"] = cls.active_material_constituents() + # after material_name and type_material + cls.data["is_type_material_overridden"] = cls.is_type_material_overridden() + cls.is_loaded = True @classmethod @@ -295,8 +298,7 @@ class ObjectMaterialData: @classmethod def material_name(cls): - element = tool.Ifc.get_entity(bpy.context.active_object) - material = ifcopenshell.util.element.get_material(element) + material = cls.material if material: return getattr(material, "Name", None) or "Unnamed" @@ -340,3 +342,18 @@ class ObjectMaterialData: if not cls.material or not material.is_a("IfcMaterialConstituentSet"): return [] return [m.Name for m in material.MaterialConstituents if m.Name] + + @classmethod + def is_type_material_overridden(cls) -> bool: + if not cls.data["type_material"]: + return False + + # try to avoid accessing ifc + if cls.data["material_name"] != cls.data["type_material"]: + return True + + # in theory material can be overridden by the same material + # so we check occurrence material explicitly + element = tool.Ifc.get_entity(bpy.context.active_object) + occurrence_material = ifcopenshell.util.element.get_material(element, should_inherit=False) + return bool(occurrence_material) diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index 6273596940..c5ee393d8b 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -177,7 +177,13 @@ class BIM_PT_object_material(Panel): if ObjectMaterialData.data["type_material"]: row = self.layout.row(align=True) - row.label(text="Inherited Material: " + ObjectMaterialData.data["type_material"], icon="CON_CHILDOF") + if ObjectMaterialData.data["is_type_material_overridden"]: + row.label( + text=f"Inherited Material Is Occurrence Overridden", + icon="CON_CHILDOF", + ) + else: + row.label(text="Inherited Material: " + ObjectMaterialData.data["type_material"], icon="CON_CHILDOF") if ObjectMaterialData.data["material_class"]: return self.draw_material_ui() From bef5d3cca514db9d7346e15b15357fa1445606bb Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 1 May 2024 15:18:12 +0500 Subject: [PATCH 064/429] blenderbim - fix bug with unassigning material When you would unassign material (e.g. implicitly by removing the object), it might have also removed materials slots from other occurrences of the same type. Which may had some unexpected sideffects later on - as unassigned styles saving IFC project (BBIM unassigned styles based on a assumption that it was the user decision to remove the materials and related styles). --- .../blenderbim/bim/module/model/product.py | 78 +++++++++++++++---- 1 file changed, 62 insertions(+), 16 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/product.py b/src/blenderbim/blenderbim/bim/module/model/product.py index 5da0e79283..7fb235cd2c 100644 --- a/src/blenderbim/blenderbim/bim/module/model/product.py +++ b/src/blenderbim/blenderbim/bim/module/model/product.py @@ -39,7 +39,7 @@ from mathutils import Vector, Matrix from bpy_extras.object_utils import AddObjectHelper from . import prop import json -from typing import Any +from typing import Any, Union class EnableAddType(bpy.types.Operator, tool.Ifc.Operator): @@ -555,23 +555,69 @@ def ensure_material_unassigned(usecase_path: str, ifc_file: ifcopenshell.file, s elements = settings["products"] if elements[0].is_a("IfcElementType"): elements.extend(ifcopenshell.util.element.get_types(elements[0])) + update_blender_ifc_materials(elements) + + +def update_blender_ifc_materials(elements: list[ifcopenshell.entity_instance]) -> None: + """update mesh blender materials that have ifc material connected to them + by replacing them with `blender_material`""" + # since different elements can share meshes (e.g. occurrecnes without openings) + # we need to make sure not to affect them accidentally + meshes_users: dict[bpy.types.Mesh, set[bpy.types.Object]] = dict() + for obj in bpy.data.objects: + if not obj.data: + continue + meshes_users.setdefault(obj.data, set()).add(obj) + + objects: set[bpy.types.Object] = set() for element in elements: - obj = tool.Ifc.get_object(element) + obj: bpy.types.Object = tool.Ifc.get_object(element) if not obj or not obj.data: continue - element_material = ifcopenshell.util.element.get_material(element) - if element_material: + objects.add(obj) + + meshes: set[bpy.types.Mesh] = {obj.data for obj in objects} + + for mesh in meshes: + mesh_users = meshes_users[mesh] + if not mesh_users.issubset(objects): continue - to_remove = [] - for i, slot in enumerate(obj.material_slots): - if not slot.material: + + # NOTE: we need `obj` as removing materials and appending them to `mesh.materials` + # will mess up mesh faces material indices + + # NOTE: we make an assumption here that all mesh users + # have the same material - they either inherit it from the type + # or type doesn't have a material. + # + # If we add option to UI to add materials overriding type materials + # then this assumption won't be safe anymore + + obj = next(iter(mesh_users)) + element = tool.Ifc.get_entity(obj) + current_material = ifcopenshell.util.element.get_material(element) + if current_material: + current_material = tool.Ifc.get_object(current_material) + + material_replaced = False + + for material_slot in obj.material_slots: + material = material_slot.material + if material is None: continue - material = tool.Ifc.get_entity(slot.material) - if material: - to_remove.append(i) - total_removed = 0 - for i in to_remove: - obj.active_material_index = i - total_removed - with bpy.context.temp_override(object=obj): - bpy.ops.object.material_slot_remove() - total_removed += 1 + ifc_material = tool.Ifc.get_entity(material) + # it's blender material for style, so ignore it + if not ifc_material: + continue + if ifc_material == current_material: + continue + material_slot.material = current_material + material_replaced = True + + if not material_replaced and current_material: + mesh.materials.append(current_material) + + # clear empty slots + for i, material in reversed(list(enumerate(mesh.materials[:]))): + if material is None: + mesh.materials.pop(index=i) From 9f12091c7f61f769449af605e36aa658669ef036 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 1 May 2024 16:07:20 +0500 Subject: [PATCH 065/429] fix bug assigning materials it was clearing all other blender materials - e.g. blender materials associated with representation items styles. Also had the same issue with affecting extra elements as with unassigning materials --- .../blenderbim/bim/module/model/product.py | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/product.py b/src/blenderbim/blenderbim/bim/module/model/product.py index 7fb235cd2c..a862d2b79b 100644 --- a/src/blenderbim/blenderbim/bim/module/model/product.py +++ b/src/blenderbim/blenderbim/bim/module/model/product.py @@ -525,30 +525,7 @@ def ensure_material_assigned(usecase_path: str, ifc_file: ifcopenshell.file, set ]: elements.extend(rel.RelatedObjects) - for element in elements: - obj = IfcStore.get_element(element.GlobalId) - if not obj or not obj.data: - continue - - element_material = ifcopenshell.util.element.get_material(element) - material = [m for m in ifc_file.traverse(element_material) if m.is_a("IfcMaterial")] - - object_material_ids = [ - om.BIMObjectProperties.ifc_definition_id - for om in obj.data.materials - if om is not None and om.BIMObjectProperties.ifc_definition_id - ] - - if material and material[0].id() in object_material_ids: - continue - - if len(obj.data.materials) == 1: - obj.data.materials.clear() - - if not material: - continue - - obj.data.materials.append(IfcStore.get_element(material[0].id())) + update_blender_ifc_materials(elements) def ensure_material_unassigned(usecase_path: str, ifc_file: ifcopenshell.file, settings: dict[str, Any]) -> None: From 45b2411c2bf4cd006f5ba520ce0e35302e2e364b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 1 May 2024 17:38:41 +0500 Subject: [PATCH 066/429] Fix #4598 after 229c7285c --- src/blenderbim/blenderbim/tool/system.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/tool/system.py b/src/blenderbim/blenderbim/tool/system.py index 68a50fb46a..cb0753d60f 100644 --- a/src/blenderbim/blenderbim/tool/system.py +++ b/src/blenderbim/blenderbim/tool/system.py @@ -17,6 +17,7 @@ # along with BlenderBIM Add-on. If not, see . import bpy +import ifcopenshell.util.element import ifcopenshell.util.system import blenderbim.core.tool import blenderbim.tool as tool @@ -145,7 +146,7 @@ class System(blenderbim.core.tool.System): new.ifc_class = system.is_a() @classmethod - def load_ports(cls, element, ports): + def load_ports(cls, element: ifcopenshell.entity_instance, ports: list[ifcopenshell.entity_instance]) -> None: if not ports: return obj = tool.Ifc.get_object(element) @@ -155,7 +156,13 @@ class System(blenderbim.core.tool.System): ifc_importer.calculate_unit_scale() ifc_importer.process_context_filter() ifc_importer.create_generic_elements(set(ports)) + + container = ifcopenshell.util.element.get_container(element) + if container: + collection = tool.Ifc.get_object(container).BIMObjectProperties.collection + ifc_importer.collections[container.GlobalId] = collection ifc_importer.place_objects_in_collections() + for port_obj in ifc_importer.added_data.values(): port_obj.parent = obj port_obj.matrix_parent_inverse = obj.matrix_world.inverted() From 5410f14aa169d121cc9bc74e690f6323b5d8d610 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 1 May 2024 18:03:17 +0500 Subject: [PATCH 067/429] ifc2sql - stringify psets list values #4599 --- src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py b/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py index 1bf7b5b9ea..c1940ef5df 100644 --- a/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py +++ b/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py @@ -450,6 +450,8 @@ class Patcher: for prop_name, value in pset_data.items(): if prop_name == "id": continue + if isinstance(value, list): + value = repr(value) pset_rows.append([element.id(), pset_name, prop_name, value]) if self.should_get_geometry: From 523e51c7756e060161f2fab0aa47422f0ff8e0c0 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 1 May 2024 18:26:53 +0500 Subject: [PATCH 068/429] use json serialization for #4599 changed my mind about 5410f14aa, probably better to use `json.dumps` to keep it consistent with how we serialize other attributes --- src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py b/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py index c1940ef5df..e51baa7345 100644 --- a/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py +++ b/src/ifcpatch/ifcpatch/recipes/Ifc2Sql.py @@ -451,7 +451,7 @@ class Patcher: if prop_name == "id": continue if isinstance(value, list): - value = repr(value) + value = json.dumps(value) pset_rows.append([element.id(), pset_name, prop_name, value]) if self.should_get_geometry: From be262eaef27aa0965b7a342d53430fd0d1477aaa Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 1 May 2024 18:26:18 +0500 Subject: [PATCH 069/429] fix errors linking ifc2x3 projects it was failing with something very verbose: ``` File "\blenderbim\bim\module\project\operator.py", line 1239, in execute db = ifcpatch.execute( ^^^^^^^^^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcpatch\__init__.py", line 80, in execute patcher.patch() File "\blenderbim\libs\site\packages\ifcpatch\recipes\ExtractPropertiesToSQLite.py", line 137, in patch properties.append([i, "IFC Material", f"Layer {idx + 1} Name", item.Name]) ^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcopenshell\entity_instance.py", line 197, in __getattr__ raise AttributeError( AttributeError: entity instance of type 'IFC2X3.IfcMaterialLayer' has no attribute 'Name' Error: Python: Traceback (most recent call last): File "\blenderbim\bim\module\project\operator.py", line 1239, in execute db = ifcpatch.execute( ^^^^^^^^^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcpatch\__init__.py", line 80, in execute patcher.patch() File "\blenderbim\libs\site\packages\ifcpatch\recipes\ExtractPropertiesToSQLite.py", line 137, in patch properties.append([i, "IFC Material", f"Layer {idx + 1} Name", item.Name]) ^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcopenshell\entity_instance.py", line 197, in __getattr__ raise AttributeError( AttributeError: entity inTraceback (most recent call last): File "\Temp\tmpdggt3syt.py", line 9, in run() File "\Temp\tmpdggt3syt.py", line 5, in run bpy.ops.bim.load_linked_project(filepath="/Dormitory-ARC.ifc", false_origin="0,0,0") File "\Blender\4.1\scripts\modules\bpy\ops.py", line 109, in __call__ ret = _op_call(self.idname_py(), kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RuntimeError: Error: Python: Traceback (most recent call last): File "\blenderbim\bim\module\project\operator.py", line 1239, in execute db = ifcpatch.execute( ^^^^^^^^^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcpatch\__init__.py", line 80, in execute patcher.patch() File "\blenderbim\libs\site\packages\ifcpatch\recipes\ExtractPropertiesToSQLite.py", line 137, in patch properties.append([i, "IFC Material", f"Layer {idx + 1} Name", item.Name]) ^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcopenshell\entity_instance.py", line 197, in __getattr__ raise AttributeError( AttributeError: entity instance of type 'IFC2X3.IfcMaterialLayer' has no attribute 'Name' Location: \Blender\4.1\scripts\modules\bpy\ops.py:109 ... truncatedUnregistered Snippets Library BMAX Connector - UnRegistred! An error occurred while processing your IFC. Traceback (most recent call last): File "\blenderbim\bim\module\project\operator.py", line 949, in execute self.link_ifc() File "\blenderbim\bim\module\project\operator.py", line 991, in link_ifc self.link_blend(blend_filepath) File "\blenderbim\bim\module\project\operator.py", line 953, in link_blend with bpy.data.libraries.load(filepath, link=True) as (data_from, data_to): OSError: load: \Dormitory-ARC.ifc.cache.blend failed to open blend file Error: Python: Traceback (most recent call last): File "\blenderbim\bim\module\project\operator.py", line 949, in execute self.link_ifc() File "\blenderbim\bim\module\project\operator.py", line 991, in link_ifc self.link_blend(blend_filepath) File "\blenderbim\bim\module\project\operator.py", line 953, in link_blend with bpy.data.libraries.load(filepath, link=True) as (data_from, data_to): OSError: load: \Dormitory-ARC.ifc.cache.blend failed to open blend file Location: \Blender\4.1\scripts\modules\bpy\ops.py:109 Traceback (most recent call last): File "\blenderbim\bim\module\project\operator.py", line 870, in execute bpy.ops.bim.load_link(filepath=filepath, false_origin=self.false_origin) File "\Blender\4.1\scripts\modules\bpy\ops.py", line 109, in __call__ ret = _op_call(self.idname_py(), kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RuntimeError: Error: Python: Traceback (most recent call last): File "\blenderbim\bim\module\project\operator.py", line 949, in execute self.link_ifc() File "\blenderbim\bim\module\project\operator.py", line 991, in link_ifc self.link_blend(blend_filepath) File "\blenderbim\bim\module\project\operator.py", line 953, in link_blend with bpy.data.libraries.load(filepath, link=True) as (data_from, data_to): OSError: load: \Dormitory-ARC.ifc.cache.blend failed to open blend file Location: \Blender\4.1\scripts\modules\bpy\ops.py:109 ``` --- .../recipes/ExtractPropertiesToSQLite.py | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py b/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py index f4c1761879..3b7f49de9c 100644 --- a/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py +++ b/src/ifcpatch/ifcpatch/recipes/ExtractPropertiesToSQLite.py @@ -23,6 +23,7 @@ import json import time import tempfile import ifcopenshell +import ifcopenshell.util.element try: import sqlite3 @@ -106,14 +107,16 @@ class Patcher: relationships = [] id_map = {e.id(): i for i, e in enumerate(elements)} for i, element in enumerate(elements): - rows.append([ - i, - element[0], - element.is_a(), - ifcopenshell.util.element.get_predefined_type(element), - element[2], - element[3], - ]) + rows.append( + [ + i, + element[0], # IfcRoot.GlobalId + element.is_a(), + ifcopenshell.util.element.get_predefined_type(element), + element[2], # IfcRoot.Name + element[3], # IfcRoot.Description + ] + ) psets = ifcopenshell.util.element.get_psets(element, should_inherit=False) for pset_name, pset_data in psets.items(): for prop_name, value in pset_data.items(): @@ -134,27 +137,30 @@ class Patcher: materials = [] elif material.is_a("IfcMaterialLayerSet"): for idx, item in enumerate(material.MaterialLayers): - properties.append([i, "IFC Material", f"Layer {idx + 1} Name", item.Name]) - properties.append([i, "IFC Material", f"Layer {idx + 1} Material", item.Material.Name]) - if getattr(item.Material, "Category"): - properties.append([i, "IFC Material", f"Layer {idx + 1} Category", item.Material.Category]) + material = item.Material + properties.append([i, "IFC Material", f"Layer {idx + 1} Name", getattr(item, "Name", None)]) + properties.append([i, "IFC Material", f"Layer {idx + 1} Material", material.Name]) + if category := getattr(material, "Category", None): + properties.append([i, "IFC Material", f"Layer {idx + 1} Category", category]) elif material.is_a("IfcMaterialProfileSet"): for idx, item in enumerate(material.MaterialProfiles): + material = item.Material properties.append([i, "IFC Material", f"Profile {idx + 1} Name", item.Name]) - properties.append([i, "IFC Material", f"Profile {idx + 1} Material", item.Material.Name]) - if getattr(item.Material, "Category"): - properties.append([i, "IFC Material", f"Profile {idx + 1} Category", item.Material.Category]) + properties.append([i, "IFC Material", f"Profile {idx + 1} Material", material.Name]) + if category := getattr(material, "Category", None): + properties.append([i, "IFC Material", f"Profile {idx + 1} Category", category]) elif material.is_a("IfcMaterialConstituentSet"): for idx, item in enumerate(material.MaterialConstituents): + material = item.Material properties.append([i, "IFC Material", f"Constituent {idx + 1} Name", item.Name]) - properties.append([i, "IFC Material", f"Constituent {idx + 1} Material", item.Material.Name]) - if getattr(item.Material, "Category"): - properties.append([i, "IFC Material", f"Constituent {idx + 1} Category", item.Material.Category]) + properties.append([i, "IFC Material", f"Constituent {idx + 1} Material", material.Name]) + if category := getattr(material, "Category", None): + properties.append([i, "IFC Material", f"Constituent {idx + 1} Category", category]) elif material.is_a("IfcMaterialList"): for idx, material in enumerate(material.Materials): properties.append([i, "IFC Material", f"Material {idx + 1} Name", material.Name]) - if getattr(material, "Category"): - properties.append([i, "IFC Material", f"Material {idx + 1} Category", material.Category]) + if category := getattr(material, "Category", None): + properties.append([i, "IFC Material", f"Material {idx + 1} Category", category]) layers = ifcopenshell.util.element.get_layers(self.file, element) for idx, layer in enumerate(layers): From c7effa3f2547435a3d8a34c84f8b279d9447dfad Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 2 May 2024 12:13:44 +0500 Subject: [PATCH 070/429] More descriptive errors linking ifc files --- .../blenderbim/bim/module/project/operator.py | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 7449f8bcad..5bc8fab544 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -47,6 +47,7 @@ from mathutils import Vector, Matrix from bpy.app.handlers import persistent from blenderbim.bim.module.project.data import LinksData from blenderbim.bim.module.project.decorator import ProjectDecorator, ClippingPlaneDecorator +from typing import Union class NewProject(bpy.types.Operator): @@ -867,7 +868,16 @@ class LinkIfc(bpy.types.Operator): except: pass # Perhaps on another drive or something new.name = filepath - bpy.ops.bim.load_link(filepath=filepath, false_origin=self.false_origin) + status = bpy.ops.bim.load_link(filepath=filepath, false_origin=self.false_origin) + if status == {"CANCELLED"}: + error_msg = ( + f'Error processing IFC file "{self.filepath}" ' + "was critical and blend file either wasn't saved or wasn't updated. " + "See logs above in system console for details." + ) + print(error_msg) + self.report({"ERROR"}, error_msg) + return {"FINISHED"} print(f"Finished linking {len(files)} IFCs", time.time() - start) return {"FINISHED"} @@ -946,10 +956,12 @@ class LoadLink(bpy.types.Operator): if self.filepath.lower().endswith(".blend"): self.link_blend(filepath) elif self.filepath.lower().endswith(".ifc"): - self.link_ifc() + status = self.link_ifc() + if status: + return status return {"FINISHED"} - def link_blend(self, filepath): + def link_blend(self, filepath: str) -> None: with bpy.data.libraries.load(filepath, link=True) as (data_from, data_to): data_to.scenes = data_from.scenes for scene in bpy.data.scenes: @@ -962,7 +974,7 @@ class LoadLink(bpy.types.Operator): link = bpy.context.scene.BIMProjectProperties.links.get(self.filepath) link.is_loaded = True - def link_ifc(self): + def link_ifc(self) -> Union[set[str], None]: blend_filepath = self.filepath + ".cache.blend" h5_filepath = self.filepath + ".cache.h5" @@ -982,11 +994,14 @@ except Exception as e: exit(1) """ + t = time.time() with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as temp_file: temp_file.write(code) run = subprocess.run([bpy.app.binary_path, "-b", "--python", temp_file.name, "--python-exit-code", "1"]) if run.returncode == 1: print("An error occurred while processing your IFC.") + if not os.path.exists(blend_filepath) or os.stat(blend_filepath).st_mtime < t: + return {"CANCELLED"} self.link_blend(blend_filepath) From 86cc2bf39abd0417bb33a6e4942a007616cb1247 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 2 May 2024 16:48:52 +0500 Subject: [PATCH 071/429] fix bug using "trace outlines" for reprsentation in ifc2x3 Mentioned in #4593 The error message was (it was trying to access curves from the original mesh instead of dummy curve object): ``` Error: Python: Traceback (most recent call last): File "\blenderbim\bim\module\geometry\operator.py", line 46, in execute IfcStore.execute_ifc_operator(self, context) File "\blenderbim\bim\ifc.py", line 349, in execute_ifc_operator result = getattr(operator, "_execute")(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "\blenderbim\bim\module\geometry\operator.py", line 169, in _execute core.add_representation( File "\blenderbim\core\geometry.py", line 52, in add_representation representation = ifc.run( ^^^^^^^^ File "\blenderbim\tool\ifc.py", line 34, in run return ifcopenshell.api.run(command, IfcStore.get_file(), **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcopenshell\api\__init__.py", line 172, in run result = usecase_class(ifc_file, **settings).execute() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcopenshell\api\geometry\add_representation.py", line 73, in execute return self.create_plan_representation() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcopenshell\api\geometry\add_representation.py", line 170, in create_plan_representation return self.create_annotation2d_representation() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcopenshell\api\geometry\add_representation.py", line 833, in create_annotation2d_representation items = [self.file.createIfcGeometricCurveSet(self.create_curves(is_2d=True))] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcopenshell\api\geometry\add_representation.py", line 492, in create_curves curves = self.create_curves_from_curve_ifc2x3(is_2d=is_2d, curve_object_data=dummy.data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "\blenderbim\libs\site\packages\ifcopenshell\api\geometry\add_representation.py", line 575, in create_curves_from_curve_ifc2x3 for spline in self.settings["geometry"].splines: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'Mesh' object has no attribute 'splines' ``` --- .../ifcopenshell/api/geometry/add_representation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index 2bd501cb49..155bfb2bea 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -572,7 +572,7 @@ class Usecase: curve_object_data = self.settings["geometry"] dim = (lambda v: v.xy) if is_2d else (lambda v: v.xyz) results = [] - for spline in self.settings["geometry"].splines: + for spline in curve_object_data.splines: points = spline.bezier_points[:] + spline.points[:] if spline.use_cyclic_u: points.append(points[0]) From 080f325557deddd3eca54c94722c75a78a4e13c6 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Fri, 3 May 2024 00:59:33 -0500 Subject: [PATCH 072/429] extends bim.select_type by selecting multiple types from a selection of objects. Also when the type is selected and turned on, all other types are automatically turned off. https://imgur.com/a/DQUF0ai --- src/blenderbim/blenderbim/bim/import_ifc.py | 6 ++- .../blenderbim/bim/module/model/ui.py | 1 - .../blenderbim/bim/module/type/operator.py | 48 +++++++++++++------ 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 93ebe4b4ee..4e9440ad1c 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -1498,7 +1498,11 @@ class IfcImporter: # Occurs when reloading a project pass project_collection = bpy.context.view_layer.layer_collection.children[self.project["blender"].name] - project_collection.children[self.type_collection.name].hide_viewport = True + types_collection = project_collection.children[self.type_collection.name] + types_collection.hide_viewport = False + for obj in types_collection.collection.objects: #turn off all objects inside Types collection. + obj.hide_set(True) + def clean_mesh(self): obj = None diff --git a/src/blenderbim/blenderbim/bim/module/model/ui.py b/src/blenderbim/blenderbim/bim/module/model/ui.py index 367917a3f0..9a174f11ff 100644 --- a/src/blenderbim/blenderbim/bim/module/model/ui.py +++ b/src/blenderbim/blenderbim/bim/module/model/ui.py @@ -134,7 +134,6 @@ class LaunchTypeManager(bpy.types.Operator): op = row.operator("bim.rename_type", icon="GREASEPENCIL", text="") op.element = relating_type["id"] op = row.operator("bim.select_type", icon="OBJECT_DATA", text="") - op.relating_type = relating_type["id"] op = row.operator("bim.duplicate_type", icon="DUPLICATE", text="") op.element = relating_type["id"] op = row.operator("bim.remove_type", icon="X", text="") diff --git a/src/blenderbim/blenderbim/bim/module/type/operator.py b/src/blenderbim/blenderbim/bim/module/type/operator.py index 899dfe4ec1..66d8682965 100644 --- a/src/blenderbim/blenderbim/bim/module/type/operator.py +++ b/src/blenderbim/blenderbim/bim/module/type/operator.py @@ -146,21 +146,39 @@ class SelectType(bpy.types.Operator): relating_type: bpy.props.IntProperty() def execute(self, context): - element = tool.Ifc.get().by_id(self.relating_type) - obj = tool.Ifc.get_object(element) - if obj: - try: - tool.Blender.select_and_activate_single_object(context, obj) - except: - self.report({"INFO"}, "Type object is hidden.") - # IfcTypeProducts are only used for annotations and not part of the model interface. - if element.is_a() != "IfcTypeProduct": - try: - context.scene.BIMModelProperties.ifc_class = element.is_a() - context.scene.BIMModelProperties.relating_type_id = str(self.relating_type) - except: - # Potentially our BIM Tool is filtered to a specific element. - pass + selected_objs = context.selected_objects + active_obj = context.active_object + selected_objs.append(active_obj) #update selected_objs so the active_obj is at the end of the list + last_relating_type_obj = None + types_collection = bpy.data.collections.get("Types") + for obj in types_collection.objects: + obj.hide_set(True) + for obj in selected_objs: + element = tool.Ifc.get_entity(obj) + relating_type = ifcopenshell.util.element.get_type(element) + relating_type_obj = tool.Ifc.get_object(relating_type) + obj.select_set(False) + if relating_type_obj: + if relating_type_obj.hide_get(): + relating_type_obj.hide_set(False) + relating_type_obj.select_set(True) + last_relating_type_obj = relating_type_obj + + context.view_layer.objects.active = last_relating_type_obj #make the active_obj's type the active object + + # if relating_type_obj: + # try: + # tool.Blender.select_and_activate_single_object(context, relating_type_obj) + # except: + # self.report({"INFO"}, "Type object is hidden.") + # # IfcTypeProducts are only used for annotations and not part of the model interface. + # if element.is_a() != "IfcTypeProduct": + # try: + # context.scene.BIMModelProperties.ifc_class = element.is_a() + # context.scene.BIMModelProperties.relating_type_id = str(relating_type) + # except: + # # Potentially our BIM Tool is filtered to a specific element. + # pass return {"FINISHED"} From 0384de46a4cee39f68b98493a56c67639c891103 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 May 2024 16:21:08 +1000 Subject: [PATCH 073/429] Bump pydantic from 1.10.7 to 1.10.13 in /src/opencdeserver/api/app (#4585) Bumps [pydantic](https://github.com/pydantic/pydantic) from 1.10.7 to 1.10.13. - [Release notes](https://github.com/pydantic/pydantic/releases) - [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md) - [Commits](https://github.com/pydantic/pydantic/compare/v1.10.7...v1.10.13) --- updated-dependencies: - dependency-name: pydantic dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/opencdeserver/api/app/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opencdeserver/api/app/requirements.txt b/src/opencdeserver/api/app/requirements.txt index 6ecccc1cba..5851135638 100644 --- a/src/opencdeserver/api/app/requirements.txt +++ b/src/opencdeserver/api/app/requirements.txt @@ -3,7 +3,7 @@ httpx==0.24.1 jose==1.0.0 jsonpickle==3.0.1 passlib==1.7.4 -pydantic==1.10.7 +pydantic==1.10.13 python_dateutil==2.8.2 python_jose==3.3.0 py2neo==2021.2.4 From 25fff3fdd01dfd167ae84d6b0c86d12653ea0bc6 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 3 May 2024 17:01:54 +1000 Subject: [PATCH 074/429] Consolidate duplicate operators "Convert to Blender file" and "Purge IFC Links" --- .../blenderbim/bim/module/debug/__init__.py | 1 - .../blenderbim/bim/module/debug/operator.py | 29 ++++--------------- .../blenderbim/bim/module/debug/ui.py | 3 -- 3 files changed, 5 insertions(+), 28 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/debug/__init__.py b/src/blenderbim/blenderbim/bim/module/debug/__init__.py index 271950ea61..8790917a4a 100644 --- a/src/blenderbim/blenderbim/bim/module/debug/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/debug/__init__.py @@ -35,7 +35,6 @@ classes = ( operator.PrintUnusedElementStats, operator.ProfileImportIFC, operator.PurgeHdf5Cache, - operator.PurgeIfcLinks, operator.PurgeUnusedElementsByClass, operator.RewindInspector, operator.SelectExpressFile, diff --git a/src/blenderbim/blenderbim/bim/module/debug/operator.py b/src/blenderbim/blenderbim/bim/module/debug/operator.py index c97791b6ca..b6605d9712 100644 --- a/src/blenderbim/blenderbim/bim/module/debug/operator.py +++ b/src/blenderbim/blenderbim/bim/module/debug/operator.py @@ -104,10 +104,11 @@ class PrintIfcFile(bpy.types.Operator): return {"FINISHED"} -class PurgeIfcLinks(bpy.types.Operator): - bl_idname = "bim.purge_ifc_links" - bl_label = "Purge IFC Links" - bl_description = "Purge all definitions and references from the file.\nWarning : Cannot be undone." +class ConvertToBlender(bpy.types.Operator): + bl_idname = "bim.convert_to_blender" + bl_label = "Convert To Blender File" + bl_description = "Removes all IFC data and revert to basic Blender objects.\nWarning : Cannot be undone." + bl_options = {"REGISTER", "UNDO"} def execute(self, context): for obj in bpy.data.objects: @@ -124,26 +125,6 @@ class PurgeIfcLinks(bpy.types.Operator): return {"FINISHED"} -class ConvertToBlender(bpy.types.Operator): - bl_idname = "bim.convert_to_blender" - bl_label = "Convert To Blender File" - bl_description = "Removes all IFC data, and converts the file to a simple Blender file." - bl_options = {"REGISTER", "UNDO"} - - def execute(self, context): - for o in bpy.data.objects: - if o.type in {"MESH", "EMPTY"}: - o.BIMObjectProperties.ifc_definition_id = 0 - if o.data: - o.data.BIMMeshProperties.ifc_definition_id = 0 - for m in bpy.data.materials: - m.BIMMaterialProperties.ifc_style_id = False - bpy.context.scene.BIMProperties.ifc_file = "" - IfcStore.purge() - blenderbim.bim.handler.refresh_ui_data() - return {"FINISHED"} - - class ValidateIfcFile(bpy.types.Operator): bl_idname = "bim.validate_ifc_file" bl_label = "Validate IFC File" diff --git a/src/blenderbim/blenderbim/bim/module/debug/ui.py b/src/blenderbim/blenderbim/bim/module/debug/ui.py index 2fd503cf6f..ec296b47d6 100644 --- a/src/blenderbim/blenderbim/bim/module/debug/ui.py +++ b/src/blenderbim/blenderbim/bim/module/debug/ui.py @@ -60,9 +60,6 @@ class BIM_PT_debug(Panel): row = layout.row() row.operator("bim.purge_hdf5_cache") - row = layout.row() - row.operator("bim.purge_ifc_links") - row = layout.row() row.operator("bim.update_representation", text="Manually Save Representation") From 16b0b1c3a52519f1cd9cb8c4945b905b8fc0a1c0 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 3 May 2024 15:39:37 +0500 Subject: [PATCH 075/429] Fix UI error #4575 --- src/blenderbim/blenderbim/bim/module/geometry/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/data.py b/src/blenderbim/blenderbim/bim/module/geometry/data.py index bbf10b8392..baf9f356ae 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/data.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/data.py @@ -223,7 +223,7 @@ class ConnectionsData: @classmethod def is_connection_realization(cls): element = tool.Ifc.get_entity(bpy.context.active_object) - connections = element.IsConnectionRealization + connections = getattr(element, "IsConnectionRealization", None) if not connections: return From 93f8638a947d81f041e89e63eb47ee8fa2f3ea00 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 3 May 2024 16:00:27 +0500 Subject: [PATCH 076/429] Use active camera drawing id for bim.create_drawing #4581 There was inconsistency between .poll and .execute on what use as active drawing. --- src/blenderbim/blenderbim/bim/module/drawing/operator.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 7da481f1b4..4305ef390f 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -220,11 +220,12 @@ class CreateDrawing(bpy.types.Operator): def execute(self, context): self.props = context.scene.DocProperties + active_drawing_id = context.scene.camera.BIMObjectProperties.ifc_definition_id if self.print_all: - original_drawing_id = self.props.active_drawing_id + original_drawing_id = active_drawing_id drawings_to_print = [d.ifc_definition_id for d in self.props.drawings if d.is_selected and d.is_drawing] else: - drawings_to_print = [self.props.active_drawing_id] + drawings_to_print = [active_drawing_id] for drawing_i, drawing_id in enumerate(drawings_to_print): self.drawing_index = drawing_i From 92426a640ab45268cdd296f546a8c6a066ae1dff Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 3 May 2024 16:23:39 +0500 Subject: [PATCH 077/429] bim.active_model not to unhide all types and drawings elements --- .../blenderbim/bim/module/drawing/operator.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 4305ef390f..41f1c5568d 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -1453,13 +1453,19 @@ class ActivateModel(bpy.types.Operator): CutDecorator.uninstall() + # save current visibility statuses for Views and Types collections + visibility_status: dict[bpy.types.Object, bool] = {} + for col in bpy.data.collections["Views"].children: + for obj in col.objects: + visibility_status[obj] = obj.hide_get() + for obj in bpy.data.collections["Types"].objects: + visibility_status[obj] = obj.hide_get() + if not bpy.app.background: with context.temp_override(**tool.Blender.get_viewport_context()): bpy.ops.object.hide_view_clear() bpy.ops.bim.activate_status_filters() - subcontext = ifcopenshell.util.representation.get_context(tool.Ifc.get(), "Model", "Body", "MODEL_VIEW") - for obj in context.visible_objects: element = tool.Ifc.get_entity(obj) if not element: @@ -1477,6 +1483,11 @@ class ActivateModel(bpy.types.Operator): is_global=True, should_sync_changes_first=True, ) + + # restore visibility after hide_view_clear() + for obj, hide_status in visibility_status.items(): + obj.hide_set(hide_status) + tool.Blender.update_viewport() return {"FINISHED"} From a973b62918361b78798730844278d85dd49a8dc7 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 3 May 2024 14:16:50 +0500 Subject: [PATCH 078/429] small comment fix --- src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py b/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py index dcafff9e88..68da4c0da5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py @@ -212,7 +212,7 @@ class Usecase: objects_without_types.append(object) continue - # either is_nested_by is None or product is part of different rel + # either rel doesn't exist or product is part of different rel if object_rel != types: previous_types_rels.add(object_rel) objects_with_types.append(object) From de690a385c2541be23993a5024bb0e9ce1069a61 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 3 May 2024 14:37:59 +0500 Subject: [PATCH 079/429] project.assign_declaration - support batching #4474 --- .../blenderbim/bim/module/project/operator.py | 2 +- src/blenderbim/scripts/generate_au_library.py | 10 +-- .../scripts/generate_demo_library.py | 8 +- .../scripts/generate_entourage_library.py | 4 +- .../scripts/generate_furniture_library.py | 12 +-- .../scripts/generate_landscape_library.py | 6 +- .../scripts/generate_site_library.py | 4 +- .../generate_steel_profiles_library.py | 4 +- .../scripts/shape_builder_examples.py | 8 +- .../ifcopenshell/api/__init__.py | 3 + .../ifcopenshell/api/project/append_asset.py | 4 +- .../api/project/assign_declaration.py | 80 ++++++++++++------- .../api/project/unassign_declaration.py | 2 +- .../ifcopenshell/api/resource/add_resource.py | 2 +- .../api/sequence/add_work_calendar.py | 2 +- .../api/sequence/add_work_plan.py | 2 +- .../api/sequence/add_work_schedule.py | 2 +- .../api/project/test_assign_declaration.py | 70 ++++++++++++++++ src/ifcopenshell-python/test/api/test_api.py | 27 +++++-- 19 files changed, 182 insertions(+), 70 deletions(-) create mode 100644 src/ifcopenshell-python/test/api/project/test_assign_declaration.py diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 5bc8fab544..68c562c1c0 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -302,7 +302,7 @@ class AssignLibraryDeclaration(bpy.types.Operator): ifcopenshell.api.run( "project.assign_declaration", self.file, - definition=self.file.by_id(self.definition), + definitions=[self.file.by_id(self.definition)], relating_context=self.file.by_type("IfcProjectLibrary")[0], ) element_name = self.props.active_library_element diff --git a/src/blenderbim/scripts/generate_au_library.py b/src/blenderbim/scripts/generate_au_library.py index e75cf739b0..3e20808f75 100644 --- a/src/blenderbim/scripts/generate_au_library.py +++ b/src/blenderbim/scripts/generate_au_library.py @@ -40,7 +40,7 @@ class LibraryGenerator: "root.create_entity", self.file, ifc_class="IfcProjectLibrary", name="Australian Library" ) ifcopenshell.api.run( - "project.assign_declaration", self.file, definition=self.library, relating_context=self.project + "project.assign_declaration", self.file, definitions=[self.library], relating_context=self.project ) unit = ifcopenshell.api.run("unit.add_si_unit", self.file, unit_type="LENGTHUNIT", prefix="MILLI") ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit]) @@ -196,7 +196,7 @@ class LibraryGenerator: ) layer.Name = layer_data[0] layer.LayerThickness = layer_data[2] - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) return element def create_layer_type(self, ifc_class, name, thickness): @@ -205,7 +205,7 @@ class LibraryGenerator: layer_set = rel.RelatingMaterial layer = ifcopenshell.api.run("material.add_layer", self.file, layer_set=layer_set, material=self.materials["TBD"]["ifc"]) layer.LayerThickness = thickness - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) return element def create_profile_type(self, ifc_class, name, profile): @@ -216,7 +216,7 @@ class LibraryGenerator: "material.add_profile", self.file, profile_set=profile_set, material=self.materials["TBD"]["ifc"] ) ifcopenshell.api.run("material.assign_profile", self.file, material_profile=material_profile, profile=profile) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) def create_type(self, ifc_class, name, representations): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class=ifc_class, name=name) @@ -248,7 +248,7 @@ class LibraryGenerator: ifcopenshell.api.run( "geometry.assign_representation", self.file, product=element, representation=representation ) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) LibraryGenerator().generate() diff --git a/src/blenderbim/scripts/generate_demo_library.py b/src/blenderbim/scripts/generate_demo_library.py index 14f97bc52d..15fda40220 100644 --- a/src/blenderbim/scripts/generate_demo_library.py +++ b/src/blenderbim/scripts/generate_demo_library.py @@ -35,7 +35,7 @@ class LibraryGenerator: "root.create_entity", self.file, ifc_class="IfcProjectLibrary", name="BlenderBIM Demo Library" ) ifcopenshell.api.run( - "project.assign_declaration", self.file, definition=self.library, relating_context=self.project + "project.assign_declaration", self.file, definitions=[self.library], relating_context=self.project ) ifcopenshell.api.run("unit.assign_unit", self.file, length={"is_metric": True, "raw": "METERS"}) model = ifcopenshell.api.run("context.add_context", self.file, context_type="Model") @@ -209,7 +209,7 @@ class LibraryGenerator: layer_set = rel.RelatingMaterial layer = ifcopenshell.api.run("material.add_layer", self.file, layer_set=layer_set, material=self.material) layer.LayerThickness = thickness - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) return element def create_profile_type(self, ifc_class, name, profile): @@ -220,7 +220,7 @@ class LibraryGenerator: "material.add_profile", self.file, profile_set=profile_set, material=self.material ) ifcopenshell.api.run("material.assign_profile", self.file, material_profile=material_profile, profile=profile) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) def create_type(self, ifc_class, name, representations): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class=ifc_class, name=name) @@ -252,7 +252,7 @@ class LibraryGenerator: ifcopenshell.api.run( "geometry.assign_representation", self.file, product=element, representation=representation ) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) LibraryGenerator().generate() diff --git a/src/blenderbim/scripts/generate_entourage_library.py b/src/blenderbim/scripts/generate_entourage_library.py index a84c73e4ef..07ddcf7e01 100644 --- a/src/blenderbim/scripts/generate_entourage_library.py +++ b/src/blenderbim/scripts/generate_entourage_library.py @@ -42,7 +42,7 @@ class LibraryGenerator: "root.create_entity", self.file, ifc_class="IfcProjectLibrary", name=library_name ) ifcopenshell.api.run( - "project.assign_declaration", self.file, definition=self.library, relating_context=self.project + "project.assign_declaration", self.file, definitions=[self.library], relating_context=self.project ) unit = ifcopenshell.api.run("unit.add_si_unit", self.file, unit_type="LENGTHUNIT", prefix="MILLI") ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit]) @@ -131,7 +131,7 @@ class LibraryGenerator: ifcopenshell.api.run( "geometry.assign_representation", self.file, product=element, representation=representation ) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) if __name__ == "__main__": diff --git a/src/blenderbim/scripts/generate_furniture_library.py b/src/blenderbim/scripts/generate_furniture_library.py index 6d38170ed0..9a4c12492f 100644 --- a/src/blenderbim/scripts/generate_furniture_library.py +++ b/src/blenderbim/scripts/generate_furniture_library.py @@ -37,7 +37,7 @@ class LibraryGenerator: "root.create_entity", self.file, ifc_class="IfcProjectLibrary", name=library_name ) ifcopenshell.api.run( - "project.assign_declaration", self.file, definition=self.library, relating_context=self.project + "project.assign_declaration", self.file, definitions=[self.library], relating_context=self.project ) unit = ifcopenshell.api.run("unit.add_si_unit", self.file, unit_type="LENGTHUNIT", prefix="MILLI") ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit]) @@ -1797,7 +1797,7 @@ class LibraryGenerator: ifcopenshell.api.run( "geometry.assign_representation", self.file, product=element, representation=representation_2d ) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) return element def create_layer_set_type(self, name, data): @@ -1811,7 +1811,7 @@ class LibraryGenerator: ) layer.Name = layer_data[0] layer.LayerThickness = layer_data[2] - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) return element def create_layer_type(self, ifc_class, name, thickness): @@ -1822,7 +1822,7 @@ class LibraryGenerator: "material.add_layer", self.file, layer_set=layer_set, material=self.materials["TBD"]["ifc"] ) layer.LayerThickness = thickness - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) return element def create_profile_type(self, ifc_class, name, profile): @@ -1837,7 +1837,7 @@ class LibraryGenerator: # material=self.materials["TBD"]["ifc"] ) ifcopenshell.api.run("material.assign_profile", self.file, material_profile=material_profile, profile=profile) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) def create_type(self, ifc_class, name, representations): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class=ifc_class, name=name) @@ -1869,7 +1869,7 @@ class LibraryGenerator: ifcopenshell.api.run( "geometry.assign_representation", self.file, product=element, representation=representation ) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) if __name__ == "__main__": diff --git a/src/blenderbim/scripts/generate_landscape_library.py b/src/blenderbim/scripts/generate_landscape_library.py index be7bff7b69..06cec8c6df 100644 --- a/src/blenderbim/scripts/generate_landscape_library.py +++ b/src/blenderbim/scripts/generate_landscape_library.py @@ -319,7 +319,7 @@ class LibraryGenerator: "root.create_entity", self.file, ifc_class="IfcProjectLibrary", name=library_name ) ifcopenshell.api.run( - "project.assign_declaration", self.file, definition=self.library, relating_context=self.project + "project.assign_declaration", self.file, definitions=[self.library], relating_context=self.project ) unit = ifcopenshell.api.run("unit.add_si_unit", self.file, unit_type="LENGTHUNIT", prefix="MILLI") ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit]) @@ -447,7 +447,7 @@ class LibraryGenerator: ifcopenshell.api.run( "geometry.assign_representation", self.file, product=element, representation=representation_2d ) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) return element def create_type(self, ifc_class, name, representations): @@ -480,7 +480,7 @@ class LibraryGenerator: ifcopenshell.api.run( "geometry.assign_representation", self.file, product=element, representation=representation ) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) diff --git a/src/blenderbim/scripts/generate_site_library.py b/src/blenderbim/scripts/generate_site_library.py index ba07c77dc8..73a9ad96a7 100644 --- a/src/blenderbim/scripts/generate_site_library.py +++ b/src/blenderbim/scripts/generate_site_library.py @@ -35,7 +35,7 @@ class LibraryGenerator: "root.create_entity", self.file, ifc_class="IfcProjectLibrary", name="BlenderBIM Demo Library" ) ifcopenshell.api.run( - "project.assign_declaration", self.file, definition=self.library, relating_context=self.library + "project.assign_declaration", self.file, definitions=[self.library], relating_context=self.library ) ifcopenshell.api.run("unit.assign_unit", self.file, length={"is_metric": True, "raw": "METERS"}) model = ifcopenshell.api.run("context.add_context", self.file, context_type="Model") @@ -98,7 +98,7 @@ class LibraryGenerator: ifcopenshell.api.run( "geometry.assign_representation", self.file, product=element, representation=representation ) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) LibraryGenerator().generate() diff --git a/src/blenderbim/scripts/generate_steel_profiles_library.py b/src/blenderbim/scripts/generate_steel_profiles_library.py index 685435660f..7eeabbd5ce 100644 --- a/src/blenderbim/scripts/generate_steel_profiles_library.py +++ b/src/blenderbim/scripts/generate_steel_profiles_library.py @@ -43,7 +43,7 @@ class LibraryGenerator: "root.create_entity", self.file, ifc_class="IfcProjectLibrary", name=f"{parse_profiles_type} Steel Profiles Library" ) ifcopenshell.api.run( - "project.assign_declaration", self.file, definition=self.library, relating_context=self.project + "project.assign_declaration", self.file, definitions=[self.library], relating_context=self.project ) dim_exponents = self.file.createIfcDimensionalExponents(0, 0, 0, 0, 0, 0, 0) length_unit = ifcopenshell.api.run("unit.add_si_unit", self.file, unit_type="LENGTHUNIT", prefix="MILLI") @@ -182,7 +182,7 @@ class LibraryGenerator: # material=self.materials["TBD"]["ifc"] ) ifcopenshell.api.run("material.assign_profile", self.file, material_profile=material_profile, profile=profile) - ifcopenshell.api.run("project.assign_declaration", self.file, definition=element, relating_context=self.library) + ifcopenshell.api.run("project.assign_declaration", self.file, definitions=[element], relating_context=self.library) def create_double_l_profile(self, profile, resulting_profile_name=None, profiles_gap=0, mode = "LLBB"): def create_derived_profile(profile, mirrored=False): diff --git a/src/blenderbim/scripts/shape_builder_examples.py b/src/blenderbim/scripts/shape_builder_examples.py index f8ba737e74..6561f0badc 100644 --- a/src/blenderbim/scripts/shape_builder_examples.py +++ b/src/blenderbim/scripts/shape_builder_examples.py @@ -91,7 +91,7 @@ def mirror_placement_test(): library = ifcopenshell.api.run( "root.create_entity", ifc_file, ifc_class="IfcProjectLibrary", name=f"Non-structural assets library" ) - ifcopenshell.api.run("project.assign_declaration", ifc_file, definition=library, relating_context=project) + ifcopenshell.api.run("project.assign_declaration", ifc_file, definitions=[library], relating_context=project) unit = ifcopenshell.api.run("unit.add_si_unit", ifc_file, unit_type="LENGTHUNIT", prefix="MILLI") ifcopenshell.api.run("unit.assign_unit", ifc_file, units=[unit]) model = ifcopenshell.api.run("context.add_context", ifc_file, context_type="Model") @@ -152,7 +152,7 @@ def mirror_placement_test(): element = ifcopenshell.api.run("root.create_entity", ifc_file, ifc_class="IfcFurnitureType", name="test") ifcopenshell.api.run("geometry.assign_representation", ifc_file, product=element, representation=representation_3d) - ifcopenshell.api.run("project.assign_declaration", ifc_file, definition=element, relating_context=library) + ifcopenshell.api.run("project.assign_declaration", ifc_file, definitions=[element], relating_context=library) ifc_file.write("tmp.ifc") @@ -165,7 +165,7 @@ def curve_between_two_points_test(): library = ifcopenshell.api.run( "root.create_entity", ifc_file, ifc_class="IfcProjectLibrary", name=f"Non-structural assets library" ) - ifcopenshell.api.run("project.assign_declaration", ifc_file, definition=library, relating_context=project) + ifcopenshell.api.run("project.assign_declaration", ifc_file, definitions=[library], relating_context=project) unit = ifcopenshell.api.run("unit.add_si_unit", ifc_file, unit_type="LENGTHUNIT", prefix="MILLI") ifcopenshell.api.run("unit.assign_unit", ifc_file, units=[unit]) model = ifcopenshell.api.run("context.add_context", ifc_file, context_type="Model") @@ -217,7 +217,7 @@ def curve_between_two_points_test(): print(representation_2d) element = ifcopenshell.api.run("root.create_entity", ifc_file, ifc_class="IfcFurnitureType", name="test") ifcopenshell.api.run("geometry.assign_representation", ifc_file, product=element, representation=representation_2d) - ifcopenshell.api.run("project.assign_declaration", ifc_file, definition=element, relating_context=library) + ifcopenshell.api.run("project.assign_declaration", ifc_file, definitions=[element], relating_context=library) ifc_file.write("tmp.ifc") diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index f5a56279c0..1d21eaf40f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -117,6 +117,9 @@ ARGUMENTS_DEPRECATION = { "constraint.unassign_constraint": partial( batching_argument_deprecation, prev_argument="product", new_argument="products" ), + "project.assign_declaration": partial( + batching_argument_deprecation, prev_argument="definition", new_argument="definitions" + ), } diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py index 4bef25ee75..b3640ca53e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py @@ -61,7 +61,7 @@ class Usecase: root = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject", name="Demo Library") context = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProjectLibrary", name="Demo Library") - ifcopenshell.api.run("project.assign_declaration", library, definition=context, relating_context=root) + ifcopenshell.api.run("project.assign_declaration", library, definitions=[context], relating_context=root) # Assign units for our example library unit = ifcopenshell.api.run("unit.add_si_unit", library, @@ -80,7 +80,7 @@ class Usecase: # Mark our wall type as a reusable asset in our library. ifcopenshell.api.run("project.assign_declaration", library, - definition=wall_type, relating_context=context) + definitions=[wall_type], relating_context=context) # Let's imagine we're starting a new project model = ifcopenshell.api.run("project.create_file") diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py index c11e84be9a..be4d076de0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py @@ -18,11 +18,18 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.util.element +from typing import Union class Usecase: - def __init__(self, file, definition=None, relating_context=None): - """Declares an element to the project + def __init__( + self, + file: ifcopenshell.entity_instance, + definitions: list[ifcopenshell.entity_instance], + relating_context: ifcopenshell.entity_instance, + ): + """Declares the list of elements to the project All data in a model must be directly or indirectly related to the project. Most data is indirectly related, existing instead within the @@ -35,13 +42,14 @@ class Usecase: project libraries for future use (such as an assets library). Assigning a declaration lets you say that an object belongs to a library. - :param definition: The object you want to declare. Typically an asset. - :type definition: ifcopenshell.entity_instance.entity_instance + :param definitions: The list of objects you want to declare. Typically a list of assets. + :type definitions: list[ifcopenshell.entity_instance.entity_instance] :param relating_context: The IfcProject, or more commonly the IfcProjectLibrary that you want the object to be part of. :type relating_context: ifcopenshell.entity_instance.entity_instance - :return: The new IfcRelDeclares relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :return: The new IfcRelDeclares relationship or None if all definitions + were already declared / do not support declaration. + :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] Example: @@ -54,7 +62,7 @@ class Usecase: ifc_class="IfcProjectLibrary", name="Demo Library") # It's necessary to say our library is part of our project. - ifcopenshell.api.run("project.assign_declaration", library, definition=context, relating_context=root) + ifcopenshell.api.run("project.assign_declaration", library, definitions=[context], relating_context=root) # Assign units for our example library unit = ifcopenshell.api.run("unit.add_si_unit", library, @@ -73,45 +81,61 @@ class Usecase: # Mark our wall type as a reusable asset in our library. ifcopenshell.api.run("project.assign_declaration", library, - definition=wall_type, relating_context=context) + definitions=[wall_type], relating_context=context) # All done, just for fun let's save our asset library to disk for later use. library.write("/path/to/my-library.ifc") """ self.file = file self.settings = { - "definition": definition, + "definitions": definitions, "relating_context": relating_context, } - def execute(self): - declares = None - if self.settings["relating_context"].Declares: - declares = self.settings["relating_context"].Declares[0] + def execute(self) -> Union[ifcopenshell.entity_instance, None]: + relating_context = self.settings["relating_context"] + all_declares = relating_context.Declares + definitions = set(self.settings["definitions"]) - if not hasattr(self.settings["definition"], "HasContext"): - return + previous_declares_rels: set[ifcopenshell.entity_instance] = set() + objects_without_contexts: list[ifcopenshell.entity_instance] = [] + objects_with_contexts: list[ifcopenshell.entity_instance] = [] - has_context = None - if self.settings["definition"].HasContext: - has_context = self.settings["definition"].HasContext[0] + # check if there is anything to change + for definition in definitions: + has_context = getattr(definition, "HasContext", None) + if has_context is None: + continue - if has_context and has_context == declares: - return + object_rel = next(iter(has_context), None) + if object_rel is None: + objects_without_contexts.append(definition) + continue - if has_context: - related_definitions = list(has_context.RelatedDefinitions) - related_definitions.remove(self.settings["definition"]) + # either rel doesn't exist or product is part of different rel + if object_rel not in all_declares: + previous_declares_rels.add(object_rel) + objects_with_contexts.append(definition) + + objects_to_change = objects_without_contexts + objects_with_contexts + # nothing to change + if not objects_to_change: + return None + + for has_context in previous_declares_rels: + related_definitions = set(has_context.RelatedDefinitions) - objects_with_contexts if related_definitions: has_context.RelatedDefinitions = related_definitions ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": has_context}) else: + history = has_context.OwnerHistory self.file.remove(has_context) + if history: + ifcopenshell.util.element.remove_deep2(self.file, history) + declares = next(iter(all_declares), None) if declares: - related_definitions = set(declares.RelatedDefinitions) - related_definitions.add(self.settings["definition"]) - declares.RelatedDefinitions = list(related_definitions) + declares.RelatedDefinitions = list(set(declares.RelatedDefinitions) | set(objects_to_change)) ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": declares}) else: declares = self.file.create_entity( @@ -119,8 +143,8 @@ class Usecase: **{ "GlobalId": ifcopenshell.guid.new(), "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedDefinitions": [self.settings["definition"]], - "RelatingContext": self.settings["relating_context"], + "RelatedDefinitions": list(objects_to_change), + "RelatingContext": relating_context, } ) return declares diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py index 25f3bdf64c..7e93f558fc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py @@ -46,7 +46,7 @@ class Usecase: ifc_class="IfcProjectLibrary", name="Demo Library") # It's necessary to say our library is part of our project. - ifcopenshell.api.run("project.assign_declaration", library, definition=context, relating_context=root) + ifcopenshell.api.run("project.assign_declaration", library, definitions=[context], relating_context=root) # Remove the library from our project ifcopenshell.api.run("project.unassign_declaration", library, definition=context, relating_context=root) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py index 9580389ab6..f2c3bf99ee 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py @@ -105,7 +105,7 @@ class Usecase: ifcopenshell.api.run( "project.assign_declaration", self.file, - definition=resource, + definitions=[resource], relating_context=context, ) return resource diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py index 8823c3f215..9df45247c5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py @@ -92,7 +92,7 @@ class Usecase: ifcopenshell.api.run( "project.assign_declaration", self.file, - definition=work_calendar, + definitions=[work_calendar], relating_context=context, ) return work_calendar diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py index 76d2133494..4e907a0ad5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py @@ -84,7 +84,7 @@ class Usecase: ifcopenshell.api.run( "project.assign_declaration", self.file, - definition=work_plan, + definitions=[work_plan], relating_context=context, ) return work_plan diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py index 3da4d3b10e..f50745471f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py @@ -118,7 +118,7 @@ class Usecase: ifcopenshell.api.run( "project.assign_declaration", self.file, - definition=work_schedule, + definitions=[work_schedule], relating_context=context, ) return work_schedule diff --git a/src/ifcopenshell-python/test/api/project/test_assign_declaration.py b/src/ifcopenshell-python/test/api/project/test_assign_declaration.py new file mode 100644 index 0000000000..ea9f7c1fe1 --- /dev/null +++ b/src/ifcopenshell-python/test/api/project/test_assign_declaration.py @@ -0,0 +1,70 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api + + +# NOTE: supported only in IFC4+ +class TestAssignDeclaration(test.bootstrap.IFC4): + def get_declared_definitions(self, project: ifcopenshell.entity_instance) -> set[ifcopenshell.entity_instance]: + definitions = set() + for declares in project.Declares: + definitions.update(declares.RelatedDefinitions) + return definitions + + def test_assign_a_declaration(self): + element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + element_type2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + library = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProjectLibrary") + ifcopenshell.api.run( + "project.assign_declaration", + self.file, + definitions=[element_type, element_type2], + relating_context=library, + ) + assert self.get_declared_definitions(library) == {element_type, element_type2} + assert len(self.file.by_type("IfcRelDeclares")) == 1 + + def test_doing_nothing_if_the_library_is_already_assigned(self): + element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + element_type2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + library = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProjectLibrary") + ifcopenshell.api.run( + "project.assign_declaration", self.file, definitions=[element_type, element_type2], relating_context=library + ) + total_elements = len([e for e in self.file]) + ifcopenshell.api.run( + "project.assign_declaration", self.file, definitions=[element_type, element_type2], relating_context=library + ) + assert len([e for e in self.file]) == total_elements + + def test_that_old_relationships_are_updated_if_they_still_contain_elements(self): + element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + library = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProjectLibrary") + ifcopenshell.api.run( + "project.assign_declaration", self.file, definitions=[element_type], relating_context=library + ) + rel = self.file.by_type("IfcRelDeclares")[0] + + element_type2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + element_type3 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + ifcopenshell.api.run( + "project.assign_declaration", self.file, definitions=[element_type2, element_type3], relating_context=library + ) + assert len(rel.RelatedDefinitions) == 3 diff --git a/src/ifcopenshell-python/test/api/test_api.py b/src/ifcopenshell-python/test/api/test_api.py index 72d20392f3..2f4db8786f 100644 --- a/src/ifcopenshell-python/test/api/test_api.py +++ b/src/ifcopenshell-python/test/api/test_api.py @@ -303,11 +303,26 @@ class TestTemporarySupportForDeprecatedAPIArguments(test.bootstrap.IFC4): def test_unassigning_a_constraint(self): constraint = ifcopenshell.api.run("constraint.add_objective", self.file) element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - ifcopenshell.api.run( - "constraint.assign_constraint", self.file, product=element, constraint=constraint - ) - ifcopenshell.api.run( - "constraint.unassign_constraint", self.file, product=element, constraint=constraint - ) + ifcopenshell.api.run("constraint.assign_constraint", self.file, product=element, constraint=constraint) + ifcopenshell.api.run("constraint.unassign_constraint", self.file, product=element, constraint=constraint) assert ifcopenshell.util.constraint.get_constrained_elements(element) == set() assert len(self.file.by_type("IfcRelAssociatesConstraint")) == 0 + + @deprecation_check + def test_assign_a_declaration(self): + def get_declared_definitions(project: ifcopenshell.entity_instance) -> set[ifcopenshell.entity_instance]: + definitions = set() + for declares in project.Declares: + definitions.update(declares.RelatedDefinitions) + return definitions + + element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + library = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProjectLibrary") + ifcopenshell.api.run( + "project.assign_declaration", + self.file, + definition=element_type, + relating_context=library, + ) + assert get_declared_definitions(library) == {element_type} + assert len(self.file.by_type("IfcRelDeclares")) == 1 From ac29e152bbbdcd71032c64520241a0751de0332e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 3 May 2024 14:58:32 +0500 Subject: [PATCH 080/429] project.unassign_declaration - support batching #4474 --- .../blenderbim/bim/module/project/operator.py | 2 +- .../ifcopenshell/api/__init__.py | 3 + .../api/project/unassign_declaration.py | 44 +++++----- .../api/sequence/assign_workplan.py | 2 +- .../ifcopenshell/api/sequence/remove_task.py | 2 +- .../api/sequence/remove_work_calendar.py | 2 +- .../api/sequence/remove_work_plan.py | 2 +- .../api/sequence/remove_work_schedule.py | 2 +- .../api/project/test_unassign_declaration.py | 82 +++++++++++++++++++ src/ifcopenshell-python/test/api/test_api.py | 22 +++++ 10 files changed, 138 insertions(+), 25 deletions(-) create mode 100644 src/ifcopenshell-python/test/api/project/test_unassign_declaration.py diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 68c562c1c0..11b817c77f 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -338,7 +338,7 @@ class UnassignLibraryDeclaration(bpy.types.Operator): ifcopenshell.api.run( "project.unassign_declaration", self.file, - definition=self.file.by_id(self.definition), + definitions=[self.file.by_id(self.definition)], relating_context=self.file.by_type("IfcProjectLibrary")[0], ) element_name = self.props.active_library_element diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index 1d21eaf40f..4249ed96aa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -120,6 +120,9 @@ ARGUMENTS_DEPRECATION = { "project.assign_declaration": partial( batching_argument_deprecation, prev_argument="definition", new_argument="definitions" ), + "project.unassign_declaration": partial( + batching_argument_deprecation, prev_argument="definition", new_argument="definitions" + ), } diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py index 7e93f558fc..47c5194bdd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py @@ -22,13 +22,19 @@ import ifcopenshell.util.element class Usecase: - def __init__(self, file, definition=None, relating_context=None): - """Unassigns an object to a project or project library + def __init__( + self, + file: ifcopenshell.file, + definitions: list[ifcopenshell.entity_instance], + relating_context: ifcopenshell.entity_instance, + ): + """Unassigns a list of objects from a project or project library Typically used to remove an asset from a project library. - :param definition: The object you want to undeclare. Typically an asset. - :type definition: ifcopenshell.entity_instance.entity_instance + :param definitions: The list of objects you want to undeclare. + Typically a list of assets. + :type definitions: list[ifcopenshell.entity_instance.entity_instance] :param relating_context: The IfcProject, or more commonly the IfcProjectLibrary that you want the object to no longer be part of. :type relating_context: ifcopenshell.entity_instance.entity_instance @@ -49,25 +55,25 @@ class Usecase: ifcopenshell.api.run("project.assign_declaration", library, definitions=[context], relating_context=root) # Remove the library from our project - ifcopenshell.api.run("project.unassign_declaration", library, definition=context, relating_context=root) + ifcopenshell.api.run("project.unassign_declaration", library, definitions=[context], relating_context=root) """ self.file = file self.settings = { - "definition": definition, + "definitions": definitions, "relating_context": relating_context, } def execute(self): - if not self.settings["definition"].HasContext: - return - rel = self.settings["definition"].HasContext[0] - related_definitions = set(rel.RelatedDefinitions) or set() - related_definitions.remove(self.settings["definition"]) - if len(related_definitions): - rel.RelatedDefinitions = list(related_definitions) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + definitions = set(self.settings["definitions"]) + rels = {rel for obj in definitions if (rel := next(iter(obj.HasContext), None))} + + for rel in rels: + related_definitions = set(rel.RelatedDefinitions) - definitions + if related_definitions: + rel.RelatedDefinitions = list(related_definitions) + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) + else: + history = rel.OwnerHistory + self.file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(self.file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py index a9e6f000eb..b3573db5d5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py @@ -57,7 +57,7 @@ class Usecase: ifcopenshell.api.run( "project.unassign_declaration", self.file, - definition=self.settings["work_schedule"], + definitions=[self.settings["work_schedule"]], relating_context=self.file.by_type("IfcContext")[0], ) rel_aggregates = ifcopenshell.api.run( diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py index 4c0ee504f4..870efa1876 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py @@ -62,7 +62,7 @@ class Usecase: ifcopenshell.api.run( "project.unassign_declaration", self.file, - definition=self.settings["task"], + definitions=[self.settings["task"]], relating_context=self.file.by_type("IfcContext")[0], ) if self.settings["task"].TaskTime: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py index a630c3f42e..242165c201 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py @@ -50,7 +50,7 @@ class Usecase: ifcopenshell.api.run( "project.unassign_declaration", self.file, - definition=self.settings["work_calendar"], + definitions=[self.settings["work_calendar"]], relating_context=self.file.by_type("IfcContext")[0], ) if self.settings["work_calendar"].Controls: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py index cb8c638799..905a7b9b8a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py @@ -50,7 +50,7 @@ class Usecase: ifcopenshell.api.run( "project.unassign_declaration", self.file, - definition=self.settings["work_plan"], + definitions=[self.settings["work_plan"]], relating_context=self.file.by_type("IfcContext")[0], ) history = self.settings["work_plan"].OwnerHistory diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py index 935c9f1832..b8bbcd4616 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py @@ -54,7 +54,7 @@ class Usecase: ifcopenshell.api.run( "project.unassign_declaration", self.file, - definition=self.settings["work_schedule"], + definitions=[self.settings["work_schedule"]], relating_context=self.file.by_type("IfcContext")[0], ) if self.settings["work_schedule"].Declares: diff --git a/src/ifcopenshell-python/test/api/project/test_unassign_declaration.py b/src/ifcopenshell-python/test/api/project/test_unassign_declaration.py new file mode 100644 index 0000000000..60dd46f7ad --- /dev/null +++ b/src/ifcopenshell-python/test/api/project/test_unassign_declaration.py @@ -0,0 +1,82 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api +from typing import Union + + +# NOTE: supported only in IFC4+ +class TestUnassignDeclaration(test.bootstrap.IFC4): + def get_context(self, definition: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: + rel = next(iter(definition.HasContext), None) + if rel is not None: + return rel.RelatingContext + + def test_unassigning_a_definition(self): + library = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProjectLibrary") + element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + element_type2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + ifcopenshell.api.run( + "project.assign_declaration", self.file, definitions=[element_type, element_type2], relating_context=library + ) + ifcopenshell.api.run( + "project.unassign_declaration", + self.file, + definitions=[element_type, element_type2], + relating_context=library, + ) + assert self.get_context(element_type) == None + assert len(self.file.by_type("IfcRelDeclares")) == 0 + + def test_doing_nothing_if_there_was_no_declaration(self): + library = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProjectLibrary") + element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + element_type2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + ifcopenshell.api.run( + "project.unassign_declaration", + self.file, + definitions=[element_type, element_type2], + relating_context=library, + ) + assert self.get_context(element_type) == None + assert self.get_context(element_type2) == None + + def test_updating_the_rel_when_a_reference_is_removed_with_multipled_elements(self): + library = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProjectLibrary") + element_type1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + element_type2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + element_type3 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + ifcopenshell.api.run( + "project.assign_declaration", self.file, definitions=[element_type1], relating_context=library + ) + rel = self.file.by_type("IfcRelDeclares")[0] + + ifcopenshell.api.run( + "project.assign_declaration", + self.file, + definitions=[element_type2, element_type3], + relating_context=library, + ) + ifcopenshell.api.run( + "project.unassign_declaration", + self.file, + definitions=[element_type1, element_type2], + relating_context=library, + ) + assert rel.RelatedDefinitions == (element_type3,) diff --git a/src/ifcopenshell-python/test/api/test_api.py b/src/ifcopenshell-python/test/api/test_api.py index 2f4db8786f..00d33b8b8a 100644 --- a/src/ifcopenshell-python/test/api/test_api.py +++ b/src/ifcopenshell-python/test/api/test_api.py @@ -23,6 +23,7 @@ import ifcopenshell.util.constraint import ifcopenshell.util.element import ifcopenshell.util.system from datetime import datetime +from typing import Union def deprecation_check(test): @@ -326,3 +327,24 @@ class TestTemporarySupportForDeprecatedAPIArguments(test.bootstrap.IFC4): ) assert get_declared_definitions(library) == {element_type} assert len(self.file.by_type("IfcRelDeclares")) == 1 + + @deprecation_check + def test_unassigning_a_definition(self): + def get_context(definition: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: + rel = next(iter(definition.HasContext), None) + if rel is not None: + return rel.RelatingContext + + library = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProjectLibrary") + element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") + ifcopenshell.api.run( + "project.assign_declaration", self.file, definitions=[element_type], relating_context=library + ) + ifcopenshell.api.run( + "project.unassign_declaration", + self.file, + definition=element_type, + relating_context=library, + ) + assert get_context(element_type) == None + assert len(self.file.by_type("IfcRelDeclares")) == 0 From b1706f2eac09b3266ff9d8296a17889854d9980a Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 3 May 2024 15:42:56 +0500 Subject: [PATCH 081/429] fix error launching type manager in empty project --- src/blenderbim/blenderbim/bim/module/model/ui.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/ui.py b/src/blenderbim/blenderbim/bim/module/model/ui.py index 9a174f11ff..7d7e8b679f 100644 --- a/src/blenderbim/blenderbim/bim/module/model/ui.py +++ b/src/blenderbim/blenderbim/bim/module/model/ui.py @@ -56,8 +56,11 @@ class LaunchTypeManager(bpy.types.Operator): ifc_class = props.ifc_class or AuthoringData.data["ifc_element_type"] else: ifc_class = AuthoringData.data["ifc_element_type"] - props.type_class = ifc_class - bpy.ops.bim.load_type_thumbnails(ifc_class=ifc_class, offset=0, limit=9) + + # will be None if project has no types + if ifc_class is not None: + props.type_class = ifc_class + bpy.ops.bim.load_type_thumbnails(ifc_class=ifc_class, offset=0, limit=9) return context.window_manager.invoke_popup(self, width=550) def draw(self, context): From a67108e6c193680e4a339a1805132881ab11062b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 3 May 2024 17:36:14 +0500 Subject: [PATCH 082/429] Reload current shading style after editing it #4567 Examples: 1) active shading type = EXTERNAL, now after changing it's SHADING attributes and accepting the changes, it will reload EXTERNAL shading back since it's the one that's active. 2) active shading type = SHADING, after adding EXTERNAL shader will reload SHADING style to the material. --- .../blenderbim/bim/module/style/operator.py | 25 ++++++++++++-- .../blenderbim/bim/module/style/prop.py | 34 ++++++++++++------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index 8133f16a5a..466a8ce3f6 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -23,6 +23,7 @@ import blenderbim.bim.handler import blenderbim.tool as tool import blenderbim.core.style as core import ifcopenshell.util.representation +from blenderbim.bim.module.style.prop import switch_shading from pathlib import Path from mathutils import Vector @@ -126,6 +127,10 @@ class DisableEditingStyle(bpy.types.Operator, tool.Ifc.Operator): tool.Style.reload_material_from_ifc(material) props.is_editing_style = 0 + # restore selected style type + material = tool.Ifc.get_object(style) + material.BIMStyleProperties.active_style_type = material.BIMStyleProperties.active_style_type + class EditStyle(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.edit_style" @@ -332,7 +337,7 @@ class ActivateExternalStyle(bpy.types.Operator, tool.Ifc.Operator): if style_path.suffix != ".blend": self.report( {"ERROR"}, - f"Error loading external style for \"{material.name}\" - only Blender external styles are supported", + f'Error loading external style for "{material.name}" - only Blender external styles are supported', ) return {"CANCELLED"} @@ -587,7 +592,8 @@ class EnableEditingSurfaceStyle(bpy.types.Operator, tool.Ifc.Operator): props.is_editing_class = self.ifc_class tool.Style.set_surface_style_props() - surface_style = tool.Style.get_style_elements(style).get(self.ifc_class, None) + style_elements = tool.Style.get_style_elements(style) + surface_style = style_elements.get(self.ifc_class, None) attributes = tool.Style.get_style_ui_props_attributes(self.ifc_class) # lighting style require special handling since Attribute doesn't support colors @@ -607,6 +613,17 @@ class EnableEditingSurfaceStyle(bpy.types.Operator, tool.Ifc.Operator): attributes.clear() blenderbim.bim.helper.import_attributes2(surface_style or self.ifc_class, attributes, callback) + material = tool.Ifc.get_object(style) + active_style_type = material.BIMStyleProperties.active_style_type + if self.ifc_class == "IfcExternallyDefinedSurfaceStyle" and active_style_type != "External": + if tool.Style.has_blender_external_style(style_elements): + switch_shading(material, "External") + elif ( + self.ifc_class in ("IfcSurfaceStyleShading", "IfcSurfaceStyleRendering", "IfcSurfaceStyleWithTextures") + and active_style_type != "Shading" + ): + switch_shading(material, "Shading") + class EditSurfaceStyle(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.edit_surface_style" @@ -631,6 +648,10 @@ class EditSurfaceStyle(bpy.types.Operator, tool.Ifc.Operator): self.props.is_editing_style = 0 core.load_styles(tool.Style, style_type=self.props.style_type) + # restore selected style type + material = tool.Ifc.get_object(self.style) + material.BIMStyleProperties.active_style_type = material.BIMStyleProperties.active_style_type + def edit_existing_style(self): material = tool.Ifc.get_object(self.style) if self.surface_style.is_a() == "IfcSurfaceStyleShading": diff --git a/src/blenderbim/blenderbim/bim/module/style/prop.py b/src/blenderbim/blenderbim/bim/module/style/prop.py index e195c1472a..af06b57615 100644 --- a/src/blenderbim/blenderbim/bim/module/style/prop.py +++ b/src/blenderbim/blenderbim/bim/module/style/prop.py @@ -33,6 +33,8 @@ from bpy.props import ( ) import gettext +from typing import Literal + _ = gettext.gettext @@ -251,19 +253,15 @@ class BIMStylesProperties(PropertyGroup): ) -def update_shading_style(self, context): - blender_material = self.id_data - style_elements = tool.Style.get_style_elements(blender_material) - if self.active_style_type == "External": - if tool.Style.has_blender_external_style(style_elements): - try: - bpy.ops.bim.activate_external_style(material_name=blender_material.name) - except RuntimeError as error: - if str(error).startswith("Error: Error loading external style for "): - return - raise error - - elif self.active_style_type == "Shading": +def switch_shading(blender_material: bpy.types.Material, style_type: Literal["External", "Shading"]) -> None: + if style_type == "External": + try: + bpy.ops.bim.activate_external_style(material_name=blender_material.name) + except RuntimeError as error: + if str(error).startswith("Error: Error loading external style for "): + return + raise error + elif style_type == "Shading": style_elements = tool.Style.get_style_elements(blender_material) rendering_style = None texture_style = None @@ -279,6 +277,16 @@ def update_shading_style(self, context): if rendering_style and texture_style: tool.Loader.create_surface_style_with_textures(blender_material, rendering_style, texture_style) + + +def update_shading_style(self, context): + blender_material = self.id_data + style_elements = tool.Style.get_style_elements(blender_material) + if self.active_style_type == "External": + if tool.Style.has_blender_external_style(style_elements): + switch_shading(blender_material, self.active_style_type) + elif self.active_style_type == "Shading": + switch_shading(blender_material, self.active_style_type) tool.Style.record_shading(blender_material) From 9e5c3ff6752a05fcf45e3c3ed9e3265110e41224 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 3 May 2024 17:38:04 +0500 Subject: [PATCH 083/429] fix bug appending blender material when style.Location isn't .blend it wasn't considering that .Location could be either None or not a .blend file and was failing in those cases --- src/blenderbim/blenderbim/bim/module/style/operator.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index 466a8ce3f6..600554ae93 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -251,14 +251,15 @@ class BrowseExternalStyle(bpy.types.Operator): ) def invoke(self, context, event): - external_style = None + style_elements = None if self.active_surface_style_id: style = tool.Ifc.get().by_id(self.active_surface_style_id) - external_style = tool.Style.get_style_elements(style).get("IfcExternallyDefinedSurfaceStyle", None) + style_elements = tool.Style.get_style_elements(style) # automatically select previously selected external style in file browser # if it exists in the file - if external_style and self.filepath == "": + if style_elements and self.filepath == "" and tool.Style.has_blender_external_style(style_elements): + external_style = style_elements["IfcExternallyDefinedSurfaceStyle"] style_path = Path(tool.Ifc.resolve_uri(external_style.Location)) self.directory = str(style_path.parent) self.filepath = str(style_path) From 9f2df7fb9d4b0bc77783c24e4c95d9f487021ba6 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 3 May 2024 17:55:30 +0500 Subject: [PATCH 084/429] preview external shading style as material is selected from other .blend file previously it required to save external style attributes to preview the changes, now it's couple clicks saved if you want to preview different blender materials for your styles --- .../blenderbim/bim/module/style/operator.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index 600554ae93..e59e60da74 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -316,6 +316,9 @@ class BrowseExternalStyle(bpy.types.Operator): attributes["Location"].string_value = filepath attributes["Identification"].string_value = f"{self.data_block_type}/{self.data_block}" attributes["Name"].string_value = self.data_block + + style = tool.Ifc.get().by_id(self.active_surface_style_id) + bpy.ops.bim.activate_external_style(material_name=tool.Ifc.get_object(style).name) return {"FINISHED"} @@ -331,9 +334,18 @@ class ActivateExternalStyle(bpy.types.Operator, tool.Ifc.Operator): material = context.active_object.active_material else: material = bpy.data.materials[self.material_name] - external_style = tool.Style.get_style_elements(material)["IfcExternallyDefinedSurfaceStyle"] - data_block_type, data_block = external_style.Identification.split("/") - style_path = Path(tool.Ifc.resolve_uri(external_style.Location)) + + props = context.scene.BIMStylesProperties + if props.is_editing: + location = props.external_style_attributes["Location"].string_value + identification = props.external_style_attributes["Identification"].string_value + else: + external_style = tool.Style.get_style_elements(material)["IfcExternallyDefinedSurfaceStyle"] + location = external_style.Location + identification = external_style.Identification + + data_block_type, data_block = identification.split("/") + style_path = Path(tool.Ifc.resolve_uri(location)) if style_path.suffix != ".blend": self.report( From ab696b980a00fe57fdef753a1084d790e9f2b757 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 5 May 2024 16:26:41 +1000 Subject: [PATCH 085/429] See #2693. Expose static functions of IfcOpenShell API. --- .../ifcopenshell/api/__init__.py | 82 ++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index 4249ed96aa..805811744e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -20,6 +20,7 @@ import json import numpy +import pkgutil import importlib import ifcopenshell import ifcopenshell.api @@ -126,15 +127,26 @@ ARGUMENTS_DEPRECATION = { } -CACHED_USECASE_CLASSES = dict() +CACHED_USECASE_CLASSES = {} +CACHED_USECASES = {} def run( usecase_path: str, ifc_file: Optional[ifcopenshell.file] = None, - should_run_listeners=True, + should_run_listeners: bool = True, **settings: Any, ) -> Any: + usecase_function = CACHED_USECASES.get(usecase_path) + if not usecase_function: + importlib.import_module(f"ifcopenshell.api.{usecase_path}") + module, usecase = usecase_path.split(".") + usecase_function = getattr(getattr(ifcopenshell.api, module), usecase) + CACHED_USECASES[usecase_path] = usecase_function + if ifc_file: + return usecase_function(ifc_file, should_run_listeners=should_run_listeners, **settings) + return usecase_function(should_run_listeners=should_run_listeners, **settings) + if should_run_listeners: for listener in pre_listeners.get(usecase_path, {}).values(): listener(usecase_path, ifc_file, settings) @@ -281,3 +293,69 @@ def extract_docs(module, usecase): node_data["description"] = description.strip() node_data["inputs"] = inputs return node_data + + +def _wrap_api(init_globals, file, package): + """API endpoints are implemented as Usecase classes. This wraps the classes as functions. + + Calling classes is syntactically awkward. For example, + ifcopenshell.api.root.create_entity.Usecase(f).execute(). + It is more elegant to call it using ifcopenshell.api.root.create_entity(f). + + Calling _wrap_api from an API package's __init__.py will generate these + wrapper functions at runtime. + """ + import pkgutil + import importlib + import inspect + from pathlib import Path + + def _create_function(module_name, Usecase): + """Create a function that wraps the Usecase class's execute method.""" + usecase_path = ".".join(Usecase.__module__.split(".")[-2:]) + + def wrapper(*args, should_run_listeners: bool = True, **settings): + ifc_file = args[0] if args else None + if should_run_listeners: + for listener in pre_listeners.get(usecase_path, {}).values(): + listener(usecase_path, ifc_file, settings) + + try: + usecase = Usecase(*args, **settings) + except TypeError as e: + msg = f"Incorrect function arguments provided for {usecase_path}\n{str(e)}. You specified args {args} and settings {settings}\n\nCorrect signature is {inspect.signature(Usecase.__init__)}\nSee help(ifcopenshell.api.{usecase_path}) for documentation." + raise TypeError(msg) from e + + result = usecase.execute() + + if should_run_listeners: + for listener in post_listeners.get(usecase_path, {}).values(): + listener(usecase_path, ifc_file, settings) + + return result + + wrapper.__signature__ = inspect.signature(Usecase.__init__) + wrapper.__doc__ = Usecase.__init__.__doc__ + wrapper.__name__ = module_name + return wrapper + + for finder, name, ispkg in pkgutil.iter_modules([Path(file).parent]): + try: + module = importlib.import_module(f".{name}", package) + except ModuleNotFoundError as e: + print(f"Note: API not available due to missing dependencies: {package}.{name} - {e}") + continue + usecase_cls = getattr(module, "Usecase", None) + if usecase_cls: + func = _create_function(name, usecase_cls) + init_globals[name] = func + + +# Expose all submodules. This means that the user can just type `import ifcopenshell.api`. +for loader, module_name, is_pkg in pkgutil.iter_modules(__path__, __name__ + "."): + module = importlib.import_module(module_name) + + # Check if it's a direct child (only one level deep) + if module_name.count(".") == __name__.count(".") + 1: + # Generate wrapper functions for each usecase + _wrap_api(vars(module), module.__file__, module.__name__) From 5f2d451c5e9e7d5e3da67e18970569cd9f91c9a3 Mon Sep 17 00:00:00 2001 From: ppaawweeuu <61344631+ppaawweeuu@users.noreply.github.com> Date: Sun, 5 May 2024 15:40:32 +0200 Subject: [PATCH 086/429] Update selector_syntax.rst (#4618) info about 'Must contain..' and 'Must not contain..' comparisons added --- .../docs/ifcopenshell-python/selector_syntax.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst index 3ae94c26a8..a21594ace5 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst @@ -116,6 +116,8 @@ the following comparison checks: "``>=``", "Must be greater than or equal to the value." "``<``", "Must be less than the value." "``<=``", "Must be less than or equal to the value." + "``*=``", "Must contain the value." + "``!*=``", "Must not contain the value." When you specify a ``{{pset}}``, ``{{prop}}``, or ``{{value}}``, there are three ways you can do so: From d694d8fcc2da394bfb645456af752950ed806d86 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sun, 5 May 2024 13:16:30 -0500 Subject: [PATCH 087/429] fix #4610: bim.select_type() from type launcher throws error --- .../blenderbim/bim/module/model/ui.py | 1 + .../blenderbim/bim/module/type/operator.py | 49 +++++++++---------- .../blenderbim/bim/module/type/ui.py | 2 +- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/ui.py b/src/blenderbim/blenderbim/bim/module/model/ui.py index 7d7e8b679f..0ad66da688 100644 --- a/src/blenderbim/blenderbim/bim/module/model/ui.py +++ b/src/blenderbim/blenderbim/bim/module/model/ui.py @@ -137,6 +137,7 @@ class LaunchTypeManager(bpy.types.Operator): op = row.operator("bim.rename_type", icon="GREASEPENCIL", text="") op.element = relating_type["id"] op = row.operator("bim.select_type", icon="OBJECT_DATA", text="") + op.relating_type = relating_type["id"] op = row.operator("bim.duplicate_type", icon="DUPLICATE", text="") op.element = relating_type["id"] op = row.operator("bim.remove_type", icon="X", text="") diff --git a/src/blenderbim/blenderbim/bim/module/type/operator.py b/src/blenderbim/blenderbim/bim/module/type/operator.py index 66d8682965..f5f08c35b3 100644 --- a/src/blenderbim/blenderbim/bim/module/type/operator.py +++ b/src/blenderbim/blenderbim/bim/module/type/operator.py @@ -146,39 +146,36 @@ class SelectType(bpy.types.Operator): relating_type: bpy.props.IntProperty() def execute(self, context): - selected_objs = context.selected_objects - active_obj = context.active_object - selected_objs.append(active_obj) #update selected_objs so the active_obj is at the end of the list + + if self.relating_type: #if operator button sends a relating_type, the iterator only selects this one type + element = tool.Ifc.get().by_id(self.relating_type) + obj = tool.Ifc.get_object(element) + selected_objs = [obj] + else: #else, the iterator selects all the types of all the selected objects + selected_objs = context.selected_objects + active_obj = context.active_object + selected_objs.append(active_obj) #update selected_objs so the active_obj is at the end of the list + last_relating_type_obj = None types_collection = bpy.data.collections.get("Types") - for obj in types_collection.objects: - obj.hide_set(True) + context.view_layer.layer_collection.children['IfcProject/My Project'].children["Types"].hide_viewport = False + for type_obj in types_collection.objects: + type_obj.hide_set(True) for obj in selected_objs: element = tool.Ifc.get_entity(obj) relating_type = ifcopenshell.util.element.get_type(element) - relating_type_obj = tool.Ifc.get_object(relating_type) - obj.select_set(False) - if relating_type_obj: - if relating_type_obj.hide_get(): - relating_type_obj.hide_set(False) - relating_type_obj.select_set(True) - last_relating_type_obj = relating_type_obj + if relating_type: + relating_type_obj = tool.Ifc.get_object(relating_type) + if relating_type_obj: + if relating_type_obj.hide_get(): + relating_type_obj.hide_set(False) + relating_type_obj.select_set(True) + last_relating_type_obj = relating_type_obj + if not element.is_a("IfcTypeObject"): + obj.select_set(False) - context.view_layer.objects.active = last_relating_type_obj #make the active_obj's type the active object + context.view_layer.objects.active = last_relating_type_obj #makes the active_obj's type the active object - # if relating_type_obj: - # try: - # tool.Blender.select_and_activate_single_object(context, relating_type_obj) - # except: - # self.report({"INFO"}, "Type object is hidden.") - # # IfcTypeProducts are only used for annotations and not part of the model interface. - # if element.is_a() != "IfcTypeProduct": - # try: - # context.scene.BIMModelProperties.ifc_class = element.is_a() - # context.scene.BIMModelProperties.relating_type_id = str(relating_type) - # except: - # # Potentially our BIM Tool is filtered to a specific element. - # pass return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/type/ui.py b/src/blenderbim/blenderbim/bim/module/type/ui.py index 5fa45c9ca6..6275ae52ef 100644 --- a/src/blenderbim/blenderbim/bim/module/type/ui.py +++ b/src/blenderbim/blenderbim/bim/module/type/ui.py @@ -88,7 +88,7 @@ class BIM_PT_type(Panel): if TypeData.data["relating_type"]: row.label(text=TypeData.data["relating_type"]["name"]) op = row.operator("bim.select_type", icon="OBJECT_DATA", text="") - op.relating_type = TypeData.data["relating_type"]["id"] + op.relating_type = 0 #will only select the relating types of only the selected objects row.operator("bim.select_similar_type", icon="RESTRICT_SELECT_OFF", text="") row.operator("bim.enable_editing_type", icon="GREASEPENCIL", text="") row.operator("bim.unassign_type", icon="X", text="") From a213ab6760eb2d21c5cf98dafce90a5519707312 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 6 May 2024 08:39:41 +1000 Subject: [PATCH 088/429] Fix docstrings to reference datatype as it would be used for users --- .../ifcopenshell/api/aggregate/assign_object.py | 6 +++--- .../ifcopenshell/api/aggregate/unassign_object.py | 2 +- .../ifcopenshell/api/attribute/edit_attributes.py | 2 +- .../api/boundary/assign_connection_geometry.py | 2 +- .../ifcopenshell/api/boundary/copy_boundary.py | 2 +- .../ifcopenshell/api/boundary/edit_attributes.py | 10 +++++----- .../ifcopenshell/api/boundary/remove_boundary.py | 2 +- .../api/classification/add_classification.py | 4 ++-- .../ifcopenshell/api/classification/add_reference.py | 8 ++++---- .../api/classification/edit_classification.py | 2 +- .../ifcopenshell/api/classification/edit_reference.py | 2 +- .../api/classification/remove_classification.py | 2 +- .../api/classification/remove_reference.py | 4 ++-- .../ifcopenshell/api/constraint/add_metric.py | 4 ++-- .../ifcopenshell/api/constraint/add_objective.py | 2 +- .../ifcopenshell/api/constraint/assign_constraint.py | 6 +++--- .../ifcopenshell/api/constraint/edit_metric.py | 2 +- .../ifcopenshell/api/constraint/edit_objective.py | 2 +- .../ifcopenshell/api/constraint/remove_constraint.py | 2 +- .../ifcopenshell/api/constraint/remove_metric.py | 2 +- .../ifcopenshell/api/constraint/unassign_constraint.py | 4 ++-- .../ifcopenshell/api/context/add_context.py | 4 ++-- .../ifcopenshell/api/context/edit_context.py | 2 +- .../ifcopenshell/api/context/remove_context.py | 2 +- .../ifcopenshell/api/control/assign_control.py | 6 +++--- .../ifcopenshell/api/control/unassign_control.py | 6 +++--- .../ifcopenshell/api/cost/add_cost_item.py | 6 +++--- .../ifcopenshell/api/cost/add_cost_item_quantity.py | 4 ++-- .../ifcopenshell/api/cost/add_cost_schedule.py | 2 +- .../ifcopenshell/api/cost/add_cost_value.py | 4 ++-- .../ifcopenshell/api/cost/assign_cost_item_quantity.py | 4 ++-- .../ifcopenshell/api/cost/assign_cost_value.py | 4 ++-- .../ifcopenshell/api/cost/copy_cost_item.py | 4 ++-- .../ifcopenshell/api/cost/copy_cost_item_values.py | 4 ++-- .../ifcopenshell/api/cost/edit_cost_item.py | 2 +- .../ifcopenshell/api/cost/edit_cost_item_quantity.py | 2 +- .../ifcopenshell/api/cost/edit_cost_schedule.py | 2 +- .../ifcopenshell/api/cost/edit_cost_value.py | 2 +- .../ifcopenshell/api/cost/edit_cost_value_formula.py | 2 +- .../ifcopenshell/api/cost/remove_cost_item.py | 2 +- .../ifcopenshell/api/cost/remove_cost_item_quantity.py | 4 ++-- .../ifcopenshell/api/cost/remove_cost_schedule.py | 2 +- .../ifcopenshell/api/cost/remove_cost_value.py | 4 ++-- .../api/cost/unassign_cost_item_quantity.py | 4 ++-- .../ifcopenshell/api/document/add_information.py | 4 ++-- .../ifcopenshell/api/document/add_reference.py | 4 ++-- .../ifcopenshell/api/document/assign_document.py | 6 +++--- .../ifcopenshell/api/document/edit_information.py | 2 +- .../ifcopenshell/api/document/edit_reference.py | 2 +- .../ifcopenshell/api/document/remove_information.py | 2 +- .../ifcopenshell/api/document/remove_reference.py | 2 +- .../ifcopenshell/api/document/unassign_document.py | 4 ++-- .../ifcopenshell/api/drawing/assign_product.py | 6 +++--- .../ifcopenshell/api/drawing/edit_text_literal.py | 2 +- .../ifcopenshell/api/drawing/unassign_product.py | 6 +++--- .../api/geometry/add_axis_representation.py | 4 ++-- .../ifcopenshell/api/grid/create_axis_curve.py | 2 +- .../ifcopenshell/api/grid/create_grid_axis.py | 4 ++-- .../ifcopenshell/api/grid/remove_grid_axis.py | 2 +- .../ifcopenshell/api/group/add_group.py | 2 +- .../ifcopenshell/api/group/assign_group.py | 6 +++--- .../ifcopenshell/api/group/edit_group.py | 2 +- .../ifcopenshell/api/group/remove_group.py | 2 +- .../ifcopenshell/api/group/unassign_group.py | 4 ++-- .../ifcopenshell/api/group/update_group_products.py | 6 +++--- .../ifcopenshell/api/layer/add_layer.py | 2 +- .../ifcopenshell/api/layer/assign_layer.py | 4 ++-- .../ifcopenshell/api/layer/edit_layer.py | 2 +- .../ifcopenshell/api/layer/remove_layer.py | 2 +- .../ifcopenshell/api/layer/unassign_layer.py | 4 ++-- .../ifcopenshell/api/library/add_library.py | 2 +- .../ifcopenshell/api/library/add_reference.py | 4 ++-- .../ifcopenshell/api/library/assign_reference.py | 6 +++--- .../ifcopenshell/api/library/edit_library.py | 2 +- .../ifcopenshell/api/library/edit_reference.py | 2 +- .../ifcopenshell/api/library/remove_library.py | 2 +- .../ifcopenshell/api/library/remove_reference.py | 2 +- .../ifcopenshell/api/library/unassign_reference.py | 4 ++-- .../ifcopenshell/api/material/add_constituent.py | 6 +++--- .../ifcopenshell/api/material/add_layer.py | 6 +++--- .../ifcopenshell/api/material/add_list_item.py | 4 ++-- .../ifcopenshell/api/material/add_material.py | 2 +- .../ifcopenshell/api/material/add_material_set.py | 2 +- .../ifcopenshell/api/material/add_profile.py | 8 ++++---- .../ifcopenshell/api/material/assign_material.py | 8 ++++---- .../ifcopenshell/api/material/assign_profile.py | 4 ++-- .../ifcopenshell/api/material/copy_material.py | 4 ++-- .../api/material/edit_assigned_material.py | 2 +- .../ifcopenshell/api/material/edit_constituent.py | 4 ++-- .../ifcopenshell/api/material/edit_layer.py | 4 ++-- .../ifcopenshell/api/material/edit_layer_usage.py | 2 +- .../ifcopenshell/api/material/edit_profile.py | 6 +++--- .../ifcopenshell/api/material/edit_profile_usage.py | 2 +- .../ifcopenshell/api/material/remove_constituent.py | 2 +- .../ifcopenshell/api/material/remove_layer.py | 2 +- .../ifcopenshell/api/material/remove_list_item.py | 2 +- .../ifcopenshell/api/material/remove_material.py | 2 +- .../ifcopenshell/api/material/remove_material_set.py | 2 +- .../ifcopenshell/api/material/remove_profile.py | 2 +- .../ifcopenshell/api/material/reorder_set_item.py | 2 +- .../ifcopenshell/api/material/unassign_material.py | 2 +- .../ifcopenshell/api/nest/assign_object.py | 6 +++--- .../ifcopenshell/api/nest/unassign_object.py | 2 +- .../ifcopenshell/api/owner/add_actor.py | 4 ++-- .../ifcopenshell/api/owner/add_address.py | 4 ++-- .../ifcopenshell/api/owner/add_application.py | 2 +- .../ifcopenshell/api/owner/add_organisation.py | 2 +- .../ifcopenshell/api/owner/add_person.py | 2 +- .../api/owner/add_person_and_organisation.py | 6 +++--- .../ifcopenshell/api/owner/add_role.py | 4 ++-- .../ifcopenshell/api/owner/assign_actor.py | 6 +++--- .../ifcopenshell/api/owner/create_owner_history.py | 2 +- .../ifcopenshell/api/owner/edit_actor.py | 2 +- .../ifcopenshell/api/owner/edit_address.py | 2 +- .../ifcopenshell/api/owner/edit_organisation.py | 2 +- .../ifcopenshell/api/owner/edit_person.py | 2 +- .../ifcopenshell/api/owner/edit_role.py | 2 +- .../ifcopenshell/api/owner/remove_actor.py | 2 +- .../ifcopenshell/api/owner/remove_address.py | 2 +- .../ifcopenshell/api/owner/remove_application.py | 2 +- .../ifcopenshell/api/owner/remove_organisation.py | 2 +- .../ifcopenshell/api/owner/remove_person.py | 2 +- .../api/owner/remove_person_and_organisation.py | 2 +- .../ifcopenshell/api/owner/remove_role.py | 2 +- .../ifcopenshell/api/owner/settings.py | 8 ++++---- .../ifcopenshell/api/owner/unassign_actor.py | 6 +++--- .../ifcopenshell/api/owner/update_owner_history.py | 4 ++-- .../ifcopenshell/api/profile/add_arbitrary_profile.py | 2 +- .../api/profile/add_arbitrary_profile_with_voids.py | 2 +- .../api/profile/add_parameterized_profile.py | 4 ++-- .../ifcopenshell/api/profile/edit_profile.py | 2 +- .../ifcopenshell/api/profile/remove_profile.py | 2 +- .../ifcopenshell/api/project/append_asset.py | 8 ++++---- .../ifcopenshell/api/project/assign_declaration.py | 6 +++--- .../ifcopenshell/api/project/create_file.py | 2 +- .../ifcopenshell/api/project/unassign_declaration.py | 4 ++-- .../ifcopenshell/api/pset/add_pset.py | 4 ++-- .../ifcopenshell/api/pset/add_qto.py | 4 ++-- .../ifcopenshell/api/pset/edit_pset.py | 4 ++-- .../ifcopenshell/api/pset/edit_qto.py | 4 ++-- .../ifcopenshell/api/pset/remove_pset.py | 4 ++-- .../api/pset_template/add_prop_template.py | 4 ++-- .../api/pset_template/add_pset_template.py | 2 +- .../api/pset_template/edit_prop_template.py | 2 +- .../api/pset_template/edit_pset_template.py | 2 +- .../api/pset_template/remove_prop_template.py | 2 +- .../api/pset_template/remove_pset_template.py | 2 +- .../ifcopenshell/api/resource/add_resource.py | 4 ++-- .../ifcopenshell/api/resource/add_resource_quantity.py | 4 ++-- .../ifcopenshell/api/resource/add_resource_time.py | 4 ++-- .../ifcopenshell/api/resource/assign_resource.py | 6 +++--- .../api/resource/calculate_resource_work.py | 2 +- .../ifcopenshell/api/resource/edit_resource.py | 2 +- .../api/resource/edit_resource_quantity.py | 2 +- .../ifcopenshell/api/resource/edit_resource_time.py | 2 +- .../ifcopenshell/api/resource/unassign_resource.py | 6 +++--- .../ifcopenshell/api/root/copy_class.py | 4 ++-- .../ifcopenshell/api/root/create_entity.py | 2 +- .../ifcopenshell/api/root/reassign_class.py | 4 ++-- .../ifcopenshell/api/root/remove_product.py | 2 +- .../ifcopenshell/api/sequence/add_task.py | 6 +++--- .../ifcopenshell/api/sequence/add_task_time.py | 4 ++-- .../ifcopenshell/api/sequence/add_time_period.py | 4 ++-- .../ifcopenshell/api/sequence/add_work_calendar.py | 2 +- .../ifcopenshell/api/sequence/add_work_plan.py | 2 +- .../ifcopenshell/api/sequence/add_work_schedule.py | 4 ++-- .../ifcopenshell/api/sequence/add_work_time.py | 4 ++-- .../ifcopenshell/api/sequence/assign_lag_time.py | 4 ++-- .../ifcopenshell/api/sequence/assign_process.py | 6 +++--- .../ifcopenshell/api/sequence/assign_product.py | 6 +++--- .../api/sequence/assign_recurrence_pattern.py | 4 ++-- .../ifcopenshell/api/sequence/assign_sequence.py | 6 +++--- .../ifcopenshell/api/sequence/assign_workplan.py | 6 +++--- .../api/sequence/calculate_task_duration.py | 2 +- .../ifcopenshell/api/sequence/cascade_schedule.py | 2 +- .../ifcopenshell/api/sequence/create_baseline.py | 4 ++-- .../ifcopenshell/api/sequence/duplicate_task.py | 4 ++-- .../ifcopenshell/api/sequence/edit_lag_time.py | 2 +- .../api/sequence/edit_recurrence_pattern.py | 2 +- .../ifcopenshell/api/sequence/edit_sequence.py | 2 +- .../ifcopenshell/api/sequence/edit_task.py | 2 +- .../ifcopenshell/api/sequence/edit_task_time.py | 2 +- .../ifcopenshell/api/sequence/edit_work_calendar.py | 2 +- .../ifcopenshell/api/sequence/edit_work_plan.py | 2 +- .../ifcopenshell/api/sequence/edit_work_schedule.py | 2 +- .../ifcopenshell/api/sequence/edit_work_time.py | 2 +- .../ifcopenshell/api/sequence/get_related_products.py | 6 +++--- .../ifcopenshell/api/sequence/recalculate_schedule.py | 2 +- .../ifcopenshell/api/sequence/remove_task.py | 2 +- .../ifcopenshell/api/sequence/remove_time_period.py | 2 +- .../ifcopenshell/api/sequence/remove_work_calendar.py | 2 +- .../ifcopenshell/api/sequence/remove_work_plan.py | 2 +- .../ifcopenshell/api/sequence/remove_work_schedule.py | 2 +- .../ifcopenshell/api/sequence/remove_work_time.py | 2 +- .../ifcopenshell/api/sequence/unassign_lag_time.py | 2 +- .../ifcopenshell/api/sequence/unassign_process.py | 4 ++-- .../ifcopenshell/api/sequence/unassign_product.py | 4 ++-- .../api/sequence/unassign_recurrence_pattern.py | 2 +- .../ifcopenshell/api/sequence/unassign_sequence.py | 4 ++-- .../ifcopenshell/api/spatial/assign_container.py | 4 ++-- .../ifcopenshell/api/spatial/dereference_structure.py | 2 +- .../ifcopenshell/api/spatial/reference_structure.py | 4 ++-- .../ifcopenshell/api/spatial/unassign_container.py | 2 +- .../api/structural/add_structural_activity.py | 6 +++--- .../api/structural/add_structural_analysis_model.py | 2 +- .../structural/add_structural_boundary_condition.py | 4 ++-- .../ifcopenshell/api/structural/add_structural_load.py | 2 +- .../api/structural/add_structural_load_case.py | 2 +- .../api/structural/add_structural_load_group.py | 2 +- .../api/structural/add_structural_member_connection.py | 6 +++--- .../api/structural/assign_structural_analysis_model.py | 6 +++--- .../api/structural/edit_structural_analysis_model.py | 2 +- .../structural/edit_structural_boundary_condition.py | 2 +- .../api/structural/edit_structural_connection_cs.py | 2 +- .../api/structural/edit_structural_item_axis.py | 2 +- .../api/structural/edit_structural_load.py | 2 +- .../api/structural/edit_structural_load_case.py | 2 +- .../api/structural/remove_structural_analysis_model.py | 2 +- .../structural/remove_structural_boundary_condition.py | 4 ++-- .../remove_structural_connection_condition.py | 2 +- .../api/structural/remove_structural_load.py | 2 +- .../api/structural/remove_structural_load_case.py | 2 +- .../api/structural/remove_structural_load_group.py | 2 +- .../structural/unassign_structural_analysis_model.py | 4 ++-- .../ifcopenshell/api/style/add_style.py | 2 +- .../ifcopenshell/api/style/add_surface_style.py | 4 ++-- .../ifcopenshell/api/style/add_surface_textures.py | 4 ++-- .../ifcopenshell/api/style/assign_material_style.py | 6 +++--- .../api/style/assign_representation_styles.py | 6 +++--- .../ifcopenshell/api/style/edit_presentation_style.py | 2 +- .../ifcopenshell/api/style/edit_surface_style.py | 2 +- .../ifcopenshell/api/style/remove_style.py | 2 +- .../api/style/remove_styled_representation.py | 2 +- .../ifcopenshell/api/style/remove_surface_style.py | 2 +- .../ifcopenshell/api/style/unassign_material_style.py | 6 +++--- .../api/style/unassign_representation_styles.py | 4 ++-- .../ifcopenshell/api/system/add_port.py | 4 ++-- .../ifcopenshell/api/system/add_system.py | 2 +- .../ifcopenshell/api/system/assign_flow_control.py | 6 +++--- .../ifcopenshell/api/system/assign_port.py | 6 +++--- .../ifcopenshell/api/system/assign_system.py | 6 +++--- .../ifcopenshell/api/system/connect_port.py | 6 +++--- .../ifcopenshell/api/system/disconnect_port.py | 2 +- .../ifcopenshell/api/system/edit_system.py | 2 +- .../ifcopenshell/api/system/remove_system.py | 2 +- .../ifcopenshell/api/system/unassign_flow_control.py | 6 +++--- .../ifcopenshell/api/system/unassign_port.py | 4 ++-- .../ifcopenshell/api/system/unassign_system.py | 4 ++-- .../ifcopenshell/api/type/assign_type.py | 6 +++--- .../ifcopenshell/api/type/get_related_objects.py | 6 +++--- .../ifcopenshell/api/type/map_type_representations.py | 4 ++-- .../ifcopenshell/api/type/unassign_type.py | 2 +- .../api/unit/add_context_dependent_unit.py | 2 +- .../ifcopenshell/api/unit/add_conversion_based_unit.py | 2 +- .../ifcopenshell/api/unit/add_monetary_unit.py | 2 +- .../ifcopenshell/api/unit/add_si_unit.py | 2 +- .../ifcopenshell/api/unit/assign_unit.py | 4 ++-- .../ifcopenshell/api/unit/edit_derived_unit.py | 2 +- .../ifcopenshell/api/unit/edit_monetary_unit.py | 2 +- .../ifcopenshell/api/unit/edit_named_unit.py | 2 +- .../ifcopenshell/api/unit/remove_unit.py | 2 +- .../ifcopenshell/api/unit/unassign_unit.py | 2 +- .../ifcopenshell/api/void/add_filling.py | 6 +++--- .../ifcopenshell/api/void/add_opening.py | 6 +++--- .../ifcopenshell/api/void/remove_filling.py | 2 +- .../ifcopenshell/api/void/remove_opening.py | 2 +- 266 files changed, 439 insertions(+), 439 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py index 58bf9daa13..3e9f866435 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py @@ -63,13 +63,13 @@ class Usecase: :param products: The list of parts of the aggregate, typically of IfcElement or IfcSpatialStructureElement subclass - :type product: list[ifcopenshell.entity_instance.entity_instance] + :type product: list[ifcopenshell.entity_instance] :param relating_object: The whole of the aggregate, typically an IfcElement or IfcSpatialStructureElement subclass - :type relating_object: ifcopenshell.entity_instance.entity_instance + :type relating_object: ifcopenshell.entity_instance :return: The IfcRelAggregate relationship instance or `None` if `products` was empty list. - :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] + :rtype: Union[ifcopenshell.entity_instance, None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/aggregate/unassign_object.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/unassign_object.py index e4d0e35def..c766a4f019 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/aggregate/unassign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/unassign_object.py @@ -39,7 +39,7 @@ class Usecase: :param products: The list of parts of the aggregate, typically of IfcElements or IfcSpatialStructureElement subclass - :type product: list[ifcopenshell.entity_instance.entity_instance] + :type product: list[ifcopenshell.entity_instance] :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py index 42365ca802..1e2cd98bc5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py +++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py @@ -30,7 +30,7 @@ class Usecase: :param product: The product you want to edit. This may be any rooted IFC entity. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py index 205eba2ce7..8f23a60bb6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py @@ -31,7 +31,7 @@ class Usecase: :param rel_space_boundary: The space boundary relationship to assign the connection geometry to. - :type rel_space_boundary: ifcopenshell.entity_instance.entity_instance + :type rel_space_boundary: ifcopenshell.entity_instance :param outer_boundary: A list of 2D points representing an open polyline. The last point will connect to the first point. Each point is represented by an interable of 2 floats. The coordinates of diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py index af78438421..2f8b092c51 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py @@ -24,7 +24,7 @@ class Usecase: """Copies a space boundary :param boundary: The IfcRelSpaceBoundary you want to copy. - :type boundary: ifcopenshell.entity_instance.entity_instance + :type boundary: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py index a67b3fb2bb..4be540f7a2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py @@ -25,22 +25,22 @@ class Usecase: manual assignment of the space boundary attributes. :param entity: The IfcRelSpaceBoundary to modify - :type entity: ifcopenshell.entity_instance.entity_instance + :type entity: ifcopenshell.entity_instance :param relating_space: The IfcSpace or IfcExternalSpatialElement that the space boundary is related to. - :type relating_space: ifcopenshell.entity_instance.entity_instance + :type relating_space: ifcopenshell.entity_instance :param related_building_element: The IfcElement that defines the boundary, typically an IfcWall. - :type relating_space: ifcopenshell.entity_instance.entity_instance + :type relating_space: ifcopenshell.entity_instance :param parent_boundary: A parent IfcRelSpaceBoundary, only provided if this is an inner boundary. This can apply to 1st and 2nd level boundaries. - :type parent_boundary: ifcopenshell.entity_instance.entity_instance, + :type parent_boundary: ifcopenshell.entity_instance, optional :param corresponding_boundary: The other IfcRelSpaceBoundary on the other side of the related element. The pair together represents a thermal boundary. This only applies to 2nd level boundaries. - :type corresponding_boundary: ifcopenshell.entity_instance.entity_instance, + :type corresponding_boundary: ifcopenshell.entity_instance, optional :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py index 2d77f74f06..6744da820c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py @@ -28,7 +28,7 @@ class Usecase: boundary and its connection geometry is removed. :param boundary: The IfcRelSpaceBoundary you want to remove. - :type boundary: ifcopenshell.entity_instance.entity_instance + :type boundary: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py index d59a4e9343..580c036a5f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py @@ -59,9 +59,9 @@ class Usecase: classification library. The latter approach is preferred if you are using a commonly known system such as Uniclass, as this will ensure all metadata is added correctly. - :type classification: str,ifcopenshell.entity_instance.entity_instance + :type classification: str,ifcopenshell.entity_instance :return: The added IfcClassification element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py index 9057f7a25f..db1bab41bf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py @@ -66,11 +66,11 @@ class Usecase: :param product: The list of IFC objects, properties, or resources you want to associate the classification reference to. - :type product: list[ifcopenshell.entity_instance.entity_instance] + :type product: list[ifcopenshell.entity_instance] :param reference: The classification reference entity taken from an IFC classification library. If you supply this parameter, you will use option 2. - :type reference: ifcopenshell.entity_instance.entity_instance, optional + :type reference: ifcopenshell.entity_instance, optional :param identification: If you choose option 1 and do not specify a reference, you may manually specify an identification code. The code is typically a short identifier and may have punctuation to separate @@ -82,7 +82,7 @@ class Usecase: :param classification: The IfcClassification entity in your IFC model (not the library, if you are doing option 2) that the reference is part of. - :type classification: ifcopenshell.entity_instance.entity_instance + :type classification: ifcopenshell.entity_instance :param is_lightweight: If you are doing option 2, choose whether or not to only add that particular reference (lighweight) or also add all of its parent references in the classification hierarchy (not @@ -98,7 +98,7 @@ class Usecase: :return: The newly added IfcClassificationReference or `None` if `products` was empty list. - :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] + :rtype: Union[ifcopenshell.entity_instance, None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py index bd590ddd38..9925c59f54 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py @@ -25,7 +25,7 @@ class Usecase: IfcClassification, consult the IFC documentation. :param classification: The IfcClassification entity you want to edit - :type classification: ifcopenshell.entity_instance.entity_instance + :type classification: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py index 4b47aebc71..4acf396adb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py @@ -25,7 +25,7 @@ class Usecase: IfcClassificationReference, consult the IFC documentation. :param reference: The IfcClassificationReference entity you want to edit - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py index 2cf46cb091..42a5dcacd0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py @@ -29,7 +29,7 @@ class Usecase: removed from a project. :param classification: The IfcClassification entity you want to remove - :type classification: ifcopenshell.entity_instance.entity_instance + :type classification: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py index d4e8d802a6..ea61fb002d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py @@ -35,10 +35,10 @@ class Usecase: :param reference: The IfcClassificationReference entity of the relationship you want to remove. - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :param product: The list fo object entities of the relationship you want to remove. - :type product: list[ifcopenshell.entity_instance.entity_instance] + :type product: list[ifcopenshell.entity_instance] :raises TypeError: If file is IFC2X3 and `products` has non-IfcRoot elements. diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py index 2941eb8308..b84e2f3cc9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py @@ -29,9 +29,9 @@ class Usecase: to meet the objective of the constraint. :param objective: The IfcObjective that this metric is a benchmark of. - :type objective: ifcopenshell.entity_instance.entity_instance + :type objective: ifcopenshell.entity_instance :return: The newly created IfcMetric entity - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py index 578c7da3de..40fb46dfd2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py @@ -30,7 +30,7 @@ class Usecase: quantities. See ifcopenshell.api.constraint.add_metric for more information. :return: The newly created IfcObjective entity - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py index 759fab9a5e..dfc826faf8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py @@ -40,12 +40,12 @@ class Usecase: :param products: The list of products the constraint applies to. This is anything which can have properties or quantities. - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param constraint: The IfcObjective constraint - :type constraint: ifcopenshell.entity_instance.entity_instance + :type constraint: ifcopenshell.entity_instance :return: The new or updated IfcRelAssociatesConstraint relationship or `None` if `products` was an empty list. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ self.file = file self.settings = { diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py index 3bb6c852ba..72fead7d88 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py @@ -25,7 +25,7 @@ class Usecase: IfcMetric, consult the IFC documentation. :param metric: The IfcMetric you want to edit. - :type metric: ifcopenshell.entity_instance.entity_instance + :type metric: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py index 96ac354702..dff4985539 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py @@ -25,7 +25,7 @@ class Usecase: IfcObjective, consult the IFC documentation. :param objective: The IfcObjective you want to edit. - :type objective: ifcopenshell.entity_instance.entity_instance + :type objective: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py index d2d797ce0f..e7dab1afb0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py @@ -30,7 +30,7 @@ class Usecase: unclear. :param constraint: The IfcObjective you want to remove. - :type constraint: ifcopenshell.entity_instance.entity_instance + :type constraint: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py index 86ab642b7a..6eaf012fa2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py @@ -25,7 +25,7 @@ class Usecase: and objectives. :param metric: The IfcMetric you want to remove. - :type metric: ifcopenshell.entity_instance.entity_instance + :type metric: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py index dbc1e1b7fb..3b6471713e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py @@ -34,9 +34,9 @@ class Usecase: other products. :param products: The list of products the constraint applies to. - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param constraint: The IfcObjective constraint - :type constraint: ifcopenshell.entity_instance.entity_instance + :type constraint: ifcopenshell.entity_instance :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py index e7f96a77d7..02156daf0b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py @@ -102,10 +102,10 @@ class Usecase: :param parent: the parent context. Must be left as None (the default) for contexts, and only set for subcontexts. Note that there are only contexts and subcontexts, a subcontext cannot have any children. - :type parent: ifcopenshell.entity_instance.entity_instance, optional + :type parent: ifcopenshell.entity_instance, optional :return: the newly created IfcGeometricRepresentationContext or IfcGeometricRepresentationSubContext entity - :rtype: ifcopenshell.entity_instance.entity_instance, optional + :rtype: ifcopenshell.entity_instance, optional Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py index 698a8da6ac..50f4612c75 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py @@ -25,7 +25,7 @@ class Usecase: IfcGeometricRepresentationContext, consult the IFC documentation. :param context: The IfcGeometricRepresentationContext entity you want to edit - :type context: ifcopenshell.entity_instance.entity_instance + :type context: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py index edd4f1d723..b0025efbdb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py @@ -27,7 +27,7 @@ class Usecase: removed. If a context is removed, then any subcontexts are also removed. :param context: The IfcGeometricRepresentationContext entity to remove - :type context: ifcopenshell.entity_instance.entity_instance + :type context: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py b/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py index 867089137f..4d1ecb128d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py @@ -37,12 +37,12 @@ class Usecase: :param relating_control: The IfcControl entity that is creating the control or constraint - :type relating_control: ifcopenshell.entity_instance.entity_instance + :type relating_control: ifcopenshell.entity_instance :param related_object: The IfcObjectDefinition that is being controlled - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: The newly created IfcRelAssignsToControl. If relationship already existed before and wasn't changed then returns None. - :rtype: ifcopenshell.entity_instance.entity_instance, None + :rtype: ifcopenshell.entity_instance, None Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py b/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py index 33ee89db4d..72996ad62a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py @@ -27,12 +27,12 @@ class Usecase: :param relating_control: The IfcControl entity that is creating the control or constraint - :type relating_control: ifcopenshell.entity_instance.entity_instance + :type relating_control: ifcopenshell.entity_instance :param related_object: The IfcObjectDefinition that is being controlled - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: If the control still is related to other objects, the IfcRelAssignsToControl is returned, otherwise None. - :rtype: ifcopenshell.entity_instance.entity_instance, None + :rtype: ifcopenshell.entity_instance, None Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py index 0674d1def4..26a0bba442 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py @@ -29,13 +29,13 @@ class Usecase: :param cost_schedule: If the cost item is to be added as a root or top level cost item to a cost schedule, the IfcCostSchedule may be specified. This is mutually exlclusive to the cost_item parameter. - :type cost_schedule: ifcopenshell.entity_instance.entity_instance + :type cost_schedule: ifcopenshell.entity_instance :param cost_item: If the cost item is to be added as a subitem to an existing cost item, the parent IfcCostItem may be specified. This is mutually exclusive to the cost_schedule parameter. - :type cost_item: ifcopenshell.entity_instance.entity_instance + :type cost_item: ifcopenshell.entity_instance :return: The newly created IfcCostItem - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py index 3402c1828e..fabe443460 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py @@ -50,12 +50,12 @@ class Usecase: using another API call. :param cost_item: The IfcCostItem to add the quantity to - :type cost_item: ifcopenshell.entity_instance.entity_instance + :type cost_item: ifcopenshell.entity_instance :param ifc_class: The type of quantity to add :type ifc_class: str, optional :return: The newly created quantity entity, chosen from the ifc_class parameter - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py index 1d9882ff45..fa97a893f3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py @@ -43,7 +43,7 @@ class Usecase: IfcCostScheduleTypeEnum :type predefined_type: str, optional :return: The newly created IfcCostSchedule entity - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py index edc84d7fc3..e7a481e8b2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py @@ -46,9 +46,9 @@ class Usecase: :param parent: A parent IfcCostItem, if specifying a price directly to a cost item, or a top-level price component. Alternatively, this can be set to a IfcCostValue, if specifying price subcomponents. - :type parent: ifcopenshell.entity_instance.entity_instance + :type parent: ifcopenshell.entity_instance :return: The newly created IfcCostValue - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py index b09e7f07fa..d4c6b6be69 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py @@ -40,9 +40,9 @@ class Usecase: ifcopenshell.api.control.assign_control. :param cost_item: The IfcCostItem to assign parametric quantities to - :type cost_item: ifcopenshell.entity_instance.entity_instance + :type cost_item: ifcopenshell.entity_instance :param products: The IfcObjects to assign parametric quantities to - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param prop_name: The name of the quantity. If this is not specified, then it is assumed that there is no calculated quantity, and the number of objects are counted instead. diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py index fd814b4dd5..fb89fe7432 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py @@ -35,9 +35,9 @@ class Usecase: rates as a "template" to quickly populate your rates from. :param cost_item: The IfcCostItem that you want to copy the values to - :type cost_item: ifcopenshell.entity_instance.entity_instance + :type cost_item: ifcopenshell.entity_instance :param cost_rate: The IfcCostItem that you want to copy the values from - :type cost_rate: ifcopenshell.entity_instance.entity_instance + :type cost_rate: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py index 2127bde2a6..ec2d147731 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py @@ -32,9 +32,9 @@ class Usecase: * The copy will have duplicated nested cost items :param cost_item: The cost item to be duplicated - :type cost_item: ifcopenshell.entity_instance.entity_instance + :type cost_item: ifcopenshell.entity_instance :return: The duplicated cost item or the list of duplicated cost items if the latter has children - :rtype: ifcopenshell.entity_instance.entity_instance or list of ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance or list of ifcopenshell.entity_instance Example: .. code:: python diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py index a931b52c52..6bc0677b28 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py @@ -29,9 +29,9 @@ class Usecase: parametrically linked, so if one value changes, the other will not. :param source: The IfcCostItem to copy cost values from - :type source: ifcopenshell.entity_instance.entity_instance + :type source: ifcopenshell.entity_instance :param destination: The IfcCostItem to copy cost values from - :type destination: ifcopenshell.entity_instance.entity_instance + :type destination: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py index 3b570ef388..cc0a187177 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py @@ -25,7 +25,7 @@ class Usecase: IfcCostItem, consult the IFC documentation. :param cost_item: The IfcCostItem entity you want to edit - :type cost_item: ifcopenshell.entity_instance.entity_instance + :type cost_item: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py index 2684d1e394..3ba4e9f498 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py @@ -25,7 +25,7 @@ class Usecase: IfcPhysicalQuantity, consult the IFC documentation. :param physical_quantity: The IfcPhysicalQuantity entity you want to edit - :type physical_quantity: ifcopenshell.entity_instance.entity_instance + :type physical_quantity: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py index ab38f62d8e..bdfb856cc1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py @@ -25,7 +25,7 @@ class Usecase: IfcCostSchedule, consult the IFC documentation. :param cost_schedule: The IfcCostSchedule entity you want to edit - :type cost_schedule: ifcopenshell.entity_instance.entity_instance + :type cost_schedule: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py index 818cd4a84b..75ce055eb1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py @@ -29,7 +29,7 @@ class Usecase: IfcCostValue, consult the IFC documentation. :param cost_value: The IfcCostValue entity you want to edit - :type cost_value: ifcopenshell.entity_instance.entity_instance + :type cost_value: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py index ede08a966d..8dada5dc98 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py @@ -33,7 +33,7 @@ class Usecase: For more information, see ifcopenshell.util.cost :param cost_value: The IfcCostValue to set the values of - :type cost_value: ifcopenshell.entity_instance.entity_instance + :type cost_value: ifcopenshell.entity_instance :param formula: The formula following the language of ifcopenshell.util.cost :type formula: str :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py index 06d1f2ef26..5596ceff13 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py @@ -30,7 +30,7 @@ class Usecase: retained. :param cost_item: The IfcCostItem entity you want to remove - :type cost_item: ifcopenshell.entity_instance.entity_instance + :type cost_item: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py index bf562c46e7..fae8e1cd37 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py @@ -26,9 +26,9 @@ class Usecase: removed. :param cost_item: The IfcCostItem that the quantity is assigned to - :type cost_item: ifcopenshell.entity_instance.entity_instance + :type cost_item: ifcopenshell.entity_instance :param physical_quantity: The IfcPhysicalQuantity to remove - :type physical_quantity: ifcopenshell.entity_instance.entity_instance + :type physical_quantity: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py index 79438a5461..51feebb76e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py @@ -29,7 +29,7 @@ class Usecase: including all cost items. :param cost_schedule: The IfcCostSchedule entity you want to remove - :type cost_schedule: ifcopenshell.entity_instance.entity_instance + :type cost_schedule: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py index 6c4a346f02..4af7322899 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py @@ -26,9 +26,9 @@ class Usecase: :param parent: The IfcCostItem, IfcConstructionResource, or IfcCostValue that the IfcCostValue is assigned to. - :type parent: ifcopenshell.entity_instance.entity_instance + :type parent: ifcopenshell.entity_instance :param cost_value: The IfcCostValue that you want to remove - :type parent: ifcopenshell.entity_instance.entity_instance + :type parent: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py index 967cec4162..091029f594 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py @@ -29,10 +29,10 @@ class Usecase: have any impact on the cost item. :param cost_item: The IfcCostItem to remove quantities from - :type cost_item: ifcopenshell.entity_instance.entity_instance + :type cost_item: ifcopenshell.entity_instance :param products: A list of IfcProducts that may have parametrically connected quantities to the cost item - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py index 7106fe7f7b..68c9c53759 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py @@ -33,9 +33,9 @@ class Usecase: is considered the latest version and the children are older revisions. :param parent: The parent document, if necessary. - :type parent: ifcopenshell.entity_instance.entity_instance, optional + :type parent: ifcopenshell.entity_instance, optional :return: The newly created IfcDocumentInformation entity - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py index bcec5da606..80cf91d8a1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py @@ -39,9 +39,9 @@ class Usecase: :param information: The IfcDocumentInformation that the reference will be created for - :type information: ifcopenshell.entity_instance.entity_instance + :type information: ifcopenshell.entity_instance :return: The newly created IfcDocumentReference entity - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py b/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py index f67cbe890a..f9b433213a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py @@ -42,15 +42,15 @@ class Usecase: :param product: The list of objects to associate the document to. This could be almost any sensible object in IFC. - :type product: list[ifcopenshell.entity_instance.entity_instance] + :type product: list[ifcopenshell.entity_instance] :param document: The IfcDocumentReference to associate to, or alternatively an IfcDocumentInformation, though this is not recommended. - :type document: ifcopenshell.entity_instance.entity_instance + :type document: ifcopenshell.entity_instance :return: The IfcRelAssociatesDocument relationship or `None` if `products` was an empty list or all products were already assigned to the `document`. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py index 1d7af0c1b8..96c0120120 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py @@ -32,7 +32,7 @@ class Usecase: IfcDocumentInformation, consult the IFC documentation. :param reference: The IfcDocumentInformation entity you want to edit - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py index 538c8d2854..d88afdfc2f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py @@ -32,7 +32,7 @@ class Usecase: IfcDocumentReference, consult the IFC documentation. :param reference: The IfcDocumentReference entity you want to edit - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py index bf26837822..56f57df283 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py @@ -29,7 +29,7 @@ class Usecase: All references and associations are also removed. :param information: The IfcDocumentInformation to remove - :type information: ifcopenshell.entity_instance.entity_instance + :type information: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py index 6eee90fb4d..61fd6810c1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py @@ -27,7 +27,7 @@ class Usecase: All associations with objects are removed. :param reference: The IfcDocumentReference to remove - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py b/src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py index dd43573e65..c4728d5511 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py @@ -32,10 +32,10 @@ class Usecase: :param product: The list of objects that the document reference or information is related to. - :type product: list[ifcopenshell.entity_instance.entity_instance] + :type product: list[ifcopenshell.entity_instance] :param document: The IfcDocumentReference (typically) or in rare cases the IfcDocumentInformation that is associated with the product - :type document: ifcopenshell.entity_instance.entity_instance + :type document: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py index 11da9c0ee0..051dd985b3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py @@ -42,12 +42,12 @@ class Usecase: in 3D. :param relating_product: The IfcProduct the object is related to - :type relating_product: ifcopenshell.entity_instance.entity_instance + :type relating_product: ifcopenshell.entity_instance :param related_object: The object (typically IfcAnnotation) that the product is related to - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: The created IfcRelAssignsToProduct relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py index c8be879f7f..00b8bc4f82 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py @@ -25,7 +25,7 @@ class Usecase: IfcTextLiteral, consult the IFC documentation. :param reference: The IfcTextLiteral entity you want to edit - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py index 8b0e514935..91ee7ded3d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py @@ -31,12 +31,12 @@ class Usecase: object later or leave the annotation as a "dumb" annotation. :param relating_product: The IfcProduct the object is related to - :type relating_product: ifcopenshell.entity_instance.entity_instance + :type relating_product: ifcopenshell.entity_instance :param related_object: The object (typically IfcAnnotation) that the product is related to - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: The created IfcRelAssignsToProduct relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py index 9ed90b6fb7..8a09531a26 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py @@ -52,13 +52,13 @@ class Usecase: :param context: The IfcGeometricRepresentationContext that the representation is part of. This must be either a Model/Axis/GRAPH_VIEW (3D) or Plan/Axis/GRAPH_VIEW (2D). - :type context: ifcopenshell.entity_instance.entity_instance + :type context: ifcopenshell.entity_instance :param axis: The axis, as a list of two coordinates, the coordinates being either a list of 2 or 3 float coordinates depending on whether the axis is 2D or 3D. :type axis: list[list[float]] :return: The newly created IfcShapeRepresentation entity - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py b/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py index a09e7b2bd2..21fead74e5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py @@ -35,7 +35,7 @@ class Usecase: single edge. :type axis_curve: bpy.types.Object :param grid_axis: The IfcGridAxis element to add geometry to. - :type grid_axis: ifcopenshell.entity_instance.entity_instance + :type grid_axis: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py b/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py index e794cbdc86..de667bb5bc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py @@ -54,9 +54,9 @@ class Usecase: Defaults to "UAxes". :type uvw_axes: str, optional :param grid: The IfcGrid you are adding the axis to. - :type grid: ifcopenshell.entity_instance.entity_instance + :type grid: ifcopenshell.entity_instance :return: The newly created IfcGridAxis - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py b/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py index d14ee8cf0b..b380778a67 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py @@ -24,7 +24,7 @@ class Usecase: """Removes a grid axis from a grid :param axis: The IfcGridAxis you want to remove. - :type axis: ifcopenshell.entity_instance.entity_instance + :type axis: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py index fa2877eac5..298ec42ba6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py @@ -37,7 +37,7 @@ class Usecase: :param Description: The description of the purpose of the group. :type Description: str, optional :return: The newly created IfcGroup - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py index 78d787f741..d312a95bd6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py @@ -31,12 +31,12 @@ class Usecase: twice. :param products: A list of IfcProduct elements to assign to the group - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param group: The IfcGroup to assign the products to - :type group: ifcopenshell.entity_instance.entity_instance + :type group: ifcopenshell.entity_instance :return: The IfcRelAssignsToGroup relationship or `None` if `products` was empty list. - :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] + :rtype: Union[ifcopenshell.entity_instance, None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py index 442b9d84f6..87fa9dcf12 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py @@ -25,7 +25,7 @@ class Usecase: IfcGroup, consult the IFC documentation. :param group: The IfcGroup entity you want to edit - :type group: ifcopenshell.entity_instance.entity_instance + :type group: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py index 0ade115de1..c87b36e316 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py @@ -29,7 +29,7 @@ class Usecase: the group will be removed. :param group: The IfcGroup entity you want to remove - :type group: ifcopenshell.entity_instance.entity_instance + :type group: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py index 57d8d88556..9229281a69 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py @@ -28,9 +28,9 @@ class Usecase: If the product isn't assigned to the group, nothing will happen. :param products: A list of IfcProduct elements to unassign from the group - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param group: The IfcGroup to unassign from - :type group: ifcopenshell.entity_instance.entity_instance + :type group: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py index a752057f84..61b96c2ba6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py @@ -28,11 +28,11 @@ class Usecase: removed. :param products: A list of IfcProduct elements to assign to the group - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param group: The IfcGroup to assign the products to - :type group: ifcopenshell.entity_instance.entity_instance + :type group: ifcopenshell.entity_instance :return: The IfcRelAssignsToGroup relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py index 848dc423ce..8638a76b22 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py @@ -36,7 +36,7 @@ class Usecase: :param Name: The name of the layer. Defaults to "Unnamed". :type Name: str, optional :return: The newly created IfcPresentationLayerAssignment element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py index 21a4ceb2bf..93a863d66f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py @@ -34,10 +34,10 @@ class Usecase: :param items: The list of IfcRepresentationItems to assign to the layer. This should be the items from the object's IfcShapeRepresentation. - :type items: list[ifcopenshell.entity_instance.entity_instance] + :type items: list[ifcopenshell.entity_instance] :param layer: The IfcPresentationLayerAssignment layer to assign the item to. - :type layer: ifcopenshell.entity_instance.entity_instance + :type layer: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py index 4ac74d4014..c2b1cbc99a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py @@ -25,7 +25,7 @@ class Usecase: IfcPresentationLayerAssignment, consult the IFC documentation. :param layer: The IfcPresentationLayerAssignment entity you want to edit - :type layer: ifcopenshell.entity_instance.entity_instance + :type layer: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py index 2834d8f8ef..8e83e475ab 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py @@ -25,7 +25,7 @@ class Usecase: relationship to the layer will be removed. :param layer: The IfcPresentationLayerAssignment entity to remove - :type layer: ifcopenshell.entity_instance.entity_instance + :type layer: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py index 657db6ac9e..f9d6a024a3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py @@ -32,9 +32,9 @@ class Usecase: removed to keep IFC valid. :param items: A list IfcRepresentationItem elements to unassign - :type items: list[ifcopenshell.entity_instance.entity_instance] + :type items: list[ifcopenshell.entity_instance] :param layer: The IfcPresentationLayerAssignment to unassign from - :type layer: ifcopenshell.entity_instance.entity_instance + :type layer: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py index db011f5ca0..f20494ac5f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py @@ -53,7 +53,7 @@ class Usecase: :param name: The name of the library :type name: str :return: The newly created IfcLibraryInformation - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/add_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/add_reference.py index 0a109b2118..84f6605cf0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/add_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/add_reference.py @@ -36,9 +36,9 @@ class Usecase: library's references. :param library: The IfcLibraryInformation element to add a reference to - :type library: ifcopenshell.entity_instance.entity_instance + :type library: ifcopenshell.entity_instance :return: The newly created IfcLibraryReference element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py index 8ee4a21eb5..8a0880ccf0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py @@ -33,14 +33,14 @@ class Usecase: detail about how references work. :param products: The list of IfcProducts you want to associate with the reference - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param reference: The IfcLibraryReference you want the product to be associated with. - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :return: The IfcRelAssociatesLibrary relationship entity or `None` if `products` was an empty list or all products were already assigned to the `reference`. - :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] + :rtype: Union[ifcopenshell.entity_instance, None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py index a5846f0c9b..aca508cc38 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py @@ -25,7 +25,7 @@ class Usecase: IfcLibraryInformation, consult the IFC documentation. :param library: The IfcLibraryInformation entity you want to edit - :type library: ifcopenshell.entity_instance.entity_instance + :type library: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py index 4fb13253a8..35a1be4709 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py @@ -25,7 +25,7 @@ class Usecase: IfcLibraryReference, consult the IFC documentation. :param reference: The IfcLibraryReference entity you want to edit - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py index 931d9153d6..e921016c4d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py @@ -28,7 +28,7 @@ class Usecase: products which have relationships to this library will not be removed. :param library: The IfcLibraryInformation entity you want to remove - :type library: ifcopenshell.entity_instance.entity_instance + :type library: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py index 9a5851827a..d34973f6b2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py @@ -28,7 +28,7 @@ class Usecase: removed. :param reference: The IfcLibraryReference entity you want to remove - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/unassign_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/unassign_reference.py index b650ffba75..420b7fa0d4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/unassign_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/unassign_reference.py @@ -33,9 +33,9 @@ class Usecase: If the product isn't assigned to the reference, nothing will happen. :param reference: The IfcLibraryReference to unassign from - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :param products: A list of IfcProduct elements to unassign from the reference - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py index c45b5fb14d..278eb50872 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py @@ -38,11 +38,11 @@ class Usecase: constituent is part of. The constituent set represents a group of constituents. See ifcopenshell.api.material.add_material_set for information on how to add a constituent set. - :type constituent_set: ifcopenshell.entity_instance.entity_instance + :type constituent_set: ifcopenshell.entity_instance :param material: The IfcMaterial that the constituent is made out of. - :type material: ifcopenshell.entity_instance.entity_instance + :type material: ifcopenshell.entity_instance :return: The newly created IfcMaterialConstituent - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py index d0b36b4ec6..aa572f07bd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py @@ -36,11 +36,11 @@ class Usecase: layer set represents a group of layers. See ifcopenshell.api.material.add_material_set for more information on how to add a layer set. - :type layer_set: ifcopenshell.entity_instance.entity_instance + :type layer_set: ifcopenshell.entity_instance :param material: The IfcMaterial that the layer is made out of. - :type material: ifcopenshell.entity_instance.entity_instance + :type material: ifcopenshell.entity_instance :return: The newly created IfcMaterialLayer - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py index 92b873b198..9a12ed044b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py @@ -39,9 +39,9 @@ class Usecase: :param material_list: The IfcMaterialList the material should be added to. - :type material_list: ifcopenshell.entity_instance.entity_instance + :type material_list: ifcopenshell.entity_instance :param material: The IfcMaterial to add to the list - :type material: ifcopenshell.entity_instance.entity_instance + :type material: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py index 3959e4becd..bac5a3ac0a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py @@ -53,7 +53,7 @@ class Usecase: :param category: The category of the material. :type category: str, optional :return: The newly created IfcMaterial - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py index 5ec8a36623..277aa258f2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py @@ -64,7 +64,7 @@ class Usecase: IfcMaterialConstituentSet. :type set_type: str, optional :return: The newly created material set element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py index 51b622b3f3..ff2cf3bed5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py @@ -47,14 +47,14 @@ class Usecase: profile set represents a group of profile items. See ifcopenshell.api.material.add_material_set for more information on how to add a profile set. - :type profile_set: ifcopenshell.entity_instance.entity_instance + :type profile_set: ifcopenshell.entity_instance :param material: The IfcMaterial that the profile item is made out of. - :type material: ifcopenshell.entity_instance.entity_instance, optional + :type material: ifcopenshell.entity_instance, optional :param profile: The IfcProfileDef that represents the 2D cross section of the the profile item. - :type profile: ifcopenshell.entity_instance.entity_instance, optional + :type profile: ifcopenshell.entity_instance, optional :return: The newly created IfcMaterialProfile - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py index 0445f2a995..a65a644866 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py @@ -64,7 +64,7 @@ class Usecase: :param products: The list of IfcProducts to assign the material or material set to. - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param type: Choose from "IfcMaterial", "IfcMaterialConstituentSet", "IfcMaterialLayerSet", "IfcMaterialLayerSetUsage", "IfcMaterialProfileSet", "IfcMaterialProfileSetUsage", or @@ -74,15 +74,15 @@ class Usecase: :param material: The IfcMaterial or material set you are assigning here. If type is Usage then no need to provide `material`, it will be deduced from the element type automatically. - :type material: ifcopenshell.entity_instance.entity_instance, optional + :type material: ifcopenshell.entity_instance, optional :return: IfcRelAssociatesMaterial entity or a list of IfcRelAssociatesMaterial entities (possible if `type` is Usage and `products` require different Usages) or `None` if `products` was empty list. :rtype: Union[ - ifcopenshell.entity_instance.entity_instance, - list[ifcopenshell.entity_instance.entity_instance], None] + ifcopenshell.entity_instance, + list[ifcopenshell.entity_instance], None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py index 4acd6637e7..4d1678a0ae 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py @@ -29,9 +29,9 @@ class Usecase: :param material_profile: The IfcMaterialProfile to change the profile curve of. See ifcopenshell.api.material.add_profile to see how to create profiles. - :type material_profile: ifcopenshell.entity_instance.entity_instance + :type material_profile: ifcopenshell.entity_instance :param profile: The IfcProfileDef to set the profile item's curve to. - :type profile: ifcopenshell.entity_instance.entity_instance + :type profile: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py index cd49c73e8f..8dac43b8e0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py @@ -28,9 +28,9 @@ class Usecase: associated to any elements. :param material: The IfcMaterial to copy - :type material: ifcopenshell.entity_instance.entity_instance + :type material: ifcopenshell.entity_instance :return: The new copy of the material - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py index 3e481d9748..3e3a03dbd8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py @@ -25,7 +25,7 @@ class Usecase: IfcMaterial, consult the IFC documentation. :param element: The IfcMaterial entity you want to edit - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py index 22660fcb24..ef036527a3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py @@ -25,11 +25,11 @@ class Usecase: IfcMaterialConstituent, consult the IFC documentation. :param constituent: The IfcMaterialConstituent entity you want to edit - :type constituent: ifcopenshell.entity_instance.entity_instance + :type constituent: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :param material: The IfcMaterial entity you want to change the constituent to - :type material: ifcopenshell.entity_instance.entity_instance, optional + :type material: ifcopenshell.entity_instance, optional :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py index e6981d059b..3e31194452 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py @@ -25,12 +25,12 @@ class Usecase: IfcMaterialLayer, consult the IFC documentation. :param layer: The IfcMaterialLayer entity you want to edit - :type layer: ifcopenshell.entity_instance.entity_instance + :type layer: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :param material: The IfcMaterial entity you want the layer to be made from. - :type material: ifcopenshell.entity_instance.entity_instance, optional + :type material: ifcopenshell.entity_instance, optional :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py index 3e45c68c78..a30fa39f21 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py @@ -28,7 +28,7 @@ class Usecase: IfcMaterialLayerSetUsage, consult the IFC documentation. :param usage: The IfcMaterialLayerSetUsage entity you want to edit - :type usage: ifcopenshell.entity_instance.entity_instance + :type usage: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py index 04de2044cc..6fc781f9a6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py @@ -25,15 +25,15 @@ class Usecase: IfcMaterialProfile, consult the IFC documentation. :param profile: The IfcMaterialProfile entity you want to edit - :type profile: ifcopenshell.entity_instance.entity_instance + :type profile: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :param profile_def: The IfcProfileDef entity the profile curve should be extruded from. - :type profile_def: ifcopenshell.entity_instance.entity_instance, optional + :type profile_def: ifcopenshell.entity_instance, optional :param material: The IfcMaterial entity you want to change the profile to be made from. - :type material: ifcopenshell.entity_instance.entity_instance, optional + :type material: ifcopenshell.entity_instance, optional :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py index edd6f27fee..afd9007c7b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py @@ -33,7 +33,7 @@ class Usecase: IfcMaterialProfileSetUsage, consult the IFC documentation. :param usage: The IfcMaterialProfileSetUsage entity you want to edit - :type usage: ifcopenshell.entity_instance.entity_instance + :type usage: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py index b62d06bee7..2fb919d10d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py @@ -25,7 +25,7 @@ class Usecase: at least one constituent to ensure a valid IFC dataset. :param constituent: The IfcMaterialConstituent entity you want to remove - :type constituent: ifcopenshell.entity_instance.entity_instance + :type constituent: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py index 3d6d8b8df6..f068641533 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py @@ -25,7 +25,7 @@ class Usecase: at least one layer to ensure a valid IFC dataset. :param layer: The IfcMaterialLayer entity you want to remove - :type layer: ifcopenshell.entity_instance.entity_instance + :type layer: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py index 47269b51dc..276d9e64d2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py @@ -28,7 +28,7 @@ class Usecase: :param material_list: The IfcMaterialList entity you want to remove an item from. - :type material_list: ifcopenshell.entity_instance.entity_instance + :type material_list: ifcopenshell.entity_instance :param material_index: The index of the material you want to remove from the list. Starts counting at 0. Defaults to 0. :type material_index: int, optional diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py index 5c048734c7..ffdf9693d8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py @@ -30,7 +30,7 @@ class Usecase: take care of this situation themselves. :param material: The IfcMaterial entity you want to remove - :type material: ifcopenshell.entity_instance.entity_instance + :type material: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py index 9eb7bcab62..79093789aa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py @@ -30,7 +30,7 @@ class Usecase: :param material: The IfcMaterialLayerSet, IfcMaterialConstituentSet, IfcMaterialProfileSet entity you want to remove. - :type material: ifcopenshell.entity_instance.entity_instance + :type material: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py index 4174d067cb..9c930866ed 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py @@ -29,7 +29,7 @@ class Usecase: at least one profile to ensure a valid IFC dataset. :param profile: The IfcMaterialProfile entity you want to remove - :type profile: ifcopenshell.entity_instance.entity_instance + :type profile: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py index d6e2d6f9f7..442fec8b5e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py @@ -26,7 +26,7 @@ class Usecase: :param material_set: The IfcMaterialSet which you want to reorder an item in. - :type material_set: ifcopenshell.entity_instance.entity_instance + :type material_set: ifcopenshell.entity_instance :param old_index: The index of the item you want to move. This starts counting from 0. :type old_index: int diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py index 60fac1382e..5f88963c36 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py @@ -32,7 +32,7 @@ class Usecase: If the product does not have a material, nothing happens. :param products: The list IfcProducts that may or may not have a material - :type product: list[ifcopenshell.entity_instance.entity_instance] + :type product: list[ifcopenshell.entity_instance] :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py index 5617d39f06..1c9ab8c9b0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py @@ -80,13 +80,13 @@ class Usecase: :param related_objects: The list of children of the nesting relationship, typically IfcElements. - :type related_objects: list[ifcopenshell.entity_instance.entity_instance] + :type related_objects: list[ifcopenshell.entity_instance] :param relating_object: The host parent of the nesting relationship, typically an IfcElement. - :type relating_object: ifcopenshell.entity_instance.entity_instance + :type relating_object: ifcopenshell.entity_instance :return: The IfcRelNests relationship instance or `None` if `related_objects` was empty list. - :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] + :rtype: Union[ifcopenshell.entity_instance, None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py b/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py index 1c986f2cd0..b9f48b4b5b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py @@ -32,7 +32,7 @@ class Usecase: :param related_objects: The list of children of the nesting relationship, typically IfcElements. - :type related_objects: list[ifcopenshell.entity_instance.entity_instance] + :type related_objects: list[ifcopenshell.entity_instance] :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py index 9325638d96..c3ff65c3d1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py @@ -42,11 +42,11 @@ class Usecase: IfcPerson if it is a sole individual, or an IfcPersonAndOrganization if a specific person is liable within an organisation and must be legally nominated. - :type actor: ifcopenshell.entity_instance.entity_instance + :type actor: ifcopenshell.entity_instance :param ifc_class: Either "IfcActor" or "IfcOccupant". :type ifc_class: str, optional :return: The newly created IfcActor or IfcOccupant - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py index 3a9c3e6c14..b184408fa9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py @@ -33,12 +33,12 @@ class Usecase: :param assigned_object: The IfcOrganization or IfcPerson the contact address belongs to. - :type assigned_object: ifcopenshell.entity_instance.entity_instance + :type assigned_object: ifcopenshell.entity_instance :param ifc_class: Either IfcPostalAddress or IfcTelecomAddress. Defaults to IfcPostalAddress. :type ifc_class: str, optional :return: The new IfcPostalAddress or IfcTelecomAddress - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py index 792096ef9d..92861a3417 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py @@ -39,7 +39,7 @@ class Usecase: :param application_developer: The IfcOrganization responsible for creating the application. Defaults to generating an IfcOpenShell organisation if none is provided. - :type application_developer: ifcopenshell.entity_instance.entity_instance, optional + :type application_developer: ifcopenshell.entity_instance, optional :param version: The version of the application. Defaults to the ifcopenshell.version data if not specified. :type version: str, optional diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py index 0e6f676fbc..2127acd570 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py @@ -34,7 +34,7 @@ class Usecase: :param name: The legal name of the organisation :type name: str, optional :return: The newly created IfcOrganization - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py index 268568c80d..a607d8af29 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py @@ -39,7 +39,7 @@ class Usecase: :param given_name: The given name :type given_name: str, optional :return: The newly created IfcPerson - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py index 3e0b372690..a5987b4b76 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py @@ -32,11 +32,11 @@ class Usecase: :param person: The IfcPerson being the representative of the organisation. - :type person: ifcopenshell.entity_instance.entity_instance + :type person: ifcopenshell.entity_instance :param organisation: The IfcOrganization itself. - :type organisation: ifcopenshell.entity_instance.entity_instance + :type organisation: ifcopenshell.entity_instance :return: The newly created IfcPersonAndOrganization - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py index 1a18e3c403..3b1369877c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py @@ -31,12 +31,12 @@ class Usecase: :param assigned_object: The IfcPerson or IfcOrganization the role should be assigned to. - :type assigned_object: ifcopenshell.entity_instance.entity_instance + :type assigned_object: ifcopenshell.entity_instance :param role: The type of role, taken from the IFC documentation for IfcActorRole, or a custom name. :type role: str, optional :return: The newly created IfcActorRole - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py index 395818e922..1085adeb34 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py @@ -41,11 +41,11 @@ class Usecase: ifcopenshell.api.resource.assign_resource. :param relating_actor: The IfcActor who is responsible for the object. - :type relating_actor: ifcopenshell.entity_instance.entity_instance + :type relating_actor: ifcopenshell.entity_instance :param related_object: The object the actor is responsible for. - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: The newly created IfcRelAssignsToActor relationship. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py index 31491feeaa..94183e0c6b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py @@ -62,7 +62,7 @@ class Usecase: :return: The newly created IfcOwnerHistory element or `None` if it's not IFC2X3 and user or application is not found in the current project. - :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] + :rtype: Union[ifcopenshell.entity_instance, None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py index 87638e6e44..eb6491b359 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py @@ -25,7 +25,7 @@ class Usecase: IfcActor, consult the IFC documentation. :param actor: The IfcActor entity you want to edit - :type actor: ifcopenshell.entity_instance.entity_instance + :type actor: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py index 5ecda0ec03..0f48af25d5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py @@ -25,7 +25,7 @@ class Usecase: IfcAddress, consult the IFC documentation. :param address: The IfcAddress entity you want to edit - :type address: ifcopenshell.entity_instance.entity_instance + :type address: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py index 03289d6f14..19c8d1e431 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py @@ -25,7 +25,7 @@ class Usecase: IfcOrganization, consult the IFC documentation. :param organisation: The IfcOrganization entity you want to edit - :type organisation: ifcopenshell.entity_instance.entity_instance + :type organisation: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py index 931cdb0c82..19eedc23db 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py @@ -25,7 +25,7 @@ class Usecase: IfcPerson, consult the IFC documentation. :param person: The IfcPerson entity you want to edit - :type person: ifcopenshell.entity_instance.entity_instance + :type person: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py index 6e96df744f..160f6f6d91 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py @@ -25,7 +25,7 @@ class Usecase: IfcActorRole, consult the IFC documentation. :param role: The IfcActorRole entity you want to edit - :type role: ifcopenshell.entity_instance.entity_instance + :type role: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py index 2f48ded614..ac99299a6f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py @@ -25,7 +25,7 @@ class Usecase: """Removes an actor :param actor: The IfcActor to remove. - :type actor: ifcopenshell.entity_instance.entity_instance + :type actor: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py index 1bb9247c0d..728ffb45f5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py @@ -25,7 +25,7 @@ class Usecase: relationship removed. :param address: The IfcAddress to remove. - :type address: ifcopenshell.entity_instance.entity_instance + :type address: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py index 63e8092338..7e21c07943 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py @@ -25,7 +25,7 @@ class Usecase: Check whether or not the application is used anywhere prior to removal. :param address: The IfcApplication to remove. - :type address: ifcopenshell.entity_instance.entity_instance + :type address: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py index e5c7b36d8b..e9e2c77e9e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py @@ -27,7 +27,7 @@ class Usecase: removed. :param organisation: The IfcOrganization to remove - :type organisation: ifcopenshell.entity_instance.entity_instance + :type organisation: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py index af82abf989..8e1ba7a972 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py @@ -27,7 +27,7 @@ class Usecase: removed. :param person: The IfcPerson to remove - :type person: ifcopenshell.entity_instance.entity_instance + :type person: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py index 6e12917d72..fc85722e68 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py @@ -27,7 +27,7 @@ class Usecase: the "person and organisation" group. :param person_and_organisation: The IfcPersonAndOrganization to remove. - :type person_and_organisation: ifcopenshell.entity_instance.entity_instance + :type person_and_organisation: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py index 3e6a6cc721..5de9915c33 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py @@ -25,7 +25,7 @@ class Usecase: leave some of them without roles. :param role: The IfcActorRole to remove. - :type role: ifcopenshell.entity_instance.entity_instance + :type role: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py b/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py index 6c0e6a456f..493f4077f4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/settings.py @@ -30,9 +30,9 @@ def get_application(ifc: ifcopenshell.file) -> Union[ifcopenshell.entity_instanc IfcApplication. See ifcopenshell.api.owner.create_owner_history for details. :param ifc: The IFC file object that is being edited. - :type ifc: ifcopenshell.file.file + :type ifc: ifcopenshell.file :return: The IfcApplication with metadata of the authoring software. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ app = ifc.by_type("IfcApplication") if not app and ifc.schema == "IFC2X3": @@ -50,9 +50,9 @@ def get_user(ifc: ifcopenshell.file) -> Union[ifcopenshell.entity_instance, None IfcApplication. See ifcopenshell.api.owner.create_owner_history for details. :param ifc: The IFC file object that is being edited. - :type ifc: ifcopenshell.file.file + :type ifc: ifcopenshell.file :return: The IfcPersonAndOrganization with metadata of the authoring user. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ pao = ifc.by_type("IfcPersonAndOrganization") if not pao and ifc.schema == "IFC2X3": diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py index aadb6426c9..711732bcdc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py @@ -28,12 +28,12 @@ class Usecase: This means that the actor is no longer responsible for the object. :param relating_actor: The IfcActor who is responsible for the object. - :type relating_actor: ifcopenshell.entity_instance.entity_instance + :type relating_actor: ifcopenshell.entity_instance :param related_object: The object the actor is responsible for. - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: The updated IfcRelAssignsToActor relationship or none if there is no more valid relationship. - :rtype: None, ifcopenshell.entity_instance.entity_instance + :rtype: None, ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py index 27230372fb..797d1b8b57 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py @@ -34,9 +34,9 @@ class Usecase: :param element: The IfcRoot element to update the ownership details on when a change is made. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The updated IfcOwnerHistory element. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py index edf1d22408..8cced9d934 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py @@ -37,7 +37,7 @@ class Usecase: this may be left as none. :type name: str, optional :return: The newly created IfcArbitraryClosedProfileDef - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py index a33b4d38be..7c1af83294 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py @@ -44,7 +44,7 @@ class Usecase: this may be left as none. :type name: str, optional :return: The newly created IfcArbitraryProfileDefWithVoids - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py index 6b8c3786c6..0201095feb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py @@ -26,13 +26,13 @@ class Usecase: the IFC documentation as subclasses of IfcParameterizedProfileDef. Currently, this API has no benefit over directly calling - ifcopenshell.file.file.create_entity. + ifcopenshell.file.create_entity. :param ifc_class: The subclass of IfcParameterizedProfileDef that you'd like to create. :type ifc_class: str :return: The newly created element depending on the specified ifc_class. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py index 489bf0b5fa..759a5d4c7d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py @@ -25,7 +25,7 @@ class Usecase: IfcProfileDef, consult the IFC documentation. :param profile: The IfcProfileDef entity you want to edit - :type profile: ifcopenshell.entity_instance.entity_instance + :type profile: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py index ce037686e1..47d3391e00 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py @@ -25,7 +25,7 @@ class Usecase: """Removes a profile :param profile: The IfcProfileDef to remove. - :type profile: ifcopenshell.entity_instance.entity_instance + :type profile: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py index b3640ca53e..3e88c7c82a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py @@ -39,18 +39,18 @@ class Usecase: Do not mix units. :param library: The file object containing the asset. - :type library: ifcopenshell.file.file + :type library: ifcopenshell.file :param element: An element in the library file of the asset. It may be an IfcTypeProduct, IfcProduct, IfcMaterial, IfcCostSchedule, or IfcProfileDef. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :param reuse_identities: Optional dictionary of mapped entities' identities to the already created elements. It will be used to avoid creating duplicated inverse elements during multiple `project.append_asset` calls. If you want to add just 1 asset or if added assets won't have any shared elements, then it can be left empty. - :type reuse_identities: dict[int, ifcopenshell.entity_instance.entity_instance] + :type reuse_identities: dict[int, ifcopenshell.entity_instance] :return: The appended element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py index be4d076de0..e6e919b77b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py @@ -43,13 +43,13 @@ class Usecase: a declaration lets you say that an object belongs to a library. :param definitions: The list of objects you want to declare. Typically a list of assets. - :type definitions: list[ifcopenshell.entity_instance.entity_instance] + :type definitions: list[ifcopenshell.entity_instance] :param relating_context: The IfcProject, or more commonly the IfcProjectLibrary that you want the object to be part of. - :type relating_context: ifcopenshell.entity_instance.entity_instance + :type relating_context: ifcopenshell.entity_instance :return: The new IfcRelDeclares relationship or None if all definitions were already declared / do not support declaration. - :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] + :rtype: Union[ifcopenshell.entity_instance, None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py b/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py index 45ce3d6c6a..1b3e644cbd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py @@ -37,7 +37,7 @@ class Usecase: schema, you may specify that schema identifier here too. :type version: str, optional :return: The created IFC file object. - :rtype: ifcopenshell.file.file + :rtype: ifcopenshell.file Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py index 47c5194bdd..8f8e726570 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py @@ -34,10 +34,10 @@ class Usecase: :param definitions: The list of objects you want to undeclare. Typically a list of assets. - :type definitions: list[ifcopenshell.entity_instance.entity_instance] + :type definitions: list[ifcopenshell.entity_instance] :param relating_context: The IfcProject, or more commonly the IfcProjectLibrary that you want the object to no longer be part of. - :type relating_context: ifcopenshell.entity_instance.entity_instance + :type relating_context: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py index ac498e413d..1fd1a0c61a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py @@ -53,7 +53,7 @@ class Usecase: data, rather than arbitrary metadata. :param product: The IfcObject that you want to assign a property set to. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :param name: The name of the property set. Property sets that are standardised by buildingSMART typically have a prefix of "Pset_", like "Pset_WallCommon". If you create your own, you must not use @@ -61,7 +61,7 @@ class Usecase: your project, company, or local government requirement. :type name: str :return: The newly created IfcPropertySet - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py index 9e7d9eee78..a3c7b54299 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py @@ -49,7 +49,7 @@ class Usecase: metadata, rather than quantification data. :param product: The IfcObject that you want to assign a quantity set to. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :param name: The name of the quantity set. Quantity sets that are standardised by buildingSMART typically have a prefix of "Qto_", like "Qto_WallBaseQuantities". If you create your own, you must not @@ -57,7 +57,7 @@ class Usecase: to your project, company, or local government requirement. :type name: str :return: The newly created IfcElementQuantity - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py index 81b57db874..0eb711b803 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py @@ -52,7 +52,7 @@ class Usecase: to ensure that data types are always consistent and correct. :param pset: The IfcPropertySet to edit. - :type pset: ifcopenshell.entity_instance.entity_instance + :type pset: ifcopenshell.entity_instance :param name: A new name for the property set. If no name is specified, the property set name is not changed. :type name: str, optional @@ -69,7 +69,7 @@ class Usecase: :param pset_template: If a property set template is provided, this will be used to determine data types. If no user-defined template is provided, the built-in buildingSMART templates will be loaded. - :type pset_template: ifcopenshell.entity_instance.entity_instance + :type pset_template: ifcopenshell.entity_instance :param should_purge: If left as False, properties set to None will be left as None but not removed. If set to true, properties set to None will actually be removed. diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py index 820f8d858f..cd5a3bca05 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py @@ -34,7 +34,7 @@ class Usecase: It is not allowed to have None quantities in IFC. :param qto: The IfcElementQuantity to edit. - :type qto: ifcopenshell.entity_instance.entity_instance + :type qto: ifcopenshell.entity_instance :param name: A new name for the quantity set. If no name is specified, the quantity set name is not changed. :type name: str, optional @@ -51,7 +51,7 @@ class Usecase: :param pset_template: If a quantity set template is provided, this will be used to determine data types. If no user-defined template is provided, the built-in buildingSMART templates will be loaded. - :type pset_template: ifcopenshell.entity_instance.entity_instance + :type pset_template: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py index b71be041f8..da77accbb6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py @@ -27,9 +27,9 @@ class Usecase: All properties that are part of this property set are also removed. :param product: The IfcObject to remove the property set from. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :param pset: The IfcPropertySet or IfcElementQuantity to remove. - :type pset: ifcopenshell.entity_instance.entity_instance + :type pset: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py index 569b2bcdd5..5a9dc42355 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py @@ -57,7 +57,7 @@ class Usecase: :param pset_template: The property set template to add the property template to. - :type pset_template: ifcopenshell.entity_instance.entity_instance + :type pset_template: ifcopenshell.entity_instance :param name: The name of the property :type name: str,optional :param description: A few words describing what the property stores. @@ -66,7 +66,7 @@ class Usecase: IFC documentation for the full list of data types. :param primary_measure_type: str,optional :return: The newly created IfcSimplePropertyTemplate. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py index 4611dfb48e..242f7b7510 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py @@ -84,7 +84,7 @@ class Usecase: property set may be assigned to any type. :type applicable_entity: str,optional :return: The newly created IfcPropertySetTemplate - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py index 1ddc18f7dc..6b2633992f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py @@ -25,7 +25,7 @@ class Usecase: IfcSimplePropertyTemplate, consult the IFC documentation. :param prop_template: The IfcSimplePropertyTemplate entity you want to edit - :type prop_template: ifcopenshell.entity_instance.entity_instance + :type prop_template: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py index 29d99753a4..303618f509 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py @@ -25,7 +25,7 @@ class Usecase: IfcPropertySetTemplate, consult the IFC documentation. :param pset_template: The IfcPropertySetTemplate entity you want to edit - :type pset_template: ifcopenshell.entity_instance.entity_instance + :type pset_template: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py index 1bb5650dfc..6479e6ffc2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py @@ -28,7 +28,7 @@ class Usecase: templates. :param prop_template: The IfcSimplePropertyTemplate to remove. - :type prop_template: ifcopenshell.entity_instance.entity_instance + :type prop_template: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py index 93bb120dbe..4cb2c2695a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py @@ -27,7 +27,7 @@ class Usecase: along with it. :param pset_template: The IfcPropertySetTemplate to remove. - :type pset_template: ifcopenshell.entity_instance.entity_instance + :type pset_template: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py index f2c3bf99ee..03a67ab648 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py @@ -50,7 +50,7 @@ class Usecase: :param parent_resource: If this is a child resource (typically to a crew resource), then nominate the parent IfcConstructionResource here. - :type parent_resource: ifcopenshell.entity_instance.entity_instance + :type parent_resource: ifcopenshell.entity_instance :param ifc_class: The class of resource chosen from IfcConstructionEquipmentResource, IfcConstructionMaterialResource, IfcConstructionProductResource, IfcCrewResource, IfcLaborResource, @@ -63,7 +63,7 @@ class Usecase: :type predefined_type: str,optional :return: The newly created resource depending on the nominated IFC class. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py index 55fb80902d..4e5ef0c0a0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py @@ -34,7 +34,7 @@ class Usecase: This base quantity is then used in other calculations. :param resource: The IfcConstructionResource to add a quantity to. - :type resource: ifcopenshell.entity_instance.entity_instance + :type resource: ifcopenshell.entity_instance :param ifc_class: The type of quantity to add, chosen from IfcQuantityArea (for material), IfcQuantityCount (for products), IfcQuantityLength (for material), IfcQuantityTime (for equipment or @@ -42,7 +42,7 @@ class Usecase: (for material). :type ifc_class: str,optional :return: The newly created quantity depending on the IFC class - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py index 8407555e35..8627e319a7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py @@ -29,9 +29,9 @@ class Usecase: be used to calculate other parameters like resource utilisation. :param resource: The IfcConstructionResource to record time for. - :type resource: ifcopenshell.entity_instance.entity_instance + :type resource: ifcopenshell.entity_instance :return: The newly created IfcResourceTime - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py index 121a565177..f71ec00260 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py @@ -38,12 +38,12 @@ class Usecase: (e.g. if the resource is a labour resource). :param relating_resource: The IfcResource to assign the object to. - :type relating_resource: ifcopenshell.entity_instance.entity_instance + :type relating_resource: ifcopenshell.entity_instance :param related_object: The IfcProduct or IfcActor to assign to the object. - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: The newly created IfcRelAssignsToResource - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py index a23cddd09e..746f0d88c0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py @@ -52,7 +52,7 @@ class Usecase: :param resource: The IfcConstructionResource that you want to calculate the work performed. - :type resource: ifcopenshell.entity_instance.entity_instance + :type resource: ifcopenshell.entity_instance :return None: :rtype: None: """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py index 34be65fea5..c28f4c0661 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py @@ -25,7 +25,7 @@ class Usecase: IfcResource, consult the IFC documentation. :param resource: The IfcResource entity you want to edit - :type resource: ifcopenshell.entity_instance.entity_instance + :type resource: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py index f88ed466fd..0785caa02e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py @@ -25,7 +25,7 @@ class Usecase: IfC quantity, consult the IFC documentation. :param physical_quantity: The IfC quantity entity you want to edit - :type physical_quantity: ifcopenshell.entity_instance.entity_instance + :type physical_quantity: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py index 6a4b2029d4..c9db827a89 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py @@ -28,7 +28,7 @@ class Usecase: IfcResourceTime, consult the IFC documentation. :param resource_time: The IfcResourceTime entity you want to edit - :type resource_time: ifcopenshell.entity_instance.entity_instance + :type resource_time: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py index 50c8661ecd..ceed0dbf2a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py @@ -26,12 +26,12 @@ class Usecase: """Removes the relationship between a resource and object :param relating_resource: The IfcResource to assign the object to. - :type relating_resource: ifcopenshell.entity_instance.entity_instance + :type relating_resource: ifcopenshell.entity_instance :param related_object: The IfcProduct or IfcActor to assign to the object. - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: The newly created IfcRelAssignsToResource - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py b/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py index 7ffbdc38fa..389930d409 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py @@ -50,9 +50,9 @@ class Usecase: connections are still valid. :param product: The IfcProduct to copy. - :type param: ifcopenshell.entity_instance.entity_instance + :type param: ifcopenshell.entity_instance :return: The copied product - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py index 8599c00472..7619eec067 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py @@ -52,7 +52,7 @@ class Usecase: :param name: The name of the new element. :type name: str,optional :return: The newly created element based on the specified IFC class. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py b/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py index c87df1e8e4..1035a6b17c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py @@ -48,14 +48,14 @@ class Usecase: this. :param product: The IfcProduct that you want to change the class of. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :param ifc_class: The new IFC class you want to change it to. :type ifc_class: str,optional :param predefined_type: In case you want to change the predefined type too. User defined types are also allowed, just type what you want. :type predefined_type: str,optional :return: The newly modified product. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py b/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py index 179e7ca572..cecb5544f3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py @@ -42,7 +42,7 @@ class Usecase: naturally, the materials, types, containers, etc themselves remain). :param product: The element to remove. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py index bf42853d2c..60ab48c6df 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py @@ -67,11 +67,11 @@ class Usecase: :param work_schedule: The work schedule to group the task in, if the task is to be a top-level or root task. This is mutually exclusive with the parent_task parameter. - :type work_schedule: ifcopenshell.entity_instance.entity_instance + :type work_schedule: ifcopenshell.entity_instance :param parent_task: The parent task, if the task is to be a subtask or child task. This is mutually exclusive with the work_schedule parameter. - :type parent_task: ifcopenshell.entity_instance.entity_instance + :type parent_task: ifcopenshell.entity_instance :param name: The name of the task. :type name: str,optional :param description: The description of the task. @@ -83,7 +83,7 @@ class Usecase: IFC documentation for IfcTaskTypeEnum for more information. :type predefined_type: str :return: The newly created IfcTask - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py index a1638d2b04..7c4381c361 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py @@ -27,11 +27,11 @@ class Usecase: (especially for maintenance tasks). :param task: The task to add time data to. - :type task: ifcopenshell.entity_instance.entity_instance + :type task: ifcopenshell.entity_instance :param is_recurring: Whether or not the time should recur. :type is_recurring: bool :return: The newly created IfcTaskTime. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py index a69e22fa0f..35a022a9ea 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py @@ -39,7 +39,7 @@ class Usecase: :param recurrence_pattern: The IfcRecurrencePattern to add the time period to. See ifcopenshell.api.sequence.assign_recurrence_pattern. - :type recurrence_pattern: ifcopenshell.entity_instance.entity_instance + :type recurrence_pattern: ifcopenshell.entity_instance :param start_time: The start time of the time period, in a format compatible with IfcTime, such as an ISO format time string or a datetime.time object. @@ -49,7 +49,7 @@ class Usecase: datetime.time object. :type end_time: str,datetime.time :return: The newly created IfcTimePeriod - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py index 9df45247c5..373d628be6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py @@ -41,7 +41,7 @@ class Usecase: specifically define shifts, such as FIRSTSHIFT, SECONDSHIFT, or THIRDSHIFT. Leave as NOTDEFINED for basic calendar usage. :return: The newly created IfcWorkCalendar - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py index 4e907a0ad5..f6fba71315 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py @@ -42,7 +42,7 @@ class Usecase: within the work plan are relevant. :type start_time: str,datetime.time :return: The newly created IfcWorkPlan - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py index f50745471f..47e96a8fa3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py @@ -50,9 +50,9 @@ class Usecase: provided, the schedule will not be grouped in a work plan and would exist as a top level schedule in the project. This is not recommended. - :type work_plan: ifcopenshell.entity_instance.entity_instance,optional + :type work_plan: ifcopenshell.entity_instance,optional :return: The newly created IfcWorkSchedule - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py index 6afafad753..0d75914949 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py @@ -31,12 +31,12 @@ class Usecase: :param work_calendar: The IfcWorkCalendar to add the work or holiday time definition to. - :type work_calendar: ifcopenshell.entity_instance.entity_instance + :type work_calendar: ifcopenshell.entity_instance :param time_type: Either WorkingTimes or ExceptionTimes, depending on what you want to define. :type time_type: str :return: The newly created IfcWorkTime - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py index cc1abf7409..87f2882055 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py @@ -33,7 +33,7 @@ class Usecase: are allowed. :param rel_sequence: The IfcRelSequence to assign the lag time to. - :type rel_sequence: ifcopenshell.entity_instance.entity_instance + :type rel_sequence: ifcopenshell.entity_instance :param lag_value: An ISO standardised duration string. :type lag_value: str :param duration_type: Choose from WORKTIME for the associated @@ -43,7 +43,7 @@ class Usecase: is unclear. :type duration_type: str :return: The newly created IfcLagTime - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py index ea758b9182..5aa2210d42 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py @@ -61,12 +61,12 @@ class Usecase: :param relating_process: The IfcProcess (typically IfcTask) that the input, control, or resource is related to. - :type relating_process: ifcopenshell.entity_instance.entity_instance + :type relating_process: ifcopenshell.entity_instance :param related_object: The IfcProduct (for input), IfcCostItem (for control) or IfcConstructionResource (for resource). - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: The newly created IfcRelAssignsToProcess relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py index d8003227d1..3431a71f19 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py @@ -37,12 +37,12 @@ class Usecase: :param relating_product: The IfcProduct that was constructed as a result of the task. - :type relating_product: ifcopenshell.entity_instance.entity_instance + :type relating_product: ifcopenshell.entity_instance :param related_object: The IfcProcess (typically IfcTask) of the construction task. - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: The newly created IfcRelAssignsToProduct relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py index a940e4f224..a3243f1057 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py @@ -60,11 +60,11 @@ class Usecase: :param parent: Either an IfcTaskTimeRecurring if you are defining a recurring schedule for a task, or IfcWorkTime if you are defining a recurring pattern for a workdays or holidays in a calendar. - :type parent: ifcopenshell.entity_instance.entity_instance + :type parent: ifcopenshell.entity_instance :param recurrence_type: One of the types of recurrences. :type recurrence_type: str :return: The newly created IfcRecurrencePattern - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py index 078f5b7f5c..e1c1100760 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py @@ -51,13 +51,13 @@ class Usecase: predecessor and successor tasks in the planning profession. :param relating_process: The previous / predecessor task. - :type relating_process: ifcopenshell.entity_instance.entity_instance + :type relating_process: ifcopenshell.entity_instance :param related_process: The next / successor task. - :type related_process: ifcopenshell.entity_instance.entity_instance + :type related_process: ifcopenshell.entity_instance :param sequence_type: Choose from FINISH_START, FINISH_FINISH, START_START, or START_FINISH. :return: The newly created IfcRelSequence - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py index b3573db5d5..a1eaed71be 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py @@ -29,11 +29,11 @@ class Usecase: :param work_schedule: The IfcWorkSchedule that will be assigned to the work plan. - :type work_schedule: ifcopenshell.entity_instance.entity_instance + :type work_schedule: ifcopenshell.entity_instance :param work_plan: The IfcWorkPlan for the schedule to be assigned to. - :type work_plan: ifcopenshell.entity_instance.entity_instance + :type work_plan: ifcopenshell.entity_instance :return: The IfcRelAggregates relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py index 671113f9f1..6698ab85a2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py @@ -36,7 +36,7 @@ class Usecase: then nothing happens. :param task: The IfcTask to calculate the duration for. - :type task: ifcopenshell.entity_instance.entity_instance + :type task: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py index a069bb4901..2a720b9fa1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py @@ -42,7 +42,7 @@ class Usecase: be equivalent to be Tuesday 8am, for instance. :param task: The start task to begin cascading from. - :type task: ifcopenshell.entity_instance.entity_instance + :type task: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py index 8f6e82c750..c0ebe4f72f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py @@ -37,9 +37,9 @@ class Usecase: * Same Resource Relationships :param work_schedule: The planned work_schedule to baseline - :type work_schedule: ifcopenshell.entity_instance.entity_instance + :type work_schedule: ifcopenshell.entity_instance :return: The baseline work_schedule - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: .. code:: python diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py index 195c5c71cd..91d5ed1b99 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py @@ -33,9 +33,9 @@ class Usecase: * The copy will have duplicated nested tasks :param task: The task to be duplicated - :type task: ifcopenshell.entity_instance.entity_instance + :type task: ifcopenshell.entity_instance :return: The duplicated task or the list of duplicated tasks if the latter has children - :rtype: ifcopenshell.entity_instance.entity_instance or list of ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance or list of ifcopenshell.entity_instance Example: .. code:: python diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py index 5f9a2dfcb4..f5779b058c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py @@ -28,7 +28,7 @@ class Usecase: IfcLagTime, consult the IFC documentation. :param lag_time: The IfcLagTime entity you want to edit - :type lag_time: ifcopenshell.entity_instance.entity_instance + :type lag_time: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py index f5eb567f6d..21292233ad 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py @@ -28,7 +28,7 @@ class Usecase: IfcRecurrencePattern, consult the IFC documentation. :param recurrence_pattern: The IfcRecurrencePattern entity you want to edit - :type recurrence_pattern: ifcopenshell.entity_instance.entity_instance + :type recurrence_pattern: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py index 56c38d52ea..c563cb6990 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py @@ -28,7 +28,7 @@ class Usecase: IfcRelSequence, consult the IFC documentation. :param rel_sequence: The IfcRelSequence entity you want to edit - :type rel_sequence: ifcopenshell.entity_instance.entity_instance + :type rel_sequence: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py index d6ffdd5d17..cbdaa18de0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py @@ -25,7 +25,7 @@ class Usecase: IfcTask, consult the IFC documentation. :param task: The IfcTask entity you want to edit - :type task: ifcopenshell.entity_instance.entity_instance + :type task: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py index 68b5d59bbb..10bec7909c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py @@ -36,7 +36,7 @@ class Usecase: IfcTaskTime, consult the IFC documentation. :param task_time: The IfcTaskTime entity you want to edit - :type task_time: ifcopenshell.entity_instance.entity_instance + :type task_time: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py index cdfec38271..12ce1e15d1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py @@ -25,7 +25,7 @@ class Usecase: IfcWorkCalendar, consult the IFC documentation. :param work_calendar: The IfcWorkCalendar entity you want to edit - :type work_calendar: ifcopenshell.entity_instance.entity_instance + :type work_calendar: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py index 39c426e2b8..669ef0193c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py @@ -27,7 +27,7 @@ class Usecase: IfcWorkPlan, consult the IFC documentation. :param work_plan: The IfcWorkPlan entity you want to edit - :type work_plan: ifcopenshell.entity_instance.entity_instance + :type work_plan: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py index e520b49419..cd7ca163b2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py @@ -27,7 +27,7 @@ class Usecase: IfcWorkSchedule, consult the IFC documentation. :param work_schedule: The IfcWorkSchedule entity you want to edit - :type work_schedule: ifcopenshell.entity_instance.entity_instance + :type work_schedule: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py index 4512789fdb..d62c3a5357 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py @@ -33,7 +33,7 @@ class Usecase: IfcWorkTime, consult the IFC documentation. :param work_time: The IfcWorkTime entity you want to edit - :type work_time: ifcopenshell.entity_instance.entity_instance + :type work_time: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py index 26ad4af7fa..eb8af300d1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py @@ -27,12 +27,12 @@ class Usecase: utility module. :param relating_product: One of the products already output by the task. - :type relating_product: ifcopenshell.entity_instance.entity_instance + :type relating_product: ifcopenshell.entity_instance :param related_object: The IfcTask that you want to get all the related products for. - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: A set of IfcProducts output by the IfcTask. - :rtype: set[ifcopenshell.entity_instance.entity_instance] + :rtype: set[ifcopenshell.entity_instance] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py index 4039c53c57..da07337f7b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py @@ -36,7 +36,7 @@ class Usecase: error. :param work_schedule: The IfcWorkSchedule to perform the calculation on. - :type work_schedule: ifcopenshell.entity_instance.entity_instance + :type work_schedule: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py index 870efa1876..6b7fac4f75 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py @@ -29,7 +29,7 @@ class Usecase: sequences or controls are also removed. :param task: The IfcTask to remove. - :type task: ifcopenshell.entity_instance.entity_instance + :type task: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py index 925c6289ff..32effdf4ac 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py @@ -24,7 +24,7 @@ class Usecase: """Removes a time period :param time_period: The IfcTimePeriod to remove. - :type time_period: ifcopenshell.entity_instance.entity_instance + :type time_period: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py index 242165c201..e233bef26d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py @@ -28,7 +28,7 @@ class Usecase: calendar. :param work_calendar: The IfcWorkCalendar to remove - :type work_calendar: ifcopenshell.entity_instance.entity_instance + :type work_calendar: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py index 905a7b9b8a..bbd631829d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py @@ -28,7 +28,7 @@ class Usecase: removed. :param work_plan: The IfcWorkPlan to remove. - :type work_plan: ifcopenshell.entity_instance.entity_instance + :type work_plan: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py index b8bbcd4616..66b69c8804 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py @@ -28,7 +28,7 @@ class Usecase: All tasks in the work schedule are also removed recursively. :param work_schedule: The IfcWorkSchedule to remove. - :type work_schedule: ifcopenshell.entity_instance.entity_instance + :type work_schedule: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py index 6f8e1d13eb..3898e3655a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py @@ -22,7 +22,7 @@ class Usecase: """Removes a work time :param work_time: The IfcWorkTime to remove. - :type work_time: ifcopenshell.entity_instance.entity_instance + :type work_time: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py index 94a5fe16fb..cca278da44 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py @@ -26,7 +26,7 @@ class Usecase: The schedule is cascaded afterwards. :param rel_sequence: The sequence to remove the lag time from. - :type rel_sequence: ifcopenshell.entity_instance.entity_instance + :type rel_sequence: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py index 2d7a5fb10f..dfc12068d3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py @@ -28,9 +28,9 @@ class Usecase: See ifcopenshell.api.sequence.assign_process for details. :param relating_process: The IfcTask in the relationship. - :type relating_process: ifcopenshell.entity_instance.entity_instance + :type relating_process: ifcopenshell.entity_instance :param related_object: The related object. - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py index a4dcfd6968..31d9edb0e1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py @@ -28,9 +28,9 @@ class Usecase: See ifcopenshell.api.sequence.assign_product for details. :param relating_product: The IfcProduct in the relationship. - :type relating_product: ifcopenshell.entity_instance.entity_instance + :type relating_product: ifcopenshell.entity_instance :param related_object: The IfcTask in the relationship. - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py index 7a13495289..fc74c69a95 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py @@ -25,7 +25,7 @@ class Usecase: you remove it, be sure to clean up after yourself. :param recurrence_pattern: The IfcRecurrencePattern to remove. - :type recurrence_pattern: ifcopenshell.entity_instance.entity_instance + :type recurrence_pattern: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py index 85afb4cd23..c7286909bd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py @@ -26,9 +26,9 @@ class Usecase: """Removes a sequence relationship between tasks :param relating_process: The previous / predecessor task. - :type relating_process: ifcopenshell.entity_instance.entity_instance + :type relating_process: ifcopenshell.entity_instance :param related_process: The next / successor task. - :type related_process: ifcopenshell.entity_instance.entity_instance + :type related_process: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py index 70dacdce00..9edf7ccba8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py @@ -68,13 +68,13 @@ class Usecase: previous aggregation, containment, or nesting relationships it may have. :param products: A list of physical IfcElements existing in the space. - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param relating_structure: The IfcSpatialStructureElement element, such as IfcBuilding, IfcBuildingStorey, or IfcSpace that the element exists in. :return: The IfcRelContainedInSpatialStructure relationship instance or `None` if `products` was empty list. - :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] + :rtype: Union[ifcopenshell.entity_instance, None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/dereference_structure.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/dereference_structure.py index 00cb94d8b3..6902018b46 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/dereference_structure.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/dereference_structure.py @@ -31,7 +31,7 @@ class Usecase: """Dereferences a list of products and space :param products: The list of physical IfcElements that exists in the space. - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param relating_structure: The IfcSpatialStructureElement element, such as IfcBuilding, IfcBuildingStorey, or IfcSpace that the element exists in. diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py index 6d8915828a..32ef580b96 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py @@ -47,11 +47,11 @@ class Usecase: spaces simultaneously. :param products: The list of physical IfcElements that exists in the space. - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param relating_structure: The IfcSpatialStructureElement element, such as IfcBuilding, IfcBuildingStorey, or IfcSpace that the element exists in. - :type relating_structure: ifcopenshell.entity_instance.entity_instance + :type relating_structure: ifcopenshell.entity_instance :return: The IfcRelReferencedInSpatialStructure relationship instance or `None` if `products` was an empty list. :rtype: Union[ifcopenshell.entity_instance, None] diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py index f7c831b9fd..d1418d3be5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py @@ -26,7 +26,7 @@ class Usecase: """Unassigns a container from products. :param product: A list of IfcProducts to remove the containment from. - :type product: list[ifcopenshell.entity_instance.entity_instance] + :type product: list[ifcopenshell.entity_instance] :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py index 9bf5888622..faf1daf366 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py @@ -51,12 +51,12 @@ class Usecase: :type global_or_local: str :param applied_load: The IfcStructuralLoad that is applied in this activity. - :type applied_load: ifcopenshell.entity_instance.entity_instance + :type applied_load: ifcopenshell.entity_instance :param structural_member: The IfcStructuralMember that the load is applied to. - :type structural_member: ifcopenshell.entity_instance.entity_instance + :type structural_member: ifcopenshell.entity_instance :return: The newly created entity based on the ifc_class - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ self.file = file self.settings = { diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py index 97e85464b8..39181f9a4c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py @@ -31,7 +31,7 @@ class Usecase: A 3D analytical model is assumed. :return: The newly created IfcStructuralAnalysisModel - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py index 701274f992..1cd9dfef9f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py @@ -31,13 +31,13 @@ class Usecase: condition to. This will determine the type of condition that is created. If no connection is supplied, an orphan boundary condition will be created using the ifc_class that you specify. - :type connection: ifcopenshell.entity_instance.entity_instance,optional + :type connection: ifcopenshell.entity_instance,optional :param ifc_class: The class of IfcBoundaryCondition to create, only relevant if you do not specify a connection and want to create an orphaned boundary condition. :type ifc_class: str,optional :return: The newly created IfcBoundaryCondition - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py index c7d73bef6f..6d51d7dc22 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py @@ -34,7 +34,7 @@ class Usecase: :type ifc_class: str :return: The newly created load entity, depending on the ifc_class specified. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py index 6cab9bcb45..afc4e676db 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py @@ -35,7 +35,7 @@ class Usecase: IfcActionSourceTypeEnum in the IFC documentation. :type action_source: str :return: The new IfcStructuralLoadCase - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ self.file = file self.settings = { diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py index 2758b1d589..497977fe6e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py @@ -35,7 +35,7 @@ class Usecase: IfcActionSourceTypeEnum in the IFC documentation. :type action_source: str :return: The new IfcStructuralLoadCase - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ self.file = file self.settings = { diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py index 2cb2b7a722..eda5fc96c2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py @@ -26,12 +26,12 @@ class Usecase: :param relating_structural_member: The IfcStructuralMember to have a connection added to it. - :type relating_structural_member: ifcopenshell.entity_instance.entity_instance + :type relating_structural_member: ifcopenshell.entity_instance :param related_structural_connection: The IfcStructuralConnection to add to the IfcStructuralMember. - :type related_structural_connection: ifcopenshell.entity_instance.entity_instance + :type related_structural_connection: ifcopenshell.entity_instance :return: The IfcRelConnectsStructuralMember relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ self.file = file self.settings = { diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py index b0db0356be..61f771c982 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py @@ -25,12 +25,12 @@ class Usecase: """Assigns a load or structural member to an analysis model :param product: The structural element that is part of the analysis. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :param structural_analysis_model: The IfcStructuralAnalysisModel that the structural element is related to. - :type structural_analysis_model: ifcopenshell.entity_instance.entity_instance + :type structural_analysis_model: ifcopenshell.entity_instance :return: The IfcRelAssignsToGroup relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ self.file = file self.settings = { diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py index 354196946d..39c46f6fe7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py @@ -25,7 +25,7 @@ class Usecase: IfcStructuralAnalysisModel, consult the IFC documentation. :param structural_analysis_model: The IfcStructuralAnalysisModel entity you want to edit - :type structural_analysis_model: ifcopenshell.entity_instance.entity_instance + :type structural_analysis_model: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py index d7822f80cf..e6814c5242 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py @@ -25,7 +25,7 @@ class Usecase: IfcBoundaryCondition, consult the IFC documentation. :param condition: The IfcBoundaryCondition entity you want to edit - :type condition: ifcopenshell.entity_instance.entity_instance + :type condition: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py index 39ab992b05..a66bbb989e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py @@ -22,7 +22,7 @@ class Usecase: """Edits the coordinate system of a structural connection :param structural_item: The IfcStructuralItem you want to modify. - :type structural_item: ifcopenshell.entity_instance.entity_instance + :type structural_item: ifcopenshell.entity_instance :param axis: The unit Z axis vector defined as a list of 3 floats. Defaults to [0., 0., 1.]. :type axis: list[float] diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py index e255ca6e2b..ec4b163aca 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py @@ -22,7 +22,7 @@ class Usecase: """Edits the coordinate system of a structural connection :param structural_item: The IfcStructuralItem you want to modify. - :type structural_item: ifcopenshell.entity_instance.entity_instance + :type structural_item: ifcopenshell.entity_instance :param axis: The unit Z axis vector defined as a list of 3 floats. Defaults to [0., 0., 1.]. :type axis: list[float] diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py index 2b13795b17..3adba0ade9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py @@ -25,7 +25,7 @@ class Usecase: IfcStructuralLoad, consult the IFC documentation. :param structural_load: The IfcStructuralLoad entity you want to edit - :type structural_load: ifcopenshell.entity_instance.entity_instance + :type structural_load: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py index 0d0985accc..cffce454bf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py @@ -25,7 +25,7 @@ class Usecase: IfcStructuralLoadCase, consult the IFC documentation. :param load_case: The IfcStructuralLoadCase entity you want to edit - :type load_case: ifcopenshell.entity_instance.entity_instance + :type load_case: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py index b4148687aa..4ebff6cc3d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py @@ -28,7 +28,7 @@ class Usecase: :param structural_analysis_model: The IfcStructuralAnalysisModel to remove. - :type structural_analysis_model: ifcopenshell.entity_instance.entity_instance + :type structural_analysis_model: ifcopenshell.entity_instance :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py index f0e7b0b33f..02cfb79e3c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py @@ -23,9 +23,9 @@ class Usecase: :param connection: The IfcStructuralConnection to remove the condition from. If omitted, it is assumed to be an orphaned condition. - :type connection: ifcopenshell.entity_instance.entity_instance,optional + :type connection: ifcopenshell.entity_instance,optional :param boundary_condition: The IfcBoundaryCondition to remove. - :type boundary_condition: ifcopenshell.entity_instance.entity_instance + :type boundary_condition: ifcopenshell.entity_instance :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py index a09618575f..28ce9fc4c9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py @@ -28,7 +28,7 @@ class Usecase: The condition and the member itself is preserved. :param relation: The IfcRelConnectsStructuralMember to remove. - :type relation: ifcopenshell.entity_instance.entity_instance + :type relation: ifcopenshell.entity_instance :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py index 1bdecdae4e..55b83a7f1b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py @@ -22,7 +22,7 @@ class Usecase: """Removes a structural load :param structural_load: The IfcStructuralLoad to remove. - :type structural_load: ifcopenshell.entity_instance.entity_instance + :type structural_load: ifcopenshell.entity_instance :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py index c9aa1b2c5d..e331309239 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py @@ -26,7 +26,7 @@ class Usecase: """Removes a structural load case :param load_case: The IfcStructuralLoadCase to remove. - :type load_case: ifcopenshell.entity_instance.entity_instance + :type load_case: ifcopenshell.entity_instance :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py index 937af21bca..93500aba1b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py @@ -26,7 +26,7 @@ class Usecase: """Removes a structural load group :param load_group: The IfcStructuralLoadGroup to remove. - :type load_group: ifcopenshell.entity_instance.entity_instance + :type load_group: ifcopenshell.entity_instance :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py index 0dd7bf8ca4..5a86a6a9f3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py @@ -26,10 +26,10 @@ class Usecase: """Removes a relationship between a structural element and the analysis model :param product: The structural element that is part of the analysis. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :param structural_analysis_model: The IfcStructuralAnalysisModel that the structural element is related to. - :type structural_analysis_model: ifcopenshell.entity_instance.entity_instance + :type structural_analysis_model: ifcopenshell.entity_instance :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py index 575548287b..650043039f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py @@ -46,7 +46,7 @@ class Usecase: :type ifc_class: str :return: The newly created style element, based on the provided ifc_class. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py index f3d97946f8..32064811f9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py @@ -68,7 +68,7 @@ class Usecase: :param style: The IfcSurfaceStyle you want to add to presentation item to. See ifcopenshell.api.style.add_style. - :type style: ifcopenshell.entity_instance.entity_instance + :type style: ifcopenshell.entity_instance :param ifc_class: Choose from IfcSurfaceStyleShading, IfcSurfaceStyleRendering, IfcSurfaceStyleWithTextures, IfcSurfaceStyleLighting, IfcSurfaceStyleReflectance, or @@ -78,7 +78,7 @@ class Usecase: :type attributes: dict, optional :return: The newly created presentation item based on the provided ifc_class. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py index 70a0da1e45..88aabfe801 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py @@ -31,7 +31,7 @@ class Usecase: :param uv_maps: A list of IfcIndexedTextureMap for any IfcTessellatedFaceSets that the representation has, obtained from the HasTextures attribute. - :type uv_maps: list[ifcopenshell.entity_instance.entity_instance] + :type uv_maps: list[ifcopenshell.entity_instance] :param textures: A list of dictionaries containing: 1. Attributes to create IfcImageTexture. @@ -47,7 +47,7 @@ class Usecase: based on camera position) :type textures: list[dict] :return: A list of IfcImageTexture - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] """ # TODO: This usecase currently depends on Blender's data model self.file = file diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py index 11a82097a6..06d3a6339a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py @@ -32,14 +32,14 @@ class Usecase: to materials. This API function provides that capability. :param material: The IfcMaterial which you want to assign the style to. - :type material: ifcopenshell.entity_instance.entity_instance + :type material: ifcopenshell.entity_instance :param style: The IfcPresentationStyle (typically IfcSurfaceStyle) that you want to assign to the material. This will then be applied to all objects that have that material. - :type style: ifcopenshell.entity_instance.entity_instance + :type style: ifcopenshell.entity_instance :param context: The IfcGeometricRepresentationSubContext at which this style should be used. Typically this is the Model BODY context. - :type context: ifcopenshell.entity_instance.entity_instance + :type context: ifcopenshell.entity_instance :param should_use_presentation_style_assignment: This is a technical detail to accomodate a bug in Revit. This should always be left as the default of False, unless you are finding that colours aren't diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py b/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py index 860abc83db..c6236c8a4a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py @@ -42,12 +42,12 @@ class Usecase: :param shape_representation: The IfcShapeRepresentation of the object that you want to assign styles to. This implicitly defines the context at which the styles should be used. - :type shape_representation: ifcopenshell.entity_instance.entity_instance + :type shape_representation: ifcopenshell.entity_instance :param styles: A list of presentation styles, typically IfcSurfaceStyle. The number of items in the list should correlate with the number of items in the shape_representation's Items attribute. If you have more items than styles, the last style is used. - :type styles: list[ifcopenshell.entity_instance.entity_instance] + :type styles: list[ifcopenshell.entity_instance] :param replace_previous_same_type_style: Remove previously assigned styles of the same type as currently assign style`. Defaults to `True`. :type replace_previous_same_type_style: bool @@ -58,7 +58,7 @@ class Usecase: that this is no longer a valid IFC. Blame Autodesk. :type should_use_presentation_style_assignment: bool :return: List of created IfcStyledItems - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py index 7c928e294f..877d0f89c2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py @@ -25,7 +25,7 @@ class Usecase: IfcPresentationStyle, consult the IFC documentation. :param style: The IfcPresentationStyle entity you want to edit - :type style: ifcopenshell.entity_instance.entity_instance + :type style: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py index 9031db5dd5..20c1002fdf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py @@ -33,7 +33,7 @@ class Usecase: example below. :param style: The IfcPresentationStyle entity you want to edit - :type style: ifcopenshell.entity_instance.entity_instance + :type style: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py index c9c9c76a95..40692982bb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py @@ -26,7 +26,7 @@ class Usecase: All of the presentation items of the style will also be removed. :param style: The IfcPresentationStyle to remove. - :type style: ifcopenshell.entity_instance.entity_instance + :type style: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py index 4381f91a4b..ab061e182c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py @@ -25,7 +25,7 @@ class Usecase: removes the representation but not the underlying styles. :param representation: The IfcStyledRepresentation to remove. - :type representation: ifcopenshell.entity_instance.entity_instance + :type representation: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py index 5e17b2b06d..ce214dbf21 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py @@ -25,7 +25,7 @@ class Usecase: """Removes a presentation item from a presentation style :param style: The IfcPresentationItem to remove. - :type style: ifcopenshell.entity_instance.entity_instance + :type style: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py index 674e5eb7f0..f1e2e7e85b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py @@ -27,14 +27,14 @@ class Usecase: This does the inverse of assign_material_style. :param material: The IfcMaterial which you want to unassign the style from. - :type material: ifcopenshell.entity_instance.entity_instance + :type material: ifcopenshell.entity_instance :param style: The IfcPresentationStyle (typically IfcSurfaceStyle) that you want to unassign from material. This will then be applied to all objects that have that material. - :type style: ifcopenshell.entity_instance.entity_instance + :type style: ifcopenshell.entity_instance :param context: The IfcGeometricRepresentationSubContext at which this style should be unassigned. Typically this is the Model BODY context. - :type context: ifcopenshell.entity_instance.entity_instance + :type context: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py index 6211a9f4dd..83f60fe3d4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py @@ -25,12 +25,12 @@ class Usecase: :param shape_representation: The IfcShapeRepresentation of the object that you want to unassign styles from. - :type shape_representation: ifcopenshell.entity_instance.entity_instance + :type shape_representation: ifcopenshell.entity_instance :param styles: A list of presentation styles, typically IfcSurfaceStyle. The number of items in the list should correlate with the number of items in the shape_representation's Items attribute. If you have more items than styles, the last style is used. - :type styles: list[ifcopenshell.entity_instance.entity_instance] + :type styles: list[ifcopenshell.entity_instance] :param should_use_presentation_style_assignment: This is a technical detail to accomodate a bug in Revit. This should always be left as the default of False, unless you are finding that colours aren't diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py index d0512c3cd3..f792ecc2fa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py @@ -35,9 +35,9 @@ class Usecase: :param element: The IfcDistributionElement you want to add a distribution port to. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The newly created IfcDistributionPort - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py index 0fdf9992d7..26c8cfe8fc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py @@ -36,7 +36,7 @@ class Usecase: IfcSystem. :type ifc_class: str :return: The newly created IfcSystem. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py index 4517a42421..aae80ab6eb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py @@ -29,12 +29,12 @@ class Usecase: :param related_flow_control: IfcDistributionControlElement which may be used to impart control on the flow element - :type related_flow_control: ifcopenshell.entity_instance.entity_instance + :type related_flow_control: ifcopenshell.entity_instance :param relating_flow_element: The IfcDistributionFlowElement that is being controlled / sensed - :type relating_flow_element: ifcopenshell.entity_instance.entity_instance + :type relating_flow_element: ifcopenshell.entity_instance :return: Matching or newly created IfcRelFlowControlElements. If control is already assigned to some other element method will return None. - :rtype: ifcopenshell.entity_instance.entity_instance, None + :rtype: ifcopenshell.entity_instance, None Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py index 91a1ce91be..728a935395 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py @@ -30,12 +30,12 @@ class Usecase: it may be useful when patching up models. :param element: The IfcDistributionElement to assign the port to. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :param port: The IfcDistributionPort you want to assign. - :type port: ifcopenshell.entity_instance.entity_instance + :type port: ifcopenshell.entity_instance :return: The IfcRelNests relationship, or the IfcRelConnectsPortToElement for IFC2X3. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_system.py index 3df49d776d..20f5a8519f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_system.py @@ -33,12 +33,12 @@ class Usecase: Note that it is not necessary to assign distribution ports to a system. :param products: The list of IfcDistributionElements to assign to the system. - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param system: The IfcSystem you want to assign the element to. - :type system: ifcopenshell.entity_instance.entity_instance + :type system: ifcopenshell.entity_instance :return: The IfcRelAssignsToGroup relationship or `None` if `products` was empty list. - :rtype: [ifcopenshell.entity_instance.entity_instance, None] + :rtype: [ifcopenshell.entity_instance, None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py index 4d0b75e8a6..7d23dde1a7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py @@ -45,9 +45,9 @@ class Usecase: and implicit connectivity is preferred for early phase design. :param port1: The port of the first distribution element to connect. - :type port1: ifcopenshell.entity_instance.entity_instance + :type port1: ifcopenshell.entity_instance :param port2: The port of the second distribution element to connect. - :type port2: ifcopenshell.entity_instance.entity_instance + :type port2: ifcopenshell.entity_instance :param direction: The directionality of distribution flow through the port connection. NOTDEFINED means that the direction has not yet been determined. This is useful during preliminary system design. @@ -61,7 +61,7 @@ class Usecase: connectivity is made, such as a segment or fitting. This is only to be used for implicit port connectivity where the segments and fittings are less important. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py index 12d48af4b2..071074e9e7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py @@ -29,7 +29,7 @@ class Usecase: needed to be specified. :param port: The IfcDistributionPort to disconnect. - :type port: ifcopenshell.entity_instance.entity_instance + :type port: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py index fefdfa0f58..315c04ccd5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py @@ -25,7 +25,7 @@ class Usecase: IfcSystem, consult the IFC documentation. :param system: The IfcSystem entity you want to edit - :type system: ifcopenshell.entity_instance.entity_instance + :type system: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py index f4cfe0e2d3..f331a5f3e3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py @@ -28,7 +28,7 @@ class Usecase: All the distribution elements within the system are retained. :param system: The IfcSystem to remove. - :type system: ifcopenshell.entity_instance.entity_instance + :type system: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py index 3ed1fe4cd5..04eda27f83 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py @@ -27,12 +27,12 @@ class Usecase: :param related_flow_control: IfcDistributionControlElement controling the flow element - :type related_flow_control: ifcopenshell.entity_instance.entity_instance + :type related_flow_control: ifcopenshell.entity_instance :param relating_flow_element: The IfcDistributionFlowElement that is being controlled - :type relating_flow_element: ifcopenshell.entity_instance.entity_instance + :type relating_flow_element: ifcopenshell.entity_instance :return: If the control still is related to other objects, the IfcRelFlowControlElements is returned, otherwise None. - :rtype: ifcopenshell.entity_instance.entity_instance, None + :rtype: ifcopenshell.entity_instance, None Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py index 81c8751945..e9d82722aa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py @@ -29,9 +29,9 @@ class Usecase: port for cleaning or patchin purposes. :param element: The IfcDistributionElement to unassign the port from. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :param port: The IfcDistributionPort you want to unassign. - :type port: ifcopenshell.entity_instance.entity_instance + :type port: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py index b402407038..fbc3dd854b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py @@ -31,9 +31,9 @@ class Usecase: """Unassigns list of products from a system :param products: The list of IfcDistributionElements to unassign from the system. - :type products: list[ifcopenshell.entity_instance.entity_instance] + :type products: list[ifcopenshell.entity_instance] :param system: The IfcSystem you want to unassign the element from. - :type system: ifcopenshell.entity_instance.entity_instance + :type system: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py b/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py index 68da4c0da5..b8d7cf357a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py @@ -91,9 +91,9 @@ class Usecase: ambiguous, unknown or are so bespoke as to have no logical type. :param related_objects: The IfcElement occurrences. - :type related_objects: list[ifcopenshell.entity_instance.entity_instance] + :type related_objects: list[ifcopenshell.entity_instance] :param relating_type: The IfcElementType type. - :type relating_type: ifcopenshell.entity_instance.entity_instance + :type relating_type: ifcopenshell.entity_instance :param should_map_representations: If a type has a representation map, IFC requires all occurrences to map those representations. Some IFC vendors might disobey this, or you might want to handle it @@ -102,7 +102,7 @@ class Usecase: :type should_map_representations: bool :return: The IfcRelDefinesByType relationship or `None` if `related_objects` was empty list. - :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] + :rtype: Union[ifcopenshell.entity_instance, None] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py b/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py index 2e8d562fbf..0a05de4118 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py @@ -28,11 +28,11 @@ class Usecase: ifcopenshell.util.element.get_types instead. :param related_object: The IfcElement occurrence. - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :param relating_type: The IfcElementType type. - :type relating_type: ifcopenshell.entity_instance.entity_instance + :type relating_type: ifcopenshell.entity_instance :return: A list of occurrences of the type. - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] """ self.file = file self.settings = { diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py b/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py index 180e163477..064fb148bb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py @@ -35,9 +35,9 @@ class Usecase: be used to ensure consistency of the occurrence's representations. :param related_object: The IfcElement occurrence. - :type related_object: ifcopenshell.entity_instance.entity_instance + :type related_object: ifcopenshell.entity_instance :param relating_type: The IfcElementType type. - :type relating_type: ifcopenshell.entity_instance.entity_instance + :type relating_type: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py b/src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py index c376a58971..a629100477 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py @@ -29,7 +29,7 @@ class Usecase: and material usages associated with the previously assigned type. :param related_objects: List of IfcElement occurrences. - :type related_objects: list[ifcopenshell.entity_instance.entity_instance] + :type related_objects: list[ifcopenshell.entity_instance] :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py index 631daaa99d..a0d705a94b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py @@ -43,7 +43,7 @@ class Usecase: recommended to leave this as the default of (0, 0, 0, 0, 0, 0, 0). :type dimensions: list[int] :return: The new IfcContextDependentUnit - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py index 3102a482fa..20b96d3298 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py @@ -45,7 +45,7 @@ class Usecase: :type conversion_offset: float, optional :return: The new IfcConversionBasedUnit or IfcConversionBasedUnitWithOffset - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py index fb15af4cd5..f15b18ab91 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py @@ -28,7 +28,7 @@ class Usecase: :param currency: The currency code :type currency: str :return: The newly created IfcMonetaryUnit - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py index bd0cd26e39..7eb8019632 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py @@ -44,7 +44,7 @@ class Usecase: prefix. :type prefix: str,optional :return: The newly created IfcSIUnit - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py index bca68744d7..67305295bd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py @@ -44,9 +44,9 @@ class Usecase: :param units: A list of units to assign as project defaults. See ifcopenshell.api.unit.add_si_unit, unit.add_conversion_based_unit, and unit.add_monetary_unit for information on how to create units. - :type units: list[ifcopenshell.entity_instance.entity_instance],optional + :type units: list[ifcopenshell.entity_instance],optional :return: The IfcUnitAssignment element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py index d3a3c47fe5..636430159c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py @@ -25,7 +25,7 @@ class Usecase: IfcDerivedUnit, consult the IFC documentation. :param unit: The IfcDerivedUnit entity you want to edit - :type unit: ifcopenshell.entity_instance.entity_instance + :type unit: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py index 9f27e20d96..aee4b89305 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py @@ -25,7 +25,7 @@ class Usecase: IfcMonetaryUnit, consult the IFC documentation. :param unit: The IfcMonetaryUnit entity you want to edit - :type unit: ifcopenshell.entity_instance.entity_instance + :type unit: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py index c4652ba55a..da4ff5290f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py @@ -28,7 +28,7 @@ class Usecase: IfcNamedUnit, consult the IFC documentation. :param unit: The IfcNamedUnit entity you want to edit - :type unit: ifcopenshell.entity_instance.entity_instance + :type unit: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. :type attributes: dict, optional :return: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py index 361cfbd0c3..ba9aff862b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py @@ -28,7 +28,7 @@ class Usecase: defined quantities in the model completely lose their meaning. :param unit: The unit element to remove - :type unit: ifcopenshell.entity_instance.entity_instance + :type unit: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py index fb1dcafb02..2da27bd08c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py @@ -24,7 +24,7 @@ class Usecase: """Unassigns units as default units for the project :param units: A list of units to assign as project defaults. - :type units: list[ifcopenshell.entity_instance.entity_instance],optional + :type units: list[ifcopenshell.entity_instance],optional :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py index b457ab5d3a..a2867450f6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py @@ -31,11 +31,11 @@ class Usecase: filled. :param opening: The IfcOpeningElement to fill with the element. - :type opening: ifcopenshell.entity_instance.entity_instance + :type opening: ifcopenshell.entity_instance :param element: The IfcElement to be inserted into the opening. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The new IfcRelFillsElement relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py index 3a260a08f7..142eaedd87 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py @@ -51,11 +51,11 @@ class Usecase: booleaned or be part of the shape of the object). :param opening: The IfcOpeningElement to cut out the element. - :type opening: ifcopenshell.entity_instance.entity_instance + :type opening: ifcopenshell.entity_instance :param element: The IfcElement to insert the opening into. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The new IfcRelVoidsElement relationship - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py b/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py index d277960a5f..6d5ab79752 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py @@ -29,7 +29,7 @@ class Usecase: fills the opening. :param element: The element filling an opening. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py index 3735d2e735..5ffba93e25 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py @@ -29,7 +29,7 @@ class Usecase: removed, the opening is also removed. :param opening: The IfcOpeningElement to remove. - :type opening: ifcopenshell.entity_instance.entity_instance + :type opening: ifcopenshell.entity_instance :return: None :rtype: None From 34bbc8f1ead3bcd22b2b364ffdb14770812cbec9 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sun, 5 May 2024 19:20:13 -0500 Subject: [PATCH 089/429] for 'Add Fitting' changed the hot key from Shift+F to Shift+Y. per https://community.osarch.org/discussion/2124/ui-discussion-around-add-fitting-and-add-bend Also added Shift+F (bim.flip_object) to all profile-based objects --- .../blenderbim/bim/module/model/workspace.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index c1c62f95ce..324bf42e29 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -378,6 +378,7 @@ class BimToolUI: op.depth = cls.props.extrusion_depth add_layout_hotkey_operator(cls.layout, "Extend", "S_E", "") + add_layout_hotkey_operator(cls.layout, "Flip", "S_F", bpy.ops.bim.flip_object.__doc__) if AuthoringData.data["active_class"] in ( "IfcCableCarrierSegment", @@ -385,8 +386,8 @@ class BimToolUI: "IfcDuctSegment", "IfcPipeSegment", ): - add_layout_hotkey_operator(cls.layout, "Add Fitting", "S_F", "") + add_layout_hotkey_operator(cls.layout, "Add Fitting", "S_Y", "") if context.region.type != "TOOL_HEADER": cls.layout.operator("bim.mep_add_bend") cls.layout.operator("bim.mep_add_transition") @@ -394,7 +395,6 @@ class BimToolUI: else: add_layout_hotkey_operator(cls.layout, "Edit Axis", "A_E", "") - add_layout_hotkey_operator(cls.layout, "Flip", "S_F", bpy.ops.bim.flip_object.__doc__) add_layout_hotkey_operator(cls.layout, "Butt", "S_T", "") add_layout_hotkey_operator(cls.layout, "Mitre", "S_Y", "") add_layout_hotkey_operator(cls.layout, "Rotate 90", "S_R", bpy.ops.bim.rotate_90.__doc__) @@ -719,10 +719,9 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.bim.flip_wall() elif self.active_class in ("IfcWindow", "IfcWindowStandardCase", "IfcDoor", "IfcDoorStandardCase"): bpy.ops.bim.flip_fill() - elif self.active_class in ("IfcBeam", "IfcColumn"): + elif self.active_material_usage == "PROFILE": bpy.ops.bim.flip_object(flip_local_axes="XZ") - elif self.active_class in ("IfcDuctSegment", "IfcPipeSegment", "IfcCableCarrierSegment", "IfcCableSegment"): - bpy.ops.bim.fit_flow_segments() + def hotkey_S_G(self): obj = bpy.context.active_object @@ -808,9 +807,12 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator): return if self.active_material_usage == "LAYER2": bpy.ops.bim.join_wall(join_type="V") + elif self.active_class in ("IfcDuctSegment", "IfcPipeSegment", "IfcCableCarrierSegment", "IfcCableSegment"): + bpy.ops.bim.fit_flow_segments() elif self.active_material_usage == "PROFILE": bpy.ops.bim.extend_profile(join_type="V") + def hotkey_S_B(self): bpy.ops.bim.add_boundary() From 10f894e2ea2fac53431842e2be69680440c717c9 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sun, 5 May 2024 20:46:07 -0500 Subject: [PATCH 090/429] Find the "Types" Collection regardless of the IfcProject.Name --- .../blenderbim/bim/module/type/operator.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/type/operator.py b/src/blenderbim/blenderbim/bim/module/type/operator.py index f5f08c35b3..820c197eb9 100644 --- a/src/blenderbim/blenderbim/bim/module/type/operator.py +++ b/src/blenderbim/blenderbim/bim/module/type/operator.py @@ -157,8 +157,9 @@ class SelectType(bpy.types.Operator): selected_objs.append(active_obj) #update selected_objs so the active_obj is at the end of the list last_relating_type_obj = None + types_collection_in_view_layer = self.find_collection_in_ifcproject(context, collection_name = "Types") + types_collection_in_view_layer.hide_viewport = False types_collection = bpy.data.collections.get("Types") - context.view_layer.layer_collection.children['IfcProject/My Project'].children["Types"].hide_viewport = False for type_obj in types_collection.objects: type_obj.hide_set(True) for obj in selected_objs: @@ -175,9 +176,21 @@ class SelectType(bpy.types.Operator): obj.select_set(False) context.view_layer.objects.active = last_relating_type_obj #makes the active_obj's type the active object - + return {"FINISHED"} + def find_collection_in_ifcproject(self, context, collection_name): + + ifc_project_collection = None + for child in context.view_layer.layer_collection.children: + if "IfcProject" in child.name: + ifc_project_collection = child + break + + if ifc_project_collection: + collection_in_view_layer = ifc_project_collection.children.get(collection_name) + return collection_in_view_layer + class SelectSimilarType(bpy.types.Operator): bl_idname = "bim.select_similar_type" From d11ec671290ccdd6c3022925bd817e91c857b8d1 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 6 May 2024 14:35:39 +1000 Subject: [PATCH 091/429] Generate functions for all API usecases for better static code features. See #2693. --- .../ifcopenshell/api/aggregate/__init__.py | 3 + .../api/aggregate/assign_object.py | 236 ++++++----- .../api/aggregate/unassign_object.py | 93 +++-- .../ifcopenshell/api/attribute/__init__.py | 2 + .../api/attribute/edit_attributes.py | 95 ++--- .../ifcopenshell/api/boundary/__init__.py | 5 + .../boundary/assign_connection_geometry.py | 134 ++++--- .../api/boundary/copy_boundary.py | 39 +- .../api/boundary/edit_attributes.py | 82 ++-- .../api/boundary/remove_boundary.py | 51 ++- .../api/classification/__init__.py | 7 + .../api/classification/add_classification.py | 125 +++--- .../api/classification/add_reference.py | 222 +++++------ .../api/classification/edit_classification.py | 43 +- .../api/classification/edit_reference.py | 43 +- .../classification/remove_classification.py | 49 +-- .../api/classification/remove_reference.py | 175 ++++----- .../ifcopenshell/api/constraint/__init__.py | 10 + .../ifcopenshell/api/constraint/add_metric.py | 67 ++-- .../api/constraint/add_metric_reference.py | 46 ++- .../api/constraint/add_objective.py | 47 ++- .../api/constraint/assign_constraint.py | 66 ++-- .../api/constraint/edit_metric.py | 45 +-- .../api/constraint/edit_objective.py | 41 +- .../api/constraint/remove_constraint.py | 51 ++- .../api/constraint/remove_metric.py | 51 +-- .../api/constraint/unassign_constraint.py | 50 +-- .../ifcopenshell/api/context/__init__.py | 4 + .../ifcopenshell/api/context/add_context.py | 325 +++++++-------- .../ifcopenshell/api/context/edit_context.py | 51 ++- .../api/context/remove_context.py | 73 ++-- .../ifcopenshell/api/control/__init__.py | 3 + .../api/control/assign_control.py | 142 ++++--- .../api/control/unassign_control.py | 85 ++-- .../ifcopenshell/api/cost/__init__.py | 20 + .../ifcopenshell/api/cost/add_cost_item.py | 83 ++-- .../api/cost/add_cost_item_quantity.py | 113 +++--- .../api/cost/add_cost_schedule.py | 71 ++-- .../ifcopenshell/api/cost/add_cost_value.py | 151 ++++--- .../api/cost/assign_cost_item_quantity.py | 141 ++++--- .../api/cost/assign_cost_value.py | 93 +++-- .../calculate_cost_item_resource_value.py | 163 ++++---- .../ifcopenshell/api/cost/copy_cost_item.py | 59 +-- .../api/cost/copy_cost_item_values.py | 65 ++- .../ifcopenshell/api/cost/edit_cost_item.py | 41 +- .../api/cost/edit_cost_item_quantity.py | 55 ++- .../api/cost/edit_cost_schedule.py | 41 +- .../ifcopenshell/api/cost/edit_cost_value.py | 73 ++-- .../api/cost/edit_cost_value_formula.py | 63 +-- .../ifcopenshell/api/cost/remove_cost_item.py | 71 ++-- .../api/cost/remove_cost_item_quantity.py | 59 ++- .../api/cost/remove_cost_schedule.py | 59 ++- .../api/cost/remove_cost_value.py | 77 ++-- .../api/cost/unassign_cost_item_quantity.py | 101 ++--- .../ifcopenshell/api/document/__init__.py | 9 + .../api/document/add_information.py | 107 +++-- .../api/document/add_reference.py | 95 +++-- .../api/document/assign_document.py | 148 ++++--- .../api/document/edit_information.py | 54 ++- .../api/document/edit_reference.py | 60 ++- .../api/document/remove_information.py | 63 ++- .../api/document/remove_reference.py | 43 +- .../api/document/unassign_document.py | 108 +++-- .../ifcopenshell/api/drawing/__init__.py | 4 + .../api/drawing/assign_product.py | 151 ++++--- .../api/drawing/edit_text_literal.py | 41 +- .../api/drawing/unassign_product.py | 85 ++-- .../ifcopenshell/api/geometry/__init__.py | 27 ++ .../api/geometry/add_axis_representation.py | 119 +++--- .../ifcopenshell/api/geometry/add_boolean.py | 37 +- .../api/geometry/add_door_representation.py | 145 ++++--- .../geometry/add_footprint_representation.py | 29 +- .../api/geometry/add_mesh_representation.py | 39 +- .../geometry/add_profile_representation.py | 33 +- .../geometry/add_railing_representation.py | 67 ++-- .../api/geometry/add_representation.py | 73 ++-- .../api/geometry/add_slab_representation.py | 29 +- .../api/geometry/add_wall_representation.py | 39 +- .../api/geometry/add_window_representation.py | 143 ++++--- .../api/geometry/assign_representation.py | 15 +- .../api/geometry/connect_element.py | 67 ++-- .../ifcopenshell/api/geometry/connect_path.py | 131 +++---- .../api/geometry/create_2pt_wall.py | 37 +- .../api/geometry/disconnect_element.py | 55 ++- .../api/geometry/disconnect_path.py | 63 ++- .../api/geometry/edit_object_placement.py | 36 +- .../api/geometry/map_representation.py | 17 +- .../api/geometry/remove_boolean.py | 15 +- .../api/geometry/remove_representation.py | 101 +++-- .../api/geometry/unassign_representation.py | 15 +- .../ifcopenshell/api/georeference/__init__.py | 4 + .../api/georeference/add_georeferencing.py | 73 ++-- .../api/georeference/edit_georeferencing.py | 143 +++---- .../api/georeference/remove_georeferencing.py | 39 +- .../ifcopenshell/api/grid/__init__.py | 4 + .../api/grid/create_axis_curve.py | 81 ++-- .../ifcopenshell/api/grid/create_grid_axis.py | 113 +++--- .../ifcopenshell/api/grid/remove_grid_axis.py | 51 ++- .../ifcopenshell/api/group/__init__.py | 7 + .../ifcopenshell/api/group/add_group.py | 67 ++-- .../ifcopenshell/api/group/assign_group.py | 87 ++-- .../ifcopenshell/api/group/edit_group.py | 41 +- .../ifcopenshell/api/group/remove_group.py | 85 ++-- .../ifcopenshell/api/group/unassign_group.py | 75 ++-- .../api/group/update_group_products.py | 79 ++-- .../ifcopenshell/api/layer/__init__.py | 6 + .../ifcopenshell/api/layer/add_layer.py | 43 +- .../ifcopenshell/api/layer/assign_layer.py | 101 +++-- .../ifcopenshell/api/layer/edit_layer.py | 41 +- .../ifcopenshell/api/layer/remove_layer.py | 33 +- .../ifcopenshell/api/layer/unassign_layer.py | 105 +++-- .../ifcopenshell/api/library/__init__.py | 9 + .../ifcopenshell/api/library/add_library.py | 69 ++-- .../ifcopenshell/api/library/add_reference.py | 71 ++-- .../api/library/assign_reference.py | 123 +++--- .../ifcopenshell/api/library/edit_library.py | 41 +- .../api/library/edit_reference.py | 45 +-- .../api/library/remove_library.py | 49 ++- .../api/library/remove_reference.py | 47 ++- .../api/library/unassign_reference.py | 102 +++-- .../ifcopenshell/api/material/__init__.py | 25 ++ .../api/material/add_constituent.py | 119 +++--- .../ifcopenshell/api/material/add_layer.py | 117 +++--- .../api/material/add_list_item.py | 107 +++-- .../ifcopenshell/api/material/add_material.py | 97 +++-- .../api/material/add_material_set.py | 159 ++++---- .../ifcopenshell/api/material/add_profile.py | 136 ++++--- .../api/material/assign_material.py | 254 ++++++------ .../api/material/assign_profile.py | 145 +++---- .../api/material/copy_material.py | 67 ++-- .../api/material/edit_assigned_material.py | 41 +- .../api/material/edit_constituent.py | 75 ++-- .../ifcopenshell/api/material/edit_layer.py | 77 ++-- .../api/material/edit_layer_usage.py | 97 +++-- .../api/material/edit_material.py | 15 +- .../ifcopenshell/api/material/edit_profile.py | 115 +++--- .../api/material/edit_profile_usage.py | 147 +++---- .../api/material/remove_constituent.py | 57 ++- .../ifcopenshell/api/material/remove_layer.py | 63 ++- .../api/material/remove_list_item.py | 61 ++- .../api/material/remove_material.py | 91 +++-- .../api/material/remove_material_set.py | 101 +++-- .../api/material/remove_profile.py | 83 ++-- .../api/material/reorder_set_item.py | 85 ++-- .../api/material/unassign_material.py | 71 ++-- .../ifcopenshell/api/nest/__init__.py | 5 + .../ifcopenshell/api/nest/assign_object.py | 260 ++++++------ .../ifcopenshell/api/nest/change_nest.py | 47 ++- .../ifcopenshell/api/nest/reorder_nesting.py | 29 +- .../ifcopenshell/api/nest/unassign_object.py | 89 ++--- .../ifcopenshell/api/owner/__init__.py | 24 ++ .../ifcopenshell/api/owner/add_actor.py | 71 ++-- .../ifcopenshell/api/owner/add_address.py | 87 ++-- .../ifcopenshell/api/owner/add_application.py | 88 +++-- .../api/owner/add_organisation.py | 57 ++- .../ifcopenshell/api/owner/add_person.py | 72 ++-- .../api/owner/add_person_and_organisation.py | 56 ++- .../ifcopenshell/api/owner/add_role.py | 71 ++-- .../ifcopenshell/api/owner/assign_actor.py | 139 ++++--- .../api/owner/create_owner_history.py | 165 ++++---- .../ifcopenshell/api/owner/edit_actor.py | 55 ++- .../ifcopenshell/api/owner/edit_address.py | 61 ++- .../api/owner/edit_organisation.py | 43 +- .../ifcopenshell/api/owner/edit_person.py | 43 +- .../ifcopenshell/api/owner/edit_role.py | 47 ++- .../ifcopenshell/api/owner/remove_actor.py | 49 ++- .../ifcopenshell/api/owner/remove_address.py | 47 ++- .../api/owner/remove_application.py | 33 +- .../api/owner/remove_organisation.py | 83 ++-- .../ifcopenshell/api/owner/remove_person.py | 81 ++-- .../owner/remove_person_and_organisation.py | 65 ++- .../ifcopenshell/api/owner/remove_role.py | 53 ++- .../ifcopenshell/api/owner/unassign_actor.py | 89 ++--- .../api/owner/update_owner_history.py | 115 +++--- .../ifcopenshell/api/profile/__init__.py | 6 + .../api/profile/add_arbitrary_profile.py | 67 ++-- .../add_arbitrary_profile_with_voids.py | 85 ++-- .../api/profile/add_parameterized_profile.py | 43 +- .../ifcopenshell/api/profile/edit_profile.py | 45 +-- .../api/profile/remove_profile.py | 45 +-- .../ifcopenshell/api/project/__init__.py | 5 + .../ifcopenshell/api/project/append_asset.py | 189 ++++----- .../api/project/assign_declaration.py | 210 +++++----- .../ifcopenshell/api/project/create_file.py | 74 ++-- .../api/project/unassign_declaration.py | 90 ++--- .../ifcopenshell/api/pset/__init__.py | 6 + .../ifcopenshell/api/pset/add_pset.py | 222 +++++------ .../ifcopenshell/api/pset/add_qto.py | 119 +++--- .../ifcopenshell/api/pset/edit_pset.py | 271 ++++++------- .../ifcopenshell/api/pset/edit_qto.py | 183 ++++----- .../ifcopenshell/api/pset/remove_pset.py | 113 +++--- .../api/pset_template/__init__.py | 7 + .../api/pset_template/add_prop_template.py | 160 ++++---- .../api/pset_template/add_pset_template.py | 152 ++++--- .../api/pset_template/edit_prop_template.py | 47 ++- .../api/pset_template/edit_pset_template.py | 45 +-- .../api/pset_template/remove_prop_template.py | 57 ++- .../api/pset_template/remove_pset_template.py | 37 +- .../ifcopenshell/api/resource/__init__.py | 13 + .../ifcopenshell/api/resource/add_resource.py | 172 ++++---- .../api/resource/add_resource_quantity.py | 87 ++-- .../api/resource/add_resource_time.py | 71 ++-- .../api/resource/assign_resource.py | 156 ++++---- .../api/resource/calculate_resource_usage.py | 53 +-- .../api/resource/calculate_resource_work.py | 79 ++-- .../api/resource/edit_resource.py | 43 +- .../api/resource/edit_resource_quantity.py | 63 ++- .../api/resource/edit_resource_time.py | 115 +++--- .../api/resource/remove_resource.py | 123 +++--- .../api/resource/remove_resource_quantity.py | 45 +-- .../api/resource/unassign_resource.py | 98 +++-- .../ifcopenshell/api/root/__init__.py | 5 + .../ifcopenshell/api/root/copy_class.py | 93 ++--- .../ifcopenshell/api/root/create_entity.py | 114 +++--- .../ifcopenshell/api/root/reassign_class.py | 110 +++--- .../ifcopenshell/api/root/remove_product.py | 371 +++++++++--------- .../ifcopenshell/api/sequence/__init__.py | 44 +++ .../ifcopenshell/api/sequence/add_task.py | 318 ++++++++------- .../api/sequence/add_task_time.py | 83 ++-- .../api/sequence/add_time_period.py | 119 +++--- .../api/sequence/add_work_calendar.py | 125 +++--- .../api/sequence/add_work_plan.py | 111 +++--- .../api/sequence/add_work_schedule.py | 188 +++++---- .../api/sequence/add_work_time.py | 105 +++-- .../api/sequence/assign_lag_time.py | 136 +++---- .../api/sequence/assign_process.py | 168 ++++---- .../api/sequence/assign_product.py | 128 +++--- .../api/sequence/assign_recurrence_pattern.py | 167 ++++---- .../api/sequence/assign_sequence.py | 194 +++++---- .../api/sequence/assign_workplan.py | 79 ++-- .../api/sequence/calculate_task_duration.py | 149 ++++--- .../api/sequence/cascade_schedule.py | 245 ++++++------ .../api/sequence/create_baseline.py | 73 ++-- .../api/sequence/duplicate_task.py | 55 +-- .../api/sequence/edit_lag_time.py | 117 +++--- .../api/sequence/edit_recurrence_pattern.py | 67 ++-- .../api/sequence/edit_sequence.py | 81 ++-- .../ifcopenshell/api/sequence/edit_task.py | 53 ++- .../api/sequence/edit_task_time.py | 147 +++---- .../api/sequence/edit_work_calendar.py | 45 +-- .../api/sequence/edit_work_plan.py | 55 ++- .../api/sequence/edit_work_schedule.py | 61 ++- .../api/sequence/edit_work_time.py | 82 ++-- .../api/sequence/get_related_products.py | 93 +++-- .../api/sequence/recalculate_schedule.py | 184 ++++----- .../ifcopenshell/api/sequence/remove_task.py | 209 +++++----- .../api/sequence/remove_time_period.py | 61 ++- .../api/sequence/remove_work_calendar.py | 75 ++-- .../api/sequence/remove_work_plan.py | 57 ++- .../api/sequence/remove_work_schedule.py | 111 +++--- .../api/sequence/remove_work_time.py | 39 +- .../api/sequence/unassign_lag_time.py | 83 ++-- .../api/sequence/unassign_process.py | 89 ++--- .../api/sequence/unassign_product.py | 89 ++--- .../sequence/unassign_recurrence_pattern.py | 53 ++- .../api/sequence/unassign_sequence.py | 79 ++-- .../ifcopenshell/api/spatial/__init__.py | 5 + .../api/spatial/assign_container.py | 262 ++++++------- .../api/spatial/dereference_structure.py | 108 +++-- .../api/spatial/reference_structure.py | 162 ++++---- .../api/spatial/unassign_container.py | 81 ++-- .../ifcopenshell/api/structural/__init__.py | 22 ++ .../api/structural/add_structural_activity.py | 116 +++--- .../add_structural_analysis_model.py | 37 +- .../add_structural_boundary_condition.py | 85 ++-- .../api/structural/add_structural_load.py | 49 ++- .../structural/add_structural_load_case.py | 63 ++- .../structural/add_structural_load_group.py | 63 ++- .../add_structural_member_connection.py | 47 ++- .../assign_structural_analysis_model.py | 61 ++- .../edit_structural_analysis_model.py | 33 +- .../edit_structural_boundary_condition.py | 43 +- .../edit_structural_connection_cs.py | 61 ++- .../structural/edit_structural_item_axis.py | 31 +- .../api/structural/edit_structural_load.py | 31 +- .../structural/edit_structural_load_case.py | 31 +- .../remove_structural_analysis_model.py | 39 +- .../remove_structural_boundary_condition.py | 49 ++- .../remove_structural_connection_condition.py | 41 +- .../api/structural/remove_structural_load.py | 21 +- .../structural/remove_structural_load_case.py | 37 +- .../remove_structural_load_group.py | 41 +- .../unassign_structural_analysis_model.py | 57 ++- .../ifcopenshell/api/style/__init__.py | 13 + .../ifcopenshell/api/style/add_style.py | 71 ++-- .../api/style/add_surface_style.py | 193 +++++---- .../api/style/add_surface_textures.py | 67 ++-- .../api/style/assign_material_style.py | 173 ++++---- .../api/style/assign_representation_styles.py | 184 ++++----- .../api/style/edit_presentation_style.py | 43 +- .../api/style/edit_surface_style.py | 111 +++--- .../ifcopenshell/api/style/remove_style.py | 49 +-- .../api/style/remove_styled_representation.py | 51 ++- .../api/style/remove_surface_style.py | 71 ++-- .../api/style/unassign_material_style.py | 131 +++---- .../style/unassign_representation_styles.py | 77 ++-- .../ifcopenshell/api/system/__init__.py | 13 + .../ifcopenshell/api/system/add_port.py | 63 ++- .../ifcopenshell/api/system/add_system.py | 67 ++-- .../api/system/assign_flow_control.py | 103 +++-- .../ifcopenshell/api/system/assign_port.py | 81 ++-- .../ifcopenshell/api/system/assign_system.py | 72 ++-- .../ifcopenshell/api/system/connect_port.py | 157 ++++---- .../api/system/disconnect_port.py | 93 +++-- .../ifcopenshell/api/system/edit_system.py | 43 +- .../ifcopenshell/api/system/remove_system.py | 87 ++-- .../api/system/unassign_flow_control.py | 91 +++-- .../ifcopenshell/api/system/unassign_port.py | 73 ++-- .../api/system/unassign_system.py | 64 ++- .../ifcopenshell/api/type/__init__.py | 5 + .../ifcopenshell/api/type/assign_type.py | 320 +++++++-------- .../api/type/get_related_objects.py | 71 ++-- .../api/type/map_type_representations.py | 160 ++++---- .../ifcopenshell/api/type/unassign_type.py | 85 ++-- .../ifcopenshell/api/unit/__init__.py | 11 + .../api/unit/add_context_dependent_unit.py | 75 ++-- .../api/unit/add_conversion_based_unit.py | 107 +++-- .../api/unit/add_monetary_unit.py | 41 +- .../ifcopenshell/api/unit/add_si_unit.py | 71 ++-- .../ifcopenshell/api/unit/assign_unit.py | 110 +++--- .../api/unit/edit_derived_unit.py | 31 +- .../api/unit/edit_monetary_unit.py | 45 +-- .../ifcopenshell/api/unit/edit_named_unit.py | 63 ++- .../ifcopenshell/api/unit/remove_unit.py | 53 ++- .../ifcopenshell/api/unit/unassign_unit.py | 61 ++- .../ifcopenshell/api/void/__init__.py | 5 + .../ifcopenshell/api/void/add_filling.py | 159 ++++---- .../ifcopenshell/api/void/add_opening.py | 189 +++++---- .../ifcopenshell/api/void/remove_filling.py | 65 ++- .../ifcopenshell/api/void/remove_opening.py | 61 ++- 330 files changed, 13283 insertions(+), 13751 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py index 18731bf443..bf452c8e2b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py @@ -22,3 +22,6 @@ One common use is spatial elements, such as how a site has multiple buildings, and a building has multiple storeys. Another is for regular elements, such as how a wall is made out of members and coverings. """ + +from .assign_object import assign_object +from .unassign_object import unassign_object diff --git a/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py index 3e9f866435..c1ffdc5a16 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py @@ -23,148 +23,144 @@ import ifcopenshell.util.placement from typing import Union -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - relating_object: ifcopenshell.entity_instance, - ): - """Assigns object as an aggregate to the products +def assign_object( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + relating_object: ifcopenshell.entity_instance, +) -> Union[ifcopenshell.entity_instance, None]: + """Assigns object as an aggregate to the products - All physical IFC model elements must be part of a hierarchical tree - called the "spatial decomposition", where large things are made up of - smaller things. This tree always begins at an "IfcProject" and is then - broken down using "decomposition" relationships, of which aggregation is - the first relationship you will use. + All physical IFC model elements must be part of a hierarchical tree + called the "spatial decomposition", where large things are made up of + smaller things. This tree always begins at an "IfcProject" and is then + broken down using "decomposition" relationships, of which aggregation is + the first relationship you will use. - Typically used when you want to describe how large spaces are made up of - smaller spaces. For example large spatial elements (e.g. sites, - buidings) can be made out of smaller spatial elements (e.g. storeys, - spaces). + Typically used when you want to describe how large spaces are made up of + smaller spaces. For example large spatial elements (e.g. sites, + buidings) can be made out of smaller spatial elements (e.g. storeys, + spaces). - The largest space (typically the IfcSite) can then be aggregated in a - project. It is requirement for all spatial structures to be directly or - indirectly aggregated back to the IfcProject to create a hierarchy of - spaces. + The largest space (typically the IfcSite) can then be aggregated in a + project. It is requirement for all spatial structures to be directly or + indirectly aggregated back to the IfcProject to create a hierarchy of + spaces. - The other common usecase is when larger physical products are made up of - smaller physical products. For example, a stair might be made out of a - flight, a landing, a railing and so on. Or a wall might be made out of - stud members, and coverings. + The other common usecase is when larger physical products are made up of + smaller physical products. For example, a stair might be made out of a + flight, a landing, a railing and so on. Or a wall might be made out of + stud members, and coverings. - As a product may only have a single location in the "spatial - decomposition" tree, assigning an aggregate relationship will remove any - previous aggregation, containment, or nesting relationships it may have. + As a product may only have a single location in the "spatial + decomposition" tree, assigning an aggregate relationship will remove any + previous aggregation, containment, or nesting relationships it may have. - IFC placements follow a convention where the placement is relative to - its parent in the spatial hierarchy. If your product has a placement, - its placement will be recalculated to follow this convention. + IFC placements follow a convention where the placement is relative to + its parent in the spatial hierarchy. If your product has a placement, + its placement will be recalculated to follow this convention. - :param products: The list of parts of the aggregate, typically of IfcElement or - IfcSpatialStructureElement subclass - :type product: list[ifcopenshell.entity_instance] - :param relating_object: The whole of the aggregate, typically an - IfcElement or IfcSpatialStructureElement subclass - :type relating_object: ifcopenshell.entity_instance - :return: The IfcRelAggregate relationship instance - or `None` if `products` was empty list. - :rtype: Union[ifcopenshell.entity_instance, None] + :param products: The list of parts of the aggregate, typically of IfcElement or + IfcSpatialStructureElement subclass + :type product: list[ifcopenshell.entity_instance] + :param relating_object: The whole of the aggregate, typically an + IfcElement or IfcSpatialStructureElement subclass + :type relating_object: ifcopenshell.entity_instance + :return: The IfcRelAggregate relationship instance + or `None` if `products` was empty list. + :rtype: Union[ifcopenshell.entity_instance, None] - Example: + Example: - .. code:: python + .. code:: python - project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") - element = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") - subelement = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") + project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") + element = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") + subelement = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") - # The project contains a site (note that project aggregation is a special case in IFC) - ifcopenshell.api.run("aggregate.assign_object", model, products=[element], relating_object=project) + # The project contains a site (note that project aggregation is a special case in IFC) + ifcopenshell.api.run("aggregate.assign_object", model, products=[element], relating_object=project) - # The site has a building - ifcopenshell.api.run("aggregate.assign_object", model, products=[subelement], relating_object=element) - """ - self.file = file - self.settings = { - "products": products, - "relating_object": relating_object, - } + # The site has a building + ifcopenshell.api.run("aggregate.assign_object", model, products=[subelement], relating_object=element) + """ + settings = { + "products": products, + "relating_object": relating_object, + } - def execute(self) -> Union[ifcopenshell.entity_instance, None]: - if not self.settings["products"]: - return + if not settings["products"]: + return - products = set(self.settings["products"]) - relating_object = self.settings["relating_object"] - is_decomposed_by = next((i for i in relating_object.IsDecomposedBy if i.is_a("IfcRelAggregates")), None) + products = set(settings["products"]) + relating_object = settings["relating_object"] + is_decomposed_by = next((i for i in relating_object.IsDecomposedBy if i.is_a("IfcRelAggregates")), None) - previous_aggregates_rels: set[ifcopenshell.entity_instance] = set() - products_without_aggregates: list[ifcopenshell.entity_instance] = [] - products_with_aggregates: list[ifcopenshell.entity_instance] = [] + previous_aggregates_rels: set[ifcopenshell.entity_instance] = set() + products_without_aggregates: list[ifcopenshell.entity_instance] = [] + products_with_aggregates: list[ifcopenshell.entity_instance] = [] - # check if there is anything to change - for product in products: - product_rel = next(iter(product.Decomposes), None) + # check if there is anything to change + for product in products: + product_rel = next(iter(product.Decomposes), None) - if product_rel is None: - products_without_aggregates.append(product) - continue + if product_rel is None: + products_without_aggregates.append(product) + continue - # either is_decomposed_by is None or product is part of different rel - if product_rel != is_decomposed_by: - previous_aggregates_rels.add(product_rel) - products_with_aggregates.append(product) + # either is_decomposed_by is None or product is part of different rel + if product_rel != is_decomposed_by: + previous_aggregates_rels.add(product_rel) + products_with_aggregates.append(product) - # products with already assigned aggregates will be skipped + # products with already assigned aggregates will be skipped - products_to_change = products_without_aggregates + products_with_aggregates - # nothing to change - if not products_to_change: - return is_decomposed_by + products_to_change = products_without_aggregates + products_with_aggregates + # nothing to change + if not products_to_change: + return is_decomposed_by - # can be either only aggregated or only contained at the same time - # some product might not be able to have a container - possibly_contained_products = [p for p in products_without_aggregates if hasattr(p, "ContainedInStructure")] - ifcopenshell.api.run("spatial.unassign_container", self.file, products=possibly_contained_products) + # can be either only aggregated or only contained at the same time + # some product might not be able to have a container + possibly_contained_products = [p for p in products_without_aggregates if hasattr(p, "ContainedInStructure")] + ifcopenshell.api.run("spatial.unassign_container", file, products=possibly_contained_products) - # unassign elements from previous aggregates - for decomposes in previous_aggregates_rels: - related_objects = set(decomposes.RelatedObjects) - products - if related_objects: - decomposes.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": decomposes}) - else: - history = decomposes.OwnerHistory - self.file.remove(decomposes) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - - # assign elements to a new aggregate - if is_decomposed_by: - is_decomposed_by.RelatedObjects = list(set(is_decomposed_by.RelatedObjects) | products) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": is_decomposed_by}) + # unassign elements from previous aggregates + for decomposes in previous_aggregates_rels: + related_objects = set(decomposes.RelatedObjects) - products + if related_objects: + decomposes.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": decomposes}) else: - is_decomposed_by = self.file.create_entity( - "IfcRelAggregates", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": list(products), - "RelatingObject": relating_object, - } + history = decomposes.OwnerHistory + file.remove(decomposes) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + + # assign elements to a new aggregate + if is_decomposed_by: + is_decomposed_by.RelatedObjects = list(set(is_decomposed_by.RelatedObjects) | products) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": is_decomposed_by}) + else: + is_decomposed_by = file.create_entity( + "IfcRelAggregates", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": list(products), + "RelatingObject": relating_object, + } + ) + + # localize placement relative to a new aggregate for affected products + for product in products_to_change: + placement = getattr(product, "ObjectPlacement", None) + if placement and placement.is_a("IfcLocalPlacement"): + ifcopenshell.api.run( + "geometry.edit_object_placement", + file, + product=product, + matrix=ifcopenshell.util.placement.get_local_placement(product.ObjectPlacement), + is_si=False, ) - # localize placement relative to a new aggregate for affected products - for product in products_to_change: - placement = getattr(product, "ObjectPlacement", None) - if placement and placement.is_a("IfcLocalPlacement"): - ifcopenshell.api.run( - "geometry.edit_object_placement", - self.file, - product=product, - matrix=ifcopenshell.util.placement.get_local_placement(product.ObjectPlacement), - is_si=False, - ) - - return is_decomposed_by + return is_decomposed_by diff --git a/src/ifcopenshell-python/ifcopenshell/api/aggregate/unassign_object.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/unassign_object.py index c766a4f019..8a8e35a948 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/aggregate/unassign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/unassign_object.py @@ -21,60 +21,57 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file: ifcopenshell.file, products: list[ifcopenshell.entity_instance]): - """Unassigns products from their aggregate +def unassign_object(file: ifcopenshell.file, products: list[ifcopenshell.entity_instance]) -> None: + """Unassigns products from their aggregate - A product (i.e. a smaller part of a whole) may be aggregated into zero - or one larger space or element. This function will remove that - aggregation relationship. + A product (i.e. a smaller part of a whole) may be aggregated into zero + or one larger space or element. This function will remove that + aggregation relationship. - As all physical IFC model elements must be part of a hierarchical tree - called the "spatial decomposition", using this function will remove the - product from that tree. This is a dangerous operation and may result in - the product no longer being visible in IFC applications. + As all physical IFC model elements must be part of a hierarchical tree + called the "spatial decomposition", using this function will remove the + product from that tree. This is a dangerous operation and may result in + the product no longer being visible in IFC applications. - If the product is not part of an aggregation relationship, nothing will - happen. + If the product is not part of an aggregation relationship, nothing will + happen. - :param products: The list of parts of the aggregate, typically of IfcElements or - IfcSpatialStructureElement subclass - :type product: list[ifcopenshell.entity_instance] - :return: None - :rtype: None + :param products: The list of parts of the aggregate, typically of IfcElements or + IfcSpatialStructureElement subclass + :type product: list[ifcopenshell.entity_instance] + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - element = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") - subelement1 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") - subelement2 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") - ifcopenshell.api.run("aggregate.assign_object", model, products=[subelement1], relating_object=element) - ifcopenshell.api.run("aggregate.assign_object", model, products=[subelement2], relating_object=element) - # nothing is returned - ifcopenshell.api.run("aggregate.unassign_object", model, products=[subelement1]) - # nothing is returned, relationship is removed - ifcopenshell.api.run("aggregate.unassign_object", model, products=[subelement2]) - """ - self.file = file - self.settings = {"products": products} + element = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") + subelement1 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") + subelement2 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") + ifcopenshell.api.run("aggregate.assign_object", model, products=[subelement1], relating_object=element) + ifcopenshell.api.run("aggregate.assign_object", model, products=[subelement2], relating_object=element) + # nothing is returned + ifcopenshell.api.run("aggregate.unassign_object", model, products=[subelement1]) + # nothing is returned, relationship is removed + ifcopenshell.api.run("aggregate.unassign_object", model, products=[subelement2]) + """ + settings = {"products": products} - def execute(self) -> None: - products = set(self.settings["products"]) - rels = set( - rel - for product in products - if (rel := next((rel for rel in product.Decomposes if rel.is_a("IfcRelAggregates")), None)) - ) + products = set(settings["products"]) + rels = set( + rel + for product in products + if (rel := next((rel for rel in product.Decomposes if rel.is_a("IfcRelAggregates")), None)) + ) - for rel in rels: - related_objects = set(rel.RelatedObjects) - products - if related_objects: - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + for rel in rels: + related_objects = set(rel.RelatedObjects) - products + if related_objects: + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + else: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py index e0caddbe3c..31a605de5d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py @@ -15,3 +15,5 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .edit_attributes import edit_attributes diff --git a/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py index 1e2cd98bc5..05dbff5a5c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py +++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py @@ -19,64 +19,49 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, product=None, attributes=None): - """Edit the attributes of a product +def edit_attributes(file, product=None, attributes=None) -> None: + """Edit the attributes of a product - All IFC entities have attributes. Normally they can be edited directly, - by simply assigning a new value to them. In some scenarios, you may wish - to also ensure that ownership history is updated. This function provides - that convenience. + All IFC entities have attributes. Normally they can be edited directly, + by simply assigning a new value to them. In some scenarios, you may wish + to also ensure that ownership history is updated. This function provides + that convenience. - :param product: The product you want to edit. This may be any rooted IFC - entity. - :type product: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param product: The product you want to edit. This may be any rooted IFC + entity. + :type product: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - element = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - ifcopenshell.api.run("attribute.edit_attributes", model, - product=element, attributes={"Name": "Waldo"}) - """ - self.file = file - self.settings = {"product": product, "attributes": attributes or {}} + element = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + ifcopenshell.api.run("attribute.edit_attributes", model, + product=element, attributes={"Name": "Waldo"}) + """ + settings = {"product": product, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["product"], name, value) - if hasattr(self.settings["product"], "PredefinedType"): - if hasattr(self.settings["product"], "ElementType"): - if ( - self.settings["product"].ElementType is None - and self.settings["product"].PredefinedType == "USERDEFINED" - ): - self.settings["product"].PredefinedType = "NOTDEFINED" - elif ( - self.settings["product"].ElementType - and self.settings["product"].PredefinedType != "USERDEFINED" - ): - self.settings["product"].PredefinedType = "USERDEFINED" - elif hasattr(self.settings["product"], "ObjectType"): - relating_type = ifcopenshell.util.element.get_type(self.settings["product"]) - # Allow for None due to https://github.com/buildingSMART/IFC4.3.x-development/issues/818 - if relating_type and relating_type.PredefinedType not in ("NOTDEFINED", None): - self.settings["product"].ObjectType = None - self.settings["product"].PredefinedType = None - elif ( - self.settings["product"].ObjectType is None - and self.settings["product"].PredefinedType == "USERDEFINED" - ): - self.settings["product"].PredefinedType = "NOTDEFINED" - elif ( - self.settings["product"].ObjectType - and self.settings["product"].PredefinedType != "USERDEFINED" - ): - self.settings["product"].PredefinedType = "USERDEFINED" - if hasattr(self.settings["product"], "OwnerHistory"): - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": self.settings["product"]}) + for name, value in settings["attributes"].items(): + setattr(settings["product"], name, value) + if hasattr(settings["product"], "PredefinedType"): + if hasattr(settings["product"], "ElementType"): + if settings["product"].ElementType is None and settings["product"].PredefinedType == "USERDEFINED": + settings["product"].PredefinedType = "NOTDEFINED" + elif settings["product"].ElementType and settings["product"].PredefinedType != "USERDEFINED": + settings["product"].PredefinedType = "USERDEFINED" + elif hasattr(settings["product"], "ObjectType"): + relating_type = ifcopenshell.util.element.get_type(settings["product"]) + # Allow for None due to https://github.com/buildingSMART/IFC4.3.x-development/issues/818 + if relating_type and relating_type.PredefinedType not in ("NOTDEFINED", None): + settings["product"].ObjectType = None + settings["product"].PredefinedType = None + elif settings["product"].ObjectType is None and settings["product"].PredefinedType == "USERDEFINED": + settings["product"].PredefinedType = "NOTDEFINED" + elif settings["product"].ObjectType and settings["product"].PredefinedType != "USERDEFINED": + settings["product"].PredefinedType = "USERDEFINED" + if hasattr(settings["product"], "OwnerHistory"): + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": settings["product"]}) diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py index c2a0c1900d..fff4c4e7f5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py @@ -19,3 +19,8 @@ """Boundaries are primarily used for representing virtual interfaces between spaces for energy analysis. """ + +from .assign_connection_geometry import assign_connection_geometry +from .copy_boundary import copy_boundary +from .edit_attributes import edit_attributes +from .remove_boundary import remove_boundary diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py index 8f23a60bb6..b184810642 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py @@ -19,68 +19,80 @@ import ifcopenshell.util.unit +def assign_connection_geometry( + file, + rel_space_boundary=None, + outer_boundary=None, + inner_boundaries=None, + location=None, + axis=None, + ref_direction=None, + unit_scale=None, +) -> None: + """Create and assign a connection geometry to a space boundary relationship + + A space boundary may optionally have a plane that represents how that + space is adjacent to another space, known as the connection geometry. + You may specify this plane in terms of an outer boundary polyline, zero + or more inner boundaries (such as for windows), and a positional matrix + for the orientation of the plane. + + :param rel_space_boundary: The space boundary relationship to assign the + connection geometry to. + :type rel_space_boundary: ifcopenshell.entity_instance + :param outer_boundary: A list of 2D points representing an open + polyline. The last point will connect to the first point. Each + point is represented by an interable of 2 floats. The coordinates of + the points are relative to the positional matrix arguments. + :type outer_boundary: list[list[float]] + :param inner_boundaries: A list of zero or more inner boundaries to use + for the plane. Each boundary is represented by an open polyline, as + defined by the outer_boundary argument. + :type inner_boundaries: list[list[list[float]]], optional + :param location: The local origin of the connection geometry, defined as + an XYZ coordinate relative to the placement of the space that is + being bounded. + :type location: list[float] + :param axis: The local X axis of the connection geometry, defined as an + XYZ vector relative to the placement of the space that is being + bounded. + :type axis: list[float] + :param ref_direction: The local Z axis of the connection geometry, + defined as an XYZ vector relative to the placement of the space that + is being bounded. The Y vector is automatically derived using the + right hand rule. + :type ref_direction: list[float] + :param unit_scale: The unit scale as calculated by + ifcopenshell.util.unit.calculate_unit_scale. If not provided, it + will be automatically calculated for you. + :type unit_scale: float, optional + :return: None + :rtype: None + + Example: + + .. code:: python + + ifcopenshell.api.run("boundary.assign_connection_geometry", model, + rel_space_boundary=element, + outer_boundary=[(0., 0.), (1., 0.), (1., 1.), (0., 1.)], + location=[0., 0., 0.], axis=[1., 0., 0.], ref_direction=[0., 0., 1.], + ) + """ + usecase = Usecase() + usecase.file = file + usecase.rel_space_boundary = rel_space_boundary + usecase.outer_boundary = outer_boundary + usecase.inner_boundaries = inner_boundaries or () + usecase.location = location + usecase.axis = axis + usecase.ref_direction = ref_direction + usecase.unit_scale = unit_scale + usecase.ifc_vertices = [] + return usecase.execute() + + class Usecase: - def __init__(self, file, rel_space_boundary=None, outer_boundary=None, inner_boundaries=None, location=None, axis=None, ref_direction=None, unit_scale=None): - """Create and assign a connection geometry to a space boundary relationship - - A space boundary may optionally have a plane that represents how that - space is adjacent to another space, known as the connection geometry. - You may specify this plane in terms of an outer boundary polyline, zero - or more inner boundaries (such as for windows), and a positional matrix - for the orientation of the plane. - - :param rel_space_boundary: The space boundary relationship to assign the - connection geometry to. - :type rel_space_boundary: ifcopenshell.entity_instance - :param outer_boundary: A list of 2D points representing an open - polyline. The last point will connect to the first point. Each - point is represented by an interable of 2 floats. The coordinates of - the points are relative to the positional matrix arguments. - :type outer_boundary: list[list[float]] - :param inner_boundaries: A list of zero or more inner boundaries to use - for the plane. Each boundary is represented by an open polyline, as - defined by the outer_boundary argument. - :type inner_boundaries: list[list[list[float]]], optional - :param location: The local origin of the connection geometry, defined as - an XYZ coordinate relative to the placement of the space that is - being bounded. - :type location: list[float] - :param axis: The local X axis of the connection geometry, defined as an - XYZ vector relative to the placement of the space that is being - bounded. - :type axis: list[float] - :param ref_direction: The local Z axis of the connection geometry, - defined as an XYZ vector relative to the placement of the space that - is being bounded. The Y vector is automatically derived using the - right hand rule. - :type ref_direction: list[float] - :param unit_scale: The unit scale as calculated by - ifcopenshell.util.unit.calculate_unit_scale. If not provided, it - will be automatically calculated for you. - :type unit_scale: float, optional - :return: None - :rtype: None - - Example: - - .. code:: python - - ifcopenshell.api.run("boundary.assign_connection_geometry", model, - rel_space_boundary=element, - outer_boundary=[(0., 0.), (1., 0.), (1., 1.), (0., 1.)], - location=[0., 0., 0.], axis=[1., 0., 0.], ref_direction=[0., 0., 1.], - ) - """ - self.file = file - self.rel_space_boundary = rel_space_boundary - self.outer_boundary = outer_boundary - self.inner_boundaries = inner_boundaries or () - self.location = location - self.axis = axis - self.ref_direction = ref_direction - self.unit_scale = unit_scale - self.ifc_vertices = [] - def execute(self): if self.unit_scale is None: self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file) diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py index 2f8b092c51..b051bae828 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py @@ -19,29 +19,26 @@ import ifcopenshell.util.element -class Usecase: - def __init__(self, file, boundary=None): - """Copies a space boundary +def copy_boundary(file, boundary=None) -> None: + """Copies a space boundary - :param boundary: The IfcRelSpaceBoundary you want to copy. - :type boundary: ifcopenshell.entity_instance - :return: None - :rtype: None + :param boundary: The IfcRelSpaceBoundary you want to copy. + :type boundary: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - # A boring boundary with no geometry. Note that this boundary is - # invalid and does not relate to any space or building element. - boundary = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcRelSpaceBoundary") + # A boring boundary with no geometry. Note that this boundary is + # invalid and does not relate to any space or building element. + boundary = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcRelSpaceBoundary") - # And now we have two - boundary_copy = ifcopenshell.api.run("boundary.copy_boundary", model, boundary=boundary) - """ - self.file = file - self.settings = {"boundary": boundary} + # And now we have two + boundary_copy = ifcopenshell.api.run("boundary.copy_boundary", model, boundary=boundary) + """ + settings = {"boundary": boundary} - def execute(self): - result = ifcopenshell.util.element.copy(self.file, self.settings["boundary"]) - if result.ConnectionGeometry: - result.ConnectionGeometry = ifcopenshell.util.element.copy_deep(self.file, result.ConnectionGeometry) - return result + result = ifcopenshell.util.element.copy(file, settings["boundary"]) + if result.ConnectionGeometry: + result.ConnectionGeometry = ifcopenshell.util.element.copy_deep(file, result.ConnectionGeometry) + return result diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py index 4be540f7a2..663c656dbb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py @@ -17,45 +17,49 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, entity=None, relating_space=None, related_building_element=None, parent_boundary=None, corresponding_boundary=None): - """Modify the relationships of a space boundary relationship +def edit_attributes( + file, + entity=None, + relating_space=None, + related_building_element=None, + parent_boundary=None, + corresponding_boundary=None, +) -> None: + """Modify the relationships of a space boundary relationship - Currently this function is quite minimal and offers no advantage to - manual assignment of the space boundary attributes. + Currently this function is quite minimal and offers no advantage to + manual assignment of the space boundary attributes. - :param entity: The IfcRelSpaceBoundary to modify - :type entity: ifcopenshell.entity_instance - :param relating_space: The IfcSpace or IfcExternalSpatialElement that - the space boundary is related to. - :type relating_space: ifcopenshell.entity_instance - :param related_building_element: The IfcElement that defines the - boundary, typically an IfcWall. - :type relating_space: ifcopenshell.entity_instance - :param parent_boundary: A parent IfcRelSpaceBoundary, only provided if - this is an inner boundary. This can apply to 1st and 2nd level - boundaries. - :type parent_boundary: ifcopenshell.entity_instance, - optional - :param corresponding_boundary: The other IfcRelSpaceBoundary on the - other side of the related element. The pair together represents a - thermal boundary. This only applies to 2nd level boundaries. - :type corresponding_boundary: ifcopenshell.entity_instance, - optional - :return: None - :rtype: None - """ - self.file = file - self.entity = entity - self.relating_space = relating_space - self.related_building_element = related_building_element - self.parent_boundary = parent_boundary - self.corresponding_boundary = corresponding_boundary + :param entity: The IfcRelSpaceBoundary to modify + :type entity: ifcopenshell.entity_instance + :param relating_space: The IfcSpace or IfcExternalSpatialElement that + the space boundary is related to. + :type relating_space: ifcopenshell.entity_instance + :param related_building_element: The IfcElement that defines the + boundary, typically an IfcWall. + :type relating_space: ifcopenshell.entity_instance + :param parent_boundary: A parent IfcRelSpaceBoundary, only provided if + this is an inner boundary. This can apply to 1st and 2nd level + boundaries. + :type parent_boundary: ifcopenshell.entity_instance, + optional + :param corresponding_boundary: The other IfcRelSpaceBoundary on the + other side of the related element. The pair together represents a + thermal boundary. This only applies to 2nd level boundaries. + :type corresponding_boundary: ifcopenshell.entity_instance, + optional + :return: None + :rtype: None + """ + entity = entity + relating_space = relating_space + related_building_element = related_building_element + parent_boundary = parent_boundary + corresponding_boundary = corresponding_boundary - def execute(self): - self.entity.RelatingSpace = self.relating_space - self.entity.RelatedBuildingElement = self.related_building_element - if hasattr(self.entity, "ParentBoundary"): - self.entity.ParentBoundary = self.parent_boundary - if hasattr(self.entity, "CorrespondingBoundary"): - self.entity.CorrespondingBoundary = self.corresponding_boundary + entity.RelatingSpace = relating_space + entity.RelatedBuildingElement = related_building_element + if hasattr(entity, "ParentBoundary"): + entity.ParentBoundary = parent_boundary + if hasattr(entity, "CorrespondingBoundary"): + entity.CorrespondingBoundary = corresponding_boundary diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py index 6744da820c..dadf44e3c7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py @@ -20,36 +20,33 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, boundary=None): - """Removes a space boundary +def remove_boundary(file, boundary=None) -> None: + """Removes a space boundary - The relating space or related building element is untouched. Only the - boundary and its connection geometry is removed. + The relating space or related building element is untouched. Only the + boundary and its connection geometry is removed. - :param boundary: The IfcRelSpaceBoundary you want to remove. - :type boundary: ifcopenshell.entity_instance - :return: None - :rtype: None + :param boundary: The IfcRelSpaceBoundary you want to remove. + :type boundary: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - # A boring boundary with no geometry. Note that this boundary is - # invalid and does not relate to any space or building element. - boundary = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcRelSpaceBoundary") + # A boring boundary with no geometry. Note that this boundary is + # invalid and does not relate to any space or building element. + boundary = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcRelSpaceBoundary") - # Let's remove it! - ifcopenshell.api.run("boundary.remove_boundary", model, boundary=boundary) - """ - self.file = file - self.settings = {"boundary": boundary} + # Let's remove it! + ifcopenshell.api.run("boundary.remove_boundary", model, boundary=boundary) + """ + settings = {"boundary": boundary} - def execute(self): - geometry = self.settings["boundary"].ConnectionGeometry - if geometry: - self.settings["boundary"].ConnectionGeometry = None - ifcopenshell.util.element.remove_deep2(self.file, geometry) - history = self.settings["boundary"].OwnerHistory - self.file.remove(self.settings["boundary"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + geometry = settings["boundary"].ConnectionGeometry + if geometry: + settings["boundary"].ConnectionGeometry = None + ifcopenshell.util.element.remove_deep2(file, geometry) + history = settings["boundary"].OwnerHistory + file.remove(settings["boundary"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py index e0caddbe3c..6616ff6f89 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py @@ -15,3 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_classification import add_classification +from .add_reference import add_reference +from .edit_classification import edit_classification +from .edit_reference import edit_reference +from .remove_classification import remove_classification +from .remove_reference import remove_reference diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py index 580c036a5f..a6e251fcf2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py @@ -22,67 +22,72 @@ import ifcopenshell.util.date from typing import Union +def add_classification( + file: ifcopenshell.file, classification: Union[str, ifcopenshell.entity_instance] +) -> ifcopenshell.entity_instance: + """Adds a new classification system to the project + + External classification systems such as Uniclass or Omniclass are + ways of categorising elements in the AEC industry, typically + standardised or nominated by governments or companies. A system + typically contains a series of hierarchical reference codes and labels + like Pr_12_23_34. + + Classifications may be applied to many things, not just physical + elements, such as doors and windows, spatial elements, tasks, cost + items, or even resources. + + Prior to assigning classificaion references, you need to add the name + and metadata of the classification system that you will use in your + project. Classification systems may be revised over time, so this + metadata includes the edition date. + + Common classification systems are provided as an IFC library which may + be downloaded from https://github.com/Moult/IfcClassification for your + convenience. It is advised to use these to ensure that the + classification metadata is standardised. + + Adding a classification system will not add the entire hierarchy of + references available in the classification. References need to be added + separately. Typically, you'd only add the references that you use in + your project, see ifcopenshell.api.classification.add_reference for more + information. + + :param classification: If a string is provided, it is assumed to be the + name of your classification system. This is necessary if you are + creating your own custom classification system. Alternatively, you + may provide an entity_instance of an IfcClassification from an IFC + classification library. The latter approach is preferred if you are + using a commonly known system such as Uniclass, as this will ensure + all metadata is added correctly. + :type classification: str,ifcopenshell.entity_instance + :return: The added IfcClassification element + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # Option 1: adding a custom clasification from scratch + ifcopenshell.api.run("classification.add_classification", model, + classification="MyCustomClassification") + + # Option 2: adding a popular classification from a library + library = ifcopenshell.open("/path/to/Uniclass.ifc") + classification = library.by_type("IfcClassification")[0] + ifcopenshell.api.run("classification.add_classification", model, + classification=classification) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "classification": classification, + } + return usecase.execute() + + class Usecase: - def __init__(self, file: ifcopenshell.file, classification: Union[str, ifcopenshell.entity_instance]): - """Adds a new classification system to the project - - External classification systems such as Uniclass or Omniclass are - ways of categorising elements in the AEC industry, typically - standardised or nominated by governments or companies. A system - typically contains a series of hierarchical reference codes and labels - like Pr_12_23_34. - - Classifications may be applied to many things, not just physical - elements, such as doors and windows, spatial elements, tasks, cost - items, or even resources. - - Prior to assigning classificaion references, you need to add the name - and metadata of the classification system that you will use in your - project. Classification systems may be revised over time, so this - metadata includes the edition date. - - Common classification systems are provided as an IFC library which may - be downloaded from https://github.com/Moult/IfcClassification for your - convenience. It is advised to use these to ensure that the - classification metadata is standardised. - - Adding a classification system will not add the entire hierarchy of - references available in the classification. References need to be added - separately. Typically, you'd only add the references that you use in - your project, see ifcopenshell.api.classification.add_reference for more - information. - - :param classification: If a string is provided, it is assumed to be the - name of your classification system. This is necessary if you are - creating your own custom classification system. Alternatively, you - may provide an entity_instance of an IfcClassification from an IFC - classification library. The latter approach is preferred if you are - using a commonly known system such as Uniclass, as this will ensure - all metadata is added correctly. - :type classification: str,ifcopenshell.entity_instance - :return: The added IfcClassification element - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # Option 1: adding a custom clasification from scratch - ifcopenshell.api.run("classification.add_classification", model, - classification="MyCustomClassification") - - # Option 2: adding a popular classification from a library - library = ifcopenshell.open("/path/to/Uniclass.ifc") - classification = library.by_type("IfcClassification")[0] - ifcopenshell.api.run("classification.add_classification", model, - classification=classification) - """ - self.file = file - self.settings = { - "classification": classification, - } - - def execute(self) -> ifcopenshell.entity_instance: + def execute(self): if isinstance(self.settings["classification"], str): classification = self.file.createIfcClassification(Name=self.settings["classification"]) self.relate_to_project(classification) diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py index db1bab41bf..979bfc40dd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py @@ -23,117 +23,119 @@ import ifcopenshell.util.schema from typing import Optional, Union +def add_reference( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + reference: Optional[ifcopenshell.entity_instance] = None, + identification: Optional[str] = None, + name: Optional[str] = None, + classification: Optional[ifcopenshell.entity_instance] = None, + is_lightweight=True, +) -> Union[ifcopenshell.entity_instance, None]: + """Adds a new classification reference and assigns it to the list of products + + A classification reference is a single entry such as "Pr_12_23_34" that + is part of an external classification system (such as Uniclass or + Omniclass). + + References can be added to almost any object in IFC, including physical + objects, object types, properties, tasks, costs, resources, or even + resources such as profiles, documents, libraries, and so on. + + Classification references can be added in two ways. Option 1) specify a + custom arbitrary reference, where you have to manually specify the + identification (e.g. "Pr_12_23_45") and name (e.g. "Door Products"). + Option 2) add a reference from an IFC classification library. The latter + is preferred if you are using a common classification system such as + Uniclass, as the library will be prepopulated with all the valid + classifications already. + + Objects are allowed to have multiple classification references from + multiple classification systems. This means that adding a new reference + will not remove existing references. + + References can be inherited from types. This means that if an + IfcWallType has a classification reference of Pr_12_23_34, then all + IfcWall occurrences of that type automatically get the same + classification of Pr_12_23_34. This means that it is more efficient to + assign to types where possible. If a classification reference is + assigned to both the type and an occurrence, then the assignment at the + occurrence will override the type classification. + + :param product: The list of IFC objects, properties, or resources you want to + associate the classification reference to. + :type product: list[ifcopenshell.entity_instance] + :param reference: The classification reference entity taken from an + IFC classification library. If you supply this parameter, you will + use option 2. + :type reference: ifcopenshell.entity_instance, optional + :param identification: If you choose option 1 and do not specify a + reference, you may manually specify an identification code. The code + is typically a short identifier and may have punctuation to separate + the levels of hierarchy in the classificaion (e.g. Pr_12_23_34). + :type identification: str, optional + :param name: If you choose option 1 and do not specify a reference, you + may manually specify a name. The name is typically human readable. + :type name: str, optional + :param classification: The IfcClassification entity in your IFC model + (not the library, if you are doing option 2) that the reference is + part of. + :type classification: ifcopenshell.entity_instance + :param is_lightweight: If you are doing option 2, choose whether or not + to only add that particular reference (lighweight) or also add all + of its parent references in the classification hierarchy (not + lighweight). For example, adding a lightweight reference to + Pr_12_23_34 will only add Pr_12_23_34, but adding a heavy reference + to Pr_12_23_34 will also add Pr_12_23 and Pr_12. These parent + references merely help describe the "tree" of classifications, but + is generally unnecessary. Using lightweight classifications are + recommended and is the default. + :type is_lightweight: bool, optional + + :raises TypeError: If file is IFC2X3 and `products` has non-IfcRoot elements. + + :return: The newly added IfcClassificationReference + or `None` if `products` was empty list. + :rtype: Union[ifcopenshell.entity_instance, None] + + Example: + + .. code:: python + + # Option 1: adding and assigning a new reference from scratch + wall_type = model.by_type("IfcWallType")[0] + classification = ifcopenshell.api.run("classification.add_classification", + model, classification="MyCustomClassification") + ifcopenshell.api.run("classification.add_reference", model, + products=[wall_type], classification=classification, + identification="W_01", name="Interior Walls") + + # Option 2: adding a popular classification from a library + library = ifcopenshell.open("/path/to/Uniclass.ifc") + lib_classification = library.by_type("IfcClassification")[0] + classification = ifcopenshell.api.run("classification.add_classification", + model, classification=lib_classification) + reference = [r for r in library.by_type("IfcClassificationReference") + if r.Identification == "XYZ"][0] + ifcopenshell.api.run("classification.add_reference", model, + products=[wall_type], classification=classification, + reference=reference) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "products": products, + "reference": reference, + "identification": identification, + "name": name, + "classification": classification, + "is_lightweight": is_lightweight, + } + return usecase.execute() + + class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - reference: Optional[ifcopenshell.entity_instance] = None, - identification: Optional[str] = None, - name: Optional[str] = None, - classification: Optional[ifcopenshell.entity_instance] = None, - is_lightweight=True, - ): - """Adds a new classification reference and assigns it to the list of products - - A classification reference is a single entry such as "Pr_12_23_34" that - is part of an external classification system (such as Uniclass or - Omniclass). - - References can be added to almost any object in IFC, including physical - objects, object types, properties, tasks, costs, resources, or even - resources such as profiles, documents, libraries, and so on. - - Classification references can be added in two ways. Option 1) specify a - custom arbitrary reference, where you have to manually specify the - identification (e.g. "Pr_12_23_45") and name (e.g. "Door Products"). - Option 2) add a reference from an IFC classification library. The latter - is preferred if you are using a common classification system such as - Uniclass, as the library will be prepopulated with all the valid - classifications already. - - Objects are allowed to have multiple classification references from - multiple classification systems. This means that adding a new reference - will not remove existing references. - - References can be inherited from types. This means that if an - IfcWallType has a classification reference of Pr_12_23_34, then all - IfcWall occurrences of that type automatically get the same - classification of Pr_12_23_34. This means that it is more efficient to - assign to types where possible. If a classification reference is - assigned to both the type and an occurrence, then the assignment at the - occurrence will override the type classification. - - :param product: The list of IFC objects, properties, or resources you want to - associate the classification reference to. - :type product: list[ifcopenshell.entity_instance] - :param reference: The classification reference entity taken from an - IFC classification library. If you supply this parameter, you will - use option 2. - :type reference: ifcopenshell.entity_instance, optional - :param identification: If you choose option 1 and do not specify a - reference, you may manually specify an identification code. The code - is typically a short identifier and may have punctuation to separate - the levels of hierarchy in the classificaion (e.g. Pr_12_23_34). - :type identification: str, optional - :param name: If you choose option 1 and do not specify a reference, you - may manually specify a name. The name is typically human readable. - :type name: str, optional - :param classification: The IfcClassification entity in your IFC model - (not the library, if you are doing option 2) that the reference is - part of. - :type classification: ifcopenshell.entity_instance - :param is_lightweight: If you are doing option 2, choose whether or not - to only add that particular reference (lighweight) or also add all - of its parent references in the classification hierarchy (not - lighweight). For example, adding a lightweight reference to - Pr_12_23_34 will only add Pr_12_23_34, but adding a heavy reference - to Pr_12_23_34 will also add Pr_12_23 and Pr_12. These parent - references merely help describe the "tree" of classifications, but - is generally unnecessary. Using lightweight classifications are - recommended and is the default. - :type is_lightweight: bool, optional - - :raises TypeError: If file is IFC2X3 and `products` has non-IfcRoot elements. - - :return: The newly added IfcClassificationReference - or `None` if `products` was empty list. - :rtype: Union[ifcopenshell.entity_instance, None] - - Example: - - .. code:: python - - # Option 1: adding and assigning a new reference from scratch - wall_type = model.by_type("IfcWallType")[0] - classification = ifcopenshell.api.run("classification.add_classification", - model, classification="MyCustomClassification") - ifcopenshell.api.run("classification.add_reference", model, - products=[wall_type], classification=classification, - identification="W_01", name="Interior Walls") - - # Option 2: adding a popular classification from a library - library = ifcopenshell.open("/path/to/Uniclass.ifc") - lib_classification = library.by_type("IfcClassification")[0] - classification = ifcopenshell.api.run("classification.add_classification", - model, classification=lib_classification) - reference = [r for r in library.by_type("IfcClassificationReference") - if r.Identification == "XYZ"][0] - ifcopenshell.api.run("classification.add_reference", model, - products=[wall_type], classification=classification, - reference=reference) - """ - self.file = file - self.settings = { - "products": products, - "reference": reference, - "identification": identification, - "name": name, - "classification": classification, - "is_lightweight": is_lightweight, - } - - def execute(self) -> Union[ifcopenshell.entity_instance, None]: + def execute(self): if not self.settings["products"]: return diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py index 9925c59f54..7568a11d5e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py @@ -17,32 +17,29 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, classification=None, attributes=None): - """Edits the attributes of an IfcClassification +def edit_classification(file, classification=None, attributes=None) -> None: + """Edits the attributes of an IfcClassification - For more information about the attributes and data types of an - IfcClassification, consult the IFC documentation. + For more information about the attributes and data types of an + IfcClassification, consult the IFC documentation. - :param classification: The IfcClassification entity you want to edit - :type classification: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param classification: The IfcClassification entity you want to edit + :type classification: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - classification = model.by_type("IfcClassification")[0] - # Change the name of the classification system to "Foo" - ifcopenshell.api.run("classification.edit_classification", model, - classification=classification, attributes={"Name": "Foo"}) - """ - self.file = file - self.settings = {"classification": classification, "attributes": attributes or {}} + classification = model.by_type("IfcClassification")[0] + # Change the name of the classification system to "Foo" + ifcopenshell.api.run("classification.edit_classification", model, + classification=classification, attributes={"Name": "Foo"}) + """ + settings = {"classification": classification, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["classification"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["classification"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py index 4acf396adb..dc5096f38c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py @@ -17,32 +17,29 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, reference=None, attributes=None): - """Edits the attributes of an IfcClassificationReference +def edit_reference(file, reference=None, attributes=None) -> None: + """Edits the attributes of an IfcClassificationReference - For more information about the attributes and data types of an - IfcClassificationReference, consult the IFC documentation. + For more information about the attributes and data types of an + IfcClassificationReference, consult the IFC documentation. - :param reference: The IfcClassificationReference entity you want to edit - :type reference: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param reference: The IfcClassificationReference entity you want to edit + :type reference: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - reference = model.by_type("IfcClassification")[0] - # Change the name of the reference to "Foo" - ifcopenshell.api.run("classification.edit_reference", model, - reference=reference, attributes={"Name": "Foo"}) - """ - self.file = file - self.settings = {"reference": reference, "attributes": attributes or {}} + reference = model.by_type("IfcClassification")[0] + # Change the name of the reference to "Foo" + ifcopenshell.api.run("classification.edit_reference", model, + reference=reference, attributes={"Name": "Foo"}) + """ + settings = {"reference": reference, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["reference"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["reference"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py index 42a5dcacd0..42ec050d61 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py @@ -20,30 +20,33 @@ import ifcopenshell import ifcopenshell.util.element +def remove_classification(file, classification=None) -> None: + """Removes an IfcClassification from the project and all references + + The classification and all of its relationships, children references, + and relationships between objectse and child references are completely + removed from a project. + + :param classification: The IfcClassification entity you want to remove + :type classification: ifcopenshell.entity_instance + :return: None + :rtype: None + + Example: + + .. code:: python + + classification = model.by_type("IfcClassification")[0] + ifcopenshell.api.run("classification.remove_classification", model, + classification=classification) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"classification": classification} + return usecase.execute() + + class Usecase: - def __init__(self, file, classification=None): - """Removes an IfcClassification from the project and all references - - The classification and all of its relationships, children references, - and relationships between objectse and child references are completely - removed from a project. - - :param classification: The IfcClassification entity you want to remove - :type classification: ifcopenshell.entity_instance - :return: None - :rtype: None - - Example: - - .. code:: python - - classification = model.by_type("IfcClassification")[0] - ifcopenshell.api.run("classification.remove_classification", model, - classification=classification) - """ - self.file = file - self.settings = {"classification": classification} - def execute(self): references = self.get_references(self.settings["classification"]) for reference in references: diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py index ea61fb002d..bad8406582 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_reference.py @@ -21,107 +21,102 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - reference: ifcopenshell.entity_instance, - products: list[ifcopenshell.entity_instance], - ): - """Removes a classification reference from the list of products +def remove_reference( + file: ifcopenshell.file, + reference: ifcopenshell.entity_instance, + products: list[ifcopenshell.entity_instance], +) -> None: + """Removes a classification reference from the list of products - If the classification reference is no longer associated to any products, - the classification reference itself is also removed. + If the classification reference is no longer associated to any products, + the classification reference itself is also removed. - :param reference: The IfcClassificationReference entity of the - relationship you want to remove. - :type reference: ifcopenshell.entity_instance - :param product: The list fo object entities of the relationship you want to - remove. - :type product: list[ifcopenshell.entity_instance] + :param reference: The IfcClassificationReference entity of the + relationship you want to remove. + :type reference: ifcopenshell.entity_instance + :param product: The list fo object entities of the relationship you want to + remove. + :type product: list[ifcopenshell.entity_instance] - :raises TypeError: If file is IFC2X3 and `products` has non-IfcRoot elements. + :raises TypeError: If file is IFC2X3 and `products` has non-IfcRoot elements. - :return: None - :rtype: None + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - wall_type = model.by_type("IfcWallType")[0] - classification = ifcopenshell.api.run("classification.add_classification", - model, classification="MyCustomClassification") - reference = ifcopenshell.api.run("classification.add_reference", model, - products=[wall_type], classification=classification, - identification="W_01", name="Interior Walls") - ifcopenshell.api.run("classification.remove_reference", model, - reference=reference, products=[wall_type]) - """ - self.file = file - self.settings = {"reference": reference, "products": products} + wall_type = model.by_type("IfcWallType")[0] + classification = ifcopenshell.api.run("classification.add_classification", + model, classification="MyCustomClassification") + reference = ifcopenshell.api.run("classification.add_reference", model, + products=[wall_type], classification=classification, + identification="W_01", name="Interior Walls") + ifcopenshell.api.run("classification.remove_reference", model, + reference=reference, products=[wall_type]) + """ + settings = {"reference": reference, "products": products} - def execute(self) -> None: - is_ifc2x3 = self.file.schema == "IFC2X3" - products = set(self.settings["products"]) - referenced = ifcopenshell.util.element.get_referenced_elements(self.settings["reference"]) - products -= products.difference(referenced) + is_ifc2x3 = file.schema == "IFC2X3" + products = set(settings["products"]) + referenced = ifcopenshell.util.element.get_referenced_elements(settings["reference"]) + products -= products.difference(referenced) - # all products are already unassigned from a reference - if not products: - return + # all products are already unassigned from a reference + if not products: + return - rooted_products: set[ifcopenshell.entity_instance] = set() - non_rooted_products: set[ifcopenshell.entity_instance] = set() - for product in self.settings["products"]: - if product.is_a("IfcRoot"): - rooted_products.add(product) + rooted_products: set[ifcopenshell.entity_instance] = set() + non_rooted_products: set[ifcopenshell.entity_instance] = set() + for product in settings["products"]: + if product.is_a("IfcRoot"): + rooted_products.add(product) + else: + non_rooted_products.add(product) + + if non_rooted_products and is_ifc2x3: + raise TypeError(f"Cannot add reference to non-IfcRoot element in IFC2X3: {non_rooted_products}.") + + if rooted_products: + reference_rels: set[ifcopenshell.entity_instance] = set() + for product in rooted_products: + reference_rels.update(product.HasAssociations) + + reference_rels = { + rel + for rel in reference_rels + if rel.is_a("IfcRelAssociatesClassification") and rel.RelatingClassification == settings["reference"] + } + + for rel in reference_rels: + related_objects = set(rel.RelatedObjects) - rooted_products + if related_objects: + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) else: - non_rooted_products.add(product) + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) - if non_rooted_products and is_ifc2x3: - raise TypeError(f"Cannot add reference to non-IfcRoot element in IFC2X3: {non_rooted_products}.") + if non_rooted_products: + reference_rels: set[ifcopenshell.entity_instance] = set() + for product in non_rooted_products: + rels = getattr(product, "HasExternalReferences", None) + if rels is None: + rels = getattr(product, "HasExternalReference", []) + reference_rels.update(rels) - if rooted_products: - reference_rels: set[ifcopenshell.entity_instance] = set() - for product in rooted_products: - reference_rels.update(product.HasAssociations) + reference_rels = {rel for rel in reference_rels if rel.RelatingReference == settings["reference"]} + for rel in reference_rels: + related_objects = set(rel.RelatedResourceObjects) - non_rooted_products + if related_objects: + rel.RelatedResourceObjects = list(related_objects) + else: + file.remove(rel) - reference_rels = { - rel - for rel in reference_rels - if rel.is_a("IfcRelAssociatesClassification") - and rel.RelatingClassification == self.settings["reference"] - } - - for rel in reference_rels: - related_objects = set(rel.RelatedObjects) - rooted_products - if related_objects: - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - - if non_rooted_products: - reference_rels: set[ifcopenshell.entity_instance] = set() - for product in non_rooted_products: - rels = getattr(product, "HasExternalReferences", None) - if rels is None: - rels = getattr(product, "HasExternalReference", []) - reference_rels.update(rels) - - reference_rels = {rel for rel in reference_rels if rel.RelatingReference == self.settings["reference"]} - for rel in reference_rels: - related_objects = set(rel.RelatedResourceObjects) - non_rooted_products - if related_objects: - rel.RelatedResourceObjects = list(related_objects) - else: - self.file.remove(rel) - - # TODO: we only handle lightweight classifications here - referenced_elements = ifcopenshell.util.element.get_referenced_elements(self.settings["reference"]) - if not referenced_elements: - self.file.remove(self.settings["reference"]) + # TODO: we only handle lightweight classifications here + referenced_elements = ifcopenshell.util.element.get_referenced_elements(settings["reference"]) + if not referenced_elements: + file.remove(settings["reference"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py index e0caddbe3c..7309050851 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py @@ -15,3 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_metric import add_metric +from .add_metric_reference import add_metric_reference +from .add_objective import add_objective +from .assign_constraint import assign_constraint +from .edit_metric import edit_metric +from .edit_objective import edit_objective +from .remove_constraint import remove_constraint +from .remove_metric import remove_metric +from .unassign_constraint import unassign_constraint diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py index b84e2f3cc9..ab0870b528 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py @@ -19,44 +19,41 @@ import ifcopenshell -class Usecase: - def __init__(self, file, objective=None): - """Add a new metric benchmark +def add_metric(file, objective=None) -> None: + """Add a new metric benchmark - Qualitative constraints may have a series of quantitative benchmarks - linked to it known as metrics. Metrics may be parametrically linked to - computed model properties or quantities. Metrics need to be satisfied - to meet the objective of the constraint. + Qualitative constraints may have a series of quantitative benchmarks + linked to it known as metrics. Metrics may be parametrically linked to + computed model properties or quantities. Metrics need to be satisfied + to meet the objective of the constraint. - :param objective: The IfcObjective that this metric is a benchmark of. - :type objective: ifcopenshell.entity_instance - :return: The newly created IfcMetric entity - :rtype: ifcopenshell.entity_instance + :param objective: The IfcObjective that this metric is a benchmark of. + :type objective: ifcopenshell.entity_instance + :return: The newly created IfcMetric entity + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - objective = ifcopenshell.api.run("constraint.add_objective", model) - metric = ifcopenshell.api.run("constraint.add_metric", model, - objective=objective) - """ - self.file = file - self.settings = { - "objective": objective, + objective = ifcopenshell.api.run("constraint.add_objective", model) + metric = ifcopenshell.api.run("constraint.add_metric", model, + objective=objective) + """ + settings = { + "objective": objective, + } + + metric = file.create_entity( + "IfcMetric", + **{ + "Name": "Unnamed", + "ConstraintGrade": "NOTDEFINED", + "Benchmark": "EQUALTO", } - - def execute(self): - metric = self.file.create_entity( - "IfcMetric", - **{ - "Name": "Unnamed", - "ConstraintGrade": "NOTDEFINED", - "Benchmark": "EQUALTO", - } - ) - if self.settings["objective"]: - benchmark_values = list(self.settings["objective"].BenchmarkValues or []) - benchmark_values.append(metric) - self.settings["objective"].BenchmarkValues = benchmark_values - return metric + ) + if settings["objective"]: + benchmark_values = list(settings["objective"].BenchmarkValues or []) + benchmark_values.append(metric) + settings["objective"].BenchmarkValues = benchmark_values + return metric diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric_reference.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric_reference.py index 072c71ecb0..a3c37392e2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric_reference.py @@ -18,28 +18,26 @@ import ifcopenshell -class Usecase: - def __init__(self, file, metric=None, reference_path=None): - """ - Adds a chain of references to a metric. The reference path is a string of the form "attribute.attribute.attribute" - Used to reference a value of an attribute of an instance through a metric objective entity. - """ - self.file = file - self.settings = {"metric": metric, "reference_path": reference_path} - def execute(self): - if self.settings["reference_path"]: - attributes = self.settings["reference_path"].split(".") - references_created = [] - for i in range(len(attributes)): - if i == 0: - reference = self.file.create_entity("IfcReference") - reference.AttributeIdentifier = attributes[i] - self.settings["metric"].ReferencePath = reference - references_created.append(reference) - else: - reference = self.file.create_entity("IfcReference") - reference.AttributeIdentifier = attributes[i] - references_created[i-1].InnerReference = reference - references_created.append(reference) - return references_created \ No newline at end of file +def add_metric_reference(file, metric=None, reference_path=None) -> None: + """ + Adds a chain of references to a metric. The reference path is a string of the form "attribute.attribute.attribute" + Used to reference a value of an attribute of an instance through a metric objective entity. + """ + settings = {"metric": metric, "reference_path": reference_path} + + if settings["reference_path"]: + attributes = settings["reference_path"].split(".") + references_created = [] + for i in range(len(attributes)): + if i == 0: + reference = file.create_entity("IfcReference") + reference.AttributeIdentifier = attributes[i] + settings["metric"].ReferencePath = reference + references_created.append(reference) + else: + reference = file.create_entity("IfcReference") + reference.AttributeIdentifier = attributes[i] + references_created[i - 1].InnerReference = reference + references_created.append(reference) + return references_created diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py index 40fb46dfd2..efce0bc080 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py @@ -19,34 +19,31 @@ import ifcopenshell -class Usecase: - def __init__(self, file): - """Add a new objective constraint +def add_objective(file) -> None: + """Add a new objective constraint - Parametric constraints may be defined by the user. The constraint is defined - by first creating an objective describing the purpose of the constraint and - whether it is a hard or soft constraint. Later on, metrics may be added to - check whether the constraint has been met by connecting it to properties and - quantities. See ifcopenshell.api.constraint.add_metric for more information. + Parametric constraints may be defined by the user. The constraint is defined + by first creating an objective describing the purpose of the constraint and + whether it is a hard or soft constraint. Later on, metrics may be added to + check whether the constraint has been met by connecting it to properties and + quantities. See ifcopenshell.api.constraint.add_metric for more information. - :return: The newly created IfcObjective entity - :rtype: ifcopenshell.entity_instance + :return: The newly created IfcObjective entity + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Create a new objective for code compliance requirements - objective = ifcopenshell.api.run("constraint.add_objective", model) - objective.ConstraintGrade = "ADVISORY" - objective.ObjectiveQualifier = "CODECOMPLIANCE" - # Note: the objective right now is purely qualitative and for - # information purposes. You may wish to add quantiative metrics. - """ - self.file = file - self.settings = {} + # Create a new objective for code compliance requirements + objective = ifcopenshell.api.run("constraint.add_objective", model) + objective.ConstraintGrade = "ADVISORY" + objective.ObjectiveQualifier = "CODECOMPLIANCE" + # Note: the objective right now is purely qualitative and for + # information purposes. You may wish to add quantiative metrics. + """ + settings = {} - def execute(self): - return self.file.create_entity( - "IfcObjective", **{"Name": "Unnamed", "ConstraintGrade": "NOTDEFINED", "ObjectiveQualifier": "NOTDEFINED"} - ) + return file.create_entity( + "IfcObjective", **{"Name": "Unnamed", "ConstraintGrade": "NOTDEFINED", "ObjectiveQualifier": "NOTDEFINED"} + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py index dfc826faf8..89a80d9ab3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py @@ -21,39 +21,41 @@ import ifcopenshell.api from typing import Union +def assign_constraint( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + constraint: ifcopenshell.entity_instance, +) -> Union[ifcopenshell.entity_instance, None]: + """Assigns a constraint to a list of products + + This assigns a relationship between a product and a constraint, so that + when a product's properties and quantities do not match the requirements + of the constraint's metrics, results can be flagged. + + It is assumed (but not explicit in the IFC documentation) that + constraints are inherited from the type. This way, it is not necessary + to create lots of constraint assignments. + + :param products: The list of products the constraint applies to. This is anything + which can have properties or quantities. + :type products: list[ifcopenshell.entity_instance] + :param constraint: The IfcObjective constraint + :type constraint: ifcopenshell.entity_instance + :return: The new or updated IfcRelAssociatesConstraint relationship + or `None` if `products` was an empty list. + :rtype: ifcopenshell.entity_instance + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "products": products, + "constraint": constraint, + } + return usecase.execute() + + class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - constraint: ifcopenshell.entity_instance, - ): - """Assigns a constraint to a list of products - - This assigns a relationship between a product and a constraint, so that - when a product's properties and quantities do not match the requirements - of the constraint's metrics, results can be flagged. - - It is assumed (but not explicit in the IFC documentation) that - constraints are inherited from the type. This way, it is not necessary - to create lots of constraint assignments. - - :param products: The list of products the constraint applies to. This is anything - which can have properties or quantities. - :type products: list[ifcopenshell.entity_instance] - :param constraint: The IfcObjective constraint - :type constraint: ifcopenshell.entity_instance - :return: The new or updated IfcRelAssociatesConstraint relationship - or `None` if `products` was an empty list. - :rtype: ifcopenshell.entity_instance - """ - self.file = file - self.settings = { - "products": products, - "constraint": constraint, - } - - def execute(self) -> Union[ifcopenshell.entity_instance, None]: + def execute(self): products = set(self.settings["products"]) if not products: return diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py index 72fead7d88..b1ba5699ca 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py @@ -17,33 +17,30 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, metric=None, attributes=None): - """Edit the attributes of a metric +def edit_metric(file, metric=None, attributes=None) -> None: + """Edit the attributes of a metric - For more information about the attributes and data types of an - IfcMetric, consult the IFC documentation. + For more information about the attributes and data types of an + IfcMetric, consult the IFC documentation. - :param metric: The IfcMetric you want to edit. - :type metric: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param metric: The IfcMetric you want to edit. + :type metric: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - objective = ifcopenshell.api.run("constraint.add_objective", model) - metric = ifcopenshell.api.run("constraint.add_metric", model, - objective=objective) - ifcopenshell.api.run("constraint.edit_metric", model, - metric=metric, attributes={"ConstraintGrade": "HARD"}) - """ - self.file = file - self.settings = {"metric": metric, "attributes": attributes or {}} + objective = ifcopenshell.api.run("constraint.add_objective", model) + metric = ifcopenshell.api.run("constraint.add_metric", model, + objective=objective) + ifcopenshell.api.run("constraint.edit_metric", model, + metric=metric, attributes={"ConstraintGrade": "HARD"}) + """ + settings = {"metric": metric, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["metric"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["metric"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py index dff4985539..6ce5c597e8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py @@ -17,31 +17,28 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, objective=None, attributes=None): - """Edit the attributes of a objective +def edit_objective(file, objective=None, attributes=None) -> None: + """Edit the attributes of a objective - For more information about the attributes and data types of an - IfcObjective, consult the IFC documentation. + For more information about the attributes and data types of an + IfcObjective, consult the IFC documentation. - :param objective: The IfcObjective you want to edit. - :type objective: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param objective: The IfcObjective you want to edit. + :type objective: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - objective = ifcopenshell.api.run("constraint.add_objective", model) - ifcopenshell.api.run("constraint.edit_objective", model, - objective=objective, attributes={"ConstraintGrade": "HARD"}) - """ - self.file = file - self.settings = {"objective": objective, "attributes": attributes or {}} + objective = ifcopenshell.api.run("constraint.add_objective", model) + ifcopenshell.api.run("constraint.edit_objective", model, + objective=objective, attributes={"ConstraintGrade": "HARD"}) + """ + settings = {"objective": objective, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["objective"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["objective"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py index e7dab1afb0..30b61fb5c7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py @@ -20,36 +20,33 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, constraint=None): - """Remove a constraint (typically an objective) +def remove_constraint(file, constraint=None) -> None: + """Remove a constraint (typically an objective) - Removes a constraint definition and all of its associations to any - products. Typically this would be an IfcObjective, although technically - you can associate IfcMetrics ith products too, though the meaning may be - unclear. + Removes a constraint definition and all of its associations to any + products. Typically this would be an IfcObjective, although technically + you can associate IfcMetrics ith products too, though the meaning may be + unclear. - :param constraint: The IfcObjective you want to remove. - :type constraint: ifcopenshell.entity_instance - :return: None - :rtype: None + :param constraint: The IfcObjective you want to remove. + :type constraint: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - objective = ifcopenshell.api.run("constraint.add_objective", model) - ifcopenshell.api.run("constraint.remove_constraint", model, - constraint=objective) - """ - self.file = file - self.settings = {"constraint": constraint} + objective = ifcopenshell.api.run("constraint.add_objective", model) + ifcopenshell.api.run("constraint.remove_constraint", model, + constraint=objective) + """ + settings = {"constraint": constraint} - def execute(self): - self.file.remove(self.settings["constraint"]) - for rel in self.file.by_type("IfcRelAssociatesConstraint"): - if not rel.RelatingConstraint: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + file.remove(settings["constraint"]) + for rel in file.by_type("IfcRelAssociatesConstraint"): + if not rel.RelatingConstraint: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py index 6eaf012fa2..49203da3c5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py @@ -17,31 +17,34 @@ # along with IfcOpenShell. If not, see . +def remove_metric(file, metric=None) -> None: + """Remove a metric benchmark + + Removes a metric benchmark and all of its associations to any products + and objectives. + + :param metric: The IfcMetric you want to remove. + :type metric: ifcopenshell.entity_instance + :return: None + :rtype: None + + Example: + + .. code:: python + + objective = ifcopenshell.api.run("constraint.add_objective", model) + metric = ifcopenshell.api.run("constraint.add_metric", model, + objective=objective) + ifcopenshell.api.run("constraint.remove_metric", model, + metric=metric) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"metric": metric} + return usecase.execute() + + class Usecase: - def __init__(self, file, metric=None): - """Remove a metric benchmark - - Removes a metric benchmark and all of its associations to any products - and objectives. - - :param metric: The IfcMetric you want to remove. - :type metric: ifcopenshell.entity_instance - :return: None - :rtype: None - - Example: - - .. code:: python - - objective = ifcopenshell.api.run("constraint.add_objective", model) - metric = ifcopenshell.api.run("constraint.add_metric", model, - objective=objective) - ifcopenshell.api.run("constraint.remove_metric", model, - metric=metric) - """ - self.file = file - self.settings = {"metric": metric} - def execute(self): if self.settings["metric"].ReferencePath: reference = self.settings["metric"].ReferencePath diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py index 3b6471713e..138964e265 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/unassign_constraint.py @@ -21,31 +21,33 @@ import ifcopenshell.api import ifcopenshell.util.element +def unassign_constraint( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + constraint: ifcopenshell.entity_instance, +) -> None: + """Unassigns a constraint from a list of products + + The constraint will not be deleted and is available to be assigned to + other products. + + :param products: The list of products the constraint applies to. + :type products: list[ifcopenshell.entity_instance] + :param constraint: The IfcObjective constraint + :type constraint: ifcopenshell.entity_instance + :return: None + :rtype: None + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "products": products, + "constraint": constraint, + } + return usecase.execute() + + class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - constraint: ifcopenshell.entity_instance, - ): - """Unassigns a constraint from a list of products - - The constraint will not be deleted and is available to be assigned to - other products. - - :param products: The list of products the constraint applies to. - :type products: list[ifcopenshell.entity_instance] - :param constraint: The IfcObjective constraint - :type constraint: ifcopenshell.entity_instance - :return: None - :rtype: None - """ - self.file = file - self.settings = { - "products": products, - "constraint": constraint, - } - def execute(self): products = set(self.settings["products"]) if not products: diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py index e0caddbe3c..1edb3ee252 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_context import add_context +from .edit_context import edit_context +from .remove_context import remove_context diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py index 02156daf0b..95a0929ab6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py @@ -17,168 +17,171 @@ # along with IfcOpenShell. If not, see . +def add_context(file, context_type=None, context_identifier=None, target_view=None, parent=None) -> None: + """Adds a new geometric representation context + + In IFC, physical objects may have zero, one, or multiple geometric + representations associated with it. For example, a building storey might + not have any geometry, but simply be a coordinate in space. + Alternatively, a wall might have a 3D body representation in the form of + a cuboid. As a final example, a door might also have a 3D body + representation of a 3D door panel and door frame, but may additionally + have a 2D door plan view representation of the door swing, and even a 2D + elevation view of the door, a 3D box representing the disabled clearance + zone of the door, a 2D profile representing the profile of the door to + cut out in a wall, and so on. In this situation, a door will have + multiple geometric representations. + + To distinguish between the different purposes of multiple geometric + representations, each geometric representation must belong to a + geometric representation "context". There are typically always 2 + contexts, one for 3D representations and one for 2D representations. + These 2 contexts then have subcontexts for things like the 3D body + representation, clearance representations, annotation representations, + and so on. Each representation of a physical IFC product (e.g. a door) + must be assigned to one of these subcontexts. Therefore setting up + appropriate contexts is critical prior to authoring any IFC model which + contains geometry. + + There are two steps to setting up appropriate subcontexts. First, a 2D + and/or 3D context must be added. These must be always called the "Model" + context for 3D and the "Plan" context for 2D (even if the 2D geometry is + not a plan view). Then, one or more subcontexts are added using either + the "Model" or "Plan" as their parent. These subcontexts are further + distinguished using an "identifier" and "target view". The "identifier" + describes the purpose of the representation, and the "target view" + describes the typical diagrammatic presentation that context's geometry + should be viewed in. The most common identifiers you might use are: + + - Body: for the actual shape of the object + - Box: the bounding box of the object (useful for shape analytics) + - Axis: the parametric line determining the shape of the object + - Profile: the elevation silhouette of the object, useful for cutting + out holes for the object to fit into host elements + - Footprint: the plan view silhouette of the object, useful for certain + quantity take-off rules + - Clearance: the clearance zone of the object + - Annotation: symbolic annotations typically used in diagrams or + drawings + + The most common "target views" you might use are: + + - MODEL_VIEW: for 3D geometry you might see in a BIM viewer + - PLAN_VIEW: for 2D geometry you might see in a plan representation + - ELEVATION_VIEW: for 2D geometry you might see in an elevation representation + - SECTION_VIEW: for 2D geometry you might see in a section representation + - GRAPH_VIEW: for 2D or 3D line or frame or path connectivity diagrams + you might use for structural frame analysis, axis-based parametric + modeling + - SKETCH_VIEW: for viewing abstract high-level representations such as + in bubble diagrams of spatial topology + + This may sound like a lot, but after a few typical contexts are set up + at the beginning, it becomes easy to navigate and isolate geometry for + different purposes. There is also the concept of a target scale, which + represents the zoom level detail of geometry, but this is not currently + supported by this API. Setting up all these contexts are also optional, + and you may only use a single Model context and Body subcontext for + simple models, but this simplification sacrifices the ability of more + parametric or analytical usecases. + + :param context_type: The type of the context, must be one of "Model" or + "Plan" only. + :type context_type: str + :param context_identifier: The identifier of the context, chosen from + one of the common identifiers above or consult the IFC documentation + (under the IfcShapeRepresentation page) for more details. Optional + for contexts, but mandatory for subcontexts. + :type context_identifier: str, optional + :param target_view: the target view of the context, chosen from one of + the common target views above or consult the IFC documentation + (under the IfcShapeRepresentation page) for more details. Optional + for contexts, but mandatory for subcontexts. + :type target_view: str, optional + :param parent: the parent context. Must be left as None (the default) + for contexts, and only set for subcontexts. Note that there are only + contexts and subcontexts, a subcontext cannot have any children. + :type parent: ifcopenshell.entity_instance, optional + :return: the newly created IfcGeometricRepresentationContext or + IfcGeometricRepresentationSubContext entity + :rtype: ifcopenshell.entity_instance, optional + + Example: + + .. code:: python + + # If we plan to store 3D geometry in our IFC model, we have to setup + # a "Model" context. + model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") + + # And/Or, if we plan to store 2D geometry, we need a "Plan" context + plan = ifcopenshell.api.run("context.add_context", model, context_type="Plan") + + # Now we setup the subcontexts with each of the geometric "purposes" + # we plan to store in our model. "Body" is by far the most important + # and common context, as most IFC models are assumed to be viewable + # in 3D. + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) + + # The 3D Axis subcontext is important if any "axis-based" parametric + # geometry is going to be created. For example, a beam, or column + # may be drawn using a single 3D axis line, and for this we need an + # Axis subcontext. + ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Axis", target_view="GRAPH_VIEW", parent=model3d) + + # The 3D Box subcontext is useful for clash detection or shape + # analysis, or even lazy-loading of large models. + ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Box", target_view="MODEL_VIEW", parent=model3d) + + # It's also important to have a 2D Axis subcontext for things like + # walls and claddings which can be drawn using a 2D axis line. + ifcopenshell.api.run("context.add_context", model, + context_type="Plan", context_identifier="Axis", target_view="GRAPH_VIEW", parent=plan) + + # A 2D annotation subcontext for plan views are important for door + # swings, window cuts, and symbols for equipment like GPOs, fire + # extinguishers, and so on. + ifcopenshell.api.run("context.add_context", model, + context_type="Plan", context_identifier="Annotation", target_view="PLAN_VIEW", parent=plan) + + # You may also create 2D annotation subcontexts for sections and + # elevation views. + ifcopenshell.api.run("context.add_context", model, + context_type="Plan", context_identifier="Annotation", target_view="SECTION_VIEW", parent=plan) + ifcopenshell.api.run("context.add_context", model, + context_type="Plan", context_identifier="Annotation", target_view="ELEVATION_VIEW", parent=plan) + + # Let's create a new wall. The wall does not have any geometry yet. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # Let's use the "3D Body" representation we created earlier to add a + # new wall-like body geometry, 5 meters long, 3 meters high, and + # 200mm thick + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=5, height=3, thickness=0.2) + + # Assign our new body geometry back to our wall + ifcopenshell.api.run("geometry.assign_representation", model, + product=wall, representation=representation) + + # Place our wall at the origin + ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "context_type": context_type, + "parent": parent, + "context_identifier": context_identifier, + "target_view": target_view, + } + return usecase.execute() + + class Usecase: - def __init__(self, file, context_type=None, context_identifier=None, target_view=None, parent=None): - """Adds a new geometric representation context - - In IFC, physical objects may have zero, one, or multiple geometric - representations associated with it. For example, a building storey might - not have any geometry, but simply be a coordinate in space. - Alternatively, a wall might have a 3D body representation in the form of - a cuboid. As a final example, a door might also have a 3D body - representation of a 3D door panel and door frame, but may additionally - have a 2D door plan view representation of the door swing, and even a 2D - elevation view of the door, a 3D box representing the disabled clearance - zone of the door, a 2D profile representing the profile of the door to - cut out in a wall, and so on. In this situation, a door will have - multiple geometric representations. - - To distinguish between the different purposes of multiple geometric - representations, each geometric representation must belong to a - geometric representation "context". There are typically always 2 - contexts, one for 3D representations and one for 2D representations. - These 2 contexts then have subcontexts for things like the 3D body - representation, clearance representations, annotation representations, - and so on. Each representation of a physical IFC product (e.g. a door) - must be assigned to one of these subcontexts. Therefore setting up - appropriate contexts is critical prior to authoring any IFC model which - contains geometry. - - There are two steps to setting up appropriate subcontexts. First, a 2D - and/or 3D context must be added. These must be always called the "Model" - context for 3D and the "Plan" context for 2D (even if the 2D geometry is - not a plan view). Then, one or more subcontexts are added using either - the "Model" or "Plan" as their parent. These subcontexts are further - distinguished using an "identifier" and "target view". The "identifier" - describes the purpose of the representation, and the "target view" - describes the typical diagrammatic presentation that context's geometry - should be viewed in. The most common identifiers you might use are: - - - Body: for the actual shape of the object - - Box: the bounding box of the object (useful for shape analytics) - - Axis: the parametric line determining the shape of the object - - Profile: the elevation silhouette of the object, useful for cutting - out holes for the object to fit into host elements - - Footprint: the plan view silhouette of the object, useful for certain - quantity take-off rules - - Clearance: the clearance zone of the object - - Annotation: symbolic annotations typically used in diagrams or - drawings - - The most common "target views" you might use are: - - - MODEL_VIEW: for 3D geometry you might see in a BIM viewer - - PLAN_VIEW: for 2D geometry you might see in a plan representation - - ELEVATION_VIEW: for 2D geometry you might see in an elevation representation - - SECTION_VIEW: for 2D geometry you might see in a section representation - - GRAPH_VIEW: for 2D or 3D line or frame or path connectivity diagrams - you might use for structural frame analysis, axis-based parametric - modeling - - SKETCH_VIEW: for viewing abstract high-level representations such as - in bubble diagrams of spatial topology - - This may sound like a lot, but after a few typical contexts are set up - at the beginning, it becomes easy to navigate and isolate geometry for - different purposes. There is also the concept of a target scale, which - represents the zoom level detail of geometry, but this is not currently - supported by this API. Setting up all these contexts are also optional, - and you may only use a single Model context and Body subcontext for - simple models, but this simplification sacrifices the ability of more - parametric or analytical usecases. - - :param context_type: The type of the context, must be one of "Model" or - "Plan" only. - :type context_type: str - :param context_identifier: The identifier of the context, chosen from - one of the common identifiers above or consult the IFC documentation - (under the IfcShapeRepresentation page) for more details. Optional - for contexts, but mandatory for subcontexts. - :type context_identifier: str, optional - :param target_view: the target view of the context, chosen from one of - the common target views above or consult the IFC documentation - (under the IfcShapeRepresentation page) for more details. Optional - for contexts, but mandatory for subcontexts. - :type target_view: str, optional - :param parent: the parent context. Must be left as None (the default) - for contexts, and only set for subcontexts. Note that there are only - contexts and subcontexts, a subcontext cannot have any children. - :type parent: ifcopenshell.entity_instance, optional - :return: the newly created IfcGeometricRepresentationContext or - IfcGeometricRepresentationSubContext entity - :rtype: ifcopenshell.entity_instance, optional - - Example: - - .. code:: python - - # If we plan to store 3D geometry in our IFC model, we have to setup - # a "Model" context. - model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") - - # And/Or, if we plan to store 2D geometry, we need a "Plan" context - plan = ifcopenshell.api.run("context.add_context", model, context_type="Plan") - - # Now we setup the subcontexts with each of the geometric "purposes" - # we plan to store in our model. "Body" is by far the most important - # and common context, as most IFC models are assumed to be viewable - # in 3D. - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) - - # The 3D Axis subcontext is important if any "axis-based" parametric - # geometry is going to be created. For example, a beam, or column - # may be drawn using a single 3D axis line, and for this we need an - # Axis subcontext. - ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Axis", target_view="GRAPH_VIEW", parent=model3d) - - # The 3D Box subcontext is useful for clash detection or shape - # analysis, or even lazy-loading of large models. - ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Box", target_view="MODEL_VIEW", parent=model3d) - - # It's also important to have a 2D Axis subcontext for things like - # walls and claddings which can be drawn using a 2D axis line. - ifcopenshell.api.run("context.add_context", model, - context_type="Plan", context_identifier="Axis", target_view="GRAPH_VIEW", parent=plan) - - # A 2D annotation subcontext for plan views are important for door - # swings, window cuts, and symbols for equipment like GPOs, fire - # extinguishers, and so on. - ifcopenshell.api.run("context.add_context", model, - context_type="Plan", context_identifier="Annotation", target_view="PLAN_VIEW", parent=plan) - - # You may also create 2D annotation subcontexts for sections and - # elevation views. - ifcopenshell.api.run("context.add_context", model, - context_type="Plan", context_identifier="Annotation", target_view="SECTION_VIEW", parent=plan) - ifcopenshell.api.run("context.add_context", model, - context_type="Plan", context_identifier="Annotation", target_view="ELEVATION_VIEW", parent=plan) - - # Let's create a new wall. The wall does not have any geometry yet. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # Let's use the "3D Body" representation we created earlier to add a - # new wall-like body geometry, 5 meters long, 3 meters high, and - # 200mm thick - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=5, height=3, thickness=0.2) - - # Assign our new body geometry back to our wall - ifcopenshell.api.run("geometry.assign_representation", model, - product=wall, representation=representation) - - # Place our wall at the origin - ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) - """ - self.file = file - self.settings = { - "context_type": context_type, - "parent": parent, - "context_identifier": context_identifier, - "target_view": target_view, - } - def execute(self): if not self.settings["parent"]: if self.settings["context_type"] == "Plan": diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py index 50f4612c75..30f6d642b1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py @@ -17,37 +17,34 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, context, attributes): - """Edits the attributes of an IfcGeometricRepresentationContext +def edit_context(file, context, attributes) -> None: + """Edits the attributes of an IfcGeometricRepresentationContext - For more information about the attributes and data types of an - IfcGeometricRepresentationContext, consult the IFC documentation. + For more information about the attributes and data types of an + IfcGeometricRepresentationContext, consult the IFC documentation. - :param context: The IfcGeometricRepresentationContext entity you want to edit - :type context: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param context: The IfcGeometricRepresentationContext entity you want to edit + :type context: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - model = ifcopenshell.api.run("context.add_context", model, context_type="Model") - # Revit had a bug where they incorrectly called the body representation a "Facetation" - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Facetation", target_view="MODEL_VIEW", parent=model - ) + model = ifcopenshell.api.run("context.add_context", model, context_type="Model") + # Revit had a bug where they incorrectly called the body representation a "Facetation" + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Facetation", target_view="MODEL_VIEW", parent=model + ) - # Let's fix it! - ifcopenshell.api.run("context.edit_context", model, - context=body, attributes={"ContextIdentifier": "Body"}) - """ - self.file = file - self.settings = {"context": context, "attributes": attributes or {}} + # Let's fix it! + ifcopenshell.api.run("context.edit_context", model, + context=body, attributes={"ContextIdentifier": "Body"}) + """ + settings = {"context": context, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["context"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["context"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py index b0025efbdb..9ac30483cf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py @@ -19,49 +19,46 @@ import ifcopenshell -class Usecase: - def __init__(self, file, context=None): - """Removes an IfcGeometricRepresentationContext +def remove_context(file, context=None) -> None: + """Removes an IfcGeometricRepresentationContext - Any representation geometry that is assigned to the context is also - removed. If a context is removed, then any subcontexts are also removed. + Any representation geometry that is assigned to the context is also + removed. If a context is removed, then any subcontexts are also removed. - :param context: The IfcGeometricRepresentationContext entity to remove - :type context: ifcopenshell.entity_instance - :return: None - :rtype: None + :param context: The IfcGeometricRepresentationContext entity to remove + :type context: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - model = ifcopenshell.api.run("context.add_context", model, context_type="Model") - # Revit had a bug where they incorrectly called the body representation a "Facetation" - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Facetation", target_view="MODEL_VIEW", parent=model - ) + model = ifcopenshell.api.run("context.add_context", model, context_type="Model") + # Revit had a bug where they incorrectly called the body representation a "Facetation" + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Facetation", target_view="MODEL_VIEW", parent=model + ) - # Let's just get rid of it completely - ifcopenshell.api.run("context.remove_context", model, context=body) - """ - self.file = file - self.settings = {"context": context} + # Let's just get rid of it completely + ifcopenshell.api.run("context.remove_context", model, context=body) + """ + settings = {"context": context} - def execute(self): - for subcontext in self.settings["context"].HasSubContexts: - ifcopenshell.api.run("context.remove_context", self.file, context=subcontext) + for subcontext in settings["context"].HasSubContexts: + ifcopenshell.api.run("context.remove_context", file, context=subcontext) - if getattr(self.settings["context"], "ParentContext", None): - new = self.settings["context"].ParentContext - for inverse in self.file.get_inverse(self.settings["context"]): - if inverse.is_a("IfcCoordinateOperation"): - inverse.SourceCRS = inverse.TargetCRS - ifcopenshell.util.element.remove_deep(self.file, inverse) - else: - ifcopenshell.util.element.replace_attribute(inverse, self.settings["context"], new) - self.file.remove(self.settings["context"]) - else: - representations_in_context = self.settings["context"].RepresentationsInContext - self.file.remove(self.settings["context"]) - for element in representations_in_context: - ifcopenshell.api.run("geometry.remove_representation", self.file, representation=element) + if getattr(settings["context"], "ParentContext", None): + new = settings["context"].ParentContext + for inverse in file.get_inverse(settings["context"]): + if inverse.is_a("IfcCoordinateOperation"): + inverse.SourceCRS = inverse.TargetCRS + ifcopenshell.util.element.remove_deep(file, inverse) + else: + ifcopenshell.util.element.replace_attribute(inverse, settings["context"], new) + file.remove(settings["context"]) + else: + representations_in_context = settings["context"].RepresentationsInContext + file.remove(settings["context"]) + for element in representations_in_context: + ifcopenshell.api.run("geometry.remove_representation", file, representation=element) diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py index e0caddbe3c..792f5eec35 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py @@ -15,3 +15,6 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .assign_control import assign_control +from .unassign_control import unassign_control diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py b/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py index 4d1ecb128d..93a4fe2f35 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py @@ -20,87 +20,81 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, relating_control=None, related_object=None): - """Assigns a planning control or constraint to an object +def assign_control(file, relating_control=None, related_object=None) -> None: + """Assigns a planning control or constraint to an object - IFC can describe concepts that control other objects. For example, a - planning calendar controls the availability of working days for - construction planning. As another example, a cost item might constrain - or limit the ability to procure and build a product. + IFC can describe concepts that control other objects. For example, a + planning calendar controls the availability of working days for + construction planning. As another example, a cost item might constrain + or limit the ability to procure and build a product. - This usecase lets you assign controls following the rules of the IFC - specification. This is an advanced topic and assumes knowledge of the - IFC concepts to determine what is allowed to control what. In the - future, this API will likely be deprecated in favour of multiple usecase - specific APIs. + This usecase lets you assign controls following the rules of the IFC + specification. This is an advanced topic and assumes knowledge of the + IFC concepts to determine what is allowed to control what. In the + future, this API will likely be deprecated in favour of multiple usecase + specific APIs. - :param relating_control: The IfcControl entity that is creating the - control or constraint - :type relating_control: ifcopenshell.entity_instance - :param related_object: The IfcObjectDefinition that is being controlled - :type related_object: ifcopenshell.entity_instance - :return: The newly created IfcRelAssignsToControl. If relationship already - existed before and wasn't changed then returns None. - :rtype: ifcopenshell.entity_instance, None + :param relating_control: The IfcControl entity that is creating the + control or constraint + :type relating_control: ifcopenshell.entity_instance + :param related_object: The IfcObjectDefinition that is being controlled + :type related_object: ifcopenshell.entity_instance + :return: The newly created IfcRelAssignsToControl. If relationship already + existed before and wasn't changed then returns None. + :rtype: ifcopenshell.entity_instance, None - Example: + Example: - .. code:: python + .. code:: python - # One common usecase is to assign a calendar to a task - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model) - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule) + # One common usecase is to assign a calendar to a task + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model) + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule) - # All subtasks will inherit this calendar, so assigning a single - # calendar to the root task effectively defines a "default" calendar - ifcopenshell.api.run("control.assign_control", model, - relating_control=calendar, related_object=task) + # All subtasks will inherit this calendar, so assigning a single + # calendar to the root task effectively defines a "default" calendar + ifcopenshell.api.run("control.assign_control", model, + relating_control=calendar, related_object=task) - # Another common example might be relating a cost item and a product - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - cost_item = ifcopenshell.api.run("cost.add_cost_item", model, - cost_schedule=schedule) - ifcopenshell.api.run("control.assign_control", model, - relating_control=cost_item, related_object=wall) - """ - self.file = file - self.settings = { - "relating_control": relating_control, - "related_object": related_object, - } + # Another common example might be relating a cost item and a product + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + cost_item = ifcopenshell.api.run("cost.add_cost_item", model, + cost_schedule=schedule) + ifcopenshell.api.run("control.assign_control", model, + relating_control=cost_item, related_object=wall) + """ + settings = { + "relating_control": relating_control, + "related_object": related_object, + } - def execute(self): - if self.settings["related_object"].HasAssignments: - for assignment in self.settings["related_object"].HasAssignments: - if ( - assignment.is_a("IfcRelAssignsToControl") - and assignment.RelatingControl == self.settings["relating_control"] - ): - return - - controls = None - if self.settings["relating_control"].Controls: - controls = self.settings["relating_control"].Controls[0] - - if controls: - if self.settings["related_object"] in controls.RelatedObjects: + if settings["related_object"].HasAssignments: + for assignment in settings["related_object"].HasAssignments: + if assignment.is_a("IfcRelAssignsToControl") and assignment.RelatingControl == settings["relating_control"]: return - related_objects = set(controls.RelatedObjects) - related_objects.add(self.settings["related_object"]) - controls.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": controls}) - else: - controls = self.file.create_entity( - "IfcRelAssignsToControl", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": [self.settings["related_object"]], - "RelatingControl": self.settings["relating_control"], - }, - ) - return controls + + controls = None + if settings["relating_control"].Controls: + controls = settings["relating_control"].Controls[0] + + if controls: + if settings["related_object"] in controls.RelatedObjects: + return + related_objects = set(controls.RelatedObjects) + related_objects.add(settings["related_object"]) + controls.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": controls}) + else: + controls = file.create_entity( + "IfcRelAssignsToControl", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": [settings["related_object"]], + "RelatingControl": settings["relating_control"], + }, + ) + return controls diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py b/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py index 72996ad62a..0463689c5f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py @@ -21,54 +21,51 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, relating_control=None, related_object=None): - """Unassigns a planning control or constraint to an object +def unassign_control(file, relating_control=None, related_object=None) -> None: + """Unassigns a planning control or constraint to an object - :param relating_control: The IfcControl entity that is creating the - control or constraint - :type relating_control: ifcopenshell.entity_instance - :param related_object: The IfcObjectDefinition that is being controlled - :type related_object: ifcopenshell.entity_instance - :return: If the control still is related to other objects, the - IfcRelAssignsToControl is returned, otherwise None. - :rtype: ifcopenshell.entity_instance, None + :param relating_control: The IfcControl entity that is creating the + control or constraint + :type relating_control: ifcopenshell.entity_instance + :param related_object: The IfcObjectDefinition that is being controlled + :type related_object: ifcopenshell.entity_instance + :return: If the control still is related to other objects, the + IfcRelAssignsToControl is returned, otherwise None. + :rtype: ifcopenshell.entity_instance, None - Example: + Example: - .. code:: python + .. code:: python - # Let's relate a cost item and a product - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - cost_item = ifcopenshell.api.run("cost.add_cost_item", model, - cost_schedule=schedule) - ifcopenshell.api.run("control.assign_control", model, - relating_control=cost_item, related_object=wall) + # Let's relate a cost item and a product + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + cost_item = ifcopenshell.api.run("cost.add_cost_item", model, + cost_schedule=schedule) + ifcopenshell.api.run("control.assign_control", model, + relating_control=cost_item, related_object=wall) - # And now let's change our mind - ifcopenshell.api.run("control.unassign_control", model, - relating_control=cost_item, related_object=wall) - """ + # And now let's change our mind + ifcopenshell.api.run("control.unassign_control", model, + relating_control=cost_item, related_object=wall) + """ - self.file = file - self.settings = { - "relating_control": relating_control, - "related_object": related_object, - } + settings = { + "relating_control": relating_control, + "related_object": related_object, + } - def execute(self): - for rel in self.settings["related_object"].HasAssignments or []: - if not rel.is_a("IfcRelAssignsToControl") or rel.RelatingControl != self.settings["relating_control"]: - continue - if len(rel.RelatedObjects) == 1: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - return - related_objects = list(rel.RelatedObjects) - related_objects.remove(self.settings["related_object"]) - rel.RelatedObjects = related_objects - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - return rel + for rel in settings["related_object"].HasAssignments or []: + if not rel.is_a("IfcRelAssignsToControl") or rel.RelatingControl != settings["relating_control"]: + continue + if len(rel.RelatedObjects) == 1: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + return + related_objects = list(rel.RelatedObjects) + related_objects.remove(settings["related_object"]) + rel.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py index e0caddbe3c..4cf5fc63c6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py @@ -15,3 +15,23 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_cost_item import add_cost_item +from .add_cost_item_quantity import add_cost_item_quantity +from .add_cost_schedule import add_cost_schedule +from .add_cost_value import add_cost_value +from .assign_cost_item_quantity import assign_cost_item_quantity +from .assign_cost_value import assign_cost_value +from .calculate_cost_item_resource_value import calculate_cost_item_resource_value +from .copy_cost_item import copy_cost_item +from .copy_cost_item_values import copy_cost_item_values +from .edit_cost_item import edit_cost_item +from .edit_cost_item_quantity import edit_cost_item_quantity +from .edit_cost_schedule import edit_cost_schedule +from .edit_cost_value import edit_cost_value +from .edit_cost_value_formula import edit_cost_value_formula +from .remove_cost_item import remove_cost_item +from .remove_cost_item_quantity import remove_cost_item_quantity +from .remove_cost_schedule import remove_cost_schedule +from .remove_cost_value import remove_cost_value +from .unassign_cost_item_quantity import unassign_cost_item_quantity diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py index 26a0bba442..f270446cfd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py @@ -19,55 +19,52 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, cost_schedule=None, cost_item=None): - """Add a new cost item +def add_cost_item(file, cost_schedule=None, cost_item=None) -> None: + """Add a new cost item - A cost item represents a single line item in a cost schedule. Cost items - may then be broken down into cost subitems. + A cost item represents a single line item in a cost schedule. Cost items + may then be broken down into cost subitems. - :param cost_schedule: If the cost item is to be added as a root or top - level cost item to a cost schedule, the IfcCostSchedule may be - specified. This is mutually exlclusive to the cost_item parameter. - :type cost_schedule: ifcopenshell.entity_instance - :param cost_item: If the cost item is to be added as a subitem to an - existing cost item, the parent IfcCostItem may be specified. This is - mutually exclusive to the cost_schedule parameter. - :type cost_item: ifcopenshell.entity_instance - :return: The newly created IfcCostItem - :rtype: ifcopenshell.entity_instance + :param cost_schedule: If the cost item is to be added as a root or top + level cost item to a cost schedule, the IfcCostSchedule may be + specified. This is mutually exlclusive to the cost_item parameter. + :type cost_schedule: ifcopenshell.entity_instance + :param cost_item: If the cost item is to be added as a subitem to an + existing cost item, the parent IfcCostItem may be specified. This is + mutually exclusive to the cost_schedule parameter. + :type cost_item: ifcopenshell.entity_instance + :return: The newly created IfcCostItem + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # The very first cost item must be in a cost schedule - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + # The very first cost item must be in a cost schedule + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - # You may add cost items as top level item in the schedule - item1 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + # You may add cost items as top level item in the schedule + item1 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - # Alternatively you may add them as subitems - item2 = ifcopenshell.api.run("cost.add_cost_item", model, cost_item=item1) - """ - self.file = file - self.settings = {"cost_schedule": cost_schedule, "cost_item": cost_item} + # Alternatively you may add them as subitems + item2 = ifcopenshell.api.run("cost.add_cost_item", model, cost_item=item1) + """ + settings = {"cost_schedule": cost_schedule, "cost_item": cost_item} - def execute(self): - cost_item = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcCostItem") + cost_item = ifcopenshell.api.run("root.create_entity", file, ifc_class="IfcCostItem") - if self.settings["cost_schedule"]: - self.file.create_entity( - "IfcRelAssignsToControl", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": [cost_item], - "RelatingControl": self.settings["cost_schedule"], - } - ) - elif self.settings["cost_item"]: - ifcopenshell.api.run( - "nest.assign_object", self.file, related_objects=[cost_item], relating_object=self.settings["cost_item"] - ) - return cost_item + if settings["cost_schedule"]: + file.create_entity( + "IfcRelAssignsToControl", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": [cost_item], + "RelatingControl": settings["cost_schedule"], + } + ) + elif settings["cost_item"]: + ifcopenshell.api.run( + "nest.assign_object", file, related_objects=[cost_item], relating_object=settings["cost_item"] + ) + return cost_item diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py index fabe443460..47a9b3efb9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py @@ -19,73 +19,70 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, cost_item=None, ifc_class="IfcQuantityCount"): - """Adds a new quantity associated with a cost item +def add_cost_item_quantity(file, cost_item=None, ifc_class="IfcQuantityCount") -> None: + """Adds a new quantity associated with a cost item - Cost items calculate their subtotal by multiplying the sum of the cost - item's "values" by the sum of the cost item's "quantities". The - quantities may be either parametrically linked to quantities measured on - physical product, or manually specified. + Cost items calculate their subtotal by multiplying the sum of the cost + item's "values" by the sum of the cost item's "quantities". The + quantities may be either parametrically linked to quantities measured on + physical product, or manually specified. - The quantity must be of a particular type, common examples are: + The quantity must be of a particular type, common examples are: - - IfcQuantityCount: to count the total occurrences of a product, useful - for things like doors, windows, and furniture - - IfcQuantityNumber: any other generic numeric quantity - - IfcQuantityLength - - IfcQuantityArea - - IfcQuantityVolume - - IfcQuantityWeight - - IfcQuantityTime + - IfcQuantityCount: to count the total occurrences of a product, useful + for things like doors, windows, and furniture + - IfcQuantityNumber: any other generic numeric quantity + - IfcQuantityLength + - IfcQuantityArea + - IfcQuantityVolume + - IfcQuantityWeight + - IfcQuantityTime - A cost item must not mix quantities of different types. + A cost item must not mix quantities of different types. - If an IfcQuantityCount is used, then this API will automatically count - all products that this cost item controls (see - ifcopenshell.api.controls.assign_control) and prefill that quantity. + If an IfcQuantityCount is used, then this API will automatically count + all products that this cost item controls (see + ifcopenshell.api.controls.assign_control) and prefill that quantity. - For all other quantity types, the quantity is left as zero and the user - must either manually specify the quantity or parametrically link it - using another API call. + For all other quantity types, the quantity is left as zero and the user + must either manually specify the quantity or parametrically link it + using another API call. - :param cost_item: The IfcCostItem to add the quantity to - :type cost_item: ifcopenshell.entity_instance - :param ifc_class: The type of quantity to add - :type ifc_class: str, optional - :return: The newly created quantity entity, chosen from the ifc_class - parameter - :rtype: ifcopenshell.entity_instance + :param cost_item: The IfcCostItem to add the quantity to + :type cost_item: ifcopenshell.entity_instance + :param ifc_class: The type of quantity to add + :type ifc_class: str, optional + :return: The newly created quantity entity, chosen from the ifc_class + parameter + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - chair = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - ifcopenshell.api.run("control.assign_control", model, - relating_control=cost_item, related_object=chair) + chair = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + ifcopenshell.api.run("control.assign_control", model, + relating_control=cost_item, related_object=chair) - # Let's assume we want to count the amount of chairs to calculate our cost item - # Because this is an IfcQuantityCount the count will be automatically set to "1" chair - ifcopenshell.api.run("cost.add_cost_item_quantity", model, - cost_item=item, ifc_class="IfcQuantityCount") - """ - self.file = file - self.settings = {"cost_item": cost_item, "ifc_class": ifc_class} + # Let's assume we want to count the amount of chairs to calculate our cost item + # Because this is an IfcQuantityCount the count will be automatically set to "1" chair + ifcopenshell.api.run("cost.add_cost_item_quantity", model, + cost_item=item, ifc_class="IfcQuantityCount") + """ + settings = {"cost_item": cost_item, "ifc_class": ifc_class} - def execute(self): - quantity = self.file.create_entity(self.settings["ifc_class"], Name="Unnamed") - quantity[3] = 0.0 - # This is a bold assumption - # https://forums.buildingsmart.org/t/how-does-a-cost-item-know-that-it-is-counting-a-controlled-product/3564 - if self.settings["ifc_class"] == "IfcQuantityCount" and self.settings["cost_item"].Controls: - count = 0 - for rel in self.settings["cost_item"].Controls: - count += len(rel.RelatedObjects) - quantity[3] = count - quantities = list(self.settings["cost_item"].CostQuantities or []) - quantities.append(quantity) - self.settings["cost_item"].CostQuantities = quantities - return quantity + quantity = file.create_entity(settings["ifc_class"], Name="Unnamed") + quantity[3] = 0.0 + # This is a bold assumption + # https://forums.buildingsmart.org/t/how-does-a-cost-item-know-that-it-is-counting-a-controlled-product/3564 + if settings["ifc_class"] == "IfcQuantityCount" and settings["cost_item"].Controls: + count = 0 + for rel in settings["cost_item"].Controls: + count += len(rel.RelatedObjects) + quantity[3] = count + quantities = list(settings["cost_item"].CostQuantities or []) + quantities.append(quantity) + settings["cost_item"].CostQuantities = quantities + return quantity diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py index fa97a893f3..d72566ae1f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py @@ -21,48 +21,45 @@ import ifcopenshell.util.date from datetime import datetime -class Usecase: - def __init__(self, file, name=None, predefined_type="NOTDEFINED"): - """Add a new cost schedule +def add_cost_schedule(file, name=None, predefined_type="NOTDEFINED") -> None: + """Add a new cost schedule - A cost schedule is a group of cost items which typically represent a - cost plan or breakdown of the project. This may be used as an estimate, - bid, or actual cost. + A cost schedule is a group of cost items which typically represent a + cost plan or breakdown of the project. This may be used as an estimate, + bid, or actual cost. - Alternatively, a cost schedule may also represent a schedule of rates, - which include cost items which capture unit rates for different elements - or processes. + Alternatively, a cost schedule may also represent a schedule of rates, + which include cost items which capture unit rates for different elements + or processes. - As such, creating a cost schedule is necessary prior to creating and - managing any cost items. + As such, creating a cost schedule is necessary prior to creating and + managing any cost items. - :param name: The name of the cost schedule. - :type name: str, optional - :param predefined_type: The predefined type of the cost schedule, chosen - from a valid type in the IFC documentation for - IfcCostScheduleTypeEnum - :type predefined_type: str, optional - :return: The newly created IfcCostSchedule entity - :rtype: ifcopenshell.entity_instance + :param name: The name of the cost schedule. + :type name: str, optional + :param predefined_type: The predefined type of the cost schedule, chosen + from a valid type in the IFC documentation for + IfcCostScheduleTypeEnum + :type predefined_type: str, optional + :return: The newly created IfcCostSchedule entity + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - # Now that we have a cost schedule, we may add cost items to it - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - """ - self.file = file - self.settings = {"name": name, "predefined_type": predefined_type} + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + # Now that we have a cost schedule, we may add cost items to it + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + """ + settings = {"name": name, "predefined_type": predefined_type} - def execute(self): - cost_schedule = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class="IfcCostSchedule", - predefined_type=self.settings["predefined_type"], - name=self.settings["name"], - ) - cost_schedule.UpdateDate = ifcopenshell.util.date.datetime2ifc(datetime.now(), "IfcDateTime") - return cost_schedule + cost_schedule = ifcopenshell.api.run( + "root.create_entity", + file, + ifc_class="IfcCostSchedule", + predefined_type=settings["predefined_type"], + name=settings["name"], + ) + cost_schedule.UpdateDate = ifcopenshell.util.date.datetime2ifc(datetime.now(), "IfcDateTime") + return cost_schedule diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py index e7a481e8b2..b6fe5f5698 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py @@ -17,95 +17,92 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, parent=None): - """Adds a new value or subvalue to a cost item +def add_cost_value(file, parent=None) -> None: + """Adds a new value or subvalue to a cost item - A cost item's subtotal can be specified in two ways. + A cost item's subtotal can be specified in two ways. - Option 1 is by simply manually specifying the subtotal value, which - represents the full cost of that cost item. This option occurs when a - cost item has no quantities associated with it. + Option 1 is by simply manually specifying the subtotal value, which + represents the full cost of that cost item. This option occurs when a + cost item has no quantities associated with it. - Option 2 is by specifying a unit cost value of the cost item, which is - then multiplied by the associated quantity of the cost item, to give us - the subtotal. This option occurs when a cost item has quantities - associated with it. + Option 2 is by specifying a unit cost value of the cost item, which is + then multiplied by the associated quantity of the cost item, to give us + the subtotal. This option occurs when a cost item has quantities + associated with it. - For either option 1 (full cost value) or option 2 (unit cost value), the - cost value may be specified as a single number, or as a sum of - subcomponents or formulas (e.g. multiplication by wastage factor, or - adding taxes or other adjustments). + For either option 1 (full cost value) or option 2 (unit cost value), the + cost value may be specified as a single number, or as a sum of + subcomponents or formulas (e.g. multiplication by wastage factor, or + adding taxes or other adjustments). - This function lets you add a single top level unit value to a cost item, - or alternatively price subcomponents by using the "parent" parameter. + This function lets you add a single top level unit value to a cost item, + or alternatively price subcomponents by using the "parent" parameter. - More advanced usage, which involves summing, subcategory-filtered costs, - and formulas are possible but not yet documented. + More advanced usage, which involves summing, subcategory-filtered costs, + and formulas are possible but not yet documented. - :param parent: A parent IfcCostItem, if specifying a price directly to a - cost item, or a top-level price component. Alternatively, this can - be set to a IfcCostValue, if specifying price subcomponents. - :type parent: ifcopenshell.entity_instance - :return: The newly created IfcCostValue - :rtype: ifcopenshell.entity_instance + :param parent: A parent IfcCostItem, if specifying a price directly to a + cost item, or a top-level price component. Alternatively, this can + be set to a IfcCostValue, if specifying price subcomponents. + :type parent: ifcopenshell.entity_instance + :return: The newly created IfcCostValue + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # We always need a schedule first prior to adding any cost items - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + # We always need a schedule first prior to adding any cost items + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - # Option 1: This cost item will have a full cost of 42.0 - item1 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item1) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 42.0}) + # Option 1: This cost item will have a full cost of 42.0 + item1 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item1) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 42.0}) - # Option 2: This cost item will have a unit cost of 5.0 per unit - # area, multiplied by the quantity of area specified explicitly as - # 3.0, giving us a subtotal cost of 15.0. - item2 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item2) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 5.0}) - quantity = ifcopenshell.api.run("cost.add_cost_item_quantity", model, - cost_item=item2, ifc_class="IfcQuantityVolume") - ifcopenshell.api.run("cost.edit_cost_item_quantity", model, - physical_quantity=quantity, "attributes": {"VolumeValue": 3.0}) + # Option 2: This cost item will have a unit cost of 5.0 per unit + # area, multiplied by the quantity of area specified explicitly as + # 3.0, giving us a subtotal cost of 15.0. + item2 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item2) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 5.0}) + quantity = ifcopenshell.api.run("cost.add_cost_item_quantity", model, + cost_item=item2, ifc_class="IfcQuantityVolume") + ifcopenshell.api.run("cost.edit_cost_item_quantity", model, + physical_quantity=quantity, "attributes": {"VolumeValue": 3.0}) - # A cost value may also be specified in terms of the sum of its - # subcomponents. In this case, it's broken down into 2 subvalues. - item1 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item1) - subvalue1 = ifcopenshell.api.run("cost.add_cost_value", model, parent=value) - subvalue2 = ifcopenshell.api.run("cost.add_cost_value", model, parent=value) + # A cost value may also be specified in terms of the sum of its + # subcomponents. In this case, it's broken down into 2 subvalues. + item1 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item1) + subvalue1 = ifcopenshell.api.run("cost.add_cost_value", model, parent=value) + subvalue2 = ifcopenshell.api.run("cost.add_cost_value", model, parent=value) - # This specifies that the value is the sum of all subitems - # regardless of their cost category. The first subvalue is 2.0 and - # the second is 3.0, giving a total value of 5.0. - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, attributes={"Category": "*"}) - ifcopenshell.api.run("cost.edit_cost_value", model, - cost_value=subvalue1, attributes={"AppliedValue": 2.0}) - ifcopenshell.api.run("cost.edit_cost_value", model, - cost_value=subvalue2, attributes={"AppliedValue": 3.0}) - """ - self.file = file - self.settings = {"parent": parent} + # This specifies that the value is the sum of all subitems + # regardless of their cost category. The first subvalue is 2.0 and + # the second is 3.0, giving a total value of 5.0. + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, attributes={"Category": "*"}) + ifcopenshell.api.run("cost.edit_cost_value", model, + cost_value=subvalue1, attributes={"AppliedValue": 2.0}) + ifcopenshell.api.run("cost.edit_cost_value", model, + cost_value=subvalue2, attributes={"AppliedValue": 3.0}) + """ + settings = {"parent": parent} - def execute(self): - value = self.file.create_entity("IfcCostValue") - if self.settings["parent"].is_a("IfcCostItem"): - values = list(self.settings["parent"].CostValues or []) - values.append(value) - self.settings["parent"].CostValues = values - elif self.settings["parent"].is_a("IfcConstructionResource"): - values = list(self.settings["parent"].BaseCosts or []) - values.append(value) - self.settings["parent"].BaseCosts = values - elif self.settings["parent"].is_a("IfcCostValue"): - values = list(self.settings["parent"].Components or []) - values.append(value) - self.settings["parent"].Components = values - return value + value = file.create_entity("IfcCostValue") + if settings["parent"].is_a("IfcCostItem"): + values = list(settings["parent"].CostValues or []) + values.append(value) + settings["parent"].CostValues = values + elif settings["parent"].is_a("IfcConstructionResource"): + values = list(settings["parent"].BaseCosts or []) + values.append(value) + settings["parent"].BaseCosts = values + elif settings["parent"].is_a("IfcCostValue"): + values = list(settings["parent"].Components or []) + values.append(value) + settings["parent"].Components = values + return value diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py index d4c6b6be69..6c13162ed7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py @@ -19,82 +19,82 @@ import ifcopenshell.api +def assign_cost_item_quantity(file, cost_item=None, products=None, prop_name="") -> None: + """Adds a cost item quantity that is parametrically connected to a product + + A cost item may have its subtotal calculated by multiplying a unit value + by a quantity associated with the cost item. That quantity may be either + manually specified or parametrically connected to a quantity on a + product. This API function lets you create that parametric connection. + + For example, you may wish to have a cost item linked to the "NetVolume" + quantity on all IfcSlabs. Each quantity has a name which you can + specify. If the quantity is updated in-place (which should occur for + Native IFC applications) then the quantity for the cost item will + automatically update as well. If the quantity is deleted and then + re-added, then the parametric relationship is also lost. + + This API also automatically assigns a control relationship between the + cost item and the product, so it is not necessary to use + ifcopenshell.api.control.assign_control. + + :param cost_item: The IfcCostItem to assign parametric quantities to + :type cost_item: ifcopenshell.entity_instance + :param products: The IfcObjects to assign parametric quantities to + :type products: list[ifcopenshell.entity_instance] + :param prop_name: The name of the quantity. If this is not specified, + then it is assumed that there is no calculated quantity, and the + number of objects are counted instead. + :type prop_name: str, optional + :return: None + :rtype: None + + Example: + + .. code:: python + + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + + # Let's imagine a unit cost of 5.0 per unit volume + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 5.0}) + + slab = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSlab") + # Usually the quantity would be automatically calculated via a + # graphical authoring application but let's assign a manual quantity + # for now. + qto = ifcopenshell.api.run("pset.add_qto", model, product=slab, name="Qto_SlabBaseQuantities") + ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"NetVolume": 42.0}) + + # Now let's parametrically link the slab's quantity to the cost + # item. If the slab is edited in the future and 42.0 changes, then + # the updated value will also automatically be applied to the cost + # item. + ifcopenshell.api.run("cost.assign_cost_item_quantity", model, + cost_item=item, products=[slab], prop_name="NetVolume") + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "cost_item": cost_item, + "products": products or [], + "prop_name": prop_name, + } + return usecase.execute() + + class Usecase: - def __init__(self, file, cost_item=None, products=None, prop_name=""): - """Adds a cost item quantity that is parametrically connected to a product - - A cost item may have its subtotal calculated by multiplying a unit value - by a quantity associated with the cost item. That quantity may be either - manually specified or parametrically connected to a quantity on a - product. This API function lets you create that parametric connection. - - For example, you may wish to have a cost item linked to the "NetVolume" - quantity on all IfcSlabs. Each quantity has a name which you can - specify. If the quantity is updated in-place (which should occur for - Native IFC applications) then the quantity for the cost item will - automatically update as well. If the quantity is deleted and then - re-added, then the parametric relationship is also lost. - - This API also automatically assigns a control relationship between the - cost item and the product, so it is not necessary to use - ifcopenshell.api.control.assign_control. - - :param cost_item: The IfcCostItem to assign parametric quantities to - :type cost_item: ifcopenshell.entity_instance - :param products: The IfcObjects to assign parametric quantities to - :type products: list[ifcopenshell.entity_instance] - :param prop_name: The name of the quantity. If this is not specified, - then it is assumed that there is no calculated quantity, and the - number of objects are counted instead. - :type prop_name: str, optional - :return: None - :rtype: None - - Example: - - .. code:: python - - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - - # Let's imagine a unit cost of 5.0 per unit volume - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 5.0}) - - slab = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSlab") - # Usually the quantity would be automatically calculated via a - # graphical authoring application but let's assign a manual quantity - # for now. - qto = ifcopenshell.api.run("pset.add_qto", model, product=slab, name="Qto_SlabBaseQuantities") - ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"NetVolume": 42.0}) - - # Now let's parametrically link the slab's quantity to the cost - # item. If the slab is edited in the future and 42.0 changes, then - # the updated value will also automatically be applied to the cost - # item. - ifcopenshell.api.run("cost.assign_cost_item_quantity", model, - cost_item=item, products=[slab], prop_name="NetVolume") - """ - self.file = file - self.settings = { - "cost_item": cost_item, - "products": products or [], - "prop_name": prop_name, - } - def execute(self): if self.settings["prop_name"]: self.quantities = set(self.settings["cost_item"].CostQuantities or []) for product in self.settings["products"]: - self.assign_cost_control( - related_object=product, cost_item=self.settings["cost_item"] - ) + self.assign_cost_control(related_object=product, cost_item=self.settings["cost_item"]) if self.settings["prop_name"]: if ( self.settings["cost_item"].CostQuantities - and self.settings["cost_item"].CostQuantities[0].Name.lower() - != self.settings["prop_name"].lower() + and self.settings["cost_item"].CostQuantities[0].Name.lower() != self.settings["prop_name"].lower() ) or not product.is_a("IfcObject"): continue self.add_quantity_from_related_object(product) @@ -120,10 +120,7 @@ class Usecase: if not qto.is_a("IfcElementQuantity"): return for prop in qto.Quantities: - if ( - prop.is_a("IfcPhysicalSimpleQuantity") - and prop.Name.lower() == self.settings["prop_name"].lower() - ): + if prop.is_a("IfcPhysicalSimpleQuantity") and prop.Name.lower() == self.settings["prop_name"].lower(): self.quantities.add(prop) def update_cost_item_count(self): diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py index fb89fe7432..18bb05694f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py @@ -19,60 +19,57 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, cost_item=None, cost_rate=None): - """Assigns a cost value to a cost item from a schedule of rates +def assign_cost_value(file, cost_item=None, cost_rate=None) -> None: + """Assigns a cost value to a cost item from a schedule of rates - Instead of assigning cost values from scratch for each cost item in a - cost schedule, the cost values may instead be assigned from a schedule - of rates. + Instead of assigning cost values from scratch for each cost item in a + cost schedule, the cost values may instead be assigned from a schedule + of rates. - A schedule of rates is just another cost schedule which have cost values - but no quantities. This API will allow you to "copy" the values from a - cost item in the schedule of rates into another cost item in your own - cost schedule. When the schedule of rates value is updated, then your - cost item values will also be updated. You can think of the schedule of - rates as a "template" to quickly populate your rates from. + A schedule of rates is just another cost schedule which have cost values + but no quantities. This API will allow you to "copy" the values from a + cost item in the schedule of rates into another cost item in your own + cost schedule. When the schedule of rates value is updated, then your + cost item values will also be updated. You can think of the schedule of + rates as a "template" to quickly populate your rates from. - :param cost_item: The IfcCostItem that you want to copy the values to - :type cost_item: ifcopenshell.entity_instance - :param cost_rate: The IfcCostItem that you want to copy the values from - :type cost_rate: ifcopenshell.entity_instance - :return: None - :rtype: None + :param cost_item: The IfcCostItem that you want to copy the values to + :type cost_item: ifcopenshell.entity_instance + :param cost_rate: The IfcCostItem that you want to copy the values from + :type cost_rate: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's create a schedule of rates with a single rate in it of 5.0 - rate_tables = ifcopenshell.api.run("cost.add_cost_schedule", model, - predefined_type="SCHEDULEOFRATES") - rate = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=rate) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 5.0}) + # Let's create a schedule of rates with a single rate in it of 5.0 + rate_tables = ifcopenshell.api.run("cost.add_cost_schedule", model, + predefined_type="SCHEDULEOFRATES") + rate = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=rate) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 5.0}) - # And this schedule will be for our actual cost plan / estimate / etc - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + # And this schedule will be for our actual cost plan / estimate / etc + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - # Now the cost item has the same rate as the one from the schedule of rate's item - ifcopenshell.api.run("cost.assign_cost_value", model, cost_item=item, cost_rate=rate) - """ - self.file = file - self.settings = {"cost_item": cost_item, "cost_rate": cost_rate} + # Now the cost item has the same rate as the one from the schedule of rate's item + ifcopenshell.api.run("cost.assign_cost_value", model, cost_item=item, cost_rate=rate) + """ + settings = {"cost_item": cost_item, "cost_rate": cost_rate} - def execute(self): - if self.settings["cost_item"].CostValues: - [ - ifcopenshell.api.run( - "cost.remove_cost_value", - self.file, - parent=self.settings["cost_item"], - cost_value=cost_value, - ) - for cost_value in self.settings["cost_item"].CostValues - ] - # This is an assumption, and not part of the official IFC documentation - self.settings["cost_item"].CostValues = self.settings["cost_rate"].CostValues + if settings["cost_item"].CostValues: + [ + ifcopenshell.api.run( + "cost.remove_cost_value", + file, + parent=settings["cost_item"], + cost_value=cost_value, + ) + for cost_value in settings["cost_item"].CostValues + ] + # This is an assumption, and not part of the official IFC documentation + settings["cost_item"].CostValues = settings["cost_rate"].CostValues diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py index b82e5948a6..c977be1b19 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py @@ -21,100 +21,97 @@ import ifcopenshell.util.date import ifcopenshell.util.resource -class Usecase: - def __init__(self, file, cost_item=None): - """Calculates the total cost of all resources associated with a cost item +def calculate_cost_item_resource_value(file, cost_item=None) -> None: + """Calculates the total cost of all resources associated with a cost item - A cost item may have construction resources (e.g. equipment, material, - etc) assigned to it. Construction resources may be assigned directly to - the cost item, or assigned first to a task, and the task is then - assigned to the cost item. + A cost item may have construction resources (e.g. equipment, material, + etc) assigned to it. Construction resources may be assigned directly to + the cost item, or assigned first to a task, and the task is then + assigned to the cost item. - The cost of a resource is calculated by the total sum of all of its base - costs. If no quantity is provided, that sum is considered to be the - total cost. Otherwise, it is considered to be a unit cost, and is then - multiplied by the resource quantity. The quantity is either stored as a - base quantity (such as a volume) for a things like material resources, - or as a duration as a daily rate for labour resources. + The cost of a resource is calculated by the total sum of all of its base + costs. If no quantity is provided, that sum is considered to be the + total cost. Otherwise, it is considered to be a unit cost, and is then + multiplied by the resource quantity. The quantity is either stored as a + base quantity (such as a volume) for a things like material resources, + or as a duration as a daily rate for labour resources. - The final calculated cost is set as the cost item's value. Any - previously existing values are removed. + The final calculated cost is set as the cost item's value. Any + previously existing values are removed. - :param cost_item: The IfcCostItem to calculate - :type cost_item: ifccopenshell.entity_instance.entity_instance - :return: None - :rtype: None + :param cost_item: The IfcCostItem to calculate + :type cost_item: ifccopenshell.entity_instance.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # First, we need a cost schedule and item - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + # First, we need a cost schedule and item + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - # Let's imagine we have our own formworking crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + # Let's imagine we have our own formworking crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - # ... and they need concrete - concrete = ifcopenshell.api.run("resource.add_resource", model, - ifc_class="IfcConstructionMaterialResource", parent_resource=crew) - ifcopenshell.api.run("control.assign_control", model, - relating_control=item, related_object=concrete) - # ... which has a unit price of 42.0 per m3 - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=concrete) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 42.0}) - # ... and a volume of 200m3 - quantity = ifcopenshell.api.run("resource.add_resource_quantity", model, - resource=concrete, ifc_class="IfcQuantityVolume") - ifcopenshell.api.run("resource.edit_resource_quantity", model, - physical_quantity=quantity, "attributes": {"VolumeValue": 200.0}) + # ... and they need concrete + concrete = ifcopenshell.api.run("resource.add_resource", model, + ifc_class="IfcConstructionMaterialResource", parent_resource=crew) + ifcopenshell.api.run("control.assign_control", model, + relating_control=item, related_object=concrete) + # ... which has a unit price of 42.0 per m3 + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=concrete) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 42.0}) + # ... and a volume of 200m3 + quantity = ifcopenshell.api.run("resource.add_resource_quantity", model, + resource=concrete, ifc_class="IfcQuantityVolume") + ifcopenshell.api.run("resource.edit_resource_quantity", model, + physical_quantity=quantity, "attributes": {"VolumeValue": 200.0}) - # Let's say they also need some equipment - equipment = ifcopenshell.api.run("resource.add_resource", model, - ifc_class="IfcConstructionEquipmentResource", parent_resource=crew) - ifcopenshell.api.run("control.assign_control", model, - relating_control=item, related_object=equipment) - # ... with a fixed price of 50,000 - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=concrete) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 42.0}) + # Let's say they also need some equipment + equipment = ifcopenshell.api.run("resource.add_resource", model, + ifc_class="IfcConstructionEquipmentResource", parent_resource=crew) + ifcopenshell.api.run("control.assign_control", model, + relating_control=item, related_object=equipment) + # ... with a fixed price of 50,000 + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=concrete) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 42.0}) - # (42 * 200) + 50000 = 58400 is our calculated cost - ifcopenshell.api.run("cost.calculate_cost_item_resource_value", model, cost_item=item) - """ - self.file = file - self.settings = {"cost_item": cost_item} + # (42 * 200) + 50000 = 58400 is our calculated cost + ifcopenshell.api.run("cost.calculate_cost_item_resource_value", model, cost_item=item) + """ + settings = {"cost_item": cost_item} - def execute(self): - for cost_value in self.settings["cost_item"].CostValues or []: - ifcopenshell.api.run( - "cost.remove_cost_value", self.file, parent=self.settings["cost_item"], cost_value=cost_value - ) + for cost_value in settings["cost_item"].CostValues or []: + ifcopenshell.api.run("cost.remove_cost_value", file, parent=settings["cost_item"], cost_value=cost_value) - resources = [] - for rel in self.settings["cost_item"].Controls or []: - for related_object in rel.RelatedObjects: - if related_object.is_a("IfcConstructionResource"): - resources.append(related_object) - elif related_object.is_a("IfcTask"): - for rel2 in related_object.OperatesOn or []: - for related_object2 in rel2.RelatedObjects: - if related_object2.is_a("IfcConstructionResource"): - resources.append(related_object2) + resources = [] + for rel in settings["cost_item"].Controls or []: + for related_object in rel.RelatedObjects: + if related_object.is_a("IfcConstructionResource"): + resources.append(related_object) + elif related_object.is_a("IfcTask"): + for rel2 in related_object.OperatesOn or []: + for related_object2 in rel2.RelatedObjects: + if related_object2.is_a("IfcConstructionResource"): + resources.append(related_object2) - for resource in resources: - cost, unit = ifcopenshell.util.resource.get_cost(resource) - if not cost: - cost, unit = ifcopenshell.util.resource.get_parent_cost(resource) # Concept to standardise - Not defined in schema, but this makes manual scheduling of resources 10x faster and less duplicate data. - quantity = ifcopenshell.util.resource.get_quantity(resource) - if not cost or not quantity: - continue - if unit and "day" in unit: - quantity = quantity / 8 # Assume 8 hour working day - TODO implement resource calendar - quantity = round(quantity, 2) - formula = "{}*{}".format(cost, quantity) - cost_value = ifcopenshell.api.run("cost.add_cost_value", self.file, parent=self.settings["cost_item"]) - cost_value.Name = resource.Name - ifcopenshell.api.run("cost.edit_cost_value_formula", self.file, cost_value=cost_value, formula=formula) \ No newline at end of file + for resource in resources: + cost, unit = ifcopenshell.util.resource.get_cost(resource) + if not cost: + cost, unit = ifcopenshell.util.resource.get_parent_cost( + resource + ) # Concept to standardise - Not defined in schema, but this makes manual scheduling of resources 10x faster and less duplicate data. + quantity = ifcopenshell.util.resource.get_quantity(resource) + if not cost or not quantity: + continue + if unit and "day" in unit: + quantity = quantity / 8 # Assume 8 hour working day - TODO implement resource calendar + quantity = round(quantity, 2) + formula = "{}*{}".format(cost, quantity) + cost_value = ifcopenshell.api.run("cost.add_cost_value", file, parent=settings["cost_item"]) + cost_value.Name = resource.Name + ifcopenshell.api.run("cost.edit_cost_value_formula", file, cost_value=cost_value, formula=formula) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py index ec2d147731..13927088ed 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py @@ -21,35 +21,38 @@ import ifcopenshell.api import ifcopenshell.util.element +def copy_cost_item(file, cost_item=None) -> None: + """Copies all cost items and related relationships + + The following relationships are also duplicated: + + * The copy will have the same attributes and property sets as the original cost item + * The copy will be assigned to the parent cost schedule + * The copy will have duplicated nested cost items + + :param cost_item: The cost item to be duplicated + :type cost_item: ifcopenshell.entity_instance + :return: The duplicated cost item or the list of duplicated cost items if the latter has children + :rtype: ifcopenshell.entity_instance or list of ifcopenshell.entity_instance + + Example: + .. code:: python + + # We have a cost item + cost_item = CostItem(name="Design new feature", deadline="2023-03-01") + + # And now we have two + duplicated_cost_item = project.duplicate_cost_item(cost_item) + + + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"cost_item": cost_item} + return usecase.execute() + + class Usecase: - def __init__(self, file, cost_item=None): - """Copies all cost items and related relationships - - The following relationships are also duplicated: - - * The copy will have the same attributes and property sets as the original cost item - * The copy will be assigned to the parent cost schedule - * The copy will have duplicated nested cost items - - :param cost_item: The cost item to be duplicated - :type cost_item: ifcopenshell.entity_instance - :return: The duplicated cost item or the list of duplicated cost items if the latter has children - :rtype: ifcopenshell.entity_instance or list of ifcopenshell.entity_instance - - Example: - .. code:: python - - # We have a cost item - cost_item = CostItem(name="Design new feature", deadline="2023-03-01") - - # And now we have two - duplicated_cost_item = project.duplicate_cost_item(cost_item) - - - """ - self.file = file - self.settings = {"cost_item": cost_item} - def execute(self): self.new_cost_items = [] self.duplicate_cost_item(self.settings["cost_item"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py index 6bc0677b28..8ccb0a4158 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py @@ -20,45 +20,42 @@ import ifcopenshell.util.element import ifcopenshell.api -class Usecase: - def __init__(self, file, source=None, destination=None): - """Copies all cost values from one cost item to another +def copy_cost_item_values(file, source=None, destination=None) -> None: + """Copies all cost values from one cost item to another - Any previously existing values will be removed. The entire value is - copied, including all components and formulas. However they are not - parametrically linked, so if one value changes, the other will not. + Any previously existing values will be removed. The entire value is + copied, including all components and formulas. However they are not + parametrically linked, so if one value changes, the other will not. - :param source: The IfcCostItem to copy cost values from - :type source: ifcopenshell.entity_instance - :param destination: The IfcCostItem to copy cost values from - :type destination: ifcopenshell.entity_instance - :return: None - :rtype: None + :param source: The IfcCostItem to copy cost values from + :type source: ifcopenshell.entity_instance + :param destination: The IfcCostItem to copy cost values from + :type destination: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Assume we have a schedule with multiple items in it - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item1 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - item2 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + # Assume we have a schedule with multiple items in it + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item1 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + item2 = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - # One of the items has a value - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 5000.0}) + # One of the items has a value + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 5000.0}) - # Let's copy the value from one item to another - ifcopenshell.api.run("cost.copy_cost_item_values", model, source=item1, destination=item2) - """ - self.file = file - self.settings = {"source": source, "destination": destination} + # Let's copy the value from one item to another + ifcopenshell.api.run("cost.copy_cost_item_values", model, source=item1, destination=item2) + """ + settings = {"source": source, "destination": destination} - def execute(self): - for cost_value in self.settings["destination"].CostValues or []: - ifcopenshell.api.run("cost.remove_cost_item_value", self.file, cost_value=cost_value) - copied_cost_values = [] - for cost_value in self.settings["source"].CostValues or []: - copied_cost_values.append(ifcopenshell.util.element.copy_deep(self.file, cost_value)) - self.settings["destination"].CostValues = copied_cost_values + for cost_value in settings["destination"].CostValues or []: + ifcopenshell.api.run("cost.remove_cost_item_value", file, cost_value=cost_value) + copied_cost_values = [] + for cost_value in settings["source"].CostValues or []: + copied_cost_values.append(ifcopenshell.util.element.copy_deep(file, cost_value)) + settings["destination"].CostValues = copied_cost_values diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py index cc0a187177..2bf72a5d57 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py @@ -17,31 +17,28 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, cost_item=None, attributes=None): - """Edits the attributes of an IfcCostItem +def edit_cost_item(file, cost_item=None, attributes=None) -> None: + """Edits the attributes of an IfcCostItem - For more information about the attributes and data types of an - IfcCostItem, consult the IFC documentation. + For more information about the attributes and data types of an + IfcCostItem, consult the IFC documentation. - :param cost_item: The IfcCostItem entity you want to edit - :type cost_item: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param cost_item: The IfcCostItem entity you want to edit + :type cost_item: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - ifcopenshell.api.run("cost.edit_cost_item", model, cost_item=item, attributes={"Name": "Foo"}) - """ - self.file = file - self.settings = {"cost_item": cost_item, "attributes": attributes or {}} + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + ifcopenshell.api.run("cost.edit_cost_item", model, cost_item=item, attributes={"Name": "Foo"}) + """ + settings = {"cost_item": cost_item, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["cost_item"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["cost_item"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py index 3ba4e9f498..178816a593 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py @@ -17,39 +17,36 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, physical_quantity=None, attributes=None): - """Edits the attributes of an IfcPhysicalQuantity +def edit_cost_item_quantity(file, physical_quantity=None, attributes=None) -> None: + """Edits the attributes of an IfcPhysicalQuantity - For more information about the attributes and data types of an - IfcPhysicalQuantity, consult the IFC documentation. + For more information about the attributes and data types of an + IfcPhysicalQuantity, consult the IFC documentation. - :param physical_quantity: The IfcPhysicalQuantity entity you want to edit - :type physical_quantity: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param physical_quantity: The IfcPhysicalQuantity entity you want to edit + :type physical_quantity: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - # This cost item will have a unit cost of 5 and a volume of 3 - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 5.0}) - quantity = ifcopenshell.api.run("cost.add_cost_item_quantity", model, - cost_item=item, ifc_class="IfcQuantityVolume") - ifcopenshell.api.run("cost.edit_cost_item_quantity", model, - physical_quantity=quantity, "attributes": {"VolumeValue": 3.0}) - """ - self.file = file - self.settings = {"physical_quantity": physical_quantity, "attributes": attributes or {}} + # This cost item will have a unit cost of 5 and a volume of 3 + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 5.0}) + quantity = ifcopenshell.api.run("cost.add_cost_item_quantity", model, + cost_item=item, ifc_class="IfcQuantityVolume") + ifcopenshell.api.run("cost.edit_cost_item_quantity", model, + physical_quantity=quantity, "attributes": {"VolumeValue": 3.0}) + """ + settings = {"physical_quantity": physical_quantity, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["physical_quantity"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["physical_quantity"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py index bdfb856cc1..3e47f3a430 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py @@ -17,32 +17,29 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, cost_schedule=None, attributes=None): - """Edits the attributes of an IfcCostSchedule +def edit_cost_schedule(file, cost_schedule=None, attributes=None) -> None: + """Edits the attributes of an IfcCostSchedule - For more information about the attributes and data types of an - IfcCostSchedule, consult the IFC documentation. + For more information about the attributes and data types of an + IfcCostSchedule, consult the IFC documentation. - :param cost_schedule: The IfcCostSchedule entity you want to edit - :type cost_schedule: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param cost_schedule: The IfcCostSchedule entity you want to edit + :type cost_schedule: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - ifcopenshell.api.run("cost.edit_cost_schedule", model, - cost_schedule=schedule, attributes={"Name": "Foo"}) - """ + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + ifcopenshell.api.run("cost.edit_cost_schedule", model, + cost_schedule=schedule, attributes={"Name": "Foo"}) + """ - self.file = file - self.settings = {"cost_schedule": cost_schedule, "attributes": attributes or {}} + settings = {"cost_schedule": cost_schedule, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["cost_schedule"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["cost_schedule"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py index 75ce055eb1..430b4272aa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py @@ -21,48 +21,45 @@ import ifcopenshell.util.unit import ifcopenshell.util.element -class Usecase: - def __init__(self, file, cost_value=None, attributes=None): - """Edits the attributes of an IfcCostValue +def edit_cost_value(file, cost_value=None, attributes=None) -> None: + """Edits the attributes of an IfcCostValue - For more information about the attributes and data types of an - IfcCostValue, consult the IFC documentation. + For more information about the attributes and data types of an + IfcCostValue, consult the IFC documentation. - :param cost_value: The IfcCostValue entity you want to edit - :type cost_value: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param cost_value: The IfcCostValue entity you want to edit + :type cost_value: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - # This cost item will have a total cost of 42 - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 42.0}) - """ - self.file = file - self.settings = {"cost_value": cost_value, "attributes": attributes or {}} + # This cost item will have a total cost of 42 + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 42.0}) + """ + settings = {"cost_value": cost_value, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - if name == "AppliedValue" and value is not None: - # TODO: support all applied value select types - value = self.file.createIfcMonetaryMeasure(value) - elif name == "UnitBasis": - old_unit_basis = self.settings["cost_value"].UnitBasis - if value: - value_component = self.file.create_entity( - ifcopenshell.util.unit.get_unit_measure_class(value["UnitComponent"].UnitType), - value["ValueComponent"], - ) - value = self.file.create_entity("IfcMeasureWithUnit", value_component, value["UnitComponent"]) - if old_unit_basis and len(self.file.get_inverse(old_unit_basis)) == 0: - ifcopenshell.util.element.remove_deep(self.file, old_unit_basis) - setattr(self.settings["cost_value"], name, value) + for name, value in settings["attributes"].items(): + if name == "AppliedValue" and value is not None: + # TODO: support all applied value select types + value = file.createIfcMonetaryMeasure(value) + elif name == "UnitBasis": + old_unit_basis = settings["cost_value"].UnitBasis + if value: + value_component = file.create_entity( + ifcopenshell.util.unit.get_unit_measure_class(value["UnitComponent"].UnitType), + value["ValueComponent"], + ) + value = file.create_entity("IfcMeasureWithUnit", value_component, value["UnitComponent"]) + if old_unit_basis and len(file.get_inverse(old_unit_basis)) == 0: + ifcopenshell.util.element.remove_deep(file, old_unit_basis) + setattr(settings["cost_value"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py index 8dada5dc98..eac443ba40 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py @@ -22,37 +22,40 @@ import ifcopenshell.util.unit import ifcopenshell.util.element +def edit_cost_value_formula(file, cost_value=None, formula=None) -> None: + """Sets a cost value based on a formula, similar to formulas in spreadsheets + + Costs may be made up of many components (e.g. labour, material, waste + factor, taxes, etc). This can be easily represented in the form of a + formula similar thta would be used in spreadsheet applications. + + For more information, see ifcopenshell.util.cost + + :param cost_value: The IfcCostValue to set the values of + :type cost_value: ifcopenshell.entity_instance + :param formula: The formula following the language of ifcopenshell.util.cost + :type formula: str + :return: None + :rtype: None + + Example: + + .. code:: python + + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) + ifcopenshell.api.run("cost.edit_cost_value_formula", model, cost_value=value, + formula="5000 * 1.19") + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"cost_value": cost_value, "formula": formula or {}} + return usecase.execute() + + class Usecase: - def __init__(self, file, cost_value=None, formula=None): - """Sets a cost value based on a formula, similar to formulas in spreadsheets - - Costs may be made up of many components (e.g. labour, material, waste - factor, taxes, etc). This can be easily represented in the form of a - formula similar thta would be used in spreadsheet applications. - - For more information, see ifcopenshell.util.cost - - :param cost_value: The IfcCostValue to set the values of - :type cost_value: ifcopenshell.entity_instance - :param formula: The formula following the language of ifcopenshell.util.cost - :type formula: str - :return: None - :rtype: None - - Example: - - .. code:: python - - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) - ifcopenshell.api.run("cost.edit_cost_value_formula", model, cost_value=value, - formula="5000 * 1.19") - """ - self.file = file - self.settings = {"cost_value": cost_value, "formula": formula or {}} - def execute(self): try: data = ifcopenshell.util.cost.unserialise_cost_value(self.settings["formula"], self.settings["cost_value"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py index 5596ceff13..e52fd655cb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py @@ -21,48 +21,45 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, cost_item=None): - """Removes a cost item +def remove_cost_item(file, cost_item=None) -> None: + """Removes a cost item - All associated relationships with the cost item are also removed, - however the related resources, products, and tasks themselves are - retained. + All associated relationships with the cost item are also removed, + however the related resources, products, and tasks themselves are + retained. - :param cost_item: The IfcCostItem entity you want to remove - :type cost_item: ifcopenshell.entity_instance - :return: None - :rtype: None + :param cost_item: The IfcCostItem entity you want to remove + :type cost_item: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - ifcopenshell.api.run("cost.remove_cost_item", model, cost_item=item) - """ - self.file = file - self.settings = {"cost_item": cost_item} + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + ifcopenshell.api.run("cost.remove_cost_item", model, cost_item=item) + """ + settings = {"cost_item": cost_item} - def execute(self): - # TODO: do a deep purge - for inverse in self.file.get_inverse(self.settings["cost_item"]): - if inverse.is_a("IfcRelNests"): - if inverse.RelatingObject == self.settings["cost_item"]: - for related_object in inverse.RelatedObjects: - ifcopenshell.api.run("cost.remove_cost_item", self.file, cost_item=related_object) - elif inverse.RelatedObjects == (self.settings["cost_item"],): - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelAssignsToControl"): + # TODO: do a deep purge + for inverse in file.get_inverse(settings["cost_item"]): + if inverse.is_a("IfcRelNests"): + if inverse.RelatingObject == settings["cost_item"]: + for related_object in inverse.RelatedObjects: + ifcopenshell.api.run("cost.remove_cost_item", file, cost_item=related_object) + elif inverse.RelatedObjects == (settings["cost_item"],): history = inverse.OwnerHistory - self.file.remove(inverse) + file.remove(inverse) if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - history = self.settings["cost_item"].OwnerHistory - self.file.remove(self.settings["cost_item"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelAssignsToControl"): + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + history = settings["cost_item"].OwnerHistory + file.remove(settings["cost_item"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py index fae8e1cd37..eed3a7adb3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py @@ -17,40 +17,37 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, cost_item=None, physical_quantity=None): - """Removes a quantity assigned to a cost item +def remove_cost_item_quantity(file, cost_item=None, physical_quantity=None) -> None: + """Removes a quantity assigned to a cost item - If the quantity is part of a product (e.g. wall), then the quantity will - still exist and merely the relationship to the cost item will be - removed. + If the quantity is part of a product (e.g. wall), then the quantity will + still exist and merely the relationship to the cost item will be + removed. - :param cost_item: The IfcCostItem that the quantity is assigned to - :type cost_item: ifcopenshell.entity_instance - :param physical_quantity: The IfcPhysicalQuantity to remove - :type physical_quantity: ifcopenshell.entity_instance - :return: None - :rtype: None + :param cost_item: The IfcCostItem that the quantity is assigned to + :type cost_item: ifcopenshell.entity_instance + :param physical_quantity: The IfcPhysicalQuantity to remove + :type physical_quantity: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - quantity = ifcopenshell.api.run("cost.add_cost_item_quantity", model, - cost_item=item, ifc_class="IfcQuantityVolume") - # Let's change our mind and delete it - ifcopenshell.api.run("cost.remove_cost_item", model, - cost_item=item, physical_quantity=quantity) - """ - self.file = file - self.settings = {"cost_item": cost_item, "physical_quantity": physical_quantity} + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + quantity = ifcopenshell.api.run("cost.add_cost_item_quantity", model, + cost_item=item, ifc_class="IfcQuantityVolume") + # Let's change our mind and delete it + ifcopenshell.api.run("cost.remove_cost_item", model, + cost_item=item, physical_quantity=quantity) + """ + settings = {"cost_item": cost_item, "physical_quantity": physical_quantity} - def execute(self): - if len(self.file.get_inverse(self.settings["physical_quantity"])) == 1: - self.file.remove(self.settings["physical_quantity"]) - return - quantities = list(self.settings["cost_item"].CostQuantities or []) - quantities.remove(self.settings["physical_quantity"]) - self.settings["cost_item"].CostQuantities = quantities + if len(file.get_inverse(settings["physical_quantity"])) == 1: + file.remove(settings["physical_quantity"]) + return + quantities = list(settings["cost_item"].CostQuantities or []) + quantities.remove(settings["physical_quantity"]) + settings["cost_item"].CostQuantities = quantities diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py index 51feebb76e..7b73859bb0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py @@ -21,41 +21,36 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, cost_schedule=None): - """Removes a cost schedule +def remove_cost_schedule(file, cost_schedule=None) -> None: + """Removes a cost schedule - All associated relationships with the cost schedule are also removed, - including all cost items. + All associated relationships with the cost schedule are also removed, + including all cost items. - :param cost_schedule: The IfcCostSchedule entity you want to remove - :type cost_schedule: ifcopenshell.entity_instance - :return: None - :rtype: None + :param cost_schedule: The IfcCostSchedule entity you want to remove + :type cost_schedule: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - ifcopenshell.api.run("cost.remove_cost_schedule", model, cost_schedule=schedule) - """ - self.file = file - self.settings = {"cost_schedule": cost_schedule} + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + ifcopenshell.api.run("cost.remove_cost_schedule", model, cost_schedule=schedule) + """ + settings = {"cost_schedule": cost_schedule} - def execute(self): - # TODO: do a deep purge - for inverse in self.file.get_inverse(self.settings["cost_schedule"]): - if inverse.is_a("IfcRelAssignsToControl"): - [ - ifcopenshell.api.run( - "cost.remove_cost_item", self.file, cost_item=related_object - ) - for related_object in inverse.RelatedObjects - if related_object.is_a("IfcCostItem") - ] - history = self.settings["cost_schedule"].OwnerHistory - self.file.remove(self.settings["cost_schedule"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + # TODO: do a deep purge + for inverse in file.get_inverse(settings["cost_schedule"]): + if inverse.is_a("IfcRelAssignsToControl"): + [ + ifcopenshell.api.run("cost.remove_cost_item", file, cost_item=related_object) + for related_object in inverse.RelatedObjects + if related_object.is_a("IfcCostItem") + ] + history = settings["cost_schedule"].OwnerHistory + file.remove(settings["cost_schedule"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py index 4af7322899..757877bf9d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py @@ -17,51 +17,48 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, parent=None, cost_value=None): - """Removes a cost value +def remove_cost_value(file, parent=None, cost_value=None) -> None: + """Removes a cost value - The cost value may be assigned either to a cost item, a construction - resource, or another cost value (i.e. it is a subcomponent of a cost) + The cost value may be assigned either to a cost item, a construction + resource, or another cost value (i.e. it is a subcomponent of a cost) - :param parent: The IfcCostItem, IfcConstructionResource, or IfcCostValue - that the IfcCostValue is assigned to. - :type parent: ifcopenshell.entity_instance - :param cost_value: The IfcCostValue that you want to remove - :type parent: ifcopenshell.entity_instance - :return: None - :rtype: None + :param parent: The IfcCostItem, IfcConstructionResource, or IfcCostValue + that the IfcCostValue is assigned to. + :type parent: ifcopenshell.entity_instance + :param cost_value: The IfcCostValue that you want to remove + :type parent: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - # This cost item will have a unit cost of 5 and a volume of 3 - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 5.0}) + # This cost item will have a unit cost of 5 and a volume of 3 + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 5.0}) - ifcopenshell.api.run("cost.remove_cost_value", model, parent=item, cost_value=value) - """ - self.file = file - self.settings = {"parent": parent, "cost_value": cost_value} + ifcopenshell.api.run("cost.remove_cost_value", model, parent=item, cost_value=value) + """ + settings = {"parent": parent, "cost_value": cost_value} - def execute(self): - if len(self.file.get_inverse(self.settings["cost_value"])) == 1: - self.file.remove(self.settings["cost_value"]) - # TODO deep purge - elif self.settings["parent"].is_a("IfcCostItem"): - values = list(self.settings["parent"].CostValues) - values.remove(self.settings["cost_value"]) - self.settings["parent"].CostValues = values if values else None - elif self.settings["parent"].is_a("IfcConstructionResource"): - values = list(self.settings["parent"].BaseCosts) - values.remove(self.settings["cost_value"]) - self.settings["parent"].BaseCosts = values if values else None - elif self.settings["parent"].is_a("IfcCostValue"): - components = list(self.settings["parent"].Components) - components.remove(self.settings["cost_value"]) - self.settings["parent"].Components = components if components else None + if len(file.get_inverse(settings["cost_value"])) == 1: + file.remove(settings["cost_value"]) + # TODO deep purge + elif settings["parent"].is_a("IfcCostItem"): + values = list(settings["parent"].CostValues) + values.remove(settings["cost_value"]) + settings["parent"].CostValues = values if values else None + elif settings["parent"].is_a("IfcConstructionResource"): + values = list(settings["parent"].BaseCosts) + values.remove(settings["cost_value"]) + settings["parent"].BaseCosts = values if values else None + elif settings["parent"].is_a("IfcCostValue"): + components = list(settings["parent"].Components) + components.remove(settings["cost_value"]) + settings["parent"].Components = components if components else None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py index 091029f594..c7c5fc69fd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py @@ -19,56 +19,59 @@ import ifcopenshell.api +def unassign_cost_item_quantity(file, cost_item=None, products=None) -> None: + """Removes quantities of a cost item that are calculated on products + + A cost item may have quantities that are parametrically calculated on + physical products. This lets you remove those quantities. This means + that any future changes in the physical product's dimensions will not + have any impact on the cost item. + + :param cost_item: The IfcCostItem to remove quantities from + :type cost_item: ifcopenshell.entity_instance + :param products: A list of IfcProducts that may have parametrically + connected quantities to the cost item + :type products: list[ifcopenshell.entity_instance] + :return: None + :rtype: None + + Example: + + .. code:: python + + schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) + item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) + + # Let's imagine a unit cost of 5.0 per unit volume + value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) + ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, + attributes={"AppliedValue": 5.0}) + + slab = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSlab") + # Usually the quantity would be automatically calculated via a + # graphical authoring application but let's assign a manual quantity + # for now. + qto = ifcopenshell.api.run("pset.add_qto", model, product=slab, name="Qto_SlabBaseQuantities") + ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"NetVolume": 42.0}) + + # Now let's parametrically link the slab's quantity to the cost + # item. If the slab is edited in the future and 42.0 changes, then + # the updated value will also automatically be applied to the cost + # item. + ifcopenshell.api.run("cost.assign_cost_item_quantity", model, + cost_item=item, products=[slab], prop_name="NetVolume") + + # Let's change our mind and remove the parametric connection + ifcopenshell.api.run("cost.unassign_cost_item_quantity", model, + cost_item=item, products=[slab]) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"cost_item": cost_item, "products": products or []} + return usecase.execute() + + class Usecase: - def __init__(self, file, cost_item=None, products=None): - """Removes quantities of a cost item that are calculated on products - - A cost item may have quantities that are parametrically calculated on - physical products. This lets you remove those quantities. This means - that any future changes in the physical product's dimensions will not - have any impact on the cost item. - - :param cost_item: The IfcCostItem to remove quantities from - :type cost_item: ifcopenshell.entity_instance - :param products: A list of IfcProducts that may have parametrically - connected quantities to the cost item - :type products: list[ifcopenshell.entity_instance] - :return: None - :rtype: None - - Example: - - .. code:: python - - schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) - item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) - - # Let's imagine a unit cost of 5.0 per unit volume - value = ifcopenshell.api.run("cost.add_cost_value", model, parent=item) - ifcopenshell.api.run("cost.edit_cost_value", model, cost_value=value, - attributes={"AppliedValue": 5.0}) - - slab = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSlab") - # Usually the quantity would be automatically calculated via a - # graphical authoring application but let's assign a manual quantity - # for now. - qto = ifcopenshell.api.run("pset.add_qto", model, product=slab, name="Qto_SlabBaseQuantities") - ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"NetVolume": 42.0}) - - # Now let's parametrically link the slab's quantity to the cost - # item. If the slab is edited in the future and 42.0 changes, then - # the updated value will also automatically be applied to the cost - # item. - ifcopenshell.api.run("cost.assign_cost_item_quantity", model, - cost_item=item, products=[slab], prop_name="NetVolume") - - # Let's change our mind and remove the parametric connection - ifcopenshell.api.run("cost.unassign_cost_item_quantity", model, - cost_item=item, products=[slab]) - """ - self.file = file - self.settings = {"cost_item": cost_item, "products": products or []} - def execute(self): self.quantities = set(self.settings["cost_item"].CostQuantities or []) for quantity in self.settings["cost_item"].CostQuantities or []: diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py index e0caddbe3c..b1affe3a71 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py @@ -15,3 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_information import add_information +from .add_reference import add_reference +from .assign_document import assign_document +from .edit_information import edit_information +from .edit_reference import edit_reference +from .remove_information import remove_information +from .remove_reference import remove_reference +from .unassign_document import unassign_document diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py index 68c9c53759..fc60134477 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py @@ -19,69 +19,62 @@ import ifcopenshell -class Usecase: - def __init__(self, file, parent=None): - """Adds a new document information to the project +def add_information(file, parent=None) -> None: + """Adds a new document information to the project - An IFC document information is a document associated with the project. - It may be a drawing, specification, schedule, certificate, warranty - guarantee, manual, contract, and so on. They are often used for drawings - and facility management purposes. + An IFC document information is a document associated with the project. + It may be a drawing, specification, schedule, certificate, warranty + guarantee, manual, contract, and so on. They are often used for drawings + and facility management purposes. - A document may also be a subdocument of a larger document, this is - useful for superseding documents or tracking older versions. The parent - is considered the latest version and the children are older revisions. + A document may also be a subdocument of a larger document, this is + useful for superseding documents or tracking older versions. The parent + is considered the latest version and the children are older revisions. - :param parent: The parent document, if necessary. - :type parent: ifcopenshell.entity_instance, optional - :return: The newly created IfcDocumentInformation entity - :rtype: ifcopenshell.entity_instance + :param parent: The parent document, if necessary. + :type parent: ifcopenshell.entity_instance, optional + :return: The newly created IfcDocumentInformation entity + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - document = ifcopenshell.api.run("document.add_information", model) - # A document typically has a unique drawing or document name (which - # follows a coding system depending on the project), as well as a - # title. This should match what is shown on the titleblock or title - # page of the document. At a minimum you'd also want to specify a - # URI location. The location may be on local, or on a CDE, or any - # other platform. - ifcopenshell.api.run("document.edit_information", model, - information=document, - attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", - "Location": "A-GA-6100 - Overall Plan.pdf"}) - """ - self.file = file - self.settings = {"parent": parent} + document = ifcopenshell.api.run("document.add_information", model) + # A document typically has a unique drawing or document name (which + # follows a coding system depending on the project), as well as a + # title. This should match what is shown on the titleblock or title + # page of the document. At a minimum you'd also want to specify a + # URI location. The location may be on local, or on a CDE, or any + # other platform. + ifcopenshell.api.run("document.edit_information", model, + information=document, + attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", + "Location": "A-GA-6100 - Overall Plan.pdf"}) + """ + settings = {"parent": parent} - def execute(self): - id_attribute = "DocumentId" if self.file.schema == "IFC2X3" else "Identification" - information = self.file.create_entity( - "IfcDocumentInformation", **{id_attribute: "X", "Name": "Unnamed"} + id_attribute = "DocumentId" if file.schema == "IFC2X3" else "Identification" + information = file.create_entity("IfcDocumentInformation", **{id_attribute: "X", "Name": "Unnamed"}) + parent = settings["parent"] + if not parent and file.by_type("IfcProject"): + parent = file.by_type("IfcProject")[0] + if parent.is_a("IfcProject") or parent.is_a("IfcContext"): + file.create_entity( + "IfcRelAssociatesDocument", + GlobalId=ifcopenshell.guid.new(), + OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", file), + RelatingDocument=information, + RelatedObjects=[parent], ) - parent = self.settings["parent"] - if not parent and self.file.by_type("IfcProject"): - parent = self.file.by_type("IfcProject")[0] - if parent.is_a("IfcProject") or parent.is_a("IfcContext"): - self.file.create_entity( - "IfcRelAssociatesDocument", - GlobalId=ifcopenshell.guid.new(), - OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", self.file), - RelatingDocument=information, - RelatedObjects=[parent], + elif parent.is_a("IfcDocumentInformation"): + if parent.IsPointer: + rel = parent.IsPointer[0] + documents = set(rel.RelatedDocuments) + documents.add(information) + rel.RelatedDocuments = list(documents) + else: + file.create_entity( + "IfcDocumentInformationRelationship", RelatingDocument=parent, RelatedDocuments=[information] ) - elif parent.is_a("IfcDocumentInformation"): - if parent.IsPointer: - rel = parent.IsPointer[0] - documents = set(rel.RelatedDocuments) - documents.add(information) - rel.RelatedDocuments = list(documents) - else: - self.file.create_entity( - "IfcDocumentInformationRelationship", - RelatingDocument=parent, - RelatedDocuments=[information] - ) - return information + return information diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py index 80cf91d8a1..3b96b6d666 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/add_reference.py @@ -19,62 +19,57 @@ import ifcopenshell -class Usecase: - def __init__(self, file: ifcopenshell.file, information: ifcopenshell.entity_instance): - """Creates a new reference to a document to assign to products +def add_reference(file: ifcopenshell.file, information: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: + """Creates a new reference to a document to assign to products - A document may be associated with physical products, tasks, cost items, - and so on. For example, spaces, storeys, and buildings may have a list - of associated drawings so you can see which drawings (e.g. plans, - sections, details) are documenting that location. Alternatively, - equipment may have associated training manuals, operation and - maintenance manuals or detailed assembly drawings. Resources may be - training certification required, schedules may have gantt charts or bid - documents, and so on. + A document may be associated with physical products, tasks, cost items, + and so on. For example, spaces, storeys, and buildings may have a list + of associated drawings so you can see which drawings (e.g. plans, + sections, details) are documenting that location. Alternatively, + equipment may have associated training manuals, operation and + maintenance manuals or detailed assembly drawings. Resources may be + training certification required, schedules may have gantt charts or bid + documents, and so on. - In order to associate a document with an object, a reference to that - document needs to be created. It could be a reference to the entire - document, or a reference to a particular page or chapter. See - ifcopenshell.api.document.assign_document for more information. + In order to associate a document with an object, a reference to that + document needs to be created. It could be a reference to the entire + document, or a reference to a particular page or chapter. See + ifcopenshell.api.document.assign_document for more information. - :param information: The IfcDocumentInformation that the reference will - be created for - :type information: ifcopenshell.entity_instance - :return: The newly created IfcDocumentReference entity - :rtype: ifcopenshell.entity_instance + :param information: The IfcDocumentInformation that the reference will + be created for + :type information: ifcopenshell.entity_instance + :return: The newly created IfcDocumentReference entity + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - document = ifcopenshell.api.run("document.add_information", model) - ifcopenshell.api.run("document.edit_information", model, - information=document, - attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", - "Location": "A-GA-6100 - Overall Plan.pdf"}) + document = ifcopenshell.api.run("document.add_information", model) + ifcopenshell.api.run("document.edit_information", model, + information=document, + attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", + "Location": "A-GA-6100 - Overall Plan.pdf"}) - # In this case, we don't specify any more information, and so the - # reference is for the entire document, as opposed to a single page or - # chapter or section. - reference = ifcopenshell.api.run("document.add_reference", model, information=document) + # In this case, we don't specify any more information, and so the + # reference is for the entire document, as opposed to a single page or + # chapter or section. + reference = ifcopenshell.api.run("document.add_reference", model, information=document) - # Alternatively, we can specify a single section, such as by a - # subheading code. - reference2 = ifcopenshell.api.run("document.add_reference", model, information=document) - ifcopenshell.api.run("document.edit_reference", model, - reference=reference2, attributes={"Identification": "2.1.15"}) - """ - self.file = file - self.settings = {"information": information} + # Alternatively, we can specify a single section, such as by a + # subheading code. + reference2 = ifcopenshell.api.run("document.add_reference", model, information=document) + ifcopenshell.api.run("document.edit_reference", model, + reference=reference2, attributes={"Identification": "2.1.15"}) + """ + settings = {"information": information} - def execute(self) -> ifcopenshell.entity_instance: - if self.file.schema == "IFC2X3": - reference = self.file.create_entity("IfcDocumentReference", ItemReference="X") - if self.settings["information"]: - references = list(self.settings["information"].DocumentReferences or []) - references.append(reference) - self.settings["information"].DocumentReferences = references - return reference - return self.file.create_entity( - "IfcDocumentReference", ReferencedDocument=self.settings["information"], Identification="X" - ) + if file.schema == "IFC2X3": + reference = file.create_entity("IfcDocumentReference", ItemReference="X") + if settings["information"]: + references = list(settings["information"].DocumentReferences or []) + references.append(reference) + settings["information"].DocumentReferences = references + return reference + return file.create_entity("IfcDocumentReference", ReferencedDocument=settings["information"], Identification="X") diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py b/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py index f9b433213a..5818347a90 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py @@ -22,93 +22,85 @@ import ifcopenshell.util.element from typing import Union -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - document: ifcopenshell.entity_instance, - ): - """Assigns a document to a list of products +def assign_document( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + document: ifcopenshell.entity_instance, +) -> Union[ifcopenshell.entity_instance, None]: + """Assigns a document to a list of products - An object may be assigned to zero, one, or multiple documents. Almost - any object or property may be assigned to a document, though typically - we'd only use it for spaces, types, physical products and schedules. - Adding a new assignment is typically done using a document reference and - an object. IFC technically allows association with a document - information and an object, but this is not encouraged because it is not - consistent with other external relationships (such as classification - systems or libraries). + An object may be assigned to zero, one, or multiple documents. Almost + any object or property may be assigned to a document, though typically + we'd only use it for spaces, types, physical products and schedules. + Adding a new assignment is typically done using a document reference and + an object. IFC technically allows association with a document + information and an object, but this is not encouraged because it is not + consistent with other external relationships (such as classification + systems or libraries). - :param product: The list of objects to associate the document to. This could be - almost any sensible object in IFC. - :type product: list[ifcopenshell.entity_instance] - :param document: The IfcDocumentReference to associate to, or - alternatively an IfcDocumentInformation, though this is not - recommended. - :type document: ifcopenshell.entity_instance - :return: The IfcRelAssociatesDocument relationship - or `None` if `products` was an empty list or all products were - already assigned to the `document`. - :rtype: ifcopenshell.entity_instance + :param product: The list of objects to associate the document to. This could be + almost any sensible object in IFC. + :type product: list[ifcopenshell.entity_instance] + :param document: The IfcDocumentReference to associate to, or + alternatively an IfcDocumentInformation, though this is not + recommended. + :type document: ifcopenshell.entity_instance + :return: The IfcRelAssociatesDocument relationship + or `None` if `products` was an empty list or all products were + already assigned to the `document`. + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - document = ifcopenshell.api.run("document.add_information", model) - ifcopenshell.api.run("document.edit_information", model, - information=document, - attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", - "Location": "A-GA-6100 - Overall Plan.pdf"}) - reference = ifcopenshell.api.run("document.add_reference", model, information=document) + document = ifcopenshell.api.run("document.add_information", model) + ifcopenshell.api.run("document.edit_information", model, + information=document, + attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", + "Location": "A-GA-6100 - Overall Plan.pdf"}) + reference = ifcopenshell.api.run("document.add_reference", model, information=document) - # Let's imagine storey represents an IfcBuildingStorey for the ground floor - ifcopenshell.api.run("document.assign_document", model, products=[storey], document=reference) - """ - self.file = file - self.settings = { - "products": products, - "document": document, - } + # Let's imagine storey represents an IfcBuildingStorey for the ground floor + ifcopenshell.api.run("document.assign_document", model, products=[storey], document=reference) + """ + settings = { + "products": products, + "document": document, + } - def execute(self) -> Union[ifcopenshell.entity_instance, None]: - # TODO: do we need to support non-ifcroot elements like we do in classification.add_reference? - # NOTE: reuses code from `library.assign_reference` + # TODO: do we need to support non-ifcroot elements like we do in classification.add_reference? + # NOTE: reuses code from `library.assign_reference` - referenced_elements = ifcopenshell.util.element.get_referenced_elements(self.settings["document"]) - products: set[ifcopenshell.entity_instance] = set(self.settings["products"]) - products = products - referenced_elements + referenced_elements = ifcopenshell.util.element.get_referenced_elements(settings["document"]) + products: set[ifcopenshell.entity_instance] = set(settings["products"]) + products = products - referenced_elements - if not products: - return + if not products: + return - if self.file.schema == "IFC2X3": - rel = next( - ( - r - for r in self.file.by_type("IfcRelAssociatesDocument") - if r.RelatingDocument == self.settings["document"] - ), - None, - ) - else: - ifc_class = self.settings["document"].is_a() - if ifc_class == "IfcDocumentReference": - rel = next(iter(self.settings["document"].DocumentRefForObjects), None) - elif ifc_class == "IfcDocumentInformation": - rel = next(iter(self.settings["document"].DocumentInfoForObjects), None) + if file.schema == "IFC2X3": + rel = next( + (r for r in file.by_type("IfcRelAssociatesDocument") if r.RelatingDocument == settings["document"]), + None, + ) + else: + ifc_class = settings["document"].is_a() + if ifc_class == "IfcDocumentReference": + rel = next(iter(settings["document"].DocumentRefForObjects), None) + elif ifc_class == "IfcDocumentInformation": + rel = next(iter(settings["document"].DocumentInfoForObjects), None) - if not rel: - return self.file.create_entity( - "IfcRelAssociatesDocument", - GlobalId=ifcopenshell.guid.new(), - OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", self.file), - RelatedObjects=list(products), - RelatingDocument=self.settings["document"], - ) + if not rel: + return file.create_entity( + "IfcRelAssociatesDocument", + GlobalId=ifcopenshell.guid.new(), + OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", file), + RelatedObjects=list(products), + RelatingDocument=settings["document"], + ) - related_objects = set(rel.RelatedObjects) | products - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, element=rel) - return rel + related_objects = set(rel.RelatedObjects) | products + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, element=rel) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py index 96c0120120..478c1c11da 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py @@ -19,38 +19,34 @@ import ifcopenshell from typing import Any, Optional -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - information: ifcopenshell.entity_instance, - attributes: Optional[dict[str, Any]] = None, - ): - """Edits the attributes of an IfcDocumentInformation +def edit_information( + file: ifcopenshell.file, + information: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, +) -> None: + """Edits the attributes of an IfcDocumentInformation - For more information about the attributes and data types of an - IfcDocumentInformation, consult the IFC documentation. + For more information about the attributes and data types of an + IfcDocumentInformation, consult the IFC documentation. - :param reference: The IfcDocumentInformation entity you want to edit - :type reference: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param reference: The IfcDocumentInformation entity you want to edit + :type reference: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - document = ifcopenshell.api.run("document.add_information", model) - ifcopenshell.api.run("document.edit_information", model, - information=document, - attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", - "Location": "A-GA-6100 - Overall Plan.pdf"}) - """ - self.file = file - self.settings = {"information": information, "attributes": attributes or {}} + document = ifcopenshell.api.run("document.add_information", model) + ifcopenshell.api.run("document.edit_information", model, + information=document, + attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", + "Location": "A-GA-6100 - Overall Plan.pdf"}) + """ + settings = {"information": information, "attributes": attributes or {}} - def execute(self) -> None: - for name, value in self.settings["attributes"].items(): - setattr(self.settings["information"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["information"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py index d88afdfc2f..fb705fbbc2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py @@ -19,41 +19,37 @@ import ifcopenshell from typing import Any, Optional -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - reference: ifcopenshell.entity_instance, - attributes: Optional[dict[str, Any]] = None, - ): - """Edits the attributes of an IfcDocumentReference +def edit_reference( + file: ifcopenshell.file, + reference: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, +) -> None: + """Edits the attributes of an IfcDocumentReference - For more information about the attributes and data types of an - IfcDocumentReference, consult the IFC documentation. + For more information about the attributes and data types of an + IfcDocumentReference, consult the IFC documentation. - :param reference: The IfcDocumentReference entity you want to edit - :type reference: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param reference: The IfcDocumentReference entity you want to edit + :type reference: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - document = ifcopenshell.api.run("document.add_information", model) - ifcopenshell.api.run("document.edit_information", model, - information=document, - attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", - "Location": "A-GA-6100 - Overall Plan.pdf"}) - reference = ifcopenshell.api.run("document.add_reference", model, information=document) - ifcopenshell.api.run("document.edit_reference", model, - reference=reference, attributes={"Identification": "2.1.15"}) - """ - self.file = file - self.settings = {"reference": reference, "attributes": attributes or {}} + document = ifcopenshell.api.run("document.add_information", model) + ifcopenshell.api.run("document.edit_information", model, + information=document, + attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", + "Location": "A-GA-6100 - Overall Plan.pdf"}) + reference = ifcopenshell.api.run("document.add_reference", model, information=document) + ifcopenshell.api.run("document.edit_reference", model, + reference=reference, attributes={"Identification": "2.1.15"}) + """ + settings = {"reference": reference, "attributes": attributes or {}} - def execute(self) -> None: - for name, value in self.settings["attributes"].items(): - setattr(self.settings["reference"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["reference"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py index 56f57df283..86531252e9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py @@ -22,45 +22,42 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, information=None): - """Removes a document information +def remove_information(file, information=None) -> None: + """Removes a document information - All references and associations are also removed. + All references and associations are also removed. - :param information: The IfcDocumentInformation to remove - :type information: ifcopenshell.entity_instance - :return: None - :rtype: None + :param information: The IfcDocumentInformation to remove + :type information: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Add a document - document = ifcopenshell.api.run("document.add_information", model) - # ... and remove it! - ifcopenshell.api.run("document.remove_information", model, information=document) - """ - self.file = file - self.settings = {"information": information} + # Add a document + document = ifcopenshell.api.run("document.add_information", model) + # ... and remove it! + ifcopenshell.api.run("document.remove_information", model, information=document) + """ + settings = {"information": information} - def execute(self): - for reference in self.settings["information"].HasDocumentReferences or []: - ifcopenshell.api.run("document.remove_reference", self.file, reference=reference) + for reference in settings["information"].HasDocumentReferences or []: + ifcopenshell.api.run("document.remove_reference", file, reference=reference) - for rel in self.settings["information"].IsPointer or []: - for information in rel.RelatedDocuments: - ifcopenshell.api.run("document.remove_information", self.file, information=information) + for rel in settings["information"].IsPointer or []: + for information in rel.RelatedDocuments: + ifcopenshell.api.run("document.remove_information", file, information=information) - for rel in self.settings["information"].IsPointedTo or []: - if rel.RelatedDocuments == (self.settings["information"],): - # This relationship is non-rooted - self.file.remove(rel) + for rel in settings["information"].IsPointedTo or []: + if rel.RelatedDocuments == (settings["information"],): + # This relationship is non-rooted + file.remove(rel) - for rel in self.settings["information"].DocumentInfoForObjects or []: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - self.file.remove(self.settings["information"]) + for rel in settings["information"].DocumentInfoForObjects or []: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + file.remove(settings["information"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py index 61fd6810c1..5321b480f7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py @@ -20,32 +20,29 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file: ifcopenshell.file, reference: ifcopenshell.entity_instance): - """Remove a document reference +def remove_reference(file: ifcopenshell.file, reference: ifcopenshell.entity_instance) -> None: + """Remove a document reference - All associations with objects are removed. + All associations with objects are removed. - :param reference: The IfcDocumentReference to remove - :type reference: ifcopenshell.entity_instance - :return: None - :rtype: None + :param reference: The IfcDocumentReference to remove + :type reference: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - document = ifcopenshell.api.run("document.add_information", model) - reference = ifcopenshell.api.run("document.add_reference", model, information=document) - ifcopenshell.api.run("document.remove_reference", model, reference=reference) - """ - self.file = file - self.settings = {"reference": reference} + document = ifcopenshell.api.run("document.add_information", model) + reference = ifcopenshell.api.run("document.add_reference", model, information=document) + ifcopenshell.api.run("document.remove_reference", model, reference=reference) + """ + settings = {"reference": reference} - def execute(self) -> None: - for rel in self.settings["reference"].DocumentRefForObjects or []: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - self.file.remove(self.settings["reference"]) + for rel in settings["reference"].DocumentRefForObjects or []: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + file.remove(settings["reference"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py b/src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py index c4728d5511..44c0543501 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/unassign_document.py @@ -21,69 +21,65 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - document: ifcopenshell.entity_instance, - ): - """Unassigns a document and an association to the list of products +def unassign_document( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + document: ifcopenshell.entity_instance, +) -> None: + """Unassigns a document and an association to the list of products - :param product: The list of objects that the document reference or information is - related to. - :type product: list[ifcopenshell.entity_instance] - :param document: The IfcDocumentReference (typically) or in rare cases - the IfcDocumentInformation that is associated with the product - :type document: ifcopenshell.entity_instance - :return: None - :rtype: None + :param product: The list of objects that the document reference or information is + related to. + :type product: list[ifcopenshell.entity_instance] + :param document: The IfcDocumentReference (typically) or in rare cases + the IfcDocumentInformation that is associated with the product + :type document: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - document = ifcopenshell.api.run("document.add_information", model) - ifcopenshell.api.run("document.edit_information", model, - information=document, - attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", - "Location": "A-GA-6100 - Overall Plan.pdf"}) - reference = ifcopenshell.api.run("document.add_reference", model, information=document) + document = ifcopenshell.api.run("document.add_information", model) + ifcopenshell.api.run("document.edit_information", model, + information=document, + attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", + "Location": "A-GA-6100 - Overall Plan.pdf"}) + reference = ifcopenshell.api.run("document.add_reference", model, information=document) - # Let's imagine storey represents an IfcBuildingStorey for the ground floor - ifcopenshell.api.run("document.assign_document", model, products=[storey], document=reference) + # Let's imagine storey represents an IfcBuildingStorey for the ground floor + ifcopenshell.api.run("document.assign_document", model, products=[storey], document=reference) - # Now let's change our mind and remove the association - ifcopenshell.api.run("document.unassign_document", model, products=[storey], document=reference) - """ - self.file = file - self.settings = { - "products": products, - "document": document, - } + # Now let's change our mind and remove the association + ifcopenshell.api.run("document.unassign_document", model, products=[storey], document=reference) + """ + settings = { + "products": products, + "document": document, + } - def execute(self): - # TODO: do we need to support non-ifcroot elements like we do in classification.add_reference? - # NOTE: reuses code from `library.un assign_reference` + # TODO: do we need to support non-ifcroot elements like we do in classification.add_reference? + # NOTE: reuses code from `library.un assign_reference` - reference_rels: set[ifcopenshell.entity_instance] = set() - products = set(self.settings["products"]) - for product in products: - reference_rels.update(product.HasAssociations) + reference_rels: set[ifcopenshell.entity_instance] = set() + products = set(settings["products"]) + for product in products: + reference_rels.update(product.HasAssociations) - reference_rels = { - rel - for rel in reference_rels - if rel.is_a("IfcRelAssociatesDocument") and rel.RelatingDocument == self.settings["document"] - } + reference_rels = { + rel + for rel in reference_rels + if rel.is_a("IfcRelAssociatesDocument") and rel.RelatingDocument == settings["document"] + } - for rel in reference_rels: - related_objects = set(rel.RelatedObjects) - products - if related_objects: - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + for rel in reference_rels: + related_objects = set(rel.RelatedObjects) - products + if related_objects: + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + else: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py index e0caddbe3c..dd010e886e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .assign_product import assign_product +from .edit_text_literal import edit_text_literal +from .unassign_product import unassign_product diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py index 051dd985b3..b35d0bd564 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py @@ -20,95 +20,92 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, relating_product=None, related_object=None): - """Associates a product and an object, typically for annotation +def assign_product(file, relating_product=None, related_object=None) -> None: + """Associates a product and an object, typically for annotation - Warning: this is an experimental API. + Warning: this is an experimental API. - When you want to draw attention to a feature or characteristic (such as - a dimension, material, or name) or of a product (e.g. wall, slab, - furniture, etc), an annotation object is created. This annotation is - then associated with the product so that it can reference attributes, - properties, and relationships. + When you want to draw attention to a feature or characteristic (such as + a dimension, material, or name) or of a product (e.g. wall, slab, + furniture, etc), an annotation object is created. This annotation is + then associated with the product so that it can reference attributes, + properties, and relationships. - For example, an annotation of a line will be associated with a grid - axis, such that when that grid axis moves, the annotation of that grid - axis (which is typically truncated to the extents of a drawing) will - also move. + For example, an annotation of a line will be associated with a grid + axis, such that when that grid axis moves, the annotation of that grid + axis (which is typically truncated to the extents of a drawing) will + also move. - Another example might be a label of a furniture product, which might - have some text of the name of the furniture to be shown on drawings or - in 3D. + Another example might be a label of a furniture product, which might + have some text of the name of the furniture to be shown on drawings or + in 3D. - :param relating_product: The IfcProduct the object is related to - :type relating_product: ifcopenshell.entity_instance - :param related_object: The object (typically IfcAnnotation) that the - product is related to - :type related_object: ifcopenshell.entity_instance - :return: The created IfcRelAssignsToProduct relationship - :rtype: ifcopenshell.entity_instance + :param relating_product: The IfcProduct the object is related to + :type relating_product: ifcopenshell.entity_instance + :param related_object: The object (typically IfcAnnotation) that the + product is related to + :type related_object: ifcopenshell.entity_instance + :return: The created IfcRelAssignsToProduct relationship + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") - annotation = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcAnnotation") - ifcopenshell.api.run("drawing.assign_product", model, - relating_product=furniture, related_object=annotation) - """ - self.file = file - self.settings = { - "relating_product": relating_product, - "related_object": related_object, - } + furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") + annotation = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcAnnotation") + ifcopenshell.api.run("drawing.assign_product", model, + relating_product=furniture, related_object=annotation) + """ + settings = { + "relating_product": relating_product, + "related_object": related_object, + } - def execute(self): - is_grid_axis = self.settings["relating_product"].is_a("IfcGridAxis") + is_grid_axis = settings["relating_product"].is_a("IfcGridAxis") - if is_grid_axis: - if self.settings["related_object"].HasAssignments: - for rel in self.settings["related_object"].HasAssignments: - if rel.is_a("IfcRelAssignsToProduct") and rel.Name == self.settings["relating_product"].AxisTag: - return - elif self.settings["related_object"].HasAssignments: - for rel in self.settings["related_object"].HasAssignments: - if rel.is_a("IfcRelAssignsToProduct") and rel.RelatingProduct == self.settings["relating_product"]: + if is_grid_axis: + if settings["related_object"].HasAssignments: + for rel in settings["related_object"].HasAssignments: + if rel.is_a("IfcRelAssignsToProduct") and rel.Name == settings["relating_product"].AxisTag: return + elif settings["related_object"].HasAssignments: + for rel in settings["related_object"].HasAssignments: + if rel.is_a("IfcRelAssignsToProduct") and rel.RelatingProduct == settings["relating_product"]: + return - referenced_by = None + referenced_by = None - if is_grid_axis: - axis = self.settings["relating_product"] - grid = None - for attribute in ("PartOfW", "PartOfV", "PartOfU"): - if getattr(axis, attribute, None): - grid = getattr(axis, attribute)[0] - self.settings["relating_product"] = grid - for rel in grid.ReferencedBy: - if rel.Name == axis.AxisTag: - referenced_by = rel - break - elif self.settings["relating_product"].ReferencedBy: - referenced_by = self.settings["relating_product"].ReferencedBy[0] + if is_grid_axis: + axis = settings["relating_product"] + grid = None + for attribute in ("PartOfW", "PartOfV", "PartOfU"): + if getattr(axis, attribute, None): + grid = getattr(axis, attribute)[0] + settings["relating_product"] = grid + for rel in grid.ReferencedBy: + if rel.Name == axis.AxisTag: + referenced_by = rel + break + elif settings["relating_product"].ReferencedBy: + referenced_by = settings["relating_product"].ReferencedBy[0] - if referenced_by: - related_objects = list(referenced_by.RelatedObjects) - related_objects.append(self.settings["related_object"]) - referenced_by.RelatedObjects = related_objects - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": referenced_by}) - else: - referenced_by = self.file.create_entity( - "IfcRelAssignsToProduct", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": [self.settings["related_object"]], - "RelatingProduct": self.settings["relating_product"], - } - ) + if referenced_by: + related_objects = list(referenced_by.RelatedObjects) + related_objects.append(settings["related_object"]) + referenced_by.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": referenced_by}) + else: + referenced_by = file.create_entity( + "IfcRelAssignsToProduct", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": [settings["related_object"]], + "RelatingProduct": settings["relating_product"], + } + ) - if is_grid_axis: - referenced_by.Name = axis.AxisTag - return referenced_by + if is_grid_axis: + referenced_by.Name = axis.AxisTag + return referenced_by diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py index 00b8bc4f82..f1aadc25b0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py @@ -17,31 +17,28 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, text_literal=None, attributes=None): - """Edits the attributes of an IfcTextLiteral +def edit_text_literal(file, text_literal=None, attributes=None) -> None: + """Edits the attributes of an IfcTextLiteral - For more information about the attributes and data types of an - IfcTextLiteral, consult the IFC documentation. + For more information about the attributes and data types of an + IfcTextLiteral, consult the IFC documentation. - :param reference: The IfcTextLiteral entity you want to edit - :type reference: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param reference: The IfcTextLiteral entity you want to edit + :type reference: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - text = model.createIfcTextLiteral() - ifcopenshell.api.run("drawing.edit_text_literal", model, - text_literal=text, attributes={"Literal": "MY ANNOTATION"}) - """ - self.file = file - self.settings = {"text_literal": text_literal, "attributes": attributes or {}} + text = model.createIfcTextLiteral() + ifcopenshell.api.run("drawing.edit_text_literal", model, + text_literal=text, attributes={"Literal": "MY ANNOTATION"}) + """ + settings = {"text_literal": text_literal, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["text_literal"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["text_literal"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py index 91ee7ded3d..8254bffdce 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py @@ -21,54 +21,51 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, relating_product=None, related_object=None): - """Unassigns a product and an object (typically an annotation) +def unassign_product(file, relating_product=None, related_object=None) -> None: + """Unassigns a product and an object (typically an annotation) - Smart annotation objects can be associated with products so that they - can annotate attributes and properties. This function lets you remove - the association, so that you may change the assocation with another - object later or leave the annotation as a "dumb" annotation. + Smart annotation objects can be associated with products so that they + can annotate attributes and properties. This function lets you remove + the association, so that you may change the assocation with another + object later or leave the annotation as a "dumb" annotation. - :param relating_product: The IfcProduct the object is related to - :type relating_product: ifcopenshell.entity_instance - :param related_object: The object (typically IfcAnnotation) that the - product is related to - :type related_object: ifcopenshell.entity_instance - :return: The created IfcRelAssignsToProduct relationship - :rtype: ifcopenshell.entity_instance + :param relating_product: The IfcProduct the object is related to + :type relating_product: ifcopenshell.entity_instance + :param related_object: The object (typically IfcAnnotation) that the + product is related to + :type related_object: ifcopenshell.entity_instance + :return: The created IfcRelAssignsToProduct relationship + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") - annotation = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcAnnotation") - ifcopenshell.api.run("drawing.assign_product", model, - relating_product=furniture, related_object=annotation) + furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") + annotation = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcAnnotation") + ifcopenshell.api.run("drawing.assign_product", model, + relating_product=furniture, related_object=annotation) - # Let's change our mind and remove the relationship - ifcopenshell.api.run("drawing.unassign_product", model, - relating_product=furniture, related_object=annotation) - """ - self.file = file - self.settings = { - "relating_product": relating_product, - "related_object": related_object, - } + # Let's change our mind and remove the relationship + ifcopenshell.api.run("drawing.unassign_product", model, + relating_product=furniture, related_object=annotation) + """ + settings = { + "relating_product": relating_product, + "related_object": related_object, + } - def execute(self): - for rel in self.settings["related_object"].HasAssignments or []: - if not rel.is_a("IfcRelAssignsToProduct") or rel.RelatingProduct != self.settings["relating_product"]: - continue - if len(rel.RelatedObjects) == 1: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - return - related_objects = list(rel.RelatedObjects) - related_objects.remove(self.settings["related_object"]) - rel.RelatedObjects = related_objects - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - return rel + for rel in settings["related_object"].HasAssignments or []: + if not rel.is_a("IfcRelAssignsToProduct") or rel.RelatingProduct != settings["relating_product"]: + continue + if len(rel.RelatedObjects) == 1: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + return + related_objects = list(rel.RelatedObjects) + related_objects.remove(settings["related_object"]) + rel.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py index e0caddbe3c..1caaa312ba 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py @@ -15,3 +15,30 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_axis_representation import add_axis_representation +from .add_boolean import add_boolean +from .add_door_representation import add_door_representation +from .add_footprint_representation import add_footprint_representation +from .add_mesh_representation import add_mesh_representation +from .add_profile_representation import add_profile_representation +from .add_railing_representation import add_railing_representation + +try: + from .add_representation import add_representation +except ModuleNotFoundError as e: + print(f"Note: API not available due to missing dependencies: geometry.add_representation - {e}") +from .add_slab_representation import add_slab_representation +from .add_wall_representation import add_wall_representation +from .add_window_representation import add_window_representation +from .assign_representation import assign_representation +from .connect_element import connect_element +from .connect_path import connect_path +from .create_2pt_wall import create_2pt_wall +from .disconnect_element import disconnect_element +from .disconnect_path import disconnect_path +from .edit_object_placement import edit_object_placement +from .map_representation import map_representation +from .remove_boolean import remove_boolean +from .remove_representation import remove_representation +from .unassign_representation import unassign_representation diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py index 8a09531a26..d8180d287f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py @@ -19,61 +19,64 @@ import ifcopenshell.util.unit +def add_axis_representation(file, context=None, axis=None) -> None: + """Adds a new axis representation + + Certain objects are typically "axis-based", such as walls, beams, + and columns. This means you can represent them abstractly by simply + drawing a single line either in 2D (such as for walls) or 3D (for beams + and columns). Humans can understand this axis-based representation as + being a simplification of a layered extrusion or a profile that is being + extruded along that axis and joined to other elements. + + Using an axis-based representation makes it easy for users and computers + to analyse connectivity and spatial relationships, as well as makes it + easy to parametrically edit these objects by simply stretching the start + or end of the axis. + + For now, only simple straight line axes are supported, represented by a + start and end coordinate. The order is important. For walls, the start + must be at the minimum local X ordinate, and the end at the maximum + local X ordinate. For beams and columns, the start is at the minimum + local Z ordinate, and the end of the maximum local Z ordinate. The first + coordinate is the "start" and the second coordinate is the "end". This + stat and end is then used to determine any parametric junctions with + other elements. + + Using an axis-representation is optional, but highly recommended for + "standard" representations of walls, beams, columns, and other + structural members. A rule of thumb is that if you can draw it as a line + on paper, you can probably represent it using an axis. + + :param context: The IfcGeometricRepresentationContext that the + representation is part of. This must be either a + Model/Axis/GRAPH_VIEW (3D) or Plan/Axis/GRAPH_VIEW (2D). + :type context: ifcopenshell.entity_instance + :param axis: The axis, as a list of two coordinates, the coordinates + being either a list of 2 or 3 float coordinates depending on whether + the axis is 2D or 3D. + :type axis: list[list[float]] + :return: The newly created IfcShapeRepresentation entity + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + context = ifcopenshell.util.representation.get_context(model, "Plan", "Axis", "GRAPH_VIEW") + axis = ifcopenshell.api.run("geometry.add_axis_representation", model, + context=context, axis=[(0.0, 0.0), (1.0, 0.0)]) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "context": context, + "axis": axis or [], + } + return usecase.execute() + + class Usecase: - def __init__(self, file, context=None, axis=None): - """Adds a new axis representation - - Certain objects are typically "axis-based", such as walls, beams, - and columns. This means you can represent them abstractly by simply - drawing a single line either in 2D (such as for walls) or 3D (for beams - and columns). Humans can understand this axis-based representation as - being a simplification of a layered extrusion or a profile that is being - extruded along that axis and joined to other elements. - - Using an axis-based representation makes it easy for users and computers - to analyse connectivity and spatial relationships, as well as makes it - easy to parametrically edit these objects by simply stretching the start - or end of the axis. - - For now, only simple straight line axes are supported, represented by a - start and end coordinate. The order is important. For walls, the start - must be at the minimum local X ordinate, and the end at the maximum - local X ordinate. For beams and columns, the start is at the minimum - local Z ordinate, and the end of the maximum local Z ordinate. The first - coordinate is the "start" and the second coordinate is the "end". This - stat and end is then used to determine any parametric junctions with - other elements. - - Using an axis-representation is optional, but highly recommended for - "standard" representations of walls, beams, columns, and other - structural members. A rule of thumb is that if you can draw it as a line - on paper, you can probably represent it using an axis. - - :param context: The IfcGeometricRepresentationContext that the - representation is part of. This must be either a - Model/Axis/GRAPH_VIEW (3D) or Plan/Axis/GRAPH_VIEW (2D). - :type context: ifcopenshell.entity_instance - :param axis: The axis, as a list of two coordinates, the coordinates - being either a list of 2 or 3 float coordinates depending on whether - the axis is 2D or 3D. - :type axis: list[list[float]] - :return: The newly created IfcShapeRepresentation entity - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - context = ifcopenshell.util.representation.get_context(model, "Plan", "Axis", "GRAPH_VIEW") - axis = ifcopenshell.api.run("geometry.add_axis_representation", model, - context=context, axis=[(0.0, 0.0), (1.0, 0.0)]) - """ - self.file = file - self.settings = { - "context": context, - "axis": axis or [], - } - def execute(self): self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) is_2d = len(self.settings["axis"][0]) == 2 @@ -82,9 +85,13 @@ class Usecase: curve = self.file.createIfcPolyline([self.file.createIfcCartesianPoint(p) for p in points]) else: if is_2d: - curve = self.file.createIfcIndexedPolyCurve(self.file.createIfcCartesianPointList2D(points), None, False) + curve = self.file.createIfcIndexedPolyCurve( + self.file.createIfcCartesianPointList2D(points), None, False + ) else: - curve = self.file.createIfcIndexedPolyCurve(self.file.createIfcCartesianPointList3D(points), None, False) + curve = self.file.createIfcIndexedPolyCurve( + self.file.createIfcCartesianPointList3D(points), None, False + ) return self.file.createIfcShapeRepresentation( self.settings["context"], self.settings["context"].ContextIdentifier, diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py index 66a5bf3baf..3ec590a6f3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py @@ -20,24 +20,27 @@ import ifcopenshell.util.unit import numpy as np -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = { - "representation": None, - "operator": "DIFFERENCE", - # IfcHalfSpaceSolid, Mesh - "type": "IfcHalfSpaceSolid", - # The XY plane is the clipping boundary and +Z is removed. - "matrix": None, # A matrix to define a clipping Ifchalfspacesolid. - "blender_obj": None, # A Blender OBJ to define the voided OBJ for a "Mesh" type - "blender_void": None, # A Blender OBJ to define the void OBJ for a "Mesh" type - "should_force_faceted_brep": False, - "should_force_triangulation": False, - } - for key, value in settings.items(): - self.settings[key] = value +def add_boolean(file, **usecase_settings) -> None: + usecase = Usecase() + usecase.file = file + usecase.settings = { + "representation": None, + "operator": "DIFFERENCE", + # IfcHalfSpaceSolid, Mesh + "type": "IfcHalfSpaceSolid", + # The XY plane is the clipping boundary and +Z is removed. + "matrix": None, # A matrix to define a clipping Ifchalfspacesolid. + "blender_obj": None, # A Blender OBJ to define the voided OBJ for a "Mesh" type + "blender_void": None, # A Blender OBJ to define the void OBJ for a "Mesh" type + "should_force_faceted_brep": False, + "should_force_triangulation": False, + } + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() + +class Usecase: def execute(self): self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) if self.settings["type"] == "IfcHalfSpaceSolid": diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py index 4da8d5b1be..da7678aac4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py @@ -63,11 +63,7 @@ def create_ifc_door_lining( points = [p.xz for p in points] door_lining = builder.polyline(points, closed=True) - door_lining = builder.extrude( - door_lining, - size.y, - **builder.extrude_kwargs("Y") - ) + door_lining = builder.extrude(door_lining, size.y, **builder.extrude_kwargs("Y")) builder.translate(door_lining, position) return door_lining @@ -79,75 +75,78 @@ def create_ifc_box(builder: ShapeBuilder, size: Vector, position: Vector = V(0, return box -class Usecase: - def __init__(self, file, **settings): - """units in settings expected to be in ifc project units""" - self.file = file - # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoor.htm - # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoorTypeOperationEnum.htm - # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoorLiningProperties.htm - # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoorPanelProperties.htm - self.settings = {"unit_scale": ifcopenshell.util.unit.calculate_unit_scale(self.file)} - self.settings.update( - { - "context": None, # IfcGeometricRepresentationContext - "overall_height": self.convert_si_to_unit(2.0), - "overall_width": self.convert_si_to_unit(0.9), - # DOUBLE_DOOR_DOUBLE_SWING, DOUBLE_DOOR_FOLDING, DOUBLE_DOOR_LIFTING_VERTICAL, - # DOUBLE_DOOR_SINGLE_SWING, DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT, - # DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT, DOUBLE_DOOR_SLIDING, - # DOUBLE_SWING_LEFT, DOUBLE_SWING_RIGHT, FOLDING_TO_LEFT, - # FOLDING_TO_RIGHT, LIFTING_HORIZONTAL, LIFTING_VERTICAL_LEFT, - # LIFTING_VERTICAL_RIGHT, REVOLVING, REVOLVING_VERTICAL, - # ROLLINGUP, SINGLE_SWING_LEFT, SINGLE_SWING_RIGHT, SLIDING_TO_LEFT, - # SLIDING_TO_RIGHT, SWING_FIXED_LEFT, SWING_FIXED_RIGHT - "operation_type": "SINGLE_SWING_LEFT", # door type - "lining_properties": { - "LiningDepth": self.convert_si_to_unit(0.050), - "LiningThickness": self.convert_si_to_unit(0.050), - # offset from the outer side of the wall (by Y-axis) - "LiningOffset": self.convert_si_to_unit(0.0), - # offset from the wall - "LiningToPanelOffsetX": self.convert_si_to_unit(0.025), - # offset from the X-axis (unlike windows) - "LiningToPanelOffsetY": self.convert_si_to_unit(0.025), - # transom - vertical distance between door and window panels - "TransomThickness": self.convert_si_to_unit(0.000), - # TransomOffset - distance from the bottom door opening - # to the beginning of the transom - # unlike windows TransomOffset which goes to the center of the transom - "TransomOffset": self.convert_si_to_unit(1.525), - "ShapeAspectStyle": None, # DEPRECATED - # Casing cover wall faces around the opening - # on the left, right and upper sides - # Casing should be either on both sides of the wall or no casing - # If `LiningOffset` is present then therefore casing is not possible on outer wall - # therefore there will be no casing on inner wall either - "CasingDepth": self.convert_si_to_unit(0.005), - "CasingThickness": self.convert_si_to_unit(0.075), # by Z-axis - # Threshold covers the bottom side of the opening - "ThresholdDepth": self.convert_si_to_unit(0.1), - "ThresholdThickness": self.convert_si_to_unit(0.025), # by Z-axis - # offset by Y-axis - "ThresholdOffset": self.convert_si_to_unit(0.000), - }, - "panel_properties": { - "PanelDepth": self.convert_si_to_unit(0.035), # by Y - "PanelWidth": 1.0, # as ratio to the clear door opening - "FrameDepth": self.convert_si_to_unit(0.035), # by Y - "FrameThickness": self.convert_si_to_unit(0.035), # by X - # LEFT, MIDDLE, RIGHT, NOTDEFINED - "PanelPosition": ..., # NEVER USED - # defines the basic ways to describe how door panels operate - # basically how it opens - "PanelOperation": None, # NEVER USED - "ShapeAspectStyle": None, # DEPRECATED - }, - } - ) - for key, value in settings.items(): - self.settings[key] = value +def add_door_representation(file, **usecase_settings) -> None: + """units in usecase_settings expected to be in ifc project units""" + usecase = Usecase() + usecase.file = file + # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoor.htm + # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoorTypeOperationEnum.htm + # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoorLiningProperties.htm + # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoorPanelProperties.htm + usecase.settings = {"unit_scale": ifcopenshell.util.unit.calculate_unit_scale(usecase.file)} + usecase.settings.update( + { + "context": None, # IfcGeometricRepresentationContext + "overall_height": usecase.convert_si_to_unit(2.0), + "overall_width": usecase.convert_si_to_unit(0.9), + # DOUBLE_DOOR_DOUBLE_SWING, DOUBLE_DOOR_FOLDING, DOUBLE_DOOR_LIFTING_VERTICAL, + # DOUBLE_DOOR_SINGLE_SWING, DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT, + # DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT, DOUBLE_DOOR_SLIDING, + # DOUBLE_SWING_LEFT, DOUBLE_SWING_RIGHT, FOLDING_TO_LEFT, + # FOLDING_TO_RIGHT, LIFTING_HORIZONTAL, LIFTING_VERTICAL_LEFT, + # LIFTING_VERTICAL_RIGHT, REVOLVING, REVOLVING_VERTICAL, + # ROLLINGUP, SINGLE_SWING_LEFT, SINGLE_SWING_RIGHT, SLIDING_TO_LEFT, + # SLIDING_TO_RIGHT, SWING_FIXED_LEFT, SWING_FIXED_RIGHT + "operation_type": "SINGLE_SWING_LEFT", # door type + "lining_properties": { + "LiningDepth": usecase.convert_si_to_unit(0.050), + "LiningThickness": usecase.convert_si_to_unit(0.050), + # offset from the outer side of the wall (by Y-axis) + "LiningOffset": usecase.convert_si_to_unit(0.0), + # offset from the wall + "LiningToPanelOffsetX": usecase.convert_si_to_unit(0.025), + # offset from the X-axis (unlike windows) + "LiningToPanelOffsetY": usecase.convert_si_to_unit(0.025), + # transom - vertical distance between door and window panels + "TransomThickness": usecase.convert_si_to_unit(0.000), + # TransomOffset - distance from the bottom door opening + # to the beginning of the transom + # unlike windows TransomOffset which goes to the center of the transom + "TransomOffset": usecase.convert_si_to_unit(1.525), + "ShapeAspectStyle": None, # DEPRECATED + # Casing cover wall faces around the opening + # on the left, right and upper sides + # Casing should be either on both sides of the wall or no casing + # If `LiningOffset` is present then therefore casing is not possible on outer wall + # therefore there will be no casing on inner wall either + "CasingDepth": usecase.convert_si_to_unit(0.005), + "CasingThickness": usecase.convert_si_to_unit(0.075), # by Z-axis + # Threshold covers the bottom side of the opening + "ThresholdDepth": usecase.convert_si_to_unit(0.1), + "ThresholdThickness": usecase.convert_si_to_unit(0.025), # by Z-axis + # offset by Y-axis + "ThresholdOffset": usecase.convert_si_to_unit(0.000), + }, + "panel_properties": { + "PanelDepth": usecase.convert_si_to_unit(0.035), # by Y + "PanelWidth": 1.0, # as ratio to the clear door opening + "FrameDepth": usecase.convert_si_to_unit(0.035), # by Y + "FrameThickness": usecase.convert_si_to_unit(0.035), # by X + # LEFT, MIDDLE, RIGHT, NOTDEFINED + "PanelPosition": ..., # NEVER USED + # defines the basic ways to describe how door panels operate + # basically how it opens + "PanelOperation": None, # NEVER USED + "ShapeAspectStyle": None, # DEPRECATED + }, + } + ) + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() + +class Usecase: def execute(self): builder = ShapeBuilder(self.file) overall_height = self.settings["overall_height"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_footprint_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_footprint_representation.py index afdf95155a..976b48e5ce 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_footprint_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_footprint_representation.py @@ -19,20 +19,17 @@ import ifcopenshell.util.unit -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = { - "context": None, # IfcGeometricRepresentationContext - "curves": [], # A list of IFC curves to include in the curve set - } - for key, value in settings.items(): - self.settings[key] = value +def add_footprint_representation(file, **usecase_settings) -> None: + settings = { + "context": None, # IfcGeometricRepresentationContext + "curves": [], # A list of IFC curves to include in the curve set + } + for key, value in usecase_settings.items(): + settings[key] = value - def execute(self): - return self.file.createIfcShapeRepresentation( - self.settings["context"], - self.settings["context"].ContextIdentifier, - "GeometricCurveSet", - [self.file.createIfcGeometricCurveSet(self.settings["curves"])], - ) + return file.createIfcShapeRepresentation( + settings["context"], + settings["context"].ContextIdentifier, + "GeometricCurveSet", + [file.createIfcGeometricCurveSet(settings["curves"])], + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_mesh_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_mesh_representation.py index ac2167a70e..fbe42063d9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_mesh_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_mesh_representation.py @@ -19,25 +19,28 @@ import ifcopenshell.util.unit -class Usecase: - def __init__(self, file: ifcopenshell.file, **settings): - self.file = file - self.settings = { - "context": None, # IfcGeometricRepresentationContext - # Vertices, edges, and faces are given in the form of: [item1, item2, item3, ...] - # ... where itemN = [(0., 0., 0.), (1., 1., 1.), (x, y, z), ...] - "vertices": None, # A list of coordinates - # ... where itemN = [(0, 1), (1, 2), (v1, v2), ...] - "edges": None, # A list of edges, represented by vertex index pairs - # ... where itemN = [(0, 1, 2), (5, 4, 2, 3), (v1, v2, v3, ... vN), ...] - "faces": None, # A list of polygons, represented by vertex indices - "coordinate_offset": None, # Optionally apply a vector offset to all coordinates - "unit_scale": None, # A scale factor to apply for all vectors in case the unit is different - "force_faceted_brep": False, # Force using IfcFacetedBreps instead of IfcPolygonalFaceSets - } - for key, value in settings.items(): - self.settings[key] = value +def add_mesh_representation(file: ifcopenshell.file, **usecase_settings) -> None: + usecase = Usecase() + usecase.file = file + usecase.settings = { + "context": None, # IfcGeometricRepresentationContext + # Vertices, edges, and faces are given in the form of: [item1, item2, item3, ...] + # ... where itemN = [(0., 0., 0.), (1., 1., 1.), (x, y, z), ...] + "vertices": None, # A list of coordinates + # ... where itemN = [(0, 1), (1, 2), (v1, v2), ...] + "edges": None, # A list of edges, represented by vertex index pairs + # ... where itemN = [(0, 1, 2), (5, 4, 2, 3), (v1, v2, v3, ... vN), ...] + "faces": None, # A list of polygons, represented by vertex indices + "coordinate_offset": None, # Optionally apply a vector offset to all coordinates + "unit_scale": None, # A scale factor to apply for all vectors in case the unit is different + "force_faceted_brep": False, # Force using IfcFacetedBreps instead of IfcPolygonalFaceSets + } + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() + +class Usecase: def execute(self): if self.settings["unit_scale"] is None: self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_profile_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_profile_representation.py index c38aaf87df..025f09f0fc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_profile_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_profile_representation.py @@ -21,22 +21,25 @@ import ifcopenshell.util.unit from ifcopenshell.util.data import Clipping -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = { - "context": None, # IfcGeometricRepresentationContext - "profile": None, - "depth": 1.0, - "cardinal_point": 5, - # Planes are defined either by Clipping objects - # or by dictionaries of arguments for `Clipping.parse` - "clippings": [], # A list of planes that define clipping half space solids - "placement_zx_axes": (None, None), - } - for key, value in settings.items(): - self.settings[key] = value +def add_profile_representation(file, **usecase_settings) -> None: + usecase = Usecase() + usecase.file = file + usecase.settings = { + "context": None, # IfcGeometricRepresentationContext + "profile": None, + "depth": 1.0, + "cardinal_point": 5, + # Planes are defined either by Clipping objects + # or by dictionaries of arguments for `Clipping.parse` + "clippings": [], # A list of planes that define clipping half space solids + "placement_zx_axes": (None, None), + } + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() + +class Usecase: def execute(self): self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) self.settings["clippings"] = [Clipping.parse(c) for c in self.settings["clippings"]] diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_railing_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_railing_representation.py index b597633678..9de884c8c2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_railing_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_railing_representation.py @@ -31,39 +31,42 @@ def mm(x): return x / 1000 +def add_railing_representation(file, **usecase_settings) -> None: + """ + units in usecase_settings expected to be in ifc project units + + `railing_path` is a list of point coordinates for the railing path, + coordinates are expected to be at the top of the railing, not at the center + + `railing_path` is expected to be a list of Vector objects + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"unit_scale": ifcopenshell.util.unit.calculate_unit_scale(usecase.file)} + usecase.settings.update( + { + "context": None, # IfcGeometricRepresentationContext + "railing_type": "WALL_MOUNTED_HANDRAIL", + "railing_path": usecase.path_si_to_units([V(0, 0, 1), V(1, 0, 1), V(2, 0, 1)]), + "use_manual_supports": False, + "support_spacing": usecase.convert_si_to_unit(mm(1000)), + "railing_diameter": usecase.convert_si_to_unit(mm(50)), + "clear_width": usecase.convert_si_to_unit(mm(40)), + "terminal_type": "180", + "height": usecase.convert_si_to_unit(mm(1000)), + "looped_path": False, + } + ) + + for key, value in usecase_settings.items(): + usecase.settings[key] = value + + if usecase.settings["railing_type"] != "WALL_MOUNTED_HANDRAIL": + raise Exception('Only "WALL_MOUNTED_HANDRAIL" railing_type is supported at the moment.') + return usecase.execute() + + class Usecase: - def __init__(self, file, **settings): - """ - units in settings expected to be in ifc project units - - `railing_path` is a list of point coordinates for the railing path, - coordinates are expected to be at the top of the railing, not at the center - - `railing_path` is expected to be a list of Vector objects - """ - self.file = file - self.settings = {"unit_scale": ifcopenshell.util.unit.calculate_unit_scale(self.file)} - self.settings.update( - { - "context": None, # IfcGeometricRepresentationContext - "railing_type": "WALL_MOUNTED_HANDRAIL", - "railing_path": self.path_si_to_units([V(0, 0, 1), V(1, 0, 1), V(2, 0, 1)]), - "use_manual_supports": False, - "support_spacing": self.convert_si_to_unit(mm(1000)), - "railing_diameter": self.convert_si_to_unit(mm(50)), - "clear_width": self.convert_si_to_unit(mm(40)), - "terminal_type": "180", - "height": self.convert_si_to_unit(mm(1000)), - "looped_path": False, - } - ) - - for key, value in settings.items(): - self.settings[key] = value - - if self.settings["railing_type"] != "WALL_MOUNTED_HANDRAIL": - raise Exception('Only "WALL_MOUNTED_HANDRAIL" railing_type is supported at the moment.') - def execute(self): arc_points = [] items_3d = [] diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index 155bfb2bea..6c9a8da058 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -28,37 +28,40 @@ X_AXIS = Vector((1, 0, 0)) EPSILON = 1e-6 -class Usecase: - def __init__(self, file: ifcopenshell.file, **settings): - # TODO: This usecase currently depends on Blender's data model - self.file = file - self.settings = { - "context": None, # IfcGeometricRepresentationContext - "blender_object": None, # This is (currently) a Blender object, hence this depends on Blender now - "geometry": None, # This is (currently) a Blender data object, hence this depends on Blender now - "coordinate_offset": None, # Optionally apply a vector offset to all coordinates - "total_items": 1, # How many representation items to create - "unit_scale": None, # A scale factor to apply for all vectors in case the unit is different - "should_force_faceted_brep": False, # If we should force faceted breps for meshes - "should_force_triangulation": False, # If we should force triangulation for meshes - "should_generate_uvs": False, # If UV coordinates should also be generated - # Possible IFC representation classes: - # IfcExtrudedAreaSolid/IfcRectangleProfileDef - # IfcExtrudedAreaSolid/IfcCircleProfileDef - # IfcExtrudedAreaSolid/IfcArbitraryClosedProfileDef - # IfcExtrudedAreaSolid/IfcArbitraryProfileDefWithVoids - # IfcExtrudedAreaSolid/IfcMaterialProfileSetUsage - # IfcGeometricCurveSet/IfcTextLiteral - # IfcTextLiteral - "ifc_representation_class": None, # Whether to cast a mesh into a particular class - "profile_set_usage": None, # The material profile set if the extrusion requires it - "text_literal": None, # The text literal if the representation requires it - } - self.ifc_vertices = [] - for key, value in settings.items(): - self.settings[key] = value +def add_representation(file: ifcopenshell.file, **usecase_settings) -> ifcopenshell.entity_instance: + usecase = Usecase() + # TODO: This usecase currently depends on Blender's data model + usecase.file = file + usecase.settings = { + "context": None, # IfcGeometricRepresentationContext + "blender_object": None, # This is (currently) a Blender object, hence this depends on Blender now + "geometry": None, # This is (currently) a Blender data object, hence this depends on Blender now + "coordinate_offset": None, # Optionally apply a vector offset to all coordinates + "total_items": 1, # How many representation items to create + "unit_scale": None, # A scale factor to apply for all vectors in case the unit is different + "should_force_faceted_brep": False, # If we should force faceted breps for meshes + "should_force_triangulation": False, # If we should force triangulation for meshes + "should_generate_uvs": False, # If UV coordinates should also be generated + # Possible IFC representation classes: + # IfcExtrudedAreaSolid/IfcRectangleProfileDef + # IfcExtrudedAreaSolid/IfcCircleProfileDef + # IfcExtrudedAreaSolid/IfcArbitraryClosedProfileDef + # IfcExtrudedAreaSolid/IfcArbitraryProfileDefWithVoids + # IfcExtrudedAreaSolid/IfcMaterialProfileSetUsage + # IfcGeometricCurveSet/IfcTextLiteral + # IfcTextLiteral + "ifc_representation_class": None, # Whether to cast a mesh into a particular class + "profile_set_usage": None, # The material profile set if the extrusion requires it + "text_literal": None, # The text literal if the representation requires it + } + usecase.ifc_vertices = [] + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() - def execute(self) -> ifcopenshell.entity_instance: + +class Usecase: + def execute(self): self.is_manifold = None if ( isinstance(self.settings["geometry"], bpy.types.Mesh) @@ -374,10 +377,12 @@ class Usecase: return items def create_plane(self, polygon): - return self.file.createIfcPlane(Position=self.file.createIfcAxis2Placement3D( - Location=self.file.createIfcCartesianPoint(polygon.center), - Axis=self.file.createIfcDirection(polygon.normal), - )) + return self.file.createIfcPlane( + Position=self.file.createIfcAxis2Placement3D( + Location=self.file.createIfcCartesianPoint(polygon.center), + Axis=self.file.createIfcDirection(polygon.normal), + ) + ) def create_annotation_fill_areas(self, is_2d=False) -> list[ifcopenshell.entity_instance]: items = [] diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py index 2edd68d5c1..7514ade38f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py @@ -20,20 +20,23 @@ import ifcopenshell.util.unit from math import sin, cos -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = { - "context": None, # IfcGeometricRepresentationContext - "depth": 0.2, - "x_angle": 0, # Radians - # Planes are defined either by Clipping objects - # or by dictionaries of arguments for `Clipping.parse` - "clippings": [], # A list of planes that define clipping half space solids - } - for key, value in settings.items(): - self.settings[key] = value +def add_slab_representation(file, **usecase_settings) -> None: + usecase = Usecase() + usecase.file = file + usecase.settings = { + "context": None, # IfcGeometricRepresentationContext + "depth": 0.2, + "x_angle": 0, # Radians + # Planes are defined either by Clipping objects + # or by dictionaries of arguments for `Clipping.parse` + "clippings": [], # A list of planes that define clipping half space solids + } + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() + +class Usecase: def execute(self): self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) return self.file.createIfcShapeRepresentation( diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py index 6aa5466f58..504a89078b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py @@ -21,25 +21,28 @@ from math import sin, cos from ifcopenshell.util.data import Clipping -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = { - "context": None, # IfcGeometricRepresentationContext - "length": 1.0, - "height": 3.0, - "offset": 0.0, - "thickness": 0.2, - # Sloped walls along the wall's X axis, provided in radians - "x_angle": 0, - # Planes are defined either by Clipping objects - # or by dictionaries of arguments for `Clipping.parse` - "clippings": [], # A list of planes that define clipping half space solids - "booleans": [], # Any existing IfcBooleanResults - } - for key, value in settings.items(): - self.settings[key] = value +def add_wall_representation(file, **usecase_settings) -> None: + usecase = Usecase() + usecase.file = file + usecase.settings = { + "context": None, # IfcGeometricRepresentationContext + "length": 1.0, + "height": 3.0, + "offset": 0.0, + "thickness": 0.2, + # Sloped walls along the wall's X axis, provided in radians + "x_angle": 0, + # Planes are defined either by Clipping objects + # or by dictionaries of arguments for `Clipping.parse` + "clippings": [], # A list of planes that define clipping half space solids + "booleans": [], # Any existing IfcBooleanResults + } + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() + +class Usecase: def execute(self): self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) self.settings["clippings"] = [Clipping.parse(c) for c in self.settings["clippings"]] diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_window_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_window_representation.py index 94b97636aa..b0a46e69ab 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_window_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_window_representation.py @@ -56,12 +56,7 @@ def create_ifc_window_frame_simple( th_left, th_up, th_right, th_bottom = thickness def get_extruded_profile(profile): - return builder.extrude( - profile, - size.y, - position=position, - **builder.extrude_kwargs("Y") - ) + return builder.extrude(profile, size.y, position=position, **builder.extrude_kwargs("Y")) # if all lining sides are present then we can just use two rectangles # as inner and outer curves of the profile @@ -207,12 +202,7 @@ def create_ifc_window( glass_position = frame_position + V(0, frame_size.y / 2 - glass_thickness / 2, 0) glass_rect = builder.deep_copy(frame_extruded_items[0].SweptArea.InnerCurves[0]) - glass = builder.extrude( - glass_rect, - glass_thickness, - position=glass_position, - **builder.extrude_kwargs("Y") - ) + glass = builder.extrude(glass_rect, glass_thickness, position=glass_position, **builder.extrude_kwargs("Y")) output_items = [lining_items, frame_extruded_items, [glass]] builder.translate(chain(*output_items), position) @@ -220,73 +210,76 @@ def create_ifc_window( return output_items -class Usecase: - def __init__(self, file, **settings): - """units in settings expected to be in ifc project units""" - self.file = file - # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindow.htm - # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindowTypePartitioningEnum.htm - # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindowLiningProperties.htm - # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindowPanelProperties.htm - self.settings = {"unit_scale": ifcopenshell.util.unit.calculate_unit_scale(self.file)} - self.settings.update( - { - "context": None, # IfcGeometricRepresentationContext - # SINGLE_PANEL, DOUBLE_PANEL_HORIZONTAL, DOUBLE_PANEL_VERTICAL, - # TRIPLE_PANEL_BOTTOM, TRIPLE_PANEL_HORIZONTAL, TRIPLE_PANEL_LEFT, - # TRIPLE_PANEL_RIGHT, TRIPLE_PANEL_TOP, TRIPLE_PANEL_VERTICAL - "partition_type": "SINGLE_PANEL", - "overall_height": self.convert_si_to_unit(0.9), - "overall_width": self.convert_si_to_unit(0.6), - "lining_properties": { - "LiningDepth": self.convert_si_to_unit(0.050), - "LiningThickness": self.convert_si_to_unit(0.050), - "LiningOffset": self.convert_si_to_unit(0.050), # offset to the wall - # offset from the wall - "LiningToPanelOffsetX": self.convert_si_to_unit(0.025), - # offset from the lining - # that way it allows you to define overall_depth constant between all panels - # and still have panels with different size: - # overall_depth = lining_depth + offset_y - # full offset from X axis = overall_depth - frame_depth - "LiningToPanelOffsetY": self.convert_si_to_unit(0.025), - # applies to DoublePanelVertical, TriplePanelBottom, TriplePanelTop, - # TriplePanelLeft, TriplePanelRight - # mullion - horizontal distance between panels - "MullionThickness": self.convert_si_to_unit(0.050), - # distance from the first lining to the mullion center - "FirstMullionOffset": self.convert_si_to_unit(0.3), - # applies to TriplePanelVertical - # distance from the first lining to the second mullion center - "SecondMullionOffset": self.convert_si_to_unit(0.45), - # applies to DoublePanelHorizontal, TriplePanelBottom, TriplePanelTop, - # TriplePanelLeft, TriplePanelRight - # works similar way to mullion - "TransomThickness": self.convert_si_to_unit(0.050), - "FirstTransomOffset": self.convert_si_to_unit(0.3), - # applies to TriplePanelHorizontal - "SecondTransomOffset": self.convert_si_to_unit(0.6), +def add_window_representation(file, **usecase_settings) -> None: + """units in usecase_settings expected to be in ifc project units""" + usecase = Usecase() + usecase.file = file + # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindow.htm + # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindowTypePartitioningEnum.htm + # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindowLiningProperties.htm + # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindowPanelProperties.htm + usecase.settings = {"unit_scale": ifcopenshell.util.unit.calculate_unit_scale(usecase.file)} + usecase.settings.update( + { + "context": None, # IfcGeometricRepresentationContext + # SINGLE_PANEL, DOUBLE_PANEL_HORIZONTAL, DOUBLE_PANEL_VERTICAL, + # TRIPLE_PANEL_BOTTOM, TRIPLE_PANEL_HORIZONTAL, TRIPLE_PANEL_LEFT, + # TRIPLE_PANEL_RIGHT, TRIPLE_PANEL_TOP, TRIPLE_PANEL_VERTICAL + "partition_type": "SINGLE_PANEL", + "overall_height": usecase.convert_si_to_unit(0.9), + "overall_width": usecase.convert_si_to_unit(0.6), + "lining_properties": { + "LiningDepth": usecase.convert_si_to_unit(0.050), + "LiningThickness": usecase.convert_si_to_unit(0.050), + "LiningOffset": usecase.convert_si_to_unit(0.050), # offset to the wall + # offset from the wall + "LiningToPanelOffsetX": usecase.convert_si_to_unit(0.025), + # offset from the lining + # that way it allows you to define overall_depth constant between all panels + # and still have panels with different size: + # overall_depth = lining_depth + offset_y + # full offset from X axis = overall_depth - frame_depth + "LiningToPanelOffsetY": usecase.convert_si_to_unit(0.025), + # applies to DoublePanelVertical, TriplePanelBottom, TriplePanelTop, + # TriplePanelLeft, TriplePanelRight + # mullion - horizontal distance between panels + "MullionThickness": usecase.convert_si_to_unit(0.050), + # distance from the first lining to the mullion center + "FirstMullionOffset": usecase.convert_si_to_unit(0.3), + # applies to TriplePanelVertical + # distance from the first lining to the second mullion center + "SecondMullionOffset": usecase.convert_si_to_unit(0.45), + # applies to DoublePanelHorizontal, TriplePanelBottom, TriplePanelTop, + # TriplePanelLeft, TriplePanelRight + # works similar way to mullion + "TransomThickness": usecase.convert_si_to_unit(0.050), + "FirstTransomOffset": usecase.convert_si_to_unit(0.3), + # applies to TriplePanelHorizontal + "SecondTransomOffset": usecase.convert_si_to_unit(0.6), + "ShapeAspectStyle": None, # DEPRECATED + }, + "panel_properties": [ + { + "FrameDepth": usecase.convert_si_to_unit(0.035), # by Y + "FrameThickness": usecase.convert_si_to_unit(0.035), # by X + # BOTTOM, LEFT, MIDDLE, RIGHT, TOP + "PanelPosition": ..., # NEVER USED + # defines the basic ways to describe how window panels operate + # how it's hanged, how it opens + "OperationType": None, # NEVER USED "ShapeAspectStyle": None, # DEPRECATED }, - "panel_properties": [ - { - "FrameDepth": self.convert_si_to_unit(0.035), # by Y - "FrameThickness": self.convert_si_to_unit(0.035), # by X - # BOTTOM, LEFT, MIDDLE, RIGHT, TOP - "PanelPosition": ..., # NEVER USED - # defines the basic ways to describe how window panels operate - # how it's hanged, how it opens - "OperationType": None, # NEVER USED - "ShapeAspectStyle": None, # DEPRECATED - }, - ], - } - ) + ], + } + ) - for key, value in settings.items(): - self.settings[key] = value - self.settings["panel_schema"] = DEFAULT_PANEL_SCHEMAS[self.settings["partition_type"]] + for key, value in usecase_settings.items(): + usecase.settings[key] = value + usecase.settings["panel_schema"] = DEFAULT_PANEL_SCHEMAS[usecase.settings["partition_type"]] + return usecase.execute() + +class Usecase: def execute(self): builder = ShapeBuilder(self.file) overall_height = self.settings["overall_height"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py index 41d7f9422b..1df964d845 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py @@ -20,13 +20,16 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = {"product": None, "representation": None} - for key, value in settings.items(): - self.settings[key] = value +def assign_representation(file, **usecase_settings) -> None: + usecase = Usecase() + usecase.file = file + usecase.settings = {"product": None, "representation": None} + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() + +class Usecase: def execute(self): if self.settings["product"].is_a("IfcProduct"): product_type = ifcopenshell.util.element.get_type(self.settings["product"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py index 9339752d4c..64df2e59d6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py @@ -21,44 +21,41 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = { - "relating_element": None, - "related_element": None, - "description": None, - } - for key, value in settings.items(): - self.settings[key] = value +def connect_element(file, **usecase_settings) -> None: + settings = { + "relating_element": None, + "related_element": None, + "description": None, + } + for key, value in usecase_settings.items(): + settings[key] = value - def execute(self): - incompatible_connections = [] + incompatible_connections = [] - for rel in self.settings["relating_element"].ConnectedFrom: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatingElement == self.settings["related_element"]: - incompatible_connections.append(rel) + for rel in settings["relating_element"].ConnectedFrom: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatingElement == settings["related_element"]: + incompatible_connections.append(rel) - for rel in self.settings["related_element"].ConnectedTo: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == self.settings["relating_element"]: - incompatible_connections.append(rel) + for rel in settings["related_element"].ConnectedTo: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == settings["relating_element"]: + incompatible_connections.append(rel) - if incompatible_connections: - for connection in set(incompatible_connections): - history = connection.OwnerHistory - self.file.remove(connection) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + if incompatible_connections: + for connection in set(incompatible_connections): + history = connection.OwnerHistory + file.remove(connection) + if history: + ifcopenshell.util.element.remove_deep2(file, history) - for rel in self.settings["relating_element"].ConnectedTo: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == self.settings["related_element"]: - rel.Description = self.settings["description"] - return rel + for rel in settings["relating_element"].ConnectedTo: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == settings["related_element"]: + rel.Description = settings["description"] + return rel - return self.file.createIfcRelConnectsElements( - ifcopenshell.guid.new(), - OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", self.file), - Description=self.settings["description"], - RelatingElement=self.settings["relating_element"], - RelatedElement=self.settings["related_element"], - ) + return file.createIfcRelConnectsElements( + ifcopenshell.guid.new(), + OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", file), + Description=settings["description"], + RelatingElement=settings["relating_element"], + RelatedElement=settings["related_element"], + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py index 1a610a7d2c..7cc60c4ef1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py @@ -21,76 +21,73 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = { - "relating_element": None, - "related_element": None, - "relating_connection": "NOTDEFINED", - "related_connection": "NOTDEFINED", - "description": None, - } - for key, value in settings.items(): - self.settings[key] = value +def connect_path(file, **usecase_settings) -> None: + settings = { + "relating_element": None, + "related_element": None, + "relating_connection": "NOTDEFINED", + "related_connection": "NOTDEFINED", + "description": None, + } + for key, value in usecase_settings.items(): + settings[key] = value - def execute(self): - incompatible_connections = [] - for rel in self.settings["relating_element"].ConnectedTo: - if not rel.is_a("IfcRelConnectsPathElements"): - continue - if rel.RelatedElement == self.settings["related_element"]: - incompatible_connections.append(rel) - elif ( - rel.RelatingConnectionType in ["ATSTART", "ATEND"] - and rel.RelatingConnectionType == self.settings["relating_connection"] - ): - incompatible_connections.append(rel) + incompatible_connections = [] + for rel in settings["relating_element"].ConnectedTo: + if not rel.is_a("IfcRelConnectsPathElements"): + continue + if rel.RelatedElement == settings["related_element"]: + incompatible_connections.append(rel) + elif ( + rel.RelatingConnectionType in ["ATSTART", "ATEND"] + and rel.RelatingConnectionType == settings["relating_connection"] + ): + incompatible_connections.append(rel) - for rel in self.settings["relating_element"].ConnectedFrom: - if not rel.is_a("IfcRelConnectsPathElements"): - continue - if ( - rel.RelatedConnectionType in ["ATSTART", "ATEND"] - and rel.RelatedConnectionType == self.settings["relating_connection"] - ): - incompatible_connections.append(rel) + for rel in settings["relating_element"].ConnectedFrom: + if not rel.is_a("IfcRelConnectsPathElements"): + continue + if ( + rel.RelatedConnectionType in ["ATSTART", "ATEND"] + and rel.RelatedConnectionType == settings["relating_connection"] + ): + incompatible_connections.append(rel) - for rel in self.settings["related_element"].ConnectedFrom: - if not rel.is_a("IfcRelConnectsPathElements"): - continue - if ( - rel.RelatedConnectionType in ["ATSTART", "ATEND"] - and rel.RelatedConnectionType == self.settings["related_connection"] - ): - incompatible_connections.append(rel) + for rel in settings["related_element"].ConnectedFrom: + if not rel.is_a("IfcRelConnectsPathElements"): + continue + if ( + rel.RelatedConnectionType in ["ATSTART", "ATEND"] + and rel.RelatedConnectionType == settings["related_connection"] + ): + incompatible_connections.append(rel) - for rel in self.settings["related_element"].ConnectedTo: - if not rel.is_a("IfcRelConnectsPathElements"): - continue - if rel.RelatedElement == self.settings["relating_element"]: - incompatible_connections.append(rel) - elif ( - rel.RelatingConnectionType in ["ATSTART", "ATEND"] - and rel.RelatingConnectionType == self.settings["related_connection"] - ): - incompatible_connections.append(rel) + for rel in settings["related_element"].ConnectedTo: + if not rel.is_a("IfcRelConnectsPathElements"): + continue + if rel.RelatedElement == settings["relating_element"]: + incompatible_connections.append(rel) + elif ( + rel.RelatingConnectionType in ["ATSTART", "ATEND"] + and rel.RelatingConnectionType == settings["related_connection"] + ): + incompatible_connections.append(rel) - if incompatible_connections: - for connection in set(incompatible_connections): - history = connection.OwnerHistory - self.file.remove(connection) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + if incompatible_connections: + for connection in set(incompatible_connections): + history = connection.OwnerHistory + file.remove(connection) + if history: + ifcopenshell.util.element.remove_deep2(file, history) - return self.file.createIfcRelConnectsPathElements( - ifcopenshell.guid.new(), - OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", self.file), - Description=self.settings["description"], - RelatingElement=self.settings["relating_element"], - RelatedElement=self.settings["related_element"], - RelatingConnectionType=self.settings["relating_connection"], - RelatedConnectionType=self.settings["related_connection"], - RelatingPriorities=[], - RelatedPriorities=[], - ) + return file.createIfcRelConnectsPathElements( + ifcopenshell.guid.new(), + OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", file), + Description=settings["description"], + RelatingElement=settings["relating_element"], + RelatedElement=settings["related_element"], + RelatingConnectionType=settings["relating_connection"], + RelatedConnectionType=settings["related_connection"], + RelatingPriorities=[], + RelatedPriorities=[], + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/create_2pt_wall.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/create_2pt_wall.py index e228730974..cd508d4a3e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/create_2pt_wall.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/create_2pt_wall.py @@ -21,20 +21,25 @@ import ifcopenshell.api import ifcopenshell.util.unit -class Usecase: - def __init__(self, file, element=None, context=None, p1=None, p2=None, elevation=None, height=None, thickness=None, is_si=True): - self.file = file - self.settings = { - "element": element, - "context": context, - "p1": p1, - "p2": p2, - "elevation": elevation, - "height": height, - "thickness": thickness, - "is_si": is_si - } +def create_2pt_wall( + file, element=None, context=None, p1=None, p2=None, elevation=None, height=None, thickness=None, is_si=True +) -> None: + usecase = Usecase() + usecase.file = file + usecase.settings = { + "element": element, + "context": context, + "p1": p1, + "p2": p2, + "elevation": elevation, + "height": height, + "thickness": thickness, + "is_si": is_si, + } + return usecase.execute() + +class Usecase: def execute(self): self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) @@ -44,9 +49,9 @@ class Usecase: length = float(np.linalg.norm(self.settings["p2"] - self.settings["p1"])) if not self.settings["is_si"]: - length=self.convert_unit_to_si(length) - self.settings["height"]=self.convert_unit_to_si(self.settings["height"]) - self.settings["thickness"]=self.convert_unit_to_si(self.settings["thickness"]) + length = self.convert_unit_to_si(length) + self.settings["height"] = self.convert_unit_to_si(self.settings["height"]) + self.settings["thickness"] = self.convert_unit_to_si(self.settings["thickness"]) self.settings["p1"][0] = self.convert_unit_to_si(self.settings["p1"][0]) self.settings["p1"][1] = self.convert_unit_to_si(self.settings["p1"][1]) self.settings["elevation"] = self.convert_unit_to_si(self.settings["elevation"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_element.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_element.py index 680b3e85e7..1e1eaaa82b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_element.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_element.py @@ -20,38 +20,35 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = { - "relating_element": None, - "related_element": None, - } - for key, value in settings.items(): - self.settings[key] = value +def disconnect_element(file, **usecase_settings) -> None: + settings = { + "relating_element": None, + "related_element": None, + } + for key, value in usecase_settings.items(): + settings[key] = value - def execute(self): - incompatible_connections = [] + incompatible_connections = [] - for rel in self.settings["relating_element"].ConnectedTo: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == self.settings["related_element"]: - incompatible_connections.append(rel) + for rel in settings["relating_element"].ConnectedTo: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == settings["related_element"]: + incompatible_connections.append(rel) - for rel in self.settings["relating_element"].ConnectedFrom: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatingElement == self.settings["related_element"]: - incompatible_connections.append(rel) + for rel in settings["relating_element"].ConnectedFrom: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatingElement == settings["related_element"]: + incompatible_connections.append(rel) - for rel in self.settings["related_element"].ConnectedTo: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == self.settings["relating_element"]: - incompatible_connections.append(rel) + for rel in settings["related_element"].ConnectedTo: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == settings["relating_element"]: + incompatible_connections.append(rel) - for rel in self.settings["related_element"].ConnectedFrom: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatingElement == self.settings["relating_element"]: - incompatible_connections.append(rel) + for rel in settings["related_element"].ConnectedFrom: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatingElement == settings["relating_element"]: + incompatible_connections.append(rel) - if incompatible_connections: - for connection in set(incompatible_connections): - history = connection.OwnerHistory - self.file.remove(connection) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + if incompatible_connections: + for connection in set(incompatible_connections): + history = connection.OwnerHistory + file.remove(connection) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py index 8e52c7e4ff..14bbaf9e7c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py @@ -21,38 +21,35 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = { - "relating_element": None, - "related_element": None, - "element": None, - "connection_type": None, - } - for key, value in settings.items(): - self.settings[key] = value +def disconnect_path(file, **usecase_settings) -> None: + settings = { + "relating_element": None, + "related_element": None, + "element": None, + "connection_type": None, + } + for key, value in usecase_settings.items(): + settings[key] = value - def execute(self): - if self.settings["connection_type"] and self.settings["element"]: - connections = [ - r - for r in self.settings["element"].ConnectedTo - if r.is_a("IfcRelConnectsPathElements") and r.RelatingConnectionType == self.settings["connection_type"] - ] + [ - r - for r in self.settings["element"].ConnectedFrom - if r.is_a("IfcRelConnectsPathElements") and r.RelatedConnectionType == self.settings["connection_type"] - ] - else: - connections = [ - r - for r in self.settings["relating_element"].ConnectedTo - if r.is_a("IfcRelConnectsPathElements") and r.RelatedElement == self.settings["related_element"] - ] + if settings["connection_type"] and settings["element"]: + connections = [ + r + for r in settings["element"].ConnectedTo + if r.is_a("IfcRelConnectsPathElements") and r.RelatingConnectionType == settings["connection_type"] + ] + [ + r + for r in settings["element"].ConnectedFrom + if r.is_a("IfcRelConnectsPathElements") and r.RelatedConnectionType == settings["connection_type"] + ] + else: + connections = [ + r + for r in settings["relating_element"].ConnectedTo + if r.is_a("IfcRelConnectsPathElements") and r.RelatedElement == settings["related_element"] + ] - for connection in set(connections): - history = connection.OwnerHistory - self.file.remove(connection) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + for connection in set(connections): + history = connection.OwnerHistory + file.remove(connection) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py index 2f442388b6..768468e03a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py @@ -27,24 +27,26 @@ from typing import Optional, Union NPArrayOfFloats = npt.NDArray[np.float64] -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - product: ifcopenshell.entity_instance, - matrix: Optional[NPArrayOfFloats] = None, - is_si=True, - should_transform_children=False, - ): - self.file = file - self.settings = { - "product": product, - "matrix": matrix if matrix is not None else np.eye(4), - "is_si": is_si, - "should_transform_children": should_transform_children, - } +def edit_object_placement( + file: ifcopenshell.file, + product: ifcopenshell.entity_instance, + matrix: Optional[NPArrayOfFloats] = None, + is_si=True, + should_transform_children=False, +) -> ifcopenshell.entity_instance: + usecase = Usecase() + usecase.file = file + usecase.settings = { + "product": product, + "matrix": matrix if matrix is not None else np.eye(4), + "is_si": is_si, + "should_transform_children": should_transform_children, + } + return usecase.execute() - def execute(self) -> ifcopenshell.entity_instance: + +class Usecase: + def execute(self): if not hasattr(self.settings["product"], "ObjectPlacement"): return self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py index 1e4b4e2207..83e1e1e821 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py @@ -17,14 +17,17 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = {"representation": None} - self.ifc_vertices = [] - for key, value in settings.items(): - self.settings[key] = value +def map_representation(file, **usecase_settings) -> None: + usecase = Usecase() + usecase.file = file + usecase.settings = {"representation": None} + usecase.ifc_vertices = [] + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() + +class Usecase: def execute(self): mapping_source = self.get_mapping_source() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_boolean.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_boolean.py index 85ca854233..5d81203a5d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_boolean.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_boolean.py @@ -19,13 +19,16 @@ import ifcopenshell.util.element -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = {"item": None} - for key, value in settings.items(): - self.settings[key] = value +def remove_boolean(file, **usecase_settings) -> None: + usecase = Usecase() + usecase.file = file + usecase.settings = {"item": None} + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() + +class Usecase: def execute(self): item = None for inverse in self.file.get_inverse(self.settings["item"]): diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_representation.py index d7893ea317..7aafb751e0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_representation.py @@ -19,62 +19,57 @@ import ifcopenshell.util.element -class Usecase: - def __init__(self, file: ifcopenshell.file, representation: ifcopenshell.entity_instance): - """Remove a representation. +def remove_representation(file: ifcopenshell.file, representation: ifcopenshell.entity_instance) -> None: + """Remove a representation. - Also purges representation items and their related elements - like IfcStyledItem, tessellated facesets colours and UV map. + Also purges representation items and their related elements + like IfcStyledItem, tessellated facesets colours and UV map. - :param representation: IfcRepresentation to remove. - Note that it's expected that IfcRepresentation won't be in use - before calling this method (in such elements as IfcProductRepresentation, IfcShapeAspect) - otherwise representation won't be removed. - :type representation: ifcopenshell.entity_instance - :return: None - :rtype: None - """ - self.file = file - self.settings = {"representation": representation} + :param representation: IfcRepresentation to remove. + Note that it's expected that IfcRepresentation won't be in use + before calling this method (in such elements as IfcProductRepresentation, IfcShapeAspect) + otherwise representation won't be removed. + :type representation: ifcopenshell.entity_instance + :return: None + :rtype: None + """ + settings = {"representation": representation} - def execute(self) -> None: - styled_items = set() - presentation_layer_assignments = set() - textures = set() - colours = set() - for subelement in self.file.traverse(self.settings["representation"]): - if subelement.is_a("IfcRepresentationItem"): - [styled_items.add(s) for s in subelement.StyledByItem or []] - # IFC2X3 is using LayerAssignments - for s in ( - subelement.LayerAssignment - if hasattr(subelement, "LayerAssignment") - else subelement.LayerAssignments - ): - presentation_layer_assignments.add(s) - # IfcTessellatedFaceSet inverses - [textures.add(t) for t in getattr(subelement, "HasTextures", []) or []] - [colours.add(t) for t in getattr(subelement, "HasColours", []) or []] - elif subelement.is_a("IfcRepresentation"): - for layer in subelement.LayerAssignments: - presentation_layer_assignments.add(layer) + styled_items = set() + presentation_layer_assignments = set() + textures = set() + colours = set() + for subelement in file.traverse(settings["representation"]): + if subelement.is_a("IfcRepresentationItem"): + [styled_items.add(s) for s in subelement.StyledByItem or []] + # IFC2X3 is using LayerAssignments + for s in ( + subelement.LayerAssignment if hasattr(subelement, "LayerAssignment") else subelement.LayerAssignments + ): + presentation_layer_assignments.add(s) + # IfcTessellatedFaceSet inverses + [textures.add(t) for t in getattr(subelement, "HasTextures", []) or []] + [colours.add(t) for t in getattr(subelement, "HasColours", []) or []] + elif subelement.is_a("IfcRepresentation"): + for layer in subelement.LayerAssignments: + presentation_layer_assignments.add(layer) - ifcopenshell.util.element.remove_deep2( - self.file, - self.settings["representation"], - also_consider=list(styled_items | presentation_layer_assignments | colours), - do_not_delete=self.file.by_type("IfcGeometricRepresentationContext"), - ) + ifcopenshell.util.element.remove_deep2( + file, + settings["representation"], + also_consider=list(styled_items | presentation_layer_assignments | colours), + do_not_delete=file.by_type("IfcGeometricRepresentationContext"), + ) - for texture in textures: - ifcopenshell.util.element.remove_deep2(self.file, texture) - for colour in colours: - ifcopenshell.util.element.remove_deep2(self.file, colour) + for texture in textures: + ifcopenshell.util.element.remove_deep2(file, texture) + for colour in colours: + ifcopenshell.util.element.remove_deep2(file, colour) - to_delete = getattr(self.file, "to_delete", ()) - for element in styled_items: - if not element.Item or element.Item in to_delete: - self.file.remove(element) - for element in presentation_layer_assignments: - if all(item in to_delete for item in element.AssignedItems): - self.file.remove(element) + to_delete = getattr(file, "to_delete", ()) + for element in styled_items: + if not element.Item or element.Item in to_delete: + file.remove(element) + for element in presentation_layer_assignments: + if all(item in to_delete for item in element.AssignedItems): + file.remove(element) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py index 389aad88d6..83b1570ac6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py @@ -20,13 +20,16 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, **settings): - self.file = file - self.settings = {"product": None, "representation": None} - for key, value in settings.items(): - self.settings[key] = value +def unassign_representation(file, **usecase_settings) -> None: + usecase = Usecase() + usecase.file = file + usecase.settings = {"product": None, "representation": None} + for key, value in usecase_settings.items(): + usecase.settings[key] = value + return usecase.execute() + +class Usecase: def execute(self): if self.settings["product"].is_a("IfcProduct"): self.unassign_product_representation(self.settings["product"], self.settings["representation"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py index e0caddbe3c..1aa858db17 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_georeferencing import add_georeferencing +from .edit_georeferencing import edit_georeferencing +from .remove_georeferencing import remove_georeferencing diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py index a957970a91..5da8819e47 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py @@ -17,48 +17,45 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file): - """Add empty georeferencing entities to a model +def add_georeferencing(file) -> None: + """Add empty georeferencing entities to a model - By default, models are not georeferenced. Georeferencing requires two - entities: a definition of the projected coordinated reference system - (CRS) used, and the transformation parameters between any local coordinate - system and that projected CRS if any. + By default, models are not georeferenced. Georeferencing requires two + entities: a definition of the projected coordinated reference system + (CRS) used, and the transformation parameters between any local coordinate + system and that projected CRS if any. - This function will create the entities to store the projected CRS and - map conversion transformation, but will leave all the parameters blank. - It is this the users responsibility to specify the correct - georeferencing parameters. See - ifcopenshell.api.georeference.edit_georeferencing. + This function will create the entities to store the projected CRS and + map conversion transformation, but will leave all the parameters blank. + It is this the users responsibility to specify the correct + georeferencing parameters. See + ifcopenshell.api.georeference.edit_georeferencing. - :return: None - :rtype: None + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - ifcopenshell.api.run("georeference.add_georeferencing", model) - """ - self.file = file + ifcopenshell.api.run("georeference.add_georeferencing", model) + """ - def execute(self): - source_crs = None - for context in self.file.by_type("IfcGeometricRepresentationContext", include_subtypes=False): - if context.ContextType == "Model": - source_crs = context - break - if not source_crs: - return - projected_crs = self.file.create_entity("IfcProjectedCRS", **{"Name": ""}) - self.file.create_entity( - "IfcMapConversion", - **{ - "SourceCRS": source_crs, - "TargetCRS": projected_crs, - "Eastings": 0, - "Northings": 0, - "OrthogonalHeight": 0, - } - ) + source_crs = None + for context in file.by_type("IfcGeometricRepresentationContext", include_subtypes=False): + if context.ContextType == "Model": + source_crs = context + break + if not source_crs: + return + projected_crs = file.create_entity("IfcProjectedCRS", **{"Name": ""}) + file.create_entity( + "IfcMapConversion", + **{ + "SourceCRS": source_crs, + "TargetCRS": projected_crs, + "Eastings": 0, + "Northings": 0, + "OrthogonalHeight": 0, + } + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py index 77554e1f7f..f4118d96e1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py @@ -17,77 +17,80 @@ # along with IfcOpenShell. If not, see . +def edit_georeferencing(file, map_conversion=None, projected_crs=None, true_north=None) -> None: + """Edits the attributes of a map conversion, projected CRS, and true north + + Setting the correct georeferencing parameters is a complex topic and + should ideally be done with three parties present: the lead architect, + surveyor, and a third-party digital engineer with expertise in IFC to + moderate. For more information, read the BlenderBIM Add-on documentation + for Georeferencing: + https://docs.blenderbim.org/users/georeferencing.html + + For more information about the attributes and data types of an + IfcMapConversion, consult the IFC documentation. + + For more information about the attributes and data types of an + IfcProjectedCRS, consult the IFC documentation. + + True north is defined as a unitised 2D vector pointing to true north. + Note that true north is not part of georeferencing, and is only + optionally provided as a reference value, typically for solar analysis. + + See ifcopenshell.util.geolocation for more utilities to convert to and + from local and map coordinates to check your results. + + :param map_conversion: The IfcMapConversion dictionary of attribute + names and values you want to edit. + :type map_conversion: dict, optional + :param projected_crs: The IfcProjectedCRS dictionary of attribute + names and values you want to edit. + :type projected_crs: dict, optional + :param true_north: A unitised 2D vector, where each ordinate is a float + :type true_north: list[float] + :return: None + :rtype: None + + Example: + + .. code:: python + + ifcopenshell.api.run("georeference.add_georeferencing", model) + # This is the simplest scenario, a defined CRS (GDA2020 / MGA Zone + # 56, typically used in Sydney, Australia) but with no local + # coordinates. This is only recommended for horizontal construction + # projects, not for vertical construction (such as buildings). + ifcopenshell.api.run("georeference.edit_georeferencing", model, + projected_crs={"Name": "EPSG:7856"}) + + # For buildings, it is almost always recommended to specify map + # conversion parameters to a false origin and orientation to project + # north. See the diagram in the BlenderBIM Add-on Georeferencing + # documentation for correct calculation of the X Axis Abcissa and + # Ordinate. + ifcopenshell.api.run("georeference.edit_georeferencing", model, + projected_crs={"Name": "EPSG:7856"}, + map_conversion={ + "Eastings": 335087.17, # The architect nominates a false origin + "Northings": 6251635.41, # The architect nominates a false origin + # Note: this is the angle difference between Project North + # and Grid North. Remember: True North should never be used! + "XAxisAbscissa": cos(radians(-30)), # The architect nominates a project north + "XAxisOrdinate": sin(radians(-30)), # The architect nominates a project north + "Scale": 0.99956, # Ask your surveyor for your site's average combined scale factor! + }) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "map_conversion": map_conversion or {}, + "projected_crs": projected_crs or {}, + "true_north": true_north or [], + } + return usecase.execute() + + class Usecase: - def __init__(self, file, map_conversion=None, projected_crs=None, true_north=None): - """Edits the attributes of a map conversion, projected CRS, and true north - - Setting the correct georeferencing parameters is a complex topic and - should ideally be done with three parties present: the lead architect, - surveyor, and a third-party digital engineer with expertise in IFC to - moderate. For more information, read the BlenderBIM Add-on documentation - for Georeferencing: - https://docs.blenderbim.org/users/georeferencing.html - - For more information about the attributes and data types of an - IfcMapConversion, consult the IFC documentation. - - For more information about the attributes and data types of an - IfcProjectedCRS, consult the IFC documentation. - - True north is defined as a unitised 2D vector pointing to true north. - Note that true north is not part of georeferencing, and is only - optionally provided as a reference value, typically for solar analysis. - - See ifcopenshell.util.geolocation for more utilities to convert to and - from local and map coordinates to check your results. - - :param map_conversion: The IfcMapConversion dictionary of attribute - names and values you want to edit. - :type map_conversion: dict, optional - :param projected_crs: The IfcProjectedCRS dictionary of attribute - names and values you want to edit. - :type projected_crs: dict, optional - :param true_north: A unitised 2D vector, where each ordinate is a float - :type true_north: list[float] - :return: None - :rtype: None - - Example: - - .. code:: python - - ifcopenshell.api.run("georeference.add_georeferencing", model) - # This is the simplest scenario, a defined CRS (GDA2020 / MGA Zone - # 56, typically used in Sydney, Australia) but with no local - # coordinates. This is only recommended for horizontal construction - # projects, not for vertical construction (such as buildings). - ifcopenshell.api.run("georeference.edit_georeferencing", model, - projected_crs={"Name": "EPSG:7856"}) - - # For buildings, it is almost always recommended to specify map - # conversion parameters to a false origin and orientation to project - # north. See the diagram in the BlenderBIM Add-on Georeferencing - # documentation for correct calculation of the X Axis Abcissa and - # Ordinate. - ifcopenshell.api.run("georeference.edit_georeferencing", model, - projected_crs={"Name": "EPSG:7856"}, - map_conversion={ - "Eastings": 335087.17, # The architect nominates a false origin - "Northings": 6251635.41, # The architect nominates a false origin - # Note: this is the angle difference between Project North - # and Grid North. Remember: True North should never be used! - "XAxisAbscissa": cos(radians(-30)), # The architect nominates a project north - "XAxisOrdinate": sin(radians(-30)), # The architect nominates a project north - "Scale": 0.99956, # Ask your surveyor for your site's average combined scale factor! - }) - """ - self.file = file - self.settings = { - "map_conversion": map_conversion or {}, - "projected_crs": projected_crs or {}, - "true_north": true_north or [], - } - def execute(self): map_conversion = self.file.by_type("IfcMapConversion")[0] projected_crs = self.file.by_type("IfcProjectedCRS")[0] diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py index 2ac32a0c6e..3d3941ed7c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py @@ -17,29 +17,26 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file): - """Remove georeferencing data +def remove_georeferencing(file) -> None: + """Remove georeferencing data - All georeferencing parameters such as projected CRS and map conversion - data will be lost. + All georeferencing parameters such as projected CRS and map conversion + data will be lost. - :return: None - :rtype: None + :return: None + :rtype: None - Example: + Example: - ifcopenshell.api.run("georeference.add_georeferencing", model) - # Let's change our mind - ifcopenshell.api.run("georeference.remove_georeferencing", model) - """ - self.file = file + ifcopenshell.api.run("georeference.add_georeferencing", model) + # Let's change our mind + ifcopenshell.api.run("georeference.remove_georeferencing", model) + """ - def execute(self): - map_conversion = self.file.by_type("IfcMapConversion")[0] - projected_crs = self.file.by_type("IfcProjectedCRS")[0] - if projected_crs.MapUnit and len(self.file.get_inverse(projected_crs.MapUnit)) == 1: - # TODO: go deeper for conversion units - self.file.remove(projected_crs.MapUnit) - self.file.remove(projected_crs) - self.file.remove(map_conversion) + map_conversion = file.by_type("IfcMapConversion")[0] + projected_crs = file.by_type("IfcProjectedCRS")[0] + if projected_crs.MapUnit and len(file.get_inverse(projected_crs.MapUnit)) == 1: + # TODO: go deeper for conversion units + file.remove(projected_crs.MapUnit) + file.remove(projected_crs) + file.remove(map_conversion) diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py index e0caddbe3c..c66e86a668 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .create_axis_curve import create_axis_curve +from .create_grid_axis import create_grid_axis +from .remove_grid_axis import remove_grid_axis diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py b/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py index 21fead74e5..2f3520c662 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py @@ -22,46 +22,49 @@ import ifcopenshell.util.placement from mathutils import Matrix # For now, we depend on Blender +def create_axis_curve(file, axis_curve=None, grid_axis=None) -> None: + """Adds curve geometry to a grid axis to represent the axis extents + + This currently depends on the Blender geometry kernel to function. + + An IFC grid will have a minimum of two axes (typically perpendicular). Each + axis will then have a line which represents the extents of the axis. + + :param axis_curve: The Blender object that contains a mesh data block with a + single edge. + :type axis_curve: bpy.types.Object + :param grid_axis: The IfcGridAxis element to add geometry to. + :type grid_axis: ifcopenshell.entity_instance + :return: None + :rtype: None + + Example: + + .. code:: python + + # A pretty standard rectangular grid, with only two axes. + grid = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcGrid") + axis_a = ifcopenshell.api.run("grid.create_grid_axis", model, + axis_tag="A", uvw_axes="UAxes", grid=grid) + axis_1 = ifcopenshell.api.run("grid.create_grid_axis", model, + axis_tag="1", uvw_axes="VAxes", grid=grid) + + # Assume you have these Blender objects in your active Blender session + obj1 = bpy.data.objects.get("AxisA") + obj2 = bpy.data.objects.get("Axis1") + ifcopenshell.api.run("grid.create_axis_curve", model, axis_curve=obj1, grid_axis=axis_a) + ifcopenshell.api.run("grid.create_axis_curve", model, axis_curve=obj2, grid_axis=axis_1) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "axis_curve": axis_curve, # A Blender object + "grid_axis": grid_axis, + } + return usecase.execute() + + class Usecase: - def __init__(self, file, axis_curve=None, grid_axis=None): - """Adds curve geometry to a grid axis to represent the axis extents - - This currently depends on the Blender geometry kernel to function. - - An IFC grid will have a minimum of two axes (typically perpendicular). Each - axis will then have a line which represents the extents of the axis. - - :param axis_curve: The Blender object that contains a mesh data block with a - single edge. - :type axis_curve: bpy.types.Object - :param grid_axis: The IfcGridAxis element to add geometry to. - :type grid_axis: ifcopenshell.entity_instance - :return: None - :rtype: None - - Example: - - .. code:: python - - # A pretty standard rectangular grid, with only two axes. - grid = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcGrid") - axis_a = ifcopenshell.api.run("grid.create_grid_axis", model, - axis_tag="A", uvw_axes="UAxes", grid=grid) - axis_1 = ifcopenshell.api.run("grid.create_grid_axis", model, - axis_tag="1", uvw_axes="VAxes", grid=grid) - - # Assume you have these Blender objects in your active Blender session - obj1 = bpy.data.objects.get("AxisA") - obj2 = bpy.data.objects.get("Axis1") - ifcopenshell.api.run("grid.create_axis_curve", model, axis_curve=obj1, grid_axis=axis_a) - ifcopenshell.api.run("grid.create_axis_curve", model, axis_curve=obj2, grid_axis=axis_1) - """ - self.file = file - self.settings = { - "axis_curve": axis_curve, # A Blender object - "grid_axis": grid_axis, - } - def execute(self): existing_curve = self.settings["grid_axis"].AxisCurve if existing_curve and len(self.file.get_inverse(existing_curve)) == 1: diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py b/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py index de667bb5bc..f089b43b98 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py @@ -17,69 +17,66 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, axis_tag=None, same_sense=None, uvw_axes=None, grid=None): - """Adds a new grid axis to a grid +def create_grid_axis(file, axis_tag=None, same_sense=None, uvw_axes=None, grid=None) -> None: + """Adds a new grid axis to a grid - An IFC grid will typically have a minimum of two axes which will be - perpendicular to one another. Grids may be rectangular (typically - perpendicular lines), radial (where one set of axes is a circle and the - other is a line), or triangular (three sets of axes, each at a different - angle to one another). + An IFC grid will typically have a minimum of two axes which will be + perpendicular to one another. Grids may be rectangular (typically + perpendicular lines), radial (where one set of axes is a circle and the + other is a line), or triangular (three sets of axes, each at a different + angle to one another). - For a simple rectangular grid, the "UAxes" are a set of one or more - horizontal axes, which are typically labeled with the convention of A, - B, C, etc. The "VAxes" is another set of one or more vertical axes, - typically labeled with the convention of 1, 2, 3, etc. These axes are - horizontal or vertical relative to project north. + For a simple rectangular grid, the "UAxes" are a set of one or more + horizontal axes, which are typically labeled with the convention of A, + B, C, etc. The "VAxes" is another set of one or more vertical axes, + typically labeled with the convention of 1, 2, 3, etc. These axes are + horizontal or vertical relative to project north. - For a radial grid, the "UAxes" are straight lines, typically radiating - from a central point. The "VAxes" are circular perimeters, with the - center of these circles being the same central point. + For a radial grid, the "UAxes" are straight lines, typically radiating + from a central point. The "VAxes" are circular perimeters, with the + center of these circles being the same central point. - For a triangular grid, the UAxes, VAxes, and WAxes are all sets of one - or more straight lines. + For a triangular grid, the UAxes, VAxes, and WAxes are all sets of one + or more straight lines. - :param axis_tag: The name of the axis, that would typically be labeled - on drawings or described on site during coordination, such as A, B, - C, 1, 2, 3, etc. Defaults to "A". - :type axis_tag: str, optional - :param same_sense: Determines whether the direction of the axis's line - is reversed. True means the direction the geometry is defined in - represents the direction of the axis. False means the direction is - reversed. Leave as True if unsure. Defaults to "True". - :type same_sense: bool, optional - :param uvw_axes: Choose from "UAxes", "VAxes" or "WAxes" depending on - which set of axes the new axis you are adding should belong to. - Defaults to "UAxes". - :type uvw_axes: str, optional - :param grid: The IfcGrid you are adding the axis to. - :type grid: ifcopenshell.entity_instance - :return: The newly created IfcGridAxis - :rtype: ifcopenshell.entity_instance + :param axis_tag: The name of the axis, that would typically be labeled + on drawings or described on site during coordination, such as A, B, + C, 1, 2, 3, etc. Defaults to "A". + :type axis_tag: str, optional + :param same_sense: Determines whether the direction of the axis's line + is reversed. True means the direction the geometry is defined in + represents the direction of the axis. False means the direction is + reversed. Leave as True if unsure. Defaults to "True". + :type same_sense: bool, optional + :param uvw_axes: Choose from "UAxes", "VAxes" or "WAxes" depending on + which set of axes the new axis you are adding should belong to. + Defaults to "UAxes". + :type uvw_axes: str, optional + :param grid: The IfcGrid you are adding the axis to. + :type grid: ifcopenshell.entity_instance + :return: The newly created IfcGridAxis + :rtype: ifcopenshell.entity_instance - Example: + Example: - # A pretty standard rectangular grid, with only two axes. - grid = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcGrid") - axis_a = ifcopenshell.api.run("grid.create_grid_axis", model, - axis_tag="A", uvw_axes="UAxes", grid=grid) - axis_1 = ifcopenshell.api.run("grid.create_grid_axis", model, - axis_tag="1", uvw_axes="VAxes", grid=grid) - """ - self.file = file - self.settings = { - "axis_tag": axis_tag or "A", - "same_sense": same_sense or True, - "uvw_axes": uvw_axes or "UAxes", # Choose which axes - "grid": grid, - } + # A pretty standard rectangular grid, with only two axes. + grid = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcGrid") + axis_a = ifcopenshell.api.run("grid.create_grid_axis", model, + axis_tag="A", uvw_axes="UAxes", grid=grid) + axis_1 = ifcopenshell.api.run("grid.create_grid_axis", model, + axis_tag="1", uvw_axes="VAxes", grid=grid) + """ + settings = { + "axis_tag": axis_tag or "A", + "same_sense": same_sense or True, + "uvw_axes": uvw_axes or "UAxes", # Choose which axes + "grid": grid, + } - def execute(self): - element = self.file.create_entity( - "IfcGridAxis", **{"AxisTag": self.settings["axis_tag"], "SameSense": self.settings["same_sense"]} - ) - axes = list(getattr(self.settings["grid"], self.settings["uvw_axes"]) or []) - axes.append(element) - setattr(self.settings["grid"], self.settings["uvw_axes"], axes) - return element + element = file.create_entity( + "IfcGridAxis", **{"AxisTag": settings["axis_tag"], "SameSense": settings["same_sense"]} + ) + axes = list(getattr(settings["grid"], settings["uvw_axes"]) or []) + axes.append(element) + setattr(settings["grid"], settings["uvw_axes"], axes) + return element diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py b/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py index b380778a67..51032ed52f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py @@ -19,36 +19,33 @@ import ifcopenshell.util.element -class Usecase: - def __init__(self, file, axis=None): - """Removes a grid axis from a grid +def remove_grid_axis(file, axis=None) -> None: + """Removes a grid axis from a grid - :param axis: The IfcGridAxis you want to remove. - :type axis: ifcopenshell.entity_instance - :return: None - :rtype: None + :param axis: The IfcGridAxis you want to remove. + :type axis: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - # A pretty standard rectangular grid, with only two axes. - grid = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcGrid") - axis_a = ifcopenshell.api.run("grid.create_grid_axis", model, - axis_tag="A", uvw_axes="UAxes", grid=grid) - axis_1 = ifcopenshell.api.run("grid.create_grid_axis", model, - axis_tag="1", uvw_axes="VAxes", grid=grid) + # A pretty standard rectangular grid, with only two axes. + grid = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcGrid") + axis_a = ifcopenshell.api.run("grid.create_grid_axis", model, + axis_tag="A", uvw_axes="UAxes", grid=grid) + axis_1 = ifcopenshell.api.run("grid.create_grid_axis", model, + axis_tag="1", uvw_axes="VAxes", grid=grid) - # Let's create a third so we can remove it later - axis_2 = ifcopenshell.api.run("grid.create_grid_axis", model, - axis_tag="2", uvw_axes="VAxes", grid=grid) + # Let's create a third so we can remove it later + axis_2 = ifcopenshell.api.run("grid.create_grid_axis", model, + axis_tag="2", uvw_axes="VAxes", grid=grid) - # Let's remove it! - ifcopenshell.api.run("grid.remove_grid_axis", model, axis=axis_2) - """ - self.file = file - self.settings = {"axis": axis} + # Let's remove it! + ifcopenshell.api.run("grid.remove_grid_axis", model, axis=axis_2) + """ + settings = {"axis": axis} - def execute(self): - if len(self.file.get_inverse(self.settings["axis"].AxisCurve)) == 1: - ifcopenshell.util.element.remove_deep(self.file, self.settings["axis"].AxisCurve) - self.file.remove(self.settings["axis"].AxisCurve) - self.file.remove(self.settings["axis"]) + if len(file.get_inverse(settings["axis"].AxisCurve)) == 1: + ifcopenshell.util.element.remove_deep(file, settings["axis"].AxisCurve) + file.remove(settings["axis"].AxisCurve) + file.remove(settings["axis"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py index e0caddbe3c..5b729b0dfc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py @@ -15,3 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_group import add_group +from .assign_group import assign_group +from .edit_group import edit_group +from .remove_group import remove_group +from .unassign_group import unassign_group +from .update_group_products import update_group_products diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py index 298ec42ba6..1d576f7173 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py @@ -20,44 +20,41 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, Name="Unnamed", Description=None): - """Adds a new group +def add_group(file, Name="Unnamed", Description=None) -> None: + """Adds a new group - An IFC group is an arbitrary collection of products, which are typically - physical. It may be used when there is no other more specific group - which may be used. Other types of groups include distribution systems, - which group together products that are connected and circulate a medium - (such as fluid or electricity), or zones, which group together spaces, - or structural load groups, which group together loads for structural - analysis, or inventories, which are groups of assets. + An IFC group is an arbitrary collection of products, which are typically + physical. It may be used when there is no other more specific group + which may be used. Other types of groups include distribution systems, + which group together products that are connected and circulate a medium + (such as fluid or electricity), or zones, which group together spaces, + or structural load groups, which group together loads for structural + analysis, or inventories, which are groups of assets. - :param Name: The name of the group. Defaults to "Unnamed" - :type Name: str, optional - :param Description: The description of the purpose of the group. - :type Description: str, optional - :return: The newly created IfcGroup - :rtype: ifcopenshell.entity_instance + :param Name: The name of the group. Defaults to "Unnamed" + :type Name: str, optional + :param Description: The description of the purpose of the group. + :type Description: str, optional + :return: The newly created IfcGroup + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - ifcopenshell.api.run("group.add_group", model, Name="Unit 1A") - """ - self.file = file - self.settings = { - "Name": Name or "Unnamed", - "Description": Description, + ifcopenshell.api.run("group.add_group", model, Name="Unit 1A") + """ + settings = { + "Name": Name or "Unnamed", + "Description": Description, + } + + return file.create_entity( + "IfcGroup", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "Name": settings["Name"], + "Description": settings["Description"], } - - def execute(self): - return self.file.create_entity( - "IfcGroup", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "Name": self.settings["Name"], - "Description": self.settings["Description"], - } - ) + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py index d312a95bd6..c5afd5b9b0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py @@ -21,56 +21,53 @@ import ifcopenshell.api from typing import Union -class Usecase: - def __init__( - self, file: ifcopenshell.file, products: list[ifcopenshell.entity_instance], group: ifcopenshell.entity_instance - ): - """Assigns products to a group +def assign_group( + file: ifcopenshell.file, products: list[ifcopenshell.entity_instance], group: ifcopenshell.entity_instance +) -> Union[ifcopenshell.entity_instance, None]: + """Assigns products to a group - If a product is already assigned to the group, it will not be assigned - twice. + If a product is already assigned to the group, it will not be assigned + twice. - :param products: A list of IfcProduct elements to assign to the group - :type products: list[ifcopenshell.entity_instance] - :param group: The IfcGroup to assign the products to - :type group: ifcopenshell.entity_instance - :return: The IfcRelAssignsToGroup relationship - or `None` if `products` was empty list. - :rtype: Union[ifcopenshell.entity_instance, None] + :param products: A list of IfcProduct elements to assign to the group + :type products: list[ifcopenshell.entity_instance] + :param group: The IfcGroup to assign the products to + :type group: ifcopenshell.entity_instance + :return: The IfcRelAssignsToGroup relationship + or `None` if `products` was empty list. + :rtype: Union[ifcopenshell.entity_instance, None] - Example: + Example: - .. code:: python + .. code:: python - group = ifcopenshell.api.run("group.add_group", model, Name="Furniture") - ifcopenshell.api.run("group.assign_group", model, - products=model.by_type("IfcFurniture"), group=group) - """ - self.file = file - self.settings = { - "products": products, - "group": group, - } + group = ifcopenshell.api.run("group.add_group", model, Name="Furniture") + ifcopenshell.api.run("group.assign_group", model, + products=model.by_type("IfcFurniture"), group=group) + """ + settings = { + "products": products, + "group": group, + } - def execute(self) -> Union[ifcopenshell.entity_instance, None]: - if not self.settings["products"]: - return + if not settings["products"]: + return - if not self.settings["group"].IsGroupedBy: - return self.file.create_entity( - "IfcRelAssignsToGroup", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": self.settings["products"], - "RelatingGroup": self.settings["group"], - } - ) - rel = self.settings["group"].IsGroupedBy[0] - related_objects = set(rel.RelatedObjects) or set() - products = set(self.settings["products"]) - if products.issubset(related_objects): - return rel - rel.RelatedObjects = list(related_objects | products) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) + if not settings["group"].IsGroupedBy: + return file.create_entity( + "IfcRelAssignsToGroup", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": settings["products"], + "RelatingGroup": settings["group"], + } + ) + rel = settings["group"].IsGroupedBy[0] + related_objects = set(rel.RelatedObjects) or set() + products = set(settings["products"]) + if products.issubset(related_objects): return rel + rel.RelatedObjects = list(related_objects | products) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py index 87fa9dcf12..1eb0c8d6f4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py @@ -17,31 +17,28 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, group=None, attributes=None): - """Edits the attributes of an IfcGroup +def edit_group(file, group=None, attributes=None) -> None: + """Edits the attributes of an IfcGroup - For more information about the attributes and data types of an - IfcGroup, consult the IFC documentation. + For more information about the attributes and data types of an + IfcGroup, consult the IFC documentation. - :param group: The IfcGroup entity you want to edit - :type group: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param group: The IfcGroup entity you want to edit + :type group: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - group = ifcopenshell.api.run("group.add_group", model, Name="Unit 1A") - ifcopenshell.api.run("group.edit_group", model, - group=group, attributes={"Description": "All furniture and joinery included in the unit"}) - """ - self.file = file - self.settings = {"group": group, "attributes": attributes or {}} + group = ifcopenshell.api.run("group.add_group", model, Name="Unit 1A") + ifcopenshell.api.run("group.edit_group", model, + group=group, attributes={"Description": "All furniture and joinery included in the unit"}) + """ + settings = {"group": group, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["group"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["group"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py index c87b36e316..05e85f3fc0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py @@ -21,53 +21,50 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, group=None): - """Removes a group +def remove_group(file, group=None) -> None: + """Removes a group - All products assigned to the group will remain, but the relationship to - the group will be removed. + All products assigned to the group will remain, but the relationship to + the group will be removed. - :param group: The IfcGroup entity you want to remove - :type group: ifcopenshell.entity_instance - :return: None - :rtype: None + :param group: The IfcGroup entity you want to remove + :type group: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - group = ifcopenshell.api.run("group.add_group", model, Name="Unit 1A") - ifcopenshell.api.run("group.remove_group", model, group=group) - """ - self.file = file - self.settings = {"group": group} + group = ifcopenshell.api.run("group.add_group", model, Name="Unit 1A") + ifcopenshell.api.run("group.remove_group", model, group=group) + """ + settings = {"group": group} - def execute(self): - for inverse_id in [i.id() for i in self.file.get_inverse(self.settings["group"])]: - try: - inverse = self.file.by_id(inverse_id) - except: - continue - if inverse.is_a("IfcRelDefinesByProperties"): - ifcopenshell.api.run( - "pset.remove_pset", - self.file, - product=self.settings["group"], - pset=inverse.RelatingPropertyDefinition, - ) - elif inverse.is_a("IfcRelAssignsToGroup"): - if inverse.RelatingGroup == self.settings["group"]: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - history = self.settings["group"].OwnerHistory - self.file.remove(self.settings["group"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + for inverse_id in [i.id() for i in file.get_inverse(settings["group"])]: + try: + inverse = file.by_id(inverse_id) + except: + continue + if inverse.is_a("IfcRelDefinesByProperties"): + ifcopenshell.api.run( + "pset.remove_pset", + file, + product=settings["group"], + pset=inverse.RelatingPropertyDefinition, + ) + elif inverse.is_a("IfcRelAssignsToGroup"): + if inverse.RelatingGroup == settings["group"]: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif len(inverse.RelatedObjects) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + history = settings["group"].OwnerHistory + file.remove(settings["group"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py index 9229281a69..c486cceab6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py @@ -21,48 +21,47 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file: ifcopenshell.file, products: list[ifcopenshell.entity_instance], group: ifcopenshell.entity_instance): - """Unassigns products from a group +def unassign_group( + file: ifcopenshell.file, products: list[ifcopenshell.entity_instance], group: ifcopenshell.entity_instance +) -> None: + """Unassigns products from a group - If the product isn't assigned to the group, nothing will happen. + If the product isn't assigned to the group, nothing will happen. - :param products: A list of IfcProduct elements to unassign from the group - :type products: list[ifcopenshell.entity_instance] - :param group: The IfcGroup to unassign from - :type group: ifcopenshell.entity_instance - :return: None - :rtype: None + :param products: A list of IfcProduct elements to unassign from the group + :type products: list[ifcopenshell.entity_instance] + :param group: The IfcGroup to unassign from + :type group: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - group = ifcopenshell.api.run("group.add_group", model, Name="Furniture") - furniture = model.by_type("IfcFurniture") - ifcopenshell.api.run("group.assign_group", model, products=furniture, group=group) + group = ifcopenshell.api.run("group.add_group", model, Name="Furniture") + furniture = model.by_type("IfcFurniture") + ifcopenshell.api.run("group.assign_group", model, products=furniture, group=group) - bad_furniture = furniture[0] - ifcopenshell.api.run("group.unassign_group", model, products=[bad_furniture], group=group) - """ - self.file = file - self.settings = { - "products": products, - "group": group, - } + bad_furniture = furniture[0] + ifcopenshell.api.run("group.unassign_group", model, products=[bad_furniture], group=group) + """ + settings = { + "products": products, + "group": group, + } - def execute(self) -> None: - if not self.settings["group"].IsGroupedBy: - return - rel = self.settings["group"].IsGroupedBy[0] - related_objects = set(rel.RelatedObjects) or set() - products = set(self.settings["products"]) - related_objects -= products - if related_objects: - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + if not settings["group"].IsGroupedBy: + return + rel = settings["group"].IsGroupedBy[0] + related_objects = set(rel.RelatedObjects) or set() + products = set(settings["products"]) + related_objects -= products + if related_objects: + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + else: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py index 61b96c2ba6..f526666fa2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py @@ -20,51 +20,48 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, group=None, products=None): - """Sets a group products to be an explicit list of products +def update_group_products(file, group=None, products=None) -> None: + """Sets a group products to be an explicit list of products - Any previous products assigned to that group will have their assignment - removed. + Any previous products assigned to that group will have their assignment + removed. - :param products: A list of IfcProduct elements to assign to the group - :type products: list[ifcopenshell.entity_instance] - :param group: The IfcGroup to assign the products to - :type group: ifcopenshell.entity_instance - :return: The IfcRelAssignsToGroup relationship - :rtype: ifcopenshell.entity_instance + :param products: A list of IfcProduct elements to assign to the group + :type products: list[ifcopenshell.entity_instance] + :param group: The IfcGroup to assign the products to + :type group: ifcopenshell.entity_instance + :return: The IfcRelAssignsToGroup relationship + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - group = ifcopenshell.api.run("group.add_group", model, Name="Furniture") - ifcopenshell.api.run("group.update_group_products", model, - products=model.by_type("IfcFurniture"), group=group) - """ - self.file = file - self.settings = { - "group": group, - "products": products, - } + group = ifcopenshell.api.run("group.add_group", model, Name="Furniture") + ifcopenshell.api.run("group.update_group_products", model, + products=model.by_type("IfcFurniture"), group=group) + """ + settings = { + "group": group, + "products": products, + } - def execute(self): - if not self.settings["group"].IsGroupedBy: - return self.file.create_entity( - "IfcRelAssignsToGroup", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": self.settings["products"], - "RelatingGroup": self.settings["group"], - } - ) - else: - # assumes 1:1 cardinality, will need to be updated to reflect IFC4 changes - # where the cardinality is 0:? - vulevukusej - rel = self.settings["group"].IsGroupedBy[0] - existing_sub_groups = [g for g in rel.RelatedObjects if g.is_a("IfcGroup")] + if not settings["group"].IsGroupedBy: + return file.create_entity( + "IfcRelAssignsToGroup", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": settings["products"], + "RelatingGroup": settings["group"], + } + ) + else: + # assumes 1:1 cardinality, will need to be updated to reflect IFC4 changes + # where the cardinality is 0:? - vulevukusej + rel = settings["group"].IsGroupedBy[0] + existing_sub_groups = [g for g in rel.RelatedObjects if g.is_a("IfcGroup")] - rel.RelatedObjects = self.settings["products"] - for g in existing_sub_groups: - rel.RelatedObjects.add(g) + rel.RelatedObjects = settings["products"] + for g in existing_sub_groups: + rel.RelatedObjects.add(g) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py index e0caddbe3c..03145bf34a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py @@ -15,3 +15,9 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_layer import add_layer +from .assign_layer import assign_layer +from .edit_layer import edit_layer +from .remove_layer import remove_layer +from .unassign_layer import unassign_layer diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py index 8638a76b22..5379ff1b3a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py @@ -17,33 +17,30 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, Name=None): - """Adds a new layer +def add_layer(file, Name=None) -> None: + """Adds a new layer - An IFC layer is like a CAD layer. Portions of an object's geometry - (typically portions of its 2D linework) can be assigned to layers, which - can provide stylistic information such as line weights, colours, or - simply be used for filtering. + An IFC layer is like a CAD layer. Portions of an object's geometry + (typically portions of its 2D linework) can be assigned to layers, which + can provide stylistic information such as line weights, colours, or + simply be used for filtering. - Layers have historically been used to organise CAD data and included in - ISO standards such as ISO 13567 or by the AIA. This alllows IFC data to - be compatible with older, 2D-oriented, layer-based workflows. + Layers have historically been used to organise CAD data and included in + ISO standards such as ISO 13567 or by the AIA. This alllows IFC data to + be compatible with older, 2D-oriented, layer-based workflows. - Some software that are still based on layers, such as Tekla or ArchiCAD - may also use this layer information for filtering. + Some software that are still based on layers, such as Tekla or ArchiCAD + may also use this layer information for filtering. - :param Name: The name of the layer. Defaults to "Unnamed". - :type Name: str, optional - :return: The newly created IfcPresentationLayerAssignment element - :rtype: ifcopenshell.entity_instance + :param Name: The name of the layer. Defaults to "Unnamed". + :type Name: str, optional + :return: The newly created IfcPresentationLayerAssignment element + :rtype: ifcopenshell.entity_instance - Example: + Example: - ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL-FULL-DIMS-N") - """ - self.file = file - self.settings = {"Name": Name or "Unnamed"} + ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL-FULL-DIMS-N") + """ + settings = {"Name": Name or "Unnamed"} - def execute(self): - return self.file.create_entity("IfcPresentationLayerAssignment", Name=self.settings["Name"]) + return file.create_entity("IfcPresentationLayerAssignment", Name=settings["Name"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py index 93a863d66f..70926625c3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py @@ -19,64 +19,61 @@ import ifcopenshell -class Usecase: - def __init__( - self, file: ifcopenshell.file, items: list[ifcopenshell.entity_instance], layer: ifcopenshell.entity_instance - ): - """Assigns representation items to a layer +def assign_layer( + file: ifcopenshell.file, items: list[ifcopenshell.entity_instance], layer: ifcopenshell.entity_instance +) -> None: + """Assigns representation items to a layer - In IFC, instead of objects being assigned to layers, representation - items are assigned to layers. Representation items are portions of the - object's representation. For example, this allows a single IFC Window - element to have portions of its 2D linework (e.g. the cross section of - its frame) assigned to one layer, and another portion (e.g. the glazing - panels) assigned to another layer. + In IFC, instead of objects being assigned to layers, representation + items are assigned to layers. Representation items are portions of the + object's representation. For example, this allows a single IFC Window + element to have portions of its 2D linework (e.g. the cross section of + its frame) assigned to one layer, and another portion (e.g. the glazing + panels) assigned to another layer. - :param items: The list of IfcRepresentationItems to assign to the layer. This - should be the items from the object's IfcShapeRepresentation. - :type items: list[ifcopenshell.entity_instance] - :param layer: The IfcPresentationLayerAssignment layer to assign the - item to. - :type layer: ifcopenshell.entity_instance - :return: None - :rtype: None + :param items: The list of IfcRepresentationItems to assign to the layer. This + should be the items from the object's IfcShapeRepresentation. + :type items: list[ifcopenshell.entity_instance] + :param layer: The IfcPresentationLayerAssignment layer to assign the + item to. + :type layer: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Remember, all geometry needs to specify the context it is part of first. - # See ifcopenshell.api.context.add_context for details. - model = ifcopenshell.api.run("context.add_context", model, context_type="Model") - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model - ) + # Remember, all geometry needs to specify the context it is part of first. + # See ifcopenshell.api.context.add_context for details. + model = ifcopenshell.api.run("context.add_context", model, context_type="Model") + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model + ) - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=5, height=3, thickness=0.2) - ifcopenshell.api.run("geometry.assign_representation", model, - product=wall, representation=representation) - ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.run("geometry.assign_representation", model, + product=wall, representation=representation) + ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) - # Now let's create a layer that contains walls - layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") + # Now let's create a layer that contains walls + layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") - # And assign our wall representation item (in this example, there is - # only one item) to the layer. - ifcopenshell.api.run("layer.assign_layer", model, items=[representation.Items[0]], layer=layer) - """ - self.file = file - self.settings = { - "items": items, - "layer": layer, - } + # And assign our wall representation item (in this example, there is + # only one item) to the layer. + ifcopenshell.api.run("layer.assign_layer", model, items=[representation.Items[0]], layer=layer) + """ + settings = { + "items": items, + "layer": layer, + } - def execute(self) -> None: - # support AssignedItems == None since layer might just got created - layer = self.settings["layer"] - assigned_items = set(layer.AssignedItems or []) - items = set(self.settings["items"]) - if items.issubset(assigned_items): - return - layer.AssignedItems = list(assigned_items | items) + # support AssignedItems == None since layer might just got created + layer = settings["layer"] + assigned_items = set(layer.AssignedItems or []) + items = set(settings["items"]) + if items.issubset(assigned_items): + return + layer.AssignedItems = list(assigned_items | items) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py index c2b1cbc99a..9d96156cfc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py @@ -17,31 +17,28 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, layer=None, attributes=None): - """Edits the attributes of an IfcPresentationLayerAssignment +def edit_layer(file, layer=None, attributes=None) -> None: + """Edits the attributes of an IfcPresentationLayerAssignment - For more information about the attributes and data types of an - IfcPresentationLayerAssignment, consult the IFC documentation. + For more information about the attributes and data types of an + IfcPresentationLayerAssignment, consult the IFC documentation. - :param layer: The IfcPresentationLayerAssignment entity you want to edit - :type layer: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param layer: The IfcPresentationLayerAssignment entity you want to edit + :type layer: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") - ifcopenshell.api.run("layer.edit_layer", model, - layer=layer, attributes={"Description": "All walls, based on the AIA standard."}) - """ - self.file = file - self.settings = {"layer": layer, "attributes": attributes or {}} + layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") + ifcopenshell.api.run("layer.edit_layer", model, + layer=layer, attributes={"Description": "All walls, based on the AIA standard."}) + """ + settings = {"layer": layer, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["layer"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["layer"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py index 8e83e475ab..790b396174 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py @@ -17,27 +17,24 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, layer=None): - """Removes a layer +def remove_layer(file, layer=None) -> None: + """Removes a layer - All representation items assigned to the layer will remain, but the - relationship to the layer will be removed. + All representation items assigned to the layer will remain, but the + relationship to the layer will be removed. - :param layer: The IfcPresentationLayerAssignment entity to remove - :type layer: ifcopenshell.entity_instance - :return: None - :rtype: None + :param layer: The IfcPresentationLayerAssignment entity to remove + :type layer: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") - ifcopenshell.api.run("layer.remove_layer", model, layer=layer) - """ - self.file = file - self.settings = {"layer": layer} + layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") + ifcopenshell.api.run("layer.remove_layer", model, layer=layer) + """ + settings = {"layer": layer} - def execute(self): - self.file.remove(self.settings["layer"]) + file.remove(settings["layer"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py index f9d6a024a3..9418a28ad6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py @@ -20,68 +20,65 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__( - self, file: ifcopenshell.file, items: list[ifcopenshell.entity_instance], layer: ifcopenshell.entity_instance - ): - """Unassigns representation items from a layer +def unassign_layer( + file: ifcopenshell.file, items: list[ifcopenshell.entity_instance], layer: ifcopenshell.entity_instance +) -> None: + """Unassigns representation items from a layer - If the representation item isn't assigned to the layer, nothing will - happen. - If after unassignment layer won't have any assigned items it will be - removed to keep IFC valid. + If the representation item isn't assigned to the layer, nothing will + happen. + If after unassignment layer won't have any assigned items it will be + removed to keep IFC valid. - :param items: A list IfcRepresentationItem elements to unassign - :type items: list[ifcopenshell.entity_instance] - :param layer: The IfcPresentationLayerAssignment to unassign from - :type layer: ifcopenshell.entity_instance - :return: None - :rtype: None + :param items: A list IfcRepresentationItem elements to unassign + :type items: list[ifcopenshell.entity_instance] + :param layer: The IfcPresentationLayerAssignment to unassign from + :type layer: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Remember, all geometry needs to specify the context it is part of first. - # See ifcopenshell.api.context.add_context for details. - model = ifcopenshell.api.run("context.add_context", model, context_type="Model") - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model - ) + # Remember, all geometry needs to specify the context it is part of first. + # See ifcopenshell.api.context.add_context for details. + model = ifcopenshell.api.run("context.add_context", model, context_type="Model") + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model + ) - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=5, height=3, thickness=0.2) - ifcopenshell.api.run("geometry.assign_representation", model, - product=wall, representation=representation) - ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.run("geometry.assign_representation", model, + product=wall, representation=representation) + ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) - # Now let's create a layer that contains walls - layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") + # Now let's create a layer that contains walls + layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") - # And assign our wall representation item (in this example, there is - # only one item) to the layer. - ifcopenshell.api.run("layer.assign_layer", model, items=[representation.Items[0]], layer=layer) + # And assign our wall representation item (in this example, there is + # only one item) to the layer. + ifcopenshell.api.run("layer.assign_layer", model, items=[representation.Items[0]], layer=layer) - # Let's undo it! - ifcopenshell.api.run("layer.unassign_layer", model, items=[representation.Items[0]], layer=layer) - """ - self.file = file - self.settings = { - "items": items, - "layer": layer, - } + # Let's undo it! + ifcopenshell.api.run("layer.unassign_layer", model, items=[representation.Items[0]], layer=layer) + """ + settings = { + "items": items, + "layer": layer, + } - def execute(self): - layer = self.settings["layer"] - assigned_items = set(layer.AssignedItems) or set() - items = set(self.settings["items"]) - if not items.issubset(assigned_items): - return - assigned_items = list(assigned_items - items) + layer = settings["layer"] + assigned_items = set(layer.AssignedItems) or set() + items = set(settings["items"]) + if not items.issubset(assigned_items): + return + assigned_items = list(assigned_items - items) - # keep IFC valid in case if there are no items left - if assigned_items: - layer.AssignedItems = assigned_items - else: - self.file.remove(layer) + # keep IFC valid in case if there are no items left + if assigned_items: + layer.AssignedItems = assigned_items + else: + file.remove(layer) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py index e0caddbe3c..dbb74de3d4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py @@ -15,3 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_library import add_library +from .add_reference import add_reference +from .assign_reference import assign_reference +from .edit_library import edit_library +from .edit_reference import edit_reference +from .remove_library import remove_library +from .remove_reference import remove_reference +from .unassign_reference import unassign_reference diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py index f20494ac5f..16cd00b914 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py @@ -21,48 +21,45 @@ import ifcopenshell.util.schema import ifcopenshell.util.date -class Usecase: - def __init__(self, file, name=None): - """Adds a new library to the project +def add_library(file, name=None) -> None: + """Adds a new library to the project - A library is an external data source that is related to the project. It - may be a database, a spreadsheet, an API, or even a stack of papers in a - filing cabinet. This allows IFC data to store relationships to these - external data sources. + A library is an external data source that is related to the project. It + may be a database, a spreadsheet, an API, or even a stack of papers in a + filing cabinet. This allows IFC data to store relationships to these + external data sources. - For example, you may have a list of laser scans of a site stored in an - online platform, which can be queried using an API. Or, you might have a - database of live building sensor data. So long as there is a clear - identifier you can use to link the two datasets together, you can create - a relationship. + For example, you may have a list of laser scans of a site stored in an + online platform, which can be queried using an API. Or, you might have a + database of live building sensor data. So long as there is a clear + identifier you can use to link the two datasets together, you can create + a relationship. - Note that IFC does not store any instructions on how to access the - library. It does not specify whether a HTTP request or database - connection needs to be made or what protocol the library operates with. - Until this is fleshed out further, it is the users responsibility to - name the libraries consistently and use appropriate identifiers. For - example, if you are linking IFC data and Brickschema data, use a full - URI for the identifier with no abbreviation (e.g. - 'http://example.org/digitaltwin#AHU01', not 'digitaltwin:AHU01'). + Note that IFC does not store any instructions on how to access the + library. It does not specify whether a HTTP request or database + connection needs to be made or what protocol the library operates with. + Until this is fleshed out further, it is the users responsibility to + name the libraries consistently and use appropriate identifiers. For + example, if you are linking IFC data and Brickschema data, use a full + URI for the identifier with no abbreviation (e.g. + 'http://example.org/digitaltwin#AHU01', not 'digitaltwin:AHU01'). - A library will then contain a list of references within that library. - These references will then be related to IFC elements. For example, a - library will represent an external database, and a reference will point - to a particular table and row within that database. + A library will then contain a list of references within that library. + These references will then be related to IFC elements. For example, a + library will represent an external database, and a reference will point + to a particular table and row within that database. - :param name: The name of the library - :type name: str - :return: The newly created IfcLibraryInformation - :rtype: ifcopenshell.entity_instance + :param name: The name of the library + :type name: str + :return: The newly created IfcLibraryInformation + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - ifcopenshell.api.run("library.add_library", model, name="Brickschema") - """ - self.file = file - self.settings = {"name": name} + ifcopenshell.api.run("library.add_library", model, name="Brickschema") + """ + settings = {"name": name} - def execute(self): - return self.file.create_entity("IfcLibraryInformation", Name=self.settings["name"]) + return file.create_entity("IfcLibraryInformation", Name=settings["name"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/add_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/add_reference.py index 84f6605cf0..626d413b3d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/add_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/add_reference.py @@ -19,48 +19,45 @@ import ifcopenshell -class Usecase: - def __init__(self, file: ifcopenshell.file, library: ifcopenshell.entity_instance): - """Adds a new reference to a library +def add_reference(file: ifcopenshell.file, library: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: + """Adds a new reference to a library - A library represents an external data source, such as a database, - spreadsheet, API, or something else that contains information related to - the IFC project. Within a library, there will be one or more references, - such as reference to a particular table or row in a database, or a sheet - and row or column in a spreadsheet, a URI in a linked data Brickschema - file, 32-bit decimal BACnetObjectIdentifier in a BACnet system, IP - address in a network, and so on. + A library represents an external data source, such as a database, + spreadsheet, API, or something else that contains information related to + the IFC project. Within a library, there will be one or more references, + such as reference to a particular table or row in a database, or a sheet + and row or column in a spreadsheet, a URI in a linked data Brickschema + file, 32-bit decimal BACnetObjectIdentifier in a BACnet system, IP + address in a network, and so on. - These references can then be related to IFC elements. You cannot relate - an IFC element directly to a library, it must be related to one of the - library's references. + These references can then be related to IFC elements. You cannot relate + an IFC element directly to a library, it must be related to one of the + library's references. - :param library: The IfcLibraryInformation element to add a reference to - :type library: ifcopenshell.entity_instance - :return: The newly created IfcLibraryReference element - :rtype: ifcopenshell.entity_instance + :param library: The IfcLibraryInformation element to add a reference to + :type library: ifcopenshell.entity_instance + :return: The newly created IfcLibraryReference element + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") + library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") - # Let's create a reference to a single AHU in our Brickschema dataset - reference = ifcopenshell.api.run("library.add_reference", model, library=library) - ifcopenshell.api.run("library.edit_reference", model, - reference=reference, attributes={"Identification": "http://example.org/digitaltwin#AHU01"}) - """ - self.file = file - self.settings = { - "library": library, - } + # Let's create a reference to a single AHU in our Brickschema dataset + reference = ifcopenshell.api.run("library.add_reference", model, library=library) + ifcopenshell.api.run("library.edit_reference", model, + reference=reference, attributes={"Identification": "http://example.org/digitaltwin#AHU01"}) + """ + settings = { + "library": library, + } - def execute(self) -> ifcopenshell.entity_instance: - if self.file.schema == "IFC2X3": - reference = self.file.createIfcLibraryReference() - references = list(self.settings["library"].LibraryReference or []) - references.append(reference) - self.settings["library"].LibraryReference = references - return reference - return self.file.createIfcLibraryReference(ReferencedLibrary=self.settings["library"]) + if file.schema == "IFC2X3": + reference = file.createIfcLibraryReference() + references = list(settings["library"].LibraryReference or []) + references.append(reference) + settings["library"].LibraryReference = references + return reference + return file.createIfcLibraryReference(ReferencedLibrary=settings["library"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py index 8a0880ccf0..6cbd208865 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py @@ -22,82 +22,75 @@ import ifcopenshell.util.element from typing import Union -class Usecase: - def __init__( - self, file: ifcopenshell.file, products: ifcopenshell.entity_instance, reference: ifcopenshell.entity_instance - ): - """Associates a list products with a library reference +def assign_reference( + file: ifcopenshell.file, products: ifcopenshell.entity_instance, reference: ifcopenshell.entity_instance +) -> Union[ifcopenshell.entity_instance, None]: + """Associates a list products with a library reference - A product may be associated with zero, one, or many references across - multiple libraries. See ifcopenshell.api.library.add_reference for more - detail about how references work. + A product may be associated with zero, one, or many references across + multiple libraries. See ifcopenshell.api.library.add_reference for more + detail about how references work. - :param products: The list of IfcProducts you want to associate with the reference - :type products: list[ifcopenshell.entity_instance] - :param reference: The IfcLibraryReference you want the product to be - associated with. - :type reference: ifcopenshell.entity_instance - :return: The IfcRelAssociatesLibrary relationship entity - or `None` if `products` was an empty list or all products were - already assigned to the `reference`. - :rtype: Union[ifcopenshell.entity_instance, None] + :param products: The list of IfcProducts you want to associate with the reference + :type products: list[ifcopenshell.entity_instance] + :param reference: The IfcLibraryReference you want the product to be + associated with. + :type reference: ifcopenshell.entity_instance + :return: The IfcRelAssociatesLibrary relationship entity + or `None` if `products` was an empty list or all products were + already assigned to the `reference`. + :rtype: Union[ifcopenshell.entity_instance, None] - Example: + Example: - .. code:: python + .. code:: python - library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") + library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") - # Let's create a reference to a single AHU in our Brickschema dataset - reference = ifcopenshell.api.run("library.add_reference", model, library=library) - ifcopenshell.api.run("library.edit_reference", model, - reference=reference, attributes={"Identification": "http://example.org/digitaltwin#AHU01"}) + # Let's create a reference to a single AHU in our Brickschema dataset + reference = ifcopenshell.api.run("library.add_reference", model, library=library) + ifcopenshell.api.run("library.edit_reference", model, + reference=reference, attributes={"Identification": "http://example.org/digitaltwin#AHU01"}) - # Let's assume we have an AHU in our model. - ahu = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcUnitaryEquipment", predefined_type="AIRHANDLER") + # Let's assume we have an AHU in our model. + ahu = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcUnitaryEquipment", predefined_type="AIRHANDLER") - # And now assign the IFC model's AHU with its Brickschema counterpart - ifcopenshell.api.run("library.assign_reference", model, reference=reference, products=[ahu]) - """ - self.file = file - self.settings = { - "products": products, - "reference": reference, - } + # And now assign the IFC model's AHU with its Brickschema counterpart + ifcopenshell.api.run("library.assign_reference", model, reference=reference, products=[ahu]) + """ + settings = { + "products": products, + "reference": reference, + } - def execute(self) -> Union[ifcopenshell.entity_instance, None]: - # TODO: do we need to support non-ifcroot elements like we do in classification.add_reference? + # TODO: do we need to support non-ifcroot elements like we do in classification.add_reference? - referenced_elements = ifcopenshell.util.element.get_referenced_elements(self.settings["reference"]) - products: set[ifcopenshell.entity_instance] = set(self.settings["products"]) - products = products - referenced_elements + referenced_elements = ifcopenshell.util.element.get_referenced_elements(settings["reference"]) + products: set[ifcopenshell.entity_instance] = set(settings["products"]) + products = products - referenced_elements - if not products: - return + if not products: + return - if self.file.schema == "IFC2X3": - rel = next( - ( - r - for r in self.file.by_type("IfcRelAssociatesLibrary") - if r.RelatingLibrary == self.settings["reference"] - ), - None, - ) - else: - rel = next(iter(self.settings["reference"].LibraryRefForObjects), None) + if file.schema == "IFC2X3": + rel = next( + (r for r in file.by_type("IfcRelAssociatesLibrary") if r.RelatingLibrary == settings["reference"]), + None, + ) + else: + rel = next(iter(settings["reference"].LibraryRefForObjects), None) - if not rel: - return self.file.create_entity( - "IfcRelAssociatesLibrary", - GlobalId=ifcopenshell.guid.new(), - OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", self.file), - RelatedObjects=list(products), - RelatingLibrary=self.settings["reference"], - ) + if not rel: + return file.create_entity( + "IfcRelAssociatesLibrary", + GlobalId=ifcopenshell.guid.new(), + OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", file), + RelatedObjects=list(products), + RelatingLibrary=settings["reference"], + ) - related_objects = set(rel.RelatedObjects) | products - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, element=rel) - return rel + related_objects = set(rel.RelatedObjects) | products + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, element=rel) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py index aca508cc38..5a53869a3f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py @@ -17,32 +17,29 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, library=None, attributes=None): - """Edits the attributes of an IfcLibraryInformation +def edit_library(file, library=None, attributes=None) -> None: + """Edits the attributes of an IfcLibraryInformation - For more information about the attributes and data types of an - IfcLibraryInformation, consult the IFC documentation. + For more information about the attributes and data types of an + IfcLibraryInformation, consult the IFC documentation. - :param library: The IfcLibraryInformation entity you want to edit - :type library: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param library: The IfcLibraryInformation entity you want to edit + :type library: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") - ifcopenshell.api.run("library.edit_library", model, library=library, - attributes={"Description": "A Brickschema TTL including only mechanical distribution systems."}) - """ + library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") + ifcopenshell.api.run("library.edit_library", model, library=library, + attributes={"Description": "A Brickschema TTL including only mechanical distribution systems."}) + """ - self.file = file - self.settings = {"library": library, "attributes": attributes or {}} + settings = {"library": library, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["library"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["library"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py index 35a1be4709..1d2487820a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py @@ -17,33 +17,30 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, reference=None, attributes=None): - """Edits the attributes of an IfcLibraryReference +def edit_reference(file, reference=None, attributes=None) -> None: + """Edits the attributes of an IfcLibraryReference - For more information about the attributes and data types of an - IfcLibraryReference, consult the IFC documentation. + For more information about the attributes and data types of an + IfcLibraryReference, consult the IFC documentation. - :param reference: The IfcLibraryReference entity you want to edit - :type reference: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param reference: The IfcLibraryReference entity you want to edit + :type reference: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") - # Let's create a reference to a single AHU in our Brickschema dataset - reference = ifcopenshell.api.run("library.add_reference", model, library=library) - ifcopenshell.api.run("library.edit_reference", model, - reference=reference, attributes={"Identification": "http://example.org/digitaltwin#AHU01"}) - """ - self.file = file - self.settings = {"reference": reference, "attributes": attributes or {}} + library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") + # Let's create a reference to a single AHU in our Brickschema dataset + reference = ifcopenshell.api.run("library.add_reference", model, library=library) + ifcopenshell.api.run("library.edit_reference", model, + reference=reference, attributes={"Identification": "http://example.org/digitaltwin#AHU01"}) + """ + settings = {"reference": reference, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["reference"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["reference"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py index e921016c4d..ba5244537c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py @@ -20,35 +20,32 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, library=None): - """Removes a library +def remove_library(file, library=None) -> None: + """Removes a library - All references along with their relationships will also be removed. Any - products which have relationships to this library will not be removed. + All references along with their relationships will also be removed. Any + products which have relationships to this library will not be removed. - :param library: The IfcLibraryInformation entity you want to remove - :type library: ifcopenshell.entity_instance - :return: None - :rtype: None + :param library: The IfcLibraryInformation entity you want to remove + :type library: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") - ifcopenshell.api.run("library.remove_library", model, library=library) - """ - self.file = file - self.settings = {"library": library} + library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") + ifcopenshell.api.run("library.remove_library", model, library=library) + """ + settings = {"library": library} - def execute(self): - for reference in set(self.settings["library"].HasLibraryReferences or []): - self.file.remove(reference) - self.file.remove(self.settings["library"]) - for rel in self.file.by_type("IfcRelAssociatesLibrary"): - if not rel.RelatingLibrary: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + for reference in set(settings["library"].HasLibraryReferences or []): + file.remove(reference) + file.remove(settings["library"]) + for rel in file.by_type("IfcRelAssociatesLibrary"): + if not rel.RelatingLibrary: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py index d34973f6b2..0b5ad42d1a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py @@ -20,34 +20,31 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file: ifcopenshell.file, reference: ifcopenshell.entity_instance): - """Removes a library reference +def remove_reference(file: ifcopenshell.file, reference: ifcopenshell.entity_instance) -> None: + """Removes a library reference - Any products which have relationships to this reference will not be - removed. + Any products which have relationships to this reference will not be + removed. - :param reference: The IfcLibraryReference entity you want to remove - :type reference: ifcopenshell.entity_instance - :return: None - :rtype: None + :param reference: The IfcLibraryReference entity you want to remove + :type reference: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") - reference = ifcopenshell.api.run("library.add_reference", model, library=library) - # Let's change our mind and remove it. - ifcopenshell.api.run("library.remove_reference", model, reference=reference) - """ - self.file = file - self.settings = {"reference": reference} + library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") + reference = ifcopenshell.api.run("library.add_reference", model, library=library) + # Let's change our mind and remove it. + ifcopenshell.api.run("library.remove_reference", model, reference=reference) + """ + settings = {"reference": reference} - def execute(self) -> None: - for rel in self.settings["reference"].LibraryRefForObjects: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - self.file.remove(self.settings["reference"]) + for rel in settings["reference"].LibraryRefForObjects: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + file.remove(settings["reference"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/unassign_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/unassign_reference.py index 420b7fa0d4..c2f2837ad0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/unassign_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/unassign_reference.py @@ -21,70 +21,66 @@ import ifcopenshell.util.element import ifcopenshell.api -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - reference: ifcopenshell.entity_instance, - products: list[ifcopenshell.entity_instance], - ): - """Unassigns a product of products from a reference +def unassign_reference( + file: ifcopenshell.file, + reference: ifcopenshell.entity_instance, + products: list[ifcopenshell.entity_instance], +) -> None: + """Unassigns a product of products from a reference - If the product isn't assigned to the reference, nothing will happen. + If the product isn't assigned to the reference, nothing will happen. - :param reference: The IfcLibraryReference to unassign from - :type reference: ifcopenshell.entity_instance - :param products: A list of IfcProduct elements to unassign from the reference - :type products: list[ifcopenshell.entity_instance] - :return: None - :rtype: None + :param reference: The IfcLibraryReference to unassign from + :type reference: ifcopenshell.entity_instance + :param products: A list of IfcProduct elements to unassign from the reference + :type products: list[ifcopenshell.entity_instance] + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") + library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") - # Let's create a reference to a single AHU in our Brickschema dataset - reference = ifcopenshell.api.run("library.add_reference", model, library=library) - ifcopenshell.api.run("library.edit_reference", model, - reference=reference, attributes={"Identification": "http://example.org/digitaltwin#AHU01"}) + # Let's create a reference to a single AHU in our Brickschema dataset + reference = ifcopenshell.api.run("library.add_reference", model, library=library) + ifcopenshell.api.run("library.edit_reference", model, + reference=reference, attributes={"Identification": "http://example.org/digitaltwin#AHU01"}) - # Let's assume we have an AHU in our model. - ahu = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcUnitaryEquipment", predefined_type="AIRHANDLER") + # Let's assume we have an AHU in our model. + ahu = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcUnitaryEquipment", predefined_type="AIRHANDLER") - # And now assign the IFC model's AHU with its Brickschema counterpart - ifcopenshell.api.run("library.assign_reference", model, reference=reference, products=[ahu]) + # And now assign the IFC model's AHU with its Brickschema counterpart + ifcopenshell.api.run("library.assign_reference", model, reference=reference, products=[ahu]) - # Let's change our mind and unassign it. - ifcopenshell.api.run("library.unassign_reference", model, reference=reference, products=[ahu]) - """ + # Let's change our mind and unassign it. + ifcopenshell.api.run("library.unassign_reference", model, reference=reference, products=[ahu]) + """ - self.file = file - self.settings = {"reference": reference, "products": products} + settings = {"reference": reference, "products": products} - def execute(self): - # TODO: do we need to support non-ifcroot elements like we do in classification.add_reference? + # TODO: do we need to support non-ifcroot elements like we do in classification.add_reference? - reference_rels: set[ifcopenshell.entity_instance] = set() - products = set(self.settings["products"]) - for product in products: - reference_rels.update(product.HasAssociations) + reference_rels: set[ifcopenshell.entity_instance] = set() + products = set(settings["products"]) + for product in products: + reference_rels.update(product.HasAssociations) - reference_rels = { - rel - for rel in reference_rels - if rel.is_a("IfcRelAssociatesLibrary") and rel.RelatingLibrary == self.settings["reference"] - } + reference_rels = { + rel + for rel in reference_rels + if rel.is_a("IfcRelAssociatesLibrary") and rel.RelatingLibrary == settings["reference"] + } - for rel in reference_rels: - related_objects = set(rel.RelatedObjects) - products - if related_objects: - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + for rel in reference_rels: + related_objects = set(rel.RelatedObjects) - products + if related_objects: + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + else: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py index e0caddbe3c..2831915f76 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py @@ -15,3 +15,28 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_constituent import add_constituent +from .add_layer import add_layer +from .add_list_item import add_list_item +from .add_material import add_material +from .add_material_set import add_material_set +from .add_profile import add_profile +from .assign_material import assign_material +from .assign_profile import assign_profile +from .copy_material import copy_material +from .edit_assigned_material import edit_assigned_material +from .edit_constituent import edit_constituent +from .edit_layer import edit_layer +from .edit_layer_usage import edit_layer_usage +from .edit_material import edit_material +from .edit_profile import edit_profile +from .edit_profile_usage import edit_profile_usage +from .remove_constituent import remove_constituent +from .remove_layer import remove_layer +from .remove_list_item import remove_list_item +from .remove_material import remove_material +from .remove_material_set import remove_material_set +from .remove_profile import remove_profile +from .reorder_set_item import reorder_set_item +from .unassign_material import unassign_material diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py index 278eb50872..b1f3f76073 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py @@ -17,75 +17,72 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, constituent_set=None, material=None): - """Adds a new constituent to a constituent set +def add_constituent(file, constituent_set=None, material=None) -> None: + """Adds a new constituent to a constituent set - A constituent describes how a portion of an object is made out of a - material whereas other portions of the object is made out of other - materials. For example, a window might be made out of an aluminium frame - and a glass panel. The aluminium used for the frame is one constituent - of the material, and glass would be another constituent. Another example - might be concrete, where one constituent might be cement, and another - constituent might be binder. In the case of the window, the constituent - is represented explicitly by the geometry of the window frame and the - geometry of the window panel. In the case of a concrete slab, the - constituents might be represented in terms of percentages. + A constituent describes how a portion of an object is made out of a + material whereas other portions of the object is made out of other + materials. For example, a window might be made out of an aluminium frame + and a glass panel. The aluminium used for the frame is one constituent + of the material, and glass would be another constituent. Another example + might be concrete, where one constituent might be cement, and another + constituent might be binder. In the case of the window, the constituent + is represented explicitly by the geometry of the window frame and the + geometry of the window panel. In the case of a concrete slab, the + constituents might be represented in terms of percentages. - Constituents are not available in IFC2X3. + Constituents are not available in IFC2X3. - :param constituent_set: The IfcMaterialConstituentSet that the - constituent is part of. The constituent set represents a group of - constituents. See ifcopenshell.api.material.add_material_set for - information on how to add a constituent set. - :type constituent_set: ifcopenshell.entity_instance - :param material: The IfcMaterial that the constituent is made out of. - :type material: ifcopenshell.entity_instance - :return: The newly created IfcMaterialConstituent - :rtype: ifcopenshell.entity_instance + :param constituent_set: The IfcMaterialConstituentSet that the + constituent is part of. The constituent set represents a group of + constituents. See ifcopenshell.api.material.add_material_set for + information on how to add a constituent set. + :type constituent_set: ifcopenshell.entity_instance + :param material: The IfcMaterial that the constituent is made out of. + :type material: ifcopenshell.entity_instance + :return: The newly created IfcMaterialConstituent + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we have a window type that has an aluminium frame - # and a glass glazing panel. Notice we are assigning to the type - # only, as all occurrences of that type will automatically inherit - # the material. - window_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWindowType") + # Let's imagine we have a window type that has an aluminium frame + # and a glass glazing panel. Notice we are assigning to the type + # only, as all occurrences of that type will automatically inherit + # the material. + window_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWindowType") - # First, let's create a constituent set. This will later be assigned - # to our window element. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="Window", set_type="IfcMaterialConstituentSet") + # First, let's create a constituent set. This will later be assigned + # to our window element. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="Window", set_type="IfcMaterialConstituentSet") - # Let's create a few materials, it's important to also give them - # categories. This makes it easy for model recipients to do things - # like "show me everything made out of aluminium / concrete / steel - # / glass / etc". The IFC specification states a list of categories - # you can use. - aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") - glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") + # Let's create a few materials, it's important to also give them + # categories. This makes it easy for model recipients to do things + # like "show me everything made out of aluminium / concrete / steel + # / glass / etc". The IFC specification states a list of categories + # you can use. + aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") + glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") - # Now let's use those materials as two constituents in our set. - ifcopenshell.api.run("material.add_constituent", model, - constituent_set=material_set, material=aluminium) - ifcopenshell.api.run("material.add_constituent", model, - constituent_set=material_set, material=glass) + # Now let's use those materials as two constituents in our set. + ifcopenshell.api.run("material.add_constituent", model, + constituent_set=material_set, material=aluminium) + ifcopenshell.api.run("material.add_constituent", model, + constituent_set=material_set, material=glass) - # Great! Let's assign our material set to our window type. - # We're technically not done here, we might want to add geometry to - # our window too, but to keep this example simple, geometry is - # optional and it is enough to say that this window is made out of - # aluminium and glass. - ifcopenshell.api.run("material.assign_material", model, products=[window_type], material=material_set) - """ - self.file = file - self.settings = {"constituent_set": constituent_set, "material": material} + # Great! Let's assign our material set to our window type. + # We're technically not done here, we might want to add geometry to + # our window too, but to keep this example simple, geometry is + # optional and it is enough to say that this window is made out of + # aluminium and glass. + ifcopenshell.api.run("material.assign_material", model, products=[window_type], material=material_set) + """ + settings = {"constituent_set": constituent_set, "material": material} - def execute(self): - constituents = list(self.settings["constituent_set"].MaterialConstituents or []) - constituent = self.file.create_entity("IfcMaterialConstituent", **{"Material": self.settings["material"]}) - constituents.append(constituent) - self.settings["constituent_set"].MaterialConstituents = constituents - return constituent + constituents = list(settings["constituent_set"].MaterialConstituents or []) + constituent = file.create_entity("IfcMaterialConstituent", **{"Material": settings["material"]}) + constituents.append(constituent) + settings["constituent_set"].MaterialConstituents = constituents + return constituent diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py index aa572f07bd..68885715ee 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py @@ -17,75 +17,70 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, layer_set=None, material=None): - """Adds a new layer to a layer set +def add_layer(file, layer_set=None, material=None) -> None: + """Adds a new layer to a layer set - A layer represents a portion of material within a layered build up, - defined by a thickness. Typical layered construction includes walls and - slabs, where a wall might include a layer of finish, a layer of - structure, a layer of insulation, and so on. It is recommended to define - layered construction this way where it is unnecessary to define the - exact geometry of how the wall or slab will be built, and it will - instead be determined on site by a trade. + A layer represents a portion of material within a layered build up, + defined by a thickness. Typical layered construction includes walls and + slabs, where a wall might include a layer of finish, a layer of + structure, a layer of insulation, and so on. It is recommended to define + layered construction this way where it is unnecessary to define the + exact geometry of how the wall or slab will be built, and it will + instead be determined on site by a trade. - Layers are defined in a particular order and thickness, so that it is - clear which layer comes next. + Layers are defined in a particular order and thickness, so that it is + clear which layer comes next. - :param layer_set: The IfcMaterialLayerSet that the layer is part of. The - layer set represents a group of layers. See - ifcopenshell.api.material.add_material_set for more information on - how to add a layer set. - :type layer_set: ifcopenshell.entity_instance - :param material: The IfcMaterial that the layer is made out of. - :type material: ifcopenshell.entity_instance - :return: The newly created IfcMaterialLayer - :rtype: ifcopenshell.entity_instance + :param layer_set: The IfcMaterialLayerSet that the layer is part of. The + layer set represents a group of layers. See + ifcopenshell.api.material.add_material_set for more information on + how to add a layer set. + :type layer_set: ifcopenshell.entity_instance + :param material: The IfcMaterial that the layer is made out of. + :type material: ifcopenshell.entity_instance + :return: The newly created IfcMaterialLayer + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we have a wall type that has two layers of - # gypsum with steel studs inside. Notice we are assigning to - # the type only, as all occurrences of that type will automatically - # inherit the material. - wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType", name="WAL01") + # Let's imagine we have a wall type that has two layers of + # gypsum with steel studs inside. Notice we are assigning to + # the type only, as all occurrences of that type will automatically + # inherit the material. + wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType", name="WAL01") - # First, let's create a material set. This will later be assigned - # to our wall type element. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="GYP-ST-GYP", set_type="IfcMaterialLayerSet") + # First, let's create a material set. This will later be assigned + # to our wall type element. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="GYP-ST-GYP", set_type="IfcMaterialLayerSet") - # Let's create a few materials, it's important to also give them - # categories. This makes it easy for model recipients to do things - # like "show me everything made out of aluminium / concrete / steel - # / glass / etc". The IFC specification states a list of categories - # you can use. - gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + # Let's create a few materials, it's important to also give them + # categories. This makes it easy for model recipients to do things + # like "show me everything made out of aluminium / concrete / steel + # / glass / etc". The IFC specification states a list of categories + # you can use. + gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - # Now let's use those materials as three layers in our set, such - # that the steel studs are sandwiched by the gypsum. Let's imagine - # we're setting the layer thickness in millimeters. - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 92}) - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) + # Now let's use those materials as three layers in our set, such + # that the steel studs are sandwiched by the gypsum. Let's imagine + # we're setting the layer thickness in millimeters. + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 92}) + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) - # Great! Let's assign our material set to our wall type. - ifcopenshell.api.run("material.assign_material", model, products=[wall_type], material=material_set) - """ - self.file = file - self.settings = {"layer_set": layer_set, "material": material} + # Great! Let's assign our material set to our wall type. + ifcopenshell.api.run("material.assign_material", model, products=[wall_type], material=material_set) + """ + settings = {"layer_set": layer_set, "material": material} - def execute(self): - layers = list(self.settings["layer_set"].MaterialLayers or []) - layer = self.file.create_entity( - "IfcMaterialLayer", **{"Material": self.settings["material"], "LayerThickness": 1.0} - ) - layers.append(layer) - self.settings["layer_set"].MaterialLayers = layers - return layer + layers = list(settings["layer_set"].MaterialLayers or []) + layer = file.create_entity("IfcMaterialLayer", **{"Material": settings["material"], "LayerThickness": 1.0}) + layers.append(layer) + settings["layer_set"].MaterialLayers = layers + return layer diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py index 9a12ed044b..7eaa8159ce 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py @@ -19,70 +19,67 @@ import ifcopenshell -class Usecase: - def __init__(self, file, material_list=None, material=None): - """Adds a new material in a list of materials +def add_list_item(file, material_list=None, material=None) -> None: + """Adds a new material in a list of materials - In IFC2X3, if you wanted an object to have multiple materials (i.e. a - composite material) you would assign the object to a material list, - which would contain a list of materials. For example, a window might - have a list of 2 materials, one being aluminium for the frame, and - another being glass for the panel. + In IFC2X3, if you wanted an object to have multiple materials (i.e. a + composite material) you would assign the object to a material list, + which would contain a list of materials. For example, a window might + have a list of 2 materials, one being aluminium for the frame, and + another being glass for the panel. - In IFC4 and above, this is deprecated and should not be used. Instead, - you should use constituent sets instead, which achieve the same thing - but are more powerful as they allow you to define the properties of the - constituents too. + In IFC4 and above, this is deprecated and should not be used. Instead, + you should use constituent sets instead, which achieve the same thing + but are more powerful as they allow you to define the properties of the + constituents too. - However if you're stuck on IFC2X3, you have my condolences as well as - this function. + However if you're stuck on IFC2X3, you have my condolences as well as + this function. - :param material_list: The IfcMaterialList the material should be added - to. - :type material_list: ifcopenshell.entity_instance - :param material: The IfcMaterial to add to the list - :type material: ifcopenshell.entity_instance - :return: None - :rtype: None + :param material_list: The IfcMaterialList the material should be added + to. + :type material_list: ifcopenshell.entity_instance + :param material: The IfcMaterial to add to the list + :type material: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we have a window type that has an aluminium frame - # and a glass glazing panel. Notice we are assigning to the type - # only, as all occurrences of that type will automatically inherit - # the material. - window_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWindowType") + # Let's imagine we have a window type that has an aluminium frame + # and a glass glazing panel. Notice we are assigning to the type + # only, as all occurrences of that type will automatically inherit + # the material. + window_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWindowType") - # First, let's create a list. This will later be assigned to our - # window element. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="Window", set_type="IfcMaterialList") + # First, let's create a list. This will later be assigned to our + # window element. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="Window", set_type="IfcMaterialList") - # Let's create a few materials, it's important to also give them - # categories. This makes it easy for model recipients to do things - # like "show me everything made out of aluminium / concrete / steel - # / glass / etc". The IFC specification states a list of categories - # you can use. - aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") - glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") + # Let's create a few materials, it's important to also give them + # categories. This makes it easy for model recipients to do things + # like "show me everything made out of aluminium / concrete / steel + # / glass / etc". The IFC specification states a list of categories + # you can use. + aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") + glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") - # Now let's use those materials as two items in our list. - ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=aluminium) - ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=glass) + # Now let's use those materials as two items in our list. + ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=aluminium) + ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=glass) - # Great! Let's assign our material set to our window type. - # We're technically not done here, we might want to add geometry to - # our window too, but to keep this example simple, geometry is - # optional and it is enough to say that this window is made out of - # aluminium and glass. - ifcopenshell.api.run("material.assign_material", model, products=[window_type], material=material_set) - """ - self.file = file - self.settings = {"material_list": material_list, "material": material} + # Great! Let's assign our material set to our window type. + # We're technically not done here, we might want to add geometry to + # our window too, but to keep this example simple, geometry is + # optional and it is enough to say that this window is made out of + # aluminium and glass. + ifcopenshell.api.run("material.assign_material", model, products=[window_type], material=material_set) + """ + settings = {"material_list": material_list, "material": material} - def execute(self): - materials = list(self.settings["material_list"].Materials or []) - materials.append(self.settings["material"]) - self.settings["material_list"].Materials = materials + materials = list(settings["material_list"].Materials or []) + materials.append(settings["material"]) + settings["material_list"].Materials = materials diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py index bac5a3ac0a..534d9e911c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py @@ -17,64 +17,61 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, name=None, category=None): - """Adds a new material +def add_material(file, name=None, category=None) -> None: + """Adds a new material - A material in IFC represents a physical material, such as timber, steel, - concrete, aluminium, etc. It may also contain physical properties used - for structural or lighting simulation. Note that unlike the computer - graphics industry, a material by itself does not define any colour or - lighting information. Colours in IFC are known as "styles", and an IFC - material may or may not have any style information associated with it. - See ifcopenshell.api.style for more information. + A material in IFC represents a physical material, such as timber, steel, + concrete, aluminium, etc. It may also contain physical properties used + for structural or lighting simulation. Note that unlike the computer + graphics industry, a material by itself does not define any colour or + lighting information. Colours in IFC are known as "styles", and an IFC + material may or may not have any style information associated with it. + See ifcopenshell.api.style for more information. - A material is typically given a code name which is used by architects in - elevations and details when tagging finishes. Materials are also useful - to structural engineers in specifying the exact types of concrete and - steel to be used in structural simulations. + A material is typically given a code name which is used by architects in + elevations and details when tagging finishes. Materials are also useful + to structural engineers in specifying the exact types of concrete and + steel to be used in structural simulations. - In addition, materials can belong to a category. Specifying this - category is critical to allow model recipients to make simple queries - like "show me all concrete / steel" elements in the model. Without - standardised category naming of all materials, this type of query - becomes a bespoke and inefficient task. A list of categories are: - 'concrete', 'steel', 'aluminium', 'block', 'brick', 'stone', 'wood', - 'glass', 'gypsum', 'plastic', and 'earth'. The user is allowed to - specify their own category instead if none of these categories are - appropriate. + In addition, materials can belong to a category. Specifying this + category is critical to allow model recipients to make simple queries + like "show me all concrete / steel" elements in the model. Without + standardised category naming of all materials, this type of query + becomes a bespoke and inefficient task. A list of categories are: + 'concrete', 'steel', 'aluminium', 'block', 'brick', 'stone', 'wood', + 'glass', 'gypsum', 'plastic', and 'earth'. The user is allowed to + specify their own category instead if none of these categories are + appropriate. - Note that categories are not available in IFC2X3. This shortcoming is - one of the big reasons projects should upgrade to IFC4. + Note that categories are not available in IFC2X3. This shortcoming is + one of the big reasons projects should upgrade to IFC4. - :param name: The name of the material, typically tagged in a finishes - drawing or schedule. - :type name: str - :param category: The category of the material. - :type category: str, optional - :return: The newly created IfcMaterial - :rtype: ifcopenshell.entity_instance + :param name: The name of the material, typically tagged in a finishes + drawing or schedule. + :type name: str + :param category: The category of the material. + :type category: str, optional + :return: The newly created IfcMaterial + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's create two materials with their respective categories - concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + # Let's create two materials with their respective categories + concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - # Let's imagine an urban concrete bench which is purely made out of concrete - concrete_bench = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurnitureType") + # Let's imagine an urban concrete bench which is purely made out of concrete + concrete_bench = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurnitureType") - # Assign the concrete material to that bench. Note that no colour - # "Style" has been specified. - ifcopenshell.api.run("material.assign_material", model, products=[concrete_bench], material=concrete) - """ - self.file = file - self.settings = {"name": name or "Unnamed", "category": category} + # Assign the concrete material to that bench. Note that no colour + # "Style" has been specified. + ifcopenshell.api.run("material.assign_material", model, products=[concrete_bench], material=concrete) + """ + settings = {"name": name or "Unnamed", "category": category} - def execute(self): - material = self.file.create_entity("IfcMaterial", **{"Name": self.settings["name"] or "Unnamed"}) - if self.settings["category"]: - material.Category = self.settings["category"] - return material + material = file.create_entity("IfcMaterial", **{"Name": settings["name"] or "Unnamed"}) + if settings["category"]: + material.Category = settings["category"] + return material diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py index 277aa258f2..99cfafad41 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py @@ -17,97 +17,94 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, name="Unnamed", set_type="IfcMaterialConstituentSet"): - """Adds a new material set +def add_material_set(file, name="Unnamed", set_type="IfcMaterialConstituentSet") -> None: + """Adds a new material set - IFC allows you to state that objects are made out of multiple materials. - These are known generically as material sets, but may also be called - layered materials, composite materials, or other names in software. + IFC allows you to state that objects are made out of multiple materials. + These are known generically as material sets, but may also be called + layered materials, composite materials, or other names in software. - There are three types of material sets: + There are three types of material sets: - - A layer set, used for layered construction such as walls, where the - element is parametrically made out of extruded layers, each layer - having a thickness defined. Even though this is known as a layer - "set" it is still recommended to use it for all standared layered - construction as it describes the intent of the element to be layered - construction and thus can be used for parametric editing. - - A profile set, used for profiled construction such as beams or - columns, where the element is parametrically made out of one or more - extruded profiles, where each profile may be parametric from a - standard section (e.g. standardised steel profile) or an arbitrary - shape (e.g. cold rolled sections, or skirtings, moldings, etc). Note - that even though this is called a profile "set", it should still be - used even if there is only a single profile. This is not available in - IFC2X3. - - A constituent set, used for arbitrary composite construction where - the object is made out of multiple materials. The constituents may be - explicitly defined via a shape, such as a window where the frame - geometry is made from one material and the panel geometry is made - from another material. Alternatively, the constituents may be - represented in terms of percentages, such as in mixtures like - concrete where there might be a percentage constituent of cement and - another percentage constituent of binder. This is not available in - IFC2X3. + - A layer set, used for layered construction such as walls, where the + element is parametrically made out of extruded layers, each layer + having a thickness defined. Even though this is known as a layer + "set" it is still recommended to use it for all standared layered + construction as it describes the intent of the element to be layered + construction and thus can be used for parametric editing. + - A profile set, used for profiled construction such as beams or + columns, where the element is parametrically made out of one or more + extruded profiles, where each profile may be parametric from a + standard section (e.g. standardised steel profile) or an arbitrary + shape (e.g. cold rolled sections, or skirtings, moldings, etc). Note + that even though this is called a profile "set", it should still be + used even if there is only a single profile. This is not available in + IFC2X3. + - A constituent set, used for arbitrary composite construction where + the object is made out of multiple materials. The constituents may be + explicitly defined via a shape, such as a window where the frame + geometry is made from one material and the panel geometry is made + from another material. Alternatively, the constituents may be + represented in terms of percentages, such as in mixtures like + concrete where there might be a percentage constituent of cement and + another percentage constituent of binder. This is not available in + IFC2X3. - There is also a fourth material set known as a material list, which is a - legacy type of set used by IFC2X3. It should not be used on IFC4 and - above, and constituent sets should be used instead. + There is also a fourth material set known as a material list, which is a + legacy type of set used by IFC2X3. It should not be used on IFC4 and + above, and constituent sets should be used instead. - :param name: The name of the material set, which may be purely - descriptive or annotated in drawings. Defaults to "Unnamed". - :type name: str, optional - :param set_type: What type of set you want to create, chosen from - IfcMaterialLayerSet, IfcMaterialProfileSet, - IfcMaterialConstituentSet, or IfcMaterialList. Defaults to - IfcMaterialConstituentSet. - :type set_type: str, optional - :return: The newly created material set element - :rtype: ifcopenshell.entity_instance + :param name: The name of the material set, which may be purely + descriptive or annotated in drawings. Defaults to "Unnamed". + :type name: str, optional + :param set_type: What type of set you want to create, chosen from + IfcMaterialLayerSet, IfcMaterialProfileSet, + IfcMaterialConstituentSet, or IfcMaterialList. Defaults to + IfcMaterialConstituentSet. + :type set_type: str, optional + :return: The newly created material set element + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we have a wall type that has two layers of - # gypsum with steel studs inside. Notice we are assigning to - # the type only, as all occurrences of that type will automatically - # inherit the material. - wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType", name="WAL01") + # Let's imagine we have a wall type that has two layers of + # gypsum with steel studs inside. Notice we are assigning to + # the type only, as all occurrences of that type will automatically + # inherit the material. + wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType", name="WAL01") - # First, let's create a material set. This will later be assigned - # to our wall type element. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="GYP-ST-GYP", set_type="IfcMaterialLayerSet") + # First, let's create a material set. This will later be assigned + # to our wall type element. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="GYP-ST-GYP", set_type="IfcMaterialLayerSet") - # Let's create a few materials, it's important to also give them - # categories. This makes it easy for model recipients to do things - # like "show me everything made out of aluminium / concrete / steel - # / glass / etc". The IFC specification states a list of categories - # you can use. - gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + # Let's create a few materials, it's important to also give them + # categories. This makes it easy for model recipients to do things + # like "show me everything made out of aluminium / concrete / steel + # / glass / etc". The IFC specification states a list of categories + # you can use. + gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - # Now let's use those materials as three layers in our set, such - # that the steel studs are sandwiched by the gypsum. Let's imagine - # we're setting the layer thickness in millimeters. - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 92}) - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) + # Now let's use those materials as three layers in our set, such + # that the steel studs are sandwiched by the gypsum. Let's imagine + # we're setting the layer thickness in millimeters. + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 92}) + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) - # Great! Let's assign our material set to our wall type. - ifcopenshell.api.run("material.assign_material", model, products=[wall_type], material=material_set) - """ - self.file = file - self.settings = {"name": name or "Unnamed", "set_type": set_type or "IfcMaterialConstituentSet"} + # Great! Let's assign our material set to our wall type. + ifcopenshell.api.run("material.assign_material", model, products=[wall_type], material=material_set) + """ + settings = {"name": name or "Unnamed", "set_type": set_type or "IfcMaterialConstituentSet"} - def execute(self): - if self.settings["set_type"] == "IfcMaterialLayerSet": - return self.file.create_entity("IfcMaterialLayerSet", LayerSetName=self.settings["name"] or "Unnamed") - elif self.settings["set_type"] == "IfcMaterialList": - return self.file.create_entity("IfcMaterialList") - return self.file.create_entity(self.settings["set_type"], Name=self.settings["name"] or "Unnamed") + if settings["set_type"] == "IfcMaterialLayerSet": + return file.create_entity("IfcMaterialLayerSet", LayerSetName=settings["name"] or "Unnamed") + elif settings["set_type"] == "IfcMaterialList": + return file.create_entity("IfcMaterialList") + return file.create_entity(settings["set_type"], Name=settings["name"] or "Unnamed") diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py index ff2cf3bed5..3a23dd44a9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_profile.py @@ -19,86 +19,82 @@ import ifcopenshell from typing import Optional -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - profile_set: ifcopenshell.entity_instance, - material: Optional[ifcopenshell.entity_instance] = None, - profile: Optional[ifcopenshell.entity_instance] = None, - ): - """Add a new profile item to a profile set +def add_profile( + file: ifcopenshell.file, + profile_set: ifcopenshell.entity_instance, + material: Optional[ifcopenshell.entity_instance] = None, + profile: Optional[ifcopenshell.entity_instance] = None, +) -> ifcopenshell.entity_instance: + """Add a new profile item to a profile set - A profile item in a profile set represents an extruded 2D profile curve - that is extruded along the axis of the element. Most commonly there will - only be a single profile item in a profile set. For example, a beam will - have a material profile set containing a single profile item, which may - have a steel material and a I-beam shaped profile curve. + A profile item in a profile set represents an extruded 2D profile curve + that is extruded along the axis of the element. Most commonly there will + only be a single profile item in a profile set. For example, a beam will + have a material profile set containing a single profile item, which may + have a steel material and a I-beam shaped profile curve. - Note that the "profile item" represents a single extrusion in the - profile set, whereas the "profile curve" represents a 2D curve used by a - "profile item". + Note that the "profile item" represents a single extrusion in the + profile set, whereas the "profile curve" represents a 2D curve used by a + "profile item". - In some cases, a profiled element (i.e. beam, column) may be a composite - beam or column and include multiple extrusions. This is rare. The order - of the profiles does not matter. + In some cases, a profiled element (i.e. beam, column) may be a composite + beam or column and include multiple extrusions. This is rare. The order + of the profiles does not matter. - :param profile_set: The IfcMaterialProfileSet that the profile is part of. The - profile set represents a group of profile items. See - ifcopenshell.api.material.add_material_set for more information on - how to add a profile set. - :type profile_set: ifcopenshell.entity_instance - :param material: The IfcMaterial that the profile item is made out of. - :type material: ifcopenshell.entity_instance, optional - :param profile: The IfcProfileDef that represents the 2D cross section - of the the profile item. - :type profile: ifcopenshell.entity_instance, optional - :return: The newly created IfcMaterialProfile - :rtype: ifcopenshell.entity_instance + :param profile_set: The IfcMaterialProfileSet that the profile is part of. The + profile set represents a group of profile items. See + ifcopenshell.api.material.add_material_set for more information on + how to add a profile set. + :type profile_set: ifcopenshell.entity_instance + :param material: The IfcMaterial that the profile item is made out of. + :type material: ifcopenshell.entity_instance, optional + :param profile: The IfcProfileDef that represents the 2D cross section + of the the profile item. + :type profile: ifcopenshell.entity_instance, optional + :return: The newly created IfcMaterialProfile + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we have a steel I-beam. Notice we are assigning to - # the type only, as all occurrences of that type will automatically - # inherit the material. - beam_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBeamType", name="B1") + # Let's imagine we have a steel I-beam. Notice we are assigning to + # the type only, as all occurrences of that type will automatically + # inherit the material. + beam_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBeamType", name="B1") - # First, let's create a material set. This will later be assigned - # to our beam type element. - material_set = ifcopenshell.api.run("material.add_profile_set", model, - name="B1", set_type="IfcMaterialProfileSet") + # First, let's create a material set. This will later be assigned + # to our beam type element. + material_set = ifcopenshell.api.run("material.add_profile_set", model, + name="B1", set_type="IfcMaterialProfileSet") - # Create a steel material. - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + # Create a steel material. + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - # Create an I-beam profile curve. Notice how we name our profiles - # based on standardised steel profile names. - hea100 = self.file.create_entity( - "IfcIShapeProfileDef", ProfileName="HEA100", ProfileType="AREA", - OverallWidth=100, OverallDepth=96, WebThickness=5, FlangeThickness=8, FilletRadius=12, - ) + # Create an I-beam profile curve. Notice how we name our profiles + # based on standardised steel profile names. + hea100 = file.create_entity( + "IfcIShapeProfileDef", ProfileName="HEA100", ProfileType="AREA", + OverallWidth=100, OverallDepth=96, WebThickness=5, FlangeThickness=8, FilletRadius=12, + ) - # Define that steel material and cross section as a single profile - # item. If this were a composite beam, we might add multiple profile - # items instead, but this is rarely the case in most construction. - ifcopenshell.api.run("material.add_profile", model, - profile_set=material_set, material=steel, profile=hea100) + # Define that steel material and cross section as a single profile + # item. If this were a composite beam, we might add multiple profile + # items instead, but this is rarely the case in most construction. + ifcopenshell.api.run("material.add_profile", model, + profile_set=material_set, material=steel, profile=hea100) - # Great! Let's assign our material set to our beam type. - ifcopenshell.api.run("material.assign_material", model, products=[beam_type], material=material_set) - """ - self.file = file - self.settings = {"profile_set": profile_set, "material": material, "profile": profile} + # Great! Let's assign our material set to our beam type. + ifcopenshell.api.run("material.assign_material", model, products=[beam_type], material=material_set) + """ + settings = {"profile_set": profile_set, "material": material, "profile": profile} - def execute(self) -> ifcopenshell.entity_instance: - profiles = list(self.settings["profile_set"].MaterialProfiles or []) - profile = self.file.create_entity("IfcMaterialProfile") - if self.settings["material"]: - profile.Material = self.settings["material"] - if self.settings["profile"]: - profile.Profile = self.settings["profile"] - profiles.append(profile) - self.settings["profile_set"].MaterialProfiles = profiles - return profile + profiles = list(settings["profile_set"].MaterialProfiles or []) + profile = file.create_entity("IfcMaterialProfile") + if settings["material"]: + profile.Material = settings["material"] + if settings["profile"]: + profile.Profile = settings["profile"] + profiles.append(profile) + settings["profile_set"].MaterialProfiles = profiles + return profile diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py index a65a644866..9098ca72fc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py @@ -23,133 +23,135 @@ import ifcopenshell.util.representation from typing import Optional, Union +def assign_material( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + type: str = "IfcMaterial", + material: Optional[ifcopenshell.entity_instance] = None, +) -> Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance], None]: + """Assigns a material to the list of products + + Will unassign previously assigned material. + + When a material is assigned to a product, it means that the product is + made out of that material. In its simplest form, a single material may + be assigned to a product, meaning that the entire product is made out of + that one material. Alternatively, a material set may be assigned to a + product, meaning that the product is made out of a set of materials. + There are three types of sets, including layered construction, profiled + materials, and arbitrary material constituents. See + ifcopenshell.api.material.add_material_set for details. + + Materials are typically assigned to the element types rather than + individual occurrences of elements. Individual occurrences would then + inherit the material from the type. + + If the type has a material set, then the geometry of the occurrences + must comply with the material set. For example, if the type has a + constituent set, then it is expected that all occurrences also inherit + the geometry of the type, which is made out of those constituents. + Alternatively, if the type has a layer set, then all occurrences must + have geometry that has a thickness equal to the sum of all layers. If a + type has a profile set, then all occurrences must has the same profile + extruded along its axis. + + For layers and profiles assigned to types, the occurrences must be + assigned an IfcMaterialLayerSetUsage or an IfcMaterialProfileSetUsage. + This allows individual occurrences to override the layered or profiled + construction offset from a reference line. + + :param products: The list of IfcProducts to assign the material or material set + to. + :type products: list[ifcopenshell.entity_instance] + :param type: Choose from "IfcMaterial", "IfcMaterialConstituentSet", + "IfcMaterialLayerSet", "IfcMaterialLayerSetUsage", + "IfcMaterialProfileSet", "IfcMaterialProfileSetUsage", or + "IfcMaterialList". Note that "Set Usages" may only be assigned to + occurrences, not types. Defaults to "IfcMaterial". + :type type: str + :param material: The IfcMaterial or material set you are assigning here. + If type is Usage then no need to provide `material`, it will be deduced + from the element type automatically. + :type material: ifcopenshell.entity_instance, optional + :return: IfcRelAssociatesMaterial entity + or a list of IfcRelAssociatesMaterial entities + (possible if `type` is Usage + and `products` require different Usages) + or `None` if `products` was empty list. + :rtype: Union[ + ifcopenshell.entity_instance, + list[ifcopenshell.entity_instance], None] + + Example: + + .. code:: python + + # Let's start with a simple concrete material + concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") + + # Let's imagine a concrete bench made out of a single concrete + # material. Let's assign it to the type. + bench_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurnitureType") + ifcopenshell.api.run("material.assign_material", model, + products=[bench_type], type="IfcMaterial", material=concrete) + + # Let's imagine there are a two occurrences of this bench. It's not + # necessary to assign any material to these benches as they + # automatically inherit the material from the type. + bench1 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") + bench2 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") + ifcopenshell.api.run("type.assign_type", model, related_objects=[bench1], relating_type=bench_type) + ifcopenshell.api.run("type.assign_type", model, related_objects=[bench2], relating_type=bench_type) + + # If we have a concrete wall, we should use a layer set. Again, + # let's start with a wall type, not occurrences. + wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType", name="WAL01") + + # Even though there is only one layer in our layer set, we still use + # a layer set because it makes it clear that this is a layered + # construction. Let's say it's a 200mm thick concrete layer. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="CON200", set_type="IfcMaterialLayerSet") + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 200}) + + # Our wall type now has the layer set assigned to it + ifcopenshell.api.run("material.assign_material", model, + products=[wall_type], type="IfcMaterialLayerSet", material=material_set) + + # Let's imagine an occurrence of this wall type. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + ifcopenshell.api.run("type.assign_type", model, related_objects=[wall], relating_type=wall_type) + + # Our wall occurrence needs to have a "set usage" which describes + # how the layers relate to a reference line (typically a 2D line + # representing the extents of the wall). Usages are special since + # they automatically detect the inherited material set from the + # type. You'd write similar code for a profile set. + ifcopenshell.api.run("material.assign_material", model, + products=[wall], type="IfcMaterialLayerSetUsage") + + # To be complete, let's create the wall's axis and body + # representation. Notice how the axis guides the walls "reference + # line" which determines where layers are extruded from, and the + # body has a thickness of 200mm, same as our total layer set + # thickness. + axis = ifcopenshell.api.run("geometry.add_axis_representation", model, + context=axis_context, axis=[(0.0, 0.0), (5000.0, 0.0)]) + body = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body_context, length=5000, height=3000, thickness=200) + ifcopenshell.api.run("geometry.assign_representation", model, product=wall, representation=axis) + ifcopenshell.api.run("geometry.assign_representation", model, product=wall, representation=body) + ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"products": products, "type": type, "material": material} + return usecase.execute() + + class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - type: str = "IfcMaterial", - material: Optional[ifcopenshell.entity_instance] = None, - ): - """Assigns a material to the list of products - - Will unassign previously assigned material. - - When a material is assigned to a product, it means that the product is - made out of that material. In its simplest form, a single material may - be assigned to a product, meaning that the entire product is made out of - that one material. Alternatively, a material set may be assigned to a - product, meaning that the product is made out of a set of materials. - There are three types of sets, including layered construction, profiled - materials, and arbitrary material constituents. See - ifcopenshell.api.material.add_material_set for details. - - Materials are typically assigned to the element types rather than - individual occurrences of elements. Individual occurrences would then - inherit the material from the type. - - If the type has a material set, then the geometry of the occurrences - must comply with the material set. For example, if the type has a - constituent set, then it is expected that all occurrences also inherit - the geometry of the type, which is made out of those constituents. - Alternatively, if the type has a layer set, then all occurrences must - have geometry that has a thickness equal to the sum of all layers. If a - type has a profile set, then all occurrences must has the same profile - extruded along its axis. - - For layers and profiles assigned to types, the occurrences must be - assigned an IfcMaterialLayerSetUsage or an IfcMaterialProfileSetUsage. - This allows individual occurrences to override the layered or profiled - construction offset from a reference line. - - :param products: The list of IfcProducts to assign the material or material set - to. - :type products: list[ifcopenshell.entity_instance] - :param type: Choose from "IfcMaterial", "IfcMaterialConstituentSet", - "IfcMaterialLayerSet", "IfcMaterialLayerSetUsage", - "IfcMaterialProfileSet", "IfcMaterialProfileSetUsage", or - "IfcMaterialList". Note that "Set Usages" may only be assigned to - occurrences, not types. Defaults to "IfcMaterial". - :type type: str - :param material: The IfcMaterial or material set you are assigning here. - If type is Usage then no need to provide `material`, it will be deduced - from the element type automatically. - :type material: ifcopenshell.entity_instance, optional - :return: IfcRelAssociatesMaterial entity - or a list of IfcRelAssociatesMaterial entities - (possible if `type` is Usage - and `products` require different Usages) - or `None` if `products` was empty list. - :rtype: Union[ - ifcopenshell.entity_instance, - list[ifcopenshell.entity_instance], None] - - Example: - - .. code:: python - - # Let's start with a simple concrete material - concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") - - # Let's imagine a concrete bench made out of a single concrete - # material. Let's assign it to the type. - bench_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurnitureType") - ifcopenshell.api.run("material.assign_material", model, - products=[bench_type], type="IfcMaterial", material=concrete) - - # Let's imagine there are a two occurrences of this bench. It's not - # necessary to assign any material to these benches as they - # automatically inherit the material from the type. - bench1 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") - bench2 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") - ifcopenshell.api.run("type.assign_type", model, related_objects=[bench1], relating_type=bench_type) - ifcopenshell.api.run("type.assign_type", model, related_objects=[bench2], relating_type=bench_type) - - # If we have a concrete wall, we should use a layer set. Again, - # let's start with a wall type, not occurrences. - wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType", name="WAL01") - - # Even though there is only one layer in our layer set, we still use - # a layer set because it makes it clear that this is a layered - # construction. Let's say it's a 200mm thick concrete layer. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="CON200", set_type="IfcMaterialLayerSet") - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 200}) - - # Our wall type now has the layer set assigned to it - ifcopenshell.api.run("material.assign_material", model, - products=[wall_type], type="IfcMaterialLayerSet", material=material_set) - - # Let's imagine an occurrence of this wall type. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - ifcopenshell.api.run("type.assign_type", model, related_objects=[wall], relating_type=wall_type) - - # Our wall occurrence needs to have a "set usage" which describes - # how the layers relate to a reference line (typically a 2D line - # representing the extents of the wall). Usages are special since - # they automatically detect the inherited material set from the - # type. You'd write similar code for a profile set. - ifcopenshell.api.run("material.assign_material", model, - products=[wall], type="IfcMaterialLayerSetUsage") - - # To be complete, let's create the wall's axis and body - # representation. Notice how the axis guides the walls "reference - # line" which determines where layers are extruded from, and the - # body has a thickness of 200mm, same as our total layer set - # thickness. - axis = ifcopenshell.api.run("geometry.add_axis_representation", model, - context=axis_context, axis=[(0.0, 0.0), (5000.0, 0.0)]) - body = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body_context, length=5000, height=3000, thickness=200) - ifcopenshell.api.run("geometry.assign_representation", model, product=wall, representation=axis) - ifcopenshell.api.run("geometry.assign_representation", model, product=wall, representation=body) - ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) - """ - self.file = file - self.settings = {"products": products, "type": type, "material": material} - - def execute(self) -> Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance], None]: + def execute(self): self.products: set[ifcopenshell.entity_instance] = set(self.settings["products"]) if not self.products: return diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py index 4d1678a0ae..15c7e4d779 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py @@ -19,78 +19,81 @@ import ifcopenshell.util.representation +def assign_profile(file, material_profile=None, profile=None) -> None: + """Changes the profile curve of a material profile item in a profile set + + In addition to changing the profile curve, it will also change the + profile curve used in any body representation extrusions. + + :param material_profile: The IfcMaterialProfile to change the profile + curve of. See ifcopenshell.api.material.add_profile to see how to + create profiles. + :type material_profile: ifcopenshell.entity_instance + :param profile: The IfcProfileDef to set the profile item's curve to. + :type profile: ifcopenshell.entity_instance + :return: None + :rtype: None + + Example: + + .. code:: python + + # Let's imagine we have a steel I-beam. Notice we are assigning to + # the type only, as all occurrences of that type will automatically + # inherit the material. + beam_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBeamType", name="B1") + + # First, let's create a material set. This will later be assigned + # to our beam type element. + material_set = ifcopenshell.api.run("material.add_profile_set", model, + name="B1", set_type="IfcMaterialProfileSet") + + # Create a steel material. + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + + # Create an I-beam profile curve. Notice how we name our profiles + # based on standardised steel profile names. + hea100 = usecase.file.create_entity( + "IfcIShapeProfileDef", ProfileName="HEA100", ProfileType="AREA", + OverallWidth=100, OverallDepth=96, WebThickness=5, FlangeThickness=8, FilletRadius=12, + ) + + # Define that steel material and cross section as a single profile + # item. If this were a composite beam, we might add multiple profile + # items instead, but this is rarely the case in most construction. + profile_item = ifcopenshell.api.run("material.add_profile", model, + profile_set=material_set, material=steel, profile=hea100) + + # Great! Let's assign our material set to our beam type. + ifcopenshell.api.run("material.assign_material", model, products=[beam_type], material=material_set) + + # Let's create an occurrence of this beam. + beam = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBeam", name="B1.01") + ifcopenshell.api.run("material.assign_material", model, + products=[beam], type="IfcMaterialProfileSetUsage") + + # Let's give a 1000mm long beam body representation. + body = ifcopenshell.api.run("geometry.add_profile_representation", + context=body_context, profile=hea100, depth=1000) + ifcopenshell.api.run("geometry.assign_representation", model, product=beam, representation=body) + ifcopenshell.api.run("geometry.edit_object_placement", model, product=beam) + + # Now let's change the profile to a HEA200 standard profile instead. + # This will automatically change the body representation that we + # just added as well to a HEA200 profile. + hea200 = usecase.file.create_entity( + "IfcIShapeProfileDef", ProfileName="HEA200", ProfileType="AREA", + OverallWidth=200, OverallDepth=190, WebThickness=6.5, FlangeThickness=10, FilletRadius=18, + ) + ifcopenshell.api.run("material.assign_profile", model, material_profile=profile_item, profile=hea200) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"material_profile": material_profile, "profile": profile} + return usecase.execute() + + class Usecase: - def __init__(self, file, material_profile=None, profile=None): - """Changes the profile curve of a material profile item in a profile set - - In addition to changing the profile curve, it will also change the - profile curve used in any body representation extrusions. - - :param material_profile: The IfcMaterialProfile to change the profile - curve of. See ifcopenshell.api.material.add_profile to see how to - create profiles. - :type material_profile: ifcopenshell.entity_instance - :param profile: The IfcProfileDef to set the profile item's curve to. - :type profile: ifcopenshell.entity_instance - :return: None - :rtype: None - - Example: - - .. code:: python - - # Let's imagine we have a steel I-beam. Notice we are assigning to - # the type only, as all occurrences of that type will automatically - # inherit the material. - beam_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBeamType", name="B1") - - # First, let's create a material set. This will later be assigned - # to our beam type element. - material_set = ifcopenshell.api.run("material.add_profile_set", model, - name="B1", set_type="IfcMaterialProfileSet") - - # Create a steel material. - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - - # Create an I-beam profile curve. Notice how we name our profiles - # based on standardised steel profile names. - hea100 = self.file.create_entity( - "IfcIShapeProfileDef", ProfileName="HEA100", ProfileType="AREA", - OverallWidth=100, OverallDepth=96, WebThickness=5, FlangeThickness=8, FilletRadius=12, - ) - - # Define that steel material and cross section as a single profile - # item. If this were a composite beam, we might add multiple profile - # items instead, but this is rarely the case in most construction. - profile_item = ifcopenshell.api.run("material.add_profile", model, - profile_set=material_set, material=steel, profile=hea100) - - # Great! Let's assign our material set to our beam type. - ifcopenshell.api.run("material.assign_material", model, products=[beam_type], material=material_set) - - # Let's create an occurrence of this beam. - beam = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBeam", name="B1.01") - ifcopenshell.api.run("material.assign_material", model, - products=[beam], type="IfcMaterialProfileSetUsage") - - # Let's give a 1000mm long beam body representation. - body = ifcopenshell.api.run("geometry.add_profile_representation", - context=body_context, profile=hea100, depth=1000) - ifcopenshell.api.run("geometry.assign_representation", model, product=beam, representation=body) - ifcopenshell.api.run("geometry.edit_object_placement", model, product=beam) - - # Now let's change the profile to a HEA200 standard profile instead. - # This will automatically change the body representation that we - # just added as well to a HEA200 profile. - hea200 = self.file.create_entity( - "IfcIShapeProfileDef", ProfileName="HEA200", ProfileType="AREA", - OverallWidth=200, OverallDepth=190, WebThickness=6.5, FlangeThickness=10, FilletRadius=18, - ) - ifcopenshell.api.run("material.assign_profile", model, material_profile=profile_item, profile=hea200) - """ - self.file = file - self.settings = {"material_profile": material_profile, "profile": profile} - def execute(self): # TODO: handle composite profiles old_profile = self.settings["material_profile"].Profile diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py index 8dac43b8e0..c862e9cb4b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py @@ -20,45 +20,42 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, material=None): - """Copies a material +def copy_material(file, material=None) -> None: + """Copies a material - All material psets and styles are copied. The copied material is not - associated to any elements. + All material psets and styles are copied. The copied material is not + associated to any elements. - :param material: The IfcMaterial to copy - :type material: ifcopenshell.entity_instance - :return: The new copy of the material - :rtype: ifcopenshell.entity_instance + :param material: The IfcMaterial to copy + :type material: ifcopenshell.entity_instance + :return: The new copy of the material + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") + concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") - # Let's duplicate the concrete material - concrete_copy = ifcopenshell.api.run("material.copy_material", model, material=concrete) - """ - self.file = file - self.settings = {"material": material} + # Let's duplicate the concrete material + concrete_copy = ifcopenshell.api.run("material.copy_material", model, material=concrete) + """ + settings = {"material": material} - def execute(self): - if self.settings["material"].is_a("IfcMaterial"): - new = ifcopenshell.util.element.copy(self.file, self.settings["material"]) - for inverse in self.file.get_inverse(self.settings["material"]): - if inverse.is_a("IfcMaterialProperties"): - # Properties must not be shared between objects for convenience of authoring - inverse = ifcopenshell.util.element.copy(self.file, inverse) - properties = [] - for pset in inverse.Properties: - properties.append(ifcopenshell.util.element.copy_deep(self.file, pset)) - inverse.Properties = properties - inverse.Material = new - elif inverse.is_a("IfcMaterialDefinitionRepresentation"): - inverse = ifcopenshell.util.element.copy_deep( - self.file, inverse, exclude=["IfcRepresentationContext", "IfcMaterial"] - ) - inverse.RepresentedMaterial = new - return new + if settings["material"].is_a("IfcMaterial"): + new = ifcopenshell.util.element.copy(file, settings["material"]) + for inverse in file.get_inverse(settings["material"]): + if inverse.is_a("IfcMaterialProperties"): + # Properties must not be shared between objects for convenience of authoring + inverse = ifcopenshell.util.element.copy(file, inverse) + properties = [] + for pset in inverse.Properties: + properties.append(ifcopenshell.util.element.copy_deep(file, pset)) + inverse.Properties = properties + inverse.Material = new + elif inverse.is_a("IfcMaterialDefinitionRepresentation"): + inverse = ifcopenshell.util.element.copy_deep( + file, inverse, exclude=["IfcRepresentationContext", "IfcMaterial"] + ) + inverse.RepresentedMaterial = new + return new diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py index 3e3a03dbd8..3102d5a645 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py @@ -17,31 +17,28 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, element=None, attributes=None): - """Edits the attributes of an IfcMaterial +def edit_assigned_material(file, element=None, attributes=None) -> None: + """Edits the attributes of an IfcMaterial - For more information about the attributes and data types of an - IfcMaterial, consult the IFC documentation. + For more information about the attributes and data types of an + IfcMaterial, consult the IFC documentation. - :param element: The IfcMaterial entity you want to edit - :type element: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param element: The IfcMaterial entity you want to edit + :type element: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") - ifcopenshell.api.run("material.edit_assigned_material", model, - element=concrete, attributes={"Description": "40MPA concrete with broom finish"}) - """ - self.file = file - self.settings = {"element": element, "attributes": attributes or {}} + concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") + ifcopenshell.api.run("material.edit_assigned_material", model, + element=concrete, attributes={"Description": "40MPA concrete with broom finish"}) + """ + settings = {"element": element, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["element"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["element"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py index ef036527a3..998bef98bd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py @@ -17,52 +17,49 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, constituent=None, attributes=None, material=None): - """Edits the attributes of an IfcMaterialConstituent +def edit_constituent(file, constituent=None, attributes=None, material=None) -> None: + """Edits the attributes of an IfcMaterialConstituent - For more information about the attributes and data types of an - IfcMaterialConstituent, consult the IFC documentation. + For more information about the attributes and data types of an + IfcMaterialConstituent, consult the IFC documentation. - :param constituent: The IfcMaterialConstituent entity you want to edit - :type constituent: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :param material: The IfcMaterial entity you want to change the constituent to - :type material: ifcopenshell.entity_instance, optional - :return: None - :rtype: None + :param constituent: The IfcMaterialConstituent entity you want to edit + :type constituent: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :param material: The IfcMaterial entity you want to change the constituent to + :type material: ifcopenshell.entity_instance, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's add two materials - aluminium1 = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") - aluminium2 = ifcopenshell.api.run("material.add_material", model, name="AL02", category="aluminium") - glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") + # Let's add two materials + aluminium1 = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") + aluminium2 = ifcopenshell.api.run("material.add_material", model, name="AL02", category="aluminium") + glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="Window", set_type="IfcMaterialConstituentSet") + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="Window", set_type="IfcMaterialConstituentSet") - # Set up two constituents, one for the frame and the other for the glazing. - framing = ifcopenshell.api.run("material.add_constituent", model, - constituent_set=material_set, material=aluminium1) - glazing = ifcopenshell.api.run("material.add_constituent", model, - constituent_set=material_set, material=glass) + # Set up two constituents, one for the frame and the other for the glazing. + framing = ifcopenshell.api.run("material.add_constituent", model, + constituent_set=material_set, material=aluminium1) + glazing = ifcopenshell.api.run("material.add_constituent", model, + constituent_set=material_set, material=glass) - # Let's make sure this constituent refers to the framing of the - # window and uses the second aluminium material instead. - ifcopenshell.api.run("material.edit_constituent", model, - constituent=framing, attributes={"Name": "Framing"}, material=aluminium2) + # Let's make sure this constituent refers to the framing of the + # window and uses the second aluminium material instead. + ifcopenshell.api.run("material.edit_constituent", model, + constituent=framing, attributes={"Name": "Framing"}, material=aluminium2) - ifcopenshell.api.run("material.edit_constituent", model, - constituent=constituent, attributes={"Name": "Glazing"}) - """ - self.file = file - self.settings = {"constituent": constituent, "attributes": attributes or {}, "material": material} + ifcopenshell.api.run("material.edit_constituent", model, + constituent=constituent, attributes={"Name": "Glazing"}) + """ + settings = {"constituent": constituent, "attributes": attributes or {}, "material": material} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["constituent"], name, value) - self.settings["constituent"].Material = self.settings["material"] + for name, value in settings["attributes"].items(): + setattr(settings["constituent"], name, value) + settings["constituent"].Material = settings["material"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py index 3e31194452..78ce15132f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py @@ -17,51 +17,48 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, layer=None, attributes=None, material=None): - """Edits the attributes of an IfcMaterialLayer +def edit_layer(file, layer=None, attributes=None, material=None) -> None: + """Edits the attributes of an IfcMaterialLayer - For more information about the attributes and data types of an - IfcMaterialLayer, consult the IFC documentation. + For more information about the attributes and data types of an + IfcMaterialLayer, consult the IFC documentation. - :param layer: The IfcMaterialLayer entity you want to edit - :type layer: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :param material: The IfcMaterial entity you want the layer to be made - from. - :type material: ifcopenshell.entity_instance, optional - :return: None - :rtype: None + :param layer: The IfcMaterialLayer entity you want to edit + :type layer: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :param material: The IfcMaterial entity you want the layer to be made + from. + :type material: ifcopenshell.entity_instance, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's create two materials typically used for steel stud partition - # walls with gypsum lining. - gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + # Let's create two materials typically used for steel stud partition + # walls with gypsum lining. + gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - # Create a material layer set to contain our layers. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="GYP-ST-GYP", set_type="IfcMaterialLayerSet") + # Create a material layer set to contain our layers. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="GYP-ST-GYP", set_type="IfcMaterialLayerSet") - # Now let's use those materials as three layers in our set, such - # that the steel studs are sandwiched by the gypsum. Let's imagine - # we're setting the layer thickness in millimeters. - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 92}) - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) - """ - self.file = file - self.settings = {"layer": layer, "attributes": attributes or {}, "material": material} + # Now let's use those materials as three layers in our set, such + # that the steel studs are sandwiched by the gypsum. Let's imagine + # we're setting the layer thickness in millimeters. + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 92}) + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 13}) + """ + settings = {"layer": layer, "attributes": attributes or {}, "material": material} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["layer"], name, value) - if self.settings["material"]: - self.settings["layer"].Material = self.settings["material"] + for name, value in settings["attributes"].items(): + setattr(settings["layer"], name, value) + if settings["material"]: + settings["layer"].Material = settings["material"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py index a30fa39f21..9204728004 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py @@ -17,66 +17,63 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, usage=None, attributes=None): - """Edits the attributes of an IfcMaterialLayerSetUsage +def edit_layer_usage(file, usage=None, attributes=None) -> None: + """Edits the attributes of an IfcMaterialLayerSetUsage - This is typically used to change the offset from the reference line to - the layers. + This is typically used to change the offset from the reference line to + the layers. - For more information about the attributes and data types of an - IfcMaterialLayerSetUsage, consult the IFC documentation. + For more information about the attributes and data types of an + IfcMaterialLayerSetUsage, consult the IFC documentation. - :param usage: The IfcMaterialLayerSetUsage entity you want to edit - :type usage: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param usage: The IfcMaterialLayerSetUsage entity you want to edit + :type usage: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's start with a simple concrete material - concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") + # Let's start with a simple concrete material + concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") - # If we have a concrete wall, we should use a layer set. Again, - # let's start with a wall type, not occurrences. - wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType", name="WAL01") + # If we have a concrete wall, we should use a layer set. Again, + # let's start with a wall type, not occurrences. + wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType", name="WAL01") - # Even though there is only one layer in our layer set, we still use - # a layer set because it makes it clear that this is a layered - # construction. Let's say it's a 200mm thick concrete layer. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="CON200", set_type="IfcMaterialLayerSet") - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 200}) + # Even though there is only one layer in our layer set, we still use + # a layer set because it makes it clear that this is a layered + # construction. Let's say it's a 200mm thick concrete layer. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="CON200", set_type="IfcMaterialLayerSet") + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": 200}) - # Our wall type now has the layer set assigned to it - ifcopenshell.api.run("material.assign_material", model, - products=[wall_type], type="IfcMaterialLayerSet", material=material_set) + # Our wall type now has the layer set assigned to it + ifcopenshell.api.run("material.assign_material", model, + products=[wall_type], type="IfcMaterialLayerSet", material=material_set) - # Let's imagine an occurrence of this wall type. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - ifcopenshell.api.run("type.assign_type", model, related_objects=[wall], relating_type=wall_type) + # Let's imagine an occurrence of this wall type. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + ifcopenshell.api.run("type.assign_type", model, related_objects=[wall], relating_type=wall_type) - # Our wall occurrence needs to have a "set usage" which describes - # how the layers relate to a reference line (typically a 2D line - # representing the extents of the wall). Usages are special since - # they automatically detect the inherited material set from the - # type. You'd write similar code for a profile set. - rel = ifcopenshell.api.run("material.assign_material", model, - products=[wall], type="IfcMaterialLayerSetUsage") + # Our wall occurrence needs to have a "set usage" which describes + # how the layers relate to a reference line (typically a 2D line + # representing the extents of the wall). Usages are special since + # they automatically detect the inherited material set from the + # type. You'd write similar code for a profile set. + rel = ifcopenshell.api.run("material.assign_material", model, + products=[wall], type="IfcMaterialLayerSetUsage") - # Let's change the offset from the reference line to be 200mm - # instead of the default of 0mm. - ifcopenshell.api.run("material.edit_layer_usage", model, - usage=rel.RelatingMaterial, attributes={"OffsetFromReferenceLine": 200}) - """ - self.file = file - self.settings = {"usage": usage, "attributes": attributes or {}} + # Let's change the offset from the reference line to be 200mm + # instead of the default of 0mm. + ifcopenshell.api.run("material.edit_layer_usage", model, + usage=rel.RelatingMaterial, attributes={"OffsetFromReferenceLine": 200}) + """ + settings = {"usage": usage, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["usage"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["usage"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_material.py index c712af15ac..87b3f2c7fb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_material.py @@ -17,13 +17,10 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, material=None, attributes=None): - """Edits the attributes of an IfcMaterial""" - - self.file = file - self.settings = {"material": material, "attributes": attributes or {}} +def edit_material(file, material=None, attributes=None) -> None: + """Edits the attributes of an IfcMaterial""" - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["material"], name, value) + settings = {"material": material, "attributes": attributes or {}} + + for name, value in settings["attributes"].items(): + setattr(settings["material"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py index 6fc781f9a6..aa1310dbca 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py @@ -17,72 +17,69 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, profile=None, attributes=None, profile_def=None, material=None): - """Edits the attributes of an IfcMaterialProfile +def edit_profile(file, profile=None, attributes=None, profile_def=None, material=None) -> None: + """Edits the attributes of an IfcMaterialProfile - For more information about the attributes and data types of an - IfcMaterialProfile, consult the IFC documentation. + For more information about the attributes and data types of an + IfcMaterialProfile, consult the IFC documentation. - :param profile: The IfcMaterialProfile entity you want to edit - :type profile: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :param profile_def: The IfcProfileDef entity the profile curve should be - extruded from. - :type profile_def: ifcopenshell.entity_instance, optional - :param material: The IfcMaterial entity you want to change the profile - to be made from. - :type material: ifcopenshell.entity_instance, optional - :return: None - :rtype: None + :param profile: The IfcMaterialProfile entity you want to edit + :type profile: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :param profile_def: The IfcProfileDef entity the profile curve should be + extruded from. + :type profile_def: ifcopenshell.entity_instance, optional + :param material: The IfcMaterial entity you want to change the profile + to be made from. + :type material: ifcopenshell.entity_instance, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's create a material set to store our profiles. - material_set = ifcopenshell.api.run("material.add_profile_set", model, - name="B1", set_type="IfcMaterialProfileSet") + # Let's create a material set to store our profiles. + material_set = ifcopenshell.api.run("material.add_profile_set", model, + name="B1", set_type="IfcMaterialProfileSet") - # Create a couple steel materials. - steel1 = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - steel2 = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + # Create a couple steel materials. + steel1 = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + steel2 = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - # Create some I-shaped profiles. Notice how we name our profiles based - # on standardised steel profile names. - hea100 = self.file.create_entity( - "IfcIShapeProfileDef", ProfileName="HEA100", ProfileType="AREA", - OverallWidth=100, OverallDepth=96, WebThickness=5, FlangeThickness=8, FilletRadius=12, - ) - hea200 = self.file.create_entity( - "IfcIShapeProfileDef", ProfileName="HEA200", ProfileType="AREA", - OverallWidth=200, OverallDepth=190, WebThickness=6.5, FlangeThickness=10, FilletRadius=18, - ) + # Create some I-shaped profiles. Notice how we name our profiles based + # on standardised steel profile names. + hea100 = file.create_entity( + "IfcIShapeProfileDef", ProfileName="HEA100", ProfileType="AREA", + OverallWidth=100, OverallDepth=96, WebThickness=5, FlangeThickness=8, FilletRadius=12, + ) + hea200 = file.create_entity( + "IfcIShapeProfileDef", ProfileName="HEA200", ProfileType="AREA", + OverallWidth=200, OverallDepth=190, WebThickness=6.5, FlangeThickness=10, FilletRadius=18, + ) - # Define that steel material and cross section as a single profile - # item. If this were a composite beam, we might add multiple profile - # items instead, but this is rarely the case in most construction. - profile_item = ifcopenshell.api.run("material.add_profile", model, - profile_set=material_set, material=steel1, profile=hea100) + # Define that steel material and cross section as a single profile + # item. If this were a composite beam, we might add multiple profile + # items instead, but this is rarely the case in most construction. + profile_item = ifcopenshell.api.run("material.add_profile", model, + profile_set=material_set, material=steel1, profile=hea100) - # Edit our profile item to use a HEA200 profile instead made out of - # another type of steel. - ifcopenshell.api.run("material.edit_profile", model, - profile=profile_item, profile_def=hea200, material=steel2) - """ - self.file = file - self.settings = { - "profile": profile, - "attributes": attributes or {}, - "profile_def": profile_def, - "material": material, - } + # Edit our profile item to use a HEA200 profile instead made out of + # another type of steel. + ifcopenshell.api.run("material.edit_profile", model, + profile=profile_item, profile_def=hea200, material=steel2) + """ + settings = { + "profile": profile, + "attributes": attributes or {}, + "profile_def": profile_def, + "material": material, + } - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["profile"], name, value) - if self.settings["material"]: - self.settings["profile"].Material = self.settings["material"] - if self.settings["profile_def"]: - self.settings["profile"].Profile = self.settings["profile_def"] + for name, value in settings["attributes"].items(): + setattr(settings["profile"], name, value) + if settings["material"]: + settings["profile"].Material = settings["material"] + if settings["profile_def"]: + settings["profile"].Profile = settings["profile_def"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py index afd9007c7b..8ad5192570 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py @@ -20,79 +20,82 @@ import ifcopenshell.geom import ifcopenshell.util.representation +def edit_profile_usage(file, usage=None, attributes=None) -> None: + """Edits the attributes of an IfcMaterialProfileSetUsage + + This is typically used to change the cardinal point of the profile. + The cardinal point represents whether the profile is extruded along the + center of the axis line, at a corner, at a shear center, at the bottom, + top, etc. + + For more information about the attributes and data types of an + IfcMaterialProfileSetUsage, consult the IFC documentation. + + :param usage: The IfcMaterialProfileSetUsage entity you want to edit + :type usage: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None + + Example: + + .. code:: python + + # Let's imagine we have a steel I-beam. Notice we are assigning to + # the type only, as all occurrences of that type will automatically + # inherit the material. + beam_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBeamType", name="B1") + + # First, let's create a material set. This will later be assigned + # to our beam type element. + material_set = ifcopenshell.api.run("material.add_profile_set", model, + name="B1", set_type="IfcMaterialProfileSet") + + # Create a steel material. + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + + # Create an I-beam profile curve. Notice how we name our profiles + # based on standardised steel profile names. + hea100 = usecase.file.create_entity( + "IfcIShapeProfileDef", ProfileName="HEA100", ProfileType="AREA", + OverallWidth=100, OverallDepth=96, WebThickness=5, FlangeThickness=8, FilletRadius=12, + ) + + # Define that steel material and cross section as a single profile + # item. If this were a composite beam, we might add multiple profile + # items instead, but this is rarely the case in most construction. + profile_item = ifcopenshell.api.run("material.add_profile", model, + profile_set=material_set, material=steel, profile=hea100) + + # Great! Let's assign our material set to our beam type. + ifcopenshell.api.run("material.assign_material", model, products=[beam_type], material=material_set) + + # Let's create an occurrence of this beam. + beam = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBeam", name="B1.01") + rel = ifcopenshell.api.run("material.assign_material", model, + products=[beam], type="IfcMaterialProfileSetUsage") + + # Let's give a 1000mm long beam body representation. + body = ifcopenshell.api.run("geometry.add_profile_representation", + context=body_context, profile=hea100, depth=1000) + ifcopenshell.api.run("geometry.assign_representation", model, product=beam, representation=body) + ifcopenshell.api.run("geometry.edit_object_placement", model, product=beam) + + # Let's change the cardinal point to be the top center of the axis + # line. This is represented by the number "8". Consult the IFC + # documentation for all the numbers you can use. + ifcopenshell.api.run("material.edit_profile_usage", model, + usage=rel.RelatingMaterial, attributes={"CardinalPoint": 8}) + """ + usecase = Usecase() + + usecase.file = file + usecase.settings = {"usage": usage, "attributes": attributes or {}} + return usecase.execute() + + class Usecase: - def __init__(self, file, usage=None, attributes=None): - """Edits the attributes of an IfcMaterialProfileSetUsage - - This is typically used to change the cardinal point of the profile. - The cardinal point represents whether the profile is extruded along the - center of the axis line, at a corner, at a shear center, at the bottom, - top, etc. - - For more information about the attributes and data types of an - IfcMaterialProfileSetUsage, consult the IFC documentation. - - :param usage: The IfcMaterialProfileSetUsage entity you want to edit - :type usage: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None - - Example: - - .. code:: python - - # Let's imagine we have a steel I-beam. Notice we are assigning to - # the type only, as all occurrences of that type will automatically - # inherit the material. - beam_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBeamType", name="B1") - - # First, let's create a material set. This will later be assigned - # to our beam type element. - material_set = ifcopenshell.api.run("material.add_profile_set", model, - name="B1", set_type="IfcMaterialProfileSet") - - # Create a steel material. - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - - # Create an I-beam profile curve. Notice how we name our profiles - # based on standardised steel profile names. - hea100 = self.file.create_entity( - "IfcIShapeProfileDef", ProfileName="HEA100", ProfileType="AREA", - OverallWidth=100, OverallDepth=96, WebThickness=5, FlangeThickness=8, FilletRadius=12, - ) - - # Define that steel material and cross section as a single profile - # item. If this were a composite beam, we might add multiple profile - # items instead, but this is rarely the case in most construction. - profile_item = ifcopenshell.api.run("material.add_profile", model, - profile_set=material_set, material=steel, profile=hea100) - - # Great! Let's assign our material set to our beam type. - ifcopenshell.api.run("material.assign_material", model, products=[beam_type], material=material_set) - - # Let's create an occurrence of this beam. - beam = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBeam", name="B1.01") - rel = ifcopenshell.api.run("material.assign_material", model, - products=[beam], type="IfcMaterialProfileSetUsage") - - # Let's give a 1000mm long beam body representation. - body = ifcopenshell.api.run("geometry.add_profile_representation", - context=body_context, profile=hea100, depth=1000) - ifcopenshell.api.run("geometry.assign_representation", model, product=beam, representation=body) - ifcopenshell.api.run("geometry.edit_object_placement", model, product=beam) - - # Let's change the cardinal point to be the top center of the axis - # line. This is represented by the number "8". Consult the IFC - # documentation for all the numbers you can use. - ifcopenshell.api.run("material.edit_profile_usage", model, - usage=rel.RelatingMaterial, attributes={"CardinalPoint": 8}) - """ - - self.file = file - self.settings = {"usage": usage, "attributes": attributes or {}} - def execute(self): self.cardinal_point = self.settings["attributes"].get("CardinalPoint") if self.cardinal_point and self.cardinal_point != self.settings["usage"].CardinalPoint: diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py index 2fb919d10d..02256e0695 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py @@ -17,42 +17,39 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, constituent=None): - """Removes a constituent from a constituent set +def remove_constituent(file, constituent=None) -> None: + """Removes a constituent from a constituent set - Note that it is invalid to have zero items in a set, so you should leave - at least one constituent to ensure a valid IFC dataset. + Note that it is invalid to have zero items in a set, so you should leave + at least one constituent to ensure a valid IFC dataset. - :param constituent: The IfcMaterialConstituent entity you want to remove - :type constituent: ifcopenshell.entity_instance - :return: None - :rtype: None + :param constituent: The IfcMaterialConstituent entity you want to remove + :type constituent: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Create a material set for windows made out of aluminium and glass. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="Window", set_type="IfcMaterialConstituentSet") + # Create a material set for windows made out of aluminium and glass. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="Window", set_type="IfcMaterialConstituentSet") - aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") - glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") + aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") + glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") - # Now let's use those materials as two constituents in our set. - framing = ifcopenshell.api.run("material.add_constituent", model, - constituent_set=material_set, material=aluminium) - glazing = ifcopenshell.api.run("material.add_constituent", model, - constituent_set=material_set, material=glass) + # Now let's use those materials as two constituents in our set. + framing = ifcopenshell.api.run("material.add_constituent", model, + constituent_set=material_set, material=aluminium) + glazing = ifcopenshell.api.run("material.add_constituent", model, + constituent_set=material_set, material=glass) - # Let's remove the glass constituent. Note that we should not remove - # the framing, at this would mean there are no constituents which is - # invalid. - ifcopenshell.api.run("material.remove_constituent", model, constituent=glazing) - """ - self.file = file - self.settings = {"constituent": constituent} + # Let's remove the glass constituent. Note that we should not remove + # the framing, at this would mean there are no constituents which is + # invalid. + ifcopenshell.api.run("material.remove_constituent", model, constituent=glazing) + """ + settings = {"constituent": constituent} - def execute(self): - self.file.remove(self.settings["constituent"]) + file.remove(settings["constituent"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py index f068641533..fda5cf2151 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py @@ -17,45 +17,42 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, layer=None): - """Removes a layer from a layer set +def remove_layer(file, layer=None) -> None: + """Removes a layer from a layer set - Note that it is invalid to have zero items in a set, so you should leave - at least one layer to ensure a valid IFC dataset. + Note that it is invalid to have zero items in a set, so you should leave + at least one layer to ensure a valid IFC dataset. - :param layer: The IfcMaterialLayer entity you want to remove - :type layer: ifcopenshell.entity_instance - :return: None - :rtype: None + :param layer: The IfcMaterialLayer entity you want to remove + :type layer: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Create a material set for steel stud partition walls. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="Window", set_type="IfcMaterialConstituentSet") + # Create a material set for steel stud partition walls. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="Window", set_type="IfcMaterialConstituentSet") - gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - # Now let's use those materials as three layers in our set, such - # that the steel studs are sandwiched by the gypsum. Let's imagine - # we're setting the layer thickness in millimeters. - layer1 = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - ifcopenshell.api.run("material.edit_layer", model, layer=layer1, attributes={"LayerThickness": 13}) - layer2 = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) - ifcopenshell.api.run("material.edit_layer", model, layer=layer2, attributes={"LayerThickness": 92}) - layer3 = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - ifcopenshell.api.run("material.edit_layer", model, layer=layer3, attributes={"LayerThickness": 13}) + # Now let's use those materials as three layers in our set, such + # that the steel studs are sandwiched by the gypsum. Let's imagine + # we're setting the layer thickness in millimeters. + layer1 = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + ifcopenshell.api.run("material.edit_layer", model, layer=layer1, attributes={"LayerThickness": 13}) + layer2 = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) + ifcopenshell.api.run("material.edit_layer", model, layer=layer2, attributes={"LayerThickness": 92}) + layer3 = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + ifcopenshell.api.run("material.edit_layer", model, layer=layer3, attributes={"LayerThickness": 13}) - # Let's remove the last layer, such that the wall might be clad only - # one one side such as to line a services riser. - ifcopenshell.api.run("material.remove_layer", model, layer=layer3) - """ - self.file = file - self.settings = {"layer": layer} + # Let's remove the last layer, such that the wall might be clad only + # one one side such as to line a services riser. + ifcopenshell.api.run("material.remove_layer", model, layer=layer3) + """ + settings = {"layer": layer} - def execute(self): - self.file.remove(self.settings["layer"]) + file.remove(settings["layer"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py index 276d9e64d2..a41b6ec7a8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py @@ -19,44 +19,41 @@ import ifcopenshell -class Usecase: - def __init__(self, file, material_list=None, material_index=0): - """Removes an item in an material list +def remove_list_item(file, material_list=None, material_index=0) -> None: + """Removes an item in an material list - Note that it is invalid to have zero items in a list, so you should leave - at least one item to ensure a valid IFC dataset. + Note that it is invalid to have zero items in a list, so you should leave + at least one item to ensure a valid IFC dataset. - :param material_list: The IfcMaterialList entity you want to remove an - item from. - :type material_list: ifcopenshell.entity_instance - :param material_index: The index of the material you want to remove from - the list. Starts counting at 0. Defaults to 0. - :type material_index: int, optional - :return: None - :rtype: None + :param material_list: The IfcMaterialList entity you want to remove an + item from. + :type material_list: ifcopenshell.entity_instance + :param material_index: The index of the material you want to remove from + the list. Starts counting at 0. Defaults to 0. + :type material_index: int, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Create a material list for aluminium windows. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="Window", set_type="IfcMaterialMaterialList") + # Create a material list for aluminium windows. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="Window", set_type="IfcMaterialMaterialList") - aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") - glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") + aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") + glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") - # Now let's use those materials as two items in our list. - ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=aluminium) - ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=glass) + # Now let's use those materials as two items in our list. + ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=aluminium) + ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=glass) - # Let's remove the glass - ifcopenshell.api.run("material.remove_list_item", model, material_list=material_set, material_index=1) - """ - self.file = file - self.settings = {"material_list": material_list, "material_index": material_index} + # Let's remove the glass + ifcopenshell.api.run("material.remove_list_item", model, material_list=material_set, material_index=1) + """ + settings = {"material_list": material_list, "material_index": material_index} - def execute(self): - materials = list(self.settings["material_list"].Materials) - materials.pop(self.settings["material_index"]) - self.settings["material_list"].Materials = materials + materials = list(settings["material_list"].Materials) + materials.pop(settings["material_index"]) + settings["material_list"].Materials = materials diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py index ffdf9693d8..a59fee6caf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py @@ -20,57 +20,54 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, material=None): - """Removes a material +def remove_material(file, material=None) -> None: + """Removes a material - If the material is used in a material set, the corresponding layer, - profile, or constituent is also removed. Note that this may result in a - material set with zero items in it, which is invalid, so the user must - take care of this situation themselves. + If the material is used in a material set, the corresponding layer, + profile, or constituent is also removed. Note that this may result in a + material set with zero items in it, which is invalid, so the user must + take care of this situation themselves. - :param material: The IfcMaterial entity you want to remove - :type material: ifcopenshell.entity_instance - :return: None - :rtype: None + :param material: The IfcMaterial entity you want to remove + :type material: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Create a material - aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") + # Create a material + aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") - # ... and remove it - ifcopenshell.api.run("material.remove_material", model, material=aluminium) - """ - self.file = file - self.settings = {"material": material} + # ... and remove it + ifcopenshell.api.run("material.remove_material", model, material=aluminium) + """ + settings = {"material": material} - def execute(self): - inverse_elements = self.file.get_inverse(self.settings["material"]) - self.file.remove(self.settings["material"]) - # TODO: Right now, we we choose only to delete set items (e.g. a layer) but not the material set - # This can lead to invalid material sets, but we assume the user will deal with it - for inverse in inverse_elements: - if inverse.is_a("IfcMaterialConstituent"): - self.file.remove(inverse) - elif inverse.is_a("IfcMaterialLayer"): - self.file.remove(inverse) - elif inverse.is_a("IfcMaterialProfile"): - self.file.remove(inverse) - elif inverse.is_a("IfcRelAssociatesMaterial"): - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcMaterialProperties"): - for prop in inverse.Properties or []: - self.file.remove(prop) - self.file.remove(inverse) - elif inverse.is_a("IfcMaterialDefinitionRepresentation"): - for representation in inverse.Representations: - for item in representation.Items: - self.file.remove(item) - self.file.remove(representation) - self.file.remove(inverse) + inverse_elements = file.get_inverse(settings["material"]) + file.remove(settings["material"]) + # TODO: Right now, we we choose only to delete set items (e.g. a layer) but not the material set + # This can lead to invalid material sets, but we assume the user will deal with it + for inverse in inverse_elements: + if inverse.is_a("IfcMaterialConstituent"): + file.remove(inverse) + elif inverse.is_a("IfcMaterialLayer"): + file.remove(inverse) + elif inverse.is_a("IfcMaterialProfile"): + file.remove(inverse) + elif inverse.is_a("IfcRelAssociatesMaterial"): + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcMaterialProperties"): + for prop in inverse.Properties or []: + file.remove(prop) + file.remove(inverse) + elif inverse.is_a("IfcMaterialDefinitionRepresentation"): + for representation in inverse.Representations: + for item in representation.Items: + file.remove(item) + file.remove(representation) + file.remove(inverse) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py index 79093789aa..5ede76c1c2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py @@ -20,65 +20,62 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, material=None): - """Removes a material set +def remove_material_set(file, material=None) -> None: + """Removes a material set - All set items, such as layers, profiles, or constituents will also be - removed. However, the materials and profile curves used by the layers, - profiles and constituents will not be removed. + All set items, such as layers, profiles, or constituents will also be + removed. However, the materials and profile curves used by the layers, + profiles and constituents will not be removed. - :param material: The IfcMaterialLayerSet, IfcMaterialConstituentSet, - IfcMaterialProfileSet entity you want to remove. - :type material: ifcopenshell.entity_instance - :return: None - :rtype: None + :param material: The IfcMaterialLayerSet, IfcMaterialConstituentSet, + IfcMaterialProfileSet entity you want to remove. + :type material: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Create a material set - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="GYP-ST-GYP", set_type="IfcMaterialLayerSet") + # Create a material set + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="GYP-ST-GYP", set_type="IfcMaterialLayerSet") - # Create some materials - gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + # Create some materials + gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - # Add some layers - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + # Add some layers + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - # Completely delete the set and all layers. The gypsum and steel - # material still exist, though. - ifcopenshell.api.run("material.remove_material_set", model, material=material_set) - """ + # Completely delete the set and all layers. The gypsum and steel + # material still exist, though. + ifcopenshell.api.run("material.remove_material_set", model, material=material_set) + """ - self.file = file - self.settings = {"material": material} + settings = {"material": material} - def execute(self): - inverse_elements = self.file.get_inverse(self.settings["material"]) - if self.settings["material"].is_a("IfcMaterialLayerSet"): - set_items = self.settings["material"].MaterialLayers or [] - elif self.settings["material"].is_a("IfcMaterialProfileSet"): - set_items = self.settings["material"].MaterialProfiles or [] - elif self.settings["material"].is_a("IfcMaterialConstituentSet"): - set_items = self.settings["material"].MaterialConstituents or [] - elif self.settings["material"].is_a("IfcMaterialList"): - set_items = [] - for set_item in set_items: - self.file.remove(set_item) - self.file.remove(self.settings["material"]) - for inverse in inverse_elements: - if inverse.is_a("IfcRelAssociatesMaterial"): - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcMaterialProperties"): - for prop in inverse.Properties or []: - self.file.remove(prop) - self.file.remove(inverse) + inverse_elements = file.get_inverse(settings["material"]) + if settings["material"].is_a("IfcMaterialLayerSet"): + set_items = settings["material"].MaterialLayers or [] + elif settings["material"].is_a("IfcMaterialProfileSet"): + set_items = settings["material"].MaterialProfiles or [] + elif settings["material"].is_a("IfcMaterialConstituentSet"): + set_items = settings["material"].MaterialConstituents or [] + elif settings["material"].is_a("IfcMaterialList"): + set_items = [] + for set_item in set_items: + file.remove(set_item) + file.remove(settings["material"]) + for inverse in inverse_elements: + if inverse.is_a("IfcRelAssociatesMaterial"): + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcMaterialProperties"): + for prop in inverse.Properties or []: + file.remove(prop) + file.remove(inverse) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py index 9c930866ed..858b6f1289 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py @@ -21,58 +21,55 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, profile=None): - """Removes a profile item from a profile set +def remove_profile(file, profile=None) -> None: + """Removes a profile item from a profile set - Note that it is invalid to have zero items in a set, so you should leave - at least one profile to ensure a valid IFC dataset. + Note that it is invalid to have zero items in a set, so you should leave + at least one profile to ensure a valid IFC dataset. - :param profile: The IfcMaterialProfile entity you want to remove - :type profile: ifcopenshell.entity_instance - :return: None - :rtype: None + :param profile: The IfcMaterialProfile entity you want to remove + :type profile: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # First, let's create a material set. - material_set = ifcopenshell.api.run("material.add_profile_set", model, - name="B1", set_type="IfcMaterialProfileSet") + # First, let's create a material set. + material_set = ifcopenshell.api.run("material.add_profile_set", model, + name="B1", set_type="IfcMaterialProfileSet") - # Create a steel material. - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + # Create a steel material. + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - # Create an I-beam profile curve. Notice how we name our profiles - # based on standardised steel profile names. - hea100 = self.file.create_entity( - "IfcIShapeProfileDef", ProfileName="HEA100", ProfileType="AREA", - OverallWidth=100, OverallDepth=96, WebThickness=5, FlangeThickness=8, FilletRadius=12, - ) + # Create an I-beam profile curve. Notice how we name our profiles + # based on standardised steel profile names. + hea100 = file.create_entity( + "IfcIShapeProfileDef", ProfileName="HEA100", ProfileType="AREA", + OverallWidth=100, OverallDepth=96, WebThickness=5, FlangeThickness=8, FilletRadius=12, + ) - # Define that steel material and cross section as a single profile item. - ifcopenshell.api.run("material.add_profile", model, - profile_set=material_set, material=steel, profile=hea100) + # Define that steel material and cross section as a single profile item. + ifcopenshell.api.run("material.add_profile", model, + profile_set=material_set, material=steel, profile=hea100) - # Imagine a welded square along the length of the profile. - welded_square = ifcopenshell.api.run("profile.add_arbitrary_profile", model, - profile=[(.0025, .0025), (.0325, .0025), (.0325, -.0025), (.0025, -.0025), (.0025, .0025)]) - weld_profile = ifcopenshell.api.run("material.add_profile", model, - profile_set=material_set, material=steel, profile=welded_square) + # Imagine a welded square along the length of the profile. + welded_square = ifcopenshell.api.run("profile.add_arbitrary_profile", model, + profile=[(.0025, .0025), (.0325, .0025), (.0325, -.0025), (.0025, -.0025), (.0025, .0025)]) + weld_profile = ifcopenshell.api.run("material.add_profile", model, + profile_set=material_set, material=steel, profile=welded_square) - # Let's remove our welded square. - ifcopenshell.api.run("material.remove_profile", model, profile=weld_profile) - """ + # Let's remove our welded square. + ifcopenshell.api.run("material.remove_profile", model, profile=weld_profile) + """ - self.file = file - self.settings = {"profile": profile} + settings = {"profile": profile} - def execute(self): - subelements = set() - for attribute in self.settings["profile"]: - if isinstance(attribute, ifcopenshell.entity_instance): - subelements.add(attribute) - self.file.remove(self.settings["profile"]) - for subelement in subelements: - ifcopenshell.util.element.remove_deep2(self.file, subelement) + subelements = set() + for attribute in settings["profile"]: + if isinstance(attribute, ifcopenshell.entity_instance): + subelements.add(attribute) + file.remove(settings["profile"]) + for subelement in subelements: + ifcopenshell.util.element.remove_deep2(file, subelement) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py index 442fec8b5e..481050ff63 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py @@ -17,56 +17,53 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, material_set=None, old_index=0, new_index=0): - """Reorders an item in a material set +def reorder_set_item(file, material_set=None, old_index=0, new_index=0) -> None: + """Reorders an item in a material set - In some material sets, the order have meaning, like in a layer set. In - other cases, it is purely for human convenience. + In some material sets, the order have meaning, like in a layer set. In + other cases, it is purely for human convenience. - :param material_set: The IfcMaterialSet which you want to reorder an - item in. - :type material_set: ifcopenshell.entity_instance - :param old_index: The index of the item you want to move. This starts - counting from 0. - :type old_index: int - :param new_index: The index of the new position the item will move to. - This starts counting from 0. - :type new_index: int - :return: None - :rtype: None + :param material_set: The IfcMaterialSet which you want to reorder an + item in. + :type material_set: ifcopenshell.entity_instance + :param old_index: The index of the item you want to move. This starts + counting from 0. + :type old_index: int + :param new_index: The index of the new position the item will move to. + This starts counting from 0. + :type new_index: int + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="Window", set_type="IfcMaterialList") + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="Window", set_type="IfcMaterialList") - aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") - glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") + aluminium = ifcopenshell.api.run("material.add_material", model, name="AL01", category="aluminium") + glass = ifcopenshell.api.run("material.add_material", model, name="GLZ01", category="glass") - # Now let's use those materials as two items in our list. - ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=aluminium) - ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=glass) + # Now let's use those materials as two items in our list. + ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=aluminium) + ifcopenshell.api.run("material.add_list_item", model, material_list=material_set, material=glass) - # Switch the order around, this has no meaning for a list, so this - # is just for fun. - ifcopenshell.api.run("material.reorder_set_item", model, - material_set=material_set, old_index=0, new_index=1) - """ - self.file = file - self.settings = {"material_set": material_set, "old_index": old_index, "new_index": new_index} + # Switch the order around, this has no meaning for a list, so this + # is just for fun. + ifcopenshell.api.run("material.reorder_set_item", model, + material_set=material_set, old_index=0, new_index=1) + """ + settings = {"material_set": material_set, "old_index": old_index, "new_index": new_index} - def execute(self): - if self.settings["material_set"].is_a("IfcMaterialConstituentSet"): - set_name = "MaterialConstituents" - elif self.settings["material_set"].is_a("IfcMaterialLayerSet"): - set_name = "MaterialLayers" - elif self.settings["material_set"].is_a("IfcMaterialProfileSet"): - set_name = "MaterialProfiles" - elif self.settings["material_set"].is_a("IfcMaterialList"): - set_name = "Materials" - items = list(getattr(self.settings["material_set"], set_name) or []) - items.insert(self.settings["new_index"], items.pop(self.settings["old_index"])) - setattr(self.settings["material_set"], set_name, items) + if settings["material_set"].is_a("IfcMaterialConstituentSet"): + set_name = "MaterialConstituents" + elif settings["material_set"].is_a("IfcMaterialLayerSet"): + set_name = "MaterialLayers" + elif settings["material_set"].is_a("IfcMaterialProfileSet"): + set_name = "MaterialProfiles" + elif settings["material_set"].is_a("IfcMaterialList"): + set_name = "Materials" + items = list(getattr(settings["material_set"], set_name) or []) + items.insert(settings["new_index"], items.pop(settings["old_index"])) + setattr(settings["material_set"], set_name, items) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py index 5f88963c36..93a7f11aea 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/unassign_material.py @@ -21,41 +21,44 @@ import ifcopenshell.api import ifcopenshell.util.element +def unassign_material(file: ifcopenshell.file, products: list[ifcopenshell.entity_instance]) -> None: + """Removes any material relationship with the list of products + + A product can only have one material assigned to it, which is why it is + not necessary to specify the material to unassign. The material is not + removed, only the relationship is removed. + + If the product does not have a material, nothing happens. + + :param products: The list IfcProducts that may or may not have a material + :type product: list[ifcopenshell.entity_instance] + :return: None + :rtype: None + + Example: + + .. code:: python + + concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") + + # Let's imagine a concrete bench made out of concrete. + bench_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurnitureType") + ifcopenshell.api.run("material.assign_material", model, + products=[bench_type], type="IfcMaterial", material=concrete) + + # Let's change our mind and remove the concrete assignment. The + # concrete material still exists, but the bench is no longer made + # out of concrete now. + ifcopenshell.api.run("material.unassign_material", model, products=[bench_type]) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"products": products} + return usecase.execute() + + class Usecase: - def __init__(self, file: ifcopenshell.file, products: list[ifcopenshell.entity_instance]): - """Removes any material relationship with the list of products - - A product can only have one material assigned to it, which is why it is - not necessary to specify the material to unassign. The material is not - removed, only the relationship is removed. - - If the product does not have a material, nothing happens. - - :param products: The list IfcProducts that may or may not have a material - :type product: list[ifcopenshell.entity_instance] - :return: None - :rtype: None - - Example: - - .. code:: python - - concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") - - # Let's imagine a concrete bench made out of concrete. - bench_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurnitureType") - ifcopenshell.api.run("material.assign_material", model, - products=[bench_type], type="IfcMaterial", material=concrete) - - # Let's change our mind and remove the concrete assignment. The - # concrete material still exists, but the bench is no longer made - # out of concrete now. - ifcopenshell.api.run("material.unassign_material", model, products=[bench_type]) - """ - self.file = file - self.settings = {"products": products} - - def execute(self) -> None: + def execute(self): self.products = set(self.settings["products"]) if not self.products: return diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py index e0caddbe3c..242e12eb11 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py @@ -15,3 +15,8 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .assign_object import assign_object +from .change_nest import change_nest +from .reorder_nesting import reorder_nesting +from .unassign_object import unassign_object diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py index 1c9ab8c9b0..7bf76e5c08 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py @@ -22,156 +22,152 @@ import ifcopenshell.util.element from typing import Union -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - related_objects: list[ifcopenshell.entity_instance], - relating_object: ifcopenshell.entity_instance, - ): - """Assigns objects as nested children to a parent host +def assign_object( + file: ifcopenshell.file, + related_objects: list[ifcopenshell.entity_instance], + relating_object: ifcopenshell.entity_instance, +) -> Union[ifcopenshell.entity_instance, None]: + """Assigns objects as nested children to a parent host - All physical IFC model elements must be part of a hierarchical tree - called the "spatial decomposition", where large things are made up of - smaller things. This tree always begins at an "IfcProject" and is then - broken down using "decomposition" relationships, of which aggregation is - the first relationship you will use. + All physical IFC model elements must be part of a hierarchical tree + called the "spatial decomposition", where large things are made up of + smaller things. This tree always begins at an "IfcProject" and is then + broken down using "decomposition" relationships, of which aggregation is + the first relationship you will use. - Another type of "decomposition" relationship is known as "nesting". - Nesting is used when an child object is physically attached to a parent - host object, through a physical predetermined connection point. The - child object must be specifically designed to attach to a other objects - at specific positions with a particular form factor. Examples include - faucets which must always be attached through a predrilled hole in a - basin. Alternatively, it could be a modular attachment with a - correlating male and female joint that must join at a particular point. - Because there is a strict connection point, when the parent moves, all - nested children must move with the parent. Another example might be a - predrilled hole in a door panel where hardware must fit through. + Another type of "decomposition" relationship is known as "nesting". + Nesting is used when an child object is physically attached to a parent + host object, through a physical predetermined connection point. The + child object must be specifically designed to attach to a other objects + at specific positions with a particular form factor. Examples include + faucets which must always be attached through a predrilled hole in a + basin. Alternatively, it could be a modular attachment with a + correlating male and female joint that must join at a particular point. + Because there is a strict connection point, when the parent moves, all + nested children must move with the parent. Another example might be a + predrilled hole in a door panel where hardware must fit through. - Nesting relationships are not very commonly used in most design and - construction models. Its main usecase is in modular construction, kit of - parts, or fabrication models. + Nesting relationships are not very commonly used in most design and + construction models. Its main usecase is in modular construction, kit of + parts, or fabrication models. - As a product may only have a single location in the "spatial - decomposition" tree, assigning an nesting relationship will remove any - previous aggregation, containment, or nesting relationships it may have. + As a product may only have a single location in the "spatial + decomposition" tree, assigning an nesting relationship will remove any + previous aggregation, containment, or nesting relationships it may have. - IFC placements follow a convention where the placement is relative to - its parent in the spatial hierarchy. If your product has a placement, - its placement will be recalculated to follow this convention. + IFC placements follow a convention where the placement is relative to + its parent in the spatial hierarchy. If your product has a placement, + its placement will be recalculated to follow this convention. - For physical connections which are part of a distribution system, such - as a plug connecting into a GPO, or a duct connecting to an AHU, or two - pipe segments connecting with a bend, tee, or wye fitting, you should - not nest the two objects directly. Instead, you should nest a connection - port, which determines the type of compatible distribution flow that can - be connected to it. To do this, do not use this function, but instead - use the more specific functions in the ifcopenshell.api.system module. + For physical connections which are part of a distribution system, such + as a plug connecting into a GPO, or a duct connecting to an AHU, or two + pipe segments connecting with a bend, tee, or wye fitting, you should + not nest the two objects directly. Instead, you should nest a connection + port, which determines the type of compatible distribution flow that can + be connected to it. To do this, do not use this function, but instead + use the more specific functions in the ifcopenshell.api.system module. - Note that nesting relationships may also be used by non-physical - elements, such as cost items or tasks. In this context, nesting means - that there is an implied order to the child cost items or tasks (i.e. - task 1 should be shown before task 2). It is not necessary to use this - function for nesting non-physical elements. Instead, it is recommended - to instead just use the relevant API functions, like - ifcopenshell.api.cost.add_cost_item or - ifcopenshell.api.sequence.add_task. + Note that nesting relationships may also be used by non-physical + elements, such as cost items or tasks. In this context, nesting means + that there is an implied order to the child cost items or tasks (i.e. + task 1 should be shown before task 2). It is not necessary to use this + function for nesting non-physical elements. Instead, it is recommended + to instead just use the relevant API functions, like + ifcopenshell.api.cost.add_cost_item or + ifcopenshell.api.sequence.add_task. - :param related_objects: The list of children of the nesting relationship, - typically IfcElements. - :type related_objects: list[ifcopenshell.entity_instance] - :param relating_object: The host parent of the nesting relationship, - typically an IfcElement. - :type relating_object: ifcopenshell.entity_instance - :return: The IfcRelNests relationship instance - or `None` if `related_objects` was empty list. - :rtype: Union[ifcopenshell.entity_instance, None] + :param related_objects: The list of children of the nesting relationship, + typically IfcElements. + :type related_objects: list[ifcopenshell.entity_instance] + :param relating_object: The host parent of the nesting relationship, + typically an IfcElement. + :type relating_object: ifcopenshell.entity_instance + :return: The IfcRelNests relationship instance + or `None` if `related_objects` was empty list. + :rtype: Union[ifcopenshell.entity_instance, None] - Example: + Example: - .. code:: python + .. code:: python - # Faucets are designed to attach onto a sink through a predrilled hole. - sink = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcSanitaryTerminal", predefined_type="SINK") - faucet = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcValve", predefined_type="FAUCET") - ifcopenshell.api.run("nest.assign_object", model, related_objects=[faucet], relating_object=sink) - """ - self.file = file - self.settings = {"related_objects": related_objects, "relating_object": relating_object} + # Faucets are designed to attach onto a sink through a predrilled hole. + sink = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcSanitaryTerminal", predefined_type="SINK") + faucet = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcValve", predefined_type="FAUCET") + ifcopenshell.api.run("nest.assign_object", model, related_objects=[faucet], relating_object=sink) + """ + settings = {"related_objects": related_objects, "relating_object": relating_object} - def execute(self) -> Union[ifcopenshell.entity_instance, None]: - if not self.settings["related_objects"]: - return + if not settings["related_objects"]: + return - ifc2x3 = self.file.schema == "IFC2X3" + ifc2x3 = file.schema == "IFC2X3" - related_objects = set(self.settings["related_objects"]) - relating_object = self.settings["relating_object"] + related_objects = set(settings["related_objects"]) + relating_object = settings["relating_object"] + if ifc2x3: + is_nested_by = next((i for i in relating_object.IsDecomposedBy if i.is_a("IfcRelNests")), None) + else: + is_nested_by = next((i for i in relating_object.IsNestedBy), None) + + previous_nests_rels: set[ifcopenshell.entity_instance] = set() + objects_without_nests: list[ifcopenshell.entity_instance] = [] + objects_with_nests: list[ifcopenshell.entity_instance] = [] + + # check if there is anything to change + for object in related_objects: if ifc2x3: - is_nested_by = next((i for i in relating_object.IsDecomposedBy if i.is_a("IfcRelNests")), None) + object_rel = next((i for i in object.Decomposes if i.is_a("IfcRelNests")), None) else: - is_nested_by = next((i for i in relating_object.IsNestedBy), None) + object_rel = next(iter(object.Nests), None) - previous_nests_rels: set[ifcopenshell.entity_instance] = set() - objects_without_nests: list[ifcopenshell.entity_instance] = [] - objects_with_nests: list[ifcopenshell.entity_instance] = [] + if object_rel is None: + objects_without_nests.append(object) + continue - # check if there is anything to change - for object in related_objects: - if ifc2x3: - object_rel = next((i for i in object.Decomposes if i.is_a("IfcRelNests")), None) - else: - object_rel = next(iter(object.Nests), None) + # either is_nested_by is None or product is part of different rel + if object_rel != is_nested_by: + previous_nests_rels.add(object_rel) + objects_with_nests.append(object) - if object_rel is None: - objects_without_nests.append(object) - continue - - # either is_nested_by is None or product is part of different rel - if object_rel != is_nested_by: - previous_nests_rels.add(object_rel) - objects_with_nests.append(object) - - # products with already assigned nestings will be skipped - - objects_to_change = objects_without_nests + objects_with_nests - # nothing to change - if not objects_to_change: - return is_nested_by - - # NOTE: An object can both be nested and assigned to a container or an aggregate. - - # unassign elements from previous nests - for nests in previous_nests_rels: - cur_related_objects = set(nests.RelatedObjects) - related_objects - if cur_related_objects: - nests.RelatedObjects = list(cur_related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": nests}) - else: - history = nests.OwnerHistory - self.file.remove(nests) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - - # assign elements to a new nesting - if is_nested_by: - is_nested_by.RelatedObjects = list(set(is_nested_by.RelatedObjects) | related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": is_nested_by}) - else: - is_nested_by = self.file.create_entity( - "IfcRelNests", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": list(related_objects), - "RelatingObject": relating_object, - } - ) - - # NOTE: Creating a nesting relationship doesn't localize the object's placement, - # unlike assigning it to an aggregate or a container. + # products with already assigned nestings will be skipped + objects_to_change = objects_without_nests + objects_with_nests + # nothing to change + if not objects_to_change: return is_nested_by + + # NOTE: An object can both be nested and assigned to a container or an aggregate. + + # unassign elements from previous nests + for nests in previous_nests_rels: + cur_related_objects = set(nests.RelatedObjects) - related_objects + if cur_related_objects: + nests.RelatedObjects = list(cur_related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": nests}) + else: + history = nests.OwnerHistory + file.remove(nests) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + + # assign elements to a new nesting + if is_nested_by: + is_nested_by.RelatedObjects = list(set(is_nested_by.RelatedObjects) | related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": is_nested_by}) + else: + is_nested_by = file.create_entity( + "IfcRelNests", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": list(related_objects), + "RelatingObject": relating_object, + } + ) + + # NOTE: Creating a nesting relationship doesn't localize the object's placement, + # unlike assigning it to an aggregate or a container. + + return is_nested_by diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/change_nest.py b/src/ifcopenshell-python/ifcopenshell/api/nest/change_nest.py index 6d83a9e4e8..22ba7d0fc3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/change_nest.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/change_nest.py @@ -21,29 +21,26 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, item=None, new_parent=None): - """Assigns a cost item to a new parent cost item""" - self.file = file - self.settings = {"item": item, "new_parent": new_parent} +def change_nest(file, item=None, new_parent=None) -> None: + """Assigns a cost item to a new parent cost item""" + settings = {"item": item, "new_parent": new_parent} - def execute(self): - if not self.settings["item"].Nests: - return - nests = self.settings["item"].Nests[0] - related_objects = list(nests.RelatedObjects) - related_objects.remove(self.settings["item"]) - if related_objects: - nests.RelatedObjects = related_objects - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": nests}) - else: - history = nests.OwnerHistory - self.file.remove(nests) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - ifcopenshell.api.run( - "nest.assign_object", - self.file, - related_objects=[self.settings["item"]], - relating_object=self.settings["new_parent"], - ) + if not settings["item"].Nests: + return + nests = settings["item"].Nests[0] + related_objects = list(nests.RelatedObjects) + related_objects.remove(settings["item"]) + if related_objects: + nests.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": nests}) + else: + history = nests.OwnerHistory + file.remove(nests) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + ifcopenshell.api.run( + "nest.assign_object", + file, + related_objects=[settings["item"]], + relating_object=settings["new_parent"], + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/reorder_nesting.py b/src/ifcopenshell-python/ifcopenshell/api/nest/reorder_nesting.py index cdc23c07a5..63b591ee28 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/reorder_nesting.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/reorder_nesting.py @@ -17,20 +17,17 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, item=None, old_index=0, new_index=0): - """Reorders an item in a nesting set""" - self.file = file - self.settings = {"item": item, "old_index":old_index, "new_index": new_index} +def reorder_nesting(file, item=None, old_index=0, new_index=0) -> None: + """Reorders an item in a nesting set""" + settings = {"item": item, "old_index": old_index, "new_index": new_index} - def execute(self): - if not self.settings["item"].Nests: - return - nesting_set = self.settings["item"].Nests[0] - if not self.settings["old_index"]: - old_index = nesting_set.RelatedObjects.index(self.settings["item"]) - else: - old_index = self.settings["old_index"] - items = list(getattr(nesting_set, "RelatedObjects") or []) - items.insert(self.settings["new_index"], items.pop(old_index)) - setattr(nesting_set, "RelatedObjects", items) + if not settings["item"].Nests: + return + nesting_set = settings["item"].Nests[0] + if not settings["old_index"]: + old_index = nesting_set.RelatedObjects.index(settings["item"]) + else: + old_index = settings["old_index"] + items = list(getattr(nesting_set, "RelatedObjects") or []) + items.insert(settings["new_index"], items.pop(old_index)) + setattr(nesting_set, "RelatedObjects", items) diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py b/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py index b9f48b4b5b..42e35777ad 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py @@ -21,57 +21,54 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file: ifcopenshell.file, related_objects: list[ifcopenshell.entity_instance]): - """Unassigns related_objects from their nests. +def unassign_object(file: ifcopenshell.file, related_objects: list[ifcopenshell.entity_instance]) -> None: + """Unassigns related_objects from their nests. - An object (the whole within a decomposition) is Nested by zero or one more smaller objects. - This function will remove this nesting relationship. + An object (the whole within a decomposition) is Nested by zero or one more smaller objects. + This function will remove this nesting relationship. - If the object is not part of a nesting relationship, nothing will happen. + If the object is not part of a nesting relationship, nothing will happen. - :param related_objects: The list of children of the nesting relationship, - typically IfcElements. - :type related_objects: list[ifcopenshell.entity_instance] - :return: None - :rtype: None + :param related_objects: The list of children of the nesting relationship, + typically IfcElements. + :type related_objects: list[ifcopenshell.entity_instance] + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - task = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcTasks") - subtask1 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcTask") - subtask2 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcTask") - ifcopenshell.api.run("nest.assign_object", model, related_objects=[subtask1], relating_object=task) - ifcopenshell.api.run("nest.assign_object", model, related_objects=[subtask2], relating_object=task) - # nothing is returned - rel = ifcopenshell.api.run("nest.unassign_object", model, related_objects=[subtask1]) - # nothing is returned, relationship is removed - ifcopenshell.api.run("nest.unassign_object", model, related_objects=[subtask2]) - """ - self.file = file - self.settings = {"related_objects": related_objects} + task = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcTasks") + subtask1 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcTask") + subtask2 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcTask") + ifcopenshell.api.run("nest.assign_object", model, related_objects=[subtask1], relating_object=task) + ifcopenshell.api.run("nest.assign_object", model, related_objects=[subtask2], relating_object=task) + # nothing is returned + rel = ifcopenshell.api.run("nest.unassign_object", model, related_objects=[subtask1]) + # nothing is returned, relationship is removed + ifcopenshell.api.run("nest.unassign_object", model, related_objects=[subtask2]) + """ + settings = {"related_objects": related_objects} - def execute(self) -> None: - related_objects = set(self.settings["related_objects"]) - ifc2x3 = self.file.schema == "IFC2X3" - if ifc2x3: - rels = set( - rel - for object in related_objects - if (rel := next((rel for rel in object.Decomposes if rel.is_a("IfcRelNests")), None)) - ) + related_objects = set(settings["related_objects"]) + ifc2x3 = file.schema == "IFC2X3" + if ifc2x3: + rels = set( + rel + for object in related_objects + if (rel := next((rel for rel in object.Decomposes if rel.is_a("IfcRelNests")), None)) + ) + else: + rels = set(rel for object in related_objects if (rel := next((rel for rel in object.Nests), None))) + + for rel in rels: + related_objects = set(rel.RelatedObjects) - related_objects + if related_objects: + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) else: - rels = set(rel for object in related_objects if (rel := next((rel for rel in object.Nests), None))) - - for rel in rels: - related_objects = set(rel.RelatedObjects) - related_objects - if related_objects: - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py index e0caddbe3c..755fa4fc5f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py @@ -15,3 +15,27 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_actor import add_actor +from .add_address import add_address +from .add_application import add_application +from .add_organisation import add_organisation +from .add_person import add_person +from .add_person_and_organisation import add_person_and_organisation +from .add_role import add_role +from .assign_actor import assign_actor +from .create_owner_history import create_owner_history +from .edit_actor import edit_actor +from .edit_address import edit_address +from .edit_organisation import edit_organisation +from .edit_person import edit_person +from .edit_role import edit_role +from .remove_actor import remove_actor +from .remove_address import remove_address +from .remove_application import remove_application +from .remove_organisation import remove_organisation +from .remove_person import remove_person +from .remove_person_and_organisation import remove_person_and_organisation +from .remove_role import remove_role +from .unassign_actor import unassign_actor +from .update_owner_history import update_owner_history diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py index c3ff65c3d1..124561f136 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py @@ -21,49 +21,46 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, actor=None, ifc_class="IfcActor"): - """Adds a new actor +def add_actor(file, actor=None, ifc_class="IfcActor") -> None: + """Adds a new actor - An actor is a person or an organisation who has a responsibility or role - to play in a project. Actor roles include design consultants, - architects, engineers, cost planners, suppliers, manufacturers, - warrantors, owners, subcontractors, etc. + An actor is a person or an organisation who has a responsibility or role + to play in a project. Actor roles include design consultants, + architects, engineers, cost planners, suppliers, manufacturers, + warrantors, owners, subcontractors, etc. - Actors may either be project actors, who are responsible for the - delivery of the project, or occupants, who are responsible for the - consumption of the project. + Actors may either be project actors, who are responsible for the + delivery of the project, or occupants, who are responsible for the + consumption of the project. - Identifying and managing actors is critical for asset management, and - identifying liability for legal submissions. + Identifying and managing actors is critical for asset management, and + identifying liability for legal submissions. - :param actor: Most commonly, an IfcOrganization (in compliance with GDPR - requirements for non personally identifiable information), or an - IfcPerson if it is a sole individual, or an IfcPersonAndOrganization - if a specific person is liable within an organisation and must be - legally nominated. - :type actor: ifcopenshell.entity_instance - :param ifc_class: Either "IfcActor" or "IfcOccupant". - :type ifc_class: str, optional - :return: The newly created IfcActor or IfcOccupant - :rtype: ifcopenshell.entity_instance + :param actor: Most commonly, an IfcOrganization (in compliance with GDPR + requirements for non personally identifiable information), or an + IfcPerson if it is a sole individual, or an IfcPersonAndOrganization + if a specific person is liable within an organisation and must be + legally nominated. + :type actor: ifcopenshell.entity_instance + :param ifc_class: Either "IfcActor" or "IfcOccupant". + :type ifc_class: str, optional + :return: The newly created IfcActor or IfcOccupant + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Setup an organisation with a single role - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects Without Ballpens") - role = ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation, role="ARCHITECT") + # Setup an organisation with a single role + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects Without Ballpens") + role = ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation, role="ARCHITECT") - # Assign that organisation to a newly created actor - actor = ifcopenshell.api.run("owner.add_actor", model, actor=organisation) - """ - self.file = file - self.settings = {"actor": actor, "ifc_class": ifc_class or "IfcActor"} + # Assign that organisation to a newly created actor + actor = ifcopenshell.api.run("owner.add_actor", model, actor=organisation) + """ + settings = {"actor": actor, "ifc_class": ifc_class or "IfcActor"} - def execute(self): - actor = ifcopenshell.api.run("root.create_entity", self.file, ifc_class=self.settings["ifc_class"]) - actor.TheActor = self.settings["actor"] - return actor + actor = ifcopenshell.api.run("root.create_entity", file, ifc_class=settings["ifc_class"]) + actor.TheActor = settings["actor"] + return actor diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py index b184408fa9..a214c86d81 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py @@ -17,58 +17,53 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, assigned_object=None, ifc_class="IfcPostalAddress"): - """Add a new telecom or postal address to an organisation or person +def add_address(file, assigned_object=None, ifc_class="IfcPostalAddress") -> None: + """Add a new telecom or postal address to an organisation or person - A person or organisation may have associated contact details such as - phone numbers, mailing addresses, websites, email addresses, and instant - messaging handles. This information is critical in recording the contact - information of manufacturers and suppliers for facility management, or - liable actors. + A person or organisation may have associated contact details such as + phone numbers, mailing addresses, websites, email addresses, and instant + messaging handles. This information is critical in recording the contact + information of manufacturers and suppliers for facility management, or + liable actors. - There are two types of addresses, postal addresses for physical snail - mail, and telecom addresses for telephone or internet contact numbers - and addresses. + There are two types of addresses, postal addresses for physical snail + mail, and telecom addresses for telephone or internet contact numbers + and addresses. - :param assigned_object: The IfcOrganization or IfcPerson the contact - address belongs to. - :type assigned_object: ifcopenshell.entity_instance - :param ifc_class: Either IfcPostalAddress or IfcTelecomAddress. Defaults - to IfcPostalAddress. - :type ifc_class: str, optional - :return: The new IfcPostalAddress or IfcTelecomAddress - :rtype: ifcopenshell.entity_instance + :param assigned_object: The IfcOrganization or IfcPerson the contact + address belongs to. + :type assigned_object: ifcopenshell.entity_instance + :param ifc_class: Either IfcPostalAddress or IfcTelecomAddress. Defaults + to IfcPostalAddress. + :type ifc_class: str, optional + :return: The new IfcPostalAddress or IfcTelecomAddress + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - organisation = ifcopenshell.api.run("owner.add_organisation", model) + organisation = ifcopenshell.api.run("owner.add_organisation", model) - # A snail mail address - postal = ifcopenshell.api.run("owner.add_address", model, - assigned_object=organisation, ifc_class="IfcPostalAddress") - ifcopenshell.api.run("owner.edit_address", model, address=postal, - attributes={"Purpose": "OFFICE", "AddressLines": ["42 Wallaby Way"], - "Town": "Sydney", "Region": "NSW", "PostalCode": "2000"}) + # A snail mail address + postal = ifcopenshell.api.run("owner.add_address", model, + assigned_object=organisation, ifc_class="IfcPostalAddress") + ifcopenshell.api.run("owner.edit_address", model, address=postal, + attributes={"Purpose": "OFFICE", "AddressLines": ["42 Wallaby Way"], + "Town": "Sydney", "Region": "NSW", "PostalCode": "2000"}) - # A phone or internet address - telecom = ifcopenshell.api.run("owner.add_address", model, - assigned_object=organisation, ifc_class="IfcTelecomAddress") - ifcopenshell.api.run("owner.edit_address", model, address=telecom, - attributes={"Purpose": "OFFICE", "TelephoneNumbers": ["+61432466949"], - "ElectronicMailAddresses": ["bobthebuilder@example.com"], - "WWWHomePageURL": "https://thinkmoult.com"}) - """ - self.file = file - self.settings = {"assigned_object": assigned_object, "ifc_class": ifc_class} + # A phone or internet address + telecom = ifcopenshell.api.run("owner.add_address", model, + assigned_object=organisation, ifc_class="IfcTelecomAddress") + ifcopenshell.api.run("owner.edit_address", model, address=telecom, + attributes={"Purpose": "OFFICE", "TelephoneNumbers": ["+61432466949"], + "ElectronicMailAddresses": ["bobthebuilder@example.com"], + "WWWHomePageURL": "https://thinkmoult.com"}) + """ + settings = {"assigned_object": assigned_object, "ifc_class": ifc_class} - def execute(self): - address = self.file.create_entity(self.settings["ifc_class"], "OFFICE") - addresses = ( - list(self.settings["assigned_object"].Addresses) if self.settings["assigned_object"].Addresses else [] - ) - addresses.append(address) - self.settings["assigned_object"].Addresses = addresses - return address + address = file.create_entity(settings["ifc_class"], "OFFICE") + addresses = list(settings["assigned_object"].Addresses) if settings["assigned_object"].Addresses else [] + addresses.append(address) + settings["assigned_object"].Addresses = addresses + return address diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py index 92861a3417..07a59db0d7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py @@ -19,50 +19,52 @@ import ifcopenshell.api +def add_application( + file, + application_developer=None, + version=None, + application_full_name="IfcOpenShell", + application_identifier="IfcOpenShell", +) -> None: + """Adds a new application + + IFC data may be associated with an authoring application to identify + which application was responsible for editing or authoring the data. An + application is defined by the developing organisation, as well as a full + name and identifier. This is akin to how web browsers have an + identification string. + + :param application_developer: The IfcOrganization responsible for + creating the application. Defaults to generating an IfcOpenShell + organisation if none is provided. + :type application_developer: ifcopenshell.entity_instance, optional + :param version: The version of the application. Defaults to the + ifcopenshell.version data if not specified. + :type version: str, optional + :param application_full_name: The name of the application + :type application_full_name: str, optional + :param application_identifier: An identification string for the + application intended for computers to read. + :type application_identifier: str, optional + + Example: + + .. code:: python + + application = ifcopenshell.api.run("owner.add_application", model) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "application_developer": application_developer, + "version": version or ifcopenshell.version, + "application_full_name": application_full_name, + "application_identifier": application_identifier, + } + return usecase.execute() + + class Usecase: - def __init__( - self, - file, - application_developer=None, - version=None, - application_full_name="IfcOpenShell", - application_identifier="IfcOpenShell", - ): - """Adds a new application - - IFC data may be associated with an authoring application to identify - which application was responsible for editing or authoring the data. An - application is defined by the developing organisation, as well as a full - name and identifier. This is akin to how web browsers have an - identification string. - - :param application_developer: The IfcOrganization responsible for - creating the application. Defaults to generating an IfcOpenShell - organisation if none is provided. - :type application_developer: ifcopenshell.entity_instance, optional - :param version: The version of the application. Defaults to the - ifcopenshell.version data if not specified. - :type version: str, optional - :param application_full_name: The name of the application - :type application_full_name: str, optional - :param application_identifier: An identification string for the - application intended for computers to read. - :type application_identifier: str, optional - - Example: - - .. code:: python - - application = ifcopenshell.api.run("owner.add_application", model) - """ - self.file = file - self.settings = { - "application_developer": application_developer, - "version": version or ifcopenshell.version, - "application_full_name": application_full_name, - "application_identifier": application_identifier, - } - def execute(self): if not self.settings["application_developer"]: self.settings["application_developer"] = self.create_application_organisation() diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py index 2127acd570..354d66f76a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_organisation.py @@ -18,38 +18,37 @@ import ifcopenshell -class Usecase: - def __init__(self, file: ifcopenshell.file, identification: str = "APTR", name: str = "Aperture Science"): - """Adds a new organisation +def add_organisation( + file: ifcopenshell.file, identification: str = "APTR", name: str = "Aperture Science" +) -> ifcopenshell.entity_instance: + """Adds a new organisation - Organisations are the main way to identify manufacturers, suppliers, and - other actors who do not have a single representative or must not have - any personally identifiable information. + Organisations are the main way to identify manufacturers, suppliers, and + other actors who do not have a single representative or must not have + any personally identifiable information. - :param identification: The short code identifying the organisation. - Sometimes used in drawing naming schemes. Otherise used as a - canonicalised way of computers to identify the organisation. Like - their stock name. - :type identification: str, optional - :param name: The legal name of the organisation - :type name: str, optional - :return: The newly created IfcOrganization - :rtype: ifcopenshell.entity_instance + :param identification: The short code identifying the organisation. + Sometimes used in drawing naming schemes. Otherise used as a + canonicalised way of computers to identify the organisation. Like + their stock name. + :type identification: str, optional + :param name: The legal name of the organisation + :type name: str, optional + :return: The newly created IfcOrganization + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects Without Ballpens") - """ - self.file = file - self.settings = {"identification": identification, "name": name} + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects Without Ballpens") + """ + settings = {"identification": identification, "name": name} - def execute(self) -> ifcopenshell.entity_instance: - data = {"Name": self.settings["name"]} - if self.file.schema == "IFC2X3": - data["Id"] = self.settings["identification"] - else: - data["Identification"] = self.settings["identification"] - return self.file.create_entity("IfcOrganization", **data) + data = {"Name": settings["name"]} + if file.schema == "IFC2X3": + data["Id"] = settings["identification"] + else: + data["Identification"] = settings["identification"] + return file.create_entity("IfcOrganization", **data) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py index a607d8af29..5d571920d4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py @@ -18,47 +18,43 @@ import ifcopenshell -class Usecase: - def __init__( - self, - file: ifcopenshell.entity_instance, - identification: str = "HSeldon", - family_name: str = "Seldon", - given_name: str = "Hari", - ): - """Adds a new person +def add_person( + file: ifcopenshell.entity_instance, + identification: str = "HSeldon", + family_name: str = "Seldon", + given_name: str = "Hari", +) -> None: + """Adds a new person - Persons are used to identify a legal or liable representative of an - organisation or point of contact. + Persons are used to identify a legal or liable representative of an + organisation or point of contact. - :param identification: The computer readable unique identification of - the person. For example, their username in a CDE or alias. - :type identification: str, optional - :param family_name: The family name - :type family_name: str, optional - :param given_name: The given name - :type given_name: str, optional - :return: The newly created IfcPerson - :rtype: ifcopenshell.entity_instance + :param identification: The computer readable unique identification of + the person. For example, their username in a CDE or alias. + :type identification: str, optional + :param family_name: The family name + :type family_name: str, optional + :param given_name: The given name + :type given_name: str, optional + :return: The newly created IfcPerson + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - ifcopenshell.api.run("owner.add_person", model, - identification="bobthebuilder", family_name="Thebuilder", given_name="Bob") - """ - self.file = file - self.settings = { - "identification": identification, - "family_name": family_name, - "given_name": given_name, - } + ifcopenshell.api.run("owner.add_person", model, + identification="bobthebuilder", family_name="Thebuilder", given_name="Bob") + """ + settings = { + "identification": identification, + "family_name": family_name, + "given_name": given_name, + } - def execute(self) ->ifcopenshell.entity_instance: - data = {"FamilyName": self.settings["family_name"], "GivenName": self.settings["given_name"]} - if self.file.schema == "IFC2X3": - data["Id"] = self.settings["identification"] - else: - data["Identification"] = self.settings["identification"] - return self.file.create_entity("IfcPerson", **data) + data = {"FamilyName": settings["family_name"], "GivenName": settings["given_name"]} + if file.schema == "IFC2X3": + data["Id"] = settings["identification"] + else: + data["Identification"] = settings["identification"] + return file.create_entity("IfcPerson", **data) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py index a5987b4b76..7f07c1991c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py @@ -18,40 +18,36 @@ import ifcopenshell -class Usecase: - def __init__( - self, - file: ifcopenshell.entity_instance, - person: ifcopenshell.entity_instance, - organisation: ifcopenshell.entity_instance, - ): - """Adds a paired person and organisation +def add_person_and_organisation( + file: ifcopenshell.entity_instance, + person: ifcopenshell.entity_instance, + organisation: ifcopenshell.entity_instance, +) -> ifcopenshell.entity_instance: + """Adds a paired person and organisation - A person and an organisation may be paired to create a representative - belonging to a company. + A person and an organisation may be paired to create a representative + belonging to a company. - :param person: The IfcPerson being the representative of the - organisation. - :type person: ifcopenshell.entity_instance - :param organisation: The IfcOrganization itself. - :type organisation: ifcopenshell.entity_instance - :return: The newly created IfcPersonAndOrganization - :rtype: ifcopenshell.entity_instance + :param person: The IfcPerson being the representative of the + organisation. + :type person: ifcopenshell.entity_instance + :param organisation: The IfcOrganization it + :type organisation: ifcopenshell.entity_instance + :return: The newly created IfcPersonAndOrganization + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - person = ifcopenshell.api.run("owner.add_person", model, - identification="lecorbycorbycorb", family_name="Curbosiar", given_name="Le") - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects Without Ballpens") + person = ifcopenshell.api.run("owner.add_person", model, + identification="lecorbycorbycorb", family_name="Curbosiar", given_name="Le") + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects Without Ballpens") - ifcopenshell.api.run("owner.add_person_and_organisation", model, - person=person, organisation=organisation) - """ - self.file = file - self.settings = {"person": person, "organisation": organisation} + ifcopenshell.api.run("owner.add_person_and_organisation", model, + person=person, organisation=organisation) + """ + settings = {"person": person, "organisation": organisation} - def execute(self) -> ifcopenshell.entity_instance: - return self.file.createIfcPersonAndOrganization(self.settings["person"], self.settings["organisation"]) + return file.createIfcPersonAndOrganization(settings["person"], settings["organisation"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py index 3b1369877c..415ed4efde 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py @@ -17,47 +17,44 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, assigned_object=None, role="ARCHITECT"): - """Adds and assigns a new role +def add_role(file, assigned_object=None, role="ARCHITECT") -> None: + """Adds and assigns a new role - People and organisations must play one or more roles on a project. Roles - include architects, engineers, subcontractors, clients, manufacturers, - etc. Typically these roles and their corresponding responsibilities will - be outlined in contractual documents. + People and organisations must play one or more roles on a project. Roles + include architects, engineers, subcontractors, clients, manufacturers, + etc. Typically these roles and their corresponding responsibilities will + be outlined in contractual documents. - This function will both add and assign the role to the person or - organisation. + This function will both add and assign the role to the person or + organisation. - :param assigned_object: The IfcPerson or IfcOrganization the role should - be assigned to. - :type assigned_object: ifcopenshell.entity_instance - :param role: The type of role, taken from the IFC documentation for - IfcActorRole, or a custom name. - :type role: str, optional - :return: The newly created IfcActorRole - :rtype: ifcopenshell.entity_instance + :param assigned_object: The IfcPerson or IfcOrganization the role should + be assigned to. + :type assigned_object: ifcopenshell.entity_instance + :param role: The type of role, taken from the IFC documentation for + IfcActorRole, or a custom name. + :type role: str, optional + :return: The newly created IfcActorRole + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects Without Ballpens") - ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation, role="ARCHITECT") - """ - self.file = file - self.settings = {"assigned_object": assigned_object, "role": role} + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects Without Ballpens") + ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation, role="ARCHITECT") + """ + settings = {"assigned_object": assigned_object, "role": role} - def execute(self): - element = self.file.createIfcActorRole("ARCHITECT") - if self.settings["role"]: - try: - element.Role = self.settings["role"] - except: - element.Role = "USERDEFINED" - element.UserDefinedRole = self.settings["role"] - roles = list(self.settings["assigned_object"].Roles) if self.settings["assigned_object"].Roles else [] - roles.append(element) - self.settings["assigned_object"].Roles = roles - return element + element = file.createIfcActorRole("ARCHITECT") + if settings["role"]: + try: + element.Role = settings["role"] + except: + element.Role = "USERDEFINED" + element.UserDefinedRole = settings["role"] + roles = list(settings["assigned_object"].Roles) if settings["assigned_object"].Roles else [] + roles.append(element) + settings["assigned_object"].Roles = roles + return element diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py index 1085adeb34..361c32bf2a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py @@ -20,88 +20,85 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, relating_actor=None, related_object=None): - """Assigns an actor to an object +def assign_actor(file, relating_actor=None, related_object=None) -> None: + """Assigns an actor to an object - An actor may be assigned to objects which implies that the actor is - responsible for. This is most commonly used in facility management for - indicating the manufacturers, suppliers, and warrantors for product - types. + An actor may be assigned to objects which implies that the actor is + responsible for. This is most commonly used in facility management for + indicating the manufacturers, suppliers, and warrantors for product + types. - Here are a list of objects you may assign an actor to: + Here are a list of objects you may assign an actor to: - * IfcControl: Indicates project directives issued by the actor. - * IfcGroup: Indicates groups for which the actor is responsible. - * IfcProduct: Indicates products for which the actor is responsible. - * IfcProcess: Indicates processes for which the actor is responsible. - * IfcResource: Indicates resources for which the actor is responsible to - allocate, manage, or delegate. This is not the actor actually using - the resource or performing the work. For that type of actor, see - ifcopenshell.api.resource.assign_resource. + * IfcControl: Indicates project directives issued by the actor. + * IfcGroup: Indicates groups for which the actor is responsible. + * IfcProduct: Indicates products for which the actor is responsible. + * IfcProcess: Indicates processes for which the actor is responsible. + * IfcResource: Indicates resources for which the actor is responsible to + allocate, manage, or delegate. This is not the actor actually using + the resource or performing the work. For that type of actor, see + ifcopenshell.api.resource.assign_resource. - :param relating_actor: The IfcActor who is responsible for the object. - :type relating_actor: ifcopenshell.entity_instance - :param related_object: The object the actor is responsible for. - :type related_object: ifcopenshell.entity_instance - :return: The newly created IfcRelAssignsToActor relationship. - :rtype: ifcopenshell.entity_instance + :param relating_actor: The IfcActor who is responsible for the object. + :type relating_actor: ifcopenshell.entity_instance + :param related_object: The object the actor is responsible for. + :type related_object: ifcopenshell.entity_instance + :return: The newly created IfcRelAssignsToActor relationship. + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # We need to procure and install 2 of this particular pump type in our facility. - pump_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcPumpType") + # We need to procure and install 2 of this particular pump type in our facility. + pump_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcPumpType") - # Define who the manufacturer is - manufacturer = ifcopenshell.api.run("owner.add_organisation", model, - identification="PWP", name="Pumps With Power") - ifcopenshell.api.run("owner.add_role", model, assigned_object=manufacturer, role="MANUFACTURER") + # Define who the manufacturer is + manufacturer = ifcopenshell.api.run("owner.add_organisation", model, + identification="PWP", name="Pumps With Power") + ifcopenshell.api.run("owner.add_role", model, assigned_object=manufacturer, role="MANUFACTURER") - # To help our facility manager, it's nice to provide contact details - # of the manufacturer so they know how to call when the pump breaks. - telecom = ifcopenshell.api.run("owner.add_address", model, - assigned_object=organisation, ifc_class="IfcTelecomAddress") - ifcopenshell.api.run("owner.edit_address", model, address=telecom, - attributes={"Purpose": "OFFICE", "TelephoneNumbers": ["+61432466949"], - "ElectronicMailAddresses": ["contact@example.com"], - "WWWHomePageURL": "https://example.com"}) + # To help our facility manager, it's nice to provide contact details + # of the manufacturer so they know how to call when the pump breaks. + telecom = ifcopenshell.api.run("owner.add_address", model, + assigned_object=organisation, ifc_class="IfcTelecomAddress") + ifcopenshell.api.run("owner.edit_address", model, address=telecom, + attributes={"Purpose": "OFFICE", "TelephoneNumbers": ["+61432466949"], + "ElectronicMailAddresses": ["contact@example.com"], + "WWWHomePageURL": "https://example.com"}) - # Make the manufacturer responsible for that pump type. - ifcopenshell.api.run("owner.assign_actor", model, - relating_actor=manufacturer, related_object=pump_type) - """ - self.file = file - self.settings = { - "relating_actor": relating_actor, - "related_object": related_object, - } + # Make the manufacturer responsible for that pump type. + ifcopenshell.api.run("owner.assign_actor", model, + relating_actor=manufacturer, related_object=pump_type) + """ + settings = { + "relating_actor": relating_actor, + "related_object": related_object, + } - def execute(self): - if self.settings["related_object"].HasAssignments: - for rel in self.settings["related_object"].HasAssignments: - if rel.is_a("IfcRelAssignsToActor") and rel.RelatingActor == self.settings["relating_actor"]: - return + if settings["related_object"].HasAssignments: + for rel in settings["related_object"].HasAssignments: + if rel.is_a("IfcRelAssignsToActor") and rel.RelatingActor == settings["relating_actor"]: + return - rel = None + rel = None - if self.settings["relating_actor"].IsActingUpon: - rel = self.settings["relating_actor"].IsActingUpon[0] + if settings["relating_actor"].IsActingUpon: + rel = settings["relating_actor"].IsActingUpon[0] - if rel: - related_objects = list(rel.RelatedObjects) - related_objects.append(self.settings["related_object"]) - rel.RelatedObjects = related_objects - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - rel = self.file.create_entity( - "IfcRelAssignsToActor", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": [self.settings["related_object"]], - "RelatingActor": self.settings["relating_actor"], - } - ) - return rel + if rel: + related_objects = list(rel.RelatedObjects) + related_objects.append(settings["related_object"]) + rel.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + else: + rel = file.create_entity( + "IfcRelAssignsToActor", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": [settings["related_object"]], + "RelatingActor": settings["relating_actor"], + } + ) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py index 94183e0c6b..2b4729897f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py @@ -22,100 +22,97 @@ import ifcopenshell.api.owner.settings from typing import Union -class Usecase: - def __init__(self, file: ifcopenshell.entity_instance): - """Creates a new owner history indicating an element was added +def create_owner_history(file: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: + """Creates a new owner history indicating an element was added - Any object in IFC with a unique ID and name (such as physical products, - tasks, calendars, etc) may have an owner associated with it. An owner is - a liable person and/or organisation which a bit of metadata indicating - whether they have created the object, edited the object, when the change - was made, and which application they used. + Any object in IFC with a unique ID and name (such as physical products, + tasks, calendars, etc) may have an owner associated with it. An owner is + a liable person and/or organisation which a bit of metadata indicating + whether they have created the object, edited the object, when the change + was made, and which application they used. - IFC does not offer a comprehensive specification for version control and - change tracking, as this is completely out of scope. However this - similar ability allows IFC to satisfy legal requirements where object - ownership, responsibilities, and permissions must be specified. - Recording the owner is mandatory in IFC2X3 but optional in IFC4. It is - not recommended to store this ownership data in IFC4 unless a legal - requirement is in place. + IFC does not offer a comprehensive specification for version control and + change tracking, as this is completely out of scope. However this + similar ability allows IFC to satisfy legal requirements where object + ownership, responsibilities, and permissions must be specified. + Recording the owner is mandatory in IFC2X3 but optional in IFC4. It is + not recommended to store this ownership data in IFC4 unless a legal + requirement is in place. - Because owner tracking is mandatory in IFC2X3, be aware that some - configuration may be required to work correctly. Read on. + Because owner tracking is mandatory in IFC2X3, be aware that some + configuration may be required to work correctly. Read on. - To track the owner, at a minimum we have to know the application that - the element was authored from, as well as the user (person and - organisation) that made the change. The IfcOpenShell API is a low level - software library and will not know what application the API is being - called from, and nor does it have the responsibility to manage the - "active user" making edits, which may be as simple as hardcoding it to - "Bob" or even be as complex as integration with a CDE's authentication - system. As a result, the developer responsible to integrate with - IfcOpenShell is expected to overload the - ifcopenshell.api.owner.settings.get_user and - ifcopenshell.api.owner.settings.get_application functions. + To track the owner, at a minimum we have to know the application that + the element was authored from, as well as the user (person and + organisation) that made the change. The IfcOpenShell API is a low level + software library and will not know what application the API is being + called from, and nor does it have the responsibility to manage the + "active user" making edits, which may be as simple as hardcoding it to + "Bob" or even be as complex as integration with a CDE's authentication + system. As a result, the developer responsible to integrate with + IfcOpenShell is expected to overload the + ifcopenshell.api.owner.settings.get_user and + ifcopenshell.api.owner.settings.get_application functions. - It is not necessary to call this function directly if you are already - using other API calls. It is a low level function only available if you - are writing your own advanced scripts and want to take advantage of the - easier ownership tracking. + It is not necessary to call this function directly if you are already + using other API calls. It is a low level function only available if you + are writing your own advanced scripts and want to take advantage of the + easier ownership tracking. - :return: The newly created IfcOwnerHistory element or `None` if it's - not IFC2X3 and user or application is not found in the current project. - :rtype: Union[ifcopenshell.entity_instance, None] + :return: The newly created IfcOwnerHistory element or `None` if it's + not IFC2X3 and user or application is not found in the current project. + :rtype: Union[ifcopenshell.entity_instance, None] - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we're writing a small script, not large enough to be - # its own fully branded application. In this case, let's use the - # default application which is prepopulated with "IfcOpenShell" as - # the name and version. - application = ifcopenshell.api.run("owner.add_application", model) + # Let's imagine we're writing a small script, not large enough to be + # its own fully branded application. In this case, let's use the + # default application which is prepopulated with "IfcOpenShell" as + # the name and version. + application = ifcopenshell.api.run("owner.add_application", model) - # Let's imagine we run this as an automated QA process in an - # architectural firm. However, the results must be signed off by the - # registered architect who is liable for the project. - person = ifcopenshell.api.run("owner.add_person", model, - identification="LPARTEE", family_name="Partee", given_name="Leeable") - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects Without Ballpens") - user = ifcopenshell.api.run("owner.add_person_and_organisation", model, - person=person, organisation=organisation) + # Let's imagine we run this as an automated QA process in an + # architectural firm. However, the results must be signed off by the + # registered architect who is liable for the project. + person = ifcopenshell.api.run("owner.add_person", model, + identification="LPARTEE", family_name="Partee", given_name="Leeable") + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects Without Ballpens") + user = ifcopenshell.api.run("owner.add_person_and_organisation", model, + person=person, organisation=organisation) - # Let's configure our owner settings to hardcode always returning - # the application and user. In theory, you could build complex user - # access control lookup functions here, but this is simple enough. - ifcopenshell.api.owner.settings.get_user = lambda x: user - ifcopenshell.api.owner.settings.get_application = lambda x: application + # Let's configure our owner settings to hardcode always returning + # the application and user. In theory, you could build complex user + # access control lookup functions here, but this is simple enough. + ifcopenshell.api.owner.settings.get_user = lambda x: user + ifcopenshell.api.owner.settings.get_application = lambda x: application - # We've finished our ownership setup. Now let's start our script and - # create a space. Notice we don't actually call - # create_owner_history at all. This is already automatically handled - # by the API when necessary. Under the hood, the API is actually - # running this code on the IfcSpace element: - # element.OwnerHistory = ifcopenshell.api.run("owner.create_owner_history", model) - space = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSpace") - """ - self.file = file - self.settings = {} + # We've finished our ownership setup. Now let's start our script and + # create a space. Notice we don't actually call + # create_owner_history at all. This is already automatically handled + # by the API when necessary. Under the hood, the API is actually + # running this code on the IfcSpace element: + # element.OwnerHistory = ifcopenshell.api.run("owner.create_owner_history", model) + space = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSpace") + """ + settings = {} - def execute(self) -> Union[ifcopenshell.entity_instance, None]: - user = ifcopenshell.api.owner.settings.get_user(self.file) - if self.file.schema != "IFC2X3" and not user: - return - application = ifcopenshell.api.owner.settings.get_application(self.file) - if self.file.schema != "IFC2X3" and not application: - return - return self.file.create_entity( - "IfcOwnerHistory", - OwningUser=user, - OwningApplication=application, - State="READWRITE", - ChangeAction="ADDED", - LastModifiedDate=int(time.time()), - LastModifyingUser=user, - LastModifyingApplication=application, - CreationDate=int(time.time()), - ) + user = ifcopenshell.api.owner.settings.get_user(file) + if file.schema != "IFC2X3" and not user: + return + application = ifcopenshell.api.owner.settings.get_application(file) + if file.schema != "IFC2X3" and not application: + return + return file.create_entity( + "IfcOwnerHistory", + OwningUser=user, + OwningApplication=application, + State="READWRITE", + ChangeAction="ADDED", + LastModifiedDate=int(time.time()), + LastModifyingUser=user, + LastModifyingApplication=application, + CreationDate=int(time.time()), + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py index eb6491b359..e1125ab212 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py @@ -17,40 +17,37 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, actor=None, attributes=None): - """Edits the attributes of an IfcActor +def edit_actor(file, actor=None, attributes=None) -> None: + """Edits the attributes of an IfcActor - For more information about the attributes and data types of an - IfcActor, consult the IFC documentation. + For more information about the attributes and data types of an + IfcActor, consult the IFC documentation. - :param actor: The IfcActor entity you want to edit - :type actor: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param actor: The IfcActor entity you want to edit + :type actor: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Setup an organisation with a single role - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects Without Ballpens") - role = ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation) - ifcopenshell.api.run("owner.edit_role", model, role=role, attributes={"Role": "ARCHITECT"}) + # Setup an organisation with a single role + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects Without Ballpens") + role = ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation) + ifcopenshell.api.run("owner.edit_role", model, role=role, attributes={"Role": "ARCHITECT"}) - # Assign that organisation to a newly created actor - actor = ifcopenshell.api.run("owner.add_actor", model, actor=organisation) + # Assign that organisation to a newly created actor + actor = ifcopenshell.api.run("owner.add_actor", model, actor=organisation) - # Edit the description of the attribute. - ifcopenshell.api.run("actor.edit_actor", model, - actor=actor, attributes={"Description": "Responsible for buildings A, B, and C."}) - """ - self.file = file - self.settings = {"actor": actor, "attributes": attributes or {}} + # Edit the description of the attribute. + ifcopenshell.api.run("actor.edit_actor", model, + actor=actor, attributes={"Description": "Responsible for buildings A, B, and C."}) + """ + settings = {"actor": actor, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["actor"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["actor"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py index 0f48af25d5..ba74f0ede6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py @@ -17,42 +17,39 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, address=None, attributes=None): - """Edits the attributes of an IfcAddress +def edit_address(file, address=None, attributes=None) -> None: + """Edits the attributes of an IfcAddress - For more information about the attributes and data types of an - IfcAddress, consult the IFC documentation. + For more information about the attributes and data types of an + IfcAddress, consult the IFC documentation. - :param address: The IfcAddress entity you want to edit - :type address: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param address: The IfcAddress entity you want to edit + :type address: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # A snail mail address - postal = ifcopenshell.api.run("owner.add_address", model, - assigned_object=organisation, ifc_class="IfcPostalAddress") - ifcopenshell.api.run("owner.edit_address", model, address=postal, - attributes={"Purpose": "OFFICE", "AddressLines": ["42 Wallaby Way"], - "Town": "Sydney", "Region": "NSW", "PostalCode": "2000"}) + # A snail mail address + postal = ifcopenshell.api.run("owner.add_address", model, + assigned_object=organisation, ifc_class="IfcPostalAddress") + ifcopenshell.api.run("owner.edit_address", model, address=postal, + attributes={"Purpose": "OFFICE", "AddressLines": ["42 Wallaby Way"], + "Town": "Sydney", "Region": "NSW", "PostalCode": "2000"}) - # A phone or internet address - telecom = ifcopenshell.api.run("owner.add_address", model, - assigned_object=organisation, ifc_class="IfcTelecomAddress") - ifcopenshell.api.run("owner.edit_address", model, address=telecom, - attributes={"Purpose": "OFFICE", "TelephoneNumbers": ["+61432466949"], - "ElectronicMailAddresses": ["bobthebuilder@example.com"], - "WWWHomePageURL": "https://thinkmoult.com"}) - """ - self.file = file - self.settings = {"address": address, "attributes": attributes or {}} + # A phone or internet address + telecom = ifcopenshell.api.run("owner.add_address", model, + assigned_object=organisation, ifc_class="IfcTelecomAddress") + ifcopenshell.api.run("owner.edit_address", model, address=telecom, + attributes={"Purpose": "OFFICE", "TelephoneNumbers": ["+61432466949"], + "ElectronicMailAddresses": ["bobthebuilder@example.com"], + "WWWHomePageURL": "https://thinkmoult.com"}) + """ + settings = {"address": address, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["address"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["address"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py index 19c8d1e431..012e9152ba 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py @@ -17,32 +17,29 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, organisation=None, attributes=None): - """Edits the attributes of an IfcOrganization +def edit_organisation(file, organisation=None, attributes=None) -> None: + """Edits the attributes of an IfcOrganization - For more information about the attributes and data types of an - IfcOrganization, consult the IFC documentation. + For more information about the attributes and data types of an + IfcOrganization, consult the IFC documentation. - :param organisation: The IfcOrganization entity you want to edit - :type organisation: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param organisation: The IfcOrganization entity you want to edit + :type organisation: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects With Ballpens") - ifcopenshell.api.run("owner.edit_organisation", model, organisation=organisation, - attributes={"name": "Architects Without Ballpens"}) - """ - self.file = file - self.settings = {"organisation": organisation, "attributes": attributes or {}} + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects With Ballpens") + ifcopenshell.api.run("owner.edit_organisation", model, organisation=organisation, + attributes={"name": "Architects Without Ballpens"}) + """ + settings = {"organisation": organisation, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["organisation"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["organisation"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py index 19eedc23db..a8fdb56168 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py @@ -17,32 +17,29 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, person=None, attributes=None): - """Edits the attributes of an IfcPerson +def edit_person(file, person=None, attributes=None) -> None: + """Edits the attributes of an IfcPerson - For more information about the attributes and data types of an - IfcPerson, consult the IFC documentation. + For more information about the attributes and data types of an + IfcPerson, consult the IFC documentation. - :param person: The IfcPerson entity you want to edit - :type person: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param person: The IfcPerson entity you want to edit + :type person: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - person = ifcopenshell.api.run("owner.add_person", model, - identification="bobthebuilder", family_name="Thebuilder", given_name="Bob") - ifcopenshell.api.run("owner.edit_person", model, person=person, - attributes={"MiddleNames": ["The"], "FamilyName": "Builder"}) - """ - self.file = file - self.settings = {"person": person, "attributes": attributes or {}} + person = ifcopenshell.api.run("owner.add_person", model, + identification="bobthebuilder", family_name="Thebuilder", given_name="Bob") + ifcopenshell.api.run("owner.edit_person", model, person=person, + attributes={"MiddleNames": ["The"], "FamilyName": "Builder"}) + """ + settings = {"person": person, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["person"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["person"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py index 160f6f6d91..6934af27e0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py @@ -17,36 +17,33 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, role=None, attributes=None): - """Edits the attributes of an IfcActorRole +def edit_role(file, role=None, attributes=None) -> None: + """Edits the attributes of an IfcActorRole - For more information about the attributes and data types of an - IfcActorRole, consult the IFC documentation. + For more information about the attributes and data types of an + IfcActorRole, consult the IFC documentation. - :param role: The IfcActorRole entity you want to edit - :type role: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param role: The IfcActorRole entity you want to edit + :type role: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - person = ifcopenshell.api.run("owner.add_person", model, - identification="bobthebuilder", family_name="Thebuilder", given_name="Bob") + person = ifcopenshell.api.run("owner.add_person", model, + identification="bobthebuilder", family_name="Thebuilder", given_name="Bob") - # By default, the role is an architect - role = ifcopenshell.api.run("owner.add_role", model, assigned_object=person) + # By default, the role is an architect + role = ifcopenshell.api.run("owner.add_role", model, assigned_object=person) - # But Bob is not an architect - ifcopenshell.api.run("owner.edit_role", model, role=role, attributes={"Role": "CONSTRUCTIONMANAGER"}) - """ - self.file = file - self.settings = {"role": role, "attributes": attributes or {}} + # But Bob is not an architect + ifcopenshell.api.run("owner.edit_role", model, role=role, attributes={"Role": "CONSTRUCTIONMANAGER"}) + """ + settings = {"role": role, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["role"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["role"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py index ac99299a6f..49feb54179 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py @@ -20,36 +20,33 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, actor=None): - """Removes an actor +def remove_actor(file, actor=None) -> None: + """Removes an actor - :param actor: The IfcActor to remove. - :type actor: ifcopenshell.entity_instance - :return: None - :rtype: None + :param actor: The IfcActor to remove. + :type actor: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Setup an organisation with a single role - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects Without Ballpens") - role = ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation) - ifcopenshell.api.run("owner.edit_role", model, role=role, attributes={"Role": "ARCHITECT"}) + # Setup an organisation with a single role + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects Without Ballpens") + role = ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation) + ifcopenshell.api.run("owner.edit_role", model, role=role, attributes={"Role": "ARCHITECT"}) - # Assign that organisation to a newly created actor - actor = ifcopenshell.api.run("owner.add_actor", model, actor=organisation) + # Assign that organisation to a newly created actor + actor = ifcopenshell.api.run("owner.add_actor", model, actor=organisation) - # Actually we need ballpens on this project - ifcopenshell.api.run("owner.remove_actor", model, actor=actor) - """ - self.file = file - self.settings = {"actor": actor} + # Actually we need ballpens on this project + ifcopenshell.api.run("owner.remove_actor", model, actor=actor) + """ + settings = {"actor": actor} - def execute(self): - history = self.settings["actor"].OwnerHistory - self.file.remove(self.settings["actor"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + history = settings["actor"].OwnerHistory + file.remove(settings["actor"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py index 728ffb45f5..5fba84583b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py @@ -17,35 +17,32 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, address=None): - """Removes an address +def remove_address(file, address=None) -> None: + """Removes an address - Naturally, any organisations or people using that address will have the - relationship removed. + Naturally, any organisations or people using that address will have the + relationship removed. - :param address: The IfcAddress to remove. - :type address: ifcopenshell.entity_instance - :return: None - :rtype: None + :param address: The IfcAddress to remove. + :type address: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - organisation = ifcopenshell.api.run("owner.add_organisation", model) - address = ifcopenshell.api.run("owner.add_address", model, - assigned_object=organisation, ifc_class="IfcPostalAddress") + organisation = ifcopenshell.api.run("owner.add_organisation", model) + address = ifcopenshell.api.run("owner.add_address", model, + assigned_object=organisation, ifc_class="IfcPostalAddress") - # Change our mind and delete it - ifcopenshell.api.run("owner.remove_address", model, address=address) - """ - self.file = file - self.settings = {"address": address} + # Change our mind and delete it + ifcopenshell.api.run("owner.remove_address", model, address=address) + """ + settings = {"address": address} - def execute(self): - for inverse in self.file.get_inverse(self.settings["address"]): - if inverse.is_a() in ("IfcOrganization", "IfcPerson"): - if inverse.Addresses == (self.settings["address"],): - inverse.Addresses = None - self.file.remove(self.settings["address"]) + for inverse in file.get_inverse(settings["address"]): + if inverse.is_a() in ("IfcOrganization", "IfcPerson"): + if inverse.Addresses == (settings["address"],): + inverse.Addresses = None + file.remove(settings["address"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py index 7e21c07943..16973cfcc4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py @@ -17,27 +17,24 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, application=None): - """Removes an application +def remove_application(file, application=None) -> None: + """Removes an application - Warning: removing an application may invalidate ownership histories. - Check whether or not the application is used anywhere prior to removal. + Warning: removing an application may invalidate ownership histories. + Check whether or not the application is used anywhere prior to removal. - :param address: The IfcApplication to remove. - :type address: ifcopenshell.entity_instance - :return: None - :rtype: None + :param address: The IfcApplication to remove. + :type address: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - application = ifcopenshell.api.run("owner.add_application", model) - ifcopenshell.api.run("owner.remove_address", model, application=application) - """ - self.file = file - self.settings = {"application": application} + application = ifcopenshell.api.run("owner.add_application", model) + ifcopenshell.api.run("owner.remove_address", model, application=application) + """ + settings = {"application": application} - def execute(self): - self.file.remove(self.settings["application"]) + file.remove(settings["application"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py index e9e2c77e9e..42111e017e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py @@ -19,53 +19,50 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, organisation=None): - """Remove an organisation +def remove_organisation(file, organisation=None) -> None: + """Remove an organisation - All roles and addresses assigned to the organisation will also be - removed. + All roles and addresses assigned to the organisation will also be + removed. - :param organisation: The IfcOrganization to remove - :type organisation: ifcopenshell.entity_instance - :return: None - :rtype: None + :param organisation: The IfcOrganization to remove + :type organisation: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects Without Ballpens") - ifcopenshell.api.run("owner.remove_organisation", model, organisation=organisation) - """ - self.file = file - self.settings = {"organisation": organisation} + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects Without Ballpens") + ifcopenshell.api.run("owner.remove_organisation", model, organisation=organisation) + """ + settings = {"organisation": organisation} - def execute(self): - for role in self.settings["organisation"].Roles or []: - if len(self.file.get_inverse(role)) == 1: - ifcopenshell.api.run("owner.remove_role", self.file, role=role) - for address in self.settings["organisation"].Addresses or []: - if len(self.file.get_inverse(address)) == 1: - ifcopenshell.api.run("owner.remove_address", self.file, address=address) - for inverse in self.file.get_inverse(self.settings["organisation"]): - if inverse.is_a("IfcOrganizationRelationship"): - if inverse.RelatingOrganization == self.settings["organisation"]: - self.file.remove(inverse) - elif inverse.RelatedOrganizations == (self.settings["organisation"],): - self.file.remove(inverse) - elif inverse.is_a("IfcDocumentInformation"): - if inverse.Editors == (self.settings["organisation"],): - inverse.Editors = None - elif inverse.is_a("IfcPersonAndOrganization"): - ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=inverse) - elif inverse.is_a("IfcActor"): - ifcopenshell.api.run("root.remove_product", self.file, product=inverse) - elif inverse.is_a("IfcResourceLevelRelationship") and not inverse.is_a("IfcOrganizationRelationship"): - if inverse.RelatedResourceObjects == (self.settings["organisation"],): - self.file.remove(inverse) - elif inverse.is_a("IfcApplication"): - ifcopenshell.api.run("owner.remove_application", self.file, application=inverse) + for role in settings["organisation"].Roles or []: + if len(file.get_inverse(role)) == 1: + ifcopenshell.api.run("owner.remove_role", file, role=role) + for address in settings["organisation"].Addresses or []: + if len(file.get_inverse(address)) == 1: + ifcopenshell.api.run("owner.remove_address", file, address=address) + for inverse in file.get_inverse(settings["organisation"]): + if inverse.is_a("IfcOrganizationRelationship"): + if inverse.RelatingOrganization == settings["organisation"]: + file.remove(inverse) + elif inverse.RelatedOrganizations == (settings["organisation"],): + file.remove(inverse) + elif inverse.is_a("IfcDocumentInformation"): + if inverse.Editors == (settings["organisation"],): + inverse.Editors = None + elif inverse.is_a("IfcPersonAndOrganization"): + ifcopenshell.api.run("owner.remove_person_and_organisation", file, person_and_organisation=inverse) + elif inverse.is_a("IfcActor"): + ifcopenshell.api.run("root.remove_product", file, product=inverse) + elif inverse.is_a("IfcResourceLevelRelationship") and not inverse.is_a("IfcOrganizationRelationship"): + if inverse.RelatedResourceObjects == (settings["organisation"],): + file.remove(inverse) + elif inverse.is_a("IfcApplication"): + ifcopenshell.api.run("owner.remove_application", file, application=inverse) - self.file.remove(self.settings["organisation"]) + file.remove(settings["organisation"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py index 8e1ba7a972..aac583b22e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py @@ -19,51 +19,48 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, person=None): - """Remove an person +def remove_person(file, person=None) -> None: + """Remove an person - All roles and addresses assigned to the person will also be - removed. + All roles and addresses assigned to the person will also be + removed. - :param person: The IfcPerson to remove - :type person: ifcopenshell.entity_instance - :return: None - :rtype: None + :param person: The IfcPerson to remove + :type person: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - ifcopenshell.api.run("owner.add_person", model, - identification="bobthebuilder", family_name="Thebuilder", given_name="Bob") - ifcopenshell.api.run("owner.remove_person", model, person=person) - """ - self.file = file - self.settings = {"person": person} + ifcopenshell.api.run("owner.add_person", model, + identification="bobthebuilder", family_name="Thebuilder", given_name="Bob") + ifcopenshell.api.run("owner.remove_person", model, person=person) + """ + settings = {"person": person} - def execute(self): - for role in self.settings["person"].Roles or []: - if len(self.file.get_inverse(role)) == 1: - ifcopenshell.api.run("owner.remove_role", self.file, role=role) - for address in self.settings["person"].Addresses or []: - if len(self.file.get_inverse(address)) == 1: - ifcopenshell.api.run("owner.remove_address", self.file, address=address) - for inverse in self.file.get_inverse(self.settings["person"]): - if inverse.is_a("IfcWorkControl"): - if inverse.Creators == (self.settings["person"],): - inverse.Creators = None - elif inverse.is_a("IfcInventory"): - if inverse.ResponsiblePersons == (self.settings["person"],): - inverse.ResponsiblePersons = None - elif inverse.is_a("IfcDocumentInformation"): - if inverse.Editors == (self.settings["person"],): - inverse.Editors = None - elif inverse.is_a("IfcPersonAndOrganization"): - ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=inverse) - elif inverse.is_a("IfcActor"): - ifcopenshell.api.run("root.remove_product", self.file, product=inverse) - elif inverse.is_a("IfcResourceLevelRelationship"): - if inverse.RelatedResourceObjects == (self.settings["person"],): - self.file.remove(inverse) - self.file.remove(self.settings["person"]) + for role in settings["person"].Roles or []: + if len(file.get_inverse(role)) == 1: + ifcopenshell.api.run("owner.remove_role", file, role=role) + for address in settings["person"].Addresses or []: + if len(file.get_inverse(address)) == 1: + ifcopenshell.api.run("owner.remove_address", file, address=address) + for inverse in file.get_inverse(settings["person"]): + if inverse.is_a("IfcWorkControl"): + if inverse.Creators == (settings["person"],): + inverse.Creators = None + elif inverse.is_a("IfcInventory"): + if inverse.ResponsiblePersons == (settings["person"],): + inverse.ResponsiblePersons = None + elif inverse.is_a("IfcDocumentInformation"): + if inverse.Editors == (settings["person"],): + inverse.Editors = None + elif inverse.is_a("IfcPersonAndOrganization"): + ifcopenshell.api.run("owner.remove_person_and_organisation", file, person_and_organisation=inverse) + elif inverse.is_a("IfcActor"): + ifcopenshell.api.run("root.remove_product", file, product=inverse) + elif inverse.is_a("IfcResourceLevelRelationship"): + if inverse.RelatedResourceObjects == (settings["person"],): + file.remove(inverse) + file.remove(settings["person"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py index fc85722e68..8473e04b87 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py @@ -19,45 +19,42 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, person_and_organisation=None): - """Removes a person and organisation +def remove_person_and_organisation(file, person_and_organisation=None) -> None: + """Removes a person and organisation - Note that the underlying person and organisation is not removed, only - the "person and organisation" group. + Note that the underlying person and organisation is not removed, only + the "person and organisation" group. - :param person_and_organisation: The IfcPersonAndOrganization to remove. - :type person_and_organisation: ifcopenshell.entity_instance - :return: None - :rtype: None + :param person_and_organisation: The IfcPersonAndOrganization to remove. + :type person_and_organisation: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - person = ifcopenshell.api.run("owner.add_person", model, - identification="lecorbycorbycorb", family_name="Curbosiar", given_name="Le") - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects Without Ballpens") + person = ifcopenshell.api.run("owner.add_person", model, + identification="lecorbycorbycorb", family_name="Curbosiar", given_name="Le") + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects Without Ballpens") - user = ifcopenshell.api.run("owner.add_person_and_organisation", model, - person=person, organisation=organisation) + user = ifcopenshell.api.run("owner.add_person_and_organisation", model, + person=person, organisation=organisation) - ifcopenshell.api.run("owner.remove_person_and_organisation", model, person_and_organisation=user) - """ - self.file = file - self.settings = {"person_and_organisation": person_and_organisation} + ifcopenshell.api.run("owner.remove_person_and_organisation", model, person_and_organisation=user) + """ + settings = {"person_and_organisation": person_and_organisation} - def execute(self): - for inverse in self.file.get_inverse(self.settings["person_and_organisation"]): - if inverse.is_a("IfcDocumentInformation"): - if inverse.Editors == (self.settings["person_and_organisation"],): - inverse.Editors = None - elif inverse.is_a("IfcActor"): - ifcopenshell.api.run("root.remove_product", self.file, product=inverse) - elif inverse.is_a("IfcResourceLevelRelationship"): - if inverse.RelatedResourceObjects == (self.settings["person_and_organisation"],): - self.file.remove(inverse) - elif inverse.is_a("IfcOwnerHistory"): - self.file.remove(inverse) - self.file.remove(self.settings["person_and_organisation"]) + for inverse in file.get_inverse(settings["person_and_organisation"]): + if inverse.is_a("IfcDocumentInformation"): + if inverse.Editors == (settings["person_and_organisation"],): + inverse.Editors = None + elif inverse.is_a("IfcActor"): + ifcopenshell.api.run("root.remove_product", file, product=inverse) + elif inverse.is_a("IfcResourceLevelRelationship"): + if inverse.RelatedResourceObjects == (settings["person_and_organisation"],): + file.remove(inverse) + elif inverse.is_a("IfcOwnerHistory"): + file.remove(inverse) + file.remove(settings["person_and_organisation"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py index 5de9915c33..08bf39881c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py @@ -17,38 +17,35 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, role=None): - """Removes a role +def remove_role(file, role=None) -> None: + """Removes a role - People and organisations using the role will be untouched. This may - leave some of them without roles. + People and organisations using the role will be untouched. This may + leave some of them without roles. - :param role: The IfcActorRole to remove. - :type role: ifcopenshell.entity_instance - :return: None - :rtype: None + :param role: The IfcActorRole to remove. + :type role: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="AWB", name="Architects Without Ballpens") - role = ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation, role="ARCHITECT") + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="AWB", name="Architects Without Ballpens") + role = ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation, role="ARCHITECT") - # After running this, the organisation will have no role again - ifcopenshell.api.run("owner.remove_role", model, role=role) - """ - self.file = file - self.settings = {"role": role} + # After running this, the organisation will have no role again + ifcopenshell.api.run("owner.remove_role", model, role=role) + """ + settings = {"role": role} - def execute(self): - for inverse in self.file.get_inverse(self.settings["role"]): - if inverse.is_a() in ("IfcOrganization", "IfcPerson", "IfcPersonAndOrganization"): - if inverse.Roles == (self.settings["role"],): - inverse.Roles = None - elif inverse.is_a("IfcResourceLevelRelationship") and not inverse.is_a("IfcOrganizationRelationship"): - if inverse.RelatedResourceObjects == (self.settings["organisation"],): - self.file.remove(inverse) - self.file.remove(self.settings["role"]) + for inverse in file.get_inverse(settings["role"]): + if inverse.is_a() in ("IfcOrganization", "IfcPerson", "IfcPersonAndOrganization"): + if inverse.Roles == (settings["role"],): + inverse.Roles = None + elif inverse.is_a("IfcResourceLevelRelationship") and not inverse.is_a("IfcOrganizationRelationship"): + if inverse.RelatedResourceObjects == (settings["organisation"],): + file.remove(inverse) + file.remove(settings["role"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py index 711732bcdc..c57d0172f5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py @@ -21,58 +21,55 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, relating_actor=None, related_object=None): - """Unassigns an actor to an object +def unassign_actor(file, relating_actor=None, related_object=None) -> None: + """Unassigns an actor to an object - This means that the actor is no longer responsible for the object. + This means that the actor is no longer responsible for the object. - :param relating_actor: The IfcActor who is responsible for the object. - :type relating_actor: ifcopenshell.entity_instance - :param related_object: The object the actor is responsible for. - :type related_object: ifcopenshell.entity_instance - :return: The updated IfcRelAssignsToActor relationship or none if there - is no more valid relationship. - :rtype: None, ifcopenshell.entity_instance + :param relating_actor: The IfcActor who is responsible for the object. + :type relating_actor: ifcopenshell.entity_instance + :param related_object: The object the actor is responsible for. + :type related_object: ifcopenshell.entity_instance + :return: The updated IfcRelAssignsToActor relationship or none if there + is no more valid relationship. + :rtype: None, ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # We need to procure and install 2 of this particular pump type in our facility. - pump_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcPumpType") + # We need to procure and install 2 of this particular pump type in our facility. + pump_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcPumpType") - # Define who the manufacturer is - manufacturer = ifcopenshell.api.run("owner.add_organisation", model, - identification="PWP", name="Pumps With Power") - ifcopenshell.api.run("owner.add_role", model, assigned_object=manufacturer, role="MANUFACTURER") + # Define who the manufacturer is + manufacturer = ifcopenshell.api.run("owner.add_organisation", model, + identification="PWP", name="Pumps With Power") + ifcopenshell.api.run("owner.add_role", model, assigned_object=manufacturer, role="MANUFACTURER") - # Make the manufacturer responsible for that pump type. - ifcopenshell.api.run("owner.assign_actor", model, - relating_actor=manufacturer, related_object=pump_type) + # Make the manufacturer responsible for that pump type. + ifcopenshell.api.run("owner.assign_actor", model, + relating_actor=manufacturer, related_object=pump_type) - # Undo the assignment - ifcopenshell.api.run("owner.unassign_actor", model, - relating_actor=manufacturer, related_object=pump_type) - """ - self.file = file - self.settings = { - "relating_actor": relating_actor, - "related_object": related_object, - } + # Undo the assignment + ifcopenshell.api.run("owner.unassign_actor", model, + relating_actor=manufacturer, related_object=pump_type) + """ + settings = { + "relating_actor": relating_actor, + "related_object": related_object, + } - def execute(self): - for rel in self.settings["related_object"].HasAssignments or []: - if not rel.is_a("IfcRelAssignsToActor") or rel.RelatingActor != self.settings["relating_actor"]: - continue - if len(rel.RelatedObjects) == 1: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - return - related_objects = list(rel.RelatedObjects) - related_objects.remove(self.settings["related_object"]) - rel.RelatedObjects = related_objects - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - return rel + for rel in settings["related_object"].HasAssignments or []: + if not rel.is_a("IfcRelAssignsToActor") or rel.RelatingActor != settings["relating_actor"]: + continue + if len(rel.RelatedObjects) == 1: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + return + related_objects = list(rel.RelatedObjects) + related_objects.remove(settings["related_object"]) + rel.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py index 797d1b8b57..95a356ef2f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/update_owner_history.py @@ -24,71 +24,70 @@ import ifcopenshell.util.element from typing import Union -class Usecase: - def __init__(self, file: ifcopenshell.file, element: ifcopenshell.entity_instance): - """Updates the owner that is assigned to an object +def update_owner_history( + file: ifcopenshell.file, element: ifcopenshell.entity_instance +) -> Union[ifcopenshell.entity_instance, None]: + """Updates the owner that is assigned to an object - This ensures that the owner is tracked to have modified the object last, - including the time when the change occured. See - ifcopenshell.api.owner.create_owner_history for details. + This ensures that the owner is tracked to have modified the object last, + including the time when the change occured. See + ifcopenshell.api.owner.create_owner_history for details. - :param element: The IfcRoot element to update the ownership details on - when a change is made. - :type element: ifcopenshell.entity_instance - :return: The updated IfcOwnerHistory element. - :rtype: ifcopenshell.entity_instance + :param element: The IfcRoot element to update the ownership details on + when a change is made. + :type element: ifcopenshell.entity_instance + :return: The updated IfcOwnerHistory element. + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # See ifcopenshell.api.owner.create_owner_history for setup - # [ ... example setup code ... ] + # See ifcopenshell.api.owner.create_owner_history for setup + # [ ... example setup code ... ] - # We've finished our ownership setup. Now let's start our script and - # create a space. Notice we don't actually call - # create_owner_history at all. This is already automatically handled - # by the API when necessary. Under the hood, the API is actually - # running this code on the IfcSpace element: - # element.OwnerHistory = ifcopenshell.api.run("owner.create_owner_history", model) - space = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSpace") + # We've finished our ownership setup. Now let's start our script and + # create a space. Notice we don't actually call + # create_owner_history at all. This is already automatically handled + # by the API when necessary. Under the hood, the API is actually + # running this code on the IfcSpace element: + # element.OwnerHistory = ifcopenshell.api.run("owner.create_owner_history", model) + space = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSpace") - # Any edits we make will have ownership tracking automatically - # applied. There is no need to run any owner.update_owner_history - # API calls either. - ifcopenshell.api.run("attribute.edit_attributes", model, product=space, attributes={"Name": "Lobby"}) - """ - self.file = file - self.settings = {"element": element} + # Any edits we make will have ownership tracking automatically + # applied. There is no need to run any owner.update_owner_history + # API calls either. + ifcopenshell.api.run("attribute.edit_attributes", model, product=space, attributes={"Name": "Lobby"}) + """ + settings = {"element": element} - def execute(self) -> Union[ifcopenshell.entity_instance, None]: - element = self.settings["element"] - if not element.is_a("IfcRoot"): - return - user = ifcopenshell.api.owner.settings.get_user(self.file) - if not user: - return - application = ifcopenshell.api.owner.settings.get_application(self.file) - if not application: - return + element = settings["element"] + if not element.is_a("IfcRoot"): + return + user = ifcopenshell.api.owner.settings.get_user(file) + if not user: + return + application = ifcopenshell.api.owner.settings.get_application(file) + if not application: + return - # 1 IfcRoot IfcOwnerHistory - owner_history = element[1] - if not owner_history: - owner_history = ifcopenshell.api.run("owner.create_owner_history", self.file) - element[1] = owner_history - return owner_history - - if self.file.get_total_inverses(owner_history) > 1: - owner_history = ifcopenshell.util.element.copy(self.file, owner_history) - element[1] = owner_history - - # 3 IfcOwnerHistory ChangeAction - owner_history[3] = "MODIFIED" - # 4 IfcOwnerHistory LastModifiedDate - owner_history[4] = int(time.time()) - # 5 IfcOwnerHistory LastModifyingUser - owner_history[5] = user - # 6 IfcOwnerHistory LastModifyingApplication - owner_history[6] = application + # 1 IfcRoot IfcOwnerHistory + owner_history = element[1] + if not owner_history: + owner_history = ifcopenshell.api.run("owner.create_owner_history", file) + element[1] = owner_history return owner_history + + if file.get_total_inverses(owner_history) > 1: + owner_history = ifcopenshell.util.element.copy(file, owner_history) + element[1] = owner_history + + # 3 IfcOwnerHistory ChangeAction + owner_history[3] = "MODIFIED" + # 4 IfcOwnerHistory LastModifiedDate + owner_history[4] = int(time.time()) + # 5 IfcOwnerHistory LastModifyingUser + owner_history[5] = user + # 6 IfcOwnerHistory LastModifyingApplication + owner_history[6] = application + return owner_history diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py index e0caddbe3c..7decc6750b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py @@ -15,3 +15,9 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_arbitrary_profile import add_arbitrary_profile +from .add_arbitrary_profile_with_voids import add_arbitrary_profile_with_voids +from .add_parameterized_profile import add_parameterized_profile +from .edit_profile import edit_profile +from .remove_profile import remove_profile diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py index 8cced9d934..9acc800b89 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py @@ -19,39 +19,42 @@ import ifcopenshell.util.unit +def add_arbitrary_profile(file, profile=None, name=None) -> None: + """Adds a new arbitrary polyline-based profile + + The profile is represented as a polyline defined by a list of + coordinates. Only straight segments are allowed. Coordinates must be + provided in SI meters. + + To represent a closed curve, the first and last coordinate must be + identical. + + :param profile: A list of coordinates + :type profile: list[list[float]] + :param name: If the profile is semantically significant (i.e. to be + managed and reused by the user) then it must be named. Otherwise, + this may be left as none. + :type name: str, optional + :return: The newly created IfcArbitraryClosedProfileDef + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # A 10mm by 100mm rectangle, such that might be used as a wooden + # skirting board or kick plate. + square = ifcopenshell.api.run("profile.add_arbitrary_profile", model, + profile=[(0., 0.), (.01, 0.), (.01, .1), (0., .1), (0., 0.)], + name="SK01 Profile") + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"profile": profile, "name": name} + return usecase.execute() + + class Usecase: - def __init__(self, file, profile=None, name=None): - """Adds a new arbitrary polyline-based profile - - The profile is represented as a polyline defined by a list of - coordinates. Only straight segments are allowed. Coordinates must be - provided in SI meters. - - To represent a closed curve, the first and last coordinate must be - identical. - - :param profile: A list of coordinates - :type profile: list[list[float]] - :param name: If the profile is semantically significant (i.e. to be - managed and reused by the user) then it must be named. Otherwise, - this may be left as none. - :type name: str, optional - :return: The newly created IfcArbitraryClosedProfileDef - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # A 10mm by 100mm rectangle, such that might be used as a wooden - # skirting board or kick plate. - square = ifcopenshell.api.run("profile.add_arbitrary_profile", model, - profile=[(0., 0.), (.01, 0.), (.01, .1), (0., .1), (0., 0.)], - name="SK01 Profile") - """ - self.file = file - self.settings = {"profile": profile, "name": name} - def execute(self): self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) points = [self.convert_si_to_unit(p) for p in self.settings["profile"]] diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py index 7c1af83294..e1a6fe9cdb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py @@ -19,46 +19,49 @@ import ifcopenshell.util.unit +def add_arbitrary_profile_with_voids(file, outer_profile=None, inner_profiles=None, name=None) -> None: + """Adds a new arbitrary polyline-based profile with voids + + The outer profile is represented as a polyline defined by a list of + coordinates. Only straight segments are allowed. Coordinates must be + provided in SI meters. + + To represent a closed curve, the first and last coordinate must be + identical. + + The inner profiles are represented as a list of polylines. + Every polyline in defined by a list of coordinates. + Only straight segments are allowed. Coordinates must be + provided in SI meters. + + :param outer_profile: A list of coordinates + :type profile: list[float] + :param inner_profiles: A list of polylines + :type profile: list[list[float]] + :param name: If the profile is semantically significant (i.e. to be + managed and reused by the user) then it must be named. Otherwise, + this may be left as none. + :type name: str, optional + :return: The newly created IfcArbitraryProfileDefWithVoids + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # A 400mm by 400mm square with a 200mm by 200mm hole in it. + square_with_hole = ifcopenshell.api.run("profile.add_arbitrary_profile_with_voids", model, + outer_profile=[(0., 0.), (.4, 0.), (.4, .4), (0., .4), (0., 0.)], + inner_profiles=[[(0.1, 0.1), (0.3, 0.1), (0.3, 0.3), (0.1, 0.3), (0.1, 0.1)]], + name="SK01 Hole Profile") + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"outer_profile": outer_profile, "inner_profiles": inner_profiles, "name": name} + return usecase.execute() + + class Usecase: - def __init__(self, file, outer_profile=None, inner_profiles=None, name=None): - """Adds a new arbitrary polyline-based profile with voids - - The outer profile is represented as a polyline defined by a list of - coordinates. Only straight segments are allowed. Coordinates must be - provided in SI meters. - - To represent a closed curve, the first and last coordinate must be - identical. - - The inner profiles are represented as a list of polylines. - Every polyline in defined by a list of coordinates. - Only straight segments are allowed. Coordinates must be - provided in SI meters. - - :param outer_profile: A list of coordinates - :type profile: list[float] - :param inner_profiles: A list of polylines - :type profile: list[list[float]] - :param name: If the profile is semantically significant (i.e. to be - managed and reused by the user) then it must be named. Otherwise, - this may be left as none. - :type name: str, optional - :return: The newly created IfcArbitraryProfileDefWithVoids - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # A 400mm by 400mm square with a 200mm by 200mm hole in it. - square_with_hole = ifcopenshell.api.run("profile.add_arbitrary_profile_with_voids", model, - outer_profile=[(0., 0.), (.4, 0.), (.4, .4), (0., .4), (0., 0.)], - inner_profiles=[[(0.1, 0.1), (0.3, 0.1), (0.3, 0.3), (0.1, 0.3), (0.1, 0.1)]], - name="SK01 Hole Profile") - """ - self.file = file - self.settings = {"outer_profile": outer_profile, "inner_profiles": inner_profiles, "name": name} - def execute(self): self.settings["unit_scale"] = ifcopenshell.util.unit.calculate_unit_scale(self.file) outer_points = [self.convert_si_to_unit(p) for p in self.settings["outer_profile"]] @@ -69,7 +72,9 @@ class Usecase: outer_curve = self.file.createIfcPolyline([self.file.createIfcCartesianPoint(p) for p in outer_points]) inner_curves = [] for inner_point in inner_points: - inner_curves.append(self.file.createIfcPolyline([self.file.createIfcCartesianPoint(p) for p in inner_point])) + inner_curves.append( + self.file.createIfcPolyline([self.file.createIfcCartesianPoint(p) for p in inner_point]) + ) else: outer_curve = self.file.createIfcIndexedPolyCurve(self.file.createIfcCartesianPointList3D(outer_points)) inner_curves = [] diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py index 0201095feb..c0a6348656 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py @@ -17,33 +17,30 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, ifc_class=None): - """Adds a new parameterised profile +def add_parameterized_profile(file, ifc_class=None) -> None: + """Adds a new parameterised profile - IFC offers parameterised profiles for common standardised hot roll - steel sections and common concrete forms. A full list is available on - the IFC documentation as subclasses of IfcParameterizedProfileDef. + IFC offers parameterised profiles for common standardised hot roll + steel sections and common concrete forms. A full list is available on + the IFC documentation as subclasses of IfcParameterizedProfileDef. - Currently, this API has no benefit over directly calling - ifcopenshell.file.create_entity. + Currently, this API has no benefit over directly calling + ifcopenshell.file.create_entity. - :param ifc_class: The subclass of IfcParameterizedProfileDef that you'd - like to create. - :type ifc_class: str - :return: The newly created element depending on the specified ifc_class. - :rtype: ifcopenshell.entity_instance + :param ifc_class: The subclass of IfcParameterizedProfileDef that you'd + like to create. + :type ifc_class: str + :return: The newly created element depending on the specified ifc_class. + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - circle = ifcopenshell.api.run("profile.add_parameterized_profile", model, - ifc_class="IfcCircleProfileDef") - circle.Radius = 1. - """ - self.file = file - self.settings = {"ifc_class": ifc_class} + circle = ifcopenshell.api.run("profile.add_parameterized_profile", model, + ifc_class="IfcCircleProfileDef") + circle.Radius = 1. + """ + settings = {"ifc_class": ifc_class} - def execute(self): - return self.file.create_entity(self.settings["ifc_class"]) + return file.create_entity(settings["ifc_class"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py index 759a5d4c7d..4d525a5d32 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py @@ -17,34 +17,31 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, profile=None, attributes=None): - """Edits the attributes of an IfcProfileDef +def edit_profile(file, profile=None, attributes=None) -> None: + """Edits the attributes of an IfcProfileDef - For more information about the attributes and data types of an - IfcProfileDef, consult the IFC documentation. + For more information about the attributes and data types of an + IfcProfileDef, consult the IFC documentation. - :param profile: The IfcProfileDef entity you want to edit - :type profile: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param profile: The IfcProfileDef entity you want to edit + :type profile: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - circle = ifcopenshell.api.run("profile.add_parameterized_profile", model, - ifc_class="IfcCircleProfileDef") - circle = 1. + circle = ifcopenshell.api.run("profile.add_parameterized_profile", model, + ifc_class="IfcCircleProfileDef") + circle = 1. - ifcopenshell.api.run("profile.edit_profile", model, - profile=circle, attributes={"ProfileName": "1000mm Dia"}) - """ - self.file = file - self.settings = {"profile": profile, "attributes": attributes or {}} + ifcopenshell.api.run("profile.edit_profile", model, + profile=circle, attributes={"ProfileName": "1000mm Dia"}) + """ + settings = {"profile": profile, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["profile"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["profile"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py index 47d3391e00..58f3eebedb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py @@ -20,32 +20,29 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, profile=None): - """Removes a profile +def remove_profile(file, profile=None) -> None: + """Removes a profile - :param profile: The IfcProfileDef to remove. - :type profile: ifcopenshell.entity_instance - :return: None - :rtype: None + :param profile: The IfcProfileDef to remove. + :type profile: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - circle = ifcopenshell.api.run("profile.add_parameterized_profile", model, - ifc_class="IfcCircleProfileDef") - circle = 1. - ifcopenshell.api.run("profile.remove_profile", model, profile=circle) - """ - self.file = file - self.settings = {"profile": profile} + circle = ifcopenshell.api.run("profile.add_parameterized_profile", model, + ifc_class="IfcCircleProfileDef") + circle = 1. + ifcopenshell.api.run("profile.remove_profile", model, profile=circle) + """ + settings = {"profile": profile} - def execute(self): - subelements = set() - for attribute in self.settings["profile"]: - if isinstance(attribute, ifcopenshell.entity_instance): - subelements.add(attribute) - self.file.remove(self.settings["profile"]) - for subelement in subelements: - ifcopenshell.util.element.remove_deep2(self.file, subelement) + subelements = set() + for attribute in settings["profile"]: + if isinstance(attribute, ifcopenshell.entity_instance): + subelements.add(attribute) + file.remove(settings["profile"]) + for subelement in subelements: + ifcopenshell.util.element.remove_deep2(file, subelement) diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py index e0caddbe3c..e9c21fbddd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py @@ -15,3 +15,8 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .append_asset import append_asset +from .assign_declaration import assign_declaration +from .create_file import create_file +from .unassign_declaration import unassign_declaration diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py index 3e88c7c82a..fc101347ee 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py @@ -21,100 +21,103 @@ import ifcopenshell.api import ifcopenshell.api.owner.settings +def append_asset(file, library=None, element=None, reuse_identities=None) -> None: + """Appends an asset from a library into the active project + + A BIM library asset may be a type product (e.g. wall type), product + (e.g. pump), material, profile, or cost schedule. + + This copies the asset from the specified library file into the active + project. It handles all details like ensuring that product materials, + styles, properties, quantities, and so on are preserved. + + If an asset contains geometry, the geometric contexts are also + intelligentely transplanted such that existing equivalent contexts are + reused. + + Do not mix units. + + :param library: The file object containing the asset. + :type library: ifcopenshell.file + :param element: An element in the library file of the asset. It may be + an IfcTypeProduct, IfcProduct, IfcMaterial, IfcCostSchedule, or + IfcProfileDef. + :type element: ifcopenshell.entity_instance + :param reuse_identities: Optional dictionary of mapped entities' identities to the + already created elements. It will be used to avoid creating + duplicated inverse elements during multiple `project.append_asset` calls. If you want + to add just 1 asset or if added assets won't have any shared elements, then it can be left empty. + :type reuse_identities: dict[int, ifcopenshell.entity_instance] + :return: The appended element + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # Programmatically generate a library. You could do this visually too. + library = ifcopenshell.api.run("project.create_file") + root = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject", name="Demo Library") + context = ifcopenshell.api.run("root.create_entity", library, + ifc_class="IfcProjectLibrary", name="Demo Library") + ifcopenshell.api.run("project.assign_declaration", library, definitions=[context], relating_context=root) + + # Assign units for our example library + unit = ifcopenshell.api.run("unit.add_si_unit", library, + unit_type="LENGTHUNIT", name="METRE", prefix="MILLI") + ifcopenshell.api.run("unit.assign_unit", library, units=[unit]) + + # Let's create a single asset of a 200mm thick concrete wall + wall_type = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType", name="WAL01") + concrete = ifcopenshell.api.run("material.add_material", usecase.file, name="CON", category="concrete") + rel = ifcopenshell.api.run("material.assign_material", library, + products=[wall_type], type="IfcMaterialLayerSet") + layer = ifcopenshell.api.run("material.add_layer", library, + layer_set=rel.RelatingMaterial, material=concrete) + layer.Name = "Structure" + layer.LayerThickness = 200 + + # Mark our wall type as a reusable asset in our library. + ifcopenshell.api.run("project.assign_declaration", library, + definitions=[wall_type], relating_context=context) + + # Let's imagine we're starting a new project + model = ifcopenshell.api.run("project.create_file") + project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject", name="Test") + + # Now we can easily append our wall type from our libary + wall_type = ifcopenshell.api.run("project.append_asset", model, library=library, element=wall_type) + + Example of adding multiple assets and avoiding duplicated inverses: + + .. code:: python + + # since occurrences of IfcWindow of the same type + # might have shared inverses (e.g. IfcStyledItem) + # we provide a dictionary that will be populated with newly created items + # and reused to avoid duplicated elements + reuse_identities = dict() + + for element in ifcopenshell.util.selector.filter_elements(model, "IfcWindow"): + ifcopenshell.api.run( + "project.append_asset", + model, library=library, + element=wall_type + reuse_identities=reuse_identities + ) + + """ + usecase = Usecase() + usecase.file: ifcopenshell.file = file + usecase.settings = { + "library": library, + "element": element, + "reuse_identities": {} if reuse_identities is None else reuse_identities, + } + return usecase.execute() + + class Usecase: - def __init__(self, file, library=None, element=None, reuse_identities=None): - """Appends an asset from a library into the active project - - A BIM library asset may be a type product (e.g. wall type), product - (e.g. pump), material, profile, or cost schedule. - - This copies the asset from the specified library file into the active - project. It handles all details like ensuring that product materials, - styles, properties, quantities, and so on are preserved. - - If an asset contains geometry, the geometric contexts are also - intelligentely transplanted such that existing equivalent contexts are - reused. - - Do not mix units. - - :param library: The file object containing the asset. - :type library: ifcopenshell.file - :param element: An element in the library file of the asset. It may be - an IfcTypeProduct, IfcProduct, IfcMaterial, IfcCostSchedule, or - IfcProfileDef. - :type element: ifcopenshell.entity_instance - :param reuse_identities: Optional dictionary of mapped entities' identities to the - already created elements. It will be used to avoid creating - duplicated inverse elements during multiple `project.append_asset` calls. If you want - to add just 1 asset or if added assets won't have any shared elements, then it can be left empty. - :type reuse_identities: dict[int, ifcopenshell.entity_instance] - :return: The appended element - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # Programmatically generate a library. You could do this visually too. - library = ifcopenshell.api.run("project.create_file") - root = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject", name="Demo Library") - context = ifcopenshell.api.run("root.create_entity", library, - ifc_class="IfcProjectLibrary", name="Demo Library") - ifcopenshell.api.run("project.assign_declaration", library, definitions=[context], relating_context=root) - - # Assign units for our example library - unit = ifcopenshell.api.run("unit.add_si_unit", library, - unit_type="LENGTHUNIT", name="METRE", prefix="MILLI") - ifcopenshell.api.run("unit.assign_unit", library, units=[unit]) - - # Let's create a single asset of a 200mm thick concrete wall - wall_type = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType", name="WAL01") - concrete = ifcopenshell.api.run("material.add_material", self.file, name="CON", category="concrete") - rel = ifcopenshell.api.run("material.assign_material", library, - products=[wall_type], type="IfcMaterialLayerSet") - layer = ifcopenshell.api.run("material.add_layer", library, - layer_set=rel.RelatingMaterial, material=concrete) - layer.Name = "Structure" - layer.LayerThickness = 200 - - # Mark our wall type as a reusable asset in our library. - ifcopenshell.api.run("project.assign_declaration", library, - definitions=[wall_type], relating_context=context) - - # Let's imagine we're starting a new project - model = ifcopenshell.api.run("project.create_file") - project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject", name="Test") - - # Now we can easily append our wall type from our libary - wall_type = ifcopenshell.api.run("project.append_asset", model, library=library, element=wall_type) - - Example of adding multiple assets and avoiding duplicated inverses: - - .. code:: python - - # since occurrences of IfcWindow of the same type - # might have shared inverses (e.g. IfcStyledItem) - # we provide a dictionary that will be populated with newly created items - # and reused to avoid duplicated elements - reuse_identities = dict() - - for element in ifcopenshell.util.selector.filter_elements(model, "IfcWindow"): - ifcopenshell.api.run( - "project.append_asset", - model, library=library, - element=wall_type - reuse_identities=reuse_identities - ) - - """ - self.file: ifcopenshell.file = file - self.settings = { - "library": library, - "element": element, - "reuse_identities": {} if reuse_identities is None else reuse_identities, - } - def execute(self): # mapping of old element ids to new elements self.added_elements: dict[int, ifcopenshell.entity_instance] = {} diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py index e6e919b77b..776a26b8f5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py @@ -22,129 +22,125 @@ import ifcopenshell.util.element from typing import Union -class Usecase: - def __init__( - self, - file: ifcopenshell.entity_instance, - definitions: list[ifcopenshell.entity_instance], - relating_context: ifcopenshell.entity_instance, - ): - """Declares the list of elements to the project +def assign_declaration( + file: ifcopenshell.entity_instance, + definitions: list[ifcopenshell.entity_instance], + relating_context: ifcopenshell.entity_instance, +) -> Union[ifcopenshell.entity_instance, None]: + """Declares the list of elements to the project - All data in a model must be directly or indirectly related to the - project. Most data is indirectly related, existing instead within the - spatial decomposition tree. Other data, such as types, may be declared - at the top level. + All data in a model must be directly or indirectly related to the + project. Most data is indirectly related, existing instead within the + spatial decomposition tree. Other data, such as types, may be declared + at the top level. - Most of the time, the API handles declaration automatically for you. - There is one scenario where you might want to explicitly declare objects - to the project, and that's when you want to organise objects into - project libraries for future use (such as an assets library). Assigning - a declaration lets you say that an object belongs to a library. + Most of the time, the API handles declaration automatically for you. + There is one scenario where you might want to explicitly declare objects + to the project, and that's when you want to organise objects into + project libraries for future use (such as an assets library). Assigning + a declaration lets you say that an object belongs to a library. - :param definitions: The list of objects you want to declare. Typically a list of assets. - :type definitions: list[ifcopenshell.entity_instance] - :param relating_context: The IfcProject, or more commonly the - IfcProjectLibrary that you want the object to be part of. - :type relating_context: ifcopenshell.entity_instance - :return: The new IfcRelDeclares relationship or None if all definitions - were already declared / do not support declaration. - :rtype: Union[ifcopenshell.entity_instance, None] + :param definitions: The list of objects you want to declare. Typically a list of assets. + :type definitions: list[ifcopenshell.entity_instance] + :param relating_context: The IfcProject, or more commonly the + IfcProjectLibrary that you want the object to be part of. + :type relating_context: ifcopenshell.entity_instance + :return: The new IfcRelDeclares relationship or None if all definitions + were already declared / do not support declaration. + :rtype: Union[ifcopenshell.entity_instance, None] - Example: + Example: - .. code:: python + .. code:: python - # Programmatically generate a library. You could do this visually too. - library = ifcopenshell.api.run("project.create_file") - root = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject", name="Demo Library") - context = ifcopenshell.api.run("root.create_entity", library, - ifc_class="IfcProjectLibrary", name="Demo Library") + # Programmatically generate a library. You could do this visually too. + library = ifcopenshell.api.run("project.create_file") + root = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject", name="Demo Library") + context = ifcopenshell.api.run("root.create_entity", library, + ifc_class="IfcProjectLibrary", name="Demo Library") - # It's necessary to say our library is part of our project. - ifcopenshell.api.run("project.assign_declaration", library, definitions=[context], relating_context=root) + # It's necessary to say our library is part of our project. + ifcopenshell.api.run("project.assign_declaration", library, definitions=[context], relating_context=root) - # Assign units for our example library - unit = ifcopenshell.api.run("unit.add_si_unit", library, - unit_type="LENGTHUNIT", name="METRE", prefix="MILLI") - ifcopenshell.api.run("unit.assign_unit", library, units=[unit]) + # Assign units for our example library + unit = ifcopenshell.api.run("unit.add_si_unit", library, + unit_type="LENGTHUNIT", name="METRE", prefix="MILLI") + ifcopenshell.api.run("unit.assign_unit", library, units=[unit]) - # Let's create a single asset of a 200mm thick concrete wall - wall_type = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType", name="WAL01") - concrete = ifcopenshell.api.run("material.add_material", self.file, name="CON", category="concrete") - rel = ifcopenshell.api.run("material.assign_material", library, - products=[wall_type], type="IfcMaterialLayerSet") - layer = ifcopenshell.api.run("material.add_layer", library, - layer_set=rel.RelatingMaterial, material=concrete) - layer.Name = "Structure" - layer.LayerThickness = 200 + # Let's create a single asset of a 200mm thick concrete wall + wall_type = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType", name="WAL01") + concrete = ifcopenshell.api.run("material.add_material", file, name="CON", category="concrete") + rel = ifcopenshell.api.run("material.assign_material", library, + products=[wall_type], type="IfcMaterialLayerSet") + layer = ifcopenshell.api.run("material.add_layer", library, + layer_set=rel.RelatingMaterial, material=concrete) + layer.Name = "Structure" + layer.LayerThickness = 200 - # Mark our wall type as a reusable asset in our library. - ifcopenshell.api.run("project.assign_declaration", library, - definitions=[wall_type], relating_context=context) + # Mark our wall type as a reusable asset in our library. + ifcopenshell.api.run("project.assign_declaration", library, + definitions=[wall_type], relating_context=context) - # All done, just for fun let's save our asset library to disk for later use. - library.write("/path/to/my-library.ifc") - """ - self.file = file - self.settings = { - "definitions": definitions, - "relating_context": relating_context, - } + # All done, just for fun let's save our asset library to disk for later use. + library.write("/path/to/my-library.ifc") + """ + settings = { + "definitions": definitions, + "relating_context": relating_context, + } - def execute(self) -> Union[ifcopenshell.entity_instance, None]: - relating_context = self.settings["relating_context"] - all_declares = relating_context.Declares - definitions = set(self.settings["definitions"]) + relating_context = settings["relating_context"] + all_declares = relating_context.Declares + definitions = set(settings["definitions"]) - previous_declares_rels: set[ifcopenshell.entity_instance] = set() - objects_without_contexts: list[ifcopenshell.entity_instance] = [] - objects_with_contexts: list[ifcopenshell.entity_instance] = [] + previous_declares_rels: set[ifcopenshell.entity_instance] = set() + objects_without_contexts: list[ifcopenshell.entity_instance] = [] + objects_with_contexts: list[ifcopenshell.entity_instance] = [] - # check if there is anything to change - for definition in definitions: - has_context = getattr(definition, "HasContext", None) - if has_context is None: - continue + # check if there is anything to change + for definition in definitions: + has_context = getattr(definition, "HasContext", None) + if has_context is None: + continue - object_rel = next(iter(has_context), None) - if object_rel is None: - objects_without_contexts.append(definition) - continue + object_rel = next(iter(has_context), None) + if object_rel is None: + objects_without_contexts.append(definition) + continue - # either rel doesn't exist or product is part of different rel - if object_rel not in all_declares: - previous_declares_rels.add(object_rel) - objects_with_contexts.append(definition) + # either rel doesn't exist or product is part of different rel + if object_rel not in all_declares: + previous_declares_rels.add(object_rel) + objects_with_contexts.append(definition) - objects_to_change = objects_without_contexts + objects_with_contexts - # nothing to change - if not objects_to_change: - return None + objects_to_change = objects_without_contexts + objects_with_contexts + # nothing to change + if not objects_to_change: + return None - for has_context in previous_declares_rels: - related_definitions = set(has_context.RelatedDefinitions) - objects_with_contexts - if related_definitions: - has_context.RelatedDefinitions = related_definitions - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": has_context}) - else: - history = has_context.OwnerHistory - self.file.remove(has_context) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - - declares = next(iter(all_declares), None) - if declares: - declares.RelatedDefinitions = list(set(declares.RelatedDefinitions) | set(objects_to_change)) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": declares}) + for has_context in previous_declares_rels: + related_definitions = set(has_context.RelatedDefinitions) - objects_with_contexts + if related_definitions: + has_context.RelatedDefinitions = related_definitions + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": has_context}) else: - declares = self.file.create_entity( - "IfcRelDeclares", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedDefinitions": list(objects_to_change), - "RelatingContext": relating_context, - } - ) - return declares + history = has_context.OwnerHistory + file.remove(has_context) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + + declares = next(iter(all_declares), None) + if declares: + declares.RelatedDefinitions = list(set(declares.RelatedDefinitions) | set(objects_to_change)) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": declares}) + else: + declares = file.create_entity( + "IfcRelDeclares", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedDefinitions": list(objects_to_change), + "RelatingContext": relating_context, + } + ) + return declares diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py b/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py index 1b3e644cbd..6db9e87c01 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/create_file.py @@ -20,52 +20,46 @@ import datetime import ifcopenshell -class Usecase: - def __init__(self, version: str = "IFC4"): - """Create a blank IFC model file object +def create_file(version: str = "IFC4") -> ifcopenshell.file: + """Create a blank IFC model file object - Create a new IFC file object based on the nominated schema version. The - schema version you choose determines what type of IFC data you can store - in this model. The file is blank and contains no entities. + Create a new IFC file object based on the nominated schema version. The + schema version you choose determines what type of IFC data you can store + in this model. The file is blank and contains no entities. - It also sets up header data for STEP file serialisation, such as the - current timestamp, IfcOpenShell as the preprocessor, and defaults to a - DesignTransferView MVD. + It also sets up header data for STEP file serialisation, such as the + current timestamp, IfcOpenShell as the preprocessor, and defaults to a + DesignTransferView MVD. - :param version: The schema version of the IFC file. Choose from - "IFC2X3", "IFC4", or "IFC4X3". If you have loaded in a custom - schema, you may specify that schema identifier here too. - :type version: str, optional - :return: The created IFC file object. - :rtype: ifcopenshell.file + :param version: The schema version of the IFC file. Choose from + "IFC2X3", "IFC4", or "IFC4X3". If you have loaded in a custom + schema, you may specify that schema identifier here too. + :type version: str, optional + :return: The created IFC file object. + :rtype: ifcopenshell.file - Example: + Example: - .. code:: python + .. code:: python - # Start a new model. - model = ifcopenshell.api.run("project.create_file") + # Start a new model. + model = ifcopenshell.api.run("project.create_file") - # It's currently a blank model, so typically the first thing we do - # is create a project in it. - project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject", name="Test") + # It's currently a blank model, so typically the first thing we do + # is create a project in it. + project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject", name="Test") - # ... and off we go! - """ - self.settings = {"version": version} + # ... and off we go! + """ + settings = {"version": version} - def execute(self) -> ifcopenshell.file: - self.file = ifcopenshell.file(schema=self.settings["version"]) - self.file.wrapped_data.header.file_name.name = "/dev/null" # Hehehe - self.file.wrapped_data.header.file_name.time_stamp = ( - datetime.datetime.utcnow() - .replace(tzinfo=datetime.timezone.utc) - .astimezone() - .replace(microsecond=0) - .isoformat() - ) - self.file.wrapped_data.header.file_name.preprocessor_version = "IfcOpenShell {}".format(ifcopenshell.version) - self.file.wrapped_data.header.file_name.originating_system = "IfcOpenShell {}".format(ifcopenshell.version) - self.file.wrapped_data.header.file_name.authorization = "Nobody" - self.file.wrapped_data.header.file_description.description = ("ViewDefinition[DesignTransferView]",) - return self.file + file = ifcopenshell.file(schema=settings["version"]) + file.wrapped_data.header.file_name.name = "/dev/null" # Hehehe + file.wrapped_data.header.file_name.time_stamp = ( + datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).astimezone().replace(microsecond=0).isoformat() + ) + file.wrapped_data.header.file_name.preprocessor_version = "IfcOpenShell {}".format(ifcopenshell.version) + file.wrapped_data.header.file_name.originating_system = "IfcOpenShell {}".format(ifcopenshell.version) + file.wrapped_data.header.file_name.authorization = "Nobody" + file.wrapped_data.header.file_description.description = ("ViewDefinition[DesignTransferView]",) + return file diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py index 8f8e726570..38a0ae4e25 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/unassign_declaration.py @@ -21,59 +21,55 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - definitions: list[ifcopenshell.entity_instance], - relating_context: ifcopenshell.entity_instance, - ): - """Unassigns a list of objects from a project or project library +def unassign_declaration( + file: ifcopenshell.file, + definitions: list[ifcopenshell.entity_instance], + relating_context: ifcopenshell.entity_instance, +) -> None: + """Unassigns a list of objects from a project or project library - Typically used to remove an asset from a project library. + Typically used to remove an asset from a project library. - :param definitions: The list of objects you want to undeclare. - Typically a list of assets. - :type definitions: list[ifcopenshell.entity_instance] - :param relating_context: The IfcProject, or more commonly the - IfcProjectLibrary that you want the object to no longer be part of. - :type relating_context: ifcopenshell.entity_instance - :return: None - :rtype: None + :param definitions: The list of objects you want to undeclare. + Typically a list of assets. + :type definitions: list[ifcopenshell.entity_instance] + :param relating_context: The IfcProject, or more commonly the + IfcProjectLibrary that you want the object to no longer be part of. + :type relating_context: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Programmatically generate a library. You could do this visually too. - library = ifcopenshell.api.run("project.create_file") - root = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject", name="Demo Library") - context = ifcopenshell.api.run("root.create_entity", library, - ifc_class="IfcProjectLibrary", name="Demo Library") + # Programmatically generate a library. You could do this visually too. + library = ifcopenshell.api.run("project.create_file") + root = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject", name="Demo Library") + context = ifcopenshell.api.run("root.create_entity", library, + ifc_class="IfcProjectLibrary", name="Demo Library") - # It's necessary to say our library is part of our project. - ifcopenshell.api.run("project.assign_declaration", library, definitions=[context], relating_context=root) + # It's necessary to say our library is part of our project. + ifcopenshell.api.run("project.assign_declaration", library, definitions=[context], relating_context=root) - # Remove the library from our project - ifcopenshell.api.run("project.unassign_declaration", library, definitions=[context], relating_context=root) - """ - self.file = file - self.settings = { - "definitions": definitions, - "relating_context": relating_context, - } + # Remove the library from our project + ifcopenshell.api.run("project.unassign_declaration", library, definitions=[context], relating_context=root) + """ + settings = { + "definitions": definitions, + "relating_context": relating_context, + } - def execute(self): - definitions = set(self.settings["definitions"]) - rels = {rel for obj in definitions if (rel := next(iter(obj.HasContext), None))} + definitions = set(settings["definitions"]) + rels = {rel for obj in definitions if (rel := next(iter(obj.HasContext), None))} - for rel in rels: - related_definitions = set(rel.RelatedDefinitions) - definitions - if related_definitions: - rel.RelatedDefinitions = list(related_definitions) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + for rel in rels: + related_definitions = set(rel.RelatedDefinitions) - definitions + if related_definitions: + rel.RelatedDefinitions = list(related_definitions) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + else: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py index e0caddbe3c..c3e01e30df 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py @@ -15,3 +15,9 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_pset import add_pset +from .add_qto import add_qto +from .edit_pset import edit_pset +from .edit_qto import edit_qto +from .remove_pset import remove_pset diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py index 1fd1a0c61a..6cb72e435c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py @@ -19,133 +19,127 @@ import ifcopenshell -class Usecase: - def __init__(self, file, product=None, name=None): - """Adds a new property set to a product +def add_pset(file, product=None, name=None) -> None: + """Adds a new property set to a product - Products, such as physical objects or types in IFC may have properties - associated with them. These properties are typically simple key value - metadata with data types. For example, a wall type may have a property - called FireRating with a text value of "2HR". Properties are grouped - into property sets, so that related properties are grouped together. + Products, such as physical objects or types in IFC may have properties + associated with them. These properties are typically simple key value + metadata with data types. For example, a wall type may have a property + called FireRating with a text value of "2HR". Properties are grouped + into property sets, so that related properties are grouped together. - If a property is assigned to a type, the property is inherited by all - occurrences of that type. For example, a wall type with a FireRating - property of "2HR" automatically implies that all walls of that wall type - also have a FireRating of "2HR". It is not necessary to explictly define - the property again for each occurrence. This also means that properties - are typically defined on types. If the same property is defined at an - occurrence, this overrides the property defined on the type. + If a property is assigned to a type, the property is inherited by all + occurrences of that type. For example, a wall type with a FireRating + property of "2HR" automatically implies that all walls of that wall type + also have a FireRating of "2HR". It is not necessary to explictly define + the property again for each occurrence. This also means that properties + are typically defined on types. If the same property is defined at an + occurrence, this overrides the property defined on the type. - buildingSMART has come up with a long list of standardised properties - for the most common properties required internationally. This solves the - age-old question of "where do I store my FireRating data for walls"? The - answer, in this case, is in the "FireRating" property with an "IfcLabel" - data type grouped in the "Pset_WallCommon" property set. It is - recommended to view the list of standardised buildingSMART properties - and see if any suit your needs first. If none are appropriate, then you - are free to create your own custom properties. + buildingSMART has come up with a long list of standardised properties + for the most common properties required internationally. This solves the + age-old question of "where do I store my FireRating data for walls"? The + answer, in this case, is in the "FireRating" property with an "IfcLabel" + data type grouped in the "Pset_WallCommon" property set. It is + recommended to view the list of standardised buildingSMART properties + and see if any suit your needs first. If none are appropriate, then you + are free to create your own custom properties. - This function adds a blank named property set. One you have a property - set you may add properties using ifcopenshell.api.pset.edit_pset. + This function adds a blank named property set. One you have a property + set you may add properties using ifcopenshell.api.pset.edit_pset. - See also ifcopenshell.api.pset.add_qto if you want to add quantification - data, rather than arbitrary metadata. + See also ifcopenshell.api.pset.add_qto if you want to add quantification + data, rather than arbitrary metadata. - :param product: The IfcObject that you want to assign a property set to. - :type product: ifcopenshell.entity_instance - :param name: The name of the property set. Property sets that are - standardised by buildingSMART typically have a prefix of "Pset_", - like "Pset_WallCommon". If you create your own, you must not use - that prefix. It is recommended to use your own prefix tailored to - your project, company, or local government requirement. - :type name: str - :return: The newly created IfcPropertySet - :rtype: ifcopenshell.entity_instance + :param product: The IfcObject that you want to assign a property set to. + :type product: ifcopenshell.entity_instance + :param name: The name of the property set. Property sets that are + standardised by buildingSMART typically have a prefix of "Pset_", + like "Pset_WallCommon". If you create your own, you must not use + that prefix. It is recommended to use your own prefix tailored to + your project, company, or local government requirement. + :type name: str + :return: The newly created IfcPropertySet + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we have a new wall type. - wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType") + # Let's imagine we have a new wall type. + wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType") - # Note that this only creates and assigns an empty property set. We - # still need to add properties into the property set. Having blank - # property sets are invalid. - pset = ifcopenshell.api.run("pset.add_pset", model, product=wall_type, name="Pset_WallCommon") + # Note that this only creates and assigns an empty property set. We + # still need to add properties into the property set. Having blank + # property sets are invalid. + pset = ifcopenshell.api.run("pset.add_pset", model, product=wall_type, name="Pset_WallCommon") - # Add a fire rating property standardised by buildingSMART. - ifcopenshell.api.run("pset.edit_pset", model, pset=pset, properties={"FireRating": "2HR"}) - """ - self.file = file - self.settings = {"product": product, "name": name} + # Add a fire rating property standardised by buildingSMART. + ifcopenshell.api.run("pset.edit_pset", model, pset=pset, properties={"FireRating": "2HR"}) + """ + settings = {"product": product, "name": name} - def execute(self): - if self.settings["product"].is_a("IfcObject") or self.settings["product"].is_a("IfcContext"): - for rel in self.settings["product"].IsDefinedBy or []: - if ( - rel.is_a("IfcRelDefinesByProperties") - and rel.RelatingPropertyDefinition.Name == self.settings["name"] - ): - return rel.RelatingPropertyDefinition + if settings["product"].is_a("IfcObject") or settings["product"].is_a("IfcContext"): + for rel in settings["product"].IsDefinedBy or []: + if rel.is_a("IfcRelDefinesByProperties") and rel.RelatingPropertyDefinition.Name == settings["name"]: + return rel.RelatingPropertyDefinition - pset = self.file.create_entity( - "IfcPropertySet", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "Name": self.settings["name"], - } - ) - self.file.create_entity( - "IfcRelDefinesByProperties", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": [self.settings["product"]], - "RelatingPropertyDefinition": pset, - } - ) - return pset - elif self.settings["product"].is_a("IfcTypeObject"): - for definition in self.settings["product"].HasPropertySets or []: - if definition.Name == self.settings["name"]: - return definition + pset = file.create_entity( + "IfcPropertySet", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "Name": settings["name"], + } + ) + file.create_entity( + "IfcRelDefinesByProperties", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": [settings["product"]], + "RelatingPropertyDefinition": pset, + } + ) + return pset + elif settings["product"].is_a("IfcTypeObject"): + for definition in settings["product"].HasPropertySets or []: + if definition.Name == settings["name"]: + return definition - pset = self.file.create_entity( - "IfcPropertySet", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "Name": self.settings["name"], - } - ) - has_property_sets = list(self.settings["product"].HasPropertySets or []) - has_property_sets.append(pset) - self.settings["product"].HasPropertySets = has_property_sets - return pset - elif self.settings["product"].is_a("IfcMaterialDefinition"): - for definition in self.settings["product"].HasProperties or []: - if definition.Name == self.settings["name"]: - return definition + pset = file.create_entity( + "IfcPropertySet", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "Name": settings["name"], + } + ) + has_property_sets = list(settings["product"].HasPropertySets or []) + has_property_sets.append(pset) + settings["product"].HasPropertySets = has_property_sets + return pset + elif settings["product"].is_a("IfcMaterialDefinition"): + for definition in settings["product"].HasProperties or []: + if definition.Name == settings["name"]: + return definition - return self.file.create_entity( - "IfcMaterialProperties", - **{ - "Name": self.settings["name"], - "Material": self.settings["product"], - } - ) - elif self.settings["product"].is_a("IfcProfileDef"): - for definition in self.settings["product"].HasProperties or []: - if definition.Name == self.settings["name"]: - return definition + return file.create_entity( + "IfcMaterialProperties", + **{ + "Name": settings["name"], + "Material": settings["product"], + } + ) + elif settings["product"].is_a("IfcProfileDef"): + for definition in settings["product"].HasProperties or []: + if definition.Name == settings["name"]: + return definition - return self.file.create_entity( - "IfcProfileProperties", - **{ - "Name": self.settings["name"], - "ProfileDefinition": self.settings["product"], - } - ) + return file.create_entity( + "IfcProfileProperties", + **{ + "Name": settings["name"], + "ProfileDefinition": settings["product"], + } + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py index a3c7b54299..0215ab31ad 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py @@ -20,65 +20,68 @@ import ifcopenshell import ifcopenshell.api +def add_qto(file, product=None, name=None) -> None: + """Adds a new quantity set to a product + + Products, such as physical objects or types in IFC may have quantities + associated with them. These quantities are typically simple key value + metadata with data types. For example, a wall type may have a quantity + called NetSideArea with a area value of "4.2". Quantities are grouped + into quantity sets, so that related quantities are grouped together. + + Quantities are similar to, but different from properties in that they + may store a method of measurement or formula. Quantities may also have + parametric relationships to other calculated values, such as cost + schedules, resource utilisation, or construction task durations. + + buildingSMART has come up with a long list of standardised quantities + for the most common quantities required internationally. This solves the + age-old question of "what's the standard way of storing quantity + take-off data"? It is recommended to view the list of standardised + buildingSMART quantities and see if any suit your needs first. If none + are appropriate, then you are free to create your own custom quantities. + + This function adds a blank named quantity set. One you have a quantity + set you may add quantities using ifcopenshell.api.pset.edit_qto. + + See also ifcopenshell.api.pset.add_qto if you want to arbitrary + metadata, rather than quantification data. + + :param product: The IfcObject that you want to assign a quantity set to. + :type product: ifcopenshell.entity_instance + :param name: The name of the quantity set. Quantity sets that are + standardised by buildingSMART typically have a prefix of "Qto_", + like "Qto_WallBaseQuantities". If you create your own, you must not + use that prefix. It is recommended to use your own prefix tailored + to your project, company, or local government requirement. + :type name: str + :return: The newly created IfcElementQuantity + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # Let's imagine we have a new wall. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # Note that this only creates and assigns an empty quantity set. We + # still need to add quantities into the property set. Having blank + # quantity sets are invalid. + qto = ifcopenshell.api.run("pset.add_qto", model, product=wall_type, name="Qto_WallBaseQuantities") + + # Add a side area property standardised by buildingSMART. This + # allows quantity take-off to occur, even though no geometry has + # even been modelled! + ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"NetSideArea": 4.2}) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"product": product, "name": name} + return usecase.execute() + + class Usecase: - def __init__(self, file, product=None, name=None): - """Adds a new quantity set to a product - - Products, such as physical objects or types in IFC may have quantities - associated with them. These quantities are typically simple key value - metadata with data types. For example, a wall type may have a quantity - called NetSideArea with a area value of "4.2". Quantities are grouped - into quantity sets, so that related quantities are grouped together. - - Quantities are similar to, but different from properties in that they - may store a method of measurement or formula. Quantities may also have - parametric relationships to other calculated values, such as cost - schedules, resource utilisation, or construction task durations. - - buildingSMART has come up with a long list of standardised quantities - for the most common quantities required internationally. This solves the - age-old question of "what's the standard way of storing quantity - take-off data"? It is recommended to view the list of standardised - buildingSMART quantities and see if any suit your needs first. If none - are appropriate, then you are free to create your own custom quantities. - - This function adds a blank named quantity set. One you have a quantity - set you may add quantities using ifcopenshell.api.pset.edit_qto. - - See also ifcopenshell.api.pset.add_qto if you want to arbitrary - metadata, rather than quantification data. - - :param product: The IfcObject that you want to assign a quantity set to. - :type product: ifcopenshell.entity_instance - :param name: The name of the quantity set. Quantity sets that are - standardised by buildingSMART typically have a prefix of "Qto_", - like "Qto_WallBaseQuantities". If you create your own, you must not - use that prefix. It is recommended to use your own prefix tailored - to your project, company, or local government requirement. - :type name: str - :return: The newly created IfcElementQuantity - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # Let's imagine we have a new wall. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # Note that this only creates and assigns an empty quantity set. We - # still need to add quantities into the property set. Having blank - # quantity sets are invalid. - qto = ifcopenshell.api.run("pset.add_qto", model, product=wall_type, name="Qto_WallBaseQuantities") - - # Add a side area property standardised by buildingSMART. This - # allows quantity take-off to occur, even though no geometry has - # even been modelled! - ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"NetSideArea": 4.2}) - """ - self.file = file - self.settings = {"product": product, "name": name} - def execute(self): if self.settings["product"].is_a("IfcObject") or self.settings["product"].is_a("IfcContext"): for rel in self.settings["product"].IsDefinedBy or []: diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py index 0eb711b803..c4955e1605 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py @@ -20,141 +20,144 @@ import ifcopenshell import ifcopenshell.util.pset +def edit_pset(file, pset=None, name=None, properties=None, pset_template=None, should_purge=False) -> None: + """Edits a property set and its properties + + At its simplest usage, this may be used to edit the name of a property + set. It may also be used to add, edit, or remove properties, either + arbitrarily or using a property set template. + + A list of properties are provided as a dictionary, where the keys are + property names, and values are property values. Keys that don't already + exist are interpreted as properties to be added. Keys that already exist + are interpreted as properties to be edited. A "None" value may specify a + property to be deleted. + + Properties must have a data type. There are lots of data types in IFCs, + not just simple unitless data types like integers, booleans, text, but + also distinguishing between types of text, like labels versus + descriptive text. There are also lots of unit-based data types like + areas, volumes, lengths, power, density, flow rates, pressure, etc. + + To ensure the appropriate data type is used for properties, a property + set template may be used. These can be seen as "property + specifications". A default selection is provided by buildingSMART, so + that all buildingSMART defined standard properties have exactly the same + data types and exactly the right property names without fear of invalid + data or typos. The built-in buildingSMART templates are always loaded. + However, you may also specify your own templates. If you try to add a + non-standard property that does not exist in either your own template or + in the built-in buildingSMART template, then you have the responsibility + to ensure that data types are always consistent and correct. + + :param pset: The IfcPropertySet to edit. + :type pset: ifcopenshell.entity_instance + :param name: A new name for the property set. If no name is specified, + the property set name is not changed. + :type name: str, optional + :param properties: A dictionary of properties. The keys must be a string + of the name of the property. The data type of the value will be + determined by the property set template. If no property set + template is found, the data types of the Python values will + influence the IFC data type of the property. String values will + become IfcLabel, float values will become IfcReal, booleans will + become IfcBoolean, and integers will become IfcInteger. If more + control is desired, you may explicitly specify IFC data objects + directly. Note that provided `properties` might be mutated in the process. + :type properties: dict + :param pset_template: If a property set template is provided, this will + be used to determine data types. If no user-defined template is + provided, the built-in buildingSMART templates will be loaded. + :type pset_template: ifcopenshell.entity_instance + :param should_purge: If left as False, properties set to None will be + left as None but not removed. If set to true, properties set to None + will actually be removed. + :type should_purge: bool, optional + :return: None + :rtype: None + + Example: + + .. code:: python + + # Let's imagine we have a new wall type. + wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType") + + # This is a standard buildingSMART property set. + pset = ifcopenshell.api.run("pset.add_pset", model, product=wall_type, name="Pset_WallCommon") + + # In this scenario, we don't specify any pset_template because it is + # part of the built-in buildingSMART templates, and so the + # FireRating will automatically be an IfcLabel, and the thermal + # transmittance value will automatically be an + # IfcThermalTransmittanceMeasure. Neither of these properties exist + # yet, so they will be created. + ifcopenshell.api.run("pset.edit_pset", model, + pset=pset, properties={"FireRating": "2HR", "ThermalTransmittance": 42.3}) + + # We can edit existing properties. In this case, "FireRating" is + # edited from "2HR" to "1HR". Combustible is new, and will be added. + # The existing "ThermalTransmittance" property will be left + # unchanged. + ifcopenshell.api.run("pset.edit_pset", model, + pset=pset, properties={"FireRating": "1HR", "Combustible": False}) + + # Setting to None will change the value but not delete the property. + ifcopenshell.api.run("pset.edit_pset", model, pset=pset, properties={"Combustible": None}) + + # If you actually want to delete the property, enable purging. + ifcopenshell.api.run("pset.edit_pset", model, pset=pset, + properties={"Combustible": None}, should_purge=True) + + # What if we wanted to manage our own properties? Let's create our + # own "Company Standard" property set templates. Notice how we + # prefix our property set with "Foo_", if our company name was "Foo" + # this would make sense. + template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="Foo_bar") + + # Let's imagine we want all model authors to specify two properties, + # one being a length measurement and another being a boolean. + prop1 = ifcopenshell.api.run("pset_template.add_prop_template", model, + pset_template=template, name="DemoA", primary_measure_type="IfcLengthMeasure") + prop2 = ifcopenshell.api.run("pset_template.add_prop_template", model, + pset_template=template, name="DemoB", primary_measure_type="IfcBoolean") + + # Now we can use our property set template to add our properties, + # and the data types will always match our template. + pset = ifcopenshell.api.run("pset.add_pset", model, product=wall_type, name="Foo_Bar") + ifcopenshell.api.run("pset.edit_pset", model, + pset=pset, properties={"DemoA": 42.3, "DemoB": True}, pset_template=template) + + # Here's a third scenario where we want to add arbitrary properties + # that are not standardised by anything, not even our own custom + # templates. + pset = ifcopenshell.api.run("pset.add_pset", model, product=wall_type, name="Custom_Pset") + ifcopenshell.api.run("pset.edit_pset", model, + pset=pset, properties={ + # Basic Python data types are mapped to a sensible default + "SomeLabel": "Foo", + "SomeNumber": 12.3, + # But we can always specify exactly what we're after too + "ExplicitLength": model.createIfcLengthMeasure(42.3) + }) + + # Editing existing properties will retain their current data types + # if possible. So this will still be a length measure. + ifcopenshell.api.run("pset.edit_pset", model, pset=pset, properties={"ExplicitLength": 12.3}) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "pset": pset, + "name": name, + "properties": properties or {}, + "pset_template": pset_template, + "should_purge": should_purge, + } + return usecase.execute() + + class Usecase: - def __init__(self, file, pset=None, name=None, properties=None, pset_template=None, should_purge=False): - """Edits a property set and its properties - - At its simplest usage, this may be used to edit the name of a property - set. It may also be used to add, edit, or remove properties, either - arbitrarily or using a property set template. - - A list of properties are provided as a dictionary, where the keys are - property names, and values are property values. Keys that don't already - exist are interpreted as properties to be added. Keys that already exist - are interpreted as properties to be edited. A "None" value may specify a - property to be deleted. - - Properties must have a data type. There are lots of data types in IFCs, - not just simple unitless data types like integers, booleans, text, but - also distinguishing between types of text, like labels versus - descriptive text. There are also lots of unit-based data types like - areas, volumes, lengths, power, density, flow rates, pressure, etc. - - To ensure the appropriate data type is used for properties, a property - set template may be used. These can be seen as "property - specifications". A default selection is provided by buildingSMART, so - that all buildingSMART defined standard properties have exactly the same - data types and exactly the right property names without fear of invalid - data or typos. The built-in buildingSMART templates are always loaded. - However, you may also specify your own templates. If you try to add a - non-standard property that does not exist in either your own template or - in the built-in buildingSMART template, then you have the responsibility - to ensure that data types are always consistent and correct. - - :param pset: The IfcPropertySet to edit. - :type pset: ifcopenshell.entity_instance - :param name: A new name for the property set. If no name is specified, - the property set name is not changed. - :type name: str, optional - :param properties: A dictionary of properties. The keys must be a string - of the name of the property. The data type of the value will be - determined by the property set template. If no property set - template is found, the data types of the Python values will - influence the IFC data type of the property. String values will - become IfcLabel, float values will become IfcReal, booleans will - become IfcBoolean, and integers will become IfcInteger. If more - control is desired, you may explicitly specify IFC data objects - directly. Note that provided `properties` might be mutated in the process. - :type properties: dict - :param pset_template: If a property set template is provided, this will - be used to determine data types. If no user-defined template is - provided, the built-in buildingSMART templates will be loaded. - :type pset_template: ifcopenshell.entity_instance - :param should_purge: If left as False, properties set to None will be - left as None but not removed. If set to true, properties set to None - will actually be removed. - :type should_purge: bool, optional - :return: None - :rtype: None - - Example: - - .. code:: python - - # Let's imagine we have a new wall type. - wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType") - - # This is a standard buildingSMART property set. - pset = ifcopenshell.api.run("pset.add_pset", model, product=wall_type, name="Pset_WallCommon") - - # In this scenario, we don't specify any pset_template because it is - # part of the built-in buildingSMART templates, and so the - # FireRating will automatically be an IfcLabel, and the thermal - # transmittance value will automatically be an - # IfcThermalTransmittanceMeasure. Neither of these properties exist - # yet, so they will be created. - ifcopenshell.api.run("pset.edit_pset", model, - pset=pset, properties={"FireRating": "2HR", "ThermalTransmittance": 42.3}) - - # We can edit existing properties. In this case, "FireRating" is - # edited from "2HR" to "1HR". Combustible is new, and will be added. - # The existing "ThermalTransmittance" property will be left - # unchanged. - ifcopenshell.api.run("pset.edit_pset", model, - pset=pset, properties={"FireRating": "1HR", "Combustible": False}) - - # Setting to None will change the value but not delete the property. - ifcopenshell.api.run("pset.edit_pset", model, pset=pset, properties={"Combustible": None}) - - # If you actually want to delete the property, enable purging. - ifcopenshell.api.run("pset.edit_pset", model, pset=pset, - properties={"Combustible": None}, should_purge=True) - - # What if we wanted to manage our own properties? Let's create our - # own "Company Standard" property set templates. Notice how we - # prefix our property set with "Foo_", if our company name was "Foo" - # this would make sense. - template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="Foo_bar") - - # Let's imagine we want all model authors to specify two properties, - # one being a length measurement and another being a boolean. - prop1 = ifcopenshell.api.run("pset_template.add_prop_template", model, - pset_template=template, name="DemoA", primary_measure_type="IfcLengthMeasure") - prop2 = ifcopenshell.api.run("pset_template.add_prop_template", model, - pset_template=template, name="DemoB", primary_measure_type="IfcBoolean") - - # Now we can use our property set template to add our properties, - # and the data types will always match our template. - pset = ifcopenshell.api.run("pset.add_pset", model, product=wall_type, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", model, - pset=pset, properties={"DemoA": 42.3, "DemoB": True}, pset_template=template) - - # Here's a third scenario where we want to add arbitrary properties - # that are not standardised by anything, not even our own custom - # templates. - pset = ifcopenshell.api.run("pset.add_pset", model, product=wall_type, name="Custom_Pset") - ifcopenshell.api.run("pset.edit_pset", model, - pset=pset, properties={ - # Basic Python data types are mapped to a sensible default - "SomeLabel": "Foo", - "SomeNumber": 12.3, - # But we can always specify exactly what we're after too - "ExplicitLength": model.createIfcLengthMeasure(42.3) - }) - - # Editing existing properties will retain their current data types - # if possible. So this will still be a length measure. - ifcopenshell.api.run("pset.edit_pset", model, pset=pset, properties={"ExplicitLength": 12.3}) - """ - self.file = file - self.settings = { - "pset": pset, - "name": name, - "properties": properties or {}, - "pset_template": pset_template, - "should_purge": should_purge, - } - def execute(self): self.update_pset_name() self.load_pset_template() diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py index cd5a3bca05..ba5b7c93e0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py @@ -20,97 +20,100 @@ import ifcopenshell import ifcopenshell.util.pset +def edit_qto(file, qto=None, name=None, properties=None, pset_template=None) -> None: + """Edits a quantity set and its quantities + + At its simplest usage, this may be used to edit the name of a quantity + set. It may also be used to add, edit, or remove quantities. + + See ifcopenshell.api.pset.edit_pset for documentation on how this is + intended to be used. + + One major difference is that quantities set to None are always purged. + It is not allowed to have None quantities in IFC. + + :param qto: The IfcElementQuantity to edit. + :type qto: ifcopenshell.entity_instance + :param name: A new name for the quantity set. If no name is specified, + the quantity set name is not changed. + :type name: str, optional + :param properties: A dictionary of properties. The keys must be a string + of the name of the quantity. The data type of the value will be + determined by the quantity set template. If no quantity set + template is found, the data types of the Python values will + influence the IFC data type of the quantity. String values will + become IfcLabel, float values will become IfcReal, booleans will + become IfcBoolean, and integers will become IfcInteger. If more + control is desired, you may explicitly specify IFC data objects + directly. + :type properties: dict + :param pset_template: If a quantity set template is provided, this will + be used to determine data types. If no user-defined template is + provided, the built-in buildingSMART templates will be loaded. + :type pset_template: ifcopenshell.entity_instance + :return: None + :rtype: None + + Example: + + .. code:: python + + # Let's imagine we have a new wall type. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # This is a standard buildingSMART property set. + qto = ifcopenshell.api.run("pset.add_qto", model, product=wall, name="Qto_WallBaseQuantities") + + # In this scenario, we don't specify any pset_template because it is + # part of the built-in buildingSMART templates, and so the Length + # will automatically be an IfcLengthMeasure, and the NetVolume will + # automatically be an IfcVolumeMeasure. Neither of these properties + # exist yet, so they will be created. + ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"Length": 12, "NetVolume": 7.2}) + + # Setting to None will delete the quantity. + ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"Length": None}) + + # What if we wanted to manage our own properties? Let's create our + # own "Company Standard" property set templates. Notice how we + # prefix our property set with "Foo_", if our company name was "Foo" + # this would make sense. In this example, we say that our template + # only applies to walls and is for quantities. + template = ifcopenshell.api.run("pset_template.add_pset_template", model, + name="Foo_Wall", template_type="QTO_OCCURRENCEDRIVEN", applicable_entity="IfcWall") + + # Let's imagine we want all model authors to specify a length + # measurement for the portion of a wall that is overhanging. + prop = ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template, + name="OverhangLength", template_type="Q_LENGTH", primary_measure_type="IfcLengthMeasure") + + # Now we can use our property set template to add our properties, + # and the data types will always match our template. + qto = ifcopenshell.api.run("pset.add_qto", model, product=wall, name="Foo_Wall") + ifcopenshell.api.run("pset.edit_qto", model, + qto=qto, properties={"OverhangLength": 42.3}, pset_template=template) + + # Here's a third scenario where we want to add arbitrary quantities + # that are not standardised by anything, not even our own custom + # templates. + qto = ifcopenshell.api.run("pset.add_qto", model, product=wall, name="Custom_Qto") + ifcopenshell.api.run("pset.edit_qto", model, + qto=qto, properties={ + "SomeLength": model.createIfcLengthMeasure(42.3), + "SomeArea": model.createIfcAreaMeasure(21.0) + }) + + # Editing existing quantities will retain their current data types + # if possible. So this will still be a length measure. + ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"SomeLength": 12.3}) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"qto": qto, "name": name, "properties": properties or {}, "pset_template": pset_template} + return usecase.execute() + + class Usecase: - def __init__(self, file, qto=None, name=None, properties=None, pset_template=None): - """Edits a quantity set and its quantities - - At its simplest usage, this may be used to edit the name of a quantity - set. It may also be used to add, edit, or remove quantities. - - See ifcopenshell.api.pset.edit_pset for documentation on how this is - intended to be used. - - One major difference is that quantities set to None are always purged. - It is not allowed to have None quantities in IFC. - - :param qto: The IfcElementQuantity to edit. - :type qto: ifcopenshell.entity_instance - :param name: A new name for the quantity set. If no name is specified, - the quantity set name is not changed. - :type name: str, optional - :param properties: A dictionary of properties. The keys must be a string - of the name of the quantity. The data type of the value will be - determined by the quantity set template. If no quantity set - template is found, the data types of the Python values will - influence the IFC data type of the quantity. String values will - become IfcLabel, float values will become IfcReal, booleans will - become IfcBoolean, and integers will become IfcInteger. If more - control is desired, you may explicitly specify IFC data objects - directly. - :type properties: dict - :param pset_template: If a quantity set template is provided, this will - be used to determine data types. If no user-defined template is - provided, the built-in buildingSMART templates will be loaded. - :type pset_template: ifcopenshell.entity_instance - :return: None - :rtype: None - - Example: - - .. code:: python - - # Let's imagine we have a new wall type. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # This is a standard buildingSMART property set. - qto = ifcopenshell.api.run("pset.add_qto", model, product=wall, name="Qto_WallBaseQuantities") - - # In this scenario, we don't specify any pset_template because it is - # part of the built-in buildingSMART templates, and so the Length - # will automatically be an IfcLengthMeasure, and the NetVolume will - # automatically be an IfcVolumeMeasure. Neither of these properties - # exist yet, so they will be created. - ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"Length": 12, "NetVolume": 7.2}) - - # Setting to None will delete the quantity. - ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"Length": None}) - - # What if we wanted to manage our own properties? Let's create our - # own "Company Standard" property set templates. Notice how we - # prefix our property set with "Foo_", if our company name was "Foo" - # this would make sense. In this example, we say that our template - # only applies to walls and is for quantities. - template = ifcopenshell.api.run("pset_template.add_pset_template", model, - name="Foo_Wall", template_type="QTO_OCCURRENCEDRIVEN", applicable_entity="IfcWall") - - # Let's imagine we want all model authors to specify a length - # measurement for the portion of a wall that is overhanging. - prop = ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template, - name="OverhangLength", template_type="Q_LENGTH", primary_measure_type="IfcLengthMeasure") - - # Now we can use our property set template to add our properties, - # and the data types will always match our template. - qto = ifcopenshell.api.run("pset.add_qto", model, product=wall, name="Foo_Wall") - ifcopenshell.api.run("pset.edit_qto", model, - qto=qto, properties={"OverhangLength": 42.3}, pset_template=template) - - # Here's a third scenario where we want to add arbitrary quantities - # that are not standardised by anything, not even our own custom - # templates. - qto = ifcopenshell.api.run("pset.add_qto", model, product=wall, name="Custom_Qto") - ifcopenshell.api.run("pset.edit_qto", model, - qto=qto, properties={ - "SomeLength": model.createIfcLengthMeasure(42.3), - "SomeArea": model.createIfcAreaMeasure(21.0) - }) - - # Editing existing quantities will retain their current data types - # if possible. So this will still be a length measure. - ifcopenshell.api.run("pset.edit_qto", model, qto=qto, properties={"SomeLength": 12.3}) - """ - self.file = file - self.settings = {"qto": qto, "name": name, "properties": properties or {}, "pset_template": pset_template} - def execute(self): self.qto_idx = 5 if self.settings["qto"].is_a("IfcPhysicalComplexQuantity"): diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py index da77accbb6..50ef427bb4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py @@ -20,68 +20,65 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, product=None, pset=None): - """Removes a property set from a product +def remove_pset(file, product=None, pset=None) -> None: + """Removes a property set from a product - All properties that are part of this property set are also removed. + All properties that are part of this property set are also removed. - :param product: The IfcObject to remove the property set from. - :type product: ifcopenshell.entity_instance - :param pset: The IfcPropertySet or IfcElementQuantity to remove. - :type pset: ifcopenshell.entity_instance - :return: None - :rtype: None + :param product: The IfcObject to remove the property set from. + :type product: ifcopenshell.entity_instance + :param pset: The IfcPropertySet or IfcElementQuantity to remove. + :type pset: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we have a new wall type with a property set. - wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType") - pset = ifcopenshell.api.run("pset.add_pset", model, product=wall_type, name="Pset_WallCommon") + # Let's imagine we have a new wall type with a property set. + wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType") + pset = ifcopenshell.api.run("pset.add_pset", model, product=wall_type, name="Pset_WallCommon") - # Remove it! - ifcopenshell.api.run("pset.remove_pset", model, product=wall_type, pset=pset) - """ - self.file = file - self.settings = {"product": product, "pset": pset} + # Remove it! + ifcopenshell.api.run("pset.remove_pset", model, product=wall_type, pset=pset) + """ + settings = {"product": product, "pset": pset} - def execute(self): - to_purge = [] - should_remove_pset = True - for inverse in self.file.get_inverse(self.settings["pset"]): - if inverse.is_a("IfcRelDefinesByProperties"): - if not inverse.RelatedObjects or len(inverse.RelatedObjects) == 1: - to_purge.append(inverse) - else: - related_objects = list(inverse.RelatedObjects) - related_objects.remove(self.settings["product"]) - inverse.RelatedObjects = related_objects - should_remove_pset = False - if should_remove_pset: - properties = [] # Predefined psets have no properties - if self.settings["pset"].is_a("IfcPropertySet"): - properties = self.settings["pset"].HasProperties or [] - elif self.settings["pset"].is_a("IfcQuantitySet"): - properties = self.settings["pset"].Quantities or [] - elif self.settings["pset"].is_a() in ("IfcMaterialProperties", "IfcProfileProperties"): - properties = self.settings["pset"].Properties or [] - for prop in properties: - if self.file.get_total_inverses(prop) != 1: - continue - if prop.is_a("IfcPropertyEnumeratedValue"): - enumeration = prop.EnumerationReference - if enumeration and self.file.get_total_inverses(enumeration) == 1: - self.file.remove(enumeration) - self.file.remove(prop) - # IfcMaterialProperties and IfcProfileProperties don't have OwnerHistory - history = getattr(self.settings["pset"], "OwnerHistory", None) - self.file.remove(self.settings["pset"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - for element in to_purge: - history = getattr(element, "OwnerHistory", None) - self.file.remove(element) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + to_purge = [] + should_remove_pset = True + for inverse in file.get_inverse(settings["pset"]): + if inverse.is_a("IfcRelDefinesByProperties"): + if not inverse.RelatedObjects or len(inverse.RelatedObjects) == 1: + to_purge.append(inverse) + else: + related_objects = list(inverse.RelatedObjects) + related_objects.remove(settings["product"]) + inverse.RelatedObjects = related_objects + should_remove_pset = False + if should_remove_pset: + properties = [] # Predefined psets have no properties + if settings["pset"].is_a("IfcPropertySet"): + properties = settings["pset"].HasProperties or [] + elif settings["pset"].is_a("IfcQuantitySet"): + properties = settings["pset"].Quantities or [] + elif settings["pset"].is_a() in ("IfcMaterialProperties", "IfcProfileProperties"): + properties = settings["pset"].Properties or [] + for prop in properties: + if file.get_total_inverses(prop) != 1: + continue + if prop.is_a("IfcPropertyEnumeratedValue"): + enumeration = prop.EnumerationReference + if enumeration and file.get_total_inverses(enumeration) == 1: + file.remove(enumeration) + file.remove(prop) + # IfcMaterialProperties and IfcProfileProperties don't have OwnerHistory + history = getattr(settings["pset"], "OwnerHistory", None) + file.remove(settings["pset"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + for element in to_purge: + history = getattr(element, "OwnerHistory", None) + file.remove(element) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py index e0caddbe3c..1c5963479c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py @@ -15,3 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_prop_template import add_prop_template +from .add_pset_template import add_pset_template +from .edit_prop_template import edit_prop_template +from .edit_pset_template import edit_pset_template +from .remove_prop_template import remove_prop_template +from .remove_pset_template import remove_pset_template diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py index 5a9dc42355..109c830c94 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py @@ -19,95 +19,91 @@ import ifcopenshell -class Usecase: - def __init__( - self, - file, - pset_template=None, - name="NewProperty", - description=None, - template_type="P_SINGLEVALUE", - primary_measure_type="IfcLabel", - ): - """Adds new property templates to a property set template +def add_prop_template( + file, + pset_template=None, + name="NewProperty", + description=None, + template_type="P_SINGLEVALUE", + primary_measure_type="IfcLabel", +) -> None: + """Adds new property templates to a property set template - Assuming you first have a property set template, this allows you to add - templates for properties within that property set. A property template - lets you specify the name, description, and data type of a property. - When the template is provided to a model author, this gives them clear - instructions about the intention of the property and exactly which data - type to use. + Assuming you first have a property set template, this allows you to add + templates for properties within that property set. A property template + lets you specify the name, description, and data type of a property. + When the template is provided to a model author, this gives them clear + instructions about the intention of the property and exactly which data + type to use. - Types of properties and quantities include: + Types of properties and quantities include: - * P_SINGLEVALUE - a single value, the most common type of property. - * P_ENUMERATEDVALUE - the property value may one or more values chosen - from a preset list of values. - * P_BOUNDEDVALUE - the property has a minimum, maximum, and set value. - * P_LISTVALUE - the property has a list of values. - * P_TABLEVALUE - the property has a table of values. - * P_REFERENCEVALUE - the property is a parametric reference to another - value. This is only for advanced users. - * Q_LENGTH - the quantity is a length. - * Q_AREA - the quantity is an area. - * Q_VOLUME - the quantity is a volume. - * Q_COUNT - the quantity is counting a item. - * Q_WEIGHT - the quantity is a weight. - * Q_TIME - the quantity is a time duration. + * P_SINGLEVALUE - a single value, the most common type of property. + * P_ENUMERATEDVALUE - the property value may one or more values chosen + from a preset list of values. + * P_BOUNDEDVALUE - the property has a minimum, maximum, and set value. + * P_LISTVALUE - the property has a list of values. + * P_TABLEVALUE - the property has a table of values. + * P_REFERENCEVALUE - the property is a parametric reference to another + value. This is only for advanced users. + * Q_LENGTH - the quantity is a length. + * Q_AREA - the quantity is an area. + * Q_VOLUME - the quantity is a volume. + * Q_COUNT - the quantity is counting a item. + * Q_WEIGHT - the quantity is a weight. + * Q_TIME - the quantity is a time duration. - :param pset_template: The property set template to add the property - template to. - :type pset_template: ifcopenshell.entity_instance - :param name: The name of the property - :type name: str,optional - :param description: A few words describing what the property stores. - :type description: str,optional - :param primary_measure_type: The data type of the property. Consult the - IFC documentation for the full list of data types. - :param primary_measure_type: str,optional - :return: The newly created IfcSimplePropertyTemplate. - :rtype: ifcopenshell.entity_instance + :param pset_template: The property set template to add the property + template to. + :type pset_template: ifcopenshell.entity_instance + :param name: The name of the property + :type name: str,optional + :param description: A few words describing what the property stores. + :type description: str,optional + :param primary_measure_type: The data type of the property. Consult the + IFC documentation for the full list of data types. + :param primary_measure_type: str,optional + :return: The newly created IfcSimplePropertyTemplate. + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Create a simple template that may be applied to all types - template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="ABC_RiskFactors") + # Create a simple template that may be applied to all types + template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="ABC_RiskFactors") - # Here's one example property - ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template, - name="HighVoltage", description="Whether there is a risk of high voltage.", - primary_measure_type="IfcBoolean") + # Here's one example property + ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template, + name="HighVoltage", description="Whether there is a risk of high voltage.", + primary_measure_type="IfcBoolean") - # Here's another - ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template, - name="ChemicalType", description="The class of chemical spillage.", - primary_measure_type="IfcLabel") - """ - self.file = file - self.settings = { - "pset_template": pset_template, - "name": name, - "description": description, - "template_type": template_type, - "primary_measure_type": primary_measure_type, + # Here's another + ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template, + name="ChemicalType", description="The class of chemical spillage.", + primary_measure_type="IfcLabel") + """ + settings = { + "pset_template": pset_template, + "name": name, + "description": description, + "template_type": template_type, + "primary_measure_type": primary_measure_type, + } + + prop_template = file.create_entity( + "IfcSimplePropertyTemplate", + **{ + "GlobalId": ifcopenshell.guid.new(), + "Name": settings["name"], + "Description": settings["description"], + "PrimaryMeasureType": settings["primary_measure_type"], + "TemplateType": settings["template_type"], + "AccessState": "READWRITE", + "Enumerators": None, } - - def execute(self): - prop_template = self.file.create_entity( - "IfcSimplePropertyTemplate", - **{ - "GlobalId": ifcopenshell.guid.new(), - "Name": self.settings["name"], - "Description": self.settings["description"], - "PrimaryMeasureType": self.settings["primary_measure_type"], - "TemplateType": self.settings["template_type"], - "AccessState": "READWRITE", - "Enumerators": None, - } - ) - has_property_templates = list(self.settings["pset_template"].HasPropertyTemplates or []) - has_property_templates.append(prop_template) - self.settings["pset_template"].HasPropertyTemplates = has_property_templates - return prop_template + ) + has_property_templates = list(settings["pset_template"].HasPropertyTemplates or []) + has_property_templates.append(prop_template) + settings["pset_template"].HasPropertyTemplates = has_property_templates + return prop_template diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py index 242f7b7510..9a22b6a97a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py @@ -19,95 +19,91 @@ import ifcopenshell -class Usecase: - def __init__( - self, - file, - name="New_Pset", - template_type="PSET_TYPEDRIVENOVERRIDE", - applicable_entity="IfcObject,IfcTypeObject", - ): - """Adds a new property set template +def add_pset_template( + file, + name="New_Pset", + template_type="PSET_TYPEDRIVENOVERRIDE", + applicable_entity="IfcObject,IfcTypeObject", +) -> None: + """Adds a new property set template - This creates a new template for property sets. A template defines what - the name of the property set should be, what properties it can have, - what entities (e.g. wall) the property set can be assigned to, whether - it should be assigned at a type or occurrence level, the data types of - the properties, and descriptions of the properties. This template can - then be used as a project, company, or local government standard. + This creates a new template for property sets. A template defines what + the name of the property set should be, what properties it can have, + what entities (e.g. wall) the property set can be assigned to, whether + it should be assigned at a type or occurrence level, the data types of + the properties, and descriptions of the properties. This template can + then be used as a project, company, or local government standard. - buildingSMART itself ships a catalogue of property sets using these - templates, ensuring that internationally common properties (e.g. fire - rating of a wall) are all implemented exactly the same way across all - vendors and projects. Naturally, not everything can be standardised - internationally, so this allows you to create your own templates. + buildingSMART itself ships a catalogue of property sets using these + templates, ensuring that internationally common properties (e.g. fire + rating of a wall) are all implemented exactly the same way across all + vendors and projects. Naturally, not everything can be standardised + internationally, so this allows you to create your own templates. - You may either create a property template to store properties, or a - quantity template to store quantities. For convenience, we will always - call them "property templates" as they are conceptually very similar. + You may either create a property template to store properties, or a + quantity template to store quantities. For convenience, we will always + call them "property templates" as they are conceptually very similar. - This function only creates a template for the property set, not the - properties themselves within the property set. At this level, you are - allowed to define the name of the property set, whether it is type or - occurrence based, and which entities it applies to. + This function only creates a template for the property set, not the + properties themselves within the property set. At this level, you are + allowed to define the name of the property set, whether it is type or + occurrence based, and which entities it applies to. - See the documentation for IfcPropertySetTemplate for instructions on - the types of template type and list of applicable entities. + See the documentation for IfcPropertySetTemplate for instructions on + the types of template type and list of applicable entities. - The types of property set templates are: + The types of property set templates are: - * PSET_TYPEDRIVENONLY - assigned only to types - * PSET_TYPEDRIVENOVERRIDE - assigned to types or occurrences. If both, - the occurrence overrides the type. - * PSET_OCCURRENCEDRIVEN - assigned to occurrences only. - * PSET_PERFORMANCEDRIVEN - assigned as a timeseries data range. This is - only recommended for advanced users. - * QTO_TYPEDRIVENONLY - assigned only to types, but for quantities. - * QTO_TYPEDRIVENOVERRIDE - assigned to types or occurrences, but for - quantities. If both, the occurrence overrides the type. - * QTO_OCCURRENCEDRIVEN - assigned to occurrences only, but for - quantities. + * PSET_TYPEDRIVENONLY - assigned only to types + * PSET_TYPEDRIVENOVERRIDE - assigned to types or occurrences. If both, + the occurrence overrides the type. + * PSET_OCCURRENCEDRIVEN - assigned to occurrences only. + * PSET_PERFORMANCEDRIVEN - assigned as a timeseries data range. This is + only recommended for advanced users. + * QTO_TYPEDRIVENONLY - assigned only to types, but for quantities. + * QTO_TYPEDRIVENOVERRIDE - assigned to types or occurrences, but for + quantities. If both, the occurrence overrides the type. + * QTO_OCCURRENCEDRIVEN - assigned to occurrences only, but for + quantities. - By default, this creates a template that can be applied to types, but - overridden by occurrences, and is applicable to everything. + By default, this creates a template that can be applied to types, but + overridden by occurrences, and is applicable to everything. - :param name: The name of the property set - :type name: str,optional - :param template_type: Choose from one of PSET_TYPEDRIVENONLY, - PSET_TYPEDRIVENOVERRIDE, PSET_OCCURRENCEDRIVEN, - PSET_PERFORMANCEDRIVEN, QTO_TYPEDRIVENONLY, QTO_TYPEDRIVENOVERRIDE, - QTO_OCCURRENCEDRIVEN, NOTDEFINED - :type template_type: str,optional - :param applicable_entity: The entity that this template is allowed to be - applied to. For example, IfcWall means that the property set may be - assigned to walls only. IfcTypeObject, the default, means that the - property set may be assigned to any type. - :type applicable_entity: str,optional - :return: The newly created IfcPropertySetTemplate - :rtype: ifcopenshell.entity_instance + :param name: The name of the property set + :type name: str,optional + :param template_type: Choose from one of PSET_TYPEDRIVENONLY, + PSET_TYPEDRIVENOVERRIDE, PSET_OCCURRENCEDRIVEN, + PSET_PERFORMANCEDRIVEN, QTO_TYPEDRIVENONLY, QTO_TYPEDRIVENOVERRIDE, + QTO_OCCURRENCEDRIVEN, NOTDEFINED + :type template_type: str,optional + :param applicable_entity: The entity that this template is allowed to be + applied to. For example, IfcWall means that the property set may be + assigned to walls only. IfcTypeObject, the default, means that the + property set may be assigned to any type. + :type applicable_entity: str,optional + :return: The newly created IfcPropertySetTemplate + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Create a simple template that may be applied to all types - ifcopenshell.api.run("pset_template.add_pset_template", model, name="ABC_RiskFactors") + # Create a simple template that may be applied to all types + ifcopenshell.api.run("pset_template.add_pset_template", model, name="ABC_RiskFactors") - # Note that we aren't finished yet. Our property set template - # doesn't have any properties in it. Let's add a minimum of one - # property. - ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template, - name="HighVoltage", description="Whether there is a risk of high voltage.", - primary_measure_type="IfcBoolean") - """ - self.file = file - self.settings = {"name": name, "template_type": template_type, "applicable_entity": applicable_entity} + # Note that we aren't finished yet. Our property set template + # doesn't have any properties in it. Let's add a minimum of one + # property. + ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template, + name="HighVoltage", description="Whether there is a risk of high voltage.", + primary_measure_type="IfcBoolean") + """ + settings = {"name": name, "template_type": template_type, "applicable_entity": applicable_entity} - def execute(self): - return self.file.create_entity( - "IfcPropertySetTemplate", - GlobalId=ifcopenshell.guid.new(), - Name=self.settings["name"], - TemplateType=self.settings["template_type"], - ApplicableEntity=self.settings["applicable_entity"], - ) + return file.create_entity( + "IfcPropertySetTemplate", + GlobalId=ifcopenshell.guid.new(), + Name=settings["name"], + TemplateType=settings["template_type"], + ApplicableEntity=settings["applicable_entity"], + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py index 6b2633992f..dcc6c9b3ae 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py @@ -17,36 +17,33 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, prop_template=None, attributes=None): - """Edits the attributes of an IfcSimplePropertyTemplate +def edit_prop_template(file, prop_template=None, attributes=None) -> None: + """Edits the attributes of an IfcSimplePropertyTemplate - For more information about the attributes and data types of an - IfcSimplePropertyTemplate, consult the IFC documentation. + For more information about the attributes and data types of an + IfcSimplePropertyTemplate, consult the IFC documentation. - :param prop_template: The IfcSimplePropertyTemplate entity you want to edit - :type prop_template: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param prop_template: The IfcSimplePropertyTemplate entity you want to edit + :type prop_template: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="ABC_RiskFactors") + template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="ABC_RiskFactors") - # Here's a property with just default values. - prop = ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template) + # Here's a property with just default values. + prop = ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template) - # Let's edit it to give the actual values we need. - ifcopenshell.api.run("pset_template.edit_prop_template", model, - prop_template=prop, attributes={"Name": "DemoA", "PrimaryMeasureType": "IfcLengthMeasure"}) - """ - self.file = file - self.settings = {"prop_template": prop_template, "attributes": attributes or {}} + # Let's edit it to give the actual values we need. + ifcopenshell.api.run("pset_template.edit_prop_template", model, + prop_template=prop, attributes={"Name": "DemoA", "PrimaryMeasureType": "IfcLengthMeasure"}) + """ + settings = {"prop_template": prop_template, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["prop_template"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["prop_template"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py index 303618f509..8a0581efdc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py @@ -17,34 +17,31 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, pset_template=None, attributes=None): - """Edits the attributes of an IfcPropertySetTemplate +def edit_pset_template(file, pset_template=None, attributes=None) -> None: + """Edits the attributes of an IfcPropertySetTemplate - For more information about the attributes and data types of an - IfcPropertySetTemplate, consult the IFC documentation. + For more information about the attributes and data types of an + IfcPropertySetTemplate, consult the IFC documentation. - :param pset_template: The IfcPropertySetTemplate entity you want to edit - :type pset_template: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param pset_template: The IfcPropertySetTemplate entity you want to edit + :type pset_template: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Whoops! We named it with a buildingSMART reserved "Pset_" prefix! - template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="Pset_RiskFactors") + # Whoops! We named it with a buildingSMART reserved "Pset_" prefix! + template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="Pset_RiskFactors") - # Let's fix it to prefix with our company code instead. - ifcopenshell.api.run("pset_template.edit_pset_template", model, - pset_template=template, attributes={"Name": "ABC_RiskFactors"}) - """ - self.file = file - self.settings = {"pset_template": pset_template, "attributes": attributes or {}} + # Let's fix it to prefix with our company code instead. + ifcopenshell.api.run("pset_template.edit_pset_template", model, + pset_template=template, attributes={"Name": "ABC_RiskFactors"}) + """ + settings = {"pset_template": pset_template, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["pset_template"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["pset_template"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py index 6479e6ffc2..7a247ac383 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py @@ -19,41 +19,38 @@ import ifcopenshell.util.element -class Usecase: - def __init__(self, file, prop_template=None): - """Removes a property template +def remove_prop_template(file, prop_template=None) -> None: + """Removes a property template - Note that a property set template should always have at least one - property template to be valid, so take care when removing property - templates. + Note that a property set template should always have at least one + property template to be valid, so take care when removing property + templates. - :param prop_template: The IfcSimplePropertyTemplate to remove. - :type prop_template: ifcopenshell.entity_instance - :return: None - :rtype: None + :param prop_template: The IfcSimplePropertyTemplate to remove. + :type prop_template: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="ABC_RiskFactors") + template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="ABC_RiskFactors") - # Here's two propertes with just default values. - prop1 = ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template) - prop2 = ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template) + # Here's two propertes with just default values. + prop1 = ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template) + prop2 = ifcopenshell.api.run("pset_template.add_prop_template", model, pset_template=template) - # Let's remove the second one. - ifcopenshell.api.run("pset_template.remove_prop_template", model, prop_template=prop2) - """ - self.file = file - self.settings = {"prop_template": prop_template} + # Let's remove the second one. + ifcopenshell.api.run("pset_template.remove_prop_template", model, prop_template=prop2) + """ + settings = {"prop_template": prop_template} - def execute(self): - for inverse in self.file.get_inverse(self.settings["prop_template"]): - if len(inverse.HasPropertyTemplates) == 1: - inverse.HasPropertyTemplates = [] - else: - has_property_templates = list(inverse.HasPropertyTemplates) - has_property_templates.remove(self.settings["prop_template"]) - inverse.HasPropertyTemplates = has_property_templates - ifcopenshell.util.element.remove_deep(self.file, self.settings["prop_template"]) + for inverse in file.get_inverse(settings["prop_template"]): + if len(inverse.HasPropertyTemplates) == 1: + inverse.HasPropertyTemplates = [] + else: + has_property_templates = list(inverse.HasPropertyTemplates) + has_property_templates.remove(settings["prop_template"]) + inverse.HasPropertyTemplates = has_property_templates + ifcopenshell.util.element.remove_deep(file, settings["prop_template"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py index 4cb2c2695a..c567a55033 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py @@ -19,30 +19,27 @@ import ifcopenshell.util.element -class Usecase: - def __init__(self, file, pset_template=None): - """Removes a property set template +def remove_pset_template(file, pset_template=None) -> None: + """Removes a property set template - All property templates within the property set template are also removed - along with it. + All property templates within the property set template are also removed + along with it. - :param pset_template: The IfcPropertySetTemplate to remove. - :type pset_template: ifcopenshell.entity_instance - :return: None - :rtype: None + :param pset_template: The IfcPropertySetTemplate to remove. + :type pset_template: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Create a template. - template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="ABC_RiskFactors") + # Create a template. + template = ifcopenshell.api.run("pset_template.add_pset_template", model, name="ABC_RiskFactors") - # Let's remove the template. - ifcopenshell.api.run("pset_template.remove_pset_template", model, pset_template=template) - """ - self.file = file - self.settings = {"pset_template": pset_template} + # Let's remove the template. + ifcopenshell.api.run("pset_template.remove_pset_template", model, pset_template=template) + """ + settings = {"pset_template": pset_template} - def execute(self): - ifcopenshell.util.element.remove_deep(self.file, self.settings["pset_template"]) + ifcopenshell.util.element.remove_deep(file, settings["pset_template"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py index e0caddbe3c..8fcff6a7fc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py @@ -15,3 +15,16 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_resource import add_resource +from .add_resource_quantity import add_resource_quantity +from .add_resource_time import add_resource_time +from .assign_resource import assign_resource +from .calculate_resource_usage import calculate_resource_usage +from .calculate_resource_work import calculate_resource_work +from .edit_resource import edit_resource +from .edit_resource_quantity import edit_resource_quantity +from .edit_resource_time import edit_resource_time +from .remove_resource import remove_resource +from .remove_resource_quantity import remove_resource_quantity +from .unassign_resource import unassign_resource diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py index 03a67ab648..e2a1dab308 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py @@ -19,93 +19,89 @@ import ifcopenshell.api -class Usecase: - def __init__( - self, +def add_resource( + file, + parent_resource=None, + ifc_class="IfcCrewResource", + name=None, + predefined_type="NOTDEFINED", +) -> None: + """Add a new construction resource + + Construction resources may be managed and connected to cost schedules + and construction schedules. This allows calculations to be done on + resource utilisation, cost optimisation (e.g. labour rates), and + optioneering on build strategies. + + There are typically two types of resources. Crew resources are resources + where you manage your own crew and you have full control over the + equipment, labour, products, and materials used by your crew. + Alternatively, there are subcontractor resources, where you simply + delegate all the details to a subcontractor and it is not decomposed + into further levels of detail. + + This means when adding resources, you'd first either add a crew or + subcontract resource. If it is a crew resource, you'd then add child + resources to that crew, such as equipment (cranes, excavators, hoists, + etc), material (wood, concrete, etc), and labour (rigging crews, + formworkers, etc). + + :param parent_resource: If this is a child resource (typically to a crew + resource), then nominate the parent IfcConstructionResource here. + :type parent_resource: ifcopenshell.entity_instance + :param ifc_class: The class of resource chosen from + IfcConstructionEquipmentResource, IfcConstructionMaterialResource, + IfcConstructionProductResource, IfcCrewResource, IfcLaborResource, + or IfcSubContractResource. + :type ifc_class: str,optional + :param name: The name of the resource + :type name: str,optional + :param predefined_type: Consult the IFC documentation for the valid + predefined types for each type of resource class. + :type predefined_type: str,optional + :return: The newly created resource depending on the nominated IFC + class. + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + + # Add some labour to our crew. + ifcopenshell.api.run("resource.add_resource", model, parent_resource=crew, ifc_class="IfcLaborResource") + """ + settings = { + "parent_resource": parent_resource, + "ifc_class": ifc_class, + "name": name, + "predefined_type": predefined_type, + } + + resource = ifcopenshell.api.run( + "root.create_entity", file, - parent_resource=None, - ifc_class="IfcCrewResource", - name=None, - predefined_type="NOTDEFINED", - ): - """Add a new construction resource - - Construction resources may be managed and connected to cost schedules - and construction schedules. This allows calculations to be done on - resource utilisation, cost optimisation (e.g. labour rates), and - optioneering on build strategies. - - There are typically two types of resources. Crew resources are resources - where you manage your own crew and you have full control over the - equipment, labour, products, and materials used by your crew. - Alternatively, there are subcontractor resources, where you simply - delegate all the details to a subcontractor and it is not decomposed - into further levels of detail. - - This means when adding resources, you'd first either add a crew or - subcontract resource. If it is a crew resource, you'd then add child - resources to that crew, such as equipment (cranes, excavators, hoists, - etc), material (wood, concrete, etc), and labour (rigging crews, - formworkers, etc). - - :param parent_resource: If this is a child resource (typically to a crew - resource), then nominate the parent IfcConstructionResource here. - :type parent_resource: ifcopenshell.entity_instance - :param ifc_class: The class of resource chosen from - IfcConstructionEquipmentResource, IfcConstructionMaterialResource, - IfcConstructionProductResource, IfcCrewResource, IfcLaborResource, - or IfcSubContractResource. - :type ifc_class: str,optional - :param name: The name of the resource - :type name: str,optional - :param predefined_type: Consult the IFC documentation for the valid - predefined types for each type of resource class. - :type predefined_type: str,optional - :return: The newly created resource depending on the nominated IFC - class. - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - - # Add some labour to our crew. - ifcopenshell.api.run("resource.add_resource", model, parent_resource=crew, ifc_class="IfcLaborResource") - """ - self.file = file - self.settings = { - "parent_resource": parent_resource, - "ifc_class": ifc_class, - "name": name, - "predefined_type": predefined_type, - } - - def execute(self): - resource = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class=self.settings["ifc_class"], - predefined_type=self.settings["predefined_type"], - name=self.settings["name"] or "Unnamed", + ifc_class=settings["ifc_class"], + predefined_type=settings["predefined_type"], + name=settings["name"] or "Unnamed", + ) + # TODO: this is an ambiguity by buildingSMART: Can we nest an IfcCrewResource under an IfcCrewResource ? + # https://forums.buildingsmart.org/t/what-are-allowed-to-be-root-level-construction-resources/3550 + if settings["parent_resource"]: + ifcopenshell.api.run( + "nest.assign_object", + file, + related_objects=[resource], + relating_object=settings["parent_resource"], ) - # TODO: this is an ambiguity by buildingSMART: Can we nest an IfcCrewResource under an IfcCrewResource ? - # https://forums.buildingsmart.org/t/what-are-allowed-to-be-root-level-construction-resources/3550 - if self.settings["parent_resource"]: - ifcopenshell.api.run( - "nest.assign_object", - self.file, - related_objects=[resource], - relating_object=self.settings["parent_resource"], - ) - else: - context = self.file.by_type("IfcContext")[0] - ifcopenshell.api.run( - "project.assign_declaration", - self.file, - definitions=[resource], - relating_context=context, - ) - return resource + else: + context = file.by_type("IfcContext")[0] + ifcopenshell.api.run( + "project.assign_declaration", + file, + definitions=[resource], + relating_context=context, + ) + return resource diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py index 4e5ef0c0a0..6600a06ae2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py @@ -19,58 +19,55 @@ import ifcopenshell.util.element -class Usecase: - def __init__(self, file, resource=None, ifc_class="IfcQuantityCount"): - """Adds a quantity to a resource +def add_resource_quantity(file, resource=None, ifc_class="IfcQuantityCount") -> None: + """Adds a quantity to a resource - The quantity of a resource represents the "unit quantity" of that - resource. For example, labour might be hired on a daily basis (8 hours). - There are different types of quantities (e.g. volume, count, or time). - Which quantity is used depends on the type of resource. Material - resources may be quantified in terms of length, area, volume, or weight. - Equipment and labour resources are quantified in terms of time. Products - resources are quantified in terms of counts. + The quantity of a resource represents the "unit quantity" of that + resource. For example, labour might be hired on a daily basis (8 hours). + There are different types of quantities (e.g. volume, count, or time). + Which quantity is used depends on the type of resource. Material + resources may be quantified in terms of length, area, volume, or weight. + Equipment and labour resources are quantified in terms of time. Products + resources are quantified in terms of counts. - This base quantity is then used in other calculations. + This base quantity is then used in other calculations. - :param resource: The IfcConstructionResource to add a quantity to. - :type resource: ifcopenshell.entity_instance - :param ifc_class: The type of quantity to add, chosen from - IfcQuantityArea (for material), IfcQuantityCount (for products), - IfcQuantityLength (for material), IfcQuantityTime (for equipment or - labour), IfcQuantityVolume (for material), and IfcQuantityWeight - (for material). - :type ifc_class: str,optional - :return: The newly created quantity depending on the IFC class - :rtype: ifcopenshell.entity_instance + :param resource: The IfcConstructionResource to add a quantity to. + :type resource: ifcopenshell.entity_instance + :param ifc_class: The type of quantity to add, chosen from + IfcQuantityArea (for material), IfcQuantityCount (for products), + IfcQuantityLength (for material), IfcQuantityTime (for equipment or + labour), IfcQuantityVolume (for material), and IfcQuantityWeight + (for material). + :type ifc_class: str,optional + :return: The newly created quantity depending on the IFC class + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - # Add some labour to our crew. - labour = ifcopenshell.api.run("resource.add_resource", model, - parent_resource=crew, ifc_class="IfcLaborResource") + # Add some labour to our crew. + labour = ifcopenshell.api.run("resource.add_resource", model, + parent_resource=crew, ifc_class="IfcLaborResource") - # Labour resource is quantified in terms of time. - quantity = ifcopenshell.api.run("resource.add_resource_quantity", model, - resource=labour, ifc_class="IfcQuantityTime") + # Labour resource is quantified in terms of time. + quantity = ifcopenshell.api.run("resource.add_resource_quantity", model, + resource=labour, ifc_class="IfcQuantityTime") - # Store the time used in hours - ifcopenshell.api.run("resource.edit_resource_quantity", model, - physical_quantity=quantity, attributes={"TimeValue": 8.0}) - """ - self.file = file - self.settings = {"resource": resource, "ifc_class": ifc_class} + # Store the time used in hours + ifcopenshell.api.run("resource.edit_resource_quantity", model, + physical_quantity=quantity, attributes={"TimeValue": 8.0}) + """ + settings = {"resource": resource, "ifc_class": ifc_class} - def execute(self): - quantity = self.file.create_entity(self.settings["ifc_class"], Name="Unnamed") - quantity[3] = 0.0 - old_quantity = self.settings["resource"].BaseQuantity - self.settings["resource"].BaseQuantity = quantity - if old_quantity: - ifcopenshell.util.element.remove_deep(self.file, old_quantity) - return quantity + quantity = file.create_entity(settings["ifc_class"], Name="Unnamed") + quantity[3] = 0.0 + old_quantity = settings["resource"].BaseQuantity + settings["resource"].BaseQuantity = quantity + if old_quantity: + ifcopenshell.util.element.remove_deep(file, old_quantity) + return quantity diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py index 8627e319a7..3066441330 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py @@ -19,50 +19,47 @@ import ifcopenshell.util.date -class Usecase: - def __init__(self, file, resource=None): - """Adds the time that a resource is used for +def add_resource_time(file, resource=None) -> None: + """Adds the time that a resource is used for - For labour and equipment resources, the total duration that the resource - is used for may be stored. This may either be input manually or - calculated parametrically. This is known as the resource time, and may - be used to calculate other parameters like resource utilisation. + For labour and equipment resources, the total duration that the resource + is used for may be stored. This may either be input manually or + calculated parametrically. This is known as the resource time, and may + be used to calculate other parameters like resource utilisation. - :param resource: The IfcConstructionResource to record time for. - :type resource: ifcopenshell.entity_instance - :return: The newly created IfcResourceTime - :rtype: ifcopenshell.entity_instance + :param resource: The IfcConstructionResource to record time for. + :type resource: ifcopenshell.entity_instance + :return: The newly created IfcResourceTime + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - # Add some labour to our crew. - labour = ifcopenshell.api.run("resource.add_resource", model, - parent_resource=crew, ifc_class="IfcLaborResource") + # Add some labour to our crew. + labour = ifcopenshell.api.run("resource.add_resource", model, + parent_resource=crew, ifc_class="IfcLaborResource") - # Labour resource is quantified in terms of time. - quantity = ifcopenshell.api.run("resource.add_resource_quantity", model, - resource=labour, ifc_class="IfcQuantityTime") + # Labour resource is quantified in terms of time. + quantity = ifcopenshell.api.run("resource.add_resource_quantity", model, + resource=labour, ifc_class="IfcQuantityTime") - # Store the unit time used in hours - ifcopenshell.api.run("resource.edit_resource_quantity", model, - physical_quantity=quantity, attributes={"TimeValue": 8.0}) + # Store the unit time used in hours + ifcopenshell.api.run("resource.edit_resource_quantity", model, + physical_quantity=quantity, attributes={"TimeValue": 8.0}) - # Let's imagine we've used the resource for 2 days. - time = ifcopenshell.api.run("resource.add_resource_time", model, resource=labour) - ifcopenshell.api.run("resource.edit_resource_time", model, - resource_time=time, attributes={"ScheduleWork": "PT16H"}) - """ - self.file = file - self.settings = { - "resource": resource, - } + # Let's imagine we've used the resource for 2 days. + time = ifcopenshell.api.run("resource.add_resource_time", model, resource=labour) + ifcopenshell.api.run("resource.edit_resource_time", model, + resource_time=time, attributes={"ScheduleWork": "PT16H"}) + """ + settings = { + "resource": resource, + } - def execute(self): - resource_time = self.file.create_entity("IfcResourceTime") - self.settings["resource"].Usage = resource_time - return resource_time + resource_time = file.create_entity("IfcResourceTime") + settings["resource"].Usage = resource_time + return resource_time diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py index f71ec00260..44d856ef0f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py @@ -20,101 +20,93 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, relating_resource=None, related_object=None): - """Assigns a resource to an object +def assign_resource(file, relating_resource=None, related_object=None) -> None: + """Assigns a resource to an object - Two types of objects are typically assigned to resources: products and - actors. + Two types of objects are typically assigned to resources: products and + actors. - If a product is assigned to a resource, that means that the product - represents the resource on site. This may be represented via material - handling zones on a construction site, or equipment like cranes and - their physical locations. + If a product is assigned to a resource, that means that the product + represents the resource on site. This may be represented via material + handling zones on a construction site, or equipment like cranes and + their physical locations. - If an actor is assigned to a resource, that means that the actor (person - or organisation) is the actor consuming the resource (e.g. if the - resource is material or equipment) or the actor performing the work - (e.g. if the resource is a labour resource). + If an actor is assigned to a resource, that means that the actor (person + or organisation) is the actor consuming the resource (e.g. if the + resource is material or equipment) or the actor performing the work + (e.g. if the resource is a labour resource). - :param relating_resource: The IfcResource to assign the object to. - :type relating_resource: ifcopenshell.entity_instance - :param related_object: The IfcProduct or IfcActor to assign to the - object. - :type related_object: ifcopenshell.entity_instance - :return: The newly created IfcRelAssignsToResource - :rtype: ifcopenshell.entity_instance + :param relating_resource: The IfcResource to assign the object to. + :type relating_resource: ifcopenshell.entity_instance + :param related_object: The IfcProduct or IfcActor to assign to the + object. + :type related_object: ifcopenshell.entity_instance + :return: The newly created IfcRelAssignsToResource + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - # Add some a tower crane to our crew. - crane = ifcopenshell.api.run("resource.add_resource", model, - parent_resource=crew, ifc_class="IfcConstructionEquipmentResource", name="Tower Crane 01") + # Add some a tower crane to our crew. + crane = ifcopenshell.api.run("resource.add_resource", model, + parent_resource=crew, ifc_class="IfcConstructionEquipmentResource", name="Tower Crane 01") - # Our tower crane will be placed via this physical product. - product = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcBuildingElementProxy", predefined_type="CRANE") + # Our tower crane will be placed via this physical product. + product = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcBuildingElementProxy", predefined_type="CRANE") - # Let's place our crane at some X, Y coordinates. - matrix = numpy.eye(4) - matrix[0][3], matrix[1][3] = 3.0, 4.0 - ifcopenshell.api.run("geometry.edit_object_placement", model, product=crane, matrix=matrix) + # Let's place our crane at some X, Y coordinates. + matrix = numpy.eye(4) + matrix[0][3], matrix[1][3] = 3.0, 4.0 + ifcopenshell.api.run("geometry.edit_object_placement", model, product=crane, matrix=matrix) - # Let's assign our crane to the resource. The crane now represents - # the resource. - ifcopenshell.api.run("resource.assign_resource", model, relating_resource=crane, related_object=product) + # Let's assign our crane to the resource. The crane now represents + # the resource. + ifcopenshell.api.run("resource.assign_resource", model, relating_resource=crane, related_object=product) - # Setup an organisation actor who will operate the crane - organisation = ifcopenshell.api.run("owner.add_organisation", model, - identification="UCO", name="Unionised Crane Operators Pty Ltd") - role = ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation, role="CREW") - actor = ifcopenshell.api.run("owner.add_actor", model, actor=organisation) + # Setup an organisation actor who will operate the crane + organisation = ifcopenshell.api.run("owner.add_organisation", model, + identification="UCO", name="Unionised Crane Operators Pty Ltd") + role = ifcopenshell.api.run("owner.add_role", model, assigned_object=organisation, role="CREW") + actor = ifcopenshell.api.run("owner.add_actor", model, actor=organisation) - # This means that UCO is now our crane operator. - ifcopenshell.api.run("resource.assign_resource", model, relating_resource=crane, related_object=actor) - """ - self.file = file - self.settings = { - "relating_resource": relating_resource, - "related_object": related_object, - } + # This means that UCO is now our crane operator. + ifcopenshell.api.run("resource.assign_resource", model, relating_resource=crane, related_object=actor) + """ + settings = { + "relating_resource": relating_resource, + "related_object": related_object, + } - def execute(self): - if self.settings["related_object"].HasAssignments: - for assignment in self.settings["related_object"].HasAssignments: - if ( - assignment.is_a("IfclRelAssignsToResource") - and assignment.RelatingResource - == self.settings["relating_resource"] - ): - return + if settings["related_object"].HasAssignments: + for assignment in settings["related_object"].HasAssignments: + if ( + assignment.is_a("IfclRelAssignsToResource") + and assignment.RelatingResource == settings["relating_resource"] + ): + return - resource_of = None - if self.settings["relating_resource"].ResourceOf: - resource_of = self.settings["relating_resource"].ResourceOf[0] + resource_of = None + if settings["relating_resource"].ResourceOf: + resource_of = settings["relating_resource"].ResourceOf[0] - if resource_of: - related_objects = list(resource_of.RelatedObjects) - related_objects.append(self.settings["related_object"]) - resource_of.RelatedObjects = related_objects - ifcopenshell.api.run( - "owner.update_owner_history", self.file, **{"element": resource_of} - ) - else: - resource_of = self.file.create_entity( - "IfcRelAssignsToResource", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run( - "owner.create_owner_history", self.file - ), - "RelatedObjects": [self.settings["related_object"]], - "RelatingResource": self.settings["relating_resource"], - } - ) - return resource_of + if resource_of: + related_objects = list(resource_of.RelatedObjects) + related_objects.append(settings["related_object"]) + resource_of.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": resource_of}) + else: + resource_of = file.create_entity( + "IfcRelAssignsToResource", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": [settings["related_object"]], + "RelatingResource": settings["relating_resource"], + } + ) + return resource_of diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py index 08602c9f0f..fc63b2d9d4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py @@ -23,42 +23,29 @@ import ifcopenshell.util.element import ifcopenshell.util.resource -class Usecase: - def __init__(self, file, resource=None): - """Calculates the number of resources required to perform scheduled work on a task. - """ - self.file = file - self.settings = {"resource": resource} +def calculate_resource_usage(file, resource=None) -> None: + """Calculates the number of resources required to perform scheduled work on a task.""" + settings = {"resource": resource} - def execute(self): - if ifcopenshell.util.constraint.is_attribute_locked(self.settings["resource"], "Usage.ScheduleUsage"): - return - if ( - not self.settings["resource"].Usage - or not self.settings["resource"].Usage.ScheduleWork - ): - return + if ifcopenshell.util.constraint.is_attribute_locked(settings["resource"], "Usage.ScheduleUsage"): + return + if not settings["resource"].Usage or not settings["resource"].Usage.ScheduleWork: + return - task = ifcopenshell.util.resource.get_task_assignments( - self.settings["resource"] - ) - if not task or not task.TaskTime: - return + task = ifcopenshell.util.resource.get_task_assignments(settings["resource"]) + if not task or not task.TaskTime: + return - if not task.TaskTime.DurationType or task.TaskTime.DurationType == "WORKTIME": - hours_per_day = 8 - else: - hours_per_day = 24 + if not task.TaskTime.DurationType or task.TaskTime.DurationType == "WORKTIME": + hours_per_day = 8 + else: + hours_per_day = 24 - task_duration = ifcopenshell.util.date.ifc2datetime( - task.TaskTime.ScheduleDuration - ) - seconds = task_duration.days * hours_per_day * 60 * 60 - seconds += task_duration.seconds + task_duration = ifcopenshell.util.date.ifc2datetime(task.TaskTime.ScheduleDuration) + seconds = task_duration.days * hours_per_day * 60 * 60 + seconds += task_duration.seconds - person_hours = ifcopenshell.util.date.ifc2datetime( - self.settings["resource"].Usage.ScheduleWork - ) + person_hours = ifcopenshell.util.date.ifc2datetime(settings["resource"].Usage.ScheduleWork) - required_resources = person_hours.total_seconds() / seconds - self.settings["resource"].Usage.ScheduleUsage = float(required_resources) + required_resources = person_hours.total_seconds() / seconds + settings["resource"].Usage.ScheduleUsage = float(required_resources) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py index 746f0d88c0..dd5621d386 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py @@ -23,52 +23,49 @@ import ifcopenshell.util.element import ifcopenshell.util.resource -class Usecase: - def __init__(self, file, resource=None): - """Calculates the work that a resource is used for +def calculate_resource_work(file, resource=None) -> None: + """Calculates the work that a resource is used for - This is an unofficial parametric calculation that may be done on a - resource based on careful analysis of the relationships between the - costing, scheduling, and resource domains in IFC. + This is an unofficial parametric calculation that may be done on a + resource based on careful analysis of the relationships between the + costing, scheduling, and resource domains in IFC. - A resource may store a productivity rate in a property set called - EPset_Productivity. This stores three properties: + A resource may store a productivity rate in a property set called + EPset_Productivity. This stores three properties: - * BaseQuantityConsumed - a duration that the resource is consumed for. - * BaseQuantityProducedName - what quantity the resource can produce, - such as area or volume. - * BaseQuantityProducedValue - what value of that quantity the resource - can produce during that duration. + * BaseQuantityConsumed - a duration that the resource is consumed for. + * BaseQuantityProducedName - what quantity the resource can produce, + such as area or volume. + * BaseQuantityProducedValue - what value of that quantity the resource + can produce during that duration. - For example, a labour or equipment resource might produce 100m3 of - NetVolume every day (i.e. 8 hours are consumed). + For example, a labour or equipment resource might produce 100m3 of + NetVolume every day (i.e. 8 hours are consumed). - Then, if a resource is assigned to a construction task, and that - construction task is assigned to concrete slabs totalling 200m3, we can - calculate that the resource consumes 16 hours of work. + Then, if a resource is assigned to a construction task, and that + construction task is assigned to concrete slabs totalling 200m3, we can + calculate that the resource consumes 16 hours of work. - This calculated work is stored against the resource as scheduled work - under the resource time data. + This calculated work is stored against the resource as scheduled work + under the resource time data. - :param resource: The IfcConstructionResource that you want to calculate - the work performed. - :type resource: ifcopenshell.entity_instance - :return None: - :rtype: None: - """ - self.file = file - self.settings = {"resource": resource} + :param resource: The IfcConstructionResource that you want to calculate + the work performed. + :type resource: ifcopenshell.entity_instance + :return None: + :rtype: None: + """ + settings = {"resource": resource} - def execute(self): - if ifcopenshell.util.constraint.is_attribute_locked(self.settings["resource"], "Usage.ScheduleWork"): - return - amount_worked = ifcopenshell.util.resource.get_resource_required_work(self.settings["resource"]) - if not amount_worked: - return - if not self.settings["resource"].Usage: - ifcopenshell.api.run( - "resource.add_resource_time", - self.file, - resource=self.settings["resource"], - ) - self.settings["resource"].Usage.ScheduleWork = amount_worked + if ifcopenshell.util.constraint.is_attribute_locked(settings["resource"], "Usage.ScheduleWork"): + return + amount_worked = ifcopenshell.util.resource.get_resource_required_work(settings["resource"]) + if not amount_worked: + return + if not settings["resource"].Usage: + ifcopenshell.api.run( + "resource.add_resource_time", + file, + resource=settings["resource"], + ) + settings["resource"].Usage.ScheduleWork = amount_worked diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py index c28f4c0661..2ab8ac669a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py @@ -17,33 +17,30 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, resource=None, attributes=None): - """Edits the attributes of an IfcResource +def edit_resource(file, resource=None, attributes=None) -> None: + """Edits the attributes of an IfcResource - For more information about the attributes and data types of an - IfcResource, consult the IFC documentation. + For more information about the attributes and data types of an + IfcResource, consult the IFC documentation. - :param resource: The IfcResource entity you want to edit - :type resource: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param resource: The IfcResource entity you want to edit + :type resource: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - # Change the name of the resource to "Zone A Crew" - ifcopenshell.api.run("resource.edit_resource", model, resource=resource, attributes={"Name": "Foo"}) - """ - self.file = file - self.settings = {"resource": resource, "attributes": attributes or {}} + # Change the name of the resource to "Zone A Crew" + ifcopenshell.api.run("resource.edit_resource", model, resource=resource, attributes={"Name": "Foo"}) + """ + settings = {"resource": resource, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["resource"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["resource"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py index 0785caa02e..b4d016c7ad 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py @@ -17,45 +17,42 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, physical_quantity=None, attributes=None): - """Edits the attributes of an IFC quantity +def edit_resource_quantity(file, physical_quantity=None, attributes=None) -> None: + """Edits the attributes of an IFC quantity - For more information about the attributes and data types of an - IfC quantity, consult the IFC documentation. + For more information about the attributes and data types of an + IfC quantity, consult the IFC documentation. - :param physical_quantity: The IfC quantity entity you want to edit - :type physical_quantity: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param physical_quantity: The IfC quantity entity you want to edit + :type physical_quantity: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - # Add some labour to our crew. - labour = ifcopenshell.api.run("resource.add_resource", model, - parent_resource=crew, ifc_class="IfcLaborResource") + # Add some labour to our crew. + labour = ifcopenshell.api.run("resource.add_resource", model, + parent_resource=crew, ifc_class="IfcLaborResource") - # Labour resource is quantified in terms of time. - ifcopenshell.api.run("resource.add_resource_quantity", model, - resource=labour, ifc_class="IfcQuantityTime") + # Labour resource is quantified in terms of time. + ifcopenshell.api.run("resource.add_resource_quantity", model, + resource=labour, ifc_class="IfcQuantityTime") - # Store the time used in hours - ifcopenshell.api.run("resource.edit_resource_quantity", model, - physical_quantity=time, attributes={"TimeValue": 8.0}) - """ - self.file = file - self.settings = { - "physical_quantity": physical_quantity, - "attributes": attributes or {}, - } + # Store the time used in hours + ifcopenshell.api.run("resource.edit_resource_quantity", model, + physical_quantity=time, attributes={"TimeValue": 8.0}) + """ + settings = { + "physical_quantity": physical_quantity, + "attributes": attributes or {}, + } - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["physical_quantity"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["physical_quantity"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py index c9db827a89..9ec41a60c5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py @@ -20,47 +20,50 @@ import datetime import ifcopenshell +def edit_resource_time(file, resource_time=None, attributes=None) -> None: + """Edits the attributes of an IfcResourceTime + + For more information about the attributes and data types of an + IfcResourceTime, consult the IFC documentation. + + :param resource_time: The IfcResourceTime entity you want to edit + :type resource_time: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None + + Example: + + .. code:: python + + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + + # Add some labour to our crew. + labour = ifcopenshell.api.run("resource.add_resource", model, + parent_resource=crew, ifc_class="IfcLaborResource") + + # Labour resource is quantified in terms of time. + ifcopenshell.api.run("resource.add_resource_quantity", model, + resource=labour, ifc_class="IfcQuantityTime") + + # Store the unit time used in hours + ifcopenshell.api.run("resource.edit_resource_quantity", model, + physical_quantity=time, attributes={"TimeValue": 8.0}) + + # Let's imagine we've used the resource for 2 days. + time = ifcopenshell.api.run("resource.add_resource_time", model, resource=labour) + ifcopenshell.api.run("resource.edit_resource_time", model, + resource_time=time, attributes={"ScheduleWork": "P16H"}) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"resource_time": resource_time, "attributes": attributes or {}} + return usecase.execute() + + class Usecase: - def __init__(self, file, resource_time=None, attributes=None): - """Edits the attributes of an IfcResourceTime - - For more information about the attributes and data types of an - IfcResourceTime, consult the IFC documentation. - - :param resource_time: The IfcResourceTime entity you want to edit - :type resource_time: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None - - Example: - - .. code:: python - - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - - # Add some labour to our crew. - labour = ifcopenshell.api.run("resource.add_resource", model, - parent_resource=crew, ifc_class="IfcLaborResource") - - # Labour resource is quantified in terms of time. - ifcopenshell.api.run("resource.add_resource_quantity", model, - resource=labour, ifc_class="IfcQuantityTime") - - # Store the unit time used in hours - ifcopenshell.api.run("resource.edit_resource_quantity", model, - physical_quantity=time, attributes={"TimeValue": 8.0}) - - # Let's imagine we've used the resource for 2 days. - time = ifcopenshell.api.run("resource.add_resource_time", model, resource=labour) - ifcopenshell.api.run("resource.edit_resource_time", model, - resource_time=time, attributes={"ScheduleWork": "P16H"}) - """ - self.file = file - self.settings = {"resource_time": resource_time, "attributes": attributes or {}} - def execute(self): self.resource = self.get_resource() @@ -70,43 +73,25 @@ class Usecase: and "ScheduleFinish" in self.settings["attributes"].keys() ): del self.settings["attributes"]["ScheduleFinish"] - if ( - self.settings["attributes"].get("ActualWork", None) - and "ActualFinish" in self.settings["attributes"].keys() - ): + if self.settings["attributes"].get("ActualWork", None) and "ActualFinish" in self.settings["attributes"].keys(): del self.settings["attributes"]["ActualFinish"] for name, value in self.settings["attributes"].items(): - metrics = ifcopenshell.util.constraint.get_metric_constraints( - self.resource, "Usage." + name - ) + metrics = ifcopenshell.util.constraint.get_metric_constraints(self.resource, "Usage." + name) if metrics and ifcopenshell.util.constraint.is_hard_constraint(metrics[0]): continue if value: if "Start" in name or "Finish" in name or name == "StatusTime": value = ifcopenshell.util.date.datetime2ifc(value, "IfcDateTime") - elif ( - name == "ScheduleWork" - or name == "ActualWork" - or name == "RemainingTime" - ): + elif name == "ScheduleWork" or name == "ActualWork" or name == "RemainingTime": value = ifcopenshell.util.date.datetime2ifc(value, "IfcDuration") setattr(self.settings["resource_time"], name, value) - if ( - name == "ScheduleUsage" - and ifcopenshell.util.constraint.get_metric_constraints( - self.resource, "Usage.ScheduleWork" - ) + if name == "ScheduleUsage" and ifcopenshell.util.constraint.get_metric_constraints( + self.resource, "Usage.ScheduleWork" ): task = ifcopenshell.util.resource.get_task_assignments(self.resource) if task: - ifcopenshell.api.run( - "sequence.calculate_task_duration", self.file, task=task - ) + ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=task) def get_resource(self): - return [ - e - for e in self.file.get_inverse(self.settings["resource_time"]) - if e.is_a("IfcResource") - ][0] + return [e for e in self.file.get_inverse(self.settings["resource_time"]) if e.is_a("IfcResource")][0] diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py index db8153a3e0..cfbdd25fd9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py @@ -21,71 +21,68 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, resource=None): - """Removes a resource and all relationships +def remove_resource(file, resource=None) -> None: + """Removes a resource and all relationships - Example: + Example: - .. code:: python + .. code:: python - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - # Fire our crew - ifcopenshell.api.run("resource.remove_resource", model, resource=crew) - """ - self.file = file - self.settings = {"resource": resource} + # Fire our crew + ifcopenshell.api.run("resource.remove_resource", model, resource=crew) + """ + settings = {"resource": resource} - def execute(self): - # TODO: review deep purge - for inverse in self.file.get_inverse(self.settings["resource"]): - if inverse.is_a("IfcRelNests"): - if inverse.RelatingObject == self.settings["resource"]: - for related_object in inverse.RelatedObjects: - ifcopenshell.api.run( - "resource.remove_resource", - self.file, - resource=related_object, - ) - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelAssignsToControl"): - if len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - else: - related_objects = list(inverse.RelatedObjects) - related_objects.remove(self.settings["resource"]) - inverse.RelatedObjects = related_objects - elif inverse.is_a("IfcRelAssignsToResource"): - if inverse.RelatingResource == self.settings["resource"]: - for related_object in inverse.RelatedObjects: - ifcopenshell.api.run( - "resource.unassign_resource", - self.file, - related_object=related_object, - resource=self.settings["resource"], - ) - elif inverse.RelatedObjects == tuple(self.settings["resource"]): - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - if self.settings["resource"].Usage: - self.file.remove(self.settings["resource"].Usage) - if self.settings["resource"].BaseQuantity: - ifcopenshell.api.run( - "resource.remove_resource_quantity", - self.file, - resource=self.settings["resource"], - ) - history = self.settings["resource"].OwnerHistory - self.file.remove(self.settings["resource"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + # TODO: review deep purge + for inverse in file.get_inverse(settings["resource"]): + if inverse.is_a("IfcRelNests"): + if inverse.RelatingObject == settings["resource"]: + for related_object in inverse.RelatedObjects: + ifcopenshell.api.run( + "resource.remove_resource", + file, + resource=related_object, + ) + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelAssignsToControl"): + if len(inverse.RelatedObjects) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + else: + related_objects = list(inverse.RelatedObjects) + related_objects.remove(settings["resource"]) + inverse.RelatedObjects = related_objects + elif inverse.is_a("IfcRelAssignsToResource"): + if inverse.RelatingResource == settings["resource"]: + for related_object in inverse.RelatedObjects: + ifcopenshell.api.run( + "resource.unassign_resource", + file, + related_object=related_object, + resource=settings["resource"], + ) + elif inverse.RelatedObjects == tuple(settings["resource"]): + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + if settings["resource"].Usage: + file.remove(settings["resource"].Usage) + if settings["resource"].BaseQuantity: + ifcopenshell.api.run( + "resource.remove_resource_quantity", + file, + resource=settings["resource"], + ) + history = settings["resource"].OwnerHistory + file.remove(settings["resource"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py index afafa9a193..221d94c5a6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py @@ -19,34 +19,31 @@ import ifcopenshell.util.element -class Usecase: - def __init__(self, file, resource=None): - """Removes the base quantity of a resource +def remove_resource_quantity(file, resource=None) -> None: + """Removes the base quantity of a resource - Example: + Example: - .. code:: python + .. code:: python - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - # Add some labour to our crew. - labour = ifcopenshell.api.run("resource.add_resource", model, - parent_resource=crew, ifc_class="IfcLaborResource") + # Add some labour to our crew. + labour = ifcopenshell.api.run("resource.add_resource", model, + parent_resource=crew, ifc_class="IfcLaborResource") - # Labour resource is quantified in terms of time. - ifcopenshell.api.run("resource.add_resource_quantity", model, - resource=labour, ifc_class="IfcQuantityTime") + # Labour resource is quantified in terms of time. + ifcopenshell.api.run("resource.add_resource_quantity", model, + resource=labour, ifc_class="IfcQuantityTime") - # Let's say we only want to store the resource but no quantities, - # let's clean up our mess and remove the quantity. - ifcopenshell.api.run("resource.remove_resource_quantity", model, resource=labour) - """ - self.file = file - self.settings = {"resource": resource} + # Let's say we only want to store the resource but no quantities, + # let's clean up our mess and remove the quantity. + ifcopenshell.api.run("resource.remove_resource_quantity", model, resource=labour) + """ + settings = {"resource": resource} - def execute(self): - old_quantity = self.settings["resource"].BaseQuantity - self.settings["resource"].BaseQuantity = None - if old_quantity: - ifcopenshell.util.element.remove_deep(self.file, old_quantity) + old_quantity = settings["resource"].BaseQuantity + settings["resource"].BaseQuantity = None + if old_quantity: + ifcopenshell.util.element.remove_deep(file, old_quantity) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py index ceed0dbf2a..7b1a59f519 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py @@ -21,65 +21,57 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, relating_resource=None, related_object=None): - """Removes the relationship between a resource and object +def unassign_resource(file, relating_resource=None, related_object=None) -> None: + """Removes the relationship between a resource and object - :param relating_resource: The IfcResource to assign the object to. - :type relating_resource: ifcopenshell.entity_instance - :param related_object: The IfcProduct or IfcActor to assign to the - object. - :type related_object: ifcopenshell.entity_instance - :return: The newly created IfcRelAssignsToResource - :rtype: ifcopenshell.entity_instance + :param relating_resource: The IfcResource to assign the object to. + :type relating_resource: ifcopenshell.entity_instance + :param related_object: The IfcProduct or IfcActor to assign to the + object. + :type related_object: ifcopenshell.entity_instance + :return: The newly created IfcRelAssignsToResource + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - # Add some a tower crane to our crew. - crane = ifcopenshell.api.run("resource.add_resource", model, - parent_resource=crew, ifc_class="IfcConstructionEquipmentResource", name="Tower Crane 01") + # Add some a tower crane to our crew. + crane = ifcopenshell.api.run("resource.add_resource", model, + parent_resource=crew, ifc_class="IfcConstructionEquipmentResource", name="Tower Crane 01") - # Our tower crane will be placed via this physical product. - product = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcBuildingElementProxy", predefined_type="CRANE") + # Our tower crane will be placed via this physical product. + product = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcBuildingElementProxy", predefined_type="CRANE") - # Let's assign our crane to the resource. The crane now represents - # the resource. - ifcopenshell.api.run("resource.assign_resource", model, - relating_resource=crane, related_object=product) + # Let's assign our crane to the resource. The crane now represents + # the resource. + ifcopenshell.api.run("resource.assign_resource", model, + relating_resource=crane, related_object=product) - # Undo it. - ifcopenshell.api.run("resource.unassign_resource", model, - relating_resource=crane, related_object=product) - """ - self.file = file - self.settings = { - "relating_resource": relating_resource, - "related_object": related_object, - } + # Undo it. + ifcopenshell.api.run("resource.unassign_resource", model, + relating_resource=crane, related_object=product) + """ + settings = { + "relating_resource": relating_resource, + "related_object": related_object, + } - def execute(self): - for rel in self.settings["related_object"].HasAssignments or []: - if ( - not rel.is_a("IfcRelAssignsToResource") - or rel.RelatingResource != self.settings["relating_resource"] - ): - continue - if len(rel.RelatedObjects) == 1: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - return - related_objects = list(rel.RelatedObjects) - related_objects.remove(self.settings["related_object"]) - rel.RelatedObjects = related_objects - ifcopenshell.api.run( - "owner.update_owner_history", self.file, **{"element": rel} - ) - return rel + for rel in settings["related_object"].HasAssignments or []: + if not rel.is_a("IfcRelAssignsToResource") or rel.RelatingResource != settings["relating_resource"]: + continue + if len(rel.RelatedObjects) == 1: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + return + related_objects = list(rel.RelatedObjects) + related_objects.remove(settings["related_object"]) + rel.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py index e0caddbe3c..309f87cfff 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py @@ -15,3 +15,8 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .copy_class import copy_class +from .create_entity import create_entity +from .reassign_class import reassign_class +from .remove_product import remove_product diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py b/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py index 389930d409..976010c3c3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py @@ -21,52 +21,55 @@ import ifcopenshell.util.system import ifcopenshell.util.element +def copy_class(file, product=None) -> None: + """Copies a product + + The following relationships are also duplicated: + + * The copy will have the same object placement coordinates as the + original. + * The copy will have duplicated property sets, properties, and quantities + * The copy will have all nested distribution ports copied too + * The copy will be part of the same aggregate + * The copy will be contained in the same spatial structure + * The copy, if it is an occurrence, will have the same type + * Voids are duplicated too + * The copy will have the same material as the original. Parametric + material set usages will be copied. + * The copy will be part of the same groups as the original. + + Be warned that: + + * Representations are _not_ copied. Copying representations is an + expensive operation so for now the user is responsible for handling + representations. + * Filled voids are not copied, as there is no guarantee that the filling + will also be copied. + * Path connectivity is not copied, as there is no guarantee that the + connections are still valid. + + :param product: The IfcProduct to copy. + :type param: ifcopenshell.entity_instance + :return: The copied product + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # We have a wall + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # And now we have two + wall_copy = ifcopenshell.api.run("root.copy_class", model, product=wall) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"product": product} + return usecase.execute() + + class Usecase: - def __init__(self, file, product=None): - """Copies a product - - The following relationships are also duplicated: - - * The copy will have the same object placement coordinates as the - original. - * The copy will have duplicated property sets, properties, and quantities - * The copy will have all nested distribution ports copied too - * The copy will be part of the same aggregate - * The copy will be contained in the same spatial structure - * The copy, if it is an occurrence, will have the same type - * Voids are duplicated too - * The copy will have the same material as the original. Parametric - material set usages will be copied. - * The copy will be part of the same groups as the original. - - Be warned that: - - * Representations are _not_ copied. Copying representations is an - expensive operation so for now the user is responsible for handling - representations. - * Filled voids are not copied, as there is no guarantee that the filling - will also be copied. - * Path connectivity is not copied, as there is no guarantee that the - connections are still valid. - - :param product: The IfcProduct to copy. - :type param: ifcopenshell.entity_instance - :return: The copied product - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # We have a wall - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # And now we have two - wall_copy = ifcopenshell.api.run("root.copy_class", model, product=wall) - """ - self.file = file - self.settings = {"product": product} - def execute(self): result = ifcopenshell.util.element.copy(self.file, self.settings["product"]) self.copy_direct_attributes(result) diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py index 7619eec067..5bb64d411a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py @@ -21,63 +21,65 @@ import ifcopenshell.api from typing import Optional +def create_entity( + file: ifcopenshell.file, + ifc_class: str = "IfcBuildingElementProxy", + predefined_type: Optional[str] = None, + name: Optional[str] = None, +) -> ifcopenshell.entity_instance: + """Create a new rooted product + + This is a critical function used to create almost any rooted product or + product type. If you want to create walls, spaces, buildings, wall + types, and so on, use this function. + + Just specify the class you want to create, as well as the predefined + type and name. It will handle the storage of the predefined type and + check whether the predefined type is built-in or custom. It will also + generate a valid GlobalId and store ownership history. It will also + handle some edge cases for default validity where users might forget to + populate some mandatory attributes. For example, doors must define an + operation type but many people forget. + + :param ifc_class: Any rooted IFC class. + :type ifc_class: str,optional + :param predefined_type: Any built-in or user-defined predefined type that + is applicable to that IFC class. For user-defined predefined types + just enter in any value and the API will handle it automatically. + :type predefined_type: str,optional + :param name: The name of the new element. + :type name: str,optional + :return: The newly created element based on the specified IFC class. + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # We have a project. + ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") + + # We have a building. + ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") + + # We have a wall. + ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # We have a wall type. + ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType") + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "ifc_class": ifc_class, + "predefined_type": predefined_type, + "name": name, + } + return usecase.execute() + + class Usecase: - def __init__( - self, - file: ifcopenshell.file, - ifc_class: str = "IfcBuildingElementProxy", - predefined_type: Optional[str] = None, - name: Optional[str] = None, - ): - """Create a new rooted product - - This is a critical function used to create almost any rooted product or - product type. If you want to create walls, spaces, buildings, wall - types, and so on, use this function. - - Just specify the class you want to create, as well as the predefined - type and name. It will handle the storage of the predefined type and - check whether the predefined type is built-in or custom. It will also - generate a valid GlobalId and store ownership history. It will also - handle some edge cases for default validity where users might forget to - populate some mandatory attributes. For example, doors must define an - operation type but many people forget. - - :param ifc_class: Any rooted IFC class. - :type ifc_class: str,optional - :param predefined_type: Any built-in or user-defined predefined type that - is applicable to that IFC class. For user-defined predefined types - just enter in any value and the API will handle it automatically. - :type predefined_type: str,optional - :param name: The name of the new element. - :type name: str,optional - :return: The newly created element based on the specified IFC class. - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # We have a project. - ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") - - # We have a building. - ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") - - # We have a wall. - ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # We have a wall type. - ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType") - """ - self.file = file - self.settings = { - "ifc_class": ifc_class, - "predefined_type": predefined_type, - "name": name, - } - - def execute(self) -> ifcopenshell.entity_instance: + def execute(self): element = self.file.create_entity( self.settings["ifc_class"], **{ diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py b/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py index 1035a6b17c..c124786a83 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py @@ -22,61 +22,63 @@ import ifcopenshell.util.schema import ifcopenshell.util.element +def reassign_class( + file, + product=None, + ifc_class="IfcBuildingElementProxy", + predefined_type=None, +) -> None: + """Changes the class of a product + + If you ever created a wall then realised it's meant to be something + else, this function lets you change the IFC class whilst retaining all + other geometry and relationships. + + This is especially useful when dealing with poorly classified data from + proprietary software with limited IFC capabilities. + + If you are reassigning a type, the occurrence classes are also + reassigned to maintain validity. + + Vice versa, if you are reassigning an occurrence, the type is also + reassigned in IFC4 and up. In IFC2X3, this may not occur if the type + cannot be unambiguously derived, so you are required to manually check + this. + + :param product: The IfcProduct that you want to change the class of. + :type product: ifcopenshell.entity_instance + :param ifc_class: The new IFC class you want to change it to. + :type ifc_class: str,optional + :param predefined_type: In case you want to change the predefined type + too. User defined types are also allowed, just type what you want. + :type predefined_type: str,optional + :return: The newly modified product. + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # We have a wall. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # Oh, did I say wall? I meant slab. + slab = ifcopenshell.api.run("root.reassign_class", model, product=wall, ifc_class="IfcSlab") + + # Warning: this will crash since wall doesn't exist any more. + print(wall) # Kaboom. + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "product": product, + "ifc_class": ifc_class, + "predefined_type": predefined_type, + } + return usecase.execute() + + class Usecase: - def __init__( - self, - file, - product=None, - ifc_class="IfcBuildingElementProxy", - predefined_type=None, - ): - """Changes the class of a product - - If you ever created a wall then realised it's meant to be something - else, this function lets you change the IFC class whilst retaining all - other geometry and relationships. - - This is especially useful when dealing with poorly classified data from - proprietary software with limited IFC capabilities. - - If you are reassigning a type, the occurrence classes are also - reassigned to maintain validity. - - Vice versa, if you are reassigning an occurrence, the type is also - reassigned in IFC4 and up. In IFC2X3, this may not occur if the type - cannot be unambiguously derived, so you are required to manually check - this. - - :param product: The IfcProduct that you want to change the class of. - :type product: ifcopenshell.entity_instance - :param ifc_class: The new IFC class you want to change it to. - :type ifc_class: str,optional - :param predefined_type: In case you want to change the predefined type - too. User defined types are also allowed, just type what you want. - :type predefined_type: str,optional - :return: The newly modified product. - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # We have a wall. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # Oh, did I say wall? I meant slab. - slab = ifcopenshell.api.run("root.reassign_class", model, product=wall, ifc_class="IfcSlab") - - # Warning: this will crash since wall doesn't exist any more. - print(wall) # Kaboom. - """ - self.file = file - self.settings = { - "product": product, - "ifc_class": ifc_class, - "predefined_type": predefined_type, - } - def execute(self): element = self.reassign_class(self.settings["product"], self.settings["ifc_class"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py b/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py index cecb5544f3..6a1c48b404 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py @@ -20,212 +20,207 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file: ifcopenshell.file, product: ifcopenshell.entity_instance): - """Removes a product +def remove_product(file: ifcopenshell.file, product: ifcopenshell.entity_instance) -> None: + """Removes a product - This is effectively a smart delete function that not only removes a - product, but also all of its relationships. It is always recommended to - use this function to prevent orphaned data in your IFC model. + This is effectively a smart delete function that not only removes a + product, but also all of its relationships. It is always recommended to + use this function to prevent orphaned data in your IFC model. - This is intended to be used for removing: + This is intended to be used for removing: - - IfcAnnotation - - IfcElement - - IfcElementType - - IfcSpatialElement - - IfcSpatialElementType + - IfcAnnotation + - IfcElement + - IfcElementType + - IfcSpatialElement + - IfcSpatialElementType - For example, geometric representations are removed. Placement - coordinates are also removed. Properties are removed. Material, type, - containment, aggregation, and nesting relationships are removed (but - naturally, the materials, types, containers, etc themselves remain). + For example, geometric representations are removed. Placement + coordinates are also removed. Properties are removed. Material, type, + containment, aggregation, and nesting relationships are removed (but + naturally, the materials, types, containers, etc themselves remain). - :param product: The element to remove. - :type product: ifcopenshell.entity_instance - :return: None - :rtype: None + :param product: The element to remove. + :type product: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # We have a wall. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # We have a wall. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # No we don't. - ifcopenshell.api.run("root.remove_product", model, product=wall) - """ - self.file = file - self.settings = {"product": product} + # No we don't. + ifcopenshell.api.run("root.remove_product", model, product=wall) + """ + settings = {"product": product} - def execute(self) -> None: - representations = [] - if self.settings["product"].is_a("IfcProduct"): - if self.settings["product"].Representation: - representations = self.settings["product"].Representation.Representations or [] - else: - representations = [] + representations = [] + if settings["product"].is_a("IfcProduct"): + if settings["product"].Representation: + representations = settings["product"].Representation.Representations or [] + else: + representations = [] - # remove object placements - object_placement = self.settings["product"].ObjectPlacement - if object_placement: - if self.file.get_total_inverses(object_placement) == 1: - self.settings["product"].ObjectPlacement = None # remove the inverse for remove_deep2 to work - ifcopenshell.util.element.remove_deep2(self.file, object_placement) + # remove object placements + object_placement = settings["product"].ObjectPlacement + if object_placement: + if file.get_total_inverses(object_placement) == 1: + settings["product"].ObjectPlacement = None # remove the inverse for remove_deep2 to work + ifcopenshell.util.element.remove_deep2(file, object_placement) - elif self.settings["product"].is_a("IfcTypeProduct"): - representations = [rm.MappedRepresentation for rm in self.settings["product"].RepresentationMaps or []] + elif settings["product"].is_a("IfcTypeProduct"): + representations = [rm.MappedRepresentation for rm in settings["product"].RepresentationMaps or []] - # remove psets - psets = self.settings["product"].HasPropertySets or [] - for pset in psets: - if self.file.get_total_inverses(pset) != 1: - continue - ifcopenshell.api.run( - "pset.remove_pset", - self.file, - product=self.settings["product"], - pset=pset, - ) - - for representation in representations: - ifcopenshell.api.run( - "geometry.unassign_representation", - self.file, - **{"product": self.settings["product"], "representation": representation} - ) - ifcopenshell.api.run("geometry.remove_representation", self.file, **{"representation": representation}) - for opening in getattr(self.settings["product"], "HasOpenings", []) or []: - ifcopenshell.api.run("void.remove_opening", self.file, opening=opening.RelatedOpeningElement) - - if self.settings["product"].is_a("IfcGrid"): - for axis in ( - self.settings["product"].UAxes + self.settings["product"].VAxes + (self.settings["product"].WAxes or ()) - ): - ifcopenshell.api.run("grid.remove_grid_axis", self.file, axis=axis) - - def element_exists(element_id): - try: - self.file.by_id(element_id) - return True - except RuntimeError: - return False - - # TODO: remove object placement and other relationships - for inverse_id in [i.id() for i in self.file.get_inverse(self.settings["product"])]: - try: - inverse = self.file.by_id(inverse_id) - except: + # remove psets + psets = settings["product"].HasPropertySets or [] + for pset in psets: + if file.get_total_inverses(pset) != 1: continue - if inverse.is_a("IfcRelDefinesByProperties"): - ifcopenshell.api.run( - "pset.remove_pset", - self.file, - product=self.settings["product"], - pset=inverse.RelatingPropertyDefinition, - ) - elif inverse.is_a("IfcRelAssociatesMaterial"): - ifcopenshell.api.run("material.unassign_material", self.file, products=[self.settings["product"]]) - elif inverse.is_a("IfcRelDefinesByType"): - if inverse.RelatingType == self.settings["product"]: - ifcopenshell.api.run("type.unassign_type", self.file, related_objects=inverse.RelatedObjects) - else: - ifcopenshell.api.run("type.unassign_type", self.file, related_objects=[self.settings["product"]]) - elif inverse.is_a("IfcRelSpaceBoundary"): - ifcopenshell.api.run("boundary.remove_boundary", self.file, boundary=inverse) - elif inverse.is_a("IfcRelFillsElement"): - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelVoidsElement"): - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelServicesBuildings"): - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelNests"): - if inverse.RelatingObject == self.settings["product"]: - inverse_id = inverse.id() - for subelement in inverse.RelatedObjects: - if subelement.is_a("IfcDistributionPort"): - ifcopenshell.api.run("root.remove_product", self.file, product=subelement) - # IfcRelNests could have been already deleted after removing one of the products - if element_exists(inverse_id): - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.RelatedObjects == (self.settings["product"],): + ifcopenshell.api.run( + "pset.remove_pset", + file, + product=settings["product"], + pset=pset, + ) + + for representation in representations: + ifcopenshell.api.run( + "geometry.unassign_representation", + file, + **{"product": settings["product"], "representation": representation} + ) + ifcopenshell.api.run("geometry.remove_representation", file, **{"representation": representation}) + for opening in getattr(settings["product"], "HasOpenings", []) or []: + ifcopenshell.api.run("void.remove_opening", file, opening=opening.RelatedOpeningElement) + + if settings["product"].is_a("IfcGrid"): + for axis in settings["product"].UAxes + settings["product"].VAxes + (settings["product"].WAxes or ()): + ifcopenshell.api.run("grid.remove_grid_axis", file, axis=axis) + + def element_exists(element_id): + try: + file.by_id(element_id) + return True + except RuntimeError: + return False + + # TODO: remove object placement and other relationships + for inverse_id in [i.id() for i in file.get_inverse(settings["product"])]: + try: + inverse = file.by_id(inverse_id) + except: + continue + if inverse.is_a("IfcRelDefinesByProperties"): + ifcopenshell.api.run( + "pset.remove_pset", + file, + product=settings["product"], + pset=inverse.RelatingPropertyDefinition, + ) + elif inverse.is_a("IfcRelAssociatesMaterial"): + ifcopenshell.api.run("material.unassign_material", file, products=[settings["product"]]) + elif inverse.is_a("IfcRelDefinesByType"): + if inverse.RelatingType == settings["product"]: + ifcopenshell.api.run("type.unassign_type", file, related_objects=inverse.RelatedObjects) + else: + ifcopenshell.api.run("type.unassign_type", file, related_objects=[settings["product"]]) + elif inverse.is_a("IfcRelSpaceBoundary"): + ifcopenshell.api.run("boundary.remove_boundary", file, boundary=inverse) + elif inverse.is_a("IfcRelFillsElement"): + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelVoidsElement"): + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelServicesBuildings"): + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelNests"): + if inverse.RelatingObject == settings["product"]: + inverse_id = inverse.id() + for subelement in inverse.RelatedObjects: + if subelement.is_a("IfcDistributionPort"): + ifcopenshell.api.run("root.remove_product", file, product=subelement) + # IfcRelNests could have been already deleted after removing one of the products + if element_exists(inverse_id): history = inverse.OwnerHistory - self.file.remove(inverse) + file.remove(inverse) if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelAggregates"): - if inverse.RelatingObject == self.settings["product"] or len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelContainedInSpatialStructure"): - if inverse.RelatingStructure == self.settings["product"] or len(inverse.RelatedElements) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelConnectsElements"): - if inverse.is_a("IfcRelConnectsWithRealizingElements"): - if self.settings["product"] not in (inverse.RelatingElement, inverse.RelatedElement) and any( - el for el in inverse.RealizingElements if el != self.settings["product"] - ): - continue + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.RelatedObjects == (settings["product"],): history = inverse.OwnerHistory - self.file.remove(inverse) + file.remove(inverse) if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelConnectsPorts"): - if self.settings["product"] not in (inverse.RelatingPort, inverse.RelatedPort): - # if it's not RelatingPort/RelatedPort then it's optional RealizingElement - # so we keep the relationship + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelAggregates"): + if inverse.RelatingObject == settings["product"] or len(inverse.RelatedObjects) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelContainedInSpatialStructure"): + if inverse.RelatingStructure == settings["product"] or len(inverse.RelatedElements) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelConnectsElements"): + if inverse.is_a("IfcRelConnectsWithRealizingElements"): + if settings["product"] not in (inverse.RelatingElement, inverse.RelatedElement) and any( + el for el in inverse.RealizingElements if el != settings["product"] + ): continue + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelConnectsPorts"): + if settings["product"] not in (inverse.RelatingPort, inverse.RelatedPort): + # if it's not RelatingPort/RelatedPort then it's optional RealizingElement + # so we keep the relationship + continue + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelAssignsToGroup"): + if len(inverse.RelatedObjects) == 1: history = inverse.OwnerHistory - self.file.remove(inverse) + file.remove(inverse) if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelAssignsToGroup"): - if len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelAssignsToProduct"): - if inverse.RelatingProduct == self.settings["product"]: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelFlowControlElements"): - if inverse.RelatingFlowElement == self.settings["product"]: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.RelatedControlElements == (self.settings["product"],): - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - history = self.settings["product"].OwnerHistory - self.file.remove(self.settings["product"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelAssignsToProduct"): + if inverse.RelatingProduct == settings["product"]: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif len(inverse.RelatedObjects) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelFlowControlElements"): + if inverse.RelatingFlowElement == settings["product"]: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.RelatedControlElements == (settings["product"],): + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + history = settings["product"].OwnerHistory + file.remove(settings["product"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py index e0caddbe3c..90cb5f4922 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py @@ -15,3 +15,47 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_task import add_task +from .add_task_time import add_task_time +from .add_time_period import add_time_period +from .add_work_calendar import add_work_calendar +from .add_work_plan import add_work_plan +from .add_work_schedule import add_work_schedule +from .add_work_time import add_work_time +from .assign_lag_time import assign_lag_time +from .assign_process import assign_process +from .assign_product import assign_product +from .assign_recurrence_pattern import assign_recurrence_pattern +from .assign_sequence import assign_sequence +from .assign_workplan import assign_workplan +from .calculate_task_duration import calculate_task_duration +from .cascade_schedule import cascade_schedule +from .create_baseline import create_baseline +from .duplicate_task import duplicate_task +from .edit_lag_time import edit_lag_time +from .edit_recurrence_pattern import edit_recurrence_pattern +from .edit_sequence import edit_sequence +from .edit_task import edit_task +from .edit_task_time import edit_task_time +from .edit_work_calendar import edit_work_calendar +from .edit_work_plan import edit_work_plan +from .edit_work_schedule import edit_work_schedule +from .edit_work_time import edit_work_time +from .get_related_products import get_related_products + +try: + from .recalculate_schedule import recalculate_schedule +except ModuleNotFoundError as e: + print(f"Note: API not available due to missing dependencies: sequence.recalculate_schedule - {e}") +from .remove_task import remove_task +from .remove_time_period import remove_time_period +from .remove_work_calendar import remove_work_calendar +from .remove_work_plan import remove_work_plan +from .remove_work_schedule import remove_work_schedule +from .remove_work_time import remove_work_time +from .unassign_lag_time import unassign_lag_time +from .unassign_process import unassign_process +from .unassign_product import unassign_product +from .unassign_recurrence_pattern import unassign_recurrence_pattern +from .unassign_sequence import unassign_sequence diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py index 60ab48c6df..7d1a91423f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py @@ -20,169 +20,159 @@ import ifcopenshell.api import ifcopenshell -class Usecase: - def __init__( - self, +def add_task( + file, + work_schedule=None, + parent_task=None, + name=None, + description=None, + identification=None, + predefined_type="NOTDEFINED", +) -> None: + """Adds a new task + + Tasks are typically used for two purposes: construction scheduling and + facility management. + + In construction scheduling, a task represents a job to be done in a work + schedule. Tasks are organised in a hierarchical manner known as a work + breakdown structure (WBS) and have lots of sequential relationships + (e.g. this task must finish before the next task can start) and date + information (e.g. durations, start dates). This is often represented as + a gantt chart and used to analyse critical paths to try and reduce + project time to stay on-time and within budget. + + In facility management, a task represents a maintenance task to maintain + a piece of equipment. Tasks are broken down into a punch list, or simply + a bulleted or ordered sequence of tasks to be performed (e.g. turn off + equipment, check power connection, etc) in order to maintain the + equipment. Tasks will also typically have recurring scheduled dates in + line with the maintenance schedule. These maintenance tasks and + procedures are typically published as part of an operations and + maintenance manual. + + All tasks must be grouped in a work schedule, either directly as a root + or top-level task, or indirectly as a child or subtask of a parent task. + In construction scheduling, tasks may be nested many times to create the + work breakdown structure, and the "leaf" tasks (i.e. tasks with no more + subtasks) are considered to be the activities with dates, whereas all + parent tasks are part of the breakdown structure used for categorisation + purposes. In facility management, top-level tasks represent the overall + maintenance job to be performed, and child tasks represent an ordered + list of things to do for that maintenance. These form a 2-level + hierarchy. No further child tasks are recommended. + + :param work_schedule: The work schedule to group the task in, if the + task is to be a top-level or root task. This is mutually exclusive + with the parent_task parameter. + :type work_schedule: ifcopenshell.entity_instance + :param parent_task: The parent task, if the task is to be a subtask or + child task. This is mutually exclusive with the work_schedule + parameter. + :type parent_task: ifcopenshell.entity_instance + :param name: The name of the task. + :type name: str,optional + :param description: The description of the task. + :type description: str,optional + :param identification: The identification code of the task. + :type identification: str,optional + :param predefined_type: The predefined type of the task. Common ones + include CONSTRUCTION, DEMOLITION, or MAINTENANCE. Consultant the + IFC documentation for IfcTaskTypeEnum for more information. + :type predefined_type: str + :return: The newly created IfcTask + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + + # Add a root task to represent the design milestones, and major + # project phases. + ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Milestones", identification="A") + ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Design", identification="B") + construction = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") + + # Let's start creating our work breakdown structure. + ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Early Works", identification="C1") + ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Substructure", identification="C2") + superstructure = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Superstructure", identification="C3") + + # Notice how the leaf task is the actual activity + ifcopenshell.api.run("sequence.add_task", model, + parent_task=superstructure, name="Ground Floor FRP", identification="C3.1") + + # Let's imagine we are digitising an operations and maintenance + # manual for the mechanical discipline. + maintenance = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Mechanical Maintenance") + + # Imagine we have to clean the condenser coils for a chiller every + # month. Like the schedule above, to keep things simple we won't + # show scheduling times and calendars. This root task represents the + # overall maintenance task. + cleaning = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=maintenance, name="Condenser coil cleaning") + + # These subtasks represent the punch list of maintenance tasks. + ifcopenshell.api.run("sequence.add_task", model, parent_task=cleaning, identification="1", + description="Prior to work, wear safety shoes, gloves, and goggles.") + ifcopenshell.api.run("sequence.add_task", model, parent_task=cleaning, identification="2", + description="Prepare jet pump, screwdriver, hose clamp, and control panel door key.") + ifcopenshell.api.run("sequence.add_task", model, parent_task=cleaning, identification="3", + description="Switch OFF the chiller unit.") + ifcopenshell.api.run("sequence.add_task", model, parent_task=cleaning, identification="3", + description="Open the isolator switch.") + ifcopenshell.api.run("sequence.add_task", model, parent_task=cleaning, identification="3", + description="Setup the water pressure by tapping to a water supply and connecting to a ...") + """ + settings = { + "work_schedule": work_schedule, + "parent_task": parent_task, + "name": name, + "description": description, + "identification": identification, + "predefined_type": predefined_type, + } + + task = ifcopenshell.api.run( + "root.create_entity", file, - work_schedule=None, - parent_task=None, - name=None, - description=None, - identification=None, - predefined_type="NOTDEFINED", - ): - """Adds a new task - - Tasks are typically used for two purposes: construction scheduling and - facility management. - - In construction scheduling, a task represents a job to be done in a work - schedule. Tasks are organised in a hierarchical manner known as a work - breakdown structure (WBS) and have lots of sequential relationships - (e.g. this task must finish before the next task can start) and date - information (e.g. durations, start dates). This is often represented as - a gantt chart and used to analyse critical paths to try and reduce - project time to stay on-time and within budget. - - In facility management, a task represents a maintenance task to maintain - a piece of equipment. Tasks are broken down into a punch list, or simply - a bulleted or ordered sequence of tasks to be performed (e.g. turn off - equipment, check power connection, etc) in order to maintain the - equipment. Tasks will also typically have recurring scheduled dates in - line with the maintenance schedule. These maintenance tasks and - procedures are typically published as part of an operations and - maintenance manual. - - All tasks must be grouped in a work schedule, either directly as a root - or top-level task, or indirectly as a child or subtask of a parent task. - In construction scheduling, tasks may be nested many times to create the - work breakdown structure, and the "leaf" tasks (i.e. tasks with no more - subtasks) are considered to be the activities with dates, whereas all - parent tasks are part of the breakdown structure used for categorisation - purposes. In facility management, top-level tasks represent the overall - maintenance job to be performed, and child tasks represent an ordered - list of things to do for that maintenance. These form a 2-level - hierarchy. No further child tasks are recommended. - - :param work_schedule: The work schedule to group the task in, if the - task is to be a top-level or root task. This is mutually exclusive - with the parent_task parameter. - :type work_schedule: ifcopenshell.entity_instance - :param parent_task: The parent task, if the task is to be a subtask or - child task. This is mutually exclusive with the work_schedule - parameter. - :type parent_task: ifcopenshell.entity_instance - :param name: The name of the task. - :type name: str,optional - :param description: The description of the task. - :type description: str,optional - :param identification: The identification code of the task. - :type identification: str,optional - :param predefined_type: The predefined type of the task. Common ones - include CONSTRUCTION, DEMOLITION, or MAINTENANCE. Consultant the - IFC documentation for IfcTaskTypeEnum for more information. - :type predefined_type: str - :return: The newly created IfcTask - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - - # Add a root task to represent the design milestones, and major - # project phases. - ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Milestones", identification="A") - ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Design", identification="B") - construction = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") - - # Let's start creating our work breakdown structure. - ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Early Works", identification="C1") - ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Substructure", identification="C2") - superstructure = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Superstructure", identification="C3") - - # Notice how the leaf task is the actual activity - ifcopenshell.api.run("sequence.add_task", model, - parent_task=superstructure, name="Ground Floor FRP", identification="C3.1") - - # Let's imagine we are digitising an operations and maintenance - # manual for the mechanical discipline. - maintenance = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Mechanical Maintenance") - - # Imagine we have to clean the condenser coils for a chiller every - # month. Like the schedule above, to keep things simple we won't - # show scheduling times and calendars. This root task represents the - # overall maintenance task. - cleaning = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=maintenance, name="Condenser coil cleaning") - - # These subtasks represent the punch list of maintenance tasks. - ifcopenshell.api.run("sequence.add_task", model, parent_task=cleaning, identification="1", - description="Prior to work, wear safety shoes, gloves, and goggles.") - ifcopenshell.api.run("sequence.add_task", model, parent_task=cleaning, identification="2", - description="Prepare jet pump, screwdriver, hose clamp, and control panel door key.") - ifcopenshell.api.run("sequence.add_task", model, parent_task=cleaning, identification="3", - description="Switch OFF the chiller unit.") - ifcopenshell.api.run("sequence.add_task", model, parent_task=cleaning, identification="3", - description="Open the isolator switch.") - ifcopenshell.api.run("sequence.add_task", model, parent_task=cleaning, identification="3", - description="Setup the water pressure by tapping to a water supply and connecting to a ...") - """ - self.file = file - self.settings = { - "work_schedule": work_schedule, - "parent_task": parent_task, - "name": name, - "description": description, - "identification": identification, - "predefined_type": predefined_type, - } - - def execute(self): - task = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class="IfcTask", - name=self.settings["name"], - predefined_type=self.settings["predefined_type"], + ifc_class="IfcTask", + name=settings["name"], + predefined_type=settings["predefined_type"], + ) + if settings["description"]: + task.Description = settings["description"] + if settings["identification"]: + task.Identification = settings["identification"] + task.IsMilestone = False + if settings["work_schedule"]: + file.create_entity( + "IfcRelAssignsToControl", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": [task], + "RelatingControl": settings["work_schedule"], + } ) - if self.settings["description"]: - task.Description = self.settings["description"] - if self.settings["identification"]: - task.Identification = self.settings["identification"] - task.IsMilestone = False - if self.settings["work_schedule"]: - self.file.create_entity( - "IfcRelAssignsToControl", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run( - "owner.create_owner_history", self.file - ), - "RelatedObjects": [task], - "RelatingControl": self.settings["work_schedule"], - } - ) - elif self.settings["parent_task"]: - rel = ifcopenshell.api.run( - "nest.assign_object", - self.file, - related_objects=[task], - relating_object=self.settings["parent_task"], - ) - if self.settings["parent_task"].Identification: - task.Identification = ( - self.settings["parent_task"].Identification - + "." - + str(len(rel.RelatedObjects)) - ) - return task + elif settings["parent_task"]: + rel = ifcopenshell.api.run( + "nest.assign_object", + file, + related_objects=[task], + relating_object=settings["parent_task"], + ) + if settings["parent_task"].Identification: + task.Identification = settings["parent_task"].Identification + "." + str(len(rel.RelatedObjects)) + return task diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py index 7c4381c361..bbd51c2e68 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py @@ -17,55 +17,52 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, task=None, is_recurring=False): - """Adds a task time to a task +def add_task_time(file, task=None, is_recurring=False) -> None: + """Adds a task time to a task - Some tasks, such as activities within a work breakdown structure or - overall maintenance tasks will have time related information. This - includes start dates, durations, end dates, and possible recurring times - (especially for maintenance tasks). + Some tasks, such as activities within a work breakdown structure or + overall maintenance tasks will have time related information. This + includes start dates, durations, end dates, and possible recurring times + (especially for maintenance tasks). - :param task: The task to add time data to. - :type task: ifcopenshell.entity_instance - :param is_recurring: Whether or not the time should recur. - :type is_recurring: bool - :return: The newly created IfcTaskTime. - :rtype: ifcopenshell.entity_instance + :param task: The task to add time data to. + :type task: ifcopenshell.entity_instance + :param is_recurring: Whether or not the time should recur. + :type is_recurring: bool + :return: The newly created IfcTaskTime. + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Create a portion of a work breakdown structure. - construction = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") - superstructure = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Superstructure", identification="C3") - task = ifcopenshell.api.run("sequence.add_task", model, - parent_task=superstructure, name="Ground Floor FRP", identification="C3.1") + # Create a portion of a work breakdown structure. + construction = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") + superstructure = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Superstructure", identification="C3") + task = ifcopenshell.api.run("sequence.add_task", model, + parent_task=superstructure, name="Ground Floor FRP", identification="C3.1") - # Add time data. Note that time data is blank by default. - time = ifcopenshell.api.run("sequence.add_task_time", model, task=task) + # Add time data. Note that time data is blank by default. + time = ifcopenshell.api.run("sequence.add_task_time", model, task=task) - # Let's say our task starts on the first of January when everybody - # is still drunk from the new years celebration, and lasts for 2 - # days. Note we don't need to specify the end date, as that is - # derived from the start plus the duration. In this simple example, - # no calendar has been specified, so we are working 24/7. Yikes! - ifcopenshell.api.run("sequence.edit_task_time", model, - task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) - """ - self.file = file - self.settings = {"task": task, "is_recurring": is_recurring} + # Let's say our task starts on the first of January when everybody + # is still drunk from the new years celebration, and lasts for 2 + # days. Note we don't need to specify the end date, as that is + # derived from the start plus the duration. In this simple example, + # no calendar has been specified, so we are working 24/7. Yikes! + ifcopenshell.api.run("sequence.edit_task_time", model, + task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) + """ + settings = {"task": task, "is_recurring": is_recurring} - def execute(self): - if self.settings["is_recurring"]: - task_time = self.file.create_entity("IfcTaskTimeRecurring") - else: - task_time = self.file.create_entity("IfcTaskTime") - self.settings["task"].TaskTime = task_time - return task_time + if settings["is_recurring"]: + task_time = file.create_entity("IfcTaskTimeRecurring") + else: + task_time = file.create_entity("IfcTaskTime") + settings["task"].TaskTime = task_time + return task_time diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py index 35a022a9ea..479524a4b1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py @@ -23,79 +23,72 @@ from datetime import datetime from datetime import timedelta -class Usecase: - def __init__(self, file, recurrence_pattern=None, start_time=None, end_time=None): - """Adds a time period to a recurrence pattern +def add_time_period(file, recurrence_pattern=None, start_time=None, end_time=None) -> None: + """Adds a time period to a recurrence pattern - A recurring time may be an all-day event, or only during certain time - periods of the day. For example, you might say that every 1st of January - recurring is a public holiday, which is an all-day event. Alternatively, - you might say that you work every (i.e. recurringly) Monday to Friday, - from 9am to 5pm. The 9am to 5pm is the time period. + A recurring time may be an all-day event, or only during certain time + periods of the day. For example, you might say that every 1st of January + recurring is a public holiday, which is an all-day event. Alternatively, + you might say that you work every (i.e. recurringly) Monday to Friday, + from 9am to 5pm. The 9am to 5pm is the time period. - There may also be multiple recurrence patterns, such as from 9am to - 12pm, and then another from 1pm to 5pm (to indicate an hour break for - lunch). + There may also be multiple recurrence patterns, such as from 9am to + 12pm, and then another from 1pm to 5pm (to indicate an hour break for + lunch). - :param recurrence_pattern: The IfcRecurrencePattern to add the time - period to. See ifcopenshell.api.sequence.assign_recurrence_pattern. - :type recurrence_pattern: ifcopenshell.entity_instance - :param start_time: The start time of the time period, in a format - compatible with IfcTime, such as an ISO format time string or a - datetime.time object. - :type start_time: str,datetime.time - :param end_time: The end time of the time period, in a format - compatible with IfcTime, such as an ISO format time string or a - datetime.time object. - :type end_time: str,datetime.time - :return: The newly created IfcTimePeriod - :rtype: ifcopenshell.entity_instance + :param recurrence_pattern: The IfcRecurrencePattern to add the time + period to. See ifcopenshell.api.sequence.assign_recurrence_pattern. + :type recurrence_pattern: ifcopenshell.entity_instance + :param start_time: The start time of the time period, in a format + compatible with IfcTime, such as an ISO format time string or a + datetime.time object. + :type start_time: str,datetime.time + :param end_time: The end time of the time period, in a format + compatible with IfcTime, such as an ISO format time string or a + datetime.time object. + :type end_time: str,datetime.time + :return: The newly created IfcTimePeriod + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) - # Let's start defining the times that we work during the week. - work_time = ifcopenshell.api.run("sequence.add_work_time", model, - work_calendar=calendar, time_type="WorkingTimes") + # Let's start defining the times that we work during the week. + work_time = ifcopenshell.api.run("sequence.add_work_time", model, + work_calendar=calendar, time_type="WorkingTimes") - # We create a weekly recurrence - pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, - parent=work_time, recurrence_type="WEEKLY") + # We create a weekly recurrence + pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, + parent=work_time, recurrence_type="WEEKLY") - # State that we work from weekdays 1 to 5 (i.e. Monday to Friday) - ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, - recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) + # State that we work from weekdays 1 to 5 (i.e. Monday to Friday) + ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, + recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) - # The morning work session, lunch, then the afternoon work session. - ifcopenshell.api.run("sequence.add_time_period", model, - recurrence_pattern=pattern, start_time="09:00", end_time="12:00") - ifcopenshell.api.run("sequence.add_time_period", model, - recurrence_pattern=pattern, start_time="13:00", end_time="17:00") - """ - self.file = file - self.settings = { - "recurrence_pattern": recurrence_pattern, - "start_time": start_time, - "end_time": end_time, - } + # The morning work session, lunch, then the afternoon work session. + ifcopenshell.api.run("sequence.add_time_period", model, + recurrence_pattern=pattern, start_time="09:00", end_time="12:00") + ifcopenshell.api.run("sequence.add_time_period", model, + recurrence_pattern=pattern, start_time="13:00", end_time="17:00") + """ + settings = { + "recurrence_pattern": recurrence_pattern, + "start_time": start_time, + "end_time": end_time, + } - def execute(self): - time_period = self.file.create_entity("IfcTimePeriod") - time_period.StartTime = ifcopenshell.util.date.datetime2ifc( - self.settings["start_time"], "IfcTime" - ) - time_period.EndTime = ifcopenshell.util.date.datetime2ifc( - self.settings["end_time"], "IfcTime" - ) - time_periods = list(self.settings["recurrence_pattern"].TimePeriods or []) - time_periods.append(time_period) - self.settings["recurrence_pattern"].TimePeriods = time_periods + time_period = file.create_entity("IfcTimePeriod") + time_period.StartTime = ifcopenshell.util.date.datetime2ifc(settings["start_time"], "IfcTime") + time_period.EndTime = ifcopenshell.util.date.datetime2ifc(settings["end_time"], "IfcTime") + time_periods = list(settings["recurrence_pattern"].TimePeriods or []) + time_periods.append(time_period) + settings["recurrence_pattern"].TimePeriods = time_periods - ifcopenshell.util.sequence.is_working_day.cache_clear() - ifcopenshell.util.sequence.is_calendar_applicable.cache_clear() + ifcopenshell.util.sequence.is_working_day.cache_clear() + ifcopenshell.util.sequence.is_calendar_applicable.cache_clear() - return time_period + return time_period diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py index 373d628be6..250a1b2fe0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py @@ -19,80 +19,77 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, name="Unnamed", predefined_type="NOTDEFINED"): - """Add a work calendar +def add_work_calendar(file, name="Unnamed", predefined_type="NOTDEFINED") -> None: + """Add a work calendar - A work calendar defines when work is allowed to occur and when the - holidays are. This is a fundamental concept in construction planning. - Every task in a work schedule will have an associated calendar. Some - task and resources work 24/7, whereas others work Monday to Friday, or - 5.5 day weeks, etc. This is important, as tasks durations may only occur - during working times in a work calendar. + A work calendar defines when work is allowed to occur and when the + holidays are. This is a fundamental concept in construction planning. + Every task in a work schedule will have an associated calendar. Some + task and resources work 24/7, whereas others work Monday to Friday, or + 5.5 day weeks, etc. This is important, as tasks durations may only occur + during working times in a work calendar. - Work calendars can also be used to associate with events, such as - indicating that during certain days and times of the year, motion - sensors should turn on the lights, and other smart building controls. + Work calendars can also be used to associate with events, such as + indicating that during certain days and times of the year, motion + sensors should turn on the lights, and other smart building controls. - :param name: The name of the calendar. Typically something like - "5 Day Working Week" or "24/7". - :type name: str, optional - :param predefined_type: The type of calendar, typically used to more - specifically define shifts, such as FIRSTSHIFT, SECONDSHIFT, or - THIRDSHIFT. Leave as NOTDEFINED for basic calendar usage. - :return: The newly created IfcWorkCalendar - :rtype: ifcopenshell.entity_instance + :param name: The name of the calendar. Typically something like + "5 Day Working Week" or "24/7". + :type name: str, optional + :param predefined_type: The type of calendar, typically used to more + specifically define shifts, such as FIRSTSHIFT, SECONDSHIFT, or + THIRDSHIFT. Leave as NOTDEFINED for basic calendar usage. + :return: The newly created IfcWorkCalendar + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Add a root task to represent the construction tasks. - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") + # Add a root task to represent the construction tasks. + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model, name="5 Day Week") + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model, name="5 Day Week") - # Let's start defining the times that we work during the week. - work_time = ifcopenshell.api.run("sequence.add_work_time", model, - work_calendar=calendar, time_type="WorkingTimes") + # Let's start defining the times that we work during the week. + work_time = ifcopenshell.api.run("sequence.add_work_time", model, + work_calendar=calendar, time_type="WorkingTimes") - # We create a weekly recurrence - pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, - parent=work_time, recurrence_type="WEEKLY") + # We create a weekly recurrence + pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, + parent=work_time, recurrence_type="WEEKLY") - # State that we work from weekdays 1 to 5 (i.e. Monday to Friday), 9am to 5pm - ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, - recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) - ifcopenshell.api.run("sequence.add_time_period", model, - recurrence_pattern=pattern, start_time="09:00", end_time="17:00") + # State that we work from weekdays 1 to 5 (i.e. Monday to Friday), 9am to 5pm + ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, + recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) + ifcopenshell.api.run("sequence.add_time_period", model, + recurrence_pattern=pattern, start_time="09:00", end_time="17:00") - # We associate the calendar with the construction root task. All - # subtasks underneath the construction work task will also inherit - # this calendar by default (though you can override them). - ifcopenshell.api.run("control.assign_control", model, relating_control=calendar, related_object=task) - """ - self.file = file - self.settings = {"name": name, "predefined_type": predefined_type} + # We associate the calendar with the construction root task. All + # subtasks underneath the construction work task will also inherit + # this calendar by default (though you can override them). + ifcopenshell.api.run("control.assign_control", model, relating_control=calendar, related_object=task) + """ + settings = {"name": name, "predefined_type": predefined_type} - def execute(self): - work_calendar = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class="IfcWorkCalendar", - predefined_type=self.settings["predefined_type"], - name=self.settings["name"], - ) - context = self.file.by_type("IfcContext")[0] - ifcopenshell.api.run( - "project.assign_declaration", - self.file, - definitions=[work_calendar], - relating_context=context, - ) - return work_calendar + work_calendar = ifcopenshell.api.run( + "root.create_entity", + file, + ifc_class="IfcWorkCalendar", + predefined_type=settings["predefined_type"], + name=settings["name"], + ) + context = file.by_type("IfcContext")[0] + ifcopenshell.api.run( + "project.assign_declaration", + file, + definitions=[work_calendar], + relating_context=context, + ) + return work_calendar diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py index f6fba71315..858d944d66 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py @@ -21,70 +21,63 @@ import ifcopenshell.util.date from datetime import datetime -class Usecase: - def __init__(self, file, name=None, predefined_type="NOTDEFINED", start_time=None): - """Add a new work plan +def add_work_plan(file, name=None, predefined_type="NOTDEFINED", start_time=None) -> None: + """Add a new work plan - A work plan is a group of work schedules. Since work schedules may have - different purposes, such as for maintenance or construction scheduling, - baseline comparison, or phasing, work plans can be used to group related - work schedules. At a minimum, it is recommended to use work plans to - indicate whether the work schedules are for facility management or for - construction scheduling. + A work plan is a group of work schedules. Since work schedules may have + different purposes, such as for maintenance or construction scheduling, + baseline comparison, or phasing, work plans can be used to group related + work schedules. At a minimum, it is recommended to use work plans to + indicate whether the work schedules are for facility management or for + construction scheduling. - :param name: The name of the work plan. Recommended to be "Maintenance" - or "Construction" for the two main purposes. - :type name: str, optional - :param predefined_type: The type of work plan, used for baselining. - Leave as "NOTDEFINED" if unsure. - :type predefined_type: str - :param start_time: The earliest start time when the schedules grouped - within the work plan are relevant. - :type start_time: str,datetime.time - :return: The newly created IfcWorkPlan - :rtype: ifcopenshell.entity_instance + :param name: The name of the work plan. Recommended to be "Maintenance" + or "Construction" for the two main purposes. + :type name: str, optional + :param predefined_type: The type of work plan, used for baselining. + Leave as "NOTDEFINED" if unsure. + :type predefined_type: str + :param start_time: The earliest start time when the schedules grouped + within the work plan are relevant. + :type start_time: str,datetime.time + :return: The newly created IfcWorkPlan + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # This will hold all our construction schedules - work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") + # This will hold all our construction schedules + work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") - # This is one of our schedules in our work plan. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, - name="Construction Schedule A", work_plan=work_plan) - """ - self.file = file - self.settings = { - "name": name, - "predefined_type": predefined_type, - "start_time": start_time or datetime.now(), - } + # This is one of our schedules in our work plan. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, + name="Construction Schedule A", work_plan=work_plan) + """ + settings = { + "name": name, + "predefined_type": predefined_type, + "start_time": start_time or datetime.now(), + } - def execute(self): - work_plan = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class="IfcWorkPlan", - predefined_type=self.settings["predefined_type"], - name=self.settings["name"], - ) - work_plan.CreationDate = ifcopenshell.util.date.datetime2ifc( - datetime.now(), "IfcDateTime" - ) - user = ifcopenshell.api.owner.settings.get_user(self.file) - if user: - work_plan.Creators = [user.ThePerson] - work_plan.StartTime = ifcopenshell.util.date.datetime2ifc( - self.settings["start_time"], "IfcDateTime" - ) + work_plan = ifcopenshell.api.run( + "root.create_entity", + file, + ifc_class="IfcWorkPlan", + predefined_type=settings["predefined_type"], + name=settings["name"], + ) + work_plan.CreationDate = ifcopenshell.util.date.datetime2ifc(datetime.now(), "IfcDateTime") + user = ifcopenshell.api.owner.settings.get_user(file) + if user: + work_plan.Creators = [user.ThePerson] + work_plan.StartTime = ifcopenshell.util.date.datetime2ifc(settings["start_time"], "IfcDateTime") - context = self.file.by_type("IfcContext")[0] - ifcopenshell.api.run( - "project.assign_declaration", - self.file, - definitions=[work_plan], - relating_context=context, - ) - return work_plan + context = file.by_type("IfcContext")[0] + ifcopenshell.api.run( + "project.assign_declaration", + file, + definitions=[work_plan], + relating_context=context, + ) + return work_plan diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py index 47e96a8fa3..21f508999c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py @@ -21,104 +21,96 @@ import ifcopenshell.util.date from datetime import datetime -class Usecase: - def __init__( - self, +def add_work_schedule( + file, + name="Unnamed", + predefined_type="NOTDEFINED", + object_type=None, + start_time=None, + work_plan=None, +) -> None: + """Add a new work schedule + + A work schedule is a group of tasks, where the tasks are typically + either for maintenance or for construction scheduling. + + :param name: The name of the work schedule. + :type name: str + :param predefined_type: The type of schedule, chosen from ACTUAL, + BASELINE, and PLANNED. Typically you would start with PLANNED, then + convert to a BASELINE when changes are made with separate schedules, + then have a parallel ACTUAL schedule. + :type predefined_type: str + :param start_time: The earlier start time when the schedule is relevant. + May be represented with an ISO standard string. + :type start_time: str,datetime.time,optional + :param work_plan: The IfcWorkPlan the schedule will be part of. If not + provided, the schedule will not be grouped in a work plan and would + exist as a top level schedule in the project. This is not + recommended. + :type work_plan: ifcopenshell.entity_instance,optional + :return: The newly created IfcWorkSchedule + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # This will hold all our construction schedules + work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") + + # Let's imagine this is one of our schedules in our work plan. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, + name="Construction Schedule A", work_plan=work_plan) + + # Add a root task to represent the design milestones, and major + # project phases. + ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Milestones", identification="A") + ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Design", identification="B") + construction = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") + """ + settings = { + "name": name, + "predefined_type": predefined_type, + "object_type": object_type, + "start_time": start_time or datetime.now(), + "work_plan": work_plan, + } + + work_schedule = ifcopenshell.api.run( + "root.create_entity", file, - name="Unnamed", - predefined_type="NOTDEFINED", - object_type=None, - start_time=None, - work_plan=None, - ): - """Add a new work schedule - - A work schedule is a group of tasks, where the tasks are typically - either for maintenance or for construction scheduling. - - :param name: The name of the work schedule. - :type name: str - :param predefined_type: The type of schedule, chosen from ACTUAL, - BASELINE, and PLANNED. Typically you would start with PLANNED, then - convert to a BASELINE when changes are made with separate schedules, - then have a parallel ACTUAL schedule. - :type predefined_type: str - :param start_time: The earlier start time when the schedule is relevant. - May be represented with an ISO standard string. - :type start_time: str,datetime.time,optional - :param work_plan: The IfcWorkPlan the schedule will be part of. If not - provided, the schedule will not be grouped in a work plan and would - exist as a top level schedule in the project. This is not - recommended. - :type work_plan: ifcopenshell.entity_instance,optional - :return: The newly created IfcWorkSchedule - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # This will hold all our construction schedules - work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") - - # Let's imagine this is one of our schedules in our work plan. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, - name="Construction Schedule A", work_plan=work_plan) - - # Add a root task to represent the design milestones, and major - # project phases. - ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Milestones", identification="A") - ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Design", identification="B") - construction = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") - """ - self.file = file - self.settings = { - "name": name, - "predefined_type": predefined_type, - "object_type": object_type, - "start_time": start_time or datetime.now(), - "work_plan": work_plan, - } - - def execute(self): - work_schedule = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class="IfcWorkSchedule", - predefined_type=self.settings["predefined_type"], - name=self.settings["name"], + ifc_class="IfcWorkSchedule", + predefined_type=settings["predefined_type"], + name=settings["name"], + ) + work_schedule.CreationDate = ifcopenshell.util.date.datetime2ifc(datetime.now(), "IfcDateTime") + user = ifcopenshell.api.owner.settings.get_user(file) + if user: + work_schedule.Creators = [user.ThePerson] + work_schedule.StartTime = ifcopenshell.util.date.datetime2ifc(settings["start_time"], "IfcDateTime") + if settings["object_type"]: + work_schedule.ObjectType = settings["object_type"] + if settings["work_plan"]: + ifcopenshell.api.run( + "aggregate.assign_object", + file, + **{ + "products": [work_schedule], + "relating_object": settings["work_plan"], + } ) - work_schedule.CreationDate = ifcopenshell.util.date.datetime2ifc( - datetime.now(), "IfcDateTime" + else: + # TODO: this is an ambiguity by buildingSMART + # See https://forums.buildingsmart.org/t/is-the-ifcworkschedule-project-declaration-mutually-exclusive-to-aggregation-within-a-relating-ifcworkplan/3510 + context = file.by_type("IfcContext")[0] + ifcopenshell.api.run( + "project.assign_declaration", + file, + definitions=[work_schedule], + relating_context=context, ) - user = ifcopenshell.api.owner.settings.get_user(self.file) - if user: - work_schedule.Creators = [user.ThePerson] - work_schedule.StartTime = ifcopenshell.util.date.datetime2ifc( - self.settings["start_time"], "IfcDateTime" - ) - if self.settings["object_type"]: - work_schedule.ObjectType = self.settings["object_type"] - if self.settings["work_plan"]: - ifcopenshell.api.run( - "aggregate.assign_object", - self.file, - **{ - "products": [work_schedule], - "relating_object": self.settings["work_plan"], - } - ) - else: - # TODO: this is an ambiguity by buildingSMART - # See https://forums.buildingsmart.org/t/is-the-ifcworkschedule-project-declaration-mutually-exclusive-to-aggregation-within-a-relating-ifcworkplan/3510 - context = self.file.by_type("IfcContext")[0] - ifcopenshell.api.run( - "project.assign_declaration", - self.file, - definitions=[work_schedule], - relating_context=context, - ) - return work_schedule + return work_schedule diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py index 0d75914949..86d4666ad9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py @@ -17,69 +17,66 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, work_calendar=None, time_type="WorkingTimes"): - """Add either working times or holiday times to a calendar +def add_work_time(file, work_calendar=None, time_type="WorkingTimes") -> None: + """Add either working times or holiday times to a calendar - A calendar defines when work occurs by defining working times and - holiday times. First, the working times are defined, then the holidays - may override the working times. For this reason, holidays are also known - as exception times. For example, you might define the working times as - every Monday to Friday, then define a few holidays in the year, such as - the 1st of January. If the 1st of January is on a weekday, it will - override the work time. + A calendar defines when work occurs by defining working times and + holiday times. First, the working times are defined, then the holidays + may override the working times. For this reason, holidays are also known + as exception times. For example, you might define the working times as + every Monday to Friday, then define a few holidays in the year, such as + the 1st of January. If the 1st of January is on a weekday, it will + override the work time. - :param work_calendar: The IfcWorkCalendar to add the work or holiday - time definition to. - :type work_calendar: ifcopenshell.entity_instance - :param time_type: Either WorkingTimes or ExceptionTimes, depending on - what you want to define. - :type time_type: str - :return: The newly created IfcWorkTime - :rtype: ifcopenshell.entity_instance + :param work_calendar: The IfcWorkCalendar to add the work or holiday + time definition to. + :type work_calendar: ifcopenshell.entity_instance + :param time_type: Either WorkingTimes or ExceptionTimes, depending on + what you want to define. + :type time_type: str + :return: The newly created IfcWorkTime + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) - # Let's start defining the times that we work during the week. - work_time = ifcopenshell.api.run("sequence.add_work_time", model, - work_calendar=calendar, time_type="WorkingTimes") + # Let's start defining the times that we work during the week. + work_time = ifcopenshell.api.run("sequence.add_work_time", model, + work_calendar=calendar, time_type="WorkingTimes") - # We create a weekly recurrence - pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, - parent=work_time, recurrence_type="WEEKLY") + # We create a weekly recurrence + pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, + parent=work_time, recurrence_type="WEEKLY") - # State that we work from weekdays 1 to 5 (i.e. Monday to Friday) - ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, - recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) + # State that we work from weekdays 1 to 5 (i.e. Monday to Friday) + ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, + recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) - # Let's set some holidays - holidays = ifcopenshell.api.run("sequence.add_work_time", model, - work_calendar=calendar, time_type="ExceptionTimes") + # Let's set some holidays + holidays = ifcopenshell.api.run("sequence.add_work_time", model, + work_calendar=calendar, time_type="ExceptionTimes") - # We create a yearly recurrence - pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, - parent=work_time, recurrence_type="YEARLY_BY_DAY_OF_MONTH") + # We create a yearly recurrence + pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, + parent=work_time, recurrence_type="YEARLY_BY_DAY_OF_MONTH") - # The holiday is every 1st of January - ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, - recurrence_pattern=pattern, attributes={"DayComponent": [1], "MonthComponent": [1]}) - """ - self.file = file - self.settings = {"work_calendar": work_calendar, "time_type": time_type} + # The holiday is every 1st of January + ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, + recurrence_pattern=pattern, attributes={"DayComponent": [1], "MonthComponent": [1]}) + """ + settings = {"work_calendar": work_calendar, "time_type": time_type} - def execute(self): - work_time = self.file.create_entity("IfcWorkTime") - if self.settings["time_type"] == "WorkingTimes": - working_times = list(self.settings["work_calendar"].WorkingTimes or []) - working_times.append(work_time) - self.settings["work_calendar"].WorkingTimes = working_times - elif self.settings["time_type"] == "ExceptionTimes": - exception_times = list(self.settings["work_calendar"].ExceptionTimes or []) - exception_times.append(work_time) - self.settings["work_calendar"].ExceptionTimes = exception_times - return work_time + work_time = file.create_entity("IfcWorkTime") + if settings["time_type"] == "WorkingTimes": + working_times = list(settings["work_calendar"].WorkingTimes or []) + working_times.append(work_time) + settings["work_calendar"].WorkingTimes = working_times + elif settings["time_type"] == "ExceptionTimes": + exception_times = list(settings["work_calendar"].ExceptionTimes or []) + exception_times.append(work_time) + settings["work_calendar"].ExceptionTimes = exception_times + return work_time diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py index 87f2882055..0ba89d0346 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py @@ -19,88 +19,78 @@ import ifcopenshell.util.date -class Usecase: - def __init__(self, file, rel_sequence=None, lag_value=None, duration_type="WORKTIME"): - """Assign a lag time to a sequence relationship between tasks +def assign_lag_time(file, rel_sequence=None, lag_value=None, duration_type="WORKTIME") -> None: + """Assign a lag time to a sequence relationship between tasks - A task sequence (e.g. finish to start) may optionally have a lag time - defined. This is a fundamental concept in construction scheduling. The - lag is defined as a duration, and the duration is typically either - calendar based (i.e. follows the working times and holidays of the - calendar) or elapsed time based (i.e. 24/7). + A task sequence (e.g. finish to start) may optionally have a lag time + defined. This is a fundamental concept in construction scheduling. The + lag is defined as a duration, and the duration is typically either + calendar based (i.e. follows the working times and holidays of the + calendar) or elapsed time based (i.e. 24/7). - A sequence may only have a single lag time defined. Negative lag times - are allowed. + A sequence may only have a single lag time defined. Negative lag times + are allowed. - :param rel_sequence: The IfcRelSequence to assign the lag time to. - :type rel_sequence: ifcopenshell.entity_instance - :param lag_value: An ISO standardised duration string. - :type lag_value: str - :param duration_type: Choose from WORKTIME for the associated - calendar-based lag times (this is the most common scenario and is - recommended as a default), or ELAPSEDTIME to not follow the - calendar. You may also choose NOTDEFINED but the behaviour of this - is unclear. - :type duration_type: str - :return: The newly created IfcLagTime - :rtype: ifcopenshell.entity_instance + :param rel_sequence: The IfcRelSequence to assign the lag time to. + :type rel_sequence: ifcopenshell.entity_instance + :param lag_value: An ISO standardised duration string. + :type lag_value: str + :param duration_type: Choose from WORKTIME for the associated + calendar-based lag times (this is the most common scenario and is + recommended as a default), or ELAPSEDTIME to not follow the + calendar. You may also choose NOTDEFINED but the behaviour of this + is unclear. + :type duration_type: str + :return: The newly created IfcLagTime + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's imagine a root construction task - construction = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") + # Let's imagine a root construction task + construction = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") - # Let's imagine we're doing a typically formwork, reinforcement, - # pour sequence. Let's start with the formwork. It'll take us 2 - # days. - formwork = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Formwork", identification="C.1") - time = ifcopenshell.api.run("sequence.add_task_time", model, task=formwork) - ifcopenshell.api.run("sequence.edit_task_time", model, - task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) + # Let's imagine we're doing a typically formwork, reinforcement, + # pour sequence. Let's start with the formwork. It'll take us 2 + # days. + formwork = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Formwork", identification="C.1") + time = ifcopenshell.api.run("sequence.add_task_time", model, task=formwork) + ifcopenshell.api.run("sequence.edit_task_time", model, + task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) - # Now let's do the reinforcement. It'll take us another 2 days. - reinforcement = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Reinforcement", identification="C.2") - time = ifcopenshell.api.run("sequence.add_task_time", model, task=reinforcement) - ifcopenshell.api.run("sequence.edit_task_time", model, - task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) + # Now let's do the reinforcement. It'll take us another 2 days. + reinforcement = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Reinforcement", identification="C.2") + time = ifcopenshell.api.run("sequence.add_task_time", model, task=reinforcement) + ifcopenshell.api.run("sequence.edit_task_time", model, + task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) - # Now let's say the formwork must finish before the reinforcement - # can start. This is a typical finish to start relationship (FS). - sequence = ifcopenshell.api.run("sequence.assign_sequence", model, - relating_process=formwork, related_process=reinforcement) + # Now let's say the formwork must finish before the reinforcement + # can start. This is a typical finish to start relationship (FS). + sequence = ifcopenshell.api.run("sequence.assign_sequence", model, + relating_process=formwork, related_process=reinforcement) - # Now typically there would be no lag time between formwork and - # reinforcement, but let's pretend that we had to allow 1 day gap - # for whatever reason. - ifcopenshell.api.run("sequence.assign_lag_time", model, rel_sequence=sequence, lag_value="P1D") - """ - self.file = file - self.settings = { - "rel_sequence": rel_sequence, - "lag_value": lag_value, - "duration_type": duration_type, - } + # Now typically there would be no lag time between formwork and + # reinforcement, but let's pretend that we had to allow 1 day gap + # for whatever reason. + ifcopenshell.api.run("sequence.assign_lag_time", model, rel_sequence=sequence, lag_value="P1D") + """ + settings = { + "rel_sequence": rel_sequence, + "lag_value": lag_value, + "duration_type": duration_type, + } - def execute(self): - lag_value = self.file.createIfcDuration( - ifcopenshell.util.date.datetime2ifc(self.settings["lag_value"], "IfcDuration") - ) - lag_time = self.file.create_entity( - "IfcLagTime", DurationType=self.settings["duration_type"], LagValue=lag_value - ) - if self.settings["rel_sequence"].is_a("IfcRelSequence"): - if ( - self.settings["rel_sequence"].TimeLag - and len(self.file.get_inverse(self.settings["rel_sequence"].TimeLag)) == 1 - ): - self.file.remove(self.settings["rel_sequence"].TimeLag) - self.settings["rel_sequence"].TimeLag = lag_time + lag_value = file.createIfcDuration(ifcopenshell.util.date.datetime2ifc(settings["lag_value"], "IfcDuration")) + lag_time = file.create_entity("IfcLagTime", DurationType=settings["duration_type"], LagValue=lag_value) + if settings["rel_sequence"].is_a("IfcRelSequence"): + if settings["rel_sequence"].TimeLag and len(file.get_inverse(settings["rel_sequence"].TimeLag)) == 1: + file.remove(settings["rel_sequence"].TimeLag) + settings["rel_sequence"].TimeLag = lag_time diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py index 5aa2210d42..12f8cfe78c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py @@ -20,109 +20,99 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, relating_process=None, related_object=None): - """Assigns an object to be related to a process, typically a construction task +def assign_process(file, relating_process=None, related_object=None) -> None: + """Assigns an object to be related to a process, typically a construction task - Processes work using the ICOM (Input, Controls, Outputs, Mechanisms) - paradigm in IFC. This process model is commonly used in modeling - manufacturing functions. + Processes work using the ICOM (Input, Controls, Outputs, Mechanisms) + paradigm in IFC. This process model is commonly used in modeling + manufacturing functions. - For example, processes (such as tasks) consume Inputs and transform them - into Outputs. The process may only occur within the limits of Controls - (e.g. cost items) and may require Mechanisms (ISO9000 calls them - Mechanisms, whereas IFC calls them resources, such as raw materials, - labour, or equipment). + For example, processes (such as tasks) consume Inputs and transform them + into Outputs. The process may only occur within the limits of Controls + (e.g. cost items) and may require Mechanisms (ISO9000 calls them + Mechanisms, whereas IFC calls them resources, such as raw materials, + labour, or equipment). - +----------+ - | Controls | - +----------+ - | - V - +--------+ +---------+ +---------+ - | Inputs | --> | Process | --> | Outputs | - +--------+ +---------+ +---------+ - ^ - | - +-----------+ - | Resources | - +-----------+ + +----------+ + | Controls | + +----------+ + | + V + +--------+ +---------+ +---------+ + | Inputs | --> | Process | --> | Outputs | + +--------+ +---------+ +---------+ + ^ + | + +-----------+ + | Resources | + +-----------+ - There are three main scenarios where an object may be related to a - task: defining inputs, controls, and resources of a process. + There are three main scenarios where an object may be related to a + task: defining inputs, controls, and resources of a process. - For inputs, a product (i.e. wall) may be defined as an input to a task, - such as when the task is to demolish the wall (i.e. the wall is an - input, and there is no output). + For inputs, a product (i.e. wall) may be defined as an input to a task, + such as when the task is to demolish the wall (i.e. the wall is an + input, and there is no output). - For controls, a cost item may be defined as a control to a task. + For controls, a cost item may be defined as a control to a task. - For resources, any construction resource may be assigned to a task. + For resources, any construction resource may be assigned to a task. - :param relating_process: The IfcProcess (typically IfcTask) that the - input, control, or resource is related to. - :type relating_process: ifcopenshell.entity_instance - :param related_object: The IfcProduct (for input), IfcCostItem (for - control) or IfcConstructionResource (for resource). - :type related_object: ifcopenshell.entity_instance - :return: The newly created IfcRelAssignsToProcess relationship - :rtype: ifcopenshell.entity_instance + :param relating_process: The IfcProcess (typically IfcTask) that the + input, control, or resource is related to. + :type relating_process: ifcopenshell.entity_instance + :param related_object: The IfcProduct (for input), IfcCostItem (for + control) or IfcConstructionResource (for resource). + :type related_object: ifcopenshell.entity_instance + :return: The newly created IfcRelAssignsToProcess relationship + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's create a construction task. Note that the predefined type is - # important to distinguish types of tasks. - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Demolish existing", identification="A", predefined_type="DEMOLITION") + # Let's create a construction task. Note that the predefined type is + # important to distinguish types of tasks. + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Demolish existing", identification="A", predefined_type="DEMOLITION") - # Let's say we have a wall somewhere. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Let's say we have a wall somewhere. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # Let's demolish that wall! - ifcopenshell.api.run("sequence.assign_process", model, relating_process=task, related_object=wall) - """ - self.file = file - self.settings = { - "relating_process": relating_process, - "related_object": related_object, - } + # Let's demolish that wall! + ifcopenshell.api.run("sequence.assign_process", model, relating_process=task, related_object=wall) + """ + settings = { + "relating_process": relating_process, + "related_object": related_object, + } - def execute(self): - if self.settings["related_object"].HasAssignments: - for assignment in self.settings["related_object"].HasAssignments: - if ( - assignment.is_a("IfcRelAssignsToProcess") - and assignment.RelatingProcess == self.settings["relating_process"] - ): - return + if settings["related_object"].HasAssignments: + for assignment in settings["related_object"].HasAssignments: + if assignment.is_a("IfcRelAssignsToProcess") and assignment.RelatingProcess == settings["relating_process"]: + return - operates_on = None - if self.settings["relating_process"].OperatesOn: - operates_on = self.settings["relating_process"].OperatesOn[0] + operates_on = None + if settings["relating_process"].OperatesOn: + operates_on = settings["relating_process"].OperatesOn[0] - if operates_on: - related_objects = list(operates_on.RelatedObjects) - related_objects.append(self.settings["related_object"]) - operates_on.RelatedObjects = related_objects - ifcopenshell.api.run( - "owner.update_owner_history", self.file, **{"element": operates_on} - ) - else: - operates_on = self.file.create_entity( - "IfcRelAssignsToProcess", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run( - "owner.create_owner_history", self.file - ), - "RelatedObjects": [self.settings["related_object"]], - "RelatingProcess": self.settings["relating_process"], - } - ) - return operates_on + if operates_on: + related_objects = list(operates_on.RelatedObjects) + related_objects.append(settings["related_object"]) + operates_on.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": operates_on}) + else: + operates_on = file.create_entity( + "IfcRelAssignsToProcess", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": [settings["related_object"]], + "RelatingProcess": settings["relating_process"], + } + ) + return operates_on diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py index 3431a71f19..bd9b90d2da 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py @@ -20,85 +20,75 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, relating_product=None, related_object=None): - """Assigns a product to be produced as a result of a process +def assign_product(file, relating_product=None, related_object=None) -> None: + """Assigns a product to be produced as a result of a process - A construction task may result in products (e.g. a wall) being - constructed. These task "Outputs" are defined in IFC through product - relationships. + A construction task may result in products (e.g. a wall) being + constructed. These task "Outputs" are defined in IFC through product + relationships. - Not all tasks have Outputs. For example, maintenance tasks will - typically not have any outputs. + Not all tasks have Outputs. For example, maintenance tasks will + typically not have any outputs. - See ifcopenshell.api.sequence.assign_process for Inputs and other types - of process relationships that can be described in manufacturing - process modeling. + See ifcopenshell.api.sequence.assign_process for Inputs and other types + of process relationships that can be described in manufacturing + process modeling. - :param relating_product: The IfcProduct that was constructed as a result - of the task. - :type relating_product: ifcopenshell.entity_instance - :param related_object: The IfcProcess (typically IfcTask) of the - construction task. - :type related_object: ifcopenshell.entity_instance - :return: The newly created IfcRelAssignsToProduct relationship - :rtype: ifcopenshell.entity_instance + :param relating_product: The IfcProduct that was constructed as a result + of the task. + :type relating_product: ifcopenshell.entity_instance + :param related_object: The IfcProcess (typically IfcTask) of the + construction task. + :type related_object: ifcopenshell.entity_instance + :return: The newly created IfcRelAssignsToProduct relationship + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's create a construction task. Note that the predefined type is - # important to distinguish types of tasks. - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Build wall", identification="A", predefined_type="CONSTRUCTION") + # Let's create a construction task. Note that the predefined type is + # important to distinguish types of tasks. + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Build wall", identification="A", predefined_type="CONSTRUCTION") - # Let's say we have a wall somewhere. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Let's say we have a wall somewhere. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # Let's construct that wall! - ifcopenshell.api.run("sequence.assign_product", model, relating_product=wall, related_object=task) - """ - self.file = file - self.settings = { - "relating_product": relating_product, - "related_object": related_object, - } + # Let's construct that wall! + ifcopenshell.api.run("sequence.assign_product", model, relating_product=wall, related_object=task) + """ + settings = { + "relating_product": relating_product, + "related_object": related_object, + } - def execute(self): - if self.settings["related_object"].HasAssignments: - for assignment in self.settings["related_object"].HasAssignments: - if ( - assignment.is_a("IfcRelAssignsToProduct") - and assignment.RelatingProduct == self.settings["relating_product"] - ): - return + if settings["related_object"].HasAssignments: + for assignment in settings["related_object"].HasAssignments: + if assignment.is_a("IfcRelAssignsToProduct") and assignment.RelatingProduct == settings["relating_product"]: + return - referenced_by = None - if self.settings["relating_product"].ReferencedBy: - referenced_by = self.settings["relating_product"].ReferencedBy[0] + referenced_by = None + if settings["relating_product"].ReferencedBy: + referenced_by = settings["relating_product"].ReferencedBy[0] - if referenced_by: - related_objects = list(referenced_by.RelatedObjects) - related_objects.append(self.settings["related_object"]) - referenced_by.RelatedObjects = related_objects - ifcopenshell.api.run( - "owner.update_owner_history", self.file, **{"element": referenced_by} - ) - else: - referenced_by = self.file.create_entity( - "IfcRelAssignsToProduct", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run( - "owner.create_owner_history", self.file - ), - "RelatedObjects": [self.settings["related_object"]], - "RelatingProduct": self.settings["relating_product"], - } - ) - return referenced_by + if referenced_by: + related_objects = list(referenced_by.RelatedObjects) + related_objects.append(settings["related_object"]) + referenced_by.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": referenced_by}) + else: + referenced_by = file.create_entity( + "IfcRelAssignsToProduct", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": [settings["related_object"]], + "RelatingProduct": settings["relating_product"], + } + ) + return referenced_by diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py index a3243f1057..177d90fb8d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py @@ -17,112 +17,101 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, parent=None, recurrence_type="WEEKLY"): - """Define a time to recur at a particular interval +def assign_recurrence_pattern(file, parent=None, recurrence_type="WEEKLY") -> None: + """Define a time to recur at a particular interval - There are two scenarios where you might want to define a recurring time - pattern. + There are two scenarios where you might want to define a recurring time + pattern. - You might want a task to be scheduled at a recurring interval, - this is common for maintenance tasks which need to be performed monthly, - every 6 months, every year, etc. + You might want a task to be scheduled at a recurring interval, + this is common for maintenance tasks which need to be performed monthly, + every 6 months, every year, etc. - Alternatively, you might be defining a work calendar, which defines - working days or holidays. The working days might be every week from - monday to friday ("every" week means it recurs every week), or the - holidays might be the same every year. + Alternatively, you might be defining a work calendar, which defines + working days or holidays. The working days might be every week from + monday to friday ("every" week means it recurs every week), or the + holidays might be the same every year. - The types of recurrence are: + The types of recurrence are: - - DAILY: every Nth (interval) day for up to X (Occurrences) occurrences. - e.g. Every day, every 2 days, every day up to 5 times, etc - - WEEKLY: every Nth (interval) MTWTFSS (WeekdayComponent) for up to X - (Occurrences) occurrences. e.g. Every Monday, every weekday, every - other saturday, etc - - MONTHLY_BY_DAY_OF_MONTH: every Nth (DayComponent) of every Xth - (Interval) Month up to Y (Occurrences) occurrences. e.g. Every 15th of - the Month. - - MONTHLY_BY_POSITION: Every Nth (Position) MTWTFSS (WeekdayComponent) - of every Xth (Interval) Month up to Y (Occurrences) occurrences. e.g. - Every second Tuesday of the Month. - - YEARLY_BY_DAY_OF_MONTH: every Nth (DayComponent) of every JFMAMJJASOND - (MonthComponent) month of every Yth (Interval) Year up to Z - (Occurrences) occurrences. e.g. every 25th of December. - - YEARLY_BY_POSITION: every Nth (Position) MTWTFSS (WeekdayComponent) of - every JFMAMJJASOND (MonthComponent) month of every Yth (Interval) - Year up to Z (Occurrences) occurrences. e.g. every third Wednesday - of January. + - DAILY: every Nth (interval) day for up to X (Occurrences) occurrences. + e.g. Every day, every 2 days, every day up to 5 times, etc + - WEEKLY: every Nth (interval) MTWTFSS (WeekdayComponent) for up to X + (Occurrences) occurrences. e.g. Every Monday, every weekday, every + other saturday, etc + - MONTHLY_BY_DAY_OF_MONTH: every Nth (DayComponent) of every Xth + (Interval) Month up to Y (Occurrences) occurrences. e.g. Every 15th of + the Month. + - MONTHLY_BY_POSITION: Every Nth (Position) MTWTFSS (WeekdayComponent) + of every Xth (Interval) Month up to Y (Occurrences) occurrences. e.g. + Every second Tuesday of the Month. + - YEARLY_BY_DAY_OF_MONTH: every Nth (DayComponent) of every JFMAMJJASOND + (MonthComponent) month of every Yth (Interval) Year up to Z + (Occurrences) occurrences. e.g. every 25th of December. + - YEARLY_BY_POSITION: every Nth (Position) MTWTFSS (WeekdayComponent) of + every JFMAMJJASOND (MonthComponent) month of every Yth (Interval) + Year up to Z (Occurrences) occurrences. e.g. every third Wednesday + of January. - These recurrence patterns are fairly standard in all calendar and - scheduling applications. + These recurrence patterns are fairly standard in all calendar and + scheduling applications. - :param parent: Either an IfcTaskTimeRecurring if you are defining a - recurring schedule for a task, or IfcWorkTime if you are defining a - recurring pattern for a workdays or holidays in a calendar. - :type parent: ifcopenshell.entity_instance - :param recurrence_type: One of the types of recurrences. - :type recurrence_type: str - :return: The newly created IfcRecurrencePattern - :rtype: ifcopenshell.entity_instance + :param parent: Either an IfcTaskTimeRecurring if you are defining a + recurring schedule for a task, or IfcWorkTime if you are defining a + recurring pattern for a workdays or holidays in a calendar. + :type parent: ifcopenshell.entity_instance + :param recurrence_type: One of the types of recurrences. + :type recurrence_type: str + :return: The newly created IfcRecurrencePattern + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) - # Let's start defining the times that we work during the week. - work_time = ifcopenshell.api.run("sequence.add_work_time", model, - work_calendar=calendar, time_type="WorkingTimes") + # Let's start defining the times that we work during the week. + work_time = ifcopenshell.api.run("sequence.add_work_time", model, + work_calendar=calendar, time_type="WorkingTimes") - # We create a weekly recurrence - pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, - parent=work_time, recurrence_type="WEEKLY") + # We create a weekly recurrence + pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, + parent=work_time, recurrence_type="WEEKLY") - # State that we work from weekdays 1 to 5 (i.e. Monday to Friday) - ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, - recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) + # State that we work from weekdays 1 to 5 (i.e. Monday to Friday) + ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, + recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) - # Let's imagine we are creating a maintenance schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Equipment Maintenance") + # Let's imagine we are creating a maintenance schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Equipment Maintenance") - # Now let's imagine we have a task to maintain the chillers - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Chiller maintenance") + # Now let's imagine we have a task to maintain the chillers + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Chiller maintenance") - # Because it is a maintenance task, we must schedule a recurring time - time = ifcopenshell.api.run("sequence.add_task_time", model, task=task, is_recurring=True) + # Because it is a maintenance task, we must schedule a recurring time + time = ifcopenshell.api.run("sequence.add_task_time", model, task=task, is_recurring=True) - # We create a monthly recurrence - pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, - parent=work_time, recurrence_type="MONTHLY_BY_DAY_OF_MONTH") + # We create a monthly recurrence + pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, + parent=work_time, recurrence_type="MONTHLY_BY_DAY_OF_MONTH") - # Specifically, the maintenance task must occur every 6 months - ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, - recurrence_pattern=pattern, attributes={"DayComponent": [1], "Interval": 6}) - """ - self.file = file - self.settings = {"parent": parent, "recurrence_type": recurrence_type} + # Specifically, the maintenance task must occur every 6 months + ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, + recurrence_pattern=pattern, attributes={"DayComponent": [1], "Interval": 6}) + """ + settings = {"parent": parent, "recurrence_type": recurrence_type} - def execute(self): - recurrence = self.file.createIfcRecurrencePattern( - self.settings["recurrence_type"] - ) + recurrence = file.createIfcRecurrencePattern(settings["recurrence_type"]) - if self.settings["parent"].is_a("IfcWorkTime"): - if ( - self.settings["parent"].RecurrencePattern - and len( - self.file.get_inverse(self.settings["parent"].RecurrencePattern) - ) - == 1 - ): - self.file.remove(self.settings["parent"].RecurrencePattern) - self.settings["parent"].RecurrencePattern = recurrence - elif self.settings["parent"].is_a("IfcTaskTimeRecurring"): - if len(self.file.get_inverse(self.settings["parent"].Recurrence)) == 1: - self.file.remove(self.settings["parent"].Recurrence) - self.settings["parent"].Recurrence = recurrence - return recurrence + if settings["parent"].is_a("IfcWorkTime"): + if settings["parent"].RecurrencePattern and len(file.get_inverse(settings["parent"].RecurrencePattern)) == 1: + file.remove(settings["parent"].RecurrencePattern) + settings["parent"].RecurrencePattern = recurrence + elif settings["parent"].is_a("IfcTaskTimeRecurring"): + if len(file.get_inverse(settings["parent"].Recurrence)) == 1: + file.remove(settings["parent"].Recurrence) + settings["parent"].Recurrence = recurrence + return recurrence diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py index e1c1100760..ed5103758c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py @@ -20,119 +20,111 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__( - self, - file, - relating_process=None, - related_process=None, - sequence_type="FINISH_START", - ): - """Assign a sequential relationship between tasks +def assign_sequence( + file, + relating_process=None, + related_process=None, + sequence_type="FINISH_START", +) -> None: + """Assign a sequential relationship between tasks - Tasks in construction sequencing typically have sequence relationships - between them, indicating that one task must happen after another. This - is used to automatically compute new start and end dates and cascade - changes when dates are changed. This is also used to calculate critical - paths and floats. + Tasks in construction sequencing typically have sequence relationships + between them, indicating that one task must happen after another. This + is used to automatically compute new start and end dates and cascade + changes when dates are changed. This is also used to calculate critical + paths and floats. - There are four types of sequence relationships, known as finish to - start, finish to finish, start to start, and start to finish, sometimes - abbreviated as a (FS, FF, SS, and SF). The most common is the finish to - start relationship, indicating that the previous task must finish before - the next task can start. + There are four types of sequence relationships, known as finish to + start, finish to finish, start to start, and start to finish, sometimes + abbreviated as a (FS, FF, SS, and SF). The most common is the finish to + start relationship, indicating that the previous task must finish before + the next task can start. - You must not create cyclical task sequences. This makes the computer - unhappy. + You must not create cyclical task sequences. This makes the computer + unhappy. - Note that "previous" or "next" does not necessarily mean the task - chronologically happens before or after. They simply indicate the order - of the sequence relationship. For this reason, they are often called - predecessor and successor tasks in the planning profession. + Note that "previous" or "next" does not necessarily mean the task + chronologically happens before or after. They simply indicate the order + of the sequence relationship. For this reason, they are often called + predecessor and successor tasks in the planning profession. - :param relating_process: The previous / predecessor task. - :type relating_process: ifcopenshell.entity_instance - :param related_process: The next / successor task. - :type related_process: ifcopenshell.entity_instance - :param sequence_type: Choose from FINISH_START, FINISH_FINISH, - START_START, or START_FINISH. - :return: The newly created IfcRelSequence - :rtype: ifcopenshell.entity_instance + :param relating_process: The previous / predecessor task. + :type relating_process: ifcopenshell.entity_instance + :param related_process: The next / successor task. + :type related_process: ifcopenshell.entity_instance + :param sequence_type: Choose from FINISH_START, FINISH_FINISH, + START_START, or START_FINISH. + :return: The newly created IfcRelSequence + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's imagine a root construction task - construction = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") + # Let's imagine a root construction task + construction = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") - # Let's imagine we're doing a typically formwork, reinforcement, - # pour sequence. Let's start with the formwork. It'll take us 2 - # days. - formwork = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Formwork", identification="C.1") - time = ifcopenshell.api.run("sequence.add_task_time", model, task=formwork) - ifcopenshell.api.run("sequence.edit_task_time", model, - task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) + # Let's imagine we're doing a typically formwork, reinforcement, + # pour sequence. Let's start with the formwork. It'll take us 2 + # days. + formwork = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Formwork", identification="C.1") + time = ifcopenshell.api.run("sequence.add_task_time", model, task=formwork) + ifcopenshell.api.run("sequence.edit_task_time", model, + task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) - # Now let's do the reinforcement. It'll take us another 2 days. - reinforcement = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Reinforcement", identification="C.2") - time = ifcopenshell.api.run("sequence.add_task_time", model, task=reinforcement) - ifcopenshell.api.run("sequence.edit_task_time", model, - task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) + # Now let's do the reinforcement. It'll take us another 2 days. + reinforcement = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Reinforcement", identification="C.2") + time = ifcopenshell.api.run("sequence.add_task_time", model, task=reinforcement) + ifcopenshell.api.run("sequence.edit_task_time", model, + task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) - # Now the pour itself. It'll only take 1 day. - pour = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Reinforcement", identification="C.3") - time = ifcopenshell.api.run("sequence.add_task_time", model, task=pour) - ifcopenshell.api.run("sequence.edit_task_time", model, - task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P1D"}) + # Now the pour it It'll only take 1 day. + pour = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Reinforcement", identification="C.3") + time = ifcopenshell.api.run("sequence.add_task_time", model, task=pour) + ifcopenshell.api.run("sequence.edit_task_time", model, + task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P1D"}) - # Now let's say the formwork must finish before the reinforcement - # can start, and the reinforcement must finish before the pour can - # start. This is a typical finish to start relationship (FS). - ifcopenshell.api.run("sequence.assign_sequence", model, - relating_process=formwork, related_process=reinforcement) - ifcopenshell.api.run("sequence.assign_sequence", model, - relating_process=reinforcement, related_process=pour) + # Now let's say the formwork must finish before the reinforcement + # can start, and the reinforcement must finish before the pour can + # start. This is a typical finish to start relationship (FS). + ifcopenshell.api.run("sequence.assign_sequence", model, + relating_process=formwork, related_process=reinforcement) + ifcopenshell.api.run("sequence.assign_sequence", model, + relating_process=reinforcement, related_process=pour) - # Notice how we set all the scheduled start dates arbitrarily at - # 2000-01-01. This is because we can ask IfcOpenShell to - # automatically cascade the dates, starting from any task. This will - # update the reinforcement date to be 2000-01-03 and the pour date - # to be 2000-01-05. - ifcopenshell.api.run("sequence.cascade_schedule", model, task=formwork) - """ - self.file = file - self.settings = { - "relating_process": relating_process, - "related_process": related_process, - "sequence_type": sequence_type, + # Notice how we set all the scheduled start dates arbitrarily at + # 2000-01-01. This is because we can ask IfcOpenShell to + # automatically cascade the dates, starting from any task. This will + # update the reinforcement date to be 2000-01-03 and the pour date + # to be 2000-01-05. + ifcopenshell.api.run("sequence.cascade_schedule", model, task=formwork) + """ + settings = { + "relating_process": relating_process, + "related_process": related_process, + "sequence_type": sequence_type, + } + + for rel in settings["related_process"].IsSuccessorFrom or []: + if rel.RelatingProcess == settings["relating_process"]: + return rel + rel = file.create_entity( + "IfcRelSequence", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatingProcess": settings["relating_process"], + "RelatedProcess": settings["related_process"], + "SequenceType": settings["sequence_type"], } - - def execute(self): - for rel in self.settings["related_process"].IsSuccessorFrom or []: - if rel.RelatingProcess == self.settings["relating_process"]: - return rel - rel = self.file.create_entity( - "IfcRelSequence", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run( - "owner.create_owner_history", self.file - ), - "RelatingProcess": self.settings["relating_process"], - "RelatedProcess": self.settings["related_process"], - "SequenceType": self.settings["sequence_type"], - } - ) - ifcopenshell.api.run( - "sequence.cascade_schedule", self.file, task=self.settings["relating_process"] - ) - return rel + ) + ifcopenshell.api.run("sequence.cascade_schedule", file, task=settings["relating_process"]) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py index a1eaed71be..634f2af494 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py @@ -20,52 +20,49 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, work_schedule=None, work_plan=None): - """Assigns a work schedule to a work plan +def assign_workplan(file, work_schedule=None, work_plan=None) -> None: + """Assigns a work schedule to a work plan - Typically, work schedules would be assigned to a work plan at creation. - However you may also delay this and do it manually afterwards. + Typically, work schedules would be assigned to a work plan at creation. + However you may also delay this and do it manually afterwards. - :param work_schedule: The IfcWorkSchedule that will be assigned to the - work plan. - :type work_schedule: ifcopenshell.entity_instance - :param work_plan: The IfcWorkPlan for the schedule to be assigned to. - :type work_plan: ifcopenshell.entity_instance - :return: The IfcRelAggregates relationship - :rtype: ifcopenshell.entity_instance + :param work_schedule: The IfcWorkSchedule that will be assigned to the + work plan. + :type work_schedule: ifcopenshell.entity_instance + :param work_plan: The IfcWorkPlan for the schedule to be assigned to. + :type work_plan: ifcopenshell.entity_instance + :return: The IfcRelAggregates relationship + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # This will hold all our construction schedules - work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") + # This will hold all our construction schedules + work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") - # Alternatively, if you create a schedule without a work plan ... - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Alternatively, if you create a schedule without a work plan ... + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # ... you can assign the work plan afterwards. - ifcopenshell.api.run("sequence.assign_workplan", work_schedule=schedule, work_plan=work_plan) - """ - self.file = file - self.settings = {"work_schedule": work_schedule, "work_plan": work_plan} + # ... you can assign the work plan afterwards. + ifcopenshell.api.run("sequence.assign_workplan", work_schedule=schedule, work_plan=work_plan) + """ + settings = {"work_schedule": work_schedule, "work_plan": work_plan} - def execute(self): - # TODO: this is an ambiguity by buildingSMART - # See https://forums.buildingsmart.org/t/is-the-ifcworkschedule-project-declaration-mutually-exclusive-to-aggregation-within-a-relating-ifcworkplan/3510 - ifcopenshell.api.run( - "project.unassign_declaration", - self.file, - definitions=[self.settings["work_schedule"]], - relating_context=self.file.by_type("IfcContext")[0], - ) - rel_aggregates = ifcopenshell.api.run( - "aggregate.assign_object", - self.file, - **{ - "products": [self.settings["work_schedule"]], - "relating_object": self.settings["work_plan"], - } - ) - return rel_aggregates + # TODO: this is an ambiguity by buildingSMART + # See https://forums.buildingsmart.org/t/is-the-ifcworkschedule-project-declaration-mutually-exclusive-to-aggregation-within-a-relating-ifcworkplan/3510 + ifcopenshell.api.run( + "project.unassign_declaration", + file, + definitions=[settings["work_schedule"]], + relating_context=file.by_type("IfcContext")[0], + ) + rel_aggregates = ifcopenshell.api.run( + "aggregate.assign_object", + file, + **{ + "products": [settings["work_schedule"]], + "relating_object": settings["work_plan"], + } + ) + return rel_aggregates diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py index 6698ab85a2..22c9ec7dda 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py @@ -22,68 +22,71 @@ import ifcopenshell.util.date import ifcopenshell.util.element +def calculate_task_duration(file, task=None) -> None: + """Calculates the task duration based on resource usage + + If a task has labour or equipment resources assigned to it, its duration + may be parametrically derived from the scheduled work of the resource. + For example, a labour resource with scheduled work of 10 working days + and a resource utilisation of 200% (i.e. two labour teams) will imply + that the task duration is 5 working days. + + If this data is not available, such as if the task has no resources, + then nothing happens. + + :param task: The IfcTask to calculate the duration for. + :type task: ifcopenshell.entity_instance + :return: None + :rtype: None + + Example: + + .. code:: python + + # Add our own crew + crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") + + # Add some labour to our crew. + labour = ifcopenshell.api.run("resource.add_resource", model, + parent_resource=crew, ifc_class="IfcLaborResource") + + # Labour resource is quantified in terms of time. + quantity = ifcopenshell.api.run("resource.add_resource_quantity", model, + resource=labour, ifc_class="IfcQuantityTime") + + # Store the unit time used in hours + ifcopenshell.api.run("resource.edit_resource_quantity", model, + physical_quantity=quantity, attributes={"TimeValue": 8.0}) + + # Let's imagine we've used the resource for 10 days with a + # utilisation of 200%. + time = ifcopenshell.api.run("resource.add_resource_time", model, resource=labour) + ifcopenshell.api.run("resource.edit_resource_time", model, + resource_time=time, attributes={"ScheduleWork": "PT80H", "ScheduleUsage": 2}) + + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + + # Let's create a construction task. Note that the predefined type is + # important to distinguish types of tasks. + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Foundations", identification="A") + + # Assign our resource to the task. + ifcopenshell.api.run("sequence.assign_process", model, relating_process=task, related_object=labour) + + # Now we can calculate the task duration based on the resource. This + # will set task.TaskTime.ScheduleDuration to be P5D. + ifcopenshell.api.run("sequence.calculate_task_duration", model, task=task) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"task": task} + return usecase.execute() + + class Usecase: - def __init__(self, file, task=None): - """Calculates the task duration based on resource usage - - If a task has labour or equipment resources assigned to it, its duration - may be parametrically derived from the scheduled work of the resource. - For example, a labour resource with scheduled work of 10 working days - and a resource utilisation of 200% (i.e. two labour teams) will imply - that the task duration is 5 working days. - - If this data is not available, such as if the task has no resources, - then nothing happens. - - :param task: The IfcTask to calculate the duration for. - :type task: ifcopenshell.entity_instance - :return: None - :rtype: None - - Example: - - .. code:: python - - # Add our own crew - crew = ifcopenshell.api.run("resource.add_resource", model, ifc_class="IfcCrewResource") - - # Add some labour to our crew. - labour = ifcopenshell.api.run("resource.add_resource", model, - parent_resource=crew, ifc_class="IfcLaborResource") - - # Labour resource is quantified in terms of time. - quantity = ifcopenshell.api.run("resource.add_resource_quantity", model, - resource=labour, ifc_class="IfcQuantityTime") - - # Store the unit time used in hours - ifcopenshell.api.run("resource.edit_resource_quantity", model, - physical_quantity=quantity, attributes={"TimeValue": 8.0}) - - # Let's imagine we've used the resource for 10 days with a - # utilisation of 200%. - time = ifcopenshell.api.run("resource.add_resource_time", model, resource=labour) - ifcopenshell.api.run("resource.edit_resource_time", model, - resource_time=time, attributes={"ScheduleWork": "PT80H", "ScheduleUsage": 2}) - - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - - # Let's create a construction task. Note that the predefined type is - # important to distinguish types of tasks. - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Foundations", identification="A") - - # Assign our resource to the task. - ifcopenshell.api.run("sequence.assign_process", model, relating_process=task, related_object=labour) - - # Now we can calculate the task duration based on the resource. This - # will set task.TaskTime.ScheduleDuration to be P5D. - ifcopenshell.api.run("sequence.calculate_task_duration", model, task=task) - """ - self.file = file - self.settings = {"task": task} - def execute(self): self.seconds_per_workday = self.calculate_seconds_per_workday() duration = self.calculate_max_resource_usage_duration() @@ -93,9 +96,7 @@ class Usecase: def calculate_seconds_per_workday(self): def get_work_schedule(task): for rel in task.HasAssignments or []: - if rel.is_a("IfcRelAssignsToControl") and rel.RelatingControl.is_a( - "IfcWorkSchedule" - ): + if rel.is_a("IfcRelAssignsToControl") and rel.RelatingControl.is_a("IfcWorkSchedule"): return rel.RelatingControl for rel in task.Nests or []: return get_work_schedule(rel.RelatingObject) @@ -111,9 +112,7 @@ class Usecase: or "WorkDayDuration" not in psets["Pset_WorkControlCommon"] ): return default_seconds_per_workday - work_day_duration = ifcopenshell.util.date.ifc2datetime( - psets["Pset_WorkControlCommon"]["WorkDayDuration"] - ) + work_day_duration = ifcopenshell.util.date.ifc2datetime(psets["Pset_WorkControlCommon"]["WorkDayDuration"]) return work_day_duration.seconds def calculate_max_resource_usage_duration(self): @@ -133,23 +132,15 @@ class Usecase: if not resource.Usage or not resource.Usage.ScheduleWork: return schedule_usage = resource.Usage.ScheduleUsage or 1 - schedule_duration = ifcopenshell.util.date.ifc2datetime( - resource.Usage.ScheduleWork - ) + schedule_duration = ifcopenshell.util.date.ifc2datetime(resource.Usage.ScheduleWork) if is_hourly_work(resource.Usage.ScheduleWork): - schedule_seconds = ( - schedule_duration.days * 24 * 60 * 60 - ) + schedule_duration.seconds + schedule_seconds = (schedule_duration.days * 24 * 60 * 60) + schedule_duration.seconds else: partial_days = schedule_duration.seconds / (24 * 60 * 60) - schedule_seconds = ( - schedule_duration.days + partial_days - ) * self.seconds_per_workday + schedule_seconds = (schedule_duration.days + partial_days) * self.seconds_per_workday return math.ceil((schedule_seconds / self.seconds_per_workday) / schedule_usage) def set_task_duration(self, duration): if not self.settings["task"].TaskTime: - ifcopenshell.api.run( - "sequence.add_task_time", self.file, task=self.settings["task"] - ) + ifcopenshell.api.run("sequence.add_task_time", self.file, task=self.settings["task"]) self.settings["task"].TaskTime.ScheduleDuration = f"P{duration}D" diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py index 2a720b9fa1..0a2aea7190 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py @@ -21,90 +21,93 @@ import ifcopenshell.util.date import ifcopenshell.util.sequence +def cascade_schedule(file, task=None) -> None: + """Cascades start and end dates of tasks based on durations + + Given a start task with a start date and duration, the end date, and the + start and end of all successor tasks with durations may be automatically + computed. + + Using this automatic computation is recommended is an alternative to + manually specifying dates. It is useful for doing edits and cascading + changes. + + Dates can only cascade from predecessor to successors, not backwards. + Cyclical relationships are invalid and will result in a recursion error + being raised. + + Note that there may be differences between how different planning + software calculate start and end dates. Some may consider Monday 5pm to + be equivalent to be Tuesday 8am, for instance. + + :param task: The start task to begin cascading from. + :type task: ifcopenshell.entity_instance + :return: None + :rtype: None + + Example: + + .. code:: python + + # Define a convenience function to add a task chained to a predecessor + def add_task(model, name, predecessor, work_schedule): + # Add a construction task + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=work_schedule, name=name, predefined_type="CONSTRUCTION") + + # Give it a time + task_time = ifcopenshell.api.run("sequence.add_task_time", model, task=task) + + # Arbitrarily set the task's scheduled time duration to be 1 week + ifcopenshell.api.run("sequence.edit_task_time", model, task_time=task_time, + attributes={"ScheduleStart": datetime.date(2000, 1, 1), "ScheduleDuration": "P1W"}) + + # If a predecessor exists, create a finish to start relationship + if predecessor: + ifcopenshell.api.run("sequence.assign_sequence", model, + relating_process=predecessor, related_process=task) + + return task + + # Open an existing IFC4 model you have of a building + model = ifcopenshell.open("/path/to/existing/model.ifc") + + # Create a new construction schedule + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction") + + # Let's imagine a starting task for site establishment. + task = add_task(model, "Site establishment", None, schedule) + start_task = task + + # Get all our storeys sorted by elevation ascending. + storeys = sorted(model.by_type("IfcBuildingStorey"), key=lambda s: get_storey_elevation(s)) + + # For each storey ... + for storey in storeys: + + # Add a construction task to construct that storey, using our convenience function + task = add_task(model, f"Construct {storey.Name}", task, schedule) + + # Assign all the products in that storey to the task as construction outputs. + for product in get_decomposition(storey): + ifcopenshell.api.run("sequence.assign_product", model, relating_product=product, related_object=task) + + # Ask the computer to calculate all the dates for us from the start task. + # For example, if the first task started on the 1st of January and took a + # week, the next task will start on the 8th of January. This saves us + # manually doing date calculations. + ifcopenshell.api.run("sequence.cascade_schedule", model, task=start_task) + + # Calculate the critical path and floats. + ifcopenshell.api.run("sequence.recalculate_schedule", model, work_schedule=schedule) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"task": task} + return usecase.execute() + + class Usecase: - def __init__(self, file, task=None): - """Cascades start and end dates of tasks based on durations - - Given a start task with a start date and duration, the end date, and the - start and end of all successor tasks with durations may be automatically - computed. - - Using this automatic computation is recommended is an alternative to - manually specifying dates. It is useful for doing edits and cascading - changes. - - Dates can only cascade from predecessor to successors, not backwards. - Cyclical relationships are invalid and will result in a recursion error - being raised. - - Note that there may be differences between how different planning - software calculate start and end dates. Some may consider Monday 5pm to - be equivalent to be Tuesday 8am, for instance. - - :param task: The start task to begin cascading from. - :type task: ifcopenshell.entity_instance - :return: None - :rtype: None - - Example: - - .. code:: python - - # Define a convenience function to add a task chained to a predecessor - def add_task(model, name, predecessor, work_schedule): - # Add a construction task - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=work_schedule, name=name, predefined_type="CONSTRUCTION") - - # Give it a time - task_time = ifcopenshell.api.run("sequence.add_task_time", model, task=task) - - # Arbitrarily set the task's scheduled time duration to be 1 week - ifcopenshell.api.run("sequence.edit_task_time", model, task_time=task_time, - attributes={"ScheduleStart": datetime.date(2000, 1, 1), "ScheduleDuration": "P1W"}) - - # If a predecessor exists, create a finish to start relationship - if predecessor: - ifcopenshell.api.run("sequence.assign_sequence", model, - relating_process=predecessor, related_process=task) - - return task - - # Open an existing IFC4 model you have of a building - model = ifcopenshell.open("/path/to/existing/model.ifc") - - # Create a new construction schedule - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction") - - # Let's imagine a starting task for site establishment. - task = add_task(model, "Site establishment", None, schedule) - start_task = task - - # Get all our storeys sorted by elevation ascending. - storeys = sorted(model.by_type("IfcBuildingStorey"), key=lambda s: get_storey_elevation(s)) - - # For each storey ... - for storey in storeys: - - # Add a construction task to construct that storey, using our convenience function - task = add_task(model, f"Construct {storey.Name}", task, schedule) - - # Assign all the products in that storey to the task as construction outputs. - for product in get_decomposition(storey): - ifcopenshell.api.run("sequence.assign_product", model, relating_product=product, related_object=task) - - # Ask the computer to calculate all the dates for us from the start task. - # For example, if the first task started on the 1st of January and took a - # week, the next task will start on the 8th of January. This saves us - # manually doing date calculations. - ifcopenshell.api.run("sequence.cascade_schedule", model, task=start_task) - - # Calculate the critical path and floats. - ifcopenshell.api.run("sequence.recalculate_schedule", model, work_schedule=schedule) - """ - self.file = file - self.settings = {"task": task} - def execute(self): self.calendar_cache = {} self.cascade_task(self.settings["task"], is_first_task=True) @@ -135,14 +138,10 @@ class Usecase: finishes = [] starts = [] - for rel in ifcopenshell.util.sequence.get_sequence_assignment( - task, "predecessor" - ): + for rel in ifcopenshell.util.sequence.get_sequence_assignment(task, "predecessor"): predecessor = rel.RelatingProcess predecessor_duration = ( - ifcopenshell.util.date.ifc2datetime( - predecessor.TaskTime.ScheduleDuration - ) + ifcopenshell.util.date.ifc2datetime(predecessor.TaskTime.ScheduleDuration) if predecessor.TaskTime and predecessor.TaskTime.ScheduleDuration else datetime.timedelta() ) @@ -154,14 +153,16 @@ class Usecase: duration_type = "WORKTIME" if rel.TimeLag: # updated to handle IfcRatioMeasure as a TimeLag value - days += self.get_lag_time_days(rel.TimeLag) if rel.TimeLag.LagValue.is_a("IfcDuration") else predecessor_duration.days * rel.TimeLag.LagValue.wrappedValue + days += ( + self.get_lag_time_days(rel.TimeLag) + if rel.TimeLag.LagValue.is_a("IfcDuration") + else predecessor_duration.days * rel.TimeLag.LagValue.wrappedValue + ) duration_type = rel.TimeLag.DurationType if days: starts.append( datetime.datetime.combine( - self.offset_date( - finish, days, duration_type, self.get_calendar(task) - ), + self.offset_date(finish, days, duration_type, self.get_calendar(task)), datetime.time(9), ) ) @@ -183,18 +184,14 @@ class Usecase: if not start: continue if rel.TimeLag: - days = self.get_lag_time_days(rel.TimeLag) if rel.TimeLag.LagValue.is_a("IfcDuration") else predecessor_duration.days * rel.TimeLag.LagValue.wrappedValue + days = ( + self.get_lag_time_days(rel.TimeLag) + if rel.TimeLag.LagValue.is_a("IfcDuration") + else predecessor_duration.days * rel.TimeLag.LagValue.wrappedValue + ) duration_type = rel.TimeLag.DurationType - starts.append( - self.offset_date( - start, days, duration_type, self.get_calendar(task) - ) - ) - starts.append( - self.offset_date( - start, days, duration_type, self.get_calendar(predecessor) - ) - ) + starts.append(self.offset_date(start, days, duration_type, self.get_calendar(task))) + starts.append(self.offset_date(start, days, duration_type, self.get_calendar(predecessor))) else: starts.append(start) elif rel.SequenceType == "FINISH_FINISH": @@ -202,18 +199,14 @@ class Usecase: if not finish: continue if rel.TimeLag: - days = self.get_lag_time_days(rel.TimeLag) if rel.TimeLag.LagValue.is_a("IfcDuration") else predecessor_duration.days * rel.TimeLag.LagValue.wrappedValue + days = ( + self.get_lag_time_days(rel.TimeLag) + if rel.TimeLag.LagValue.is_a("IfcDuration") + else predecessor_duration.days * rel.TimeLag.LagValue.wrappedValue + ) duration_type = rel.TimeLag.DurationType - finishes.append( - self.offset_date( - finish, days, duration_type, self.get_calendar(task) - ) - ) - finishes.append( - self.offset_date( - finish, days, duration_type, self.get_calendar(predecessor) - ) - ) + finishes.append(self.offset_date(finish, days, duration_type, self.get_calendar(task))) + finishes.append(self.offset_date(finish, days, duration_type, self.get_calendar(predecessor))) else: finishes.append(finish) elif rel.SequenceType == "START_FINISH": @@ -223,14 +216,16 @@ class Usecase: days = -1 duration_type = "WORKTIME" if rel.TimeLag: - days += self.get_lag_time_days(rel.TimeLag) if rel.TimeLag.LagValue.is_a("IfcDuration") else predecessor_duration.days * rel.TimeLag.LagValue.wrappedValue + days += ( + self.get_lag_time_days(rel.TimeLag) + if rel.TimeLag.LagValue.is_a("IfcDuration") + else predecessor_duration.days * rel.TimeLag.LagValue.wrappedValue + ) duration_type = rel.TimeLag.DurationType if days or rel.TimeLag: finishes.append( datetime.datetime.combine( - self.offset_date( - start, days, duration_type, self.get_calendar(task) - ), + self.offset_date(start, days, duration_type, self.get_calendar(task)), datetime.time(17), ) ) @@ -263,9 +258,7 @@ class Usecase: if task.TaskTime.ScheduleStart == start_ifc and not is_first_task: return task.TaskTime.ScheduleStart = start_ifc - task.TaskTime.ScheduleFinish = ifcopenshell.util.date.datetime2ifc( - potential_finish, "IfcDateTime" - ) + task.TaskTime.ScheduleFinish = ifcopenshell.util.date.datetime2ifc(potential_finish, "IfcDateTime") else: finish_ifc = ifcopenshell.util.date.datetime2ifc(finish, "IfcDateTime") if task.TaskTime.ScheduleFinish == finish_ifc and not is_first_task: @@ -328,15 +321,11 @@ class Usecase: def get_calendar(self, task): if task.id() not in self.calendar_cache: - self.calendar_cache[task.id()] = ifcopenshell.util.sequence.derive_calendar( - task - ) + self.calendar_cache[task.id()] = ifcopenshell.util.sequence.derive_calendar(task) return self.calendar_cache[task.id()] def offset_date(self, date, days, duration_type, calendar): - return ifcopenshell.util.sequence.offset_date( - date, datetime.timedelta(days=days), duration_type, calendar - ) + return ifcopenshell.util.sequence.offset_date(date, datetime.timedelta(days=days), duration_type, calendar) def get_task_time_attribute(self, task, attribute): if task.TaskTime: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py index c0ebe4f72f..a06fe8d722 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py @@ -21,38 +21,41 @@ import ifcopenshell.util.system import ifcopenshell.util.element +def create_baseline(file, work_schedule=None, name=None) -> None: + """Creates a baseline for your Work Schedule + + Using a IfcWorkSchdule having PredefinedType=PLANNED, + We can create a baseline for our work schedule. This IfcWorkSchedule will have PredefinedType=BASELINE + and the IfcWorkSchedule.CreationDate indicating the date of the baseline creation, and IfcWorkSchedule.Name indicating the name of the baseline. + + The following relationships are also baselined: + + * Same Tasks & attributes + * Same Task Relationships + * Same Construction Resources + * Same Resource Relationships + + :param work_schedule: The planned work_schedule to baseline + :type work_schedule: ifcopenshell.entity_instance + :return: The baseline work_schedule + :rtype: ifcopenshell.entity_instance + + Example: + .. code:: python + + # We have a Work Schedule + planned_work_schedule = WorkSchedule(name="Design new feature",predefinedType="PLANNED", deadline="2023-03-01") + + # And now we have a baseline for our Work Schedule + baseline_work_schedule = ifcopenshell.api.run("sequence.create_baseline",file, work_schedule= planned_work_schedule, name="Baseline 1") + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"work_schedule": work_schedule, "name": name} + return usecase.execute() + + class Usecase: - def __init__(self, file, work_schedule=None, name=None): - """Creates a baseline for your Work Schedule - - Using a IfcWorkSchdule having PredefinedType=PLANNED, - We can create a baseline for our work schedule. This IfcWorkSchedule will have PredefinedType=BASELINE - and the IfcWorkSchedule.CreationDate indicating the date of the baseline creation, and IfcWorkSchedule.Name indicating the name of the baseline. - - The following relationships are also baselined: - - * Same Tasks & attributes - * Same Task Relationships - * Same Construction Resources - * Same Resource Relationships - - :param work_schedule: The planned work_schedule to baseline - :type work_schedule: ifcopenshell.entity_instance - :return: The baseline work_schedule - :rtype: ifcopenshell.entity_instance - - Example: - .. code:: python - - # We have a Work Schedule - planned_work_schedule = WorkSchedule(name="Design new feature",predefinedType="PLANNED", deadline="2023-03-01") - - # And now we have a baseline for our Work Schedule - baseline_work_schedule = ifcopenshell.api.run("sequence.create_baseline",file, work_schedule= planned_work_schedule, name="Baseline 1") - """ - self.file = file - self.settings = {"work_schedule": work_schedule, "name": name} - def execute(self): result = self.create_baseline_work_schedule(self.settings["work_schedule"]) return result @@ -92,17 +95,13 @@ class Usecase: related_objects = list(referenced_by.RelatedObjects) related_objects.append(related_object) referenced_by.RelatedObjects = related_objects - ifcopenshell.api.run( - "owner.update_owner_history", self.file, **{"element": referenced_by} - ) + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": referenced_by}) else: referenced_by = self.file.create_entity( "IfcRelDefinesByObject", **{ "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run( - "owner.create_owner_history", self.file - ), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), "RelatedObjects": [related_object], "RelatingObject": relating_object, } diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py index 91d5ed1b99..14016794cd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py @@ -22,33 +22,36 @@ import ifcopenshell.util.element import ifcopenshell.util.sequence +def duplicate_task(file, task=None) -> None: + """Duplicates a task in the project + + The following relationships are also duplicated: + + * The copy will have the same attributes and property sets as the original task + * The copy will be assigned to the parent task or work schedule + * The copy will have duplicated nested tasks + + :param task: The task to be duplicated + :type task: ifcopenshell.entity_instance + :return: The duplicated task or the list of duplicated tasks if the latter has children + :rtype: ifcopenshell.entity_instance or list of ifcopenshell.entity_instance + + Example: + .. code:: python + + # We have a task + original_task = Task(name="Design new feature", deadline="2023-03-01") + + # And now we have two + duplicated_task = project.duplicate_task(original_task) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"task": task} + return usecase.execute() + + class Usecase: - def __init__(self, file, task=None): - """Duplicates a task in the project - - The following relationships are also duplicated: - - * The copy will have the same attributes and property sets as the original task - * The copy will be assigned to the parent task or work schedule - * The copy will have duplicated nested tasks - - :param task: The task to be duplicated - :type task: ifcopenshell.entity_instance - :return: The duplicated task or the list of duplicated tasks if the latter has children - :rtype: ifcopenshell.entity_instance or list of ifcopenshell.entity_instance - - Example: - .. code:: python - - # We have a task - original_task = Task(name="Design new feature", deadline="2023-03-01") - - # And now we have two - duplicated_task = project.duplicate_task(original_task) - """ - self.file = file - self.settings = {"task": task} - def execute(self): self.tracker = {"current": [], "duplicate": []} self.duplicate_task(self.settings["task"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py index f5779b058c..4b77daf9e8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py @@ -20,79 +20,68 @@ import ifcopenshell.api import ifcopenshell.util.date -class Usecase: - def __init__(self, file, lag_time=None, attributes=None): - """Edits the attributes of an IfcLagTime +def edit_lag_time(file, lag_time=None, attributes=None) -> None: + """Edits the attributes of an IfcLagTime - For more information about the attributes and data types of an - IfcLagTime, consult the IFC documentation. + For more information about the attributes and data types of an + IfcLagTime, consult the IFC documentation. - :param lag_time: The IfcLagTime entity you want to edit - :type lag_time: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param lag_time: The IfcLagTime entity you want to edit + :type lag_time: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's imagine a root construction task - construction = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") + # Let's imagine a root construction task + construction = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") - # Let's imagine we're doing a typically formwork, reinforcement, - # pour sequence. Let's start with the formwork. It'll take us 2 - # days. - formwork = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Formwork", identification="C.1") - time = ifcopenshell.api.run("sequence.add_task_time", model, task=formwork) - ifcopenshell.api.run("sequence.edit_task_time", model, - task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) + # Let's imagine we're doing a typically formwork, reinforcement, + # pour sequence. Let's start with the formwork. It'll take us 2 + # days. + formwork = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Formwork", identification="C.1") + time = ifcopenshell.api.run("sequence.add_task_time", model, task=formwork) + ifcopenshell.api.run("sequence.edit_task_time", model, + task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) - # Now let's do the reinforcement. It'll take us another 2 days. - reinforcement = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Reinforcement", identification="C.2") - time = ifcopenshell.api.run("sequence.add_task_time", model, task=reinforcement) - ifcopenshell.api.run("sequence.edit_task_time", model, - task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) + # Now let's do the reinforcement. It'll take us another 2 days. + reinforcement = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Reinforcement", identification="C.2") + time = ifcopenshell.api.run("sequence.add_task_time", model, task=reinforcement) + ifcopenshell.api.run("sequence.edit_task_time", model, + task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) - # Now let's say the formwork must finish before the reinforcement - # can start. This is a typical finish to start relationship (FS). - sequence = ifcopenshell.api.run("sequence.assign_sequence", model, - relating_process=formwork, related_process=reinforcement) + # Now let's say the formwork must finish before the reinforcement + # can start. This is a typical finish to start relationship (FS). + sequence = ifcopenshell.api.run("sequence.assign_sequence", model, + relating_process=formwork, related_process=reinforcement) - # Now typically there would be no lag time between formwork and - # reinforcement, but let's pretend that we had to allow 1 day gap - # for whatever reason. - lag = ifcopenshell.api.run("sequence.assign_lag_time", model, rel_sequence=sequence, lag_value="P1D") + # Now typically there would be no lag time between formwork and + # reinforcement, but let's pretend that we had to allow 1 day gap + # for whatever reason. + lag = ifcopenshell.api.run("sequence.assign_lag_time", model, rel_sequence=sequence, lag_value="P1D") - # Or, let's make it 2 days instead. - ifcopenshell.api.run("sequence.edit_lag_time", model, lag_time=lag, attributes={"LagValue": "P2D"}) - """ - self.file = file - self.settings = {"lag_time": lag_time, "attributes": attributes or {}} + # Or, let's make it 2 days instead. + ifcopenshell.api.run("sequence.edit_lag_time", model, lag_time=lag, attributes={"LagValue": "P2D"}) + """ + settings = {"lag_time": lag_time, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - if name == "LagValue" and value is not None: - if isinstance(value, float): - value = self.file.createIfcRatioMeasure(value) - else: - value = self.file.createIfcDuration( - ifcopenshell.util.date.datetime2ifc(value, "IfcDuration") - ) - setattr(self.settings["lag_time"], name, value) - for rel in [ - r - for r in self.file.get_inverse(self.settings["lag_time"]) - if r.is_a("IfcRelSequence") - ]: - ifcopenshell.api.run( - "sequence.cascade_schedule", self.file, task=rel.RelatedProcess - ) + for name, value in settings["attributes"].items(): + if name == "LagValue" and value is not None: + if isinstance(value, float): + value = file.createIfcRatioMeasure(value) + else: + value = file.createIfcDuration(ifcopenshell.util.date.datetime2ifc(value, "IfcDuration")) + setattr(settings["lag_time"], name, value) + for rel in [r for r in file.get_inverse(settings["lag_time"]) if r.is_a("IfcRelSequence")]: + ifcopenshell.api.run("sequence.cascade_schedule", file, task=rel.RelatedProcess) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py index 21292233ad..2863102b3d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py @@ -20,48 +20,45 @@ import ifcopenshell import ifcopenshell.util.sequence -class Usecase: - def __init__(self, file, recurrence_pattern=None, attributes=None): - """Edits the attributes of an IfcRecurrencePattern +def edit_recurrence_pattern(file, recurrence_pattern=None, attributes=None) -> None: + """Edits the attributes of an IfcRecurrencePattern - For more information about the attributes and data types of an - IfcRecurrencePattern, consult the IFC documentation. + For more information about the attributes and data types of an + IfcRecurrencePattern, consult the IFC documentation. - :param recurrence_pattern: The IfcRecurrencePattern entity you want to edit - :type recurrence_pattern: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param recurrence_pattern: The IfcRecurrencePattern entity you want to edit + :type recurrence_pattern: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) - # Let's start defining the times that we work during the week. - work_time = ifcopenshell.api.run("sequence.add_work_time", model, - work_calendar=calendar, time_type="WorkingTimes") + # Let's start defining the times that we work during the week. + work_time = ifcopenshell.api.run("sequence.add_work_time", model, + work_calendar=calendar, time_type="WorkingTimes") - # We create a weekly recurrence - pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, - parent=work_time, recurrence_type="WEEKLY") + # We create a weekly recurrence + pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, + parent=work_time, recurrence_type="WEEKLY") - # State that we work from weekdays 1 to 5 (i.e. Monday to Friday) - ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, - recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) - """ - self.file = file - self.settings = { - "recurrence_pattern": recurrence_pattern, - "attributes": attributes or {}, - } + # State that we work from weekdays 1 to 5 (i.e. Monday to Friday) + ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, + recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) + """ + settings = { + "recurrence_pattern": recurrence_pattern, + "attributes": attributes or {}, + } - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["recurrence_pattern"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["recurrence_pattern"], name, value) - ifcopenshell.util.sequence.is_working_day.cache_clear() - ifcopenshell.util.sequence.is_calendar_applicable.cache_clear() + ifcopenshell.util.sequence.is_working_day.cache_clear() + ifcopenshell.util.sequence.is_calendar_applicable.cache_clear() diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py index c563cb6990..bcbc521ef3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py @@ -20,55 +20,52 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, rel_sequence=None, attributes=None): - """Edits the attributes of an IfcRelSequence +def edit_sequence(file, rel_sequence=None, attributes=None) -> None: + """Edits the attributes of an IfcRelSequence - For more information about the attributes and data types of an - IfcRelSequence, consult the IFC documentation. + For more information about the attributes and data types of an + IfcRelSequence, consult the IFC documentation. - :param rel_sequence: The IfcRelSequence entity you want to edit - :type rel_sequence: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param rel_sequence: The IfcRelSequence entity you want to edit + :type rel_sequence: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's imagine a root construction task - construction = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") + # Let's imagine a root construction task + construction = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") - # Let's imagine we're building 2 zones, one after another. - zone1 = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Zone 1", identification="C.1") - zone2 = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Zone 2", identification="C.2") + # Let's imagine we're building 2 zones, one after another. + zone1 = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Zone 1", identification="C.1") + zone2 = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Zone 2", identification="C.2") - # Zone 1 finishes, then zone 2 starts. - sequence = ifcopenshell.api.run("sequence.assign_sequence", model, - relating_process=zone1, related_process=zone2) + # Zone 1 finishes, then zone 2 starts. + sequence = ifcopenshell.api.run("sequence.assign_sequence", model, + relating_process=zone1, related_process=zone2) - # What if they both started at the same time? - ifcopenshell.api.run("sequence.edit_sequence", model, - rel_sequence=sequence, attributes={"SequenceType": "START_START"}) - """ - self.file = file - self.settings = {"rel_sequence": rel_sequence, "attributes": attributes or {}} + # What if they both started at the same time? + ifcopenshell.api.run("sequence.edit_sequence", model, + rel_sequence=sequence, attributes={"SequenceType": "START_START"}) + """ + settings = {"rel_sequence": rel_sequence, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["rel_sequence"], name, value) - if "SequenceType" in self.settings["attributes"].keys(): - ifcopenshell.api.run( - "sequence.cascade_schedule", - self.file, - task=self.settings["rel_sequence"].RelatedProcess, - ) + for name, value in settings["attributes"].items(): + setattr(settings["rel_sequence"], name, value) + if "SequenceType" in settings["attributes"].keys(): + ifcopenshell.api.run( + "sequence.cascade_schedule", + file, + task=settings["rel_sequence"].RelatedProcess, + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py index cbdaa18de0..d151926a69 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py @@ -17,39 +17,36 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, task=None, attributes=None): - """Edits the attributes of an IfcTask +def edit_task(file, task=None, attributes=None) -> None: + """Edits the attributes of an IfcTask - For more information about the attributes and data types of an - IfcTask, consult the IFC documentation. + For more information about the attributes and data types of an + IfcTask, consult the IFC documentation. - :param task: The IfcTask entity you want to edit - :type task: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param task: The IfcTask entity you want to edit + :type task: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Add a root task to represent the design milestones, and major - # project phases. - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Milestones", identification="A") + # Add a root task to represent the design milestones, and major + # project phases. + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Milestones", identification="A") - # Change the identification - ifcopenshell.api.run("sequence.edit_task", model, task=task, attributes={"Identification": "M"}) - """ - self.file = file - self.settings = {"task": task, "attributes": attributes or {}} + # Change the identification + ifcopenshell.api.run("sequence.edit_task", model, task=task, attributes={"Identification": "M"}) + """ + settings = {"task": task, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["task"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["task"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py index 10bec7909c..f81b2b1f90 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py @@ -23,46 +23,48 @@ import ifcopenshell.util.sequence from typing import Any, Optional +def edit_task_time( + file: ifcopenshell.file, + task_time: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, +) -> None: + """Edits the attributes of an IfcTaskTime + + For more information about the attributes and data types of an + IfcTaskTime, consult the IFC documentation. + + :param task_time: The IfcTaskTime entity you want to edit + :type task_time: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None + + Example: + + .. code:: python + + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + + # Create a task to do formwork + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Formwork", identification="A") + + # Let's say it takes 2 days and starts on the 1st of January, 2000 + time = ifcopenshell.api.run("sequence.add_task_time", model, task=formwork) + ifcopenshell.api.run("sequence.edit_task_time", model, + task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"task_time": task_time, "attributes": attributes or {}} + return usecase.execute() + + class Usecase: - def __init__( - self, - file: ifcopenshell.file, - task_time: ifcopenshell.entity_instance, - attributes: Optional[dict[str, Any]] = None, - ): - """Edits the attributes of an IfcTaskTime - - For more information about the attributes and data types of an - IfcTaskTime, consult the IFC documentation. - - :param task_time: The IfcTaskTime entity you want to edit - :type task_time: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None - - Example: - - .. code:: python - - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - - # Create a task to do formwork - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Formwork", identification="A") - - # Let's say it takes 2 days and starts on the 1st of January, 2000 - time = ifcopenshell.api.run("sequence.add_task_time", model, task=formwork) - ifcopenshell.api.run("sequence.edit_task_time", model, - task_time=time, attributes={"ScheduleStart": "2000-01-01", "ScheduleDuration": "P2D"}) - """ - self.file = file - self.settings = {"task_time": task_time, "attributes": attributes or {}} - - def execute(self) -> None: + def execute(self): self.task = self.get_task() self.calendar = ifcopenshell.util.sequence.derive_calendar(self.task) @@ -73,17 +75,13 @@ class Usecase: ): del self.settings["attributes"]["ScheduleFinish"] - duration_type = self.settings["attributes"].get( - "DurationType", self.settings["task_time"].DurationType - ) + duration_type = self.settings["attributes"].get("DurationType", self.settings["task_time"].DurationType) finish = self.settings["attributes"].get("ScheduleFinish", None) if finish: if isinstance(finish, str): finish = datetime.datetime.fromisoformat(finish) self.settings["attributes"]["ScheduleFinish"] = datetime.datetime.combine( - ifcopenshell.util.sequence.get_soonest_working_day( - finish, duration_type, self.calendar - ), + ifcopenshell.util.sequence.get_soonest_working_day(finish, duration_type, self.calendar), datetime.time(17), ) start = self.settings["attributes"].get("ScheduleStart", None) @@ -91,9 +89,7 @@ class Usecase: if isinstance(start, str): start = datetime.datetime.fromisoformat(start) self.settings["attributes"]["ScheduleStart"] = datetime.datetime.combine( - ifcopenshell.util.sequence.get_soonest_working_day( - start, duration_type, self.calendar - ), + ifcopenshell.util.sequence.get_soonest_working_day(start, duration_type, self.calendar), datetime.time(9), ) @@ -101,11 +97,7 @@ class Usecase: if value is not None: if "Start" in name or "Finish" in name or name == "StatusTime": value = ifcopenshell.util.date.datetime2ifc(value, "IfcDateTime") - elif ( - name == "ScheduleDuration" - or name == "ActualDuration" - or name == "RemainingTime" - ): + elif name == "ScheduleDuration" or name == "ActualDuration" or name == "RemainingTime": value = ifcopenshell.util.date.datetime2ifc(value, "IfcDuration") setattr(self.settings["task_time"], name, value) @@ -115,15 +107,9 @@ class Usecase: and self.settings["task_time"].ScheduleStart ): self.calculate_finish() - elif ( - self.settings["attributes"].get("ScheduleStart", None) - and self.settings["task_time"].ScheduleDuration - ): + elif self.settings["attributes"].get("ScheduleStart", None) and self.settings["task_time"].ScheduleDuration: self.calculate_finish() - elif ( - self.settings["attributes"].get("ScheduleFinish", None) - and self.settings["task_time"].ScheduleStart - ): + elif self.settings["attributes"].get("ScheduleFinish", None) and self.settings["task_time"].ScheduleStart: self.calculate_duration() if self.settings["task_time"].ScheduleDuration and ( @@ -137,57 +123,36 @@ class Usecase: def calculate_finish(self): finish = ifcopenshell.util.sequence.get_start_or_finish_date( - ifcopenshell.util.date.ifc2datetime( - self.settings["task_time"].ScheduleStart - ), - ifcopenshell.util.date.ifc2datetime( - self.settings["task_time"].ScheduleDuration - ), + ifcopenshell.util.date.ifc2datetime(self.settings["task_time"].ScheduleStart), + ifcopenshell.util.date.ifc2datetime(self.settings["task_time"].ScheduleDuration), self.settings["task_time"].DurationType, self.calendar, date_type="FINISH", ) - self.settings["task_time"].ScheduleFinish = ifcopenshell.util.date.datetime2ifc( - finish, "IfcDateTime" - ) + self.settings["task_time"].ScheduleFinish = ifcopenshell.util.date.datetime2ifc(finish, "IfcDateTime") def calculate_duration(self): - start = ifcopenshell.util.date.ifc2datetime( - self.settings["task_time"].ScheduleStart - ) - finish = ifcopenshell.util.date.ifc2datetime( - self.settings["task_time"].ScheduleFinish - ) + start = ifcopenshell.util.date.ifc2datetime(self.settings["task_time"].ScheduleStart) + finish = ifcopenshell.util.date.ifc2datetime(self.settings["task_time"].ScheduleFinish) current_date = datetime.date(start.year, start.month, start.day) finish_date = datetime.date(finish.year, finish.month, finish.day) duration = datetime.timedelta(days=1) while current_date < finish_date: - if ( - self.settings["task_time"].DurationType == "ELAPSEDTIME" - or not self.calendar - ): + if self.settings["task_time"].DurationType == "ELAPSEDTIME" or not self.calendar: duration += datetime.timedelta(days=1) elif ifcopenshell.util.sequence.is_working_day(current_date, self.calendar): duration += datetime.timedelta(days=1) current_date += datetime.timedelta(days=1) - self.settings[ - "task_time" - ].ScheduleDuration = ifcopenshell.util.date.datetime2ifc( - duration, "IfcDuration" - ) + self.settings["task_time"].ScheduleDuration = ifcopenshell.util.date.datetime2ifc(duration, "IfcDuration") def get_task(self) -> ifcopenshell.entity_instance: - return next( - e - for e in self.file.get_inverse(self.settings["task_time"]) - if e.is_a("IfcTask") - ) + return next(e for e in self.file.get_inverse(self.settings["task_time"]) if e.is_a("IfcTask")) def handle_resource_calculation(self): resources = ifcopenshell.util.sequence.get_task_resources(self.task, is_deep=False) for resource in resources: if ifcopenshell.util.constraint.is_attribute_locked(resource, "Usage.ScheduleWork"): ifcopenshell.api.run("resource.calculate_resource_usage", self.file, resource=resource) - #TODO: If the duration changes, this implies the productivity rate must change to accomModate the new Schedule Work to be calculated. + # TODO: If the duration changes, this implies the productivity rate must change to accomModate the new Schedule Work to be calculated. # elif ifcopenshell.util.constraint.is_attribute_locked(resource, "Usage.ScheduleUsage"): # ifcopenshell.api.run("resource.calculate_resource_work", self.file, resource=resource) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py index 12ce1e15d1..4efb35da84 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py @@ -17,34 +17,31 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, work_calendar=None, attributes=None): - """Edits the attributes of an IfcWorkCalendar +def edit_work_calendar(file, work_calendar=None, attributes=None) -> None: + """Edits the attributes of an IfcWorkCalendar - For more information about the attributes and data types of an - IfcWorkCalendar, consult the IFC documentation. + For more information about the attributes and data types of an + IfcWorkCalendar, consult the IFC documentation. - :param work_calendar: The IfcWorkCalendar entity you want to edit - :type work_calendar: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param work_calendar: The IfcWorkCalendar entity you want to edit + :type work_calendar: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model, name="5 Day Week") + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model, name="5 Day Week") - # Let's give it a description - ifcopenshell.api.run("sequence.edit_work_calendar", model, - work_calendar=calendar, attributes={"Description": "Monday to Friday 8 hour days"}) - """ - self.file = file - self.settings = {"work_calendar": work_calendar, "attributes": attributes or {}} + # Let's give it a description + ifcopenshell.api.run("sequence.edit_work_calendar", model, + work_calendar=calendar, attributes={"Description": "Monday to Friday 8 hour days"}) + """ + settings = {"work_calendar": work_calendar, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["work_calendar"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["work_calendar"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py index 669ef0193c..e2bbcae33f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py @@ -19,39 +19,36 @@ import ifcopenshell.util.date -class Usecase: - def __init__(self, file, work_plan=None, attributes=None): - """Edits the attributes of an IfcWorkPlan +def edit_work_plan(file, work_plan=None, attributes=None) -> None: + """Edits the attributes of an IfcWorkPlan - For more information about the attributes and data types of an - IfcWorkPlan, consult the IFC documentation. + For more information about the attributes and data types of an + IfcWorkPlan, consult the IFC documentation. - :param work_plan: The IfcWorkPlan entity you want to edit - :type work_plan: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param work_plan: The IfcWorkPlan entity you want to edit + :type work_plan: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # This will hold all our construction schedules - work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") + # This will hold all our construction schedules + work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") - # Let's give it a description - ifcopenshell.api.run("sequence.edit_work_plan", model, - work_plan=work_plan, attributes={"Description": "Construction of phase 1"}) - """ - self.file = file - self.settings = {"work_plan": work_plan, "attributes": attributes or {}} + # Let's give it a description + ifcopenshell.api.run("sequence.edit_work_plan", model, + work_plan=work_plan, attributes={"Description": "Construction of phase 1"}) + """ + settings = {"work_plan": work_plan, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - if value: - if "Date" in name or "Time" in name: - value = ifcopenshell.util.date.datetime2ifc(value, "IfcDateTime") - elif name == "Duration" or name == "TotalFloat": - value = ifcopenshell.util.date.datetime2ifc(value, "IfcDuration") - setattr(self.settings["work_plan"], name, value) + for name, value in settings["attributes"].items(): + if value: + if "Date" in name or "Time" in name: + value = ifcopenshell.util.date.datetime2ifc(value, "IfcDateTime") + elif name == "Duration" or name == "TotalFloat": + value = ifcopenshell.util.date.datetime2ifc(value, "IfcDuration") + setattr(settings["work_plan"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py index cd7ca163b2..49e6b053ac 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py @@ -19,43 +19,40 @@ import ifcopenshell.util.date -class Usecase: - def __init__(self, file, work_schedule=None, attributes=None): - """Edits the attributes of an IfcWorkSchedule +def edit_work_schedule(file, work_schedule=None, attributes=None) -> None: + """Edits the attributes of an IfcWorkSchedule - For more information about the attributes and data types of an - IfcWorkSchedule, consult the IFC documentation. + For more information about the attributes and data types of an + IfcWorkSchedule, consult the IFC documentation. - :param work_schedule: The IfcWorkSchedule entity you want to edit - :type work_schedule: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param work_schedule: The IfcWorkSchedule entity you want to edit + :type work_schedule: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # This will hold all our construction schedules - work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") + # This will hold all our construction schedules + work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") - # Let's imagine this is one of our schedules in our work plan. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, - name="Construction Schedule A", work_plan=work_plan) + # Let's imagine this is one of our schedules in our work plan. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, + name="Construction Schedule A", work_plan=work_plan) - # Let's give it a description - ifcopenshell.api.run("sequence.edit_work_schedule", model, - work_schedule=work_schedule, attributes={"Description": "3 crane design option"}) - """ - self.file = file - self.settings = {"work_schedule": work_schedule, "attributes": attributes or {}} + # Let's give it a description + ifcopenshell.api.run("sequence.edit_work_schedule", model, + work_schedule=work_schedule, attributes={"Description": "3 crane design option"}) + """ + settings = {"work_schedule": work_schedule, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - if value: - if "Date" in name or "Time" in name: - value = ifcopenshell.util.date.datetime2ifc(value, "IfcDateTime") - elif name == "Duration" or name == "TotalFloat": - value = ifcopenshell.util.date.datetime2ifc(value, "IfcDuration") - setattr(self.settings["work_schedule"], name, value) + for name, value in settings["attributes"].items(): + if value: + if "Date" in name or "Time" in name: + value = ifcopenshell.util.date.datetime2ifc(value, "IfcDateTime") + elif name == "Duration" or name == "TotalFloat": + value = ifcopenshell.util.date.datetime2ifc(value, "IfcDuration") + setattr(settings["work_schedule"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py index d62c3a5357..ac0a05dad0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py @@ -20,54 +20,50 @@ import ifcopenshell.util.date from typing import Any, Optional -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - work_time: ifcopenshell.entity_instance, - attributes: Optional[dict[str, Any]] = None, - ): - """Edits the attributes of an IfcWorkTime +def edit_work_time( + file: ifcopenshell.file, + work_time: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, +) -> None: + """Edits the attributes of an IfcWorkTime - For more information about the attributes and data types of an - IfcWorkTime, consult the IFC documentation. + For more information about the attributes and data types of an + IfcWorkTime, consult the IFC documentation. - :param work_time: The IfcWorkTime entity you want to edit - :type work_time: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param work_time: The IfcWorkTime entity you want to edit + :type work_time: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) - # Let's start defining the times that we work during the week. - work_time = ifcopenshell.api.run("sequence.add_work_time", model, - work_calendar=calendar, time_type="WorkingTimes") + # Let's start defining the times that we work during the week. + work_time = ifcopenshell.api.run("sequence.add_work_time", model, + work_calendar=calendar, time_type="WorkingTimes") - # If we don't specify any recurring time periods in our work time, - # we need to specify a start and end date of the work time. It - # starts at 0:00 on the start date and 24:00 at the end date. - ifcopenshell.api.run("sequence.edit_work_time", model, - work_time=work_time, attributes={"StartDate": "2000-01-01", "FinishDate": "2000-01-02"}) - """ - self.file = file - self.settings = {"work_time": work_time, "attributes": attributes or {}} + # If we don't specify any recurring time periods in our work time, + # we need to specify a start and end date of the work time. It + # starts at 0:00 on the start date and 24:00 at the end date. + ifcopenshell.api.run("sequence.edit_work_time", model, + work_time=work_time, attributes={"StartDate": "2000-01-01", "FinishDate": "2000-01-02"}) + """ + settings = {"work_time": work_time, "attributes": attributes or {}} - def execute(self) -> None: - for name, value in self.settings["attributes"].items(): - if name in ("Start", "StartDate"): - value = ifcopenshell.util.date.datetime2ifc(value, "IfcDate") - # 4 IfcWorktime Start - self.settings["work_time"][4] = value - elif name in ("Finish", "FinishDate"): - value = ifcopenshell.util.date.datetime2ifc(value, "IfcDate") - # 5 IfcWorktime Finish - self.settings["work_time"][5] = value - else: - setattr(self.settings["work_time"], name, value) + for name, value in settings["attributes"].items(): + if name in ("Start", "StartDate"): + value = ifcopenshell.util.date.datetime2ifc(value, "IfcDate") + # 4 IfcWorktime Start + settings["work_time"][4] = value + elif name in ("Finish", "FinishDate"): + value = ifcopenshell.util.date.datetime2ifc(value, "IfcDate") + # 5 IfcWorktime Finish + settings["work_time"][5] = value + else: + setattr(settings["work_time"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py index eb8af300d1..df402c31ed 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py @@ -19,61 +19,58 @@ import ifcopenshell -class Usecase: - def __init__(self, file, relating_product=None, related_object=None): - """Gets the related products being output by a task +def get_related_products(file, relating_product=None, related_object=None) -> None: + """Gets the related products being output by a task - This API function will be removed in the future and migrated to a - utility module. + This API function will be removed in the future and migrated to a + utility module. - :param relating_product: One of the products already output by the task. - :type relating_product: ifcopenshell.entity_instance - :param related_object: The IfcTask that you want to get all the related - products for. - :type related_object: ifcopenshell.entity_instance - :return: A set of IfcProducts output by the IfcTask. - :rtype: set[ifcopenshell.entity_instance] + :param relating_product: One of the products already output by the task. + :type relating_product: ifcopenshell.entity_instance + :param related_object: The IfcTask that you want to get all the related + products for. + :type related_object: ifcopenshell.entity_instance + :return: A set of IfcProducts output by the IfcTask. + :rtype: set[ifcopenshell.entity_instance] - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's create a construction task. Note that the predefined type is - # important to distinguish types of tasks. - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Build wall", identification="A", predefined_type="CONSTRUCTION") + # Let's create a construction task. Note that the predefined type is + # important to distinguish types of tasks. + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Build wall", identification="A", predefined_type="CONSTRUCTION") - # Let's say we have a wall somewhere. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Let's say we have a wall somewhere. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # Let's construct that wall! - ifcopenshell.api.run("sequence.assign_product", relating_product=wall, related_object=task) + # Let's construct that wall! + ifcopenshell.api.run("sequence.assign_product", relating_product=wall, related_object=task) - # This will give us a set with that wall in it. - products = ifcopenshell.api.run("sequence.get_related_products", model, related_object=task) - """ - self.file = file - self.settings = { - "relating_product": relating_product, - "related_object": related_object, - } + # This will give us a set with that wall in it. + products = ifcopenshell.api.run("sequence.get_related_products", model, related_object=task) + """ + settings = { + "relating_product": relating_product, + "related_object": related_object, + } - def execute(self): - products = set() - related_object = None - if self.settings["related_object"]: - related_object = self.settings["related_object"] - elif self.settings["relating_product"]: - for reference in self.settings["relating_product"].ReferencedBy: - if reference.is_a("IfcRelAssignsToProduct"): - related_object = reference.RelatedObjects[0] - if related_object: - assignments = self.settings["related_object"].HasAssignments - for assignment in assignments: - if assignment.is_a("IfcRelAssignsToProduct"): - products.add(assignment.RelatingProduct.id()) - return products + products = set() + related_object = None + if settings["related_object"]: + related_object = settings["related_object"] + elif settings["relating_product"]: + for reference in settings["relating_product"].ReferencedBy: + if reference.is_a("IfcRelAssignsToProduct"): + related_object = reference.RelatedObjects[0] + if related_object: + assignments = settings["related_object"].HasAssignments + for assignment in assignments: + if assignment.is_a("IfcRelAssignsToProduct"): + products.add(assignment.RelatingProduct.id()) + return products diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py index da07337f7b..d54bf01579 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py @@ -23,35 +23,38 @@ import ifcopenshell.util.date import ifcopenshell.util.sequence +def recalculate_schedule(file, work_schedule=None) -> None: + """Calculate the critical path and floats for a work schedule + + This implements critical path analysis, using the forward pass and + backward pass method. When run, any tasks that have no float will be + marked as critical, and both the total and free floats will be + populated for all task times. + + Cyclical relationships are detected and will result in a recursion + error. + + :param work_schedule: The IfcWorkSchedule to perform the calculation on. + :type work_schedule: ifcopenshell.entity_instance + :return: None + :rtype: None + + Example: + + .. code:: python + + # See the example for ifcopenshell.api.sequence.cascade_schedule for + # details of how to set up a basic set of tasks and calculate the + # critical path. Typically cascade_schedule is run prior to ensure + # that dates are correct. + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"work_schedule": work_schedule} + return usecase.execute() + + class Usecase: - def __init__(self, file, work_schedule=None): - """Calculate the critical path and floats for a work schedule - - This implements critical path analysis, using the forward pass and - backward pass method. When run, any tasks that have no float will be - marked as critical, and both the total and free floats will be - populated for all task times. - - Cyclical relationships are detected and will result in a recursion - error. - - :param work_schedule: The IfcWorkSchedule to perform the calculation on. - :type work_schedule: ifcopenshell.entity_instance - :return: None - :rtype: None - - Example: - - .. code:: python - - # See the example for ifcopenshell.api.sequence.cascade_schedule for - # details of how to set up a basic set of tasks and calculate the - # critical path. Typically cascade_schedule is run prior to ensure - # that dates are correct. - """ - self.file = file - self.settings = {"work_schedule": work_schedule} - def execute(self): # The method implemented is the same as shown here: # https://www.youtube.com/watch?v=qTErIV6OqLg @@ -84,9 +87,7 @@ class Usecase: break # We have an infinite loop due to a cyclic graph if is_cyclic: - raise RecursionError( - "Task graph is cyclic and so critical path method cannot be performed." - ) + raise RecursionError("Task graph is cyclic and so critical path method cannot be performed.") return self.pending_nodes = set(self.g.nodes) @@ -112,9 +113,7 @@ class Usecase: self.g = nx.DiGraph() self.edges = [] self.g.add_node("start", duration=0, duration_type="ELAPSEDTIME", calendar=None) - self.g.add_node( - "finish", duration=0, duration_type="ELAPSEDTIME", calendar=None - ) + self.g.add_node("finish", duration=0, duration_type="ELAPSEDTIME", calendar=None) for rel in self.settings["work_schedule"].Controls: for related_object in rel.RelatedObjects: if not related_object.is_a("IfcTask"): @@ -129,9 +128,7 @@ class Usecase: return if task.TaskTime and task.TaskTime.ScheduleDuration: - duration = ifcopenshell.util.date.ifc2datetime( - task.TaskTime.ScheduleDuration - ).days + duration = ifcopenshell.util.date.ifc2datetime(task.TaskTime.ScheduleDuration).days duration_type = task.TaskTime.DurationType else: duration = 0 @@ -150,11 +147,11 @@ class Usecase: rel.RelatingProcess.id(), task.id(), { - "lag_time": 0 - if not rel.TimeLag - else ifcopenshell.util.date.ifc2datetime( - rel.TimeLag.LagValue.wrappedValue - ).days, + "lag_time": ( + 0 + if not rel.TimeLag + else ifcopenshell.util.date.ifc2datetime(rel.TimeLag.LagValue.wrappedValue).days + ), "type": self.sequence_type_map[rel.SequenceType], }, ) @@ -162,16 +159,20 @@ class Usecase: ] ) - predecessor_types = [rel.SequenceType for rel in ifcopenshell.util.sequence.get_sequence_assignment(task, "predecessor")] - successor_types = [rel.SequenceType for rel in ifcopenshell.util.sequence.get_sequence_assignment(task, "successor")] + predecessor_types = [ + rel.SequenceType for rel in ifcopenshell.util.sequence.get_sequence_assignment(task, "predecessor") + ] + successor_types = [ + rel.SequenceType for rel in ifcopenshell.util.sequence.get_sequence_assignment(task, "successor") + ] if not predecessor_types: self.edges.append(("start", task.id(), {"lag_time": 0, "type": "FS"})) if task.TaskTime and task.TaskTime.ScheduleStart: - self.start_dates.append( - ifcopenshell.util.date.ifc2datetime(task.TaskTime.ScheduleStart) - ) - self.g.nodes[task.id()]["early_start"] = ifcopenshell.util.date.ifc2datetime(task.TaskTime.ScheduleStart) # we assume this task is constrained to start on this date + self.start_dates.append(ifcopenshell.util.date.ifc2datetime(task.TaskTime.ScheduleStart)) + self.g.nodes[task.id()]["early_start"] = ifcopenshell.util.date.ifc2datetime( + task.TaskTime.ScheduleStart + ) # we assume this task is constrained to start on this date if not successor_types: self.edges.append((task.id(), "finish", {"lag_time": 0, "type": "FF"})) @@ -188,25 +189,13 @@ class Usecase: self.file, task_time=task.TaskTime, attributes={ - "FreeFloat": ifcopenshell.util.date.datetime2ifc( - data["free_float"], "IfcDuration" - ), - "TotalFloat": ifcopenshell.util.date.datetime2ifc( - data["total_float"], "IfcDuration" - ), + "FreeFloat": ifcopenshell.util.date.datetime2ifc(data["free_float"], "IfcDuration"), + "TotalFloat": ifcopenshell.util.date.datetime2ifc(data["total_float"], "IfcDuration"), "IsCritical": data["total_float"].days == 0, - "EarlyStart": ifcopenshell.util.date.datetime2ifc( - data["early_start"], "IfcDateTime" - ), - "EarlyFinish": ifcopenshell.util.date.datetime2ifc( - data["early_finish"], "IfcDateTime" - ), - "LateStart": ifcopenshell.util.date.datetime2ifc( - data["late_start"], "IfcDateTime" - ), - "LateFinish": ifcopenshell.util.date.datetime2ifc( - data["late_finish"], "IfcDateTime" - ), + "EarlyStart": ifcopenshell.util.date.datetime2ifc(data["early_start"], "IfcDateTime"), + "EarlyFinish": ifcopenshell.util.date.datetime2ifc(data["early_finish"], "IfcDateTime"), + "LateStart": ifcopenshell.util.date.datetime2ifc(data["late_start"], "IfcDateTime"), + "LateFinish": ifcopenshell.util.date.datetime2ifc(data["late_finish"], "IfcDateTime"), }, ) @@ -246,11 +235,7 @@ class Usecase: if edge["lag_time"]: days += edge["lag_time"] if days: - starts.append( - datetime.datetime.combine( - self.offset_date(finish, days, data), datetime.time(9) - ) - ) + starts.append(datetime.datetime.combine(self.offset_date(finish, days, data), datetime.time(9))) starts.append( datetime.datetime.combine( self.offset_date(finish, days, predecessor_data), @@ -265,9 +250,7 @@ class Usecase: return if edge["lag_time"]: starts.append(self.offset_date(start, edge["lag_time"], data)) - starts.append( - self.offset_date(start, edge["lag_time"], predecessor_data) - ) + starts.append(self.offset_date(start, edge["lag_time"], predecessor_data)) else: starts.append(start) elif edge["type"] == "FF": @@ -275,12 +258,8 @@ class Usecase: if finish is None: return if edge["lag_time"]: - finishes.append( - self.offset_date(finish, edge["lag_time"], data) - ) - finishes.append( - self.offset_date(finish, edge["lag_time"], predecessor_data) - ) + finishes.append(self.offset_date(finish, edge["lag_time"], data)) + finishes.append(self.offset_date(finish, edge["lag_time"], predecessor_data)) else: finishes.append(finish) elif edge["type"] == "SF": @@ -292,9 +271,7 @@ class Usecase: days += edge["lag_time"] if days or edge["lag_time"]: finishes.append( - datetime.datetime.combine( - self.offset_date(start, days, data), datetime.time(17) - ) + datetime.datetime.combine(self.offset_date(start, days, data), datetime.time(17)) ) finishes.append( datetime.datetime.combine( @@ -317,9 +294,7 @@ class Usecase: if potential_finish > data["early_finish"]: data["early_finish"] = potential_finish else: - data[ - "early_start" - ] = ifcopenshell.util.sequence.get_start_or_finish_date( + data["early_start"] = ifcopenshell.util.sequence.get_start_or_finish_date( data["early_finish"], datetime.timedelta(days=data["duration"]), data["duration_type"], @@ -375,9 +350,7 @@ class Usecase: days += edge["lag_time"] if days or edge["lag_time"]: finishes.append( - datetime.datetime.combine( - self.offset_date(start, -days, data), datetime.time(17) - ) + datetime.datetime.combine(self.offset_date(start, -days, data), datetime.time(17)) ) finishes.append( datetime.datetime.combine( @@ -402,9 +375,7 @@ class Usecase: return if edge["lag_time"]: starts.append(self.offset_date(start, -edge["lag_time"], data)) - starts.append( - self.offset_date(start, -edge["lag_time"], successor_data) - ) + starts.append(self.offset_date(start, -edge["lag_time"], successor_data)) else: starts.append(start) free_floats.append( @@ -421,12 +392,8 @@ class Usecase: if finish is None: return if edge["lag_time"]: - finishes.append( - self.offset_date(finish, -edge["lag_time"], data) - ) - finishes.append( - self.offset_date(finish, -edge["lag_time"], successor_data) - ) + finishes.append(self.offset_date(finish, -edge["lag_time"], data)) + finishes.append(self.offset_date(finish, -edge["lag_time"], successor_data)) else: finishes.append(finish) free_floats.append( @@ -447,9 +414,7 @@ class Usecase: days += edge["lag_time"] if days: starts.append( - datetime.datetime.combine( - self.offset_date(finish, -days, data), datetime.time(9) - ) + datetime.datetime.combine(self.offset_date(finish, -days, data), datetime.time(9)) ) starts.append( datetime.datetime.combine( @@ -471,13 +436,8 @@ class Usecase: if starts and finishes: data["late_start"] = min(starts) data["late_finish"] = min(finishes) - if ( - self.offset_date(data["late_start"], data["duration"], data) - < data["late_finish"] - ): - data[ - "late_finish" - ] = ifcopenshell.util.sequence.get_start_or_finish_date( + if self.offset_date(data["late_start"], data["duration"], data) < data["late_finish"]: + data["late_finish"] = ifcopenshell.util.sequence.get_start_or_finish_date( data["late_start"], datetime.timedelta(days=data["duration"]), data["duration_type"], @@ -485,9 +445,7 @@ class Usecase: date_type="FINISH", ) else: - data[ - "late_start" - ] = ifcopenshell.util.sequence.get_start_or_finish_date( + data["late_start"] = ifcopenshell.util.sequence.get_start_or_finish_date( data["late_finish"], datetime.timedelta(days=data["duration"]), data["duration_type"], @@ -528,9 +486,7 @@ class Usecase: data["total_float"] = data["late_finish"] - data["early_finish"] # If the float is within the span of a single day, it may show as a 8 hours if data["total_float"].seconds == 60 * 60 * 8: - data["total_float"] = datetime.timedelta( - days=data["total_float"].days + 1 - ) + data["total_float"] = datetime.timedelta(days=data["total_float"].days + 1) data["free_float"] = min(free_floats) if free_floats else None # If the float is within the span of a single day, it may show as a 8 hours diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py index 6b7fac4f75..d49da8324e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py @@ -21,124 +21,121 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, task=None): - """Removes a task +def remove_task(file, task=None) -> None: + """Removes a task - All subtasks are also removed recursively. Any relationships such as - sequences or controls are also removed. + All subtasks are also removed recursively. Any relationships such as + sequences or controls are also removed. - :param task: The IfcTask to remove. - :type task: ifcopenshell.entity_instance - :return: None - :rtype: None + :param task: The IfcTask to remove. + :type task: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Add a root task to represent the design milestones, and major - # project phases. - ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Milestones", identification="A") - design = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Design", identification="B") - ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") + # Add a root task to represent the design milestones, and major + # project phases. + ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Milestones", identification="A") + design = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Design", identification="B") + ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") - # Ah, let's delete the design section, who needs it anyway we'll - # just fix it on site. - ifcopenshell.api.run("sequence.remove_task", model, task=design) - """ - self.file = file - self.settings = {"task": task} + # Ah, let's delete the design section, who needs it anyway we'll + # just fix it on site. + ifcopenshell.api.run("sequence.remove_task", model, task=design) + """ + settings = {"task": task} - def execute(self): - # TODO: do a deep purge - ifcopenshell.api.run( - "project.unassign_declaration", - self.file, - definitions=[self.settings["task"]], - relating_context=self.file.by_type("IfcContext")[0], - ) - if self.settings["task"].TaskTime: - self.file.remove(self.settings["task"].TaskTime) - for inverse in self.file.get_inverse(self.settings["task"]): - if inverse.is_a("IfcRelSequence"): + # TODO: do a deep purge + ifcopenshell.api.run( + "project.unassign_declaration", + file, + definitions=[settings["task"]], + relating_context=file.by_type("IfcContext")[0], + ) + if settings["task"].TaskTime: + file.remove(settings["task"].TaskTime) + for inverse in file.get_inverse(settings["task"]): + if inverse.is_a("IfcRelSequence"): + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelNests"): + if inverse.RelatingObject == settings["task"]: + for related_object in inverse.RelatedObjects: + ifcopenshell.api.run("sequence.remove_task", file, task=related_object) + elif not inverse.RelatedObjects: history = inverse.OwnerHistory - self.file.remove(inverse) + file.remove(inverse) if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelNests"): - if inverse.RelatingObject == self.settings["task"]: - for related_object in inverse.RelatedObjects: - ifcopenshell.api.run("sequence.remove_task", self.file, task=related_object) - elif not inverse.RelatedObjects: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif self.settings["task"] in inverse.RelatedObjects: - related_objects = list(inverse.RelatedObjects) - related_objects.remove(self.settings["task"]) - if not related_objects: - self.file.remove(inverse) - else: - inverse.RelatedObjects = related_objects - elif inverse.is_a("IfcRelAssignsToControl"): - if inverse.RelatingControl == self.settings["task"] or len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + ifcopenshell.util.element.remove_deep2(file, history) + elif settings["task"] in inverse.RelatedObjects: + related_objects = list(inverse.RelatedObjects) + related_objects.remove(settings["task"]) + if not related_objects: + file.remove(inverse) else: - related_objects = list(inverse.RelatedObjects) - related_objects.remove(self.settings["task"]) inverse.RelatedObjects = related_objects - elif inverse.is_a("IfcRelDefinesByProperties"): - ifcopenshell.api.run( - "pset.remove_pset", - self.file, - product=self.settings["task"], - pset=inverse.RelatingPropertyDefinition, - ) - elif inverse.is_a("IfcRelAssignsToProcess"): - if inverse.RelatingProcess == self.settings["task"] or len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif inverse.is_a("IfcRelAssignsToProduct"): - if inverse.RelatingProduct == self.settings["task"] or len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - else: - related_objects = list(inverse.RelatedObjects) - related_objects.remove(self.settings["task"]) - inverse.RelatedObjects = related_objects - elif inverse.is_a("IfcRelAssignsToObject"): - if inverse.RelatingObject == self.settings["task"] or len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - else: - related_objects = list(inverse.RelatedObjects) - related_objects.remove(self.settings["task"]) - inverse.RelatedObjects = related_objects - elif inverse.is_a("IfcRelAssignsToProcess"): + elif inverse.is_a("IfcRelAssignsToControl"): + if inverse.RelatingControl == settings["task"] or len(inverse.RelatedObjects) == 1: history = inverse.OwnerHistory - self.file.remove(inverse) + file.remove(inverse) if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + ifcopenshell.util.element.remove_deep2(file, history) + else: + related_objects = list(inverse.RelatedObjects) + related_objects.remove(settings["task"]) + inverse.RelatedObjects = related_objects + elif inverse.is_a("IfcRelDefinesByProperties"): + ifcopenshell.api.run( + "pset.remove_pset", + file, + product=settings["task"], + pset=inverse.RelatingPropertyDefinition, + ) + elif inverse.is_a("IfcRelAssignsToProcess"): + if inverse.RelatingProcess == settings["task"] or len(inverse.RelatedObjects) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelAssignsToProduct"): + if inverse.RelatingProduct == settings["task"] or len(inverse.RelatedObjects) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + else: + related_objects = list(inverse.RelatedObjects) + related_objects.remove(settings["task"]) + inverse.RelatedObjects = related_objects + elif inverse.is_a("IfcRelAssignsToObject"): + if inverse.RelatingObject == settings["task"] or len(inverse.RelatedObjects) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + else: + related_objects = list(inverse.RelatedObjects) + related_objects.remove(settings["task"]) + inverse.RelatedObjects = related_objects + elif inverse.is_a("IfcRelAssignsToProcess"): + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) - history = self.settings["task"].OwnerHistory - self.file.remove(self.settings["task"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + history = settings["task"].OwnerHistory + file.remove(settings["task"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py index 32effdf4ac..672606c421 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py @@ -19,45 +19,42 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, time_period=None): - """Removes a time period +def remove_time_period(file, time_period=None) -> None: + """Removes a time period - :param time_period: The IfcTimePeriod to remove. - :type time_period: ifcopenshell.entity_instance - :return: None - :rtype: None + :param time_period: The IfcTimePeriod to remove. + :type time_period: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) - # Let's start defining the times that we work during the week. - work_time = ifcopenshell.api.run("sequence.add_work_time", model, - work_calendar=calendar, time_type="WorkingTimes") + # Let's start defining the times that we work during the week. + work_time = ifcopenshell.api.run("sequence.add_work_time", model, + work_calendar=calendar, time_type="WorkingTimes") - # We create a weekly recurrence - pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, - parent=work_time, recurrence_type="WEEKLY") + # We create a weekly recurrence + pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, + parent=work_time, recurrence_type="WEEKLY") - # State that we work from weekdays 1 to 5 (i.e. Monday to Friday) - ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, - recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) + # State that we work from weekdays 1 to 5 (i.e. Monday to Friday) + ifcopenshell.api.run("sequence.edit_recurrence_pattern", model, + recurrence_pattern=pattern, attributes={"WeekdayComponent": [1, 2, 3, 4, 5]}) - # The morning work session, lunch, then the afternoon work session. - morning = ifcopenshell.api.run("sequence.add_time_period", model, - recurrence_pattern=pattern, start_time="09:00", end_time="12:00") - afternoon = ifcopenshell.api.run("sequence.add_time_period", model, - recurrence_pattern=pattern, start_time="13:00", end_time="17:00") + # The morning work session, lunch, then the afternoon work session. + morning = ifcopenshell.api.run("sequence.add_time_period", model, + recurrence_pattern=pattern, start_time="09:00", end_time="12:00") + afternoon = ifcopenshell.api.run("sequence.add_time_period", model, + recurrence_pattern=pattern, start_time="13:00", end_time="17:00") - # Let's take the afternoon off! - ifcopenshell.api.run("sequence.remove_time_period", model, time_period=afternoon) - """ - self.file = file - self.settings = {"time_period": time_period} + # Let's take the afternoon off! + ifcopenshell.api.run("sequence.remove_time_period", model, time_period=afternoon) + """ + settings = {"time_period": time_period} - def execute(self): - self.file.remove(self.settings["time_period"]) + file.remove(settings["time_period"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py index e233bef26d..22a362c42d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py @@ -20,49 +20,46 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, work_calendar=None): - """Removes a work calendar +def remove_work_calendar(file, work_calendar=None) -> None: + """Removes a work calendar - All relationships are also removed, such as if a task is set to use that - calendar. + All relationships are also removed, such as if a task is set to use that + calendar. - :param work_calendar: The IfcWorkCalendar to remove - :type work_calendar: ifcopenshell.entity_instance - :return: None - :rtype: None + :param work_calendar: The IfcWorkCalendar to remove + :type work_calendar: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model, name="5 Day Week") + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model, name="5 Day Week") - # And remove it immediately - ifcopenshell.api.run("sequence.remove_work_calendar", model, work_calendar=calendar) - """ - self.file = file - self.settings = {"work_calendar": work_calendar} + # And remove it immediately + ifcopenshell.api.run("sequence.remove_work_calendar", model, work_calendar=calendar) + """ + settings = {"work_calendar": work_calendar} - def execute(self): - # TODO: do a deep purge - ifcopenshell.api.run( - "project.unassign_declaration", - self.file, - definitions=[self.settings["work_calendar"]], - relating_context=self.file.by_type("IfcContext")[0], - ) - if self.settings["work_calendar"].Controls: - for rel in self.settings["work_calendar"].Controls: - for related_object in rel.RelatedObjects: - ifcopenshell.api.run( - "control.unassign_control", - self.file, - relating_control=self.settings["work_calendar"], - related_object=related_object, - ) - history = self.settings["work_calendar"].OwnerHistory - self.file.remove(self.settings["work_calendar"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + # TODO: do a deep purge + ifcopenshell.api.run( + "project.unassign_declaration", + file, + definitions=[settings["work_calendar"]], + relating_context=file.by_type("IfcContext")[0], + ) + if settings["work_calendar"].Controls: + for rel in settings["work_calendar"].Controls: + for related_object in rel.RelatedObjects: + ifcopenshell.api.run( + "control.unassign_control", + file, + relating_control=settings["work_calendar"], + related_object=related_object, + ) + history = settings["work_calendar"].OwnerHistory + file.remove(settings["work_calendar"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py index bbd631829d..28675fe6a5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py @@ -20,40 +20,37 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, work_plan=None): - """Removes a work plan +def remove_work_plan(file, work_plan=None) -> None: + """Removes a work plan - Note that schedules that are grouped under the work plan are not - removed. + Note that schedules that are grouped under the work plan are not + removed. - :param work_plan: The IfcWorkPlan to remove. - :type work_plan: ifcopenshell.entity_instance - :return: None - :rtype: None + :param work_plan: The IfcWorkPlan to remove. + :type work_plan: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # This will hold all our construction schedules - work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") + # This will hold all our construction schedules + work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") - # And remove it immediately - ifcopenshell.api.run("sequence.remove_work_plan", model, work_plan=work_plan) - """ - self.file = file - self.settings = {"work_plan": work_plan} + # And remove it immediately + ifcopenshell.api.run("sequence.remove_work_plan", model, work_plan=work_plan) + """ + settings = {"work_plan": work_plan} - def execute(self): - # TODO: do a deep purge - ifcopenshell.api.run( - "project.unassign_declaration", - self.file, - definitions=[self.settings["work_plan"]], - relating_context=self.file.by_type("IfcContext")[0], - ) - history = self.settings["work_plan"].OwnerHistory - self.file.remove(self.settings["work_plan"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + # TODO: do a deep purge + ifcopenshell.api.run( + "project.unassign_declaration", + file, + definitions=[settings["work_plan"]], + relating_context=file.by_type("IfcContext")[0], + ) + history = settings["work_plan"].OwnerHistory + file.remove(settings["work_plan"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py index 66b69c8804..ec06a9146b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py @@ -21,69 +21,66 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, work_schedule=None): - """Removes a work schedule +def remove_work_schedule(file, work_schedule=None) -> None: + """Removes a work schedule - All tasks in the work schedule are also removed recursively. + All tasks in the work schedule are also removed recursively. - :param work_schedule: The IfcWorkSchedule to remove. - :type work_schedule: ifcopenshell.entity_instance - :return: None - :rtype: None + :param work_schedule: The IfcWorkSchedule to remove. + :type work_schedule: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # This will hold all our construction schedules - work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") + # This will hold all our construction schedules + work_plan = ifcopenshell.api.run("sequence.add_work_plan", model, name="Construction") - # Let's imagine this is one of our schedules in our work plan. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, - name="Construction Schedule A", work_plan=work_plan) + # Let's imagine this is one of our schedules in our work plan. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, + name="Construction Schedule A", work_plan=work_plan) - # And remove it immediately - ifcopenshell.api.run("sequence.remove_work_schedule", model, work_schedule=schedule) - """ - self.file = file - self.settings = {"work_schedule": work_schedule} + # And remove it immediately + ifcopenshell.api.run("sequence.remove_work_schedule", model, work_schedule=schedule) + """ + settings = {"work_schedule": work_schedule} - def execute(self): - # TODO: do a deep purge - ifcopenshell.api.run( - "project.unassign_declaration", - self.file, - definitions=[self.settings["work_schedule"]], - relating_context=self.file.by_type("IfcContext")[0], - ) - if self.settings["work_schedule"].Declares: - for rel in self.settings["work_schedule"].Declares: - for work_schedule in rel.RelatedObjects: - ifcopenshell.api.run( - "sequence.remove_work_schedule", - self.file, - work_schedule=work_schedule, - ) - for inverse in self.file.get_inverse(self.settings["work_schedule"]): - if inverse.is_a("IfcRelDefinesByObject"): - if inverse.RelatingObject == self.settings["work_schedule"] or len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - else: - related_objects = list(inverse.RelatedObjects) - related_objects.remove(self.settings["work_schedule"]) - inverse.RelatedObjects = related_objects - elif inverse.is_a("IfcRelAssignsToControl"): - [ - ifcopenshell.api.run("sequence.remove_task", self.file, task=related_object) - for related_object in inverse.RelatedObjects - if related_object.is_a("IfcTask") - ] + # TODO: do a deep purge + ifcopenshell.api.run( + "project.unassign_declaration", + file, + definitions=[settings["work_schedule"]], + relating_context=file.by_type("IfcContext")[0], + ) + if settings["work_schedule"].Declares: + for rel in settings["work_schedule"].Declares: + for work_schedule in rel.RelatedObjects: + ifcopenshell.api.run( + "sequence.remove_work_schedule", + file, + work_schedule=work_schedule, + ) + for inverse in file.get_inverse(settings["work_schedule"]): + if inverse.is_a("IfcRelDefinesByObject"): + if inverse.RelatingObject == settings["work_schedule"] or len(inverse.RelatedObjects) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + else: + related_objects = list(inverse.RelatedObjects) + related_objects.remove(settings["work_schedule"]) + inverse.RelatedObjects = related_objects + elif inverse.is_a("IfcRelAssignsToControl"): + [ + ifcopenshell.api.run("sequence.remove_task", file, task=related_object) + for related_object in inverse.RelatedObjects + if related_object.is_a("IfcTask") + ] - history = self.settings["work_schedule"].OwnerHistory - self.file.remove(self.settings["work_schedule"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + history = settings["work_schedule"].OwnerHistory + file.remove(settings["work_schedule"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py index 3898e3655a..ab4587ce6a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py @@ -17,31 +17,28 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, work_time=None): - """Removes a work time +def remove_work_time(file, work_time=None) -> None: + """Removes a work time - :param work_time: The IfcWorkTime to remove. - :type work_time: ifcopenshell.entity_instance - :return: None - :rtype: None + :param work_time: The IfcWorkTime to remove. + :type work_time: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) - # Let's start defining the times that we work during the week. - work_time = ifcopenshell.api.run("sequence.add_work_time", model, - work_calendar=calendar, time_type="WorkingTimes") + # Let's start defining the times that we work during the week. + work_time = ifcopenshell.api.run("sequence.add_work_time", model, + work_calendar=calendar, time_type="WorkingTimes") - # And remove it immediately - ifcopenshell.api.run("sequence.remove_work_time", model, work_time=work_time) - """ - self.file = file - self.settings = {"work_time": work_time} + # And remove it immediately + ifcopenshell.api.run("sequence.remove_work_time", model, work_time=work_time) + """ + settings = {"work_time": work_time} - def execute(self): - self.file.remove(self.settings["work_time"]) + file.remove(settings["work_time"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py index cca278da44..cac8f95372 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py @@ -19,57 +19,54 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, rel_sequence=None): - """Removes any lag time in a sequence +def unassign_lag_time(file, rel_sequence=None) -> None: + """Removes any lag time in a sequence - The schedule is cascaded afterwards. + The schedule is cascaded afterwards. - :param rel_sequence: The sequence to remove the lag time from. - :type rel_sequence: ifcopenshell.entity_instance - :return: None - :rtype: None + :param rel_sequence: The sequence to remove the lag time from. + :type rel_sequence: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's imagine a root construction task - construction = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") + # Let's imagine a root construction task + construction = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") - # Let's imagine we're building 2 zones, one after another. - zone1 = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Zone 1", identification="C.1") - zone2 = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Zone 2", identification="C.2") + # Let's imagine we're building 2 zones, one after another. + zone1 = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Zone 1", identification="C.1") + zone2 = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Zone 2", identification="C.2") - # Zone 1 finishes, then zone 2 starts. - sequence = ifcopenshell.api.run("sequence.assign_sequence", model, - relating_process=zone1, related_process=zone2) + # Zone 1 finishes, then zone 2 starts. + sequence = ifcopenshell.api.run("sequence.assign_sequence", model, + relating_process=zone1, related_process=zone2) - # What if you had to wait 1 week before you could start zone 2? - ifcopenshell.api.run("sequence.assign_lag_time", model, rel_sequence=sequence, lag_value="P1W") + # What if you had to wait 1 week before you could start zone 2? + ifcopenshell.api.run("sequence.assign_lag_time", model, rel_sequence=sequence, lag_value="P1W") - # What if you didn't? - ifcopenshell.api.run("sequence.unassign_lag_time", model, rel_sequence=sequence) - """ - self.file = file - self.settings = { - "rel_sequence": rel_sequence, - } + # What if you didn't? + ifcopenshell.api.run("sequence.unassign_lag_time", model, rel_sequence=sequence) + """ + settings = { + "rel_sequence": rel_sequence, + } - def execute(self): - if len(self.file.get_inverse(self.settings["rel_sequence"].TimeLag)) == 1: - self.file.remove(self.settings["rel_sequence"].TimeLag) - else: - self.settings["rel_sequence"].TimeLag = None - ifcopenshell.api.run( - "sequence.cascade_schedule", - self.file, - task=self.settings["rel_sequence"].RelatedProcess, - ) + if len(file.get_inverse(settings["rel_sequence"].TimeLag)) == 1: + file.remove(settings["rel_sequence"].TimeLag) + else: + settings["rel_sequence"].TimeLag = None + ifcopenshell.api.run( + "sequence.cascade_schedule", + file, + task=settings["rel_sequence"].RelatedProcess, + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py index dfc12068d3..f7e141afc1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py @@ -21,59 +21,56 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, relating_process=None, related_object=None): - """Unassigns a process and object relationship +def unassign_process(file, relating_process=None, related_object=None) -> None: + """Unassigns a process and object relationship - See ifcopenshell.api.sequence.assign_process for details. + See ifcopenshell.api.sequence.assign_process for details. - :param relating_process: The IfcTask in the relationship. - :type relating_process: ifcopenshell.entity_instance - :param related_object: The related object. - :type related_object: ifcopenshell.entity_instance - :return: None - :rtype: None + :param relating_process: The IfcTask in the relationship. + :type relating_process: ifcopenshell.entity_instance + :param related_object: The related object. + :type related_object: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's create a construction task. Note that the predefined type is - # important to distinguish types of tasks. - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Demolish existing", identification="A", predefined_type="DEMOLITION") + # Let's create a construction task. Note that the predefined type is + # important to distinguish types of tasks. + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Demolish existing", identification="A", predefined_type="DEMOLITION") - # Let's say we have a wall somewhere. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Let's say we have a wall somewhere. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # Let's demolish that wall! - ifcopenshell.api.run("sequence.assign_process", model, relating_process=task, related_object=wall) + # Let's demolish that wall! + ifcopenshell.api.run("sequence.assign_process", model, relating_process=task, related_object=wall) - # Change our mind. - ifcopenshell.api.run("sequence.unassign_process", model, relating_process=task, related_object=wall) - """ - self.file = file - self.settings = { - "relating_process": relating_process, - "related_object": related_object, - } + # Change our mind. + ifcopenshell.api.run("sequence.unassign_process", model, relating_process=task, related_object=wall) + """ + settings = { + "relating_process": relating_process, + "related_object": related_object, + } - def execute(self): - for rel in self.settings["related_object"].HasAssignments or []: - if not rel.is_a("IfcRelAssignsToProcess") or rel.RelatingProcess != self.settings["relating_process"]: - continue - if len(rel.RelatedObjects) == 1: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - return - related_objects = list(rel.RelatedObjects) - related_objects.remove(self.settings["related_object"]) - rel.RelatedObjects = related_objects - ifcopenshell.api.run("owner.update_owner_history", self.file, element=rel) - return rel + for rel in settings["related_object"].HasAssignments or []: + if not rel.is_a("IfcRelAssignsToProcess") or rel.RelatingProcess != settings["relating_process"]: + continue + if len(rel.RelatedObjects) == 1: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + return + related_objects = list(rel.RelatedObjects) + related_objects.remove(settings["related_object"]) + rel.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, element=rel) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py index 31d9edb0e1..23f9281c95 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py @@ -21,59 +21,56 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, relating_product=None, related_object=None): - """Unassigns a product and object relationship +def unassign_product(file, relating_product=None, related_object=None) -> None: + """Unassigns a product and object relationship - See ifcopenshell.api.sequence.assign_product for details. + See ifcopenshell.api.sequence.assign_product for details. - :param relating_product: The IfcProduct in the relationship. - :type relating_product: ifcopenshell.entity_instance - :param related_object: The IfcTask in the relationship. - :type related_object: ifcopenshell.entity_instance - :return: None - :rtype: None + :param relating_product: The IfcProduct in the relationship. + :type relating_product: ifcopenshell.entity_instance + :param related_object: The IfcTask in the relationship. + :type related_object: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's create a construction task. Note that the predefined type is - # important to distinguish types of tasks. - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Build wall", identification="A", predefined_type="CONSTRUCTION") + # Let's create a construction task. Note that the predefined type is + # important to distinguish types of tasks. + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Build wall", identification="A", predefined_type="CONSTRUCTION") - # Let's say we have a wall somewhere. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Let's say we have a wall somewhere. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # Let's construct that wall! - ifcopenshell.api.run("sequence.assign_product", relating_product=wall, related_object=task) + # Let's construct that wall! + ifcopenshell.api.run("sequence.assign_product", relating_product=wall, related_object=task) - # Change our mind. - ifcopenshell.api.run("sequence.unassign_product", relating_product=wall, related_object=task) - """ - self.file = file - self.settings = { - "relating_product": relating_product, - "related_object": related_object, - } + # Change our mind. + ifcopenshell.api.run("sequence.unassign_product", relating_product=wall, related_object=task) + """ + settings = { + "relating_product": relating_product, + "related_object": related_object, + } - def execute(self): - for rel in self.settings["related_object"].HasAssignments or []: - if not rel.is_a("IfcRelAssignsToProduct") or rel.RelatingProduct != self.settings["relating_product"]: - continue - if len(rel.RelatedObjects) == 1: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - return - related_objects = list(rel.RelatedObjects) - related_objects.remove(self.settings["related_object"]) - rel.RelatedObjects = related_objects - ifcopenshell.api.run("owner.update_owner_history", self.file, element=rel) - return rel + for rel in settings["related_object"].HasAssignments or []: + if not rel.is_a("IfcRelAssignsToProduct") or rel.RelatingProduct != settings["relating_product"]: + continue + if len(rel.RelatedObjects) == 1: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + return + related_objects = list(rel.RelatedObjects) + related_objects.remove(settings["related_object"]) + rel.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", file, element=rel) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py index fc74c69a95..46c99207f5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py @@ -17,40 +17,37 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, recurrence_pattern=None): - """Unassigns a recurrence pattern +def unassign_recurrence_pattern(file, recurrence_pattern=None) -> None: + """Unassigns a recurrence pattern - Note that a recurring task time must have a recurrence pattern, so if - you remove it, be sure to clean up after yourself. + Note that a recurring task time must have a recurrence pattern, so if + you remove it, be sure to clean up after your - :param recurrence_pattern: The IfcRecurrencePattern to remove. - :type recurrence_pattern: ifcopenshell.entity_instance - :return: None - :rtype: None + :param recurrence_pattern: The IfcRecurrencePattern to remove. + :type recurrence_pattern: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's create a new calendar. - calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) + # Let's create a new calendar. + calendar = ifcopenshell.api.run("sequence.add_work_calendar", model) - # Let's start defining the times that we work during the week. - work_time = ifcopenshell.api.run("sequence.add_work_time", model, - work_calendar=calendar, time_type="WorkingTimes") + # Let's start defining the times that we work during the week. + work_time = ifcopenshell.api.run("sequence.add_work_time", model, + work_calendar=calendar, time_type="WorkingTimes") - # We create a weekly recurrence - pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, - parent=work_time, recurrence_type="WEEKLY") + # We create a weekly recurrence + pattern = ifcopenshell.api.run("sequence.assign_recurrence_pattern", model, + parent=work_time, recurrence_type="WEEKLY") - # Change our mind, let's just maintain it whenever we feel like it. - ifcopenshell.api.run("sequence.unassign_recurrence_pattern", recurrence_pattern=pattern) - """ - self.file = file - self.settings = {"recurrence_pattern": recurrence_pattern} + # Change our mind, let's just maintain it whenever we feel like it. + ifcopenshell.api.run("sequence.unassign_recurrence_pattern", recurrence_pattern=pattern) + """ + settings = {"recurrence_pattern": recurrence_pattern} - def execute(self): - for time_period in self.settings["recurrence_pattern"].TimePeriods or []: - self.file.remove(time_period) - self.file.remove(self.settings["recurrence_pattern"]) + for time_period in settings["recurrence_pattern"].TimePeriods or []: + file.remove(time_period) + file.remove(settings["recurrence_pattern"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py index c7286909bd..f10b11f893 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py @@ -21,53 +21,50 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, relating_process=None, related_process=None): - """Removes a sequence relationship between tasks +def unassign_sequence(file, relating_process=None, related_process=None) -> None: + """Removes a sequence relationship between tasks - :param relating_process: The previous / predecessor task. - :type relating_process: ifcopenshell.entity_instance - :param related_process: The next / successor task. - :type related_process: ifcopenshell.entity_instance - :return: None - :rtype: None + :param relating_process: The previous / predecessor task. + :type relating_process: ifcopenshell.entity_instance + :param related_process: The next / successor task. + :type related_process: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - # Let's imagine a root construction task - construction = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Construction", identification="C") + # Let's imagine a root construction task + construction = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Construction", identification="C") - # Let's imagine we're building 2 zones, one after another. - zone1 = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Zone 1", identification="C.1") - zone2 = ifcopenshell.api.run("sequence.add_task", model, - parent_task=construction, name="Zone 2", identification="C.2") + # Let's imagine we're building 2 zones, one after another. + zone1 = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Zone 1", identification="C.1") + zone2 = ifcopenshell.api.run("sequence.add_task", model, + parent_task=construction, name="Zone 2", identification="C.2") - # Zone 1 finishes, then zone 2 starts. - ifcopenshell.api.run("sequence.assign_sequence", model, relating_process=zone1, related_process=zone2) + # Zone 1 finishes, then zone 2 starts. + ifcopenshell.api.run("sequence.assign_sequence", model, relating_process=zone1, related_process=zone2) - # Let's make them unrelated - ifcopenshell.api.run("sequence.unassign_sequence", model, - relating_process=zone1, related_process=zone2) - """ - self.file = file - self.settings = { - "relating_process": relating_process, - "related_process": related_process, - } + # Let's make them unrelated + ifcopenshell.api.run("sequence.unassign_sequence", model, + relating_process=zone1, related_process=zone2) + """ + settings = { + "relating_process": relating_process, + "related_process": related_process, + } - def execute(self): - for rel in self.settings["related_process"].IsSuccessorFrom or []: - if rel.RelatingProcess == self.settings["relating_process"]: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - ifcopenshell.api.run("sequence.cascade_schedule", self.file, task=self.settings["related_process"]) + for rel in settings["related_process"].IsSuccessorFrom or []: + if rel.RelatingProcess == settings["relating_process"]: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + ifcopenshell.api.run("sequence.cascade_schedule", file, task=settings["related_process"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py index e0caddbe3c..22891f5c83 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py @@ -15,3 +15,8 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .assign_container import assign_container +from .dereference_structure import dereference_structure +from .reference_structure import reference_structure +from .unassign_container import unassign_container diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py index 9edf7ccba8..298fe3dfdb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py @@ -23,163 +23,159 @@ import ifcopenshell.util.placement from typing import Union -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - relating_structure: ifcopenshell.entity_instance, - ): - """Assigns products to be contained hierarchically in a space +def assign_container( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + relating_structure: ifcopenshell.entity_instance, +) -> Union[ifcopenshell.entity_instance, None]: + """Assigns products to be contained hierarchically in a space - All physical IFC model elements must be part of a hierarchical tree - called the "spatial decomposition", where large things are made up of - smaller things. This tree always begins at an "IfcProject" and is then - broken down using "decomposition" relationships, of which aggregation is - the first relationship you will use. See - ifcopenshell.api.aggregate.assign_object for more details about - aggregation. + All physical IFC model elements must be part of a hierarchical tree + called the "spatial decomposition", where large things are made up of + smaller things. This tree always begins at an "IfcProject" and is then + broken down using "decomposition" relationships, of which aggregation is + the first relationship you will use. See + ifcopenshell.api.aggregate.assign_object for more details about + aggregation. - The IfcProject will be "decomposed" into spatial structure elements. - These are virtual spaces like stes, buildings, storeys, and spaces (i.e. - rooms). You can't physically touch these spaces, but you can touch the - products contained within these spaces. + The IfcProject will be "decomposed" into spatial structure elements. + These are virtual spaces like stes, buildings, storeys, and spaces (i.e. + rooms). You can't physically touch these spaces, but you can touch the + products contained within these spaces. - To state that a product is contained in a space, you will use a - "containment" relationship. Containment is a very common relationship - used to create the hierarchical spatial decomposition tree. For example, - you might say that "This wall is on the third building storey", or "this - table is in the living room space". + To state that a product is contained in a space, you will use a + "containment" relationship. Containment is a very common relationship + used to create the hierarchical spatial decomposition tree. For example, + you might say that "This wall is on the third building storey", or "this + table is in the living room space". - The distinguishing factor between aggregation and containment is that - aggregation occurs between objects of the same type (e.g. a large space - is made up of smaller spaces), whereas containment is between two - different types: explicitly saying that a physical product exists within - a virtual space. + The distinguishing factor between aggregation and containment is that + aggregation occurs between objects of the same type (e.g. a large space + is made up of smaller spaces), whereas containment is between two + different types: explicitly saying that a physical product exists within + a virtual space. - Containment is critical in construction management, to know which - objects are in which spaces, as often you would divide your construction - schedule into storey by storey, or zone by zone. Containment is also - critical in facility management, as it indicates through which space - equipment may be accessed for maintenance purposes. + Containment is critical in construction management, to know which + objects are in which spaces, as often you would divide your construction + schedule into storey by storey, or zone by zone. Containment is also + critical in facility management, as it indicates through which space + equipment may be accessed for maintenance purposes. - As a product may only have a single location in the "spatial - decomposition" tree, assigning an aggregate relationship will remove any - previous aggregation, containment, or nesting relationships it may have. + As a product may only have a single location in the "spatial + decomposition" tree, assigning an aggregate relationship will remove any + previous aggregation, containment, or nesting relationships it may have. - :param products: A list of physical IfcElements existing in the space. - :type products: list[ifcopenshell.entity_instance] - :param relating_structure: The IfcSpatialStructureElement element, such - as IfcBuilding, IfcBuildingStorey, or IfcSpace that the element - exists in. - :return: The IfcRelContainedInSpatialStructure relationship instance - or `None` if `products` was empty list. - :rtype: Union[ifcopenshell.entity_instance, None] + :param products: A list of physical IfcElements existing in the space. + :type products: list[ifcopenshell.entity_instance] + :param relating_structure: The IfcSpatialStructureElement element, such + as IfcBuilding, IfcBuildingStorey, or IfcSpace that the element + exists in. + :return: The IfcRelContainedInSpatialStructure relationship instance + or `None` if `products` was empty list. + :rtype: Union[ifcopenshell.entity_instance, None] - Example: + Example: - .. code:: python + .. code:: python - project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") - site = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") - building = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") - storey = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") - space = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSpace") + project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") + site = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") + building = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") + storey = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") + space = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSpace") - # The project contains a site (note that project aggregation is a special case in IFC) - ifcopenshell.api.run("aggregate.assign_object", model, products=[site], relating_object=project) + # The project contains a site (note that project aggregation is a special case in IFC) + ifcopenshell.api.run("aggregate.assign_object", model, products=[site], relating_object=project) - # The site has a building, the building has a storey, and the storey has a space - ifcopenshell.api.run("aggregate.assign_object", model, products=[building], relating_object=site) - ifcopenshell.api.run("aggregate.assign_object", model, products=[storey], relating_object=building) - ifcopenshell.api.run("aggregate.assign_object", model, products=[space], relating_object=storey) + # The site has a building, the building has a storey, and the storey has a space + ifcopenshell.api.run("aggregate.assign_object", model, products=[building], relating_object=site) + ifcopenshell.api.run("aggregate.assign_object", model, products=[storey], relating_object=building) + ifcopenshell.api.run("aggregate.assign_object", model, products=[space], relating_object=storey) - # Create a wall and furniture - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") + # Create a wall and furniture + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") - # The wall is in the storey, and the furniture is in the space - ifcopenshell.api.run("spatial.assign_container", model, products=[wall], relating_structure=storey) - ifcopenshell.api.run("spatial.assign_container", model, products=[furniture], relating_structure=space) - """ - self.file = file - self.settings = { - "products": products, - "relating_structure": relating_structure, - } + # The wall is in the storey, and the furniture is in the space + ifcopenshell.api.run("spatial.assign_container", model, products=[wall], relating_structure=storey) + ifcopenshell.api.run("spatial.assign_container", model, products=[furniture], relating_structure=space) + """ + settings = { + "products": products, + "relating_structure": relating_structure, + } - def execute(self) -> Union[ifcopenshell.entity_instance, None]: - if not self.settings["products"]: - return + if not settings["products"]: + return - products = set(self.settings["products"]) - relating_structure = self.settings["relating_structure"] - structure_rel = next(iter(relating_structure.ContainsElements), None) + products = set(settings["products"]) + relating_structure = settings["relating_structure"] + structure_rel = next(iter(relating_structure.ContainsElements), None) - previous_containers_rels: set[ifcopenshell.entity_instance] = set() - products_without_containers: list[ifcopenshell.entity_instance] = [] - products_with_containers: list[ifcopenshell.entity_instance] = [] + previous_containers_rels: set[ifcopenshell.entity_instance] = set() + products_without_containers: list[ifcopenshell.entity_instance] = [] + products_with_containers: list[ifcopenshell.entity_instance] = [] - # check if there is anything to change - for product in products: - product_rel = next(iter(product.ContainedInStructure), None) + # check if there is anything to change + for product in products: + product_rel = next(iter(product.ContainedInStructure), None) - if product_rel is None: - products_without_containers.append(product) - continue + if product_rel is None: + products_without_containers.append(product) + continue - # either structure_rel is None or product is part of different rel - if product_rel != structure_rel: - previous_containers_rels.add(product_rel) - products_with_containers.append(product) + # either structure_rel is None or product is part of different rel + if product_rel != structure_rel: + previous_containers_rels.add(product_rel) + products_with_containers.append(product) - # products with already assigned containers will be skipped + # products with already assigned containers will be skipped - products_to_change = products_without_containers + products_with_containers - # nothing to change - if not products_to_change: - return structure_rel + products_to_change = products_without_containers + products_with_containers + # nothing to change + if not products_to_change: + return structure_rel - # can be either only aggregated or only contained at the same time - ifcopenshell.api.run("aggregate.unassign_object", self.file, products=products_without_containers) + # can be either only aggregated or only contained at the same time + ifcopenshell.api.run("aggregate.unassign_object", file, products=products_without_containers) - # unassign elements from previous containers - for rel in previous_containers_rels: - related_elements = set(rel.RelatedElements) - products - if related_elements: - rel.RelatedElements = list(related_elements) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - - # assign elements to a new container - if structure_rel: - structure_rel.RelatedElements = list(set(structure_rel.RelatedElements) | products) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": structure_rel}) + # unassign elements from previous containers + for rel in previous_containers_rels: + related_elements = set(rel.RelatedElements) - products + if related_elements: + rel.RelatedElements = list(related_elements) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) else: - structure_rel = self.file.create_entity( - "IfcRelContainedInSpatialStructure", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedElements": list(products), - "RelatingStructure": self.settings["relating_structure"], - } + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + + # assign elements to a new container + if structure_rel: + structure_rel.RelatedElements = list(set(structure_rel.RelatedElements) | products) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": structure_rel}) + else: + structure_rel = file.create_entity( + "IfcRelContainedInSpatialStructure", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedElements": list(products), + "RelatingStructure": settings["relating_structure"], + } + ) + + # localize placement relative to a new container for affected products + for product in products_to_change: + placement = getattr(product, "ObjectPlacement", None) + if placement and placement.is_a("IfcLocalPlacement"): + ifcopenshell.api.run( + "geometry.edit_object_placement", + file, + product=product, + matrix=ifcopenshell.util.placement.get_local_placement(product.ObjectPlacement), + is_si=False, ) - # localize placement relative to a new container for affected products - for product in products_to_change: - placement = getattr(product, "ObjectPlacement", None) - if placement and placement.is_a("IfcLocalPlacement"): - ifcopenshell.api.run( - "geometry.edit_object_placement", - self.file, - product=product, - matrix=ifcopenshell.util.placement.get_local_placement(product.ObjectPlacement), - is_si=False, - ) - - return structure_rel + return structure_rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/dereference_structure.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/dereference_structure.py index 6902018b46..50eb72305b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/dereference_structure.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/dereference_structure.py @@ -21,70 +21,66 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - relating_structure: ifcopenshell.entity_instance, - ): - """Dereferences a list of products and space +def dereference_structure( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + relating_structure: ifcopenshell.entity_instance, +) -> None: + """Dereferences a list of products and space - :param products: The list of physical IfcElements that exists in the space. - :type products: list[ifcopenshell.entity_instance] - :param relating_structure: The IfcSpatialStructureElement element, such - as IfcBuilding, IfcBuildingStorey, or IfcSpace that the element - exists in. - :return: None - :rtype: None + :param products: The list of physical IfcElements that exists in the space. + :type products: list[ifcopenshell.entity_instance] + :param relating_structure: The IfcSpatialStructureElement element, such + as IfcBuilding, IfcBuildingStorey, or IfcSpace that the element + exists in. + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") - site = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") - building = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") - storey1 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") - storey2 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") - storey3 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") + project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") + site = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") + building = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") + storey1 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") + storey2 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") + storey3 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") - # The project contains a site (note that project aggregation is a special case in IFC) - ifcopenshell.api.run("aggregate.assign_object", model, products=[site], relating_object=project) + # The project contains a site (note that project aggregation is a special case in IFC) + ifcopenshell.api.run("aggregate.assign_object", model, products=[site], relating_object=project) - # The site has a building, the building has a storey, and the storey has a space - ifcopenshell.api.run("aggregate.assign_object", model, products=[building], relating_object=site) - ifcopenshell.api.run("aggregate.assign_object", model, products=[storey], relating_object=building) - ifcopenshell.api.run("aggregate.assign_object", model, products=[space], relating_object=storey) + # The site has a building, the building has a storey, and the storey has a space + ifcopenshell.api.run("aggregate.assign_object", model, products=[building], relating_object=site) + ifcopenshell.api.run("aggregate.assign_object", model, products=[storey], relating_object=building) + ifcopenshell.api.run("aggregate.assign_object", model, products=[space], relating_object=storey) - # Create a column, this column spans 3 storeys - column = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Create a column, this column spans 3 storeys + column = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # The column is contained in the lowermost storey - ifcopenshell.api.run("spatial.assign_container", model, products=[column], relating_structure=storey1) + # The column is contained in the lowermost storey + ifcopenshell.api.run("spatial.assign_container", model, products=[column], relating_structure=storey1) - # And referenced in the others - ifcopenshell.api.run("spatial.reference_structure", model, products=[column], relating_structure=storey2) - ifcopenshell.api.run("spatial.reference_structure", model, products=[column], relating_structure=storey3) + # And referenced in the others + ifcopenshell.api.run("spatial.reference_structure", model, products=[column], relating_structure=storey2) + ifcopenshell.api.run("spatial.reference_structure", model, products=[column], relating_structure=storey3) - # Actually, it only goes up to storey 2. - ifcopenshell.api.run("spatial.dereference_structure", model, products=[column], relating_structure=storey3) - """ - self.file = file - self.settings = {"products": products, "relating_structure": relating_structure} + # Actually, it only goes up to storey 2. + ifcopenshell.api.run("spatial.dereference_structure", model, products=[column], relating_structure=storey3) + """ + settings = {"products": products, "relating_structure": relating_structure} - def execute(self) -> None: - products = set(self.settings["products"]) - for rel in self.settings["relating_structure"].ReferencesElements: - related_elements = set(rel.RelatedElements) - if not related_elements.intersection(products): - continue - related_elements = related_elements - products - if related_elements: - rel.RelatedElements = list(related_elements) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + products = set(settings["products"]) + for rel in settings["relating_structure"].ReferencesElements: + related_elements = set(rel.RelatedElements) + if not related_elements.intersection(products): + continue + related_elements = related_elements - products + if related_elements: + rel.RelatedElements = list(related_elements) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + else: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py index 32ef580b96..48b5c6bc1b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py @@ -22,103 +22,99 @@ import ifcopenshell.util.element from typing import Union -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - relating_structure: ifcopenshell.entity_instance, - ): - """Denote that a list products is related to a list of spatial structures +def reference_structure( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + relating_structure: ifcopenshell.entity_instance, +) -> Union[ifcopenshell.entity_instance, None]: + """Denote that a list products is related to a list of spatial structures - This is similar to ifcopenshell.api.spatial.assign_container, except - that containment can only occur between a product and a single spatial - structure element. This is fine if a wall is on level 1, but not - appropriate if you have a multistorey column on multiple levels, or a - door with a to and from space, or a stair going from one floor to - another floor. This is where spatial referencing is used. + This is similar to ifcopenshell.api.spatial.assign_container, except + that containment can only occur between a product and a single spatial + structure element. This is fine if a wall is on level 1, but not + appropriate if you have a multistorey column on multiple levels, or a + door with a to and from space, or a stair going from one floor to + another floor. This is where spatial referencing is used. - Typically, the product will be contained in the lowermost, constructed - first, or primarily accessible space. For a multistorey column or stair, - the column or stair will therefore be contained in the lowermost storey. - Then, any other storeys will be referenced. + Typically, the product will be contained in the lowermost, constructed + first, or primarily accessible space. For a multistorey column or stair, + the column or stair will therefore be contained in the lowermost storey. + Then, any other storeys will be referenced. - Referencing is non-hierarchical, so a door may be referenced in multiple - spaces simultaneously. + Referencing is non-hierarchical, so a door may be referenced in multiple + spaces simultaneously. - :param products: The list of physical IfcElements that exists in the space. - :type products: list[ifcopenshell.entity_instance] - :param relating_structure: The IfcSpatialStructureElement element, such - as IfcBuilding, IfcBuildingStorey, or IfcSpace that the element - exists in. - :type relating_structure: ifcopenshell.entity_instance - :return: The IfcRelReferencedInSpatialStructure relationship instance - or `None` if `products` was an empty list. - :rtype: Union[ifcopenshell.entity_instance, None] + :param products: The list of physical IfcElements that exists in the space. + :type products: list[ifcopenshell.entity_instance] + :param relating_structure: The IfcSpatialStructureElement element, such + as IfcBuilding, IfcBuildingStorey, or IfcSpace that the element + exists in. + :type relating_structure: ifcopenshell.entity_instance + :return: The IfcRelReferencedInSpatialStructure relationship instance + or `None` if `products` was an empty list. + :rtype: Union[ifcopenshell.entity_instance, None] - Example: + Example: - .. code:: python + .. code:: python - project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") - site = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") - building = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") - storey1 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") - storey2 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") - storey3 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") + project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") + site = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") + building = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") + storey1 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") + storey2 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") + storey3 = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") - # The project contains a site (note that project aggregation is a special case in IFC) - ifcopenshell.api.run("aggregate.assign_object", model, products=[site], relating_object=project) + # The project contains a site (note that project aggregation is a special case in IFC) + ifcopenshell.api.run("aggregate.assign_object", model, products=[site], relating_object=project) - # The site has a building, the building has a storey, and the storey has a space - ifcopenshell.api.run("aggregate.assign_object", model, products=[building], relating_object=site) - ifcopenshell.api.run("aggregate.assign_object", model, products=[storey], relating_object=building) - ifcopenshell.api.run("aggregate.assign_object", model, products=[space], relating_object=storey) + # The site has a building, the building has a storey, and the storey has a space + ifcopenshell.api.run("aggregate.assign_object", model, products=[building], relating_object=site) + ifcopenshell.api.run("aggregate.assign_object", model, products=[storey], relating_object=building) + ifcopenshell.api.run("aggregate.assign_object", model, products=[space], relating_object=storey) - # Create a column, this column spans 3 storeys - column = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Create a column, this column spans 3 storeys + column = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # The column is contained in the lowermost storey - ifcopenshell.api.run("spatial.assign_container", model, products=[column], relating_structure=storey1) + # The column is contained in the lowermost storey + ifcopenshell.api.run("spatial.assign_container", model, products=[column], relating_structure=storey1) - # And referenced in the others - ifcopenshell.api.run( - "spatial.reference_structure", model, products=[column], relating_structure=[storey2, storey3] - ) - """ - self.file = file - self.settings = { - "products": products, - "relating_structure": relating_structure, - } + # And referenced in the others + ifcopenshell.api.run( + "spatial.reference_structure", model, products=[column], relating_structure=[storey2, storey3] + ) + """ + settings = { + "products": products, + "relating_structure": relating_structure, + } - def execute(self) -> Union[ifcopenshell.entity_instance, None]: - structure = self.settings["relating_structure"] - products = set(self.settings["products"]) + structure = settings["relating_structure"] + products = set(settings["products"]) - if not products: - return + if not products: + return - referenced = ifcopenshell.util.element.get_structure_referenced_elements(structure) - products_to_assign = products - referenced - rel = next(iter(structure.ReferencesElements), None) - - if not products_to_assign: - return rel - - if rel is None: - rel = self.file.create_entity( - "IfcRelReferencedInSpatialStructure", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedElements": list(products_to_assign), - "RelatingStructure": structure, - } - ) - else: - related_elements = set(rel.RelatedElements) | products_to_assign - rel.RelatedElements = list(related_elements) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) + referenced = ifcopenshell.util.element.get_structure_referenced_elements(structure) + products_to_assign = products - referenced + rel = next(iter(structure.ReferencesElements), None) + if not products_to_assign: return rel + + if rel is None: + rel = file.create_entity( + "IfcRelReferencedInSpatialStructure", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedElements": list(products_to_assign), + "RelatingStructure": structure, + } + ) + else: + related_elements = set(rel.RelatedElements) | products_to_assign + rel.RelatedElements = list(related_elements) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py index d1418d3be5..b6afbc13c9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/unassign_container.py @@ -21,56 +21,53 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file: ifcopenshell.file, products: list[ifcopenshell.entity_instance]): - """Unassigns a container from products. +def unassign_container(file: ifcopenshell.file, products: list[ifcopenshell.entity_instance]) -> None: + """Unassigns a container from products. - :param product: A list of IfcProducts to remove the containment from. - :type product: list[ifcopenshell.entity_instance] - :return: None - :rtype: None + :param product: A list of IfcProducts to remove the containment from. + :type product: list[ifcopenshell.entity_instance] + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") - site = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") - building = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") - storey = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") + project = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") + site = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcSite") + building = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuilding") + storey = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcBuildingStorey") - # The project contains a site (note that project aggregation is a special case in IFC) - ifcopenshell.api.run("aggregate.assign_object", model, products=[site], relating_object=project) + # The project contains a site (note that project aggregation is a special case in IFC) + ifcopenshell.api.run("aggregate.assign_object", model, products=[site], relating_object=project) - # The site has a building, the building has a storey, and the storey has a space - ifcopenshell.api.run("aggregate.assign_object", model, products=[building], relating_object=site) - ifcopenshell.api.run("aggregate.assign_object", model, products=[storey], relating_object=building) + # The site has a building, the building has a storey, and the storey has a space + ifcopenshell.api.run("aggregate.assign_object", model, products=[building], relating_object=site) + ifcopenshell.api.run("aggregate.assign_object", model, products=[storey], relating_object=building) - # Create a wall - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Create a wall + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # The wall is in the storey - ifcopenshell.api.run("spatial.assign_container", model, products=[wall], relating_structure=storey) + # The wall is in the storey + ifcopenshell.api.run("spatial.assign_container", model, products=[wall], relating_structure=storey) - # Not anymore! - ifcopenshell.api.run("spatial.unassign_container", model, products=[wall]) - """ - self.file = file - self.settings = { - "products": products, - } + # Not anymore! + ifcopenshell.api.run("spatial.unassign_container", model, products=[wall]) + """ + settings = { + "products": products, + } - def execute(self) -> None: - products = set(self.settings["products"]) - rels = set(rel for product in products if (rel := next(iter(product.ContainedInStructure), None))) + products = set(settings["products"]) + rels = set(rel for product in products if (rel := next(iter(product.ContainedInStructure), None))) - for rel in rels: - related_elements = set(rel.RelatedElements) - products - if related_elements: - rel.RelatedElements = list(related_elements) - ifcopenshell.api.run("owner.update_owner_history", self.file, element=rel) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + for rel in rels: + related_elements = set(rel.RelatedElements) - products + if related_elements: + rel.RelatedElements = list(related_elements) + ifcopenshell.api.run("owner.update_owner_history", file, element=rel) + else: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py index e0caddbe3c..3bdaf8c004 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py @@ -15,3 +15,25 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_structural_activity import add_structural_activity +from .add_structural_analysis_model import add_structural_analysis_model +from .add_structural_boundary_condition import add_structural_boundary_condition +from .add_structural_load import add_structural_load +from .add_structural_load_case import add_structural_load_case +from .add_structural_load_group import add_structural_load_group +from .add_structural_member_connection import add_structural_member_connection +from .assign_structural_analysis_model import assign_structural_analysis_model +from .edit_structural_analysis_model import edit_structural_analysis_model +from .edit_structural_boundary_condition import edit_structural_boundary_condition +from .edit_structural_connection_cs import edit_structural_connection_cs +from .edit_structural_item_axis import edit_structural_item_axis +from .edit_structural_load import edit_structural_load +from .edit_structural_load_case import edit_structural_load_case +from .remove_structural_analysis_model import remove_structural_analysis_model +from .remove_structural_boundary_condition import remove_structural_boundary_condition +from .remove_structural_connection_condition import remove_structural_connection_condition +from .remove_structural_load import remove_structural_load +from .remove_structural_load_case import remove_structural_load_case +from .remove_structural_load_group import remove_structural_load_group +from .unassign_structural_analysis_model import unassign_structural_analysis_model diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py index faf1daf366..4be210fcf1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py @@ -19,65 +19,61 @@ import ifcopenshell.api -class Usecase: - def __init__( - self, +def add_structural_activity( + file, + ifc_class="IfcStructuralPlanarAction", + predefined_type="CONST", + global_or_local="GLOBAL_COORDS", + applied_load=None, + structural_member=None, +) -> None: + """Adds a new structural activity + + A structural activity is either a structural action or a reaction. It + may be applied to a point, a curve, or a planar surface, and may be a + constant load, linear, etc. + + The activity must be defined using an applied load, and associated with + a structural member. + + :param ifc_class: Choose from any subtype of IfcStructuralActivity. + :type ifc_class: str + :param predefined_type: View the IFC documentation for what valid + predefined types may be chosen. + :type predefined_type: str + :param global_or_local: The location coordinates of the load is always + defined locally relative to the structural member the activity is + assigned to. However, the directions of the applied load may either + be specified globally or locally depending on how this argument is + set. Choose from GLOBAL_COORDS or LOCAL_COORDS. + :type global_or_local: str + :param applied_load: The IfcStructuralLoad that is applied in this + activity. + :type applied_load: ifcopenshell.entity_instance + :param structural_member: The IfcStructuralMember that the load is + applied to. + :type structural_member: ifcopenshell.entity_instance + :return: The newly created entity based on the ifc_class + :rtype: ifcopenshell.entity_instance + """ + settings = { + "ifc_class": ifc_class, + "predefined_type": predefined_type, + "global_or_local": global_or_local, + "applied_load": applied_load, + "structural_member": structural_member, + } + + activity = ifcopenshell.api.run( + "root.create_entity", file, - ifc_class="IfcStructuralPlanarAction", - predefined_type="CONST", - global_or_local="GLOBAL_COORDS", - applied_load=None, - structural_member=None, - ): - """Adds a new structural activity + ifc_class=settings["ifc_class"], + predefined_type=settings["predefined_type"], + ) + activity.AppliedLoad = settings["applied_load"] + activity.GlobalOrLocal = settings["global_or_local"] - A structural activity is either a structural action or a reaction. It - may be applied to a point, a curve, or a planar surface, and may be a - constant load, linear, etc. - - The activity must be defined using an applied load, and associated with - a structural member. - - :param ifc_class: Choose from any subtype of IfcStructuralActivity. - :type ifc_class: str - :param predefined_type: View the IFC documentation for what valid - predefined types may be chosen. - :type predefined_type: str - :param global_or_local: The location coordinates of the load is always - defined locally relative to the structural member the activity is - assigned to. However, the directions of the applied load may either - be specified globally or locally depending on how this argument is - set. Choose from GLOBAL_COORDS or LOCAL_COORDS. - :type global_or_local: str - :param applied_load: The IfcStructuralLoad that is applied in this - activity. - :type applied_load: ifcopenshell.entity_instance - :param structural_member: The IfcStructuralMember that the load is - applied to. - :type structural_member: ifcopenshell.entity_instance - :return: The newly created entity based on the ifc_class - :rtype: ifcopenshell.entity_instance - """ - self.file = file - self.settings = { - "ifc_class": ifc_class, - "predefined_type": predefined_type, - "global_or_local": global_or_local, - "applied_load": applied_load, - "structural_member": structural_member, - } - - def execute(self): - activity = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class=self.settings["ifc_class"], - predefined_type=self.settings["predefined_type"], - ) - activity.AppliedLoad = self.settings["applied_load"] - activity.GlobalOrLocal = self.settings["global_or_local"] - - rel = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcRelConnectsStructuralActivity") - rel.RelatingElement = self.settings["structural_member"] - rel.RelatedStructuralActivity = activity - return activity + rel = ifcopenshell.api.run("root.create_entity", file, ifc_class="IfcRelConnectsStructuralActivity") + rel.RelatingElement = settings["structural_member"] + rel.RelatedStructuralActivity = activity + return activity diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py index 39181f9a4c..837fd29cce 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py @@ -20,30 +20,27 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file): - """Add a new structural analysis model +def add_structural_analysis_model(file) -> None: + """Add a new structural analysis model - A structural analysis model is a group of all the loads, reactions, - structural members, and structural connections required to describe a - structural analysis model. + A structural analysis model is a group of all the loads, reactions, + structural members, and structural connections required to describe a + structural analysis model. - A 3D analytical model is assumed. + A 3D analytical model is assumed. - :return: The newly created IfcStructuralAnalysisModel - :rtype: ifcopenshell.entity_instance + :return: The newly created IfcStructuralAnalysisModel + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Create a fresh blank structural analysis - analysis = ifcopenshell.api.run("structural.add_structural_analysis_model", model) - """ - self.file = file - self.settings = {} + # Create a fresh blank structural analysis + analysis = ifcopenshell.api.run("structural.add_structural_analysis_model", model) + """ + settings = {} - def execute(self): - return ifcopenshell.api.run( - "root.create_entity", self.file, ifc_class="IfcStructuralAnalysisModel", predefined_type="LOADING_3D" - ) + return ifcopenshell.api.run( + "root.create_entity", file, ifc_class="IfcStructuralAnalysisModel", predefined_type="LOADING_3D" + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py index 1cd9dfef9f..5aef16efed 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py @@ -17,55 +17,50 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, name=None, connection=None, ifc_class="IfcBoundaryNodeCondition"): - """Adds a new structural boundary condition to a structural connection +def add_structural_boundary_condition(file, name=None, connection=None, ifc_class="IfcBoundaryNodeCondition") -> None: + """Adds a new structural boundary condition to a structural connection - The type of boundary condition depends on the connection. Point - connections will have a node condition, curve connections will have an - edge condition, and surface connections will have a face condition. + The type of boundary condition depends on the connection. Point + connections will have a node condition, curve connections will have an + edge condition, and surface connections will have a face condition. - :param name: The name of the boundary condition. - :type name: str,optional - :param connection: The IfcStructuralConnection to apply the boundary - condition to. This will determine the type of condition that is - created. If no connection is supplied, an orphan boundary condition - will be created using the ifc_class that you specify. - :type connection: ifcopenshell.entity_instance,optional - :param ifc_class: The class of IfcBoundaryCondition to create, only - relevant if you do not specify a connection and want to create an - orphaned boundary condition. - :type ifc_class: str,optional - :return: The newly created IfcBoundaryCondition - :rtype: ifcopenshell.entity_instance + :param name: The name of the boundary condition. + :type name: str,optional + :param connection: The IfcStructuralConnection to apply the boundary + condition to. This will determine the type of condition that is + created. If no connection is supplied, an orphan boundary condition + will be created using the ifc_class that you specify. + :type connection: ifcopenshell.entity_instance,optional + :param ifc_class: The class of IfcBoundaryCondition to create, only + relevant if you do not specify a connection and want to create an + orphaned boundary condition. + :type ifc_class: str,optional + :return: The newly created IfcBoundaryCondition + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - ifcopenshell.api.run("structural.add_structural_boundary_condition", model, connection=connection) - """ - self.file = file - self.settings = {"name": name, "connection": connection, "ifc_class": ifc_class} + ifcopenshell.api.run("structural.add_structural_boundary_condition", model, connection=connection) + """ + settings = {"name": name, "connection": connection, "ifc_class": ifc_class} - def execute(self): - if self.settings["connection"]: - # assign boundary condition to a connection - if self.settings["connection"].is_a("IfcRelConnectsStructuralMember"): - related_connection = self.settings["connection"].RelatedStructuralConnection - else: - related_connection = self.settings["connection"] - - if related_connection.is_a("IfcStructuralPointConnection"): - boundary_class = "IfcBoundaryNodeCondition" - elif related_connection.is_a("IfcStructuralCurveConnection"): - boundary_class = "IfcBoundaryEdgeCondition" - elif related_connection.is_a("IfcStructuralSurfaceConnection"): - boundary_class = "IfcBoundaryFaceCondition" - - self.settings["connection"].AppliedCondition = self.file.create_entity( - boundary_class, Name=self.settings["name"] - ) + if settings["connection"]: + # assign boundary condition to a connection + if settings["connection"].is_a("IfcRelConnectsStructuralMember"): + related_connection = settings["connection"].RelatedStructuralConnection else: - # add an orphan boundary condition - return self.file.create_entity(self.settings["ifc_class"], Name=self.settings["name"]) + related_connection = settings["connection"] + + if related_connection.is_a("IfcStructuralPointConnection"): + boundary_class = "IfcBoundaryNodeCondition" + elif related_connection.is_a("IfcStructuralCurveConnection"): + boundary_class = "IfcBoundaryEdgeCondition" + elif related_connection.is_a("IfcStructuralSurfaceConnection"): + boundary_class = "IfcBoundaryFaceCondition" + + settings["connection"].AppliedCondition = file.create_entity(boundary_class, Name=settings["name"]) + else: + # add an orphan boundary condition + return file.create_entity(settings["ifc_class"], Name=settings["name"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py index 6d51d7dc22..3cb06cd513 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py @@ -19,35 +19,32 @@ import ifcopenshell.api -class Usecase: - def __init__(self, file, name=None, ifc_class="IfcStructuralLoadLinearForce"): - """Adds a new structural load +def add_structural_load(file, name=None, ifc_class="IfcStructuralLoadLinearForce") -> None: + """Adds a new structural load - Structural loads may be actions or reactions. A simple load might be a - static and be linear, planar, or a single point. Alternatively, loads - may be defined as a configuration of multiple loads. + Structural loads may be actions or reactions. A simple load might be a + static and be linear, planar, or a single point. Alternatively, loads + may be defined as a configuration of multiple loads. - :param name: The name of the load - :type name: str,optional - :param ifc_class: The subtype of IfcStructuralLoad to create. Consult - the IFC documentation to see all the types of loads. - :type ifc_class: str - :return: The newly created load entity, depending on the ifc_class - specified. - :rtype: ifcopenshell.entity_instance + :param name: The name of the load + :type name: str,optional + :param ifc_class: The subtype of IfcStructuralLoad to create. Consult + the IFC documentation to see all the types of loads. + :type ifc_class: str + :return: The newly created load entity, depending on the ifc_class + specified. + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Create a simple linear load - ifcopenshell.api.run("structural.add_structural_load", model) - """ - self.file = file - self.settings = { - "name": name, - "ifc_class": ifc_class, - } + # Create a simple linear load + ifcopenshell.api.run("structural.add_structural_load", model) + """ + settings = { + "name": name, + "ifc_class": ifc_class, + } - def execute(self): - return self.file.create_entity(self.settings["ifc_class"], Name=self.settings["name"]) + return file.create_entity(settings["ifc_class"], Name=settings["name"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py index afc4e676db..e3d2c4f6c2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py @@ -19,39 +19,34 @@ import ifcopenshell.api -class Usecase: - def __init__( - self, file, name="Unnamed", action_type="NOTDEFINED", action_source="NOTDEFINED" - ): - """Adds a new load case, which is a collection of related load groups +def add_structural_load_case(file, name="Unnamed", action_type="NOTDEFINED", action_source="NOTDEFINED") -> None: + """Adds a new load case, which is a collection of related load groups - :param name: The name of the load case - :type name: str - :param action_type: Choose from EXTRAORDINARY_A, PERMANENT_G, - or VARIABLE_Q, taken from the Eurocode standard. - :type action_type: str - :param action_source: The source of the load case, such as DEAD_LOAD_G, - LIVE_LOAD_Q, TRANSPORT, ICE, etc. For the full list consult - IfcActionSourceTypeEnum in the IFC documentation. - :type action_source: str - :return: The new IfcStructuralLoadCase - :rtype: ifcopenshell.entity_instance - """ - self.file = file - self.settings = { - "name": name, - "action_type": action_type, - "action_source": action_source, - } + :param name: The name of the load case + :type name: str + :param action_type: Choose from EXTRAORDINARY_A, PERMANENT_G, + or VARIABLE_Q, taken from the Eurocode standard. + :type action_type: str + :param action_source: The source of the load case, such as DEAD_LOAD_G, + LIVE_LOAD_Q, TRANSPORT, ICE, etc. For the full list consult + IfcActionSourceTypeEnum in the IFC documentation. + :type action_source: str + :return: The new IfcStructuralLoadCase + :rtype: ifcopenshell.entity_instance + """ + settings = { + "name": name, + "action_type": action_type, + "action_source": action_source, + } - def execute(self): - load_case = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class="IfcStructuralLoadCase", - predefined_type="LOAD_CASE", - name=self.settings["name"], - ) - load_case.ActionType = self.settings["action_type"] - load_case.ActionSource = self.settings["action_source"] - return load_case + load_case = ifcopenshell.api.run( + "root.create_entity", + file, + ifc_class="IfcStructuralLoadCase", + predefined_type="LOAD_CASE", + name=settings["name"], + ) + load_case.ActionType = settings["action_type"] + load_case.ActionSource = settings["action_source"] + return load_case diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py index 497977fe6e..3f450df5c8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py @@ -19,39 +19,34 @@ import ifcopenshell.api -class Usecase: - def __init__( - self, file, name="Unnamed", action_type="NOTDEFINED", action_source="NOTDEFINED" - ): - """Adds a new load group, which is a collection of related loads +def add_structural_load_group(file, name="Unnamed", action_type="NOTDEFINED", action_source="NOTDEFINED") -> None: + """Adds a new load group, which is a collection of related loads - :param name: The name of the load group - :type name: str - :param action_type: Choose from EXTRAORDINARY_A, PERMANENT_G, - or VARIABLE_Q, taken from the Eurocode standard. - :type action_type: str - :param action_source: The source of the load case, such as DEAD_LOAD_G, - LIVE_LOAD_Q, TRANSPORT, ICE, etc. For the full list consult - IfcActionSourceTypeEnum in the IFC documentation. - :type action_source: str - :return: The new IfcStructuralLoadCase - :rtype: ifcopenshell.entity_instance - """ - self.file = file - self.settings = { - "name": name, - "action_type": action_type, - "action_source": action_source, - } + :param name: The name of the load group + :type name: str + :param action_type: Choose from EXTRAORDINARY_A, PERMANENT_G, + or VARIABLE_Q, taken from the Eurocode standard. + :type action_type: str + :param action_source: The source of the load case, such as DEAD_LOAD_G, + LIVE_LOAD_Q, TRANSPORT, ICE, etc. For the full list consult + IfcActionSourceTypeEnum in the IFC documentation. + :type action_source: str + :return: The new IfcStructuralLoadCase + :rtype: ifcopenshell.entity_instance + """ + settings = { + "name": name, + "action_type": action_type, + "action_source": action_source, + } - def execute(self): - load_group = ifcopenshell.api.run( - "root.create_entity", - self.file, - ifc_class="IfcStructuralLoadGroup", - predefined_type="LOAD_GROUP", - name=self.settings["name"], - ) - load_group.ActionType = self.settings["action_type"] - load_group.ActionSource = self.settings["action_source"] - return load_group + load_group = ifcopenshell.api.run( + "root.create_entity", + file, + ifc_class="IfcStructuralLoadGroup", + predefined_type="LOAD_GROUP", + name=settings["name"], + ) + load_group.ActionType = settings["action_type"] + load_group.ActionSource = settings["action_source"] + return load_group diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py index eda5fc96c2..792c03b66a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py @@ -20,30 +20,27 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, relating_structural_member=None, related_structural_connection=None): - """Relates a structural member and a structural connection +def add_structural_member_connection(file, relating_structural_member=None, related_structural_connection=None) -> None: + """Relates a structural member and a structural connection - :param relating_structural_member: The IfcStructuralMember to have a - connection added to it. - :type relating_structural_member: ifcopenshell.entity_instance - :param related_structural_connection: The IfcStructuralConnection to add - to the IfcStructuralMember. - :type related_structural_connection: ifcopenshell.entity_instance - :return: The IfcRelConnectsStructuralMember relationship - :rtype: ifcopenshell.entity_instance - """ - self.file = file - self.settings = { - "relating_structural_member": relating_structural_member, - "related_structural_connection": related_structural_connection, - } + :param relating_structural_member: The IfcStructuralMember to have a + connection added to it. + :type relating_structural_member: ifcopenshell.entity_instance + :param related_structural_connection: The IfcStructuralConnection to add + to the IfcStructuralMember. + :type related_structural_connection: ifcopenshell.entity_instance + :return: The IfcRelConnectsStructuralMember relationship + :rtype: ifcopenshell.entity_instance + """ + settings = { + "relating_structural_member": relating_structural_member, + "related_structural_connection": related_structural_connection, + } - def execute(self): - for connection in self.settings["related_structural_connection"].ConnectsStructuralMembers or []: - if connection.RelatingStructuralMember == self.settings["relating_structural_member"]: - return - rel = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcRelConnectsStructuralMember") - rel.RelatingStructuralMember = self.settings["relating_structural_member"] - rel.RelatedStructuralConnection = self.settings["related_structural_connection"] - return rel + for connection in settings["related_structural_connection"].ConnectsStructuralMembers or []: + if connection.RelatingStructuralMember == settings["relating_structural_member"]: + return + rel = ifcopenshell.api.run("root.create_entity", file, ifc_class="IfcRelConnectsStructuralMember") + rel.RelatingStructuralMember = settings["relating_structural_member"] + rel.RelatedStructuralConnection = settings["related_structural_connection"] + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py index 61f771c982..19c31e34ff 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py @@ -20,37 +20,34 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, product=None, structural_analysis_model=None): - """Assigns a load or structural member to an analysis model +def assign_structural_analysis_model(file, product=None, structural_analysis_model=None) -> None: + """Assigns a load or structural member to an analysis model - :param product: The structural element that is part of the analysis. - :type product: ifcopenshell.entity_instance - :param structural_analysis_model: The IfcStructuralAnalysisModel that - the structural element is related to. - :type structural_analysis_model: ifcopenshell.entity_instance - :return: The IfcRelAssignsToGroup relationship - :rtype: ifcopenshell.entity_instance - """ - self.file = file - self.settings = { - "product": product, - "structural_analysis_model": structural_analysis_model, - } + :param product: The structural element that is part of the analysis. + :type product: ifcopenshell.entity_instance + :param structural_analysis_model: The IfcStructuralAnalysisModel that + the structural element is related to. + :type structural_analysis_model: ifcopenshell.entity_instance + :return: The IfcRelAssignsToGroup relationship + :rtype: ifcopenshell.entity_instance + """ + settings = { + "product": product, + "structural_analysis_model": structural_analysis_model, + } - def execute(self): - if not self.settings["structural_analysis_model"].IsGroupedBy: - return self.file.create_entity( - "IfcRelAssignsToGroup", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": [self.settings["product"]], - "RelatingGroup": self.settings["structural_analysis_model"], - } - ) - rel = self.settings["structural_analysis_model"].IsGroupedBy[0] - related_objects = set(rel.RelatedObjects) or set() - related_objects.add(self.settings["product"]) - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) + if not settings["structural_analysis_model"].IsGroupedBy: + return file.create_entity( + "IfcRelAssignsToGroup", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedObjects": [settings["product"]], + "RelatingGroup": settings["structural_analysis_model"], + } + ) + rel = settings["structural_analysis_model"].IsGroupedBy[0] + related_objects = set(rel.RelatedObjects) or set() + related_objects.add(settings["product"]) + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py index 39c46f6fe7..7c41c59478 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py @@ -17,24 +17,21 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, structural_analysis_model=None, attributes=None): - """Edits the attributes of an IfcStructuralAnalysisModel +def edit_structural_analysis_model(file, structural_analysis_model=None, attributes=None) -> None: + """Edits the attributes of an IfcStructuralAnalysisModel - For more information about the attributes and data types of an - IfcStructuralAnalysisModel, consult the IFC documentation. + For more information about the attributes and data types of an + IfcStructuralAnalysisModel, consult the IFC documentation. - :param structural_analysis_model: The IfcStructuralAnalysisModel entity you want to edit - :type structural_analysis_model: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None - """ - self.file = file - self.settings = {"structural_analysis_model": structural_analysis_model, "attributes": attributes or {}} + :param structural_analysis_model: The IfcStructuralAnalysisModel entity you want to edit + :type structural_analysis_model: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None + """ + settings = {"structural_analysis_model": structural_analysis_model, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["structural_analysis_model"], name, value) - return self.settings["structural_analysis_model"] + for name, value in settings["attributes"].items(): + setattr(settings["structural_analysis_model"], name, value) + return settings["structural_analysis_model"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py index e6814c5242..2674a4869e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py @@ -17,29 +17,26 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, condition=None, attributes=None): - """Edits the attributes of an IfcBoundaryCondition +def edit_structural_boundary_condition(file, condition=None, attributes=None) -> None: + """Edits the attributes of an IfcBoundaryCondition - For more information about the attributes and data types of an - IfcBoundaryCondition, consult the IFC documentation. + For more information about the attributes and data types of an + IfcBoundaryCondition, consult the IFC documentation. - :param condition: The IfcBoundaryCondition entity you want to edit - :type condition: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None - """ - self.file = file - self.settings = {"condition": condition, "attributes": attributes or {}} + :param condition: The IfcBoundaryCondition entity you want to edit + :type condition: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None + """ + settings = {"condition": condition, "attributes": attributes or {}} - def execute(self): - for name, data in self.settings["attributes"].items(): - if data["type"] == "string" or data["type"] == "null": - value = data["value"] - elif data["type"] == "IfcBoolean": - value = self.file.createIfcBoolean(data["value"]) - else: - value = self.file.create_entity(data["type"], data["value"]) - setattr(self.settings["condition"], name, value) + for name, data in settings["attributes"].items(): + if data["type"] == "string" or data["type"] == "null": + value = data["value"] + elif data["type"] == "IfcBoolean": + value = file.createIfcBoolean(data["value"]) + else: + value = file.create_entity(data["type"], data["value"]) + setattr(settings["condition"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py index a66bbb989e..89faa62ecd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py @@ -17,38 +17,35 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, structural_item=None, axis=None, ref_direction=None): - """Edits the coordinate system of a structural connection +def edit_structural_connection_cs(file, structural_item=None, axis=None, ref_direction=None) -> None: + """Edits the coordinate system of a structural connection - :param structural_item: The IfcStructuralItem you want to modify. - :type structural_item: ifcopenshell.entity_instance - :param axis: The unit Z axis vector defined as a list of 3 floats. - Defaults to [0., 0., 1.]. - :type axis: list[float] - :param ref_direction: The unit X axis vector defined as a list of 3 - floats. Defaults to [1., 0., 0.]. - :type ref_direction: list[float] - :return: None - :rtype: None - """ - self.file = file - self.settings = { - "structural_item": structural_item, - "axis": axis or [0.0, 0.0, 1.0], - "ref_direction": ref_direction or [1.0, 0.0, 0.0], - } + :param structural_item: The IfcStructuralItem you want to modify. + :type structural_item: ifcopenshell.entity_instance + :param axis: The unit Z axis vector defined as a list of 3 floats. + Defaults to [0., 0., 1.]. + :type axis: list[float] + :param ref_direction: The unit X axis vector defined as a list of 3 + floats. Defaults to [1., 0., 0.]. + :type ref_direction: list[float] + :return: None + :rtype: None + """ + settings = { + "structural_item": structural_item, + "axis": axis or [0.0, 0.0, 1.0], + "ref_direction": ref_direction or [1.0, 0.0, 0.0], + } - def execute(self): - if self.settings["structural_item"].ConditionCoordinateSystem is None: - point = self.file.createIfcCartesianPoint((0.0, 0.0, 0.0)) - ccs = self.file.createIfcAxis2Placement3D(point, None, None) - self.settings["structural_item"].ConditionCoordinateSystem = ccs + if settings["structural_item"].ConditionCoordinateSystem is None: + point = file.createIfcCartesianPoint((0.0, 0.0, 0.0)) + ccs = file.createIfcAxis2Placement3D(point, None, None) + settings["structural_item"].ConditionCoordinateSystem = ccs - ccs = self.settings["structural_item"].ConditionCoordinateSystem - if ccs.Axis and len(self.file.get_inverse(ccs.Axis)) == 1: - self.file.remove(ccs.Axis) - ccs.Axis = self.file.createIfcDirection(self.settings["axis"]) - if ccs.RefDirection and len(self.file.get_inverse(ccs.RefDirection)) == 1: - self.file.remove(ccs.RefDirection) - ccs.RefDirection = self.file.createIfcDirection(self.settings["ref_direction"]) + ccs = settings["structural_item"].ConditionCoordinateSystem + if ccs.Axis and len(file.get_inverse(ccs.Axis)) == 1: + file.remove(ccs.Axis) + ccs.Axis = file.createIfcDirection(settings["axis"]) + if ccs.RefDirection and len(file.get_inverse(ccs.RefDirection)) == 1: + file.remove(ccs.RefDirection) + ccs.RefDirection = file.createIfcDirection(settings["ref_direction"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py index ec4b163aca..dbb2541371 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py @@ -17,22 +17,19 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, structural_item=None, axis=None): - """Edits the coordinate system of a structural connection +def edit_structural_item_axis(file, structural_item=None, axis=None) -> None: + """Edits the coordinate system of a structural connection - :param structural_item: The IfcStructuralItem you want to modify. - :type structural_item: ifcopenshell.entity_instance - :param axis: The unit Z axis vector defined as a list of 3 floats. - Defaults to [0., 0., 1.]. - :type axis: list[float] - :return: None - :rtype: None - """ - self.file = file - self.settings = {"structural_item": structural_item, "axis": axis or [0.0, 0.0, 1.0]} + :param structural_item: The IfcStructuralItem you want to modify. + :type structural_item: ifcopenshell.entity_instance + :param axis: The unit Z axis vector defined as a list of 3 floats. + Defaults to [0., 0., 1.]. + :type axis: list[float] + :return: None + :rtype: None + """ + settings = {"structural_item": structural_item, "axis": axis or [0.0, 0.0, 1.0]} - def execute(self): - if len(self.file.get_inverse(self.settings["structural_item"].Axis)) == 1: - self.file.remove(self.settings["structural_item"].Axis) - self.settings["structural_item"].Axis = self.file.createIfcDirection(self.settings["axis"]) + if len(file.get_inverse(settings["structural_item"].Axis)) == 1: + file.remove(settings["structural_item"].Axis) + settings["structural_item"].Axis = file.createIfcDirection(settings["axis"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py index 3adba0ade9..2c577deb83 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py @@ -17,23 +17,20 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, structural_load=None, attributes=None): - """Edits the attributes of an IfcStructuralLoad +def edit_structural_load(file, structural_load=None, attributes=None) -> None: + """Edits the attributes of an IfcStructuralLoad - For more information about the attributes and data types of an - IfcStructuralLoad, consult the IFC documentation. + For more information about the attributes and data types of an + IfcStructuralLoad, consult the IFC documentation. - :param structural_load: The IfcStructuralLoad entity you want to edit - :type structural_load: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None - """ - self.file = file - self.settings = {"structural_load": structural_load, "attributes": attributes or {}} + :param structural_load: The IfcStructuralLoad entity you want to edit + :type structural_load: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None + """ + settings = {"structural_load": structural_load, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["structural_load"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["structural_load"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py index cffce454bf..4c84573795 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py @@ -17,23 +17,20 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, load_case=None, attributes=None): - """Edits the attributes of an IfcStructuralLoadCase +def edit_structural_load_case(file, load_case=None, attributes=None) -> None: + """Edits the attributes of an IfcStructuralLoadCase - For more information about the attributes and data types of an - IfcStructuralLoadCase, consult the IFC documentation. + For more information about the attributes and data types of an + IfcStructuralLoadCase, consult the IFC documentation. - :param load_case: The IfcStructuralLoadCase entity you want to edit - :type load_case: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None - """ - self.file = file - self.settings = {"load_case": load_case, "attributes": attributes or {}} + :param load_case: The IfcStructuralLoadCase entity you want to edit + :type load_case: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None + """ + settings = {"load_case": load_case, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["load_case"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["load_case"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py index 4ebff6cc3d..b238562b18 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py @@ -20,28 +20,25 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, structural_analysis_model=None): - """Removes an analysis model +def remove_structural_analysis_model(file, structural_analysis_model=None) -> None: + """Removes an analysis model - Note that the contents of an analysis model are currently preserved. + Note that the contents of an analysis model are currently preserved. - :param structural_analysis_model: The IfcStructuralAnalysisModel to - remove. - :type structural_analysis_model: ifcopenshell.entity_instance - :return: None - :rtype: None - """ - self.file = file - self.settings = {"structural_analysis_model": structural_analysis_model} + :param structural_analysis_model: The IfcStructuralAnalysisModel to + remove. + :type structural_analysis_model: ifcopenshell.entity_instance + :return: None + :rtype: None + """ + settings = {"structural_analysis_model": structural_analysis_model} - def execute(self): - for rel in self.settings["structural_analysis_model"].IsGroupedBy or []: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - history = self.settings["structural_analysis_model"].OwnerHistory - self.file.remove(self.settings["structural_analysis_model"]) + for rel in settings["structural_analysis_model"].IsGroupedBy or []: + history = rel.OwnerHistory + file.remove(rel) if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + ifcopenshell.util.element.remove_deep2(file, history) + history = settings["structural_analysis_model"].OwnerHistory + file.remove(settings["structural_analysis_model"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py index 02cfb79e3c..7aa4f6bd74 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py @@ -17,31 +17,28 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, connection=None, boundary_condition=None): - """Removes a condition from a connection, or an orphased boundary condition +def remove_structural_boundary_condition(file, connection=None, boundary_condition=None) -> None: + """Removes a condition from a connection, or an orphased boundary condition - :param connection: The IfcStructuralConnection to remove the condition - from. If omitted, it is assumed to be an orphaned condition. - :type connection: ifcopenshell.entity_instance,optional - :param boundary_condition: The IfcBoundaryCondition to remove. - :type boundary_condition: ifcopenshell.entity_instance - :return: None - :rtype: None - """ - self.file = file - self.settings = {"connection": connection, "boundary_condition": boundary_condition} + :param connection: The IfcStructuralConnection to remove the condition + from. If omitted, it is assumed to be an orphaned condition. + :type connection: ifcopenshell.entity_instance,optional + :param boundary_condition: The IfcBoundaryCondition to remove. + :type boundary_condition: ifcopenshell.entity_instance + :return: None + :rtype: None + """ + settings = {"connection": connection, "boundary_condition": boundary_condition} - def execute(self): - if self.settings["connection"]: - # remove boundary condition from a connection - if not self.settings["connection"].AppliedCondition: - return - if len(self.file.get_inverse(self.settings["connection"].AppliedCondition)) == 1: - self.file.remove(self.settings["connection"].AppliedCondition) - self.settings["connection"].AppliedCondition = None - else: - # remove the boundary condition - for conn in self.file.get_inverse(self.settings["boundary_condition"]): - conn.AppliedCondition = None - self.file.remove(self.settings["boundary_condition"]) + if settings["connection"]: + # remove boundary condition from a connection + if not settings["connection"].AppliedCondition: + return + if len(file.get_inverse(settings["connection"].AppliedCondition)) == 1: + file.remove(settings["connection"].AppliedCondition) + settings["connection"].AppliedCondition = None + else: + # remove the boundary condition + for conn in file.get_inverse(settings["boundary_condition"]): + conn.AppliedCondition = None + file.remove(settings["boundary_condition"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py index 28ce9fc4c9..21ed51f712 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py @@ -21,28 +21,25 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, relation=None): - """Removes a relationship between a connection and a condition +def remove_structural_connection_condition(file, relation=None) -> None: + """Removes a relationship between a connection and a condition - The condition and the member itself is preserved. + The condition and the member itself is preserved. - :param relation: The IfcRelConnectsStructuralMember to remove. - :type relation: ifcopenshell.entity_instance - :return: None - :rtype: None - """ - self.file = file - self.settings = {"relation": relation} + :param relation: The IfcRelConnectsStructuralMember to remove. + :type relation: ifcopenshell.entity_instance + :return: None + :rtype: None + """ + settings = {"relation": relation} - def execute(self): - if self.settings["relation"].AppliedCondition: - ifcopenshell.api.run( - "structural.remove_structural_boundary_condition", - self.file, - connection=self.settings["relation"].RelatedStructuralConnection - ) - history = self.settings["relation"].OwnerHistory - self.file.remove(self.settings["relation"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + if settings["relation"].AppliedCondition: + ifcopenshell.api.run( + "structural.remove_structural_boundary_condition", + file, + connection=settings["relation"].RelatedStructuralConnection, + ) + history = settings["relation"].OwnerHistory + file.remove(settings["relation"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py index 55b83a7f1b..afe97029ab 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py @@ -17,17 +17,14 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, structural_load=None): - """Removes a structural load +def remove_structural_load(file, structural_load=None) -> None: + """Removes a structural load - :param structural_load: The IfcStructuralLoad to remove. - :type structural_load: ifcopenshell.entity_instance - :return: None - :rtype: None - """ - self.file = file - self.settings = {"structural_load": structural_load} + :param structural_load: The IfcStructuralLoad to remove. + :type structural_load: ifcopenshell.entity_instance + :return: None + :rtype: None + """ + settings = {"structural_load": structural_load} - def execute(self): - self.file.remove(self.settings["structural_load"]) + file.remove(settings["structural_load"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py index e331309239..de317ed354 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py @@ -21,25 +21,22 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, load_case=None): - """Removes a structural load case +def remove_structural_load_case(file, load_case=None) -> None: + """Removes a structural load case - :param load_case: The IfcStructuralLoadCase to remove. - :type load_case: ifcopenshell.entity_instance - :return: None - :rtype: None - """ - self.file = file - self.settings = {"load_case": load_case} + :param load_case: The IfcStructuralLoadCase to remove. + :type load_case: ifcopenshell.entity_instance + :return: None + :rtype: None + """ + settings = {"load_case": load_case} - def execute(self): - # TODO: do a deep purge - for rel in self.settings["load_case"].IsGroupedBy or []: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - history = self.settings["load_case"].OwnerHistory - self.file.remove(self.settings["load_case"]) - ifcopenshell.util.element.remove_deep2(self.file, history) + # TODO: do a deep purge + for rel in settings["load_case"].IsGroupedBy or []: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + history = settings["load_case"].OwnerHistory + file.remove(settings["load_case"]) + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py index 93500aba1b..541dd87811 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py @@ -21,27 +21,24 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, load_group=None): - """Removes a structural load group +def remove_structural_load_group(file, load_group=None) -> None: + """Removes a structural load group - :param load_group: The IfcStructuralLoadGroup to remove. - :type load_group: ifcopenshell.entity_instance - :return: None - :rtype: None - """ - self.file = file - self.settings = {"load_group": load_group} + :param load_group: The IfcStructuralLoadGroup to remove. + :type load_group: ifcopenshell.entity_instance + :return: None + :rtype: None + """ + settings = {"load_group": load_group} - def execute(self): - # TODO: do a deep purge - for inverse in self.file.get_inverse(self.settings["load_group"]): - if inverse.is_a("IfcRelAssignsToGroup") and len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - history = self.settings["load_group"].OwnerHistory - self.file.remove(self.settings["load_group"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + # TODO: do a deep purge + for inverse in file.get_inverse(settings["load_group"]): + if inverse.is_a("IfcRelAssignsToGroup") and len(inverse.RelatedObjects) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + history = settings["load_group"].OwnerHistory + file.remove(settings["load_group"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py index 5a86a6a9f3..b4dedc2832 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py @@ -21,35 +21,32 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, product=None, structural_analysis_model=None): - """Removes a relationship between a structural element and the analysis model +def unassign_structural_analysis_model(file, product=None, structural_analysis_model=None) -> None: + """Removes a relationship between a structural element and the analysis model - :param product: The structural element that is part of the analysis. - :type product: ifcopenshell.entity_instance - :param structural_analysis_model: The IfcStructuralAnalysisModel that - the structural element is related to. - :type structural_analysis_model: ifcopenshell.entity_instance - :return: None - :rtype: None - """ - self.file = file - self.settings = { - "product": product, - "structural_analysis_model": structural_analysis_model, - } + :param product: The structural element that is part of the analysis. + :type product: ifcopenshell.entity_instance + :param structural_analysis_model: The IfcStructuralAnalysisModel that + the structural element is related to. + :type structural_analysis_model: ifcopenshell.entity_instance + :return: None + :rtype: None + """ + settings = { + "product": product, + "structural_analysis_model": structural_analysis_model, + } - def execute(self): - if not self.settings["structural_analysis_model"].IsGroupedBy: - return - rel = self.settings["structural_analysis_model"].IsGroupedBy[0] - related_objects = set(rel.RelatedObjects) or set() - related_objects.remove(self.settings["product"]) - if len(related_objects): - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + if not settings["structural_analysis_model"].IsGroupedBy: + return + rel = settings["structural_analysis_model"].IsGroupedBy[0] + related_objects = set(rel.RelatedObjects) or set() + related_objects.remove(settings["product"]) + if len(related_objects): + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + else: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py index e0caddbe3c..df9fd47518 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py @@ -15,3 +15,16 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_style import add_style +from .add_surface_style import add_surface_style +from .add_surface_textures import add_surface_textures +from .assign_material_style import assign_material_style +from .assign_representation_styles import assign_representation_styles +from .edit_presentation_style import edit_presentation_style +from .edit_surface_style import edit_surface_style +from .remove_style import remove_style +from .remove_styled_representation import remove_styled_representation +from .remove_surface_style import remove_surface_style +from .unassign_material_style import unassign_material_style +from .unassign_representation_styles import unassign_representation_styles diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py index 650043039f..599feaef3d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py @@ -17,48 +17,45 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, name=None, ifc_class="IfcSurfaceStyle"): - """Add a new presentation style +def add_style(file, name=None, ifc_class="IfcSurfaceStyle") -> None: + """Add a new presentation style - A presentation style is a container of visual settings (called - presentation items) that affect the appearance of objects. There are - four types of style: + A presentation style is a container of visual settings (called + presentation items) that affect the appearance of objects. There are + four types of style: - - Surface styles, which give 3D objects (which have surfaces / faces) - their colours and textures. This is the most common type of style. - - Curve styles, which give 2D and 3D curves, lines, polylines, their - stroke thickness and colour. - - Fill area styles, which gives 2D polygons and flat 3D planes their - colours, hatch patterns, tiled patterns, and pattern scales. - - Text styles, which gives text their font family, weight, variant, - size, indentation, alignment, decoration, spacing, and transformation. + - Surface styles, which give 3D objects (which have surfaces / faces) + their colours and textures. This is the most common type of style. + - Curve styles, which give 2D and 3D curves, lines, polylines, their + stroke thickness and colour. + - Fill area styles, which gives 2D polygons and flat 3D planes their + colours, hatch patterns, tiled patterns, and pattern scales. + - Text styles, which gives text their font family, weight, variant, + size, indentation, alignment, decoration, spacing, and transformation. - Once you have created a presentation style object, you can further - define the properties of your style using other API functions by adding - presentation items, such as ifcopenshell.api.style.add_surface_style. + Once you have created a presentation style object, you can further + define the properties of your style using other API functions by adding + presentation items, such as ifcopenshell.api.style.add_surface_style. - :param name: The name of the style. Used to easily identify it using a - style library. - :type name: str,optional - :param ifc_class: Choose from IfcSurfaceStyle, IfcCurveStyle, - IfcFillAreaStyle, or IfcTextStyle. - :type ifc_class: str - :return: The newly created style element, based on the provided - ifc_class. - :rtype: ifcopenshell.entity_instance + :param name: The name of the style. Used to easily identify it using a + style library. + :type name: str,optional + :param ifc_class: Choose from IfcSurfaceStyle, IfcCurveStyle, + IfcFillAreaStyle, or IfcTextStyle. + :type ifc_class: str + :return: The newly created style element, based on the provided + ifc_class. + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Create a new surface style - style = ifcopenshell.api.run("style.add_style", model) - """ - self.file = file - self.settings = {"name": name, "ifc_class": ifc_class} + # Create a new surface style + style = ifcopenshell.api.run("style.add_style", model) + """ + settings = {"name": name, "ifc_class": ifc_class} - def execute(self): - if self.settings["ifc_class"] == "IfcSurfaceStyle": - # Name is filled out because Revit treats this incorrectly as the material name - return self.file.createIfcSurfaceStyle(self.settings["name"], "BOTH") + if settings["ifc_class"] == "IfcSurfaceStyle": + # Name is filled out because Revit treats this incorrectly as the material name + return file.createIfcSurfaceStyle(settings["name"], "BOTH") diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py index 32064811f9..c8f9c415d1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py @@ -20,117 +20,112 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, style=None, ifc_class="IfcSurfaceStyleShading", attributes=None): - """Adds a new presentation item to a surface style +def add_surface_style(file, style=None, ifc_class="IfcSurfaceStyleShading", attributes=None) -> None: + """Adds a new presentation item to a surface style - A surface style can have multiple different types of presentation items - assigned to it: + A surface style can have multiple different types of presentation items + assigned to it: - - Shading, this is the simplest item, which defines a single basic - colour and transparency that can be used to display the object on a - screen. It is an indicative colour of what the object would be in real - life. It is commonly incorrectly abused to colour code systems for MEP - equipment or object types for structural steel. If you just want to - give something a colour, this is what you need. - - Rendering, this is an advanced extension of shading, which includes - the definition of a shader for a rendering engine. You may select the - reflectance / lighting model such as PHYSICAL, for PBR style - rendering, or FLAT, for flat shading, or PHONG for older biased - rendering workflows. Based on the chosen lighting model, you may then - specify the appropriate colour maps, such as diffuse colours, - specularity, emissive component, etc. These lighting models are fully - compatible with glTF and X3D. This should be used if your model is - prepared to be rendered by a rendering engine which is compatible with - glTF / X3D shader descriptions. If you are doing archviz or 3D - rendering, this is what you need. - - Textures, this is a special type of Rendering presentation item that - uses image textures instead of single colours. Textures may be either - mapped using a bounding box stretch mapping, or with UV coordinates - for mesh-like geometry. - - Lighting, this is used to define photometrically accurate colour - parameters used in lighting simulation. If you are a simulationist, - this is what you need. - - Reflectance, this is a special type of Lighting presentation item - which includes some lesser used photometric properties, typically - required for advanced materials like glazing. - - External, this is for any other surface style defined using an - external URI. This is relevant if you are using a third-party non-glTF - compatible shader definition such as for Cycles, Renderman, V-Ray, - etc, or a complex lighting simulation definition, such as for - Radiance. + - Shading, this is the simplest item, which defines a single basic + colour and transparency that can be used to display the object on a + screen. It is an indicative colour of what the object would be in real + life. It is commonly incorrectly abused to colour code systems for MEP + equipment or object types for structural steel. If you just want to + give something a colour, this is what you need. + - Rendering, this is an advanced extension of shading, which includes + the definition of a shader for a rendering engine. You may select the + reflectance / lighting model such as PHYSICAL, for PBR style + rendering, or FLAT, for flat shading, or PHONG for older biased + rendering workflows. Based on the chosen lighting model, you may then + specify the appropriate colour maps, such as diffuse colours, + specularity, emissive component, etc. These lighting models are fully + compatible with glTF and X3D. This should be used if your model is + prepared to be rendered by a rendering engine which is compatible with + glTF / X3D shader descriptions. If you are doing archviz or 3D + rendering, this is what you need. + - Textures, this is a special type of Rendering presentation item that + uses image textures instead of single colours. Textures may be either + mapped using a bounding box stretch mapping, or with UV coordinates + for mesh-like geometry. + - Lighting, this is used to define photometrically accurate colour + parameters used in lighting simulation. If you are a simulationist, + this is what you need. + - Reflectance, this is a special type of Lighting presentation item + which includes some lesser used photometric properties, typically + required for advanced materials like glazing. + - External, this is for any other surface style defined using an + external URI. This is relevant if you are using a third-party non-glTF + compatible shader definition such as for Cycles, Renderman, V-Ray, + etc, or a complex lighting simulation definition, such as for + Radiance. - Shading is sufficient for the majority of basic models. + Shading is sufficient for the majority of basic models. - The attributes you specify will depend on the type of presentation item - you are adding. An example is shown below, but for full details please - refer to the IFC documentation. + The attributes you specify will depend on the type of presentation item + you are adding. An example is shown below, but for full details please + refer to the IFC documentation. - :param style: The IfcSurfaceStyle you want to add to presentation item - to. See ifcopenshell.api.style.add_style. - :type style: ifcopenshell.entity_instance - :param ifc_class: Choose from IfcSurfaceStyleShading, - IfcSurfaceStyleRendering, IfcSurfaceStyleWithTextures, - IfcSurfaceStyleLighting, IfcSurfaceStyleReflectance, or - IfcExternallyDefinedSurfaceStyle. - :type ifc_class: str - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: The newly created presentation item based on the provided - ifc_class. - :rtype: ifcopenshell.entity_instance + :param style: The IfcSurfaceStyle you want to add to presentation item + to. See ifcopenshell.api.style.add_style. + :type style: ifcopenshell.entity_instance + :param ifc_class: Choose from IfcSurfaceStyleShading, + IfcSurfaceStyleRendering, IfcSurfaceStyleWithTextures, + IfcSurfaceStyleLighting, IfcSurfaceStyleReflectance, or + IfcExternallyDefinedSurfaceStyle. + :type ifc_class: str + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: The newly created presentation item based on the provided + ifc_class. + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Create a new surface style - style = ifcopenshell.api.run("style.add_style", model) + # Create a new surface style + style = ifcopenshell.api.run("style.add_style", model) - # Create a simple shading colour and transparency. - ifcopenshell.api.run("style.add_surface_style", model, - style=style, ifc_class="IfcSurfaceStyleShading", attributes={ - "SurfaceColour": { "Name": None, "Red": 1.0, "Green": 0.8, "Blue": 0.8 }, - "Transparency": 0., # 0 is opaque, 1 is transparent - }) + # Create a simple shading colour and transparency. + ifcopenshell.api.run("style.add_surface_style", model, + style=style, ifc_class="IfcSurfaceStyleShading", attributes={ + "SurfaceColour": { "Name": None, "Red": 1.0, "Green": 0.8, "Blue": 0.8 }, + "Transparency": 0., # 0 is opaque, 1 is transparent + }) - # Alternatively, create a rendering style. - ifcopenshell.api.run("style.add_surface_style", model, - style=style, ifc_class="IfcSurfaceStyleRendering", attributes={ - # A surface colour and transparency is still supplied for - # viewport display only. This will supersede the shading - # presentation item. - "SurfaceColour": { "Name": None, "Red": 1.0, "Green": 0.8, "Blue": 0.8 }, - "Transparency": 0., # 0 is opaque, 1 is transparent + # Alternatively, create a rendering style. + ifcopenshell.api.run("style.add_surface_style", model, + style=style, ifc_class="IfcSurfaceStyleRendering", attributes={ + # A surface colour and transparency is still supplied for + # viewport display only. This will supersede the shading + # presentation item. + "SurfaceColour": { "Name": None, "Red": 1.0, "Green": 0.8, "Blue": 0.8 }, + "Transparency": 0., # 0 is opaque, 1 is transparent - # NOTDEFINED is assumed to be a PHYSICAL (PBR) lighting - # model. In IFC4X3, you may choose PHYSICAL directly. - "ReflectanceMethod": "NOTDEFINED", + # NOTDEFINED is assumed to be a PHYSICAL (PBR) lighting + # model. In IFC4X3, you may choose PHYSICAL directly. + "ReflectanceMethod": "NOTDEFINED", - # For PBR shading, you may specify these parameters: - "DiffuseColour": { "Name": None, "Red": 0.9, "Green": 0.8, "Blue": 0.8 }, - "SpecularColour": 0.1, # Metallic factor - "SpecularHighlight": {"SpecularRoughness": 0.5}, # Roughness factor - }) - """ - self.file = file - self.settings = {"style": style, "ifc_class": ifc_class, "attributes": attributes or {}} + # For PBR shading, you may specify these parameters: + "DiffuseColour": { "Name": None, "Red": 0.9, "Green": 0.8, "Blue": 0.8 }, + "SpecularColour": 0.1, # Metallic factor + "SpecularHighlight": {"SpecularRoughness": 0.5}, # Roughness factor + }) + """ + settings = {"style": style, "ifc_class": ifc_class, "attributes": attributes or {}} - def execute(self): - style_item = self.file.create_entity(self.settings["ifc_class"]) - ifcopenshell.api.run( - "style.edit_surface_style", self.file, style=style_item, attributes=self.settings["attributes"] - ) - styles = list(self.settings["style"].Styles or []) + style_item = file.create_entity(settings["ifc_class"]) + ifcopenshell.api.run("style.edit_surface_style", file, style=style_item, attributes=settings["attributes"]) + styles = list(settings["style"].Styles or []) - select_class = self.settings["ifc_class"] - if select_class == "IfcSurfaceStyleRendering": - select_class = "IfcSurfaceStyleShading" - duplicate_items = [s for s in styles if s.is_a(select_class)] - for duplicate_item in duplicate_items: - ifcopenshell.api.run("style.remove_surface_style", self.file, style=duplicate_item) + select_class = settings["ifc_class"] + if select_class == "IfcSurfaceStyleRendering": + select_class = "IfcSurfaceStyleShading" + duplicate_items = [s for s in styles if s.is_a(select_class)] + for duplicate_item in duplicate_items: + ifcopenshell.api.run("style.remove_surface_style", file, style=duplicate_item) - styles = list(self.settings["style"].Styles or []) - styles.append(style_item) - self.settings["style"].Styles = styles - return style_item + styles = list(settings["style"].Styles or []) + styles.append(style_item) + settings["style"].Styles = styles + return style_item diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py index 88aabfe801..9b6fbda053 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py @@ -20,39 +20,42 @@ import ifcopenshell import ifcopenshell.api +def add_surface_textures(file, material=None, uv_maps=None, textures=None) -> None: + """Add surface texture based on a Blender material definition or texture data. + + :param material: The Blender material definition with a node tree that + is compatible with glTF. See one of the valid combinations here: + https://docs.blender.org/manual/en/dev/addons/import_export/scene_gltf2.html + :type material: bpy.types.Material + :param uv_maps: A list of IfcIndexedTextureMap for any + IfcTessellatedFaceSets that the representation has, obtained from + the HasTextures attribute. + :type uv_maps: list[ifcopenshell.entity_instance] + :param textures: A list of dictionaries containing: + + 1. Attributes to create IfcImageTexture. + 2. One additional parameter `uv_mode` to map IfcImageTexture to correct + IfcTextureCoordinate type. + + Possible `uv_mode` values: + + * `UV` - use IfcTextureCoordinate from `uv_maps` parameter; + * `Generated` - IfcTextureCoordinateGenerator with mode COORD (autogenerated UV + based on geometry); + * `Camera` - IfcTextureCoordinateGenerator with mode COORD_EYE (autogenerated UV + based on camera position) + :type textures: list[dict] + :return: A list of IfcImageTexture + :rtype: list[ifcopenshell.entity_instance] + """ + usecase = Usecase() + # TODO: This usecase currently depends on Blender's data model + usecase.file = file + usecase.settings = {"material": material, "uv_maps": uv_maps or [], "textures": textures or []} + return usecase.execute() + + class Usecase: - def __init__(self, file, material=None, uv_maps=None, textures=None): - """Add surface texture based on a Blender material definition or texture data. - - :param material: The Blender material definition with a node tree that - is compatible with glTF. See one of the valid combinations here: - https://docs.blender.org/manual/en/dev/addons/import_export/scene_gltf2.html - :type material: bpy.types.Material - :param uv_maps: A list of IfcIndexedTextureMap for any - IfcTessellatedFaceSets that the representation has, obtained from - the HasTextures attribute. - :type uv_maps: list[ifcopenshell.entity_instance] - :param textures: A list of dictionaries containing: - - 1. Attributes to create IfcImageTexture. - 2. One additional parameter `uv_mode` to map IfcImageTexture to correct - IfcTextureCoordinate type. - - Possible `uv_mode` values: - - * `UV` - use IfcTextureCoordinate from `uv_maps` parameter; - * `Generated` - IfcTextureCoordinateGenerator with mode COORD (autogenerated UV - based on geometry); - * `Camera` - IfcTextureCoordinateGenerator with mode COORD_EYE (autogenerated UV - based on camera position) - :type textures: list[dict] - :return: A list of IfcImageTexture - :rtype: list[ifcopenshell.entity_instance] - """ - # TODO: This usecase currently depends on Blender's data model - self.file = file - self.settings = {"material": material, "uv_maps": uv_maps or [], "textures": textures or []} - def execute(self): if self.file.schema == "IFC2X3": # TODO: research how compatible IFC2X3 and IFC4 textures are diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py index 06d3a6339a..630a842bf6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py @@ -21,91 +21,96 @@ import ifcopenshell.api import ifcopenshell.util.element +def assign_material_style( + file, material=None, style=None, context=None, should_use_presentation_style_assignment=False +) -> None: + """Assigns a style to a material + + A style may either be assigned directly to an object's representation, + or to a material which is then associated with the object. If both + exist, then the style assigned directly to the object's representation + takes precedence. It is recommended to use materials and assign styles + to materials. This API function provides that capability. + + :param material: The IfcMaterial which you want to assign the style to. + :type material: ifcopenshell.entity_instance + :param style: The IfcPresentationStyle (typically IfcSurfaceStyle) that + you want to assign to the material. This will then be applied to all + objects that have that material. + :type style: ifcopenshell.entity_instance + :param context: The IfcGeometricRepresentationSubContext at which this + style should be used. Typically this is the Model BODY context. + :type context: ifcopenshell.entity_instance + :param should_use_presentation_style_assignment: This is a technical + detail to accomodate a bug in Revit. This should always be left as + the default of False, unless you are finding that colours aren't + showing up in Revit. In that case, set it to True, but keep in mind + that this is no longer a valid IFC. Blame Autodesk. + :type should_use_presentation_style_assignment: bool + :return: None + :rtype: None + + Example: + + .. code:: python + + # A model context is needed to store 3D geometry + model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") + + # Specifically, we want to store body geometry + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) + + # Let's create a new wall. The wall does not have any geometry yet. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # Let's use the "3D Body" representation we created earlier to add a + # new wall-like body geometry, 5 meters long, 3 meters high, and + # 200mm thick + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=5, height=3, thickness=0.2) + + # Assign our new body geometry back to our wall + ifcopenshell.api.run("geometry.assign_representation", model, + product=wall, representation=representation) + + # Place our wall at the origin + ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) + + # Let's prepare a concrete material. Note that our concrete material + # does not have any colours (styles) at this point. + concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") + + # Assign our concrete material to our wall + ifcopenshell.api.run("material.assign_material", model, + products=[wall], type="IfcMaterial", material=concrete) + + # Create a new surface style + style = ifcopenshell.api.run("style.add_style", model) + + # Create a simple grey shading colour and transparency. + ifcopenshell.api.run("style.add_surface_style", model, + style=style, ifc_class="IfcSurfaceStyleShading", attributes={ + "SurfaceColour": { "Name": None, "Red": 0.5, "Green": 0.5, "Blue": 0.5 }, + "Transparency": 0., # 0 is opaque, 1 is transparent + }) + + # Now any element (like our wall) with a concrete material will have + # a grey colour applied. + ifcopenshell.api.run("style.assign_material_style", model, material=concrete, style=style, context=body) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "material": material, + "style": style, + "context": context, + "should_use_presentation_style_assignment": should_use_presentation_style_assignment, + } + return usecase.execute() + + class Usecase: - def __init__(self, file, material=None, style=None, context=None, should_use_presentation_style_assignment=False): - """Assigns a style to a material - - A style may either be assigned directly to an object's representation, - or to a material which is then associated with the object. If both - exist, then the style assigned directly to the object's representation - takes precedence. It is recommended to use materials and assign styles - to materials. This API function provides that capability. - - :param material: The IfcMaterial which you want to assign the style to. - :type material: ifcopenshell.entity_instance - :param style: The IfcPresentationStyle (typically IfcSurfaceStyle) that - you want to assign to the material. This will then be applied to all - objects that have that material. - :type style: ifcopenshell.entity_instance - :param context: The IfcGeometricRepresentationSubContext at which this - style should be used. Typically this is the Model BODY context. - :type context: ifcopenshell.entity_instance - :param should_use_presentation_style_assignment: This is a technical - detail to accomodate a bug in Revit. This should always be left as - the default of False, unless you are finding that colours aren't - showing up in Revit. In that case, set it to True, but keep in mind - that this is no longer a valid IFC. Blame Autodesk. - :type should_use_presentation_style_assignment: bool - :return: None - :rtype: None - - Example: - - .. code:: python - - # A model context is needed to store 3D geometry - model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") - - # Specifically, we want to store body geometry - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) - - # Let's create a new wall. The wall does not have any geometry yet. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # Let's use the "3D Body" representation we created earlier to add a - # new wall-like body geometry, 5 meters long, 3 meters high, and - # 200mm thick - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=5, height=3, thickness=0.2) - - # Assign our new body geometry back to our wall - ifcopenshell.api.run("geometry.assign_representation", model, - product=wall, representation=representation) - - # Place our wall at the origin - ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) - - # Let's prepare a concrete material. Note that our concrete material - # does not have any colours (styles) at this point. - concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") - - # Assign our concrete material to our wall - ifcopenshell.api.run("material.assign_material", model, - products=[wall], type="IfcMaterial", material=concrete) - - # Create a new surface style - style = ifcopenshell.api.run("style.add_style", model) - - # Create a simple grey shading colour and transparency. - ifcopenshell.api.run("style.add_surface_style", model, - style=style, ifc_class="IfcSurfaceStyleShading", attributes={ - "SurfaceColour": { "Name": None, "Red": 0.5, "Green": 0.5, "Blue": 0.5 }, - "Transparency": 0., # 0 is opaque, 1 is transparent - }) - - # Now any element (like our wall) with a concrete material will have - # a grey colour applied. - ifcopenshell.api.run("style.assign_material_style", model, material=concrete, style=style, context=body) - """ - self.file = file - self.settings = { - "material": material, - "style": style, - "context": context, - "should_use_presentation_style_assignment": should_use_presentation_style_assignment, - } - def execute(self): self.style = self.settings["style"] if self.file.schema == "IFC2X3" or self.settings["should_use_presentation_style_assignment"]: diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py b/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py index c6236c8a4a..e2f5daf766 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py @@ -17,98 +17,100 @@ # along with IfcOpenShell. If not, see . +def assign_representation_styles( + file, + shape_representation=None, + styles=None, + replace_previous_same_type_style=True, + should_use_presentation_style_assignment=False, +) -> None: + """Assigns a style directly to an object representation + + A style may either be assigned directly to an object's representation, + or to a material which is then associated with the object. If both + exist, then the style assigned directly to the object's representation + takes precedence. It is recommended to use materials and assign styles + to materials. However, sometimes you may want to assign colours directly + to the object representation as an override. This API function provides + that capability. + + If you want to assign styles to a material instead (recommended), then + please see ifcopenshell.api.style.assign_material_style. + + :param shape_representation: The IfcShapeRepresentation of the object + that you want to assign styles to. This implicitly defines the + context at which the styles should be used. + :type shape_representation: ifcopenshell.entity_instance + :param styles: A list of presentation styles, typically IfcSurfaceStyle. + The number of items in the list should correlate with the number of + items in the shape_representation's Items attribute. If you have + more items than styles, the last style is used. + :type styles: list[ifcopenshell.entity_instance] + :param replace_previous_same_type_style: Remove previously assigned styles + of the same type as currently assign style`. Defaults to `True`. + :type replace_previous_same_type_style: bool + :param should_use_presentation_style_assignment: This is a technical + detail to accomodate a bug in Revit. This should always be left as + the default of False, unless you are finding that colours aren't + showing up in Revit. In that case, set it to True, but keep in mind + that this is no longer a valid IFC. Blame Autodesk. + :type should_use_presentation_style_assignment: bool + :return: List of created IfcStyledItems + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # A model context is needed to store 3D geometry + model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") + + # Specifically, we want to store body geometry + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) + + # Let's create a new wall. The wall does not have any geometry yet. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # Let's use the "3D Body" representation we created earlier to add a + # new wall-like body geometry, 5 meters long, 3 meters high, and + # 200mm thick + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=5, height=3, thickness=0.2) + + # Assign our new body geometry back to our wall + ifcopenshell.api.run("geometry.assign_representation", model, + product=wall, representation=representation) + + # Place our wall at the origin + ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) + + # Create a new surface style + style = ifcopenshell.api.run("style.add_style", model) + + # Create a simple grey shading colour and transparency. + ifcopenshell.api.run("style.add_surface_style", model, + style=style, ifc_class="IfcSurfaceStyleShading", attributes={ + "SurfaceColour": { "Name": None, "Red": 0.5, "Green": 0.5, "Blue": 0.5 }, + "Transparency": 0., # 0 is opaque, 1 is transparent + }) + + # Now specifically our wall only will be coloured grey. + ifcopenshell.api.run("style.assign_representation_styles", model, + shape_representation=representation, styles=[style]) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "shape_representation": shape_representation, + "styles": styles or [], + "replace_previous_same_type_style": replace_previous_same_type_style, + "should_use_presentation_style_assignment": should_use_presentation_style_assignment, + } + return usecase.execute() + + class Usecase: - def __init__( - self, - file, - shape_representation=None, - styles=None, - replace_previous_same_type_style=True, - should_use_presentation_style_assignment=False, - ): - """Assigns a style directly to an object representation - - A style may either be assigned directly to an object's representation, - or to a material which is then associated with the object. If both - exist, then the style assigned directly to the object's representation - takes precedence. It is recommended to use materials and assign styles - to materials. However, sometimes you may want to assign colours directly - to the object representation as an override. This API function provides - that capability. - - If you want to assign styles to a material instead (recommended), then - please see ifcopenshell.api.style.assign_material_style. - - :param shape_representation: The IfcShapeRepresentation of the object - that you want to assign styles to. This implicitly defines the - context at which the styles should be used. - :type shape_representation: ifcopenshell.entity_instance - :param styles: A list of presentation styles, typically IfcSurfaceStyle. - The number of items in the list should correlate with the number of - items in the shape_representation's Items attribute. If you have - more items than styles, the last style is used. - :type styles: list[ifcopenshell.entity_instance] - :param replace_previous_same_type_style: Remove previously assigned styles - of the same type as currently assign style`. Defaults to `True`. - :type replace_previous_same_type_style: bool - :param should_use_presentation_style_assignment: This is a technical - detail to accomodate a bug in Revit. This should always be left as - the default of False, unless you are finding that colours aren't - showing up in Revit. In that case, set it to True, but keep in mind - that this is no longer a valid IFC. Blame Autodesk. - :type should_use_presentation_style_assignment: bool - :return: List of created IfcStyledItems - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # A model context is needed to store 3D geometry - model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") - - # Specifically, we want to store body geometry - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) - - # Let's create a new wall. The wall does not have any geometry yet. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # Let's use the "3D Body" representation we created earlier to add a - # new wall-like body geometry, 5 meters long, 3 meters high, and - # 200mm thick - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=5, height=3, thickness=0.2) - - # Assign our new body geometry back to our wall - ifcopenshell.api.run("geometry.assign_representation", model, - product=wall, representation=representation) - - # Place our wall at the origin - ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) - - # Create a new surface style - style = ifcopenshell.api.run("style.add_style", model) - - # Create a simple grey shading colour and transparency. - ifcopenshell.api.run("style.add_surface_style", model, - style=style, ifc_class="IfcSurfaceStyleShading", attributes={ - "SurfaceColour": { "Name": None, "Red": 0.5, "Green": 0.5, "Blue": 0.5 }, - "Transparency": 0., # 0 is opaque, 1 is transparent - }) - - # Now specifically our wall only will be coloured grey. - ifcopenshell.api.run("style.assign_representation_styles", model, - shape_representation=representation, styles=[style]) - """ - self.file = file - self.settings = { - "shape_representation": shape_representation, - "styles": styles or [], - "replace_previous_same_type_style": replace_previous_same_type_style, - "should_use_presentation_style_assignment": should_use_presentation_style_assignment, - } - def execute(self): if not self.settings["styles"]: return [] diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py index 877d0f89c2..268acfdc2e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py @@ -17,33 +17,30 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, style=None, attributes=None): - """Edits the attributes of an IfcPresentationStyle +def edit_presentation_style(file, style=None, attributes=None) -> None: + """Edits the attributes of an IfcPresentationStyle - For more information about the attributes and data types of an - IfcPresentationStyle, consult the IFC documentation. + For more information about the attributes and data types of an + IfcPresentationStyle, consult the IFC documentation. - :param style: The IfcPresentationStyle entity you want to edit - :type style: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param style: The IfcPresentationStyle entity you want to edit + :type style: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Create a new surface style - style = ifcopenshell.api.run("style.add_style", model) + # Create a new surface style + style = ifcopenshell.api.run("style.add_style", model) - # Change the name of the style to "Foo" - ifcopenshell.api.run("style.edit_presentation_style", model, style=style, attributes={"Name": "Foo"}) - """ - self.file = file - self.settings = {"style": style, "attributes": attributes or {}} + # Change the name of the style to "Foo" + ifcopenshell.api.run("style.edit_presentation_style", model, style=style, attributes={"Name": "Foo"}) + """ + settings = {"style": style, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["style"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["style"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py index 20c1002fdf..b8c7a30be8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py @@ -17,61 +17,64 @@ # along with IfcOpenShell. If not, see . +def edit_surface_style(file, style=None, attributes=None) -> None: + """Edits the attributes of an IfcPresentationItem + + For more information about the attributes and data types of an + IfcPresentationItem, consult the IFC documentation. + + The IfcPresentationItem is expected to be one of IfcSurfaceStyleShading, + IfcSurfaceStyleRendering, IfcSurfaceStyleWithTextures, + IfcSurfaceStyleLighting, IfcSurfaceStyleReflectance, or + IfcExternallyDefinedSurfaceStyle. + + To represent a colour, a nested dictionary should be used. See the + example below. + + :param style: The IfcPresentationStyle entity you want to edit + :type style: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None + + Example: + + .. code:: python + + # Create a new surface style + style = ifcopenshell.api.run("style.add_style", model) + + # Create a blank rendering style. + rendering = ifcopenshell.api.run("style.add_surface_style", model, + style=style, ifc_class="IfcSurfaceStyleRendering") + + # Edit the attributes of the rendering style. + ifcopenshell.api.run("style.edit_surface_style", model, + style=rendering, attributes={ + # A surface colour and transparency is still supplied for + # viewport display only. This will supersede the shading + # presentation item. + "SurfaceColour": { "Name": None, "Red": 1.0, "Green": 0.8, "Blue": 0.8 }, + "Transparency": 0., # 0 is opaque, 1 is transparent + + # NOTDEFINED is assumed to be a PHYSICAL (PBR) lighting + # model. In IFC4X3, you may choose PHYSICAL directly. + "ReflectanceMethod": "NOTDEFINED", + + # For PBR shading, you may specify these parameters: + "DiffuseColour": { "Name": None, "Red": 0.9, "Green": 0.8, "Blue": 0.8 }, + "SpecularColour": 0.1, # Metallic factor + "SpecularHighlight": {"SpecularRoughness": 0.5}, # Roughness factor + }) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"style": style, "attributes": attributes or {}} + return usecase.execute() + + class Usecase: - def __init__(self, file, style=None, attributes=None): - """Edits the attributes of an IfcPresentationItem - - For more information about the attributes and data types of an - IfcPresentationItem, consult the IFC documentation. - - The IfcPresentationItem is expected to be one of IfcSurfaceStyleShading, - IfcSurfaceStyleRendering, IfcSurfaceStyleWithTextures, - IfcSurfaceStyleLighting, IfcSurfaceStyleReflectance, or - IfcExternallyDefinedSurfaceStyle. - - To represent a colour, a nested dictionary should be used. See the - example below. - - :param style: The IfcPresentationStyle entity you want to edit - :type style: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None - - Example: - - .. code:: python - - # Create a new surface style - style = ifcopenshell.api.run("style.add_style", model) - - # Create a blank rendering style. - rendering = ifcopenshell.api.run("style.add_surface_style", model, - style=style, ifc_class="IfcSurfaceStyleRendering") - - # Edit the attributes of the rendering style. - ifcopenshell.api.run("style.edit_surface_style", model, - style=rendering, attributes={ - # A surface colour and transparency is still supplied for - # viewport display only. This will supersede the shading - # presentation item. - "SurfaceColour": { "Name": None, "Red": 1.0, "Green": 0.8, "Blue": 0.8 }, - "Transparency": 0., # 0 is opaque, 1 is transparent - - # NOTDEFINED is assumed to be a PHYSICAL (PBR) lighting - # model. In IFC4X3, you may choose PHYSICAL directly. - "ReflectanceMethod": "NOTDEFINED", - - # For PBR shading, you may specify these parameters: - "DiffuseColour": { "Name": None, "Red": 0.9, "Green": 0.8, "Blue": 0.8 }, - "SpecularColour": 0.1, # Metallic factor - "SpecularHighlight": {"SpecularRoughness": 0.5}, # Roughness factor - }) - """ - self.file = file - self.settings = {"style": style, "attributes": attributes or {}} - def execute(self): attributes = {} for attribute in self.settings["style"].wrapped_data.declaration().as_entity().all_attributes(): diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py index 40692982bb..453f511f2a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py @@ -19,30 +19,33 @@ import ifcopenshell.util.element +def remove_style(file, style=None) -> None: + """Removes a presentation style + + All of the presentation items of the style will also be removed. + + :param style: The IfcPresentationStyle to remove. + :type style: ifcopenshell.entity_instance + :return: None + :rtype: None + + Example: + + .. code:: python + + # Create a new surface style + style = ifcopenshell.api.run("style.add_style", model) + + # Not anymore! + ifcopenshell.api.run("style.remove_style", model, style=style) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"style": style} + return usecase.execute() + + class Usecase: - def __init__(self, file, style=None): - """Removes a presentation style - - All of the presentation items of the style will also be removed. - - :param style: The IfcPresentationStyle to remove. - :type style: ifcopenshell.entity_instance - :return: None - :rtype: None - - Example: - - .. code:: python - - # Create a new surface style - style = ifcopenshell.api.run("style.add_style", model) - - # Not anymore! - ifcopenshell.api.run("style.remove_style", model, style=style) - """ - self.file = file - self.settings = {"style": style} - def execute(self): self.purge_styled_items(self.settings["style"]) for style in self.settings["style"].Styles or []: diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py index ab061e182c..62ab7e4973 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py @@ -17,38 +17,35 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, representation=None): - """Removes a styled representation +def remove_styled_representation(file, representation=None) -> None: + """Removes a styled representation - Styled representations are typically associated with materials. This - removes the representation but not the underlying styles. + Styled representations are typically associated with materials. This + removes the representation but not the underlying styles. - :param representation: The IfcStyledRepresentation to remove. - :type representation: ifcopenshell.entity_instance - :return: None - :rtype: None + :param representation: The IfcStyledRepresentation to remove. + :type representation: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Remove a styled representation - ifcopenshell.api.run("style.remove_styled_representation", model, representation=representation) - """ - self.file = file - self.settings = {"representation": representation} + # Remove a styled representation + ifcopenshell.api.run("style.remove_styled_representation", model, representation=representation) + """ + settings = {"representation": representation} - def execute(self): - for inverse in self.file.get_inverse(self.settings["representation"]): - if inverse.is_a("IfcMaterialDefinitionRepresentation") and len(inverse.Representations) == 1: - self.file.remove(inverse) + for inverse in file.get_inverse(settings["representation"]): + if inverse.is_a("IfcMaterialDefinitionRepresentation") and len(inverse.Representations) == 1: + file.remove(inverse) - for item in self.settings["representation"].Items: - if item.is_a("IfcStyledItem") and self.file.get_total_inverses(item) == 1: - for style in item.Styles: - if style.is_a("IfcPresentationStyleAssignment"): - self.file.remove(style) - self.file.remove(item) + for item in settings["representation"].Items: + if item.is_a("IfcStyledItem") and file.get_total_inverses(item) == 1: + for style in item.Styles: + if style.is_a("IfcPresentationStyleAssignment"): + file.remove(style) + file.remove(item) - self.file.remove(self.settings["representation"]) + file.remove(settings["representation"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py index ce214dbf21..9621d5b51a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py @@ -20,50 +20,47 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, style=None): - """Removes a presentation item from a presentation style +def remove_surface_style(file, style=None) -> None: + """Removes a presentation item from a presentation style - :param style: The IfcPresentationItem to remove. - :type style: ifcopenshell.entity_instance - :return: None - :rtype: None + :param style: The IfcPresentationItem to remove. + :type style: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Create a new surface style - style = ifcopenshell.api.run("style.add_style", model) + # Create a new surface style + style = ifcopenshell.api.run("style.add_style", model) - # Create a simple shading colour and transparency. - shading = ifcopenshell.api.run("style.add_surface_style", model, - style=style, ifc_class="IfcSurfaceStyleShading", attributes={ - "SurfaceColour": { "Name": None, "Red": 1.0, "Green": 0.8, "Blue": 0.8 }, - "Transparency": 0., # 0 is opaque, 1 is transparent - }) + # Create a simple shading colour and transparency. + shading = ifcopenshell.api.run("style.add_surface_style", model, + style=style, ifc_class="IfcSurfaceStyleShading", attributes={ + "SurfaceColour": { "Name": None, "Red": 1.0, "Green": 0.8, "Blue": 0.8 }, + "Transparency": 0., # 0 is opaque, 1 is transparent + }) - # Remove the shading item - ifcopenshell.api.run("style.remove_surface_style", model, style=shading) - """ - self.file = file - self.settings = {"style": style} + # Remove the shading item + ifcopenshell.api.run("style.remove_surface_style", model, style=shading) + """ + settings = {"style": style} - def execute(self): - to_delete = set() - if self.settings["style"].is_a("IfcSurfaceStyleWithTextures"): - for texture in self.settings["style"].Textures or []: - if texture.IsMappedBy: - for coordinate in texture.IsMappedBy: - to_delete.add(coordinate) - else: - to_delete.add(texture) + to_delete = set() + if settings["style"].is_a("IfcSurfaceStyleWithTextures"): + for texture in settings["style"].Textures or []: + if texture.IsMappedBy: + for coordinate in texture.IsMappedBy: + to_delete.add(coordinate) + else: + to_delete.add(texture) - for attribute in self.settings["style"]: - if isinstance(attribute, ifcopenshell.entity_instance) and attribute.id(): - to_delete.add(attribute) + for attribute in settings["style"]: + if isinstance(attribute, ifcopenshell.entity_instance) and attribute.id(): + to_delete.add(attribute) - self.file.remove(self.settings["style"]) + file.remove(settings["style"]) - for element in to_delete: - ifcopenshell.util.element.remove_deep2(self.file, element) + for element in to_delete: + ifcopenshell.util.element.remove_deep2(file, element) diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py index f1e2e7e85b..59b37a1935 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py @@ -20,78 +20,75 @@ import ifcopenshell -class Usecase: - def __init__(self, file, material=None, style=None, context=None): - """Unassigns a style to a material +def unassign_material_style(file, material=None, style=None, context=None) -> None: + """Unassigns a style to a material - This does the inverse of assign_material_style. + This does the inverse of assign_material_style. - :param material: The IfcMaterial which you want to unassign the style from. - :type material: ifcopenshell.entity_instance - :param style: The IfcPresentationStyle (typically IfcSurfaceStyle) that - you want to unassign from material. This will then be applied to all - objects that have that material. - :type style: ifcopenshell.entity_instance - :param context: The IfcGeometricRepresentationSubContext at which this - style should be unassigned. Typically this is the Model BODY context. - :type context: ifcopenshell.entity_instance - :return: None - :rtype: None + :param material: The IfcMaterial which you want to unassign the style from. + :type material: ifcopenshell.entity_instance + :param style: The IfcPresentationStyle (typically IfcSurfaceStyle) that + you want to unassign from material. This will then be applied to all + objects that have that material. + :type style: ifcopenshell.entity_instance + :param context: The IfcGeometricRepresentationSubContext at which this + style should be unassigned. Typically this is the Model BODY context. + :type context: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - ifcopenshell.api.run("style.unassign_material_style", model, material=concrete, style=style, context=body) - """ - self.file = file - self.settings = { - "material": material, - "style": style, - "context": context, - } + ifcopenshell.api.run("style.unassign_material_style", model, material=concrete, style=style, context=body) + """ + settings = { + "material": material, + "style": style, + "context": context, + } - def execute(self): - for definition in self.settings["material"].HasRepresentation: - for representation in definition.Representations: - if not representation.is_a("IfcStyledRepresentation"): - continue - if representation.ContextOfItems != self.settings["context"]: - continue - for item in representation.Items: - if not item.is_a("IfcStyledItem"): - continue - styles = [s for s in item.Styles if s != self.settings["style"]] - if not styles: - self.file.remove(item) - elif len(styles) != len(item.Styles): - item.Styles = styles - if not representation.Items: - self.file.remove(representation) - if not definition.Representations: - self.file.remove(definition) - - # handle material constituents and shape aspects - material_constituents_names = [] - for inverse in self.file.get_inverse(self.settings["material"]): - if inverse.is_a("IfcMaterialConstituent") and inverse.Name: - material_constituents_names.append(inverse.Name) - if not material_constituents_names: - return - - elements = ifcopenshell.util.element.get_elements_by_material(self.file, self.settings["material"]) - shape_aspects = [] - for element in elements: - shape_aspects += ifcopenshell.util.element.get_shape_aspects(element) - - for shape_aspect in shape_aspects: - if shape_aspect.Name not in material_constituents_names: + for definition in settings["material"].HasRepresentation: + for representation in definition.Representations: + if not representation.is_a("IfcStyledRepresentation"): continue + if representation.ContextOfItems != settings["context"]: + continue + for item in representation.Items: + if not item.is_a("IfcStyledItem"): + continue + styles = [s for s in item.Styles if s != settings["style"]] + if not styles: + file.remove(item) + elif len(styles) != len(item.Styles): + item.Styles = styles + if not representation.Items: + file.remove(representation) + if not definition.Representations: + file.remove(definition) - for rep in shape_aspect.ShapeRepresentations: - ifcopenshell.api.run( - "style.unassign_representation_styles", - self.file, - shape_representation=rep, - styles=[self.settings["style"]], - ) + # handle material constituents and shape aspects + material_constituents_names = [] + for inverse in file.get_inverse(settings["material"]): + if inverse.is_a("IfcMaterialConstituent") and inverse.Name: + material_constituents_names.append(inverse.Name) + if not material_constituents_names: + return + + elements = ifcopenshell.util.element.get_elements_by_material(file, settings["material"]) + shape_aspects = [] + for element in elements: + shape_aspects += ifcopenshell.util.element.get_shape_aspects(element) + + for shape_aspect in shape_aspects: + if shape_aspect.Name not in material_constituents_names: + continue + + for rep in shape_aspect.ShapeRepresentations: + ifcopenshell.api.run( + "style.unassign_representation_styles", + file, + shape_representation=rep, + styles=[settings["style"]], + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py index 83f60fe3d4..14f52e9c6e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py @@ -17,43 +17,48 @@ # along with IfcOpenShell. If not, see . +def unassign_representation_styles( + file, shape_representation=None, styles=None, should_use_presentation_style_assignment=False +) -> None: + """Unassigns styles directly assigned to an object representation + + This does the inverse of assign_representation_styles. + + :param shape_representation: The IfcShapeRepresentation of the object + that you want to unassign styles from. + :type shape_representation: ifcopenshell.entity_instance + :param styles: A list of presentation styles, typically IfcSurfaceStyle. + The number of items in the list should correlate with the number of + items in the shape_representation's Items attribute. If you have + more items than styles, the last style is used. + :type styles: list[ifcopenshell.entity_instance] + :param should_use_presentation_style_assignment: This is a technical + detail to accomodate a bug in Revit. This should always be left as + the default of False, unless you are finding that colours aren't + showing up in Revit. In that case, set it to True, but keep in mind + that this is no longer a valid IFC. Blame Autodesk. + :type should_use_presentation_style_assignment: bool + :return: None + :rtype: None + + Example: + + .. code:: python + + ifcopenshell.api.run("style.unassign_representation_styles", model, + shape_representation=representation, styles=[style]) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "shape_representation": shape_representation, + "styles": styles or [], + "should_use_presentation_style_assignment": should_use_presentation_style_assignment, + } + return usecase.execute() + + class Usecase: - def __init__(self, file, shape_representation=None, styles=None, should_use_presentation_style_assignment=False): - """Unassigns styles directly assigned to an object representation - - This does the inverse of assign_representation_styles. - - :param shape_representation: The IfcShapeRepresentation of the object - that you want to unassign styles from. - :type shape_representation: ifcopenshell.entity_instance - :param styles: A list of presentation styles, typically IfcSurfaceStyle. - The number of items in the list should correlate with the number of - items in the shape_representation's Items attribute. If you have - more items than styles, the last style is used. - :type styles: list[ifcopenshell.entity_instance] - :param should_use_presentation_style_assignment: This is a technical - detail to accomodate a bug in Revit. This should always be left as - the default of False, unless you are finding that colours aren't - showing up in Revit. In that case, set it to True, but keep in mind - that this is no longer a valid IFC. Blame Autodesk. - :type should_use_presentation_style_assignment: bool - :return: None - :rtype: None - - Example: - - .. code:: python - - ifcopenshell.api.run("style.unassign_representation_styles", model, - shape_representation=representation, styles=[style]) - """ - self.file = file - self.settings = { - "shape_representation": shape_representation, - "styles": styles or [], - "should_use_presentation_style_assignment": should_use_presentation_style_assignment, - } - def execute(self): if not self.settings["styles"]: return [] diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py index e0caddbe3c..14213ca168 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py @@ -15,3 +15,16 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_port import add_port +from .add_system import add_system +from .assign_flow_control import assign_flow_control +from .assign_port import assign_port +from .assign_system import assign_system +from .connect_port import connect_port +from .disconnect_port import disconnect_port +from .edit_system import edit_system +from .remove_system import remove_system +from .unassign_flow_control import unassign_flow_control +from .unassign_port import unassign_port +from .unassign_system import unassign_system diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py index f792ecc2fa..a3664cffbb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py @@ -20,44 +20,41 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, element=None): - """Adds a new distribution port to an element +def add_port(file, element=None) -> None: + """Adds a new distribution port to an element - A distribution port represents a connection point on an element, where - a distribution element may be connected to another distribution element. - For example, a duct segment will typically have two ports, one at either - end, because you can attach another segment or fitting to either end of - the duct segment. + A distribution port represents a connection point on an element, where + a distribution element may be connected to another distribution element. + For example, a duct segment will typically have two ports, one at either + end, because you can attach another segment or fitting to either end of + the duct segment. - This will both add a distribution port and automatically assign it to a - distribution element. + This will both add a distribution port and automatically assign it to a + distribution element. - :param element: The IfcDistributionElement you want to add a - distribution port to. - :type element: ifcopenshell.entity_instance - :return: The newly created IfcDistributionPort - :rtype: ifcopenshell.entity_instance + :param element: The IfcDistributionElement you want to add a + distribution port to. + :type element: ifcopenshell.entity_instance + :return: The newly created IfcDistributionPort + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Create a duct - duct = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") + # Create a duct + duct = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") - # Create 2 ports, one for either end. - port1 = ifcopenshell.api.run("system.add_port", model, element=duct) - port2 = ifcopenshell.api.run("system.add_port", model, element=duct) - """ - self.file = file - self.settings = { - "element": element, - } + # Create 2 ports, one for either end. + port1 = ifcopenshell.api.run("system.add_port", model, element=duct) + port2 = ifcopenshell.api.run("system.add_port", model, element=duct) + """ + settings = { + "element": element, + } - def execute(self): - port = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDistributionPort") - if self.settings["element"]: - ifcopenshell.api.run("system.assign_port", self.file, element=self.settings["element"], port=port) - return port + port = ifcopenshell.api.run("root.create_entity", file, ifc_class="IfcDistributionPort") + if settings["element"]: + ifcopenshell.api.run("system.assign_port", file, element=settings["element"], port=port) + return port diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py index 26c8cfe8fc..75027ee55a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py @@ -20,45 +20,42 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file: ifcopenshell.file, ifc_class: str = "IfcDistributionSystem"): - """Add a new distribution system +def add_system(file: ifcopenshell.file, ifc_class: str = "IfcDistributionSystem") -> ifcopenshell.entity_instance: + """Add a new distribution system - A distribution system is a group of distribution elements, like ducts, - pipes, pumps, filters, fans, and so on that distribute a medium (air, - liquid, or electricity) throughout a facility. Systems may be - hierarchical, with larger systems composed of smaller subsystems. + A distribution system is a group of distribution elements, like ducts, + pipes, pumps, filters, fans, and so on that distribute a medium (air, + liquid, or electricity) throughout a facility. Systems may be + hierarchical, with larger systems composed of smaller subsystems. - :param ifc_class: The type of system, chosen from IfcDistributionSystem - for mechanical, electrical, communications, plumbing, fire, or - security systems. Alternatively you may choose IfcBuildingSystem for - specialised building facade systems or similar. For IFC2X3, choose - IfcSystem. - :type ifc_class: str - :return: The newly created IfcSystem. - :rtype: ifcopenshell.entity_instance + :param ifc_class: The type of system, chosen from IfcDistributionSystem + for mechanical, electrical, communications, plumbing, fire, or + security systems. Alternatively you may choose IfcBuildingSystem for + specialised building facade systems or similar. For IFC2X3, choose + IfcSystem. + :type ifc_class: str + :return: The newly created IfcSystem. + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # A completely empty distribution system - system = ifcopenshell.api.run("system.add_system", model) - """ - self.file = file - self.settings = {"ifc_class": ifc_class} + # A completely empty distribution system + system = ifcopenshell.api.run("system.add_system", model) + """ + settings = {"ifc_class": ifc_class} - def execute(self) -> ifcopenshell.entity_instance: - ifc_class = self.settings["ifc_class"] - # workaround for failing default argument in ifc2x3 - if self.file.schema == "IFC2X3" and ifc_class == "IfcDistributionSystem": - ifc_class = "IfcSystem" + ifc_class = settings["ifc_class"] + # workaround for failing default argument in ifc2x3 + if file.schema == "IFC2X3" and ifc_class == "IfcDistributionSystem": + ifc_class = "IfcSystem" - return self.file.create_entity( - ifc_class, - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "Name": "Unnamed", - } - ) + return file.create_entity( + ifc_class, + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "Name": "Unnamed", + } + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py index aae80ab6eb..2254a43dec 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py @@ -20,66 +20,63 @@ import ifcopenshell import ifcopenshell.api -class Usecase: - def __init__(self, file, relating_flow_element=None, related_flow_control=None): - """Assigns to the flow element control element that either sense or control - some aspect of the flow element. +def assign_flow_control(file, relating_flow_element=None, related_flow_control=None) -> None: + """Assigns to the flow element control element that either sense or control + some aspect of the flow element. - Note that control can be assigned only to the one flow element. + Note that control can be assigned only to the one flow element. - :param related_flow_control: IfcDistributionControlElement - which may be used to impart control on the flow element - :type related_flow_control: ifcopenshell.entity_instance - :param relating_flow_element: The IfcDistributionFlowElement that is being controlled / sensed - :type relating_flow_element: ifcopenshell.entity_instance - :return: Matching or newly created IfcRelFlowControlElements. If control - is already assigned to some other element method will return None. - :rtype: ifcopenshell.entity_instance, None + :param related_flow_control: IfcDistributionControlElement + which may be used to impart control on the flow element + :type related_flow_control: ifcopenshell.entity_instance + :param relating_flow_element: The IfcDistributionFlowElement that is being controlled / sensed + :type relating_flow_element: ifcopenshell.entity_instance + :return: Matching or newly created IfcRelFlowControlElements. If control + is already assigned to some other element method will return None. + :rtype: ifcopenshell.entity_instance, None - Example: + Example: - .. code:: python + .. code:: python - flow_element = model.createIfcFlowSegment() - flow_control = model.createIfcController() - relation = ifcopenshell.api.run( - "system.assign_flow_control", model, - related_flow_control=flow_control, relating_flow_element=flow_element - ) - """ - self.file = file - self.settings = { - "relating_flow_element": relating_flow_element, - "related_flow_control": related_flow_control, - } + flow_element = model.createIfcFlowSegment() + flow_control = model.createIfcController() + relation = ifcopenshell.api.run( + "system.assign_flow_control", model, + related_flow_control=flow_control, relating_flow_element=flow_element + ) + """ + settings = { + "relating_flow_element": relating_flow_element, + "related_flow_control": related_flow_control, + } - def execute(self): - if self.settings["related_flow_control"].AssignedToFlowElement: - # only 1 control per 1 flow element is possible - assignment = self.settings["related_flow_control"].AssignedToFlowElement[0] - if assignment.RelatingFlowElement == self.settings["relating_flow_element"]: - return assignment - # return None if this control is already assigned to another flow element - return + if settings["related_flow_control"].AssignedToFlowElement: + # only 1 control per 1 flow element is possible + assignment = settings["related_flow_control"].AssignedToFlowElement[0] + if assignment.RelatingFlowElement == settings["relating_flow_element"]: + return assignment + # return None if this control is already assigned to another flow element + return - if self.settings["relating_flow_element"].HasControlElements: - assignment = self.settings["relating_flow_element"].HasControlElements[0] - if self.settings["related_flow_control"] in assignment.RelatedControlElements: - return assignment - - related_flow_controls = set(assignment.RelatedControlElements) - related_flow_controls.add(self.settings["related_flow_control"]) - assignment.RelatedControlElements = list(related_flow_controls) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": assignment}) + if settings["relating_flow_element"].HasControlElements: + assignment = settings["relating_flow_element"].HasControlElements[0] + if settings["related_flow_control"] in assignment.RelatedControlElements: return assignment - assignment = self.file.create_entity( - "IfcRelFlowControlElements", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedControlElements": [self.settings["related_flow_control"]], - "RelatingFlowElement": self.settings["relating_flow_element"], - }, - ) + related_flow_controls = set(assignment.RelatedControlElements) + related_flow_controls.add(settings["related_flow_control"]) + assignment.RelatedControlElements = list(related_flow_controls) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": assignment}) return assignment + + assignment = file.create_entity( + "IfcRelFlowControlElements", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatedControlElements": [settings["related_flow_control"]], + "RelatingFlowElement": settings["relating_flow_element"], + }, + ) + return assignment diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py index 728a935395..c424f8eb4b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py @@ -21,46 +21,49 @@ import ifcopenshell.api import ifcopenshell.util.placement +def assign_port(file, element=None, port=None) -> None: + """Assigns a port to an element + + If you have an orphaned port, you may assign it to a distribution + element using this function. Ports should typically not be orphaned, but + it may be useful when patching up models. + + :param element: The IfcDistributionElement to assign the port to. + :type element: ifcopenshell.entity_instance + :param port: The IfcDistributionPort you want to assign. + :type port: ifcopenshell.entity_instance + :return: The IfcRelNests relationship, or the + IfcRelConnectsPortToElement for IFC2X3. + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # Create a duct + duct = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") + + # Create 2 ports, one for either end. + port1 = ifcopenshell.api.run("system.add_port", model, element=duct) + port2 = ifcopenshell.api.run("system.add_port", model, element=duct) + + # Unassign one port for some weird reason. + ifcopenshell.api.run("system.unassign_port", model, element=duct, port=port1) + + # Reassign it back + ifcopenshell.api.run("system.assign_port", model, element=duct, port=port1) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "element": element, + "port": port, + } + return usecase.execute() + + class Usecase: - def __init__(self, file, element=None, port=None): - """Assigns a port to an element - - If you have an orphaned port, you may assign it to a distribution - element using this function. Ports should typically not be orphaned, but - it may be useful when patching up models. - - :param element: The IfcDistributionElement to assign the port to. - :type element: ifcopenshell.entity_instance - :param port: The IfcDistributionPort you want to assign. - :type port: ifcopenshell.entity_instance - :return: The IfcRelNests relationship, or the - IfcRelConnectsPortToElement for IFC2X3. - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # Create a duct - duct = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") - - # Create 2 ports, one for either end. - port1 = ifcopenshell.api.run("system.add_port", model, element=duct) - port2 = ifcopenshell.api.run("system.add_port", model, element=duct) - - # Unassign one port for some weird reason. - ifcopenshell.api.run("system.unassign_port", model, element=duct, port=port1) - - # Reassign it back - ifcopenshell.api.run("system.assign_port", model, element=duct, port=port1) - """ - self.file = file - self.settings = { - "element": element, - "port": port, - } - def execute(self): if self.file.schema == "IFC2X3": return self.execute_ifc2x3() diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_system.py index 20f5a8519f..e0b19c5165 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_system.py @@ -21,51 +21,47 @@ import ifcopenshell.api import ifcopenshell.util.system -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - system: ifcopenshell.entity_instance, - ): - """Assigns distribution elements to a system +def assign_system( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + system: ifcopenshell.entity_instance, +) -> None: + """Assigns distribution elements to a system - Note that it is not necessary to assign distribution ports to a system. + Note that it is not necessary to assign distribution ports to a system. - :param products: The list of IfcDistributionElements to assign to the system. - :type products: list[ifcopenshell.entity_instance] - :param system: The IfcSystem you want to assign the element to. - :type system: ifcopenshell.entity_instance - :return: The IfcRelAssignsToGroup relationship - or `None` if `products` was empty list. - :rtype: [ifcopenshell.entity_instance, None] + :param products: The list of IfcDistributionElements to assign to the system. + :type products: list[ifcopenshell.entity_instance] + :param system: The IfcSystem you want to assign the element to. + :type system: ifcopenshell.entity_instance + :return: The IfcRelAssignsToGroup relationship + or `None` if `products` was empty list. + :rtype: [ifcopenshell.entity_instance, None] - Example: + Example: - .. code:: python + .. code:: python - # A completely empty distribution system - system = ifcopenshell.api.run("system.add_system", model) + # A completely empty distribution system + system = ifcopenshell.api.run("system.add_system", model) - # Create a duct - duct = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") + # Create a duct + duct = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") - # This duct is part of the system - ifcopenshell.api.run("system.assign_system", model, products=[duct], system=system) - """ - self.file = file - self.settings = { - "products": products, - "system": system, - } + # This duct is part of the system + ifcopenshell.api.run("system.assign_system", model, products=[duct], system=system) + """ + settings = { + "products": products, + "system": system, + } - def execute(self): - system = self.settings["system"] - products = self.settings["products"] + system = settings["system"] + products = settings["products"] - if not all(ifcopenshell.util.system.is_assignable(failed_product := product, system) for product in products): - raise TypeError(f"You cannot assign an {failed_product.is_a()} to an {system.is_a()}") + if not all(ifcopenshell.util.system.is_assignable(failed_product := product, system) for product in products): + raise TypeError(f"You cannot assign an {failed_product.is_a()} to an {system.is_a()}") - rel = ifcopenshell.api.run("group.assign_group", self.file, products=products, group=system) - return rel + rel = ifcopenshell.api.run("group.assign_group", file, products=products, group=system) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py index 7d23dde1a7..f5773c5a21 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py @@ -21,84 +21,87 @@ import ifcopenshell.api import ifcopenshell.util.element +def connect_port(file, port1=None, port2=None, direction="NOTDEFINED", element=None) -> None: + """Connects two ports together + + A distribution element (e.g. a duct) may be connected to another + distribution element (e.g. a fitting) by connecting a port at one of the + duct to a port at the same end of the fitting. + + Ports may only have one connection, so you cannot have multiple things + connected to the same port. Nor can you have incompatible port + connections, such as an electrical port connected to an airflow port. + + Port connectivity may be explicit or implicit. Explicit connections are + where the port connectivity is described for every single distribution + element in detail. For example, a duct segment would have port + connections to a duct fitting, which would have port connections to + another duct segment, all the way from a fan to an air terminal exactly + as constructed on site. Implicit connections only consider the key + distribution control elements (e.g. the fan and the terminal) and ignore + all of the details of the duct segments and fittings in between. + Generally, explicit connectivity is preferred for later detailed design, + and implicit connectivity is preferred for early phase design. + + :param port1: The port of the first distribution element to connect. + :type port1: ifcopenshell.entity_instance + :param port2: The port of the second distribution element to connect. + :type port2: ifcopenshell.entity_instance + :param direction: The directionality of distribution flow through the + port connection. NOTDEFINED means that the direction has not yet + been determined. This is useful during preliminary system design. + SOURCE means that the flow is from the first element to the second + element. SINK means that the flow is from the second element to the + first element. SOURCEANDSINK means that flow is bi-directional + between the first and second element. SOURCEANDSINK is a relatively + rare scenario. + :type direction: str + :param element: Optionally set an element through which the port + connectivity is made, such as a segment or fitting. This is only to + be used for implicit port connectivity where the segments and + fittings are less important. + :type element: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # A completely empty distribution system + system = ifcopenshell.api.run("system.add_system", model) + + # Create a duct and a 90 degree bend fitting + duct = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") + fitting = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcDuctFitting", predefined_type="BEND") + + # The duct and fitting is part of the system + ifcopenshell.api.run("system.assign_system", model, products=[duct], system=system) + ifcopenshell.api.run("system.assign_system", model, products=[fitting], system=system) + + # Create 2 ports, one for either end of both the duct and fitting. + duct_port1 = ifcopenshell.api.run("system.add_port", model, element=duct) + duct_port2 = ifcopenshell.api.run("system.add_port", model, element=duct) + fitting_port1 = ifcopenshell.api.run("system.add_port", model, element=fitting) + fitting_port2 = ifcopenshell.api.run("system.add_port", model, element=fitting) + + # Connect the duct and fitting together. At this point, we have not + # yet determined the direction of the flow, so we leave direction as + # NOTDEFINED. + ifcopenshell.api.run("system.connect_port", model, port1=duct_port2, port2=fitting_port1) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "port1": port1, + "port2": port2, + "direction": direction, + "element": element, + } + return usecase.execute() + + class Usecase: - def __init__(self, file, port1=None, port2=None, direction="NOTDEFINED", element=None): - """Connects two ports together - - A distribution element (e.g. a duct) may be connected to another - distribution element (e.g. a fitting) by connecting a port at one of the - duct to a port at the same end of the fitting. - - Ports may only have one connection, so you cannot have multiple things - connected to the same port. Nor can you have incompatible port - connections, such as an electrical port connected to an airflow port. - - Port connectivity may be explicit or implicit. Explicit connections are - where the port connectivity is described for every single distribution - element in detail. For example, a duct segment would have port - connections to a duct fitting, which would have port connections to - another duct segment, all the way from a fan to an air terminal exactly - as constructed on site. Implicit connections only consider the key - distribution control elements (e.g. the fan and the terminal) and ignore - all of the details of the duct segments and fittings in between. - Generally, explicit connectivity is preferred for later detailed design, - and implicit connectivity is preferred for early phase design. - - :param port1: The port of the first distribution element to connect. - :type port1: ifcopenshell.entity_instance - :param port2: The port of the second distribution element to connect. - :type port2: ifcopenshell.entity_instance - :param direction: The directionality of distribution flow through the - port connection. NOTDEFINED means that the direction has not yet - been determined. This is useful during preliminary system design. - SOURCE means that the flow is from the first element to the second - element. SINK means that the flow is from the second element to the - first element. SOURCEANDSINK means that flow is bi-directional - between the first and second element. SOURCEANDSINK is a relatively - rare scenario. - :type direction: str - :param element: Optionally set an element through which the port - connectivity is made, such as a segment or fitting. This is only to - be used for implicit port connectivity where the segments and - fittings are less important. - :type element: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # A completely empty distribution system - system = ifcopenshell.api.run("system.add_system", model) - - # Create a duct and a 90 degree bend fitting - duct = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") - fitting = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcDuctFitting", predefined_type="BEND") - - # The duct and fitting is part of the system - ifcopenshell.api.run("system.assign_system", model, products=[duct], system=system) - ifcopenshell.api.run("system.assign_system", model, products=[fitting], system=system) - - # Create 2 ports, one for either end of both the duct and fitting. - duct_port1 = ifcopenshell.api.run("system.add_port", model, element=duct) - duct_port2 = ifcopenshell.api.run("system.add_port", model, element=duct) - fitting_port1 = ifcopenshell.api.run("system.add_port", model, element=fitting) - fitting_port2 = ifcopenshell.api.run("system.add_port", model, element=fitting) - - # Connect the duct and fitting together. At this point, we have not - # yet determined the direction of the flow, so we leave direction as - # NOTDEFINED. - ifcopenshell.api.run("system.connect_port", model, port1=duct_port2, port2=fitting_port1) - """ - self.file = file - self.settings = { - "port1": port1, - "port2": port2, - "direction": direction, - "element": element, - } - def execute(self): # Note: there are a number of ambiguities with port connectivity. We # assume system topology is represented by a directed graph. In other diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py index 071074e9e7..15d5890493 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py @@ -21,63 +21,60 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, port=None): - """Disconnects a port from any other port +def disconnect_port(file, port=None) -> None: + """Disconnects a port from any other port - A port may only be connected to one other port, so the other port is not - needed to be specified. + A port may only be connected to one other port, so the other port is not + needed to be specified. - :param port: The IfcDistributionPort to disconnect. - :type port: ifcopenshell.entity_instance - :return: None - :rtype: None + :param port: The IfcDistributionPort to disconnect. + :type port: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # A completely empty distribution system - system = ifcopenshell.api.run("system.add_system", model) + # A completely empty distribution system + system = ifcopenshell.api.run("system.add_system", model) - # Create a duct and a 90 degree bend fitting - duct = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") - fitting = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcDuctFitting", predefined_type="BEND") + # Create a duct and a 90 degree bend fitting + duct = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") + fitting = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcDuctFitting", predefined_type="BEND") - # The duct and fitting is part of the system - ifcopenshell.api.run("system.assign_system", model, products=[duct], system=system) - ifcopenshell.api.run("system.assign_system", model, products=[fitting], system=system) + # The duct and fitting is part of the system + ifcopenshell.api.run("system.assign_system", model, products=[duct], system=system) + ifcopenshell.api.run("system.assign_system", model, products=[fitting], system=system) - # Create 2 ports, one for either end of both the duct and fitting. - duct_port1 = ifcopenshell.api.run("system.add_port", model, element=duct) - duct_port2 = ifcopenshell.api.run("system.add_port", model, element=duct) - fitting_port1 = ifcopenshell.api.run("system.add_port", model, element=fitting) - fitting_port2 = ifcopenshell.api.run("system.add_port", model, element=fitting) + # Create 2 ports, one for either end of both the duct and fitting. + duct_port1 = ifcopenshell.api.run("system.add_port", model, element=duct) + duct_port2 = ifcopenshell.api.run("system.add_port", model, element=duct) + fitting_port1 = ifcopenshell.api.run("system.add_port", model, element=fitting) + fitting_port2 = ifcopenshell.api.run("system.add_port", model, element=fitting) - # Connect the duct and fitting together. At this point, we have not - # yet determined the direction of the flow, so we leave direction as - # NOTDEFINED. - ifcopenshell.api.run("system.connect_port", model, port1=duct_port2, port2=fitting_port1) + # Connect the duct and fitting together. At this point, we have not + # yet determined the direction of the flow, so we leave direction as + # NOTDEFINED. + ifcopenshell.api.run("system.connect_port", model, port1=duct_port2, port2=fitting_port1) - # Disconnect the port. note we could've equally disconnected - # fitting_port1 instead of duct_port2 - ifcopenshell.api.run("system.disconnect_port", model, port=duct_port2) - """ - self.file = file - self.settings = { - "port": port, - } + # Disconnect the port. note we could've equally disconnected + # fitting_port1 instead of duct_port2 + ifcopenshell.api.run("system.disconnect_port", model, port=duct_port2) + """ + settings = { + "port": port, + } - def execute(self): - rels = self.settings["port"].ConnectedTo or () - rels += self.settings["port"].ConnectedFrom or () + rels = settings["port"].ConnectedTo or () + rels += settings["port"].ConnectedFrom or () - for rel in rels: - rel.RelatingPort.FlowDirection = None - rel.RelatedPort.FlowDirection = None - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + for rel in rels: + rel.RelatingPort.FlowDirection = None + rel.RelatedPort.FlowDirection = None + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py index 315c04ccd5..83fd250ddd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py @@ -17,34 +17,31 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, system=None, attributes=None): - """Edits the attributes of an IfcSystem +def edit_system(file, system=None, attributes=None) -> None: + """Edits the attributes of an IfcSystem - For more information about the attributes and data types of an - IfcSystem, consult the IFC documentation. + For more information about the attributes and data types of an + IfcSystem, consult the IFC documentation. - :param system: The IfcSystem entity you want to edit - :type system: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param system: The IfcSystem entity you want to edit + :type system: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # A completely empty distribution system - system = ifcopenshell.api.run("system.add_system", model) + # A completely empty distribution system + system = ifcopenshell.api.run("system.add_system", model) - # Change the name of the system to "HW" for Hot Water - ifcopenshell.api.run("system.edit_system", model, system=system, attributes={"Name": "HW"}) - """ + # Change the name of the system to "HW" for Hot Water + ifcopenshell.api.run("system.edit_system", model, system=system, attributes={"Name": "HW"}) + """ - self.file = file - self.settings = {"system": system, "attributes": attributes or {}} + settings = {"system": system, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["system"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["system"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py index f331a5f3e3..a81a06127f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py @@ -21,55 +21,52 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, system=None): - """Removes a distribution system +def remove_system(file, system=None) -> None: + """Removes a distribution system - All the distribution elements within the system are retained. + All the distribution elements within the system are retained. - :param system: The IfcSystem to remove. - :type system: ifcopenshell.entity_instance - :return: None - :rtype: None + :param system: The IfcSystem to remove. + :type system: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # A completely empty distribution system - system = ifcopenshell.api.run("system.add_system", model) + # A completely empty distribution system + system = ifcopenshell.api.run("system.add_system", model) - # Delete it. - ifcopenshell.api.run("system.remove_system", model, system=system) - """ - self.file = file - self.settings = {"system": system} + # Delete it. + ifcopenshell.api.run("system.remove_system", model, system=system) + """ + settings = {"system": system} - def execute(self): - for inverse_id in [i.id() for i in self.file.get_inverse(self.settings["system"])]: - try: - inverse = self.file.by_id(inverse_id) - except: - continue - if inverse.is_a("IfcRelDefinesByProperties"): - ifcopenshell.api.run( - "pset.remove_pset", - self.file, - product=self.settings["system"], - pset=inverse.RelatingPropertyDefinition, - ) - elif inverse.is_a("IfcRelAssignsToGroup"): - if inverse.RelatingGroup == self.settings["system"]: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - elif len(inverse.RelatedObjects) == 1: - history = inverse.OwnerHistory - self.file.remove(inverse) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - history = self.settings["system"].OwnerHistory - self.file.remove(self.settings["system"]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + for inverse_id in [i.id() for i in file.get_inverse(settings["system"])]: + try: + inverse = file.by_id(inverse_id) + except: + continue + if inverse.is_a("IfcRelDefinesByProperties"): + ifcopenshell.api.run( + "pset.remove_pset", + file, + product=settings["system"], + pset=inverse.RelatingPropertyDefinition, + ) + elif inverse.is_a("IfcRelAssignsToGroup"): + if inverse.RelatingGroup == settings["system"]: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + elif len(inverse.RelatedObjects) == 1: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + history = settings["system"].OwnerHistory + file.remove(settings["system"]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py index 04eda27f83..feba961f1b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py @@ -21,57 +21,54 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file, relating_flow_element=None, related_flow_control=None): - """Unassigns flow control element from the flow element. +def unassign_flow_control(file, relating_flow_element=None, related_flow_control=None) -> None: + """Unassigns flow control element from the flow element. - :param related_flow_control: IfcDistributionControlElement controling the - flow element - :type related_flow_control: ifcopenshell.entity_instance - :param relating_flow_element: The IfcDistributionFlowElement that is being controlled - :type relating_flow_element: ifcopenshell.entity_instance - :return: If the control still is related to other objects, the - IfcRelFlowControlElements is returned, otherwise None. - :rtype: ifcopenshell.entity_instance, None + :param related_flow_control: IfcDistributionControlElement controling the + flow element + :type related_flow_control: ifcopenshell.entity_instance + :param relating_flow_element: The IfcDistributionFlowElement that is being controlled + :type relating_flow_element: ifcopenshell.entity_instance + :return: If the control still is related to other objects, the + IfcRelFlowControlElements is returned, otherwise None. + :rtype: ifcopenshell.entity_instance, None - Example: + Example: - .. code:: python + .. code:: python - # assign control to the flow element - flow_element = self.file.createIfcFlowSegment() - flow_control = self.file.createIfcController() - relation = ifcopenshell.api.run( - "system.assign_flow_control", self.file, - relating_control=flow_control, related_object=flow_element - ) + # assign control to the flow element + flow_element = file.createIfcFlowSegment() + flow_control = file.createIfcController() + relation = ifcopenshell.api.run( + "system.assign_flow_control", file, + relating_control=flow_control, related_object=flow_element + ) - # und unassign it - ifcopenshell.api.run("system.unassign_flow_control", self.file, - relating_control=flow_control, related_object=flow_element - ) - """ + # und unassign it + ifcopenshell.api.run("system.unassign_flow_control", file, + relating_control=flow_control, related_object=flow_element + ) + """ - self.file = file - self.settings = { - "relating_flow_element": relating_flow_element, - "related_flow_control": related_flow_control, - } + settings = { + "relating_flow_element": relating_flow_element, + "related_flow_control": related_flow_control, + } - def execute(self): - if not self.settings["related_flow_control"].AssignedToFlowElement: - return - assignment = self.settings["related_flow_control"].AssignedToFlowElement[0] - if assignment.RelatingFlowElement != self.settings["relating_flow_element"]: - return - if len(assignment.RelatedControlElements) == 1: - history = assignment.OwnerHistory - self.file.remove(assignment) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - return - related_flow_controls = list(assignment.RelatedControlElements) - related_flow_controls.remove(self.settings["related_flow_control"]) - assignment.RelatedControlElements = related_flow_controls - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": assignment}) - return assignment + if not settings["related_flow_control"].AssignedToFlowElement: + return + assignment = settings["related_flow_control"].AssignedToFlowElement[0] + if assignment.RelatingFlowElement != settings["relating_flow_element"]: + return + if len(assignment.RelatedControlElements) == 1: + history = assignment.OwnerHistory + file.remove(assignment) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + return + related_flow_controls = list(assignment.RelatedControlElements) + related_flow_controls.remove(settings["related_flow_control"]) + assignment.RelatedControlElements = related_flow_controls + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": assignment}) + return assignment diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py index e9d82722aa..678c086140 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py @@ -20,42 +20,45 @@ import ifcopenshell import ifcopenshell.api +def unassign_port(file, element=None, port=None) -> None: + """Unassigns a port to an element + + Ports are typically always assigned to a distribution element, but in + some edge cases you may want to unassign the port to create an orphaned + port for cleaning or patchin purposes. + + :param element: The IfcDistributionElement to unassign the port from. + :type element: ifcopenshell.entity_instance + :param port: The IfcDistributionPort you want to unassign. + :type port: ifcopenshell.entity_instance + :return: None + :rtype: None + + Example: + + .. code:: python + + # Create a duct + duct = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") + + # Create 2 ports, one for either end. + port1 = ifcopenshell.api.run("system.add_port", model, element=duct) + port2 = ifcopenshell.api.run("system.add_port", model, element=duct) + + # Unassign one port for some weird reason. + ifcopenshell.api.run("system.unassign_port", model, element=duct, port=port1) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "element": element, + "port": port, + } + return usecase.execute() + + class Usecase: - def __init__(self, file, element=None, port=None): - """Unassigns a port to an element - - Ports are typically always assigned to a distribution element, but in - some edge cases you may want to unassign the port to create an orphaned - port for cleaning or patchin purposes. - - :param element: The IfcDistributionElement to unassign the port from. - :type element: ifcopenshell.entity_instance - :param port: The IfcDistributionPort you want to unassign. - :type port: ifcopenshell.entity_instance - :return: None - :rtype: None - - Example: - - .. code:: python - - # Create a duct - duct = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") - - # Create 2 ports, one for either end. - port1 = ifcopenshell.api.run("system.add_port", model, element=duct) - port2 = ifcopenshell.api.run("system.add_port", model, element=duct) - - # Unassign one port for some weird reason. - ifcopenshell.api.run("system.unassign_port", model, element=duct, port=port1) - """ - self.file = file - self.settings = { - "element": element, - "port": port, - } - def execute(self): if self.file.schema == "IFC2X3": return self.execute_ifc2x3() diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py index fbc3dd854b..7bb82aebb7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_system.py @@ -21,46 +21,40 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - products: list[ifcopenshell.entity_instance], - system: ifcopenshell.entity_instance, - ): - """Unassigns list of products from a system +def unassign_system( + file: ifcopenshell.file, + products: list[ifcopenshell.entity_instance], + system: ifcopenshell.entity_instance, +) -> None: + """Unassigns list of products from a system - :param products: The list of IfcDistributionElements to unassign from the system. - :type products: list[ifcopenshell.entity_instance] - :param system: The IfcSystem you want to unassign the element from. - :type system: ifcopenshell.entity_instance - :return: None - :rtype: None + :param products: The list of IfcDistributionElements to unassign from the system. + :type products: list[ifcopenshell.entity_instance] + :param system: The IfcSystem you want to unassign the element from. + :type system: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # A completely empty distribution system - system = ifcopenshell.api.run("system.add_system", model) + # A completely empty distribution system + system = ifcopenshell.api.run("system.add_system", model) - # Create a duct - duct = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") + # Create a duct + duct = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcDuctSegment", predefined_type="RIGIDSEGMENT") - # This duct is part of the system - ifcopenshell.api.run("system.assign_system", model, products=[duct], system=system) + # This duct is part of the system + ifcopenshell.api.run("system.assign_system", model, products=[duct], system=system) - # Not anymore! - ifcopenshell.api.run("system.unassign_system", model, products=[duct], system=system) - """ - self.file = file - self.settings = { - "products": products, - "system": system, - } + # Not anymore! + ifcopenshell.api.run("system.unassign_system", model, products=[duct], system=system) + """ + settings = { + "products": products, + "system": system, + } - def execute(self): - ifcopenshell.api.run( - "group.unassign_group", self.file, products=self.settings["products"], group=self.settings["system"] - ) + ifcopenshell.api.run("group.unassign_group", file, products=settings["products"], group=settings["system"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py index e0caddbe3c..dddd90a49f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py @@ -15,3 +15,8 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .assign_type import assign_type +from .get_related_objects import get_related_objects +from .map_type_representations import map_type_representations +from .unassign_type import unassign_type diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py b/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py index b8d7cf357a..9d30d6083a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py @@ -22,166 +22,168 @@ import ifcopenshell.util.element from typing import Union, Iterable +def assign_type( + file: ifcopenshell.file, + related_objects: list[ifcopenshell.entity_instance], + relating_type: ifcopenshell.entity_instance, + should_map_representations=True, +) -> Union[ifcopenshell.entity_instance, None]: + """Assigns a type to occurrences of an object + + IFC supports the concept of occurrences and types. An occurrence is an + actual physical product in the real world: like a wall, a chair, a door, + a column, a pump, and so on. + + Most occurrences have a corresponding type. A type describes either a + common shape and set of properties of a particular model of equipment, + or a construction typology. An occurrence may only have zero or one + type. + + For example, architects would typically have a door schedule for + individual occurrences of doors and a door types schedule for a handful + of door types, described by the door hardware, frame, and panel. Other + examples might be window types or wall types. Structural engineers would + have a list of column types, beam types, slab types, etc, such as a 400 + diameter column, a 500 diameter column, and so on. Services consultant + might nominate a particular type of sprinkler which have many + occurrences, or light fixture types, and so on. + + Types are critical as they communicate to the procurement team what + types of equipment and products need to be procured. The individual + occurrences of that type tell them how many to procure. Types are also + critical in construction as they indicate succinctly how to manufacture + or construct something. For example, a wall type is enough information + for a builder to understand the build up and construction of a wall. + Types are used to help break down cost plans, or isolate portions of an + assembly process for construction scheduling. Types are also used in + facility maintenance, as occurrences sharing the same type can be + repaired in the same way or by replacing the same parts. + + An occurrence of a type inherits all the properties and materials of the + type. For example, a 2HR fire rated wall type implies that all + wall occurrences of that wall type will also be 2HR fire rated. + + A type may or may not have a geometric representation. If a type does + not have any representation, then the occurrences are free to have any + representation of their own. However, if a type has a representation, + all occurrences must have the same representation. For example, if a + light fixture downlight type has a representation of a cylinder, then + all occurrences must have exactly the same cylinder as its + representation. If you change the cylinder's shape of the type, then all + occurrence representations will also change. + + If a type does not have any geometric representation, they may have a + parametric material representation. This may be either a parametric + layered material or parametric cross-sectional profile material. If this + is the case, the occurrence must be constructed out of the parametric + material. For example, if a wall type uses a list of parametric layers + indicating a thickness of 13mm plasterboard and 90mm stud, then the + thickness of every wall occurrence representation must be 103mm. The + length of each wall, however, may vary. Similarly, if a beam type has a + parametric profile material of an I-beam, then all beam occurrences must + also be this I-beam shape, though the length may vary. + + It is highly recommended for every occurrence to have a type. There are + some exceptions to the rule, such as in heritage architecture or + as-built or dilapidation models, where existing conditions are + ambiguous, unknown or are so bespoke as to have no logical type. + + :param related_objects: The IfcElement occurrences. + :type related_objects: list[ifcopenshell.entity_instance] + :param relating_type: The IfcElementType type. + :type relating_type: ifcopenshell.entity_instance + :param should_map_representations: If a type has a representation map, + IFC requires all occurrences to map those representations. Some IFC + vendors might disobey this, or you might want to handle it + yourusecase. In this scenario, you may set this to False. + This also enabled adding material usages mapping. + :type should_map_representations: bool + :return: The IfcRelDefinesByType relationship + or `None` if `related_objects` was empty list. + :rtype: Union[ifcopenshell.entity_instance, None] + + Example: + + .. code:: python + + # A furniture type. This would correlate to a particular model in a + # manufacturer's catalogue. Like an Ikea sofa :) + furniture_type = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcFurnitureType", name="FUN01") + + # An individual occurrence of a that sofa. + furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") + + # Assign the furniture to the furniture type. If the furniture_type + # had a representation, the furniture occurrence will also now have + # the exact same representation. This is highly efficient as you + # don't need to define the representation for every occurrence. + ifcopenshell.api.run("type.assign_type", model, related_objects=[furniture], relating_type=furniture_type) + + # Let's imagine a parametric material layer set + wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType", name="WAL01") + + # First, let's create a material set. This will later be assigned + # to our wall type element. + material_set = ifcopenshell.api.run("material.add_material_set", model, + name="GYP-ST-GYP", set_type="IfcMaterialLayerSet") + + # Let's create a few materials, it's important to also give them + # categories. This makes it easy for model recipients to do things + # like "show me everything made out of aluminium / concrete / steel + # / glass / etc". The IFC specification states a list of categories + # you can use. + gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + + # Now let's use those materials as three layers in our set, such + # that the steel studs are sandwiched by the gypsum. Let's imagine + # we're setting the layer thickness in millimeters. + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": .013}) + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": .092}) + layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) + ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": .013}) + + # Great! Let's assign our material set to our wall type. + ifcopenshell.api.run("material.assign_material", model, products=[wall_type], material=material_set) + + # Now, let's create a wall. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # The wall is a WAL01 wall type. + ifcopenshell.api.run("type.assign_type", model, related_objects=[wall], relating_type=wall_type) + + # A bit of preparation, let's create some geometric contexts since + # we want to create some geometry for our wall. + model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) + + # Notice how our thickness of 0.118 must equal .013 + .092 + .013 from our type + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=5, height=3, thickness=0.118) + + # Assign our new body geometry back to our wall + ifcopenshell.api.run("geometry.assign_representation", model, + product=wall, representation=representation) + + # Place our wall at the origin + ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = { + "related_objects": related_objects, + "relating_type": relating_type, + "should_map_representations": should_map_representations, + } + return usecase.execute() + + class Usecase: - def __init__( - self, - file: ifcopenshell.file, - related_objects: list[ifcopenshell.entity_instance], - relating_type: ifcopenshell.entity_instance, - should_map_representations=True, - ): - """Assigns a type to occurrences of an object - - IFC supports the concept of occurrences and types. An occurrence is an - actual physical product in the real world: like a wall, a chair, a door, - a column, a pump, and so on. - - Most occurrences have a corresponding type. A type describes either a - common shape and set of properties of a particular model of equipment, - or a construction typology. An occurrence may only have zero or one - type. - - For example, architects would typically have a door schedule for - individual occurrences of doors and a door types schedule for a handful - of door types, described by the door hardware, frame, and panel. Other - examples might be window types or wall types. Structural engineers would - have a list of column types, beam types, slab types, etc, such as a 400 - diameter column, a 500 diameter column, and so on. Services consultant - might nominate a particular type of sprinkler which have many - occurrences, or light fixture types, and so on. - - Types are critical as they communicate to the procurement team what - types of equipment and products need to be procured. The individual - occurrences of that type tell them how many to procure. Types are also - critical in construction as they indicate succinctly how to manufacture - or construct something. For example, a wall type is enough information - for a builder to understand the build up and construction of a wall. - Types are used to help break down cost plans, or isolate portions of an - assembly process for construction scheduling. Types are also used in - facility maintenance, as occurrences sharing the same type can be - repaired in the same way or by replacing the same parts. - - An occurrence of a type inherits all the properties and materials of the - type. For example, a 2HR fire rated wall type implies that all - wall occurrences of that wall type will also be 2HR fire rated. - - A type may or may not have a geometric representation. If a type does - not have any representation, then the occurrences are free to have any - representation of their own. However, if a type has a representation, - all occurrences must have the same representation. For example, if a - light fixture downlight type has a representation of a cylinder, then - all occurrences must have exactly the same cylinder as its - representation. If you change the cylinder's shape of the type, then all - occurrence representations will also change. - - If a type does not have any geometric representation, they may have a - parametric material representation. This may be either a parametric - layered material or parametric cross-sectional profile material. If this - is the case, the occurrence must be constructed out of the parametric - material. For example, if a wall type uses a list of parametric layers - indicating a thickness of 13mm plasterboard and 90mm stud, then the - thickness of every wall occurrence representation must be 103mm. The - length of each wall, however, may vary. Similarly, if a beam type has a - parametric profile material of an I-beam, then all beam occurrences must - also be this I-beam shape, though the length may vary. - - It is highly recommended for every occurrence to have a type. There are - some exceptions to the rule, such as in heritage architecture or - as-built or dilapidation models, where existing conditions are - ambiguous, unknown or are so bespoke as to have no logical type. - - :param related_objects: The IfcElement occurrences. - :type related_objects: list[ifcopenshell.entity_instance] - :param relating_type: The IfcElementType type. - :type relating_type: ifcopenshell.entity_instance - :param should_map_representations: If a type has a representation map, - IFC requires all occurrences to map those representations. Some IFC - vendors might disobey this, or you might want to handle it - yourself. In this scenario, you may set this to False. - This also enabled adding material usages mapping. - :type should_map_representations: bool - :return: The IfcRelDefinesByType relationship - or `None` if `related_objects` was empty list. - :rtype: Union[ifcopenshell.entity_instance, None] - - Example: - - .. code:: python - - # A furniture type. This would correlate to a particular model in a - # manufacturer's catalogue. Like an Ikea sofa :) - furniture_type = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcFurnitureType", name="FUN01") - - # An individual occurrence of a that sofa. - furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") - - # Assign the furniture to the furniture type. If the furniture_type - # had a representation, the furniture occurrence will also now have - # the exact same representation. This is highly efficient as you - # don't need to define the representation for every occurrence. - ifcopenshell.api.run("type.assign_type", model, related_objects=[furniture], relating_type=furniture_type) - - # Let's imagine a parametric material layer set - wall_type = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWallType", name="WAL01") - - # First, let's create a material set. This will later be assigned - # to our wall type element. - material_set = ifcopenshell.api.run("material.add_material_set", model, - name="GYP-ST-GYP", set_type="IfcMaterialLayerSet") - - # Let's create a few materials, it's important to also give them - # categories. This makes it easy for model recipients to do things - # like "show me everything made out of aluminium / concrete / steel - # / glass / etc". The IFC specification states a list of categories - # you can use. - gypsum = ifcopenshell.api.run("material.add_material", model, name="PB01", category="gypsum") - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") - - # Now let's use those materials as three layers in our set, such - # that the steel studs are sandwiched by the gypsum. Let's imagine - # we're setting the layer thickness in millimeters. - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": .013}) - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=steel) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": .092}) - layer = ifcopenshell.api.run("material.add_layer", model, layer_set=material_set, material=gypsum) - ifcopenshell.api.run("material.edit_layer", model, layer=layer, attributes={"LayerThickness": .013}) - - # Great! Let's assign our material set to our wall type. - ifcopenshell.api.run("material.assign_material", model, products=[wall_type], material=material_set) - - # Now, let's create a wall. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # The wall is a WAL01 wall type. - ifcopenshell.api.run("type.assign_type", model, related_objects=[wall], relating_type=wall_type) - - # A bit of preparation, let's create some geometric contexts since - # we want to create some geometry for our wall. - model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) - - # Notice how our thickness of 0.118 must equal .013 + .092 + .013 from our type - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=5, height=3, thickness=0.118) - - # Assign our new body geometry back to our wall - ifcopenshell.api.run("geometry.assign_representation", model, - product=wall, representation=representation) - - # Place our wall at the origin - ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) - """ - self.file = file - self.settings = { - "related_objects": related_objects, - "relating_type": relating_type, - "should_map_representations": should_map_representations, - } - - def execute(self) -> Union[ifcopenshell.entity_instance, None]: + def execute(self): if not self.settings["related_objects"]: return diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py b/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py index 0a05de4118..3610f27af5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py @@ -19,43 +19,40 @@ import ifcopenshell -class Usecase: - def __init__(self, file, related_object=None, relating_type=None): - """Gets all the related occurrences of a type +def get_related_objects(file, related_object=None, relating_type=None) -> None: + """Gets all the related occurrences of a type - Do not use this function. It will be removed. Use - ifcopenshell.util.element.get_type or - ifcopenshell.util.element.get_types instead. + Do not use this function. It will be removed. Use + ifcopenshell.util.element.get_type or + ifcopenshell.util.element.get_types instead. - :param related_object: The IfcElement occurrence. - :type related_object: ifcopenshell.entity_instance - :param relating_type: The IfcElementType type. - :type relating_type: ifcopenshell.entity_instance - :return: A list of occurrences of the type. - :rtype: list[ifcopenshell.entity_instance] - """ - self.file = file - self.settings = { - "related_object": related_object, - "relating_type": relating_type, - } + :param related_object: The IfcElement occurrence. + :type related_object: ifcopenshell.entity_instance + :param relating_type: The IfcElementType type. + :type relating_type: ifcopenshell.entity_instance + :return: A list of occurrences of the type. + :rtype: list[ifcopenshell.entity_instance] + """ + settings = { + "related_object": related_object, + "relating_type": relating_type, + } - def execute(self): - if self.settings["related_object"]: - if self.file.schema == "IFC2X3": - is_defined_by = self.settings["related_object"].IsDefinedBy - for rel in is_defined_by: - if rel.is_a("IfcRelDefinesByType"): - return set([int(o.id()) for o in rel.RelatedObjects]) - else: - is_typed_by = self.settings["related_object"].IsTypedBy - if is_typed_by: - return set([int(o.id()) for o in is_typed_by[0].RelatedObjects]) - elif self.settings["relating_type"]: - if self.file.schema == "IFC2X3": - types = self.settings["relating_type"].ObjectTypeOf - else: - types = self.settings["relating_type"].Types - if types: - return set([int(o.id()) for o in types[0].RelatedObjects]) - return set() + if settings["related_object"]: + if file.schema == "IFC2X3": + is_defined_by = settings["related_object"].IsDefinedBy + for rel in is_defined_by: + if rel.is_a("IfcRelDefinesByType"): + return set([int(o.id()) for o in rel.RelatedObjects]) + else: + is_typed_by = settings["related_object"].IsTypedBy + if is_typed_by: + return set([int(o.id()) for o in is_typed_by[0].RelatedObjects]) + elif settings["relating_type"]: + if file.schema == "IFC2X3": + types = settings["relating_type"].ObjectTypeOf + else: + types = settings["relating_type"].Types + if types: + return set([int(o.id()) for o in types[0].RelatedObjects]) + return set() diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py b/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py index 064fb148bb..59c1655c6f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/map_type_representations.py @@ -21,99 +21,93 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__( - self, - file: ifcopenshell.file, - related_object: ifcopenshell.entity_instance, - relating_type: ifcopenshell.entity_instance, - ): - """Ensures that all occurrences has the same representation as the type +def map_type_representations( + file: ifcopenshell.file, + related_object: ifcopenshell.entity_instance, + relating_type: ifcopenshell.entity_instance, +) -> None: + """Ensures that all occurrences has the same representation as the type - If a type has a representation, all occurrences must have the same - representation. If the type's representation changes, this function may - be used to ensure consistency of the occurrence's representations. + If a type has a representation, all occurrences must have the same + representation. If the type's representation changes, this function may + be used to ensure consistency of the occurrence's representations. - :param related_object: The IfcElement occurrence. - :type related_object: ifcopenshell.entity_instance - :param relating_type: The IfcElementType type. - :type relating_type: ifcopenshell.entity_instance - :return: None - :rtype: None + :param related_object: The IfcElement occurrence. + :type related_object: ifcopenshell.entity_instance + :param relating_type: The IfcElementType type. + :type relating_type: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # A furniture type. This would correlate to a particular model in a - # manufacturer's catalogue. Like an Ikea sofa :) - furniture_type = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcFurnitureType", name="FUN01") + # A furniture type. This would correlate to a particular model in a + # manufacturer's catalogue. Like an Ikea sofa :) + furniture_type = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcFurnitureType", name="FUN01") - # An individual occurrence of a that sofa. - furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") + # An individual occurrence of a that sofa. + furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") - # Place our furniture at the origin - ifcopenshell.api.run("geometry.edit_object_placement", model, product=furniture) + # Place our furniture at the origin + ifcopenshell.api.run("geometry.edit_object_placement", model, product=furniture) - # Assign the furniture to the furniture type. Right now, the - # furniture type has no representation, so the furniture may also - # have no representation, or any arbitrary representation that may - # vary from occurrence to occurrence. - ifcopenshell.api.run("type.assign_type", model, related_objects=[furniture], relating_type=furniture_type) + # Assign the furniture to the furniture type. Right now, the + # furniture type has no representation, so the furniture may also + # have no representation, or any arbitrary representation that may + # vary from occurrence to occurrence. + ifcopenshell.api.run("type.assign_type", model, related_objects=[furniture], relating_type=furniture_type) - # A bit of preparation, let's create some geometric contexts since - # we want to create some geometry for our furniture type. - model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) + # A bit of preparation, let's create some geometric contexts since + # we want to create some geometry for our furniture type. + model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) - # Let's create a mesh representation of an arbitrary 2m cube. - representation = ifcopenshell.api.run("geometry.add_sverchok_representation", model, context=body, - vertices=[[(-1.0, -1.0, 0.0), (-1.0, -1.0, 2.0), (-1.0, 1.0, 0.0), (-1.0, 1.0, 2.0), - (1.0, -1.0, 0.0), (1.0, -1.0, 2.0), (1.0, 1.0, 0.0), (1.0, 1.0, 2.0)]], - faces=[[[0, 1, 3, 2], [2, 3, 7, 6], [6, 7, 5, 4], [4, 5, 1, 0], [2, 6, 4, 0], [7, 3, 1, 5]]]) + # Let's create a mesh representation of an arbitrary 2m cube. + representation = ifcopenshell.api.run("geometry.add_sverchok_representation", model, context=body, + vertices=[[(-1.0, -1.0, 0.0), (-1.0, -1.0, 2.0), (-1.0, 1.0, 0.0), (-1.0, 1.0, 2.0), + (1.0, -1.0, 0.0), (1.0, -1.0, 2.0), (1.0, 1.0, 0.0), (1.0, 1.0, 2.0)]], + faces=[[[0, 1, 3, 2], [2, 3, 7, 6], [6, 7, 5, 4], [4, 5, 1, 0], [2, 6, 4, 0], [7, 3, 1, 5]]]) - # Assign our new body geometry back to our furniture type. In this - # case, since we use the API, all occurrences automatically get the - # representation mapped, so there is nothing more we need to do. - ifcopenshell.api.run("geometry.assign_representation", model, - product=furniture_type, representation=representation) + # Assign our new body geometry back to our furniture type. In this + # case, since we use the API, all occurrences automatically get the + # representation mapped, so there is nothing more we need to do. + ifcopenshell.api.run("geometry.assign_representation", model, + product=furniture_type, representation=representation) - # However, if you were doing some sort of manual IFC patching, like - # assigning furniture_type.RepresentationMaps directly, then you - # might make this call: - # ifcopenshell.api.run("type.map_type_representations", model, - # related_object=furniture, relating_type=furniture_type) - """ - self.file = file - self.settings = { - "related_object": related_object, - "relating_type": relating_type, - } + # However, if you were doing some sort of manual IFC patching, like + # assigning furniture_type.RepresentationMaps directly, then you + # might make this call: + # ifcopenshell.api.run("type.map_type_representations", model, + # related_object=furniture, relating_type=furniture_type) + """ + settings = { + "related_object": related_object, + "relating_type": relating_type, + } - def execute(self) -> None: - if not self.settings["relating_type"].RepresentationMaps: - return - representations = [] - if self.settings["related_object"].Representation: - representations = self.settings["related_object"].Representation.Representations - for representation in representations: - ifcopenshell.api.run( - "geometry.unassign_representation", - self.file, - product=self.settings["related_object"], - representation=representation, - ) - ifcopenshell.api.run("geometry.remove_representation", self.file, **{"representation": representation}) - for representation_map in self.settings["relating_type"].RepresentationMaps: - representation = representation_map.MappedRepresentation - mapped_representation = ifcopenshell.api.run( - "geometry.map_representation", self.file, representation=representation - ) - ifcopenshell.api.run( - "geometry.assign_representation", - self.file, - product=self.settings["related_object"], - representation=mapped_representation, - ) + if not settings["relating_type"].RepresentationMaps: + return + representations = [] + if settings["related_object"].Representation: + representations = settings["related_object"].Representation.Representations + for representation in representations: + ifcopenshell.api.run( + "geometry.unassign_representation", + file, + product=settings["related_object"], + representation=representation, + ) + ifcopenshell.api.run("geometry.remove_representation", file, **{"representation": representation}) + for representation_map in settings["relating_type"].RepresentationMaps: + representation = representation_map.MappedRepresentation + mapped_representation = ifcopenshell.api.run("geometry.map_representation", file, representation=representation) + ifcopenshell.api.run( + "geometry.assign_representation", + file, + product=settings["related_object"], + representation=mapped_representation, + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py b/src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py index a629100477..cbc41a7785 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/unassign_type.py @@ -21,58 +21,55 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file: ifcopenshell.file, related_objects: list[ifcopenshell.entity_instance]): - """Unassigns a type from occurrences +def unassign_type(file: ifcopenshell.file, related_objects: list[ifcopenshell.entity_instance]) -> None: + """Unassigns a type from occurrences - Note that unassigning a type doesn't automatically remove mapped representations - and material usages associated with the previously assigned type. + Note that unassigning a type doesn't automatically remove mapped representations + and material usages associated with the previously assigned type. - :param related_objects: List of IfcElement occurrences. - :type related_objects: list[ifcopenshell.entity_instance] - :return: None - :rtype: None + :param related_objects: List of IfcElement occurrences. + :type related_objects: list[ifcopenshell.entity_instance] + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # A furniture type. This would correlate to a particular model in a - # manufacturer's catalogue. Like an Ikea sofa :) - furniture_type = ifcopenshell.api.run("root.create_entity", model, - ifc_class="IfcFurnitureType", name="FUN01") + # A furniture type. This would correlate to a particular model in a + # manufacturer's catalogue. Like an Ikea sofa :) + furniture_type = ifcopenshell.api.run("root.create_entity", model, + ifc_class="IfcFurnitureType", name="FUN01") - # An individual occurrence of a that sofa. - furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") + # An individual occurrence of a that sofa. + furniture = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurniture") - # Assign the furniture to the furniture type. - ifcopenshell.api.run("type.assign_type", model, related_objects=[furniture], relating_type=furniture_type) + # Assign the furniture to the furniture type. + ifcopenshell.api.run("type.assign_type", model, related_objects=[furniture], relating_type=furniture_type) - # Change our mind. Maybe it's a different type? - ifcopenshell.api.run("type.unassign_type", model, related_objects=[furniture]) - """ - self.file = file - self.settings = {"related_objects": related_objects} + # Change our mind. Maybe it's a different type? + ifcopenshell.api.run("type.unassign_type", model, related_objects=[furniture]) + """ + settings = {"related_objects": related_objects} - def execute(self) -> None: - related_objects = set(self.settings["related_objects"]) + related_objects = set(settings["related_objects"]) - if self.file.schema == "IFC2X3": - rels = set( - rel - for object in related_objects - if (rel := next((rel for rel in object.IsDefinedBy if rel.is_a("IfcRelDefinesByType")), None)) - ) + if file.schema == "IFC2X3": + rels = set( + rel + for object in related_objects + if (rel := next((rel for rel in object.IsDefinedBy if rel.is_a("IfcRelDefinesByType")), None)) + ) + else: + rels = set(rel for object in related_objects if (rel := next((rel for rel in object.IsTypedBy), None))) + + for rel in rels: + related_objects = set(rel.RelatedObjects) - related_objects + if related_objects: + rel.RelatedObjects = list(related_objects) + ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) else: - rels = set(rel for object in related_objects if (rel := next((rel for rel in object.IsTypedBy), None))) - - for rel in rels: - related_objects = set(rel.RelatedObjects) - related_objects - if related_objects: - rel.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": rel}) - else: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py index e0caddbe3c..3813724dd7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py @@ -15,3 +15,14 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_context_dependent_unit import add_context_dependent_unit +from .add_conversion_based_unit import add_conversion_based_unit +from .add_monetary_unit import add_monetary_unit +from .add_si_unit import add_si_unit +from .assign_unit import assign_unit +from .edit_derived_unit import edit_derived_unit +from .edit_monetary_unit import edit_monetary_unit +from .edit_named_unit import edit_named_unit +from .remove_unit import remove_unit +from .unassign_unit import unassign_unit diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py index a0d705a94b..5de43a505a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py @@ -17,48 +17,45 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, unit_type="USERDEFINED", name="THINGAMAJIG", dimensions=None): - """Add a new arbitrary unit that can only be interpreted in a project specific context +def add_context_dependent_unit(file, unit_type="USERDEFINED", name="THINGAMAJIG", dimensions=None) -> None: + """Add a new arbitrary unit that can only be interpreted in a project specific context - Occasionally the construction industry uses arbitrary units to quantify - objects, like "pairs" of door hardware, "palettes" or "boxes" of fixings - or equipment. + Occasionally the construction industry uses arbitrary units to quantify + objects, like "pairs" of door hardware, "palettes" or "boxes" of fixings + or equipment. - :param unit_type: Typically should be left as USERDEFINED, unless for - some bizarre reason you are redefining something you could use a - sensible normal unit for. In that case, firstly stop whatever you're - doing and have a hard think about your life, and then if life really - is going that badly for you, check out the IFC docs for IfcUnitEnum. - :type unit_type: str - :param name: Give your unit a name. X what? X bananas? - :type name: str - :param dimensions: Units typically measure one of 7 fundamental physical - dimensions: length, mass, time, electric current, temperature, - substance amount, or luminous intensity. These are represented as a - list of 7 integers, representing the exponents of each one of these - dimensions. For example, a length unit is (1, 0, 0, 0, 0, 0, 0), - where as an area unit is (2, 0, 0, 0, 0, 0, 0). A unit of meters per - second is (1, 0, -1, 0, 0, 0, 0). For context dependent units, it is - recommended to leave this as the default of (0, 0, 0, 0, 0, 0, 0). - :type dimensions: list[int] - :return: The new IfcContextDependentUnit - :rtype: ifcopenshell.entity_instance + :param unit_type: Typically should be left as USERDEFINED, unless for + some bizarre reason you are redefining something you could use a + sensible normal unit for. In that case, firstly stop whatever you're + doing and have a hard think about your life, and then if life really + is going that badly for you, check out the IFC docs for IfcUnitEnum. + :type unit_type: str + :param name: Give your unit a name. X what? X bananas? + :type name: str + :param dimensions: Units typically measure one of 7 fundamental physical + dimensions: length, mass, time, electric current, temperature, + substance amount, or luminous intensity. These are represented as a + list of 7 integers, representing the exponents of each one of these + dimensions. For example, a length unit is (1, 0, 0, 0, 0, 0, 0), + where as an area unit is (2, 0, 0, 0, 0, 0, 0). A unit of meters per + second is (1, 0, -1, 0, 0, 0, 0). For context dependent units, it is + recommended to leave this as the default of (0, 0, 0, 0, 0, 0, 0). + :type dimensions: list[int] + :return: The new IfcContextDependentUnit + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Boxes of things - ifcopenshell.api.run("unit.add_context_dependent_unit", model, name="BOXES") - """ - self.file = file - self.settings = {"unit_type": unit_type, "name": name, "dimensions": dimensions or (0, 0, 0, 0, 0, 0, 0)} + # Boxes of things + ifcopenshell.api.run("unit.add_context_dependent_unit", model, name="BOXES") + """ + settings = {"unit_type": unit_type, "name": name, "dimensions": dimensions or (0, 0, 0, 0, 0, 0, 0)} - def execute(self): - return self.file.create_entity( - "IfcContextDependentUnit", - Dimensions=self.file.createIfcDimensionalExponents(*self.settings["dimensions"]), - UnitType=self.settings["unit_type"], - Name=self.settings["name"], - ) + return file.create_entity( + "IfcContextDependentUnit", + Dimensions=file.createIfcDimensionalExponents(*settings["dimensions"]), + UnitType=settings["unit_type"], + Name=settings["name"], + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py index 20b96d3298..b87011b2e1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_conversion_based_unit.py @@ -21,67 +21,66 @@ import ifcopenshell.util.unit from typing import Optional -class Usecase: - def __init__(self, file: ifcopenshell.file, name: str = "foot", conversion_offset: Optional[float] = None): - """Add a conversion based unit +def add_conversion_based_unit( + file: ifcopenshell.file, name: str = "foot", conversion_offset: Optional[float] = None +) -> ifcopenshell.entity_instance: + """Add a conversion based unit - If you're in one of those countries who don't use SI units, you're - probably simply using SI units converted into another unit. If you want - to use _those_ units, you can create a conversion based unit with this - function. You can choose from one of: inch, foot, yard, mile, square - inch, square foot, square yard, acre, square mile, cubic inch, cubic - foot, cubic yard, litre, fluid ounce UK, fluid ounce US, pint UK, pint - US, gallon UK, gallon US, degree, ounce, pound, ton UK, ton US, lbf, - kip, psi, ksi, minute, hour, day, btu, and fahrenheit. + If you're in one of those countries who don't use SI units, you're + probably simply using SI units converted into another unit. If you want + to use _those_ units, you can create a conversion based unit with this + function. You can choose from one of: inch, foot, yard, mile, square + inch, square foot, square yard, acre, square mile, cubic inch, cubic + foot, cubic yard, litre, fluid ounce UK, fluid ounce US, pint UK, pint + US, gallon UK, gallon US, degree, ounce, pound, ton UK, ton US, lbf, + kip, psi, ksi, minute, hour, day, btu, and fahrenheit. - :param name: A converted name chosen from the list above. - :type name: str - :param conversion_offset: If you want to offset the conversion further - by a set number, you may specify it here. For example, fahrenheit is - 1.8 * kelvin - 459.67. The -459.67 is the conversion offset. Note - that this is just an example and you don't actually need to specify - that for fahrenheit as it's built into this API function. For - advanced users only. - :type conversion_offset: float, optional - :return: The new IfcConversionBasedUnit or - IfcConversionBasedUnitWithOffset - :rtype: ifcopenshell.entity_instance + :param name: A converted name chosen from the list above. + :type name: str + :param conversion_offset: If you want to offset the conversion further + by a set number, you may specify it here. For example, fahrenheit is + 1.8 * kelvin - 459.67. The -459.67 is the conversion offset. Note + that this is just an example and you don't actually need to specify + that for fahrenheit as it's built into this API function. For + advanced users only. + :type conversion_offset: float, optional + :return: The new IfcConversionBasedUnit or + IfcConversionBasedUnitWithOffset + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Some common imperial measurements - length = ifcopenshell.api.run("unit.add_conversion_based_unit", model, name="inch") - area = ifcopenshell.api.run("unit.add_conversion_based_unit", model, name="square foot") + # Some common imperial measurements + length = ifcopenshell.api.run("unit.add_conversion_based_unit", model, name="inch") + area = ifcopenshell.api.run("unit.add_conversion_based_unit", model, name="square foot") - # Make it our default units, if we are doing an imperial building - ifcopenshell.api.run("unit.assign_unit", model, units=[length, area]) - """ - self.file = file - self.settings = {"name": name, "conversion_offset": conversion_offset} + # Make it our default units, if we are doing an imperial building + ifcopenshell.api.run("unit.assign_unit", model, units=[length, area]) + """ + settings = {"name": name, "conversion_offset": conversion_offset} - def execute(self) -> ifcopenshell.entity_instance: - unit_type = ifcopenshell.util.unit.imperial_types.get(self.settings["name"], "USERDEFINED") - dimensions = ifcopenshell.util.unit.named_dimensions[unit_type] - exponents = self.file.createIfcDimensionalExponents(*dimensions) - si_name = ifcopenshell.util.unit.si_type_names[unit_type] - si_unit = self.file.createIfcSIUnit(UnitType=unit_type, Name=si_name) + unit_type = ifcopenshell.util.unit.imperial_types.get(settings["name"], "USERDEFINED") + dimensions = ifcopenshell.util.unit.named_dimensions[unit_type] + exponents = file.createIfcDimensionalExponents(*dimensions) + si_name = ifcopenshell.util.unit.si_type_names[unit_type] + si_unit = file.createIfcSIUnit(UnitType=unit_type, Name=si_name) - conversion_real = ifcopenshell.util.unit.si_conversions.get(self.settings["name"], 1) - value_component = self.file.create_entity("IfcReal", **{"wrappedValue": conversion_real}) - conversion_factor = self.file.createIfcMeasureWithUnit(value_component, si_unit) + conversion_real = ifcopenshell.util.unit.si_conversions.get(settings["name"], 1) + value_component = file.create_entity("IfcReal", **{"wrappedValue": conversion_real}) + conversion_factor = file.createIfcMeasureWithUnit(value_component, si_unit) - conversion_offset = self.settings["conversion_offset"] - if not conversion_offset: - conversion_offset = ifcopenshell.util.unit.si_offsets.get(self.settings["name"], 0) + conversion_offset = settings["conversion_offset"] + if not conversion_offset: + conversion_offset = ifcopenshell.util.unit.si_offsets.get(settings["name"], 0) - if conversion_offset: - return self.file.createIfcConversionBasedUnitWithOffset( - exponents, - unit_type, - self.settings["name"], - conversion_factor, - conversion_offset, - ) - return self.file.createIfcConversionBasedUnit(exponents, unit_type, self.settings["name"], conversion_factor) + if conversion_offset: + return file.createIfcConversionBasedUnitWithOffset( + exponents, + unit_type, + settings["name"], + conversion_factor, + conversion_offset, + ) + return file.createIfcConversionBasedUnit(exponents, unit_type, settings["name"], conversion_factor) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py index f15b18ab91..7e345b9a7c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py @@ -17,32 +17,29 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, currency="DOLLARYDOO"): - """Add a new currency +def add_monetary_unit(file, currency="DOLLARYDOO") -> None: + """Add a new currency - Currency units are useful in cost plans to know in what currency the - costs are calculated in. The currencies should follow ISO 4217, like - USD, GBP, AUD, MYR, etc. + Currency units are useful in cost plans to know in what currency the + costs are calculated in. The currencies should follow ISO 4217, like + USD, GBP, AUD, MYR, etc. - :param currency: The currency code - :type currency: str - :return: The newly created IfcMonetaryUnit - :rtype: ifcopenshell.entity_instance + :param currency: The currency code + :type currency: str + :return: The newly created IfcMonetaryUnit + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # If you do all your cost plans in Zimbabwean dollars then nobody - # knows how accurate the numbers are. - zwl = ifcopenshell.api.run("unit.add_monetary_unit", model, currency="ZWL") + # If you do all your cost plans in Zimbabwean dollars then nobody + # knows how accurate the numbers are. + zwl = ifcopenshell.api.run("unit.add_monetary_unit", model, currency="ZWL") - # Make it our default currency - ifcopenshell.api.run("unit.assign_unit", model, units=[zwl]) - """ - self.file = file - self.settings = {"currency": currency} + # Make it our default currency + ifcopenshell.api.run("unit.assign_unit", model, units=[zwl]) + """ + settings = {"currency": currency} - def execute(self): - return self.file.create_entity("IfcMonetaryUnit", self.settings["currency"]) + return file.create_entity("IfcMonetaryUnit", settings["currency"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py index 7eb8019632..67ce025dd8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_si_unit.py @@ -20,48 +20,45 @@ import ifcopenshell.util.unit from typing import Optional -class Usecase: - def __init__(self, file: ifcopenshell.file, unit_type: str = "LENGTHUNIT", prefix: Optional[str] = None): - """Add a new SI unit +def add_si_unit( + file: ifcopenshell.file, unit_type: str = "LENGTHUNIT", prefix: Optional[str] = None +) -> ifcopenshell.entity_instance: + """Add a new SI unit - The supported types are ABSORBEDDOSEUNIT, AMOUNTOFSUBSTANCEUNIT, - AREAUNIT, DOSEEQUIVALENTUNIT, ELECTRICCAPACITANCEUNIT, - ELECTRICCHARGEUNIT, ELECTRICCONDUCTANCEUNIT, ELECTRICCURRENTUNIT, - ELECTRICRESISTANCEUNIT, ELECTRICVOLTAGEUNIT, ENERGYUNIT, FORCEUNIT, - FREQUENCYUNIT, ILLUMINANCEUNIT, INDUCTANCEUNIT, LENGTHUNIT, - LUMINOUSFLUXUNIT, LUMINOUSINTENSITYUNIT, MAGNETICFLUXDENSITYUNIT, - MAGNETICFLUXUNIT, MASSUNIT, PLANEANGLEUNIT, POWERUNIT, PRESSUREUNIT, - RADIOACTIVITYUNIT, SOLIDANGLEUNIT, THERMODYNAMICTEMPERATUREUNIT, - TIMEUNIT, VOLUMEUNIT. + The supported types are ABSORBEDDOSEUNIT, AMOUNTOFSUBSTANCEUNIT, + AREAUNIT, DOSEEQUIVALENTUNIT, ELECTRICCAPACITANCEUNIT, + ELECTRICCHARGEUNIT, ELECTRICCONDUCTANCEUNIT, ELECTRICCURRENTUNIT, + ELECTRICRESISTANCEUNIT, ELECTRICVOLTAGEUNIT, ENERGYUNIT, FORCEUNIT, + FREQUENCYUNIT, ILLUMINANCEUNIT, INDUCTANCEUNIT, LENGTHUNIT, + LUMINOUSFLUXUNIT, LUMINOUSINTENSITYUNIT, MAGNETICFLUXDENSITYUNIT, + MAGNETICFLUXUNIT, MASSUNIT, PLANEANGLEUNIT, POWERUNIT, PRESSUREUNIT, + RADIOACTIVITYUNIT, SOLIDANGLEUNIT, THERMODYNAMICTEMPERATUREUNIT, + TIMEUNIT, VOLUMEUNIT. - Prefixes supported are ATTO, CENTI, DECA, DECI, EXA, FEMTO, GIGA, HECTO, - KILO, MEGA, MICRO, MILLI, NANO, PETA, PICO, TERA. + Prefixes supported are ATTO, CENTI, DECA, DECI, EXA, FEMTO, GIGA, HECTO, + KILO, MEGA, MICRO, MILLI, NANO, PETA, PICO, TERA. - :param unit_type: A type of unit chosen from the list above. For - example, choosing LENGTHUNIT will give you a metre. - :type unit_type: str - :param prefix: A prefix chosen from the list above, or None for no - prefix. - :type prefix: str,optional - :return: The newly created IfcSIUnit - :rtype: ifcopenshell.entity_instance + :param unit_type: A type of unit chosen from the list above. For + example, choosing LENGTHUNIT will give you a metre. + :type unit_type: str + :param prefix: A prefix chosen from the list above, or None for no + prefix. + :type prefix: str,optional + :return: The newly created IfcSIUnit + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # Millimeters and square meters - length = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="LENGTHUNIT", prefix="MILLI") - area = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="AREAUNIT") + # Millimeters and square meters + length = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="LENGTHUNIT", prefix="MILLI") + area = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="AREAUNIT") - # Make it our default units, if we are doing a metric building - ifcopenshell.api.run("unit.assign_unit", model, units=[length, area]) - """ - self.file = file - self.settings = {"unit_type": unit_type, "prefix": prefix} + # Make it our default units, if we are doing a metric building + ifcopenshell.api.run("unit.assign_unit", model, units=[length, area]) + """ + settings = {"unit_type": unit_type, "prefix": prefix} - def execute(self) -> ifcopenshell.entity_instance: - name = ifcopenshell.util.unit.si_type_names.get(self.settings["unit_type"], None) - return self.file.create_entity( - "IfcSIUnit", UnitType=self.settings["unit_type"], Name=name, Prefix=self.settings["prefix"] - ) + name = ifcopenshell.util.unit.si_type_names.get(settings["unit_type"], None) + return file.create_entity("IfcSIUnit", UnitType=settings["unit_type"], Name=name, Prefix=settings["prefix"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py index 67305295bd..1e6e1a9cdf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py @@ -21,61 +21,63 @@ import ifcopenshell.util.unit from typing import Optional +def assign_unit( + file: ifcopenshell.file, + units: Optional[list[ifcopenshell.entity_instance]] = None, + length: Optional[dict] = None, + area: Optional[dict] = None, + volume: Optional[dict] = None, +) -> ifcopenshell.entity_instance: + """Assign default project units + + Whenever a unitised quantity is specified, such as a length, area, + voltage, pressure, etc, these project units are used by default. + + It is also possible to override units for specific properties. For + example, generally you might want square metres for area measurements, + but you might want square millimeters for the measurements of the cross + sectional area of cables in cable trays. However, this function only + deals with the default project units. + + :param units: A list of units to assign as project defaults. See + ifcopenshell.api.unit.add_si_unit, unit.add_conversion_based_unit, + and unit.add_monetary_unit for information on how to create units. + :type units: list[ifcopenshell.entity_instance],optional + :return: The IfcUnitAssignment element + :rtype: ifcopenshell.entity_instance + + Example: + + .. code:: python + + # You need a project before you can assign units. + ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") + + # Millimeters and square meters + length = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="LENGTHUNIT", prefix="MILLI") + area = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="AREAUNIT") + + # Make it our default units, if we are doing a metric building + ifcopenshell.api.run("unit.assign_unit", model, units=[length, area]) + + # Alternatively, you may specify without any arguments to + # automatically create millimeters, square meters, and cubic meters + # as a convenience for testing purposes. Sorry imperial folks, we + # prioritise metric here. + ifcopenshell.api.run("unit.assign_unit", model) + """ + usecase = Usecase() + usecase.file = file + usecase.settings = {"units": units} + # This is a convenience function, likely to be deprecated in the future. + usecase.settings["length"] = length or {"is_metric": True, "raw": "MILLIMETERS"} + usecase.settings["area"] = area or {"is_metric": True, "raw": "METERS"} + usecase.settings["volume"] = volume or {"is_metric": True, "raw": "METERS"} + return usecase.execute() + + class Usecase: - def __init__( - self, - file: ifcopenshell.file, - units: Optional[list[ifcopenshell.entity_instance]] = None, - length: Optional[dict] = None, - area: Optional[dict] = None, - volume: Optional[dict] = None, - ): - """Assign default project units - - Whenever a unitised quantity is specified, such as a length, area, - voltage, pressure, etc, these project units are used by default. - - It is also possible to override units for specific properties. For - example, generally you might want square metres for area measurements, - but you might want square millimeters for the measurements of the cross - sectional area of cables in cable trays. However, this function only - deals with the default project units. - - :param units: A list of units to assign as project defaults. See - ifcopenshell.api.unit.add_si_unit, unit.add_conversion_based_unit, - and unit.add_monetary_unit for information on how to create units. - :type units: list[ifcopenshell.entity_instance],optional - :return: The IfcUnitAssignment element - :rtype: ifcopenshell.entity_instance - - Example: - - .. code:: python - - # You need a project before you can assign units. - ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") - - # Millimeters and square meters - length = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="LENGTHUNIT", prefix="MILLI") - area = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="AREAUNIT") - - # Make it our default units, if we are doing a metric building - ifcopenshell.api.run("unit.assign_unit", model, units=[length, area]) - - # Alternatively, you may specify without any arguments to - # automatically create millimeters, square meters, and cubic meters - # as a convenience for testing purposes. Sorry imperial folks, we - # prioritise metric here. - ifcopenshell.api.run("unit.assign_unit", model) - """ - self.file = file - self.settings = {"units": units} - # This is a convenience function, likely to be deprecated in the future. - self.settings["length"] = length or {"is_metric": True, "raw": "MILLIMETERS"} - self.settings["area"] = area or {"is_metric": True, "raw": "METERS"} - self.settings["volume"] = volume or {"is_metric": True, "raw": "METERS"} - - def execute(self) -> ifcopenshell.entity_instance: + def execute(self): # We're going to refactor this to split unit creation and assignment if self.settings["units"]: units = self.settings["units"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py index 636430159c..ed56b80461 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py @@ -17,23 +17,20 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, unit=None, attributes=None): - """Edits the attributes of an IfcDerivedUnit +def edit_derived_unit(file, unit=None, attributes=None) -> None: + """Edits the attributes of an IfcDerivedUnit - For more information about the attributes and data types of an - IfcDerivedUnit, consult the IFC documentation. + For more information about the attributes and data types of an + IfcDerivedUnit, consult the IFC documentation. - :param unit: The IfcDerivedUnit entity you want to edit - :type unit: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None - """ - self.file = file - self.settings = {"unit": unit, "attributes": attributes or {}} + :param unit: The IfcDerivedUnit entity you want to edit + :type unit: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None + """ + settings = {"unit": unit, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["unit"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["unit"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py index aee4b89305..b4f14f328a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py @@ -17,34 +17,31 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, unit=None, attributes=None): - """Edits the attributes of an IfcMonetaryUnit +def edit_monetary_unit(file, unit=None, attributes=None) -> None: + """Edits the attributes of an IfcMonetaryUnit - For more information about the attributes and data types of an - IfcMonetaryUnit, consult the IFC documentation. + For more information about the attributes and data types of an + IfcMonetaryUnit, consult the IFC documentation. - :param unit: The IfcMonetaryUnit entity you want to edit - :type unit: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param unit: The IfcMonetaryUnit entity you want to edit + :type unit: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # If you do all your cost plans in Zimbabwean dollars then nobody - # knows how accurate the numbers are. - zwl = ifcopenshell.api.run("unit.add_monetary_unit", model, currency="ZWL") + # If you do all your cost plans in Zimbabwean dollars then nobody + # knows how accurate the numbers are. + zwl = ifcopenshell.api.run("unit.add_monetary_unit", model, currency="ZWL") - # Ah who are we kidding - ifcopenshell.api.run("unit.edit_monetary_unit", model, unit=zwl, attributes={"Currency": "USD"}) - """ - self.file = file - self.settings = {"unit": unit, "attributes": attributes or {}} + # Ah who are we kidding + ifcopenshell.api.run("unit.edit_monetary_unit", model, unit=zwl, attributes={"Currency": "USD"}) + """ + settings = {"unit": unit, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - setattr(self.settings["unit"], name, value) + for name, value in settings["attributes"].items(): + setattr(settings["unit"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py index da4ff5290f..be0384aabb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py @@ -17,44 +17,41 @@ # along with IfcOpenShell. If not, see . -class Usecase: - def __init__(self, file, unit=None, attributes=None): - """Edits the attributes of an IfcNamedUnit +def edit_named_unit(file, unit=None, attributes=None) -> None: + """Edits the attributes of an IfcNamedUnit - Named units include SI units, conversion based units (imperial units), - and context dependent units. + Named units include SI units, conversion based units (imperial units), + and context dependent units. - For more information about the attributes and data types of an - IfcNamedUnit, consult the IFC documentation. + For more information about the attributes and data types of an + IfcNamedUnit, consult the IFC documentation. - :param unit: The IfcNamedUnit entity you want to edit - :type unit: ifcopenshell.entity_instance - :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional - :return: None - :rtype: None + :param unit: The IfcNamedUnit entity you want to edit + :type unit: ifcopenshell.entity_instance + :param attributes: a dictionary of attribute names and values. + :type attributes: dict, optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Boxes of things - unit = ifcopenshell.api.run("unit.add_context_dependent_unit", model, name="BOXES") + # Boxes of things + unit = ifcopenshell.api.run("unit.add_context_dependent_unit", model, name="BOXES") - # Uh, crates? Boxes? Whatever. - ifcopenshell.api.run("unit.edit_named_unit", model, unit=unit, attibutes={"Name": "CRATES"}) - """ - self.file = file - self.settings = {"unit": unit, "attributes": attributes or {}} + # Uh, crates? Boxes? Whatever. + ifcopenshell.api.run("unit.edit_named_unit", model, unit=unit, attibutes={"Name": "CRATES"}) + """ + settings = {"unit": unit, "attributes": attributes or {}} - def execute(self): - for name, value in self.settings["attributes"].items(): - if name == "Dimensions": - dimensions = self.settings["unit"].Dimensions - if len(self.file.get_inverse(dimensions)) > 1: - self.settings["unit"].Dimensions = self.file.createIfcDimensionalExponents(*value) - else: - for i, exponent in enumerate(value): - dimensions[i] = exponent - continue - setattr(self.settings["unit"], name, value) + for name, value in settings["attributes"].items(): + if name == "Dimensions": + dimensions = settings["unit"].Dimensions + if len(file.get_inverse(dimensions)) > 1: + settings["unit"].Dimensions = file.createIfcDimensionalExponents(*value) + else: + for i, exponent in enumerate(value): + dimensions[i] = exponent + continue + setattr(settings["unit"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py index ba9aff862b..ae2cd192cb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py @@ -20,38 +20,35 @@ import ifcopenshell.util.unit import ifcopenshell.util.element -class Usecase: - def __init__(self, file, unit=None): - """Remove a unit +def remove_unit(file, unit=None) -> None: + """Remove a unit - Be very careful when a unit is removed, as it may mean that previously - defined quantities in the model completely lose their meaning. + Be very careful when a unit is removed, as it may mean that previously + defined quantities in the model completely lose their meaning. - :param unit: The unit element to remove - :type unit: ifcopenshell.entity_instance - :return: None - :rtype: None + :param unit: The unit element to remove + :type unit: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # What? - unit = ifcopenshell.api.run("unit.add_context_dependent_unit", model, name="HANDFULS") + # What? + unit = ifcopenshell.api.run("unit.add_context_dependent_unit", model, name="HANDFULS") - # Yeah maybe not. - ifcopenshell.api.run("unit.remove_unit", model, unit=unit) - """ - self.file = file - self.settings = {"unit": unit} + # Yeah maybe not. + ifcopenshell.api.run("unit.remove_unit", model, unit=unit) + """ + settings = {"unit": unit} - def execute(self): - unit_assignment = ifcopenshell.util.unit.get_unit_assignment(self.file) - if unit_assignment and self.settings["unit"] in unit_assignment.Units: - units = list(unit_assignment.Units) - units.remove(self.settings["unit"]) - if units: - unit_assignment.Units = units - else: - self.file.remove(unit_assignment) - ifcopenshell.util.element.remove_deep(self.file, self.settings["unit"]) + unit_assignment = ifcopenshell.util.unit.get_unit_assignment(file) + if unit_assignment and settings["unit"] in unit_assignment.Units: + units = list(unit_assignment.Units) + units.remove(settings["unit"]) + if units: + unit_assignment.Units = units + else: + file.remove(unit_assignment) + ifcopenshell.util.element.remove_deep(file, settings["unit"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py index 2da27bd08c..0c0b41c2f9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/unassign_unit.py @@ -19,43 +19,40 @@ import ifcopenshell from typing import Optional -class Usecase: - def __init__(self, file: ifcopenshell.file, units: Optional[list[ifcopenshell.entity_instance]] = None): - """Unassigns units as default units for the project +def unassign_unit(file: ifcopenshell.file, units: Optional[list[ifcopenshell.entity_instance]] = None) -> None: + """Unassigns units as default units for the project - :param units: A list of units to assign as project defaults. - :type units: list[ifcopenshell.entity_instance],optional - :return: None - :rtype: None + :param units: A list of units to assign as project defaults. + :type units: list[ifcopenshell.entity_instance],optional + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # You need a project before you can assign units. - ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") + # You need a project before you can assign units. + ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcProject") - # Millimeters and square meters - length = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="LENGTHUNIT", prefix="MILLI") - area = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="AREAUNIT") + # Millimeters and square meters + length = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="LENGTHUNIT", prefix="MILLI") + area = ifcopenshell.api.run("unit.add_si_unit", model, unit_type="AREAUNIT") - # Make it our default units, if we are doing a metric building - ifcopenshell.api.run("unit.assign_unit", model, units=[length, area]) + # Make it our default units, if we are doing a metric building + ifcopenshell.api.run("unit.assign_unit", model, units=[length, area]) - # Actually, we don't need areas. - ifcopenshell.api.run("unit.unassign_unit", model, units=[area]) - """ - self.file = file - self.settings = {"units": units} + # Actually, we don't need areas. + ifcopenshell.api.run("unit.unassign_unit", model, units=[area]) + """ + settings = {"units": units} - def execute(self): - unit_assignment = self.file.by_type("IfcUnitAssignment") - if not unit_assignment: - return - unit_assignment = unit_assignment[0] - units = set(unit_assignment.Units or []) - units = units - set(self.settings["units"]) - if units: - unit_assignment.Units = list(units) - return unit_assignment - self.file.remove(unit_assignment) + unit_assignment = file.by_type("IfcUnitAssignment") + if not unit_assignment: + return + unit_assignment = unit_assignment[0] + units = set(unit_assignment.Units or []) + units = units - set(settings["units"]) + if units: + unit_assignment.Units = list(units) + return unit_assignment + file.remove(unit_assignment) diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py index e0caddbe3c..51e0db158b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py @@ -15,3 +15,8 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . + +from .add_filling import add_filling +from .add_opening import add_opening +from .remove_filling import remove_filling +from .remove_opening import remove_opening diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py index a2867450f6..547178fff8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py @@ -20,103 +20,100 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, opening=None, element=None): - """Fill an opening with an element +def add_filling(file, opening=None, element=None) -> None: + """Fill an opening with an element - Physical elements may have openings in them. For example, a wall might - have an opening for a door. That opening is then filled by the door. - This indicates that when the door moves, the opening will move with it. - Or if the door is removed, then the opening may remain and need to be - filled. + Physical elements may have openings in them. For example, a wall might + have an opening for a door. That opening is then filled by the door. + This indicates that when the door moves, the opening will move with it. + Or if the door is removed, then the opening may remain and need to be + filled. - :param opening: The IfcOpeningElement to fill with the element. - :type opening: ifcopenshell.entity_instance - :param element: The IfcElement to be inserted into the opening. - :type element: ifcopenshell.entity_instance - :return: The new IfcRelFillsElement relationship - :rtype: ifcopenshell.entity_instance + :param opening: The IfcOpeningElement to fill with the element. + :type opening: ifcopenshell.entity_instance + :param element: The IfcElement to be inserted into the opening. + :type element: ifcopenshell.entity_instance + :return: The new IfcRelFillsElement relationship + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # A bit of preparation, let's create some geometric contexts since - # we want to create some geometry for our wall and opening. - model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) + # A bit of preparation, let's create some geometric contexts since + # we want to create some geometry for our wall and opening. + model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) - # Create a wall - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Create a wall + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # Let's use the "3D Body" representation we created earlier to add a - # new wall-like body geometry, 5 meters long, 3 meters high, and - # 200mm thick - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=5, height=3, thickness=0.2) - ifcopenshell.api.run("geometry.assign_representation", model, - product=wall, representation=representation) + # Let's use the "3D Body" representation we created earlier to add a + # new wall-like body geometry, 5 meters long, 3 meters high, and + # 200mm thick + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.run("geometry.assign_representation", model, + product=wall, representation=representation) - # Place our wall at the origin - ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) + # Place our wall at the origin + ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) - # Create an opening, such as for a service penetration with fire and - # acoustic requirements. - opening = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcOpeningElement") + # Create an opening, such as for a service penetration with fire and + # acoustic requirements. + opening = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcOpeningElement") - # Let's create an opening representation of a 950mm x 2100mm door. - # Notice how the thickness is greater than the wall thickness, this - # helps resolve floating point resolution errors in 3D. - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=.95, height=2.1, thickness=0.4) - ifcopenshell.api.run("geometry.assign_representation", model, - product=opening, representation=representation) + # Let's create an opening representation of a 950mm x 2100mm door. + # Notice how the thickness is greater than the wall thickness, this + # helps resolve floating point resolution errors in 3D. + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=.95, height=2.1, thickness=0.4) + ifcopenshell.api.run("geometry.assign_representation", model, + product=opening, representation=representation) - # Let's shift our door 1 meter along the wall and 100mm along the - # wall, to create a nice overlap for the opening boolean. - matrix = np.identity(4) - matrix[:,3] = [1, -.1, 0, 0] - ifcopenshell.api.run("geometry.edit_object_placement", model, product=opening, matrix=matrix) + # Let's shift our door 1 meter along the wall and 100mm along the + # wall, to create a nice overlap for the opening boolean. + matrix = np.identity(4) + matrix[:,3] = [1, -.1, 0, 0] + ifcopenshell.api.run("geometry.edit_object_placement", model, product=opening, matrix=matrix) - # The opening will now void the wall. - ifcopenshell.api.run("void.add_opening", model, opening=opening, element=wall) + # The opening will now void the wall. + ifcopenshell.api.run("void.add_opening", model, opening=opening, element=wall) - # Create a door - door = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcDoor") + # Create a door + door = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcDoor") - # Let's create a door representation of a 950mm x 2100mm door. - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=.95, height=2.1, thickness=0.05) - ifcopenshell.api.run("geometry.assign_representation", model, - product=door, representation=representation) + # Let's create a door representation of a 950mm x 2100mm door. + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=.95, height=2.1, thickness=0.05) + ifcopenshell.api.run("geometry.assign_representation", model, + product=door, representation=representation) - # Let's shift our door 1 meter along the wall and 100mm along the - # wall, which lines up with our opening. - matrix = np.identity(4) - matrix[:,3] = [1, .05, 0, 0] - ifcopenshell.api.run("geometry.edit_object_placement", model, product=door, matrix=matrix) + # Let's shift our door 1 meter along the wall and 100mm along the + # wall, which lines up with our opening. + matrix = np.identity(4) + matrix[:,3] = [1, .05, 0, 0] + ifcopenshell.api.run("geometry.edit_object_placement", model, product=door, matrix=matrix) - # The door will now fill the opening. - ifcopenshell.api.run("void.add_filling", model, opening=opening, element=door) - """ - self.file = file - self.settings = {"opening": opening, "element": element} + # The door will now fill the opening. + ifcopenshell.api.run("void.add_filling", model, opening=opening, element=door) + """ + settings = {"opening": opening, "element": element} - def execute(self): - fills_voids = self.settings["element"].FillsVoids + fills_voids = settings["element"].FillsVoids - if fills_voids: - if fills_voids[0].RelatingOpeningElement == self.settings["opening"]: - return - history = fills_voids[0].OwnerHistory - self.file.remove(fills_voids[0]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + if fills_voids: + if fills_voids[0].RelatingOpeningElement == settings["opening"]: + return + history = fills_voids[0].OwnerHistory + file.remove(fills_voids[0]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) - self.file.create_entity( - "IfcRelFillsElement", - GlobalId=ifcopenshell.guid.new(), - RelatingOpeningElement=self.settings["opening"], - RelatedBuildingElement=self.settings["element"], - ) + file.create_entity( + "IfcRelFillsElement", + GlobalId=ifcopenshell.guid.new(), + RelatingOpeningElement=settings["opening"], + RelatedBuildingElement=settings["element"], + ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py index 142eaedd87..d873ac2cd3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py @@ -22,118 +22,115 @@ import ifcopenshell.util.element import ifcopenshell.util.placement -class Usecase: - def __init__( - self, file: ifcopenshell.file, opening: ifcopenshell.entity_instance, element: ifcopenshell.entity_instance - ): - """Create an opening in an element +def add_opening( + file: ifcopenshell.file, opening: ifcopenshell.entity_instance, element: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: + """Create an opening in an element - It is often necessary to cut out openings in elements like walls and - slabs to make space to insert doors, windows, and other services that go - through these penetrations. + It is often necessary to cut out openings in elements like walls and + slabs to make space to insert doors, windows, and other services that go + through these penetrations. - Whereas it is possible to simply draw the wall as a rectangle with a - hole in it for the opening, often these openings have specific meanings. - For example, an opening might be filled with a window, and so when the - window moves, the opening should move with it. Alternatively, the - opening itself might have fire or acoustic requirements, such that any - service or equipment passing through that space must also comply with - those requirements. For these types of semantic openings, you should - have a distinct opening element which voids your regular element. For - example, your wall will still be a rectangular prism with no hole in it, - and a separate opening element will have a box representing the extents - of the opening for a window. The opening element will automatically - perform a geometric boolean operation to cut out the wall's geometry. + Whereas it is possible to simply draw the wall as a rectangle with a + hole in it for the opening, often these openings have specific meanings. + For example, an opening might be filled with a window, and so when the + window moves, the opening should move with it. Alternatively, the + opening itself might have fire or acoustic requirements, such that any + service or equipment passing through that space must also comply with + those requirements. For these types of semantic openings, you should + have a distinct opening element which voids your regular element. For + example, your wall will still be a rectangular prism with no hole in it, + and a separate opening element will have a box representing the extents + of the opening for a window. The opening element will automatically + perform a geometric boolean operation to cut out the wall's geometry. - Whenever you have an opening in you project, you should determine - whether or not the opening is semantic (i.e. should be represented by a - distinct opening object) or non-semantic (i.e. should simply be - booleaned or be part of the shape of the object). + Whenever you have an opening in you project, you should determine + whether or not the opening is semantic (i.e. should be represented by a + distinct opening object) or non-semantic (i.e. should simply be + booleaned or be part of the shape of the object). - :param opening: The IfcOpeningElement to cut out the element. - :type opening: ifcopenshell.entity_instance - :param element: The IfcElement to insert the opening into. - :type element: ifcopenshell.entity_instance - :return: The new IfcRelVoidsElement relationship - :rtype: ifcopenshell.entity_instance + :param opening: The IfcOpeningElement to cut out the element. + :type opening: ifcopenshell.entity_instance + :param element: The IfcElement to insert the opening into. + :type element: ifcopenshell.entity_instance + :return: The new IfcRelVoidsElement relationship + :rtype: ifcopenshell.entity_instance - Example: + Example: - .. code:: python + .. code:: python - # A bit of preparation, let's create some geometric contexts since - # we want to create some geometry for our wall and opening. - model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") - body = ifcopenshell.api.run("context.add_context", model, - context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) + # A bit of preparation, let's create some geometric contexts since + # we want to create some geometry for our wall and opening. + model3d = ifcopenshell.api.run("context.add_context", model, context_type="Model") + body = ifcopenshell.api.run("context.add_context", model, + context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model3d) - # Create a wall - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Create a wall + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # Let's use the "3D Body" representation we created earlier to add a - # new wall-like body geometry, 5 meters long, 3 meters high, and - # 200mm thick - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=5, height=3, thickness=0.2) - ifcopenshell.api.run("geometry.assign_representation", model, - product=wall, representation=representation) + # Let's use the "3D Body" representation we created earlier to add a + # new wall-like body geometry, 5 meters long, 3 meters high, and + # 200mm thick + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=5, height=3, thickness=0.2) + ifcopenshell.api.run("geometry.assign_representation", model, + product=wall, representation=representation) - # Place our wall at the origin - ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) + # Place our wall at the origin + ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) - # Create an opening, such as for a service penetration with fire and - # acoustic requirements. - opening = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcOpeningElement") + # Create an opening, such as for a service penetration with fire and + # acoustic requirements. + opening = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcOpeningElement") - # Let's create an opening representation of a 950mm x 2100mm door. - # Notice how the thickness is greater than the wall thickness, this - # helps resolve floating point resolution errors in 3D. - representation = ifcopenshell.api.run("geometry.add_wall_representation", model, - context=body, length=.95, height=2.1, thickness=0.4) - ifcopenshell.api.run("geometry.assign_representation", model, - product=opening, representation=representation) + # Let's create an opening representation of a 950mm x 2100mm door. + # Notice how the thickness is greater than the wall thickness, this + # helps resolve floating point resolution errors in 3D. + representation = ifcopenshell.api.run("geometry.add_wall_representation", model, + context=body, length=.95, height=2.1, thickness=0.4) + ifcopenshell.api.run("geometry.assign_representation", model, + product=opening, representation=representation) - # Let's shift our door 1 meter along the wall and 100mm along the - # wall, to create a nice overlap for the opening boolean. - matrix = np.identity(4) - matrix[:,3] = [1, -.1, 0, 0] - ifcopenshell.api.run("geometry.edit_object_placement", model, product=opening, matrix=matrix) + # Let's shift our door 1 meter along the wall and 100mm along the + # wall, to create a nice overlap for the opening boolean. + matrix = np.identity(4) + matrix[:,3] = [1, -.1, 0, 0] + ifcopenshell.api.run("geometry.edit_object_placement", model, product=opening, matrix=matrix) - # The opening will now void the wall. - ifcopenshell.api.run("void.add_opening", model, opening=opening, element=wall) - """ - self.file = file - self.settings = {"opening": opening, "element": element} + # The opening will now void the wall. + ifcopenshell.api.run("void.add_opening", model, opening=opening, element=wall) + """ + settings = {"opening": opening, "element": element} - def execute(self) -> ifcopenshell.entity_instance: - voids_elements = self.settings["opening"].VoidsElements + voids_elements = settings["opening"].VoidsElements - if voids_elements: - if voids_elements[0].RelatingBuildingElement == self.settings["element"]: - return voids_elements[0] - history = voids_elements[0].OwnerHistory - self.file.remove(voids_elements[0]) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) + if voids_elements: + if voids_elements[0].RelatingBuildingElement == settings["element"]: + return voids_elements[0] + history = voids_elements[0].OwnerHistory + file.remove(voids_elements[0]) + if history: + ifcopenshell.util.element.remove_deep2(file, history) - rel = self.file.create_entity( - "IfcRelVoidsElement", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatingBuildingElement": self.settings["element"], - "RelatedOpeningElement": self.settings["opening"], - } + rel = file.create_entity( + "IfcRelVoidsElement", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), + "RelatingBuildingElement": settings["element"], + "RelatedOpeningElement": settings["opening"], + } + ) + + placement = getattr(settings["opening"], "ObjectPlacement", None) + if placement and placement.is_a("IfcLocalPlacement"): + ifcopenshell.api.run( + "geometry.edit_object_placement", + file, + product=settings["opening"], + matrix=ifcopenshell.util.placement.get_local_placement(settings["opening"].ObjectPlacement), + is_si=False, ) - placement = getattr(self.settings["opening"], "ObjectPlacement", None) - if placement and placement.is_a("IfcLocalPlacement"): - ifcopenshell.api.run( - "geometry.edit_object_placement", - self.file, - product=self.settings["opening"], - matrix=ifcopenshell.util.placement.get_local_placement(self.settings["opening"].ObjectPlacement), - is_si=False, - ) - - return rel + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py b/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py index 6d5ab79752..b4c3188672 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py @@ -20,47 +20,44 @@ import ifcopenshell import ifcopenshell.util.element -class Usecase: - def __init__(self, file, element=None): - """Remove a filling relationship +def remove_filling(file, element=None) -> None: + """Remove a filling relationship - If an element is filling an opening, this removes the relationship such - that the opening and element both still exist, but the element no longer - fills the opening. + If an element is filling an opening, this removes the relationship such + that the opening and element both still exist, but the element no longer + fills the opening. - :param element: The element filling an opening. - :type element: ifcopenshell.entity_instance - :return: None - :rtype: None + :param element: The element filling an opening. + :type element: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Create a wall - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + # Create a wall + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - # Create an opening, such as for a service penetration with fire and - # acoustic requirements. - opening = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcOpeningElement") + # Create an opening, such as for a service penetration with fire and + # acoustic requirements. + opening = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcOpeningElement") - # Create a door - door = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcDoor") + # Create a door + door = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcDoor") - # The door will now fill the opening. - ifcopenshell.api.run("void.add_filling", model, opening=opening, element=door) + # The door will now fill the opening. + ifcopenshell.api.run("void.add_filling", model, opening=opening, element=door) - # Not anymore! - ifcopenshell.api.run("void.remove_filling", model, element=door) - """ - self.file = file - self.settings = {"element": element} + # Not anymore! + ifcopenshell.api.run("void.remove_filling", model, element=door) + """ + settings = {"element": element} - def execute(self): - for rel in self.file.by_type("IfcRelFillsElement"): - if rel.RelatedBuildingElement == self.settings["element"]: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - break + for rel in file.by_type("IfcRelFillsElement"): + if rel.RelatedBuildingElement == settings["element"]: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + break diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py index 5ffba93e25..58b7782333 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py @@ -20,44 +20,41 @@ import ifcopenshell.api import ifcopenshell.util.element -class Usecase: - def __init__(self, file: ifcopenshell.entity_instance, opening: ifcopenshell.entity_instance): - """Remove an opening +def remove_opening(file: ifcopenshell.entity_instance, opening: ifcopenshell.entity_instance) -> None: + """Remove an opening - Fillings are retained as orphans. Voided elements remain. Openings - cannot exist by themselves, so not only is the opening relationship - removed, the opening is also removed. + Fillings are retained as orphans. Voided elements remain. Openings + cannot exist by themselves, so not only is the opening relationship + removed, the opening is also removed. - :param opening: The IfcOpeningElement to remove. - :type opening: ifcopenshell.entity_instance - :return: None - :rtype: None + :param opening: The IfcOpeningElement to remove. + :type opening: ifcopenshell.entity_instance + :return: None + :rtype: None - Example: + Example: - .. code:: python + .. code:: python - # Create an oprhaned opening. Note that an orphaned opening is - # invalid, as an opening can only exist when voiding another - # element. - opening = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcOpeningElement") + # Create an oprhaned opening. Note that an orphaned opening is + # invalid, as an opening can only exist when voiding another + # element. + opening = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcOpeningElement") - # Remove it. This brings us back to a valid model. - ifcopenshell.api.run("void.remove_opening", model, opening=opening) - """ - self.file = file - self.settings = {"opening": opening} + # Remove it. This brings us back to a valid model. + ifcopenshell.api.run("void.remove_opening", model, opening=opening) + """ + settings = {"opening": opening} - def execute(self) -> None: - for rel in self.settings["opening"].VoidsElements: + for rel in settings["opening"].VoidsElements: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + if settings["opening"].is_a("IfcOpeningElement"): + for rel in settings["opening"].HasFillings: history = rel.OwnerHistory - self.file.remove(rel) + file.remove(rel) if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - if self.settings["opening"].is_a("IfcOpeningElement"): - for rel in self.settings["opening"].HasFillings: - history = rel.OwnerHistory - self.file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(self.file, history) - ifcopenshell.api.run("root.remove_product", self.file, product=self.settings["opening"]) + ifcopenshell.util.element.remove_deep2(file, history) + ifcopenshell.api.run("root.remove_product", file, product=settings["opening"]) From ab5ea4c853e947f2c2b6678fee6c92c799b675b5 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 6 May 2024 14:43:37 +1000 Subject: [PATCH 092/429] Implement listener wrapper for new API functions. See #2693. --- .../ifcopenshell/api/__init__.py | 82 +++++++------------ 1 file changed, 28 insertions(+), 54 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index 805811744e..7666150915 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -21,6 +21,7 @@ import json import numpy import pkgutil +import inspect import importlib import ifcopenshell import ifcopenshell.api @@ -247,7 +248,6 @@ def remove_all_listeners(): def extract_docs(module, usecase): import typing - import inspect import collections results = [] @@ -295,60 +295,31 @@ def extract_docs(module, usecase): return node_data -def _wrap_api(init_globals, file, package): - """API endpoints are implemented as Usecase classes. This wraps the classes as functions. +def wrap_usecase(usecase_path, usecase): + """Wraps an API function in pre/post listeners.""" - Calling classes is syntactically awkward. For example, - ifcopenshell.api.root.create_entity.Usecase(f).execute(). - It is more elegant to call it using ifcopenshell.api.root.create_entity(f). + def wrapper(*args, should_run_listeners: bool = True, **settings): + ifc_file = args[0] if args else None + if should_run_listeners: + for listener in pre_listeners.get(usecase_path, {}).values(): + listener(usecase_path, ifc_file, settings) - Calling _wrap_api from an API package's __init__.py will generate these - wrapper functions at runtime. - """ - import pkgutil - import importlib - import inspect - from pathlib import Path - - def _create_function(module_name, Usecase): - """Create a function that wraps the Usecase class's execute method.""" - usecase_path = ".".join(Usecase.__module__.split(".")[-2:]) - - def wrapper(*args, should_run_listeners: bool = True, **settings): - ifc_file = args[0] if args else None - if should_run_listeners: - for listener in pre_listeners.get(usecase_path, {}).values(): - listener(usecase_path, ifc_file, settings) - - try: - usecase = Usecase(*args, **settings) - except TypeError as e: - msg = f"Incorrect function arguments provided for {usecase_path}\n{str(e)}. You specified args {args} and settings {settings}\n\nCorrect signature is {inspect.signature(Usecase.__init__)}\nSee help(ifcopenshell.api.{usecase_path}) for documentation." - raise TypeError(msg) from e - - result = usecase.execute() - - if should_run_listeners: - for listener in post_listeners.get(usecase_path, {}).values(): - listener(usecase_path, ifc_file, settings) - - return result - - wrapper.__signature__ = inspect.signature(Usecase.__init__) - wrapper.__doc__ = Usecase.__init__.__doc__ - wrapper.__name__ = module_name - return wrapper - - for finder, name, ispkg in pkgutil.iter_modules([Path(file).parent]): try: - module = importlib.import_module(f".{name}", package) - except ModuleNotFoundError as e: - print(f"Note: API not available due to missing dependencies: {package}.{name} - {e}") - continue - usecase_cls = getattr(module, "Usecase", None) - if usecase_cls: - func = _create_function(name, usecase_cls) - init_globals[name] = func + result = usecase(*args, **settings) + except TypeError as e: + msg = f"Incorrect function arguments provided for {usecase_path}\n{str(e)}. You specified args {args} and settings {settings}\n\nCorrect signature is {inspect.signature(Usecase.__init__)}\nSee help(ifcopenshell.api.{usecase_path}) for documentation." + raise TypeError(msg) from e + + if should_run_listeners: + for listener in post_listeners.get(usecase_path, {}).values(): + listener(usecase_path, ifc_file, settings) + + return result + + wrapper.__signature__ = inspect.signature(usecase) + wrapper.__doc__ = usecase.__doc__ + wrapper.__name__ = usecase_path + return wrapper # Expose all submodules. This means that the user can just type `import ifcopenshell.api`. @@ -357,5 +328,8 @@ for loader, module_name, is_pkg in pkgutil.iter_modules(__path__, __name__ + "." # Check if it's a direct child (only one level deep) if module_name.count(".") == __name__.count(".") + 1: - # Generate wrapper functions for each usecase - _wrap_api(vars(module), module.__file__, module.__name__) + for usecase_name in vars(module): + usecase = getattr(module, usecase_name) + if callable(usecase): + usecase_path = f"{module_name.split('.')[-1]}.{usecase_name}" + setattr(module, usecase_name, wrap_usecase(usecase_path, usecase)) From b718bd19bd1346299266f75225b69d79e21692f1 Mon Sep 17 00:00:00 2001 From: Bruno Postle Date: Mon, 6 May 2024 09:05:56 +0100 Subject: [PATCH 093/429] fix TypeError File "/usr/lib64/python3.12/site-packages/ifcopenshell/api/project/assign_declaration.py", line 126, in execute related_definitions = set(has_context.RelatedDefinitions) - objects_with_contexts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~ TypeError: unsupported operand type(s) for -: 'set' and 'list' --- .../ifcopenshell/api/project/assign_declaration.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py index 776a26b8f5..e1be64ba7f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py @@ -119,9 +119,9 @@ def assign_declaration( return None for has_context in previous_declares_rels: - related_definitions = set(has_context.RelatedDefinitions) - objects_with_contexts + related_definitions = set(has_context.RelatedDefinitions) - set(objects_with_contexts) if related_definitions: - has_context.RelatedDefinitions = related_definitions + has_context.RelatedDefinitions = list(related_definitions) ifcopenshell.api.run("owner.update_owner_history", file, **{"element": has_context}) else: history = has_context.OwnerHistory From 6c313dd25c1b58e1af8c1e052667582dcb70dda5 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 6 May 2024 18:38:58 +1000 Subject: [PATCH 094/429] Fix for static analysis of ifcopenshell.api submodules. See #2693. --- .../ifcopenshell/api/__init__.py | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index 7666150915..dcfbd1821c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -323,13 +323,49 @@ def wrap_usecase(usecase_path, usecase): # Expose all submodules. This means that the user can just type `import ifcopenshell.api`. -for loader, module_name, is_pkg in pkgutil.iter_modules(__path__, __name__ + "."): - module = importlib.import_module(module_name) +import ifcopenshell.api.aggregate as aggregate +import ifcopenshell.api.attribute as attribute +import ifcopenshell.api.boundary as boundary +import ifcopenshell.api.classification as classification +import ifcopenshell.api.constraint as constraint +import ifcopenshell.api.context as context +import ifcopenshell.api.control as control +import ifcopenshell.api.cost as cost +import ifcopenshell.api.document as document +import ifcopenshell.api.drawing as drawing +import ifcopenshell.api.geometry as geometry +import ifcopenshell.api.georeference as georeference +import ifcopenshell.api.grid as grid +import ifcopenshell.api.group as group +import ifcopenshell.api.layer as layer +import ifcopenshell.api.library as library +import ifcopenshell.api.material as material +import ifcopenshell.api.nest as nest +import ifcopenshell.api.owner as owner +import ifcopenshell.api.profile as profile +import ifcopenshell.api.project as project +import ifcopenshell.api.pset as pset +import ifcopenshell.api.pset_template as pset_template +import ifcopenshell.api.resource as resource +import ifcopenshell.api.root as root +import ifcopenshell.api.sequence as sequence +import ifcopenshell.api.spatial as spatial +import ifcopenshell.api.structural as structural +import ifcopenshell.api.style as style +import ifcopenshell.api.system as system +import ifcopenshell.api.type as type # Whoohoo! +import ifcopenshell.api.unit as unit +import ifcopenshell.api.void as void +# Wrap all submodule usecases with listeners. +# This for loop also conveniently ensures that the above imports are comprehensive. +for loader, module_name, is_pkg in pkgutil.iter_modules(__path__, __name__ + "."): # Check if it's a direct child (only one level deep) if module_name.count(".") == __name__.count(".") + 1: + module_name = module_name.split(".")[-1] + module = globals()[module_name] for usecase_name in vars(module): usecase = getattr(module, usecase_name) if callable(usecase): - usecase_path = f"{module_name.split('.')[-1]}.{usecase_name}" + usecase_path = f"{module_name}.{usecase_name}" setattr(module, usecase_name, wrap_usecase(usecase_path, usecase)) From 8f7f6223de6dbe6287652fed12b7a8a46db2ca4f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 6 May 2024 15:03:27 +0500 Subject: [PATCH 095/429] unlink pasted blender objects if there is no active ifc file #4619 --- .../blenderbim/bim/module/geometry/operator.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 9dd2b04ea1..42ee81af7a 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -1446,14 +1446,13 @@ class OverridePasteBuffer(bpy.types.Operator): def execute(self, context): bpy.ops.view3d.pastebuffer() - if IfcStore.get_file(): - for obj in context.selected_objects: - # Pasted objects may come from another Blender session, or even - # from the same session where the original object has since - # been deleted. As the source element may not exist, paste will - # always unlink the element. If you want to duplicate an - # element, use the duplicate commands. - tool.Root.unlink_object(obj) + for obj in context.selected_objects: + # Pasted objects may come from another Blender session, or even + # from the same session where the original object has since + # been deleted. As the source element may not exist, paste will + # always unlink the element. If you want to duplicate an + # element, use the duplicate commands. + tool.Root.unlink_object(obj) return {"FINISHED"} From b3e7975b83a19d5778475a38061833df5061037b Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Mon, 6 May 2024 13:18:05 +0200 Subject: [PATCH 096/429] Consider material profile set in single material determination --- src/ifcgeom/IfcGeom.cpp | 49 +++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src/ifcgeom/IfcGeom.cpp b/src/ifcgeom/IfcGeom.cpp index ebbf24b89a..8b1bfda107 100644 --- a/src/ifcgeom/IfcGeom.cpp +++ b/src/ifcgeom/IfcGeom.cpp @@ -549,6 +549,36 @@ IfcSchema::IfcRelVoidsElement::list::ptr IfcGeom::Kernel::find_openings(IfcSchem return openings; } +namespace { + template + IfcSchema::IfcMaterial* get_single_from_aggregate(bool take_first_regardless_of_size, const T& agg) { + if (take_first_regardless_of_size ? agg->size() >= 1 : agg->size() == 1) { + auto* layer_or_profile = *agg->begin(); + if (layer_or_profile->Material()) { + return layer_or_profile->Material(); + } + } + return nullptr; + } +#ifdef SCHEMA_HAS_IfcMaterialProfileSet + IfcSchema::IfcMaterial* get_single_from_set(bool take_first_regardless_of_size, IfcSchema::IfcMaterialProfileSet* profileset) { + return get_single_from_aggregate(take_first_regardless_of_size, profileset->MaterialProfiles()); + } +#endif + IfcSchema::IfcMaterial* get_single_from_set(bool take_first_regardless_of_size, IfcSchema::IfcMaterialLayerSet* profileset) { + return get_single_from_aggregate(take_first_regardless_of_size, profileset->MaterialLayers()); + } + + IfcSchema::IfcMaterial* get_single_from_usage(bool take_first_regardless_of_size, IfcSchema::IfcMaterialLayerSetUsage* usage) { + return get_single_from_set(take_first_regardless_of_size, usage->ForLayerSet()); + } +#ifdef SCHEMA_HAS_IfcMaterialProfileSet + IfcSchema::IfcMaterial* get_single_from_usage(bool take_first_regardless_of_size, IfcSchema::IfcMaterialProfileSetUsage* usage) { + return get_single_from_set(take_first_regardless_of_size, usage->ForProfileSet()); + } +#endif +} + const IfcSchema::IfcMaterial* IfcGeom::Kernel::get_single_material_association(const IfcSchema::IfcProduct* product) { IfcSchema::IfcMaterial* single_material = 0; IfcSchema::IfcRelAssociatesMaterial::list::ptr associated_materials = product->HasAssociations()->as(); @@ -566,14 +596,19 @@ const IfcSchema::IfcMaterial* IfcGeom::Kernel::get_single_material_association(c single_material = associated_material->as(); // NB: IfcMaterialLayerSets are also considered, regardless of --enable-layerset-slicing. Picking // the first material (in accordance with other viewers) when layerset-slicing is disabled. - if (!single_material && associated_material->as()) { - IfcSchema::IfcMaterialLayerSet* layerset = associated_material->as()->ForLayerSet(); - if (getValue(GV_LAYERSET_FIRST) > 0.0 ? layerset->MaterialLayers()->size() >= 1 : layerset->MaterialLayers()->size() == 1) { - IfcSchema::IfcMaterialLayer* layer = (*layerset->MaterialLayers()->begin()); - if (layer->Material()) { - single_material = layer->Material(); - } + if (!single_material) { + if (auto* m = associated_material->as()) { + single_material = get_single_from_usage(getValue(GV_LAYERSET_FIRST) > 0.0, m); + } else if (auto* m = associated_material->as()) { + single_material = get_single_from_set(getValue(GV_LAYERSET_FIRST) > 0.0, m); } +#ifdef SCHEMA_HAS_IfcMaterialProfileSet + else if (auto* m = associated_material->as()) { + single_material = get_single_from_usage(getValue(GV_LAYERSET_FIRST) > 0.0, m); + } else if (auto* m = associated_material->as()) { + single_material = get_single_from_set(getValue(GV_LAYERSET_FIRST) > 0.0, m); + } +#endif } } } From 30b870b98db9f6da56d9fcc4c03cfc29206b3c6d Mon Sep 17 00:00:00 2001 From: Gorgious56 Date: Mon, 6 May 2024 13:20:33 +0200 Subject: [PATCH 097/429] Fix #4617 : Switching representation in edit mode is no longer possible --- .../bim/module/geometry/operator.py | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 42ee81af7a..312ceed51a 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -215,6 +215,13 @@ class SwitchRepresentation(bpy.types.Operator, Operator): disable_opening_subtractions: bpy.props.BoolProperty() should_switch_all_meshes: bpy.props.BoolProperty() + @classmethod + def poll(cls, context): + if context.active_object.mode == "OBJECT": + return True + cls.poll_message_set("Only available in OBJECT mode - Press TAB in the viewport") + return False + def _execute(self, context): target_representation = tool.Ifc.get().by_id(self.ifc_definition_id) target = target_representation.ContextOfItems @@ -223,6 +230,8 @@ class SwitchRepresentation(bpy.types.Operator, Operator): element = tool.Ifc.get_entity(obj) if not element: continue + if not obj.mode == "OBJECT": + continue if obj == context.active_object: representation = target_representation else: @@ -909,7 +918,7 @@ class OverrideDuplicateMove(bpy.types.Operator): if pset: pset = tool.Ifc.get().by_id(pset["id"]) ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) - + if new[0].is_a("IfcElementAssembly"): linked_aggregate_group = [ r.RelatingGroup @@ -987,7 +996,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): else: index = add_linked_aggregate_pset(part, index) # index += 1 - + obj = tool.Ifc.get_object(part) obj.select_set(True) @@ -1021,9 +1030,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): return linked_aggregate_group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), Name=self.group_name) - ifcopenshell.api.run( - "group.assign_group", tool.Ifc.get(), products=[element], group=linked_aggregate_group - ) + ifcopenshell.api.run("group.assign_group", tool.Ifc.get(), products=[element], group=linked_aggregate_group) def custom_incremental_naming_for_element_assembly(old_to_new): for new in old_to_new.values(): @@ -1047,10 +1054,10 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): if re.findall(pattern2, new_obj.name): split_name = new_obj.name.split(".") new_obj.name = split_name[0] + "_" + number - + def get_max_index(parts): psets = [ifcopenshell.util.element.get_pset(p, "BBIM_Linked_Aggregate") for p in parts] - index = [i['Index'] for i in psets if i] + index = [i["Index"] for i in psets if i] if len(index) > 0: index = max(index) return index @@ -1064,14 +1071,14 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): new_pset = ifcopenshell.api.run( "pset.add_pset", tool.Ifc.get(), product=new[0], name=self.pset_name ) - + ifcopenshell.api.run( "pset.edit_pset", tool.Ifc.get(), pset=new_pset, properties={"Index": pset["Index"]}, ) - + if new[0].is_a("IfcElementAssembly"): linked_aggregate_group = [ r.RelatingGroup @@ -1080,7 +1087,6 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): if "BBIM_Linked_Aggregate" in r.RelatingGroup.Name ] tool.Ifc.run("group.assign_group", group=linked_aggregate_group[0], products=new) - if len(context.selected_objects) != 1: return {"FINISHED"} @@ -1101,7 +1107,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): select_objects_and_add_data(selected_element) old_to_new = OverrideDuplicateMove.execute_ifc_duplicate_operator(self, context, linked=True) - + tool.Root.recreate_aggregate(old_to_new) copy_linked_aggregate_data(old_to_new) @@ -1250,9 +1256,9 @@ class RefreshLinkedAggregate(bpy.types.Operator): selected_matrix = selected_obj.matrix_world object_duplicate = tool.Ifc.get_object(element) duplicate_matrix = object_duplicate.matrix_world.decompose() - + return selected_matrix, duplicate_matrix - + def set_new_matrix(selected_matrix, duplicate_matrix, old_to_new): for old, new in old_to_new.items(): new_obj = tool.Ifc.get_object(new[0]) @@ -1260,7 +1266,6 @@ class RefreshLinkedAggregate(bpy.types.Operator): matrix_diff = Matrix.inverted(selected_matrix) @ new_obj.matrix_world new_obj_matrix = new_base_matrix @ matrix_diff new_obj.matrix_world = new_obj_matrix - active_element = tool.Ifc.get_entity(context.active_object) if not active_element: From 3b9008610990d57ba155a154a7a147ce8011b05b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 6 May 2024 16:57:02 +0500 Subject: [PATCH 098/429] Fix loading search queries with exclusion #4609 It was failing to load queries like "!IfcWall" or "!2Mg7PHubX0xxOfF0DdA9Wd" --- src/blenderbim/blenderbim/tool/search.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/search.py b/src/blenderbim/blenderbim/tool/search.py index cbad2ac02e..3d77e1653f 100644 --- a/src/blenderbim/blenderbim/tool/search.py +++ b/src/blenderbim/blenderbim/tool/search.py @@ -160,10 +160,16 @@ class ImportFilterQueryTransformer(lark.Transformer): return args[0] def instance(self, args): - return {"type": "instance", "value": " ".join([a.children[0].value for a in args])} + if args[0].data == "not": + return {"type": "instance", "value": "!" + args[1].children[0].value} + else: + return {"type": "instance", "value": args[0].children[0].value} def entity(self, args): - return {"type": "entity", "value": " ".join([a.children[0].value for a in args])} + if args[0].data == "not": + return {"type": "entity", "value": "!" + args[1].children[0].value} + else: + return {"type": "entity", "value": args[0].children[0].value} def attribute(self, args): name, comparison, value = args From 31d322a28c435173e6b451ee973280bde62de187 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 6 May 2024 17:29:30 +0500 Subject: [PATCH 099/429] descriptions for operators removing classifications/contexts #4614 --- .../blenderbim/bim/module/classification/operator.py | 4 ++++ src/blenderbim/blenderbim/bim/module/context/operator.py | 4 ++++ .../ifcopenshell/api/classification/remove_classification.py | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/classification/operator.py b/src/blenderbim/blenderbim/bim/module/classification/operator.py index 623aa59770..7119edae3f 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/operator.py +++ b/src/blenderbim/blenderbim/bim/module/classification/operator.py @@ -209,6 +209,10 @@ class DisableEditingClassification(bpy.types.Operator): class RemoveClassification(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.remove_classification" bl_label = "Remove Classification" + bl_description = ( + "The classification and all of its relationships, children references, " + "and relationships between objects and child references will be completely removed from a project" + ) bl_options = {"REGISTER", "UNDO"} classification: bpy.props.IntProperty() diff --git a/src/blenderbim/blenderbim/bim/module/context/operator.py b/src/blenderbim/blenderbim/bim/module/context/operator.py index fa545168aa..bba6561848 100644 --- a/src/blenderbim/blenderbim/bim/module/context/operator.py +++ b/src/blenderbim/blenderbim/bim/module/context/operator.py @@ -53,6 +53,10 @@ class AddContext(bpy.types.Operator, Operator): class RemoveContext(bpy.types.Operator, Operator): bl_idname = "bim.remove_context" bl_label = "Remove Context" + bl_description = ( + "Remove representation context. Any representation geometry that is assigned to the context is also removed. " + "If a context is removed, then any subcontexts are also removed" + ) bl_options = {"REGISTER", "UNDO"} context: bpy.props.IntProperty() diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py index 42ec050d61..72764006c0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py @@ -24,7 +24,7 @@ def remove_classification(file, classification=None) -> None: """Removes an IfcClassification from the project and all references The classification and all of its relationships, children references, - and relationships between objectse and child references are completely + and relationships between objects and child references are completely removed from a project. :param classification: The IfcClassification entity you want to remove From 54a3730c2024e431b08998de73889ef484b63d24 Mon Sep 17 00:00:00 2001 From: Bruno Postle Date: Mon, 6 May 2024 13:55:20 +0100 Subject: [PATCH 100/429] fix d11ec67 mathutils dependency regression mathutils is a blender module, wrap imports in try/except --- .../ifcopenshell/api/geometry/__init__.py | 15 ++++++++++++--- .../ifcopenshell/api/grid/__init__.py | 5 ++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py index 1caaa312ba..0aa8756ea0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py @@ -18,11 +18,17 @@ from .add_axis_representation import add_axis_representation from .add_boolean import add_boolean -from .add_door_representation import add_door_representation +try: + from .add_door_representation import add_door_representation +except ModuleNotFoundError as e: + print(f"Note: API not available due to missing dependencies: geometry.add_door_representation - {e}") from .add_footprint_representation import add_footprint_representation from .add_mesh_representation import add_mesh_representation from .add_profile_representation import add_profile_representation -from .add_railing_representation import add_railing_representation +try: + from .add_railing_representation import add_railing_representation +except ModuleNotFoundError as e: + print(f"Note: API not available due to missing dependencies: geometry.add_railing_representation - {e}") try: from .add_representation import add_representation @@ -30,7 +36,10 @@ except ModuleNotFoundError as e: print(f"Note: API not available due to missing dependencies: geometry.add_representation - {e}") from .add_slab_representation import add_slab_representation from .add_wall_representation import add_wall_representation -from .add_window_representation import add_window_representation +try: + from .add_window_representation import add_window_representation +except ModuleNotFoundError as e: + print(f"Note: API not available due to missing dependencies: geometry.add_window_representation - {e}") from .assign_representation import assign_representation from .connect_element import connect_element from .connect_path import connect_path diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py index c66e86a668..9991a7bc06 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py @@ -16,6 +16,9 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from .create_axis_curve import create_axis_curve +try: + from .create_axis_curve import create_axis_curve +except ModuleNotFoundError as e: + print(f"Note: API not available due to missing dependencies: grid.create_axis_curve - {e}") from .create_grid_axis import create_grid_axis from .remove_grid_axis import remove_grid_axis From a9d785c28f0ef2bdd105a9360b50a1cf5b7e0c19 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 6 May 2024 17:48:25 +0500 Subject: [PATCH 101/429] typing --- src/ifccsv/ifccsv.py | 32 ++++++++++------ .../classification/remove_classification.py | 2 +- .../api/context/remove_context.py | 2 +- .../ifcopenshell/api/pset/edit_pset.py | 38 ++++++++++++------- 4 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/ifccsv/ifccsv.py b/src/ifccsv/ifccsv.py index bcb7f4855f..f89f152a1e 100755 --- a/src/ifccsv/ifccsv.py +++ b/src/ifccsv/ifccsv.py @@ -61,20 +61,20 @@ class IfcCsv: def export( self, - ifc_file, - elements, + ifc_file: ifcopenshell.file, + elements: ifcopenshell.entity_instance, attributes, headers=None, output=None, format=None, - should_preserve_existing=False, - include_global_id=True, - delimiter=",", - null="-", - empty="", - bool_true="YES", - bool_false="NO", - concat=", ", + should_preserve_existing: bool = False, + include_global_id: bool = True, + delimiter: str = ",", + null: str = "-", + empty: str = "", + bool_true: str = "YES", + bool_false: str = "NO", + concat: str = ", ", sort=None, groups=None, summaries=None, @@ -382,8 +382,16 @@ class IfcCsv: return ["{}.{}".format(pset_qto_name, n) for n in results] def Import( - self, ifc_file, table, attributes=None, delimiter=",", null="-", empty="", bool_true="YES", bool_false="NO" - ): + self, + ifc_file: ifcopenshell.file, + table: str, + attributes: Optional[list[Union[str, None]]] = None, + delimiter: str = ",", + null: str = "-", + empty: str = "", + bool_true: str = "YES", + bool_false: str = "NO", + ) -> None: ext = table.split(".")[-1].lower() if ext == "csv": diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py index 72764006c0..21e02d7b86 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_classification(file, classification=None) -> None: +def remove_classification(file: ifcopenshell.entity_instance, classification: ifcopenshell.entity_instance) -> None: """Removes an IfcClassification from the project and all references The classification and all of its relationships, children references, diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py index 9ac30483cf..94547b675e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py @@ -19,7 +19,7 @@ import ifcopenshell -def remove_context(file, context=None) -> None: +def remove_context(file: ifcopenshell.entity_instance, context: ifcopenshell.entity_instance) -> None: """Removes an IfcGeometricRepresentationContext Any representation geometry that is assigned to the context is also diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py index c4955e1605..be3ed6c00a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py @@ -18,9 +18,17 @@ import ifcopenshell import ifcopenshell.util.pset +from typing import Optional, Any, Union -def edit_pset(file, pset=None, name=None, properties=None, pset_template=None, should_purge=False) -> None: +def edit_pset( + file: ifcopenshell.entity_instance, + pset: ifcopenshell.entity_instance, + name: Optional[str] = None, + properties: Optional[dict[str, Any]] = None, + pset_template: Optional[ifcopenshell.entity_instance] = None, + should_purge: bool = False, +) -> None: """Edits a property set and its properties At its simplest usage, this may be used to edit the name of a property @@ -68,7 +76,7 @@ def edit_pset(file, pset=None, name=None, properties=None, pset_template=None, s :param pset_template: If a property set template is provided, this will be used to determine data types. If no user-defined template is provided, the built-in buildingSMART templates will be loaded. - :type pset_template: ifcopenshell.entity_instance + :type pset_template: ifcopenshell.entity_instance, optional :param should_purge: If left as False, properties set to None will be left as None but not removed. If set to true, properties set to None will actually be removed. @@ -158,18 +166,18 @@ def edit_pset(file, pset=None, name=None, properties=None, pset_template=None, s class Usecase: - def execute(self): + def execute(self) -> None: self.update_pset_name() self.load_pset_template() existing_props = self.update_existing_properties() new_props = self.add_new_properties() self.assign_new_properties(existing_props + new_props) - def update_pset_name(self): + def update_pset_name(self) -> None: if self.settings["name"]: self.settings["pset"].Name = self.settings["name"] - def load_pset_template(self): + def load_pset_template(self) -> None: if self.settings["pset_template"]: self.pset_template = self.settings["pset_template"] else: @@ -177,13 +185,13 @@ class Usecase: self.psetqto = ifcopenshell.util.pset.get_template(self.file.schema) self.pset_template = self.psetqto.get_by_name(self.settings["pset"].Name) - def _should_update_prop(self, prop) -> bool: + def _should_update_prop(self, prop: ifcopenshell.entity_instance) -> bool: """ Checks if the given property should be changed """ return prop.Name in self.settings["properties"] - def _try_purge(self, prop) -> bool: + def _try_purge(self, prop: ifcopenshell.entity_instance) -> bool: """ Tries to remove the property if successful, returns True, otherwise False @@ -200,7 +208,7 @@ class Usecase: # For example - IfcPropertyEnumeratedValue to # IfcPropertySingleValue. Or maybe the user should # just delete the property first? - vulevukusej - def update_existing_properties(self): + def update_existing_properties(self) -> list[ifcopenshell.entity_instance]: existing_props = [] for prop in self.get_properties(): if not self._should_update_prop(prop): @@ -222,7 +230,9 @@ class Usecase: raise NotImplementedError(f"Updating '{prop.is_a()}' properties is not supported yet") return existing_props - def update_existing_prop_enum(self, prop): + def update_existing_prop_enum( + self, prop: ifcopenshell.entity_instance + ) -> Union[ifcopenshell.entity_instance, None]: """ NOTE: Assumes the prop exists """ @@ -255,7 +265,9 @@ class Usecase: del self.settings["properties"][prop.Name] return prop - def update_existing_prop_single_value(self, prop): + def update_existing_prop_single_value( + self, prop: ifcopenshell.entity_instance + ) -> Union[ifcopenshell.entity_instance, None]: """ NOTE: Assumes the prop exists """ @@ -278,7 +290,7 @@ class Usecase: del self.settings["properties"][prop.Name] return prop - def add_new_properties(self): + def add_new_properties(self) -> list[ifcopenshell.entity_instance]: properties = [] for name, value in self.settings["properties"].items(): if value is None and self.settings["should_purge"]: @@ -358,13 +370,13 @@ class Usecase: properties.append(self.file.create_entity("IfcPropertySingleValue", **args)) return properties - def assign_new_properties(self, props): + def assign_new_properties(self, props: ifcopenshell.entity_instance) -> None: if hasattr(self.settings["pset"], "HasProperties"): self.settings["pset"].HasProperties = props elif hasattr(self.settings["pset"], "Properties"): self.settings["pset"].Properties = props - def get_properties(self): + def get_properties(self) -> list[ifcopenshell.entity_instance]: """ Returns list of existing properties """ From dcc52fc4e49c49eb0d72e4159c721cea91193df6 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 6 May 2024 18:09:32 +0500 Subject: [PATCH 102/429] pset.edit_pset not to fail silently on invalid enum values #4608 --- src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py index be3ed6c00a..01d5d9b2ea 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py @@ -260,6 +260,11 @@ class Usecase: prop.EnumerationReference.EnumerationValues = value.EnumerationReference.EnumerationValues prop.EnumerationValues = value.EnumerationValues + else: + raise ValueError( + f'Value "{self.settings["properties"][prop.Name]}" is not a valid value for enum property {prop.Name}.' + ) + if unit: prop.Unit = unit del self.settings["properties"][prop.Name] From 28d205b4a3cd77052df9f867f33ee6ecc23b4ba9 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 6 May 2024 18:54:49 +0500 Subject: [PATCH 103/429] show info message on saving/loading csv from bbim --- src/blenderbim/blenderbim/bim/module/csv/operator.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/csv/operator.py b/src/blenderbim/blenderbim/bim/module/csv/operator.py index 34beeb5e27..b62d9b93a1 100644 --- a/src/blenderbim/blenderbim/bim/module/csv/operator.py +++ b/src/blenderbim/blenderbim/bim/module/csv/operator.py @@ -246,6 +246,7 @@ class ExportIfcCsv(bpy.types.Operator): if props.format != "csv" and props.should_generate_svg: schedule_creator = scheduler.Scheduler() schedule_creator.schedule(self.filepath, tool.Drawing.get_path_with_ext(self.filepath, "svg")) + self.report({"INFO"}, f"Data is exported to {props.format.upper()}.") return {"FINISHED"} @@ -285,6 +286,7 @@ class ImportIfcCsv(bpy.types.Operator): if not props.should_load_from_memory: ifc_file.write(props.csv_ifc_file) refresh_ui_data() + self.report({"INFO"}, "Data is imported to IFC.") return {"FINISHED"} From 7e13ed746ee3b4bb8b622697e6cf13a60f170438 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 7 May 2024 10:32:02 +1000 Subject: [PATCH 104/429] Don't rely on util for basic ifcopenshell module capabilities. Keep util as an optional module for users to load. --- .../ifcopenshell/__init__.py | 40 ++++++++++++++++--- src/ifcopenshell-python/ifcopenshell/file.py | 22 +++++----- src/ifcopenshell-python/ifcopenshell/sql.py | 18 ++++++--- .../ifcopenshell/util/file.py | 29 -------------- 4 files changed, 60 insertions(+), 49 deletions(-) delete mode 100644 src/ifcopenshell-python/ifcopenshell/util/file.py diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py index 3f4a6acaa2..7c936f7b06 100644 --- a/src/ifcopenshell-python/ifcopenshell/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/__init__.py @@ -36,8 +36,8 @@ from __future__ import print_function import os import sys -import tempfile import zipfile +import tempfile from pathlib import Path from typing import Optional @@ -73,9 +73,11 @@ from . import guid from .file import file from .entity_instance import entity_instance, register_schema_attributes from .sql import sqlite, sqlite_entity + try: from .stream import stream, stream_entity -except: pass +except: + pass READ_ERROR = ifcopenshell_wrapper.file_open_status.READ_ERROR NO_HEADER = ifcopenshell_wrapper.file_open_status.NO_HEADER @@ -84,11 +86,13 @@ UNSUPPORTED_SCHEMA = ifcopenshell_wrapper.file_open_status.UNSUPPORTED_SCHEMA class Error(Exception): """Error used when a generic problem occurs""" + pass class SchemaError(Error): """Error used when an IFC schema related problem occurs""" + pass @@ -114,7 +118,7 @@ def open(path: "os.PathLike | str", format: str = None, should_stream: bool = Fa """ path = Path(path) if format is None: - format = ifcopenshell.util.file.guess_format(path) + format = guess_format(path) if format == ".ifcXML": f = ifcopenshell_wrapper.parse_ifcxml(str(path.absolute())) if f: @@ -141,8 +145,7 @@ def open(path: "os.PathLike | str", format: str = None, should_stream: bool = Fa NO_HEADER: (Error, "Unable to parse IFC SPF header"), UNSUPPORTED_SCHEMA: ( SchemaError, - "Unsupported schema: %s" - % ",".join(f.header.file_schema.schema_identifiers), + "Unsupported schema: %s" % ",".join(f.header.file_schema.schema_identifiers), ), }[f.good().value()] raise exc(msg) @@ -226,4 +229,31 @@ def schema_by_name( return ifcopenshell_wrapper.schema_by_name(schema) +def guess_format(path: Path) -> Union[str | None]: + """Try to guess format using file extension + + IFCs may be serialised as different formats. The most common is a ``.ifc`` + file, which is plaintext and stores data using the STEP Physical File + format. IFC can also be stored as a Zipfile, XML, JSON, or SQL. + + This will return the canonical form of the format. For example, if a path + has the extension of .xml or .ifcxml (case insensitive), it will return + .ifcXML. + + :return: Either .ifc, .ifcZIP, .ifcXML, .ifcJSON, .ifcSQLite, or None. + """ + suffix = path.suffix.lower() + if suffix == ".ifc": + return ".ifc" + elif suffix in (".ifczip", ".zip"): + return ".ifcZIP" + elif suffix in (".ifcxml", ".xml"): + return ".ifcXML" + elif suffix in (".ifcjson", ".json"): + return ".ifcJSON" + elif suffix in (".ifcsqlite", ".sqlite", ".db"): + return ".ifcSQLite" + return None + + from .main import * diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index 3ca1854db9..40986a3735 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -27,11 +27,10 @@ import re import numbers import zipfile import functools +import ifcopenshell from pathlib import Path from typing import Optional, Any -import ifcopenshell.util.element -import ifcopenshell.util.file from . import ifcopenshell_wrapper from .entity_instance import entity_instance @@ -120,11 +119,19 @@ class Transaction: for inverse in self.file.get_inverse(element): inverse_references = [] for i, attribute in enumerate(inverse): - if ifcopenshell.util.element.has_element_reference(attribute, element): + if self.has_element_reference(attribute, element): inverse_references.append((i, self.serialise_value(inverse, attribute))) inverses[inverse.id()] = inverse_references return inverses + def has_element_reference(self, value: Any, element: ifcopenshell.entity_instance) -> bool: + if isinstance(value, (tuple, list)): + for v in value: + if self.has_element_reference(v, element): + return True + return False + return value == element + def rollback(self): for operation in self.operations[::-1]: if operation["action"] == "create": @@ -376,14 +383,11 @@ class file(object): match = re.match(reg, self.wrapped_data.schema) version_tuple = tuple( map( - lambda pp: int(pp[1][len(pp[0]):]) if pp[1] else None, + lambda pp: int(pp[1][len(pp[0]) :]) if pp[1] else None, ((p, match.group(p)) for p in prefixes), ) ) - return "".join( - "".join(map(str, t)) if t[1] else "" - for t in zip(prefixes, version_tuple[0:2]) - ) + return "".join("".join(map(str, t)) if t[1] else "" for t in zip(prefixes, version_tuple[0:2])) elif attr == "schema_identifier": return self.wrapped_data.schema elif attr == "schema_version": @@ -576,7 +580,7 @@ class file(object): path = Path(path) path.parent.mkdir(parents=True, exist_ok=True) if format == None: - format = ifcopenshell.util.file.guess_format(path) + format = ifcopenshell.guess_format(path) if format == ".ifcXML": serializer = ifcopenshell_wrapper.XmlSerializer(self, str(path)) serializer.finalize() diff --git a/src/ifcopenshell-python/ifcopenshell/sql.py b/src/ifcopenshell-python/ifcopenshell/sql.py index 546b2b4101..343a09561a 100644 --- a/src/ifcopenshell-python/ifcopenshell/sql.py +++ b/src/ifcopenshell-python/ifcopenshell/sql.py @@ -2,7 +2,6 @@ try: import re import json - import ifcopenshell.util.schema from .file import file from . import ifcopenshell_wrapper from .entity_instance import entity_instance @@ -56,6 +55,8 @@ class sqlite(file): self.preprocess_schema() def preprocess_schema(self): + import ifcopenshell.util.schema + self.ifc_class_subtypes = {} self.ifc_class_attributes = {} self.ifc_class_inverse_attributes = {} @@ -122,6 +123,9 @@ class sqlite(file): return entity def by_type(self, type, include_subtypes=True): + # TODO use cached subtypes + import ifcopenshell.util.schema + if self.class_map: results = [] subtypes = self.ifc_class_subtypes[type] if include_subtypes else self.ifc_class_subtypes[type][0:1] @@ -167,7 +171,9 @@ class sqlite(file): return results def get_inverse(self, inst, allow_duplicate=False, with_attribute_indices=False): - query = f"SELECT inverses FROM {inst.sqlite_wrapper.ifc_class} WHERE `ifc_id` = {inst.sqlite_wrapper.id} LIMIT 1" + query = ( + f"SELECT inverses FROM {inst.sqlite_wrapper.ifc_class} WHERE `ifc_id` = {inst.sqlite_wrapper.id} LIMIT 1" + ) self.cursor.execute(query) row = self.cursor.fetchone() if not row or not row[0]: @@ -198,9 +204,9 @@ class sqlite(file): "verts": np.frombuffer(row["verts"]).tolist() if row["verts"] else [], "edges": np.frombuffer(row["edges"], dtype=np.int64).tolist() if row["edges"] else [], "faces": np.frombuffer(row["faces"], dtype=np.int64).tolist() if row["faces"] else [], - "material_ids": np.frombuffer(row["material_ids"], dtype=np.int64).tolist() - if row["material_ids"] - else [], + "material_ids": ( + np.frombuffer(row["material_ids"], dtype=np.int64).tolist() if row["material_ids"] else [] + ), "materials": json.loads(row["materials"]) if row["materials"] else [], } shapes[row["ifc_id"]] = { @@ -353,7 +359,7 @@ class sqlite_entity(entity_instance): def get_info(self, include_identifier=True, recursive=False, return_type=dict, ignore=(), scalar_only=False): info = {"id": self.sqlite_wrapper.id, "type": self.sqlite_wrapper.ifc_class} if not self.sqlite_wrapper.attribute_cache: - self.__getitem__(0) # This will get all attributes + self.__getitem__(0) # This will get all attributes info.update(self.sqlite_wrapper.attribute_cache) return info diff --git a/src/ifcopenshell-python/ifcopenshell/util/file.py b/src/ifcopenshell-python/ifcopenshell/util/file.py deleted file mode 100644 index 2898f5448c..0000000000 --- a/src/ifcopenshell-python/ifcopenshell/util/file.py +++ /dev/null @@ -1,29 +0,0 @@ -# IfcOpenShell - IFC toolkit and geometry engine -# Copyright (C) 2021 Dion Moult -# -# This file is part of IfcOpenShell. -# -# IfcOpenShell is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# IfcOpenShell is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with IfcOpenShell. If not, see . - -from pathlib import Path - - -def guess_format(path: Path) -> "str | None": - """Try to guess format using file extension""" - if path.suffix.lower() in (".ifczip", ".zip"): - return ".ifcZIP" - elif path.suffix.lower() in (".ifcxml", ".xml"): - return ".ifcXML" - elif path.suffix.lower() in (".ifcsqlite", ".sqlite", ".db"): - return ".ifcSQLite" From 89c4cbeb05550bc79e503950d6f6183629813d80 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 7 May 2024 12:17:46 +1000 Subject: [PATCH 105/429] Drop support for Python 2. --- src/ifcopenshell-python/ifcopenshell/__init__.py | 4 ---- .../ifcopenshell/entity_instance.py | 4 ---- .../ifcopenshell/express/mapping.py | 2 -- .../ifcopenshell/express/nodes.py | 3 --- src/ifcopenshell-python/ifcopenshell/file.py | 14 +------------- .../ifcopenshell/geom/__init__.py | 3 --- src/ifcopenshell-python/ifcopenshell/geom/app.py | 4 ---- .../ifcopenshell/geom/code_editor_pane.py | 4 ---- src/ifcopenshell-python/ifcopenshell/geom/main.py | 5 ----- .../ifcopenshell/geom/occ_utils.py | 10 +--------- src/ifcopenshell-python/ifcopenshell/guid.py | 3 --- src/ifcopenshell-python/ifcopenshell/main.py | 4 ---- src/ifcopenshell-python/ifcopenshell/template.py | 4 ---- src/ifcopenshell-python/ifcopenshell/util/data.py | 1 - .../ifcopenshell/util/element.py | 1 - src/ifcopenshell-python/ifcopenshell/util/pset.py | 1 - src/ifcopenshell-python/ifcopenshell/validate.py | 2 -- 17 files changed, 2 insertions(+), 67 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py index 7c936f7b06..205c3c7659 100644 --- a/src/ifcopenshell-python/ifcopenshell/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/__init__.py @@ -30,10 +30,6 @@ Example: model = ifcopenshell.open("/path/to/model.ifc") """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - import os import sys import zipfile diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index b94aedac41..57a2ab528f 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -17,10 +17,6 @@ # along with IfcOpenShell. If not, see . -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - import functools import importlib import numbers diff --git a/src/ifcopenshell-python/ifcopenshell/express/mapping.py b/src/ifcopenshell-python/ifcopenshell/express/mapping.py index f32cc0fae3..ffabee4e82 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/mapping.py +++ b/src/ifcopenshell-python/ifcopenshell/express/mapping.py @@ -17,8 +17,6 @@ # along with IfcOpenShell. If not, see . -from __future__ import print_function - import sys import nodes import templates diff --git a/src/ifcopenshell-python/ifcopenshell/express/nodes.py b/src/ifcopenshell-python/ifcopenshell/express/nodes.py index a6d29650f7..34d3ef747b 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/nodes.py +++ b/src/ifcopenshell-python/ifcopenshell/express/nodes.py @@ -17,13 +17,10 @@ # along with IfcOpenShell. If not, see . -from __future__ import print_function - import io import string import operator import collections - import bootstrap class Node: diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index 40986a3735..0a9f854735 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -17,11 +17,6 @@ # along with IfcOpenShell. If not, see . -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import annotations - import os import re import numbers @@ -34,13 +29,6 @@ from typing import Optional, Any from . import ifcopenshell_wrapper from .entity_instance import entity_instance -try: - # Python 2 - basestring -except NameError: - # Python 3 or newer - basestring = (str, bytes) - class Transaction: def __init__(self, ifc_file): @@ -403,7 +391,7 @@ class file(object): def __getitem__(self, key): if isinstance(key, numbers.Integral): return entity_instance(self.wrapped_data.by_id(key), self) - elif isinstance(key, basestring): + elif isinstance(key, (str, bytes)): return entity_instance(self.wrapped_data.by_guid(str(key)), self) def by_id(self, id: int) -> ifcopenshell.entity_instance: diff --git a/src/ifcopenshell-python/ifcopenshell/geom/__init__.py b/src/ifcopenshell-python/ifcopenshell/geom/__init__.py index 7edfeaa50b..69b7c344a8 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/__init__.py @@ -18,9 +18,6 @@ """Geometry processing and analysis""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function def _has_occ(): diff --git a/src/ifcopenshell-python/ifcopenshell/geom/app.py b/src/ifcopenshell-python/ifcopenshell/geom/app.py index fbba6063a1..28747a6667 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/app.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/app.py @@ -16,10 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - import os import sys import time diff --git a/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py b/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py index fd073e880d..808eb90b25 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py @@ -16,10 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - import os import sys import logging diff --git a/src/ifcopenshell-python/ifcopenshell/geom/main.py b/src/ifcopenshell-python/ifcopenshell/geom/main.py index cbc7f4ce21..23eb66cda7 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/main.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/main.py @@ -17,11 +17,6 @@ # along with IfcOpenShell. If not, see . -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import annotations - import os import sys import operator diff --git a/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py b/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py index 825157ab89..7d879acfc5 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/occ_utils.py @@ -17,20 +17,12 @@ # along with IfcOpenShell. If not, see . -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - import random import operator import warnings from collections import namedtuple - -try: # python 3.3+ - from collections.abc import Iterable -except ImportError: # python 2 - from collections import Iterable +from collections.abc import Iterable import OCC diff --git a/src/ifcopenshell-python/ifcopenshell/guid.py b/src/ifcopenshell-python/ifcopenshell/guid.py index a5e417e251..ac0a2ed181 100644 --- a/src/ifcopenshell-python/ifcopenshell/guid.py +++ b/src/ifcopenshell-python/ifcopenshell/guid.py @@ -18,9 +18,6 @@ """Reads and writes encoded GlobalIds""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function import uuid import string diff --git a/src/ifcopenshell-python/ifcopenshell/main.py b/src/ifcopenshell-python/ifcopenshell/main.py index f9d4dc94a8..632208f4d9 100644 --- a/src/ifcopenshell-python/ifcopenshell/main.py +++ b/src/ifcopenshell-python/ifcopenshell/main.py @@ -17,10 +17,6 @@ # along with IfcOpenShell. If not, see . -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - from . import ifcopenshell_wrapper version = ifcopenshell_wrapper.version() diff --git a/src/ifcopenshell-python/ifcopenshell/template.py b/src/ifcopenshell-python/ifcopenshell/template.py index a7a77ebae6..7e506e3fd6 100644 --- a/src/ifcopenshell-python/ifcopenshell/template.py +++ b/src/ifcopenshell-python/ifcopenshell/template.py @@ -17,10 +17,6 @@ # along with IfcOpenShell. If not, see . -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - import time import uuid diff --git a/src/ifcopenshell-python/ifcopenshell/util/data.py b/src/ifcopenshell-python/ifcopenshell/util/data.py index a66ea80252..b968879c58 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/data.py +++ b/src/ifcopenshell-python/ifcopenshell/util/data.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from __future__ import annotations import numpy as np import ifcopenshell from typing import Any, Union diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index e93a22907b..bb23d1c95a 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from __future__ import annotations import ifcopenshell import ifcopenshell.util.element from typing import Any, Callable, Optional, Union, Literal, overload diff --git a/src/ifcopenshell-python/ifcopenshell/util/pset.py b/src/ifcopenshell-python/ifcopenshell/util/pset.py index 4a8ce5c89d..6156af3f9c 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/pset.py +++ b/src/ifcopenshell-python/ifcopenshell/util/pset.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -from __future__ import annotations import re import pathlib import ifcopenshell diff --git a/src/ifcopenshell-python/ifcopenshell/validate.py b/src/ifcopenshell-python/ifcopenshell/validate.py index 2b7b8af5ea..fa51bbde15 100644 --- a/src/ifcopenshell-python/ifcopenshell/validate.py +++ b/src/ifcopenshell-python/ifcopenshell/validate.py @@ -32,8 +32,6 @@ Available flags: - ``--fields``: Output more detailed information about failed entities (available only with ``--json``). """ -from __future__ import print_function - import os import sys import json From 424a06f6c8ff929da4029d362cbb64a58afd69ed Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 7 May 2024 14:58:12 +1000 Subject: [PATCH 106/429] More cleaning up of forward type hints to fix import errors --- .../ifcopenshell/__init__.py | 19 ++++++------------- .../ifcopenshell/api/root/create_entity.py | 1 + .../ifcopenshell/geom/main.py | 2 +- .../ifcopenshell/util/data.py | 2 +- .../ifcopenshell/util/pset.py | 6 +++--- 5 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py index 205c3c7659..9042ff7d1d 100644 --- a/src/ifcopenshell-python/ifcopenshell/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/__init__.py @@ -35,9 +35,8 @@ import sys import zipfile import tempfile from pathlib import Path -from typing import Optional +from typing import Optional, Union -import ifcopenshell.util.file if hasattr(os, "uname"): platform_system = os.uname()[0].lower() @@ -56,16 +55,9 @@ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "lib", p try: from . import ifcopenshell_wrapper -except Exception as e: - if int(python_version_tuple[0]) == 2: - # Only for py2, as py3 has exception chaining - import traceback - - traceback.print_exc() - print("-" * 64) +except Exception: raise ImportError("IfcOpenShell not built for '%s'" % python_distribution) -from . import guid from .file import file from .entity_instance import entity_instance, register_schema_attributes from .sql import sqlite, sqlite_entity @@ -92,11 +84,12 @@ class SchemaError(Error): pass -def open(path: "os.PathLike | str", format: str = None, should_stream: bool = False) -> file: +def open(path: Union[os.PathLike, str], format: Optional[str] = None, should_stream: bool = False) -> file: """Loads an IFC dataset from a filepath - You can specify a file format. If no format is given, it is guessed from its extension. - Currently supported specified format : .ifc | .ifcZIP | .ifcXML + You can specify a file format. If no format is given, it is guessed from + its extension. Currently supported specified format: .ifc | .ifcZIP | + .ifcXML. You can then filter by element ID, class, etc, and subscript by id or guid. diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py index 5bb64d411a..c1ab6c77e1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid from typing import Optional diff --git a/src/ifcopenshell-python/ifcopenshell/geom/main.py b/src/ifcopenshell-python/ifcopenshell/geom/main.py index 23eb66cda7..3cd1cb3c5c 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/main.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/main.py @@ -148,7 +148,7 @@ class tree(ifcopenshell_wrapper.tree): def select( self, value: Union[ - entity_instance, ifcopenshell_wrapper.BRepElement, tuple[float, float, float], TopoDS.TopoDS_Shape + entity_instance, ifcopenshell_wrapper.BRepElement, tuple[float, float, float], "TopoDS.TopoDS_Shape" ], **kwargs, ) -> list[entity_instance]: diff --git a/src/ifcopenshell-python/ifcopenshell/util/data.py b/src/ifcopenshell-python/ifcopenshell/util/data.py index b968879c58..365f0df2cb 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/data.py +++ b/src/ifcopenshell-python/ifcopenshell/util/data.py @@ -30,7 +30,7 @@ class Clipping: operand_type: str = "IfcHalfSpaceSolid" @classmethod - def parse(cls, raw_data: Any) -> Union[ifcopenshell.entity_instance, Clipping, None]: + def parse(cls, raw_data: Any) -> Union[ifcopenshell.entity_instance, "Clipping", None]: """Parse various formats into a clipping object `raw_data` can be either: diff --git a/src/ifcopenshell-python/ifcopenshell/util/pset.py b/src/ifcopenshell-python/ifcopenshell/util/pset.py index 6156af3f9c..97db6ff4b2 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/pset.py +++ b/src/ifcopenshell-python/ifcopenshell/util/pset.py @@ -23,12 +23,12 @@ import ifcopenshell.util.schema import ifcopenshell.util.type from ifcopenshell.entity_instance import entity_instance from functools import lru_cache -from typing import List, Generator, Optional +from typing import List, Optional -templates: dict[str, PsetQto] = {} +templates: dict[str, "PsetQto"] = {} -def get_template(schema: str) -> PsetQto: +def get_template(schema: str) -> "PsetQto": global templates if schema not in templates: templates[schema] = PsetQto(schema) From f6c2e2c20d978a33233940612de32b8ba7ed4110 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 7 May 2024 15:44:06 +1000 Subject: [PATCH 107/429] Fix #4530. Fix various styling issues on docs. --- src/blenderbim/docs/_static/custom.css | 4 ++++ src/blenderbim/docs/conf.py | 6 ++++++ src/ifcopenshell-python/docs/_static/custom.css | 4 ++++ src/ifcopenshell-python/docs/conf.py | 6 ++++++ 4 files changed, 20 insertions(+) diff --git a/src/blenderbim/docs/_static/custom.css b/src/blenderbim/docs/_static/custom.css index 03f5b9016f..f6939f3ac5 100644 --- a/src/blenderbim/docs/_static/custom.css +++ b/src/blenderbim/docs/_static/custom.css @@ -8,6 +8,9 @@ h1, h2, h3, h4 { -webkit-background-clip: text; -webkit-text-fill-color: transparent; } +h1 code.literal { + background: none; +} a { text-decoration: none; } @@ -16,6 +19,7 @@ a { } .sidebar-brand-text { font-size: 1rem; + text-align: center; } .blockbutton { max-width: 500px; diff --git a/src/blenderbim/docs/conf.py b/src/blenderbim/docs/conf.py index 69afbca790..aaf5908bf0 100644 --- a/src/blenderbim/docs/conf.py +++ b/src/blenderbim/docs/conf.py @@ -95,7 +95,10 @@ html_theme_options = { "color-background-border": "#cfd0cb", "color-foreground-primary": "#2e3436", "color-sidebar-item-background--hover": "#f7f7f6", + "color-link": "#39b54a", + "color-link--visited": "#39b54a", "color-link--hover": "#d98014", + "color-link--visited--hover": "#d98014", "font-stack": "Nunito, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji" }, "dark_css_variables": { @@ -106,7 +109,10 @@ html_theme_options = { "color-background-border": "#2e3436", "color-foreground-primary": "#eeeeec", "color-sidebar-item-background--hover": "#2e3436", + "color-link": "#39b54a", + "color-link--visited": "#39b54a", "color-link--hover": "#d98014", + "color-link--visited--hover": "#d98014", "font-stack": "Nunito, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji" }, diff --git a/src/ifcopenshell-python/docs/_static/custom.css b/src/ifcopenshell-python/docs/_static/custom.css index c1e237ec6c..a32a849707 100644 --- a/src/ifcopenshell-python/docs/_static/custom.css +++ b/src/ifcopenshell-python/docs/_static/custom.css @@ -8,6 +8,9 @@ h1, h2, h3, h4 { -webkit-background-clip: text; -webkit-text-fill-color: transparent; } +h1 code.literal { + background: none; +} a { text-decoration: none; } @@ -16,6 +19,7 @@ a { } .sidebar-brand-text { font-size: 1rem; + text-align: center; } .blockbutton { max-width: 500px; diff --git a/src/ifcopenshell-python/docs/conf.py b/src/ifcopenshell-python/docs/conf.py index 23b45563c1..6537ba29f8 100644 --- a/src/ifcopenshell-python/docs/conf.py +++ b/src/ifcopenshell-python/docs/conf.py @@ -130,7 +130,10 @@ html_theme_options = { "color-background-border": "#cfd0cb", "color-foreground-primary": "#2e3436", "color-sidebar-item-background--hover": "#f7f7f6", + "color-link": "#39b54a", + "color-link--visited": "#39b54a", "color-link--hover": "#d98014", + "color-link--visited--hover": "#d98014", "font-stack": "Nunito, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji" }, "dark_css_variables": { @@ -141,7 +144,10 @@ html_theme_options = { "color-background-border": "#2e3436", "color-foreground-primary": "#eeeeec", "color-sidebar-item-background--hover": "#2e3436", + "color-link": "#39b54a", + "color-link--visited": "#39b54a", "color-link--hover": "#d98014", + "color-link--visited--hover": "#d98014", "font-stack": "Nunito, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji" }, From 26434f0331dad5b5b5d2ff9a07a260b790baed6c Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 7 May 2024 15:51:48 +1000 Subject: [PATCH 108/429] Fix #4589. Symlink entire ifcopenshell dir for dev setups. --- src/blenderbim/docs/devs/installation.rst | 25 +++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/blenderbim/docs/devs/installation.rst b/src/blenderbim/docs/devs/installation.rst index ba881b51f5..d3fe796316 100644 --- a/src/blenderbim/docs/devs/installation.rst +++ b/src/blenderbim/docs/devs/installation.rst @@ -92,13 +92,14 @@ For Linux or Mac: $ ln -s $PWD/src/blenderbim/blenderbim/tool $BLENDER_ADDON_PATH/tool $ ln -s $PWD/src/blenderbim/blenderbim/bim $BLENDER_ADDON_PATH/bim - # Remove the IfcOpenShell dependency Python code - $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifcopenshell/api - $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifcopenshell/util + # Copy over compiled IfcOpenShell files + $ cp $BLENDER_ADDON_PATH/libs/site/packages/ifcopenshell/*_wrapper* $PWD/src/ifcopenshell-python/ifcopenshell/ + + # Remove the IfcOpenShell dependency + $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifcopenshell # Replace them with links to the Git repository - $ ln -s $PWD/src/ifcopenshell-python/ifcopenshell/api $BLENDER_ADDON_PATH/libs/site/packages/ifcopenshell/api - $ ln -s $PWD/src/ifcopenshell-python/ifcopenshell/util $BLENDER_ADDON_PATH/libs/site/packages/ifcopenshell/util + $ ln -s $PWD/src/ifcopenshell-python/ifcopenshell $BLENDER_ADDON_PATH/libs/site/packages/ifcopenshell # Remove and link other IfcOpenShell utilities $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifccsv.py @@ -153,21 +154,19 @@ Before running it follow the instructions descibed after `rem` tags. rd /S /Q "%blenderbim%\tool\" rd /S /Q "%blenderbim%\bim\" - echo Replacing them with links to the Git repository... mklink /D "%blenderbim%\core" "%cd%\src\blenderbim\blenderbim\core" mklink /D "%blenderbim%\tool" "%cd%\src\blenderbim\blenderbim\tool" mklink /D "%blenderbim%\bim" "%cd%\src\blenderbim\blenderbim\bim" + echo Copy over compiled IfcOpenShell files... + copy %blenderbim%\libs\site\packages\ifcopenshell\*_wrapper* %cd%\src\ifcopenshell-python\ifcopenshell\ - echo Remove the IfcOpenShell dependency Python code... - rd /S /Q "%blenderbim%\libs\site\packages\ifcopenshell\api" - rd /S /Q "%blenderbim%\libs\site\packages\ifcopenshell\util" + echo Remove the IfcOpenShell dependency... + rd /S /Q "%blenderbim%\libs\site\packages\ifcopenshell" - - echo Replacing them with links to the Git repository... - mklink /D "%blenderbim%\libs\site\packages\ifcopenshell\api" "%cd%\src\ifcopenshell-python\ifcopenshell\api" - mklink /D "%blenderbim%\libs\site\packages\ifcopenshell\util" "%cd%\src\ifcopenshell-python\ifcopenshell\util" + echo Replace them with links to the Git repository... + mklink /D "%blenderbim%\libs\site\packages\ifcopenshell" "%cd%\src\ifcopenshell-python\ifcopenshell" echo Remove and link other IfcOpenShell utilities... del "%blenderbim%\libs\site\packages\ifccsv.py" From 0a3dddef2f793c8ca1efdfc0d2b00a40956caf72 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 7 May 2024 16:03:07 +1000 Subject: [PATCH 109/429] More Python 2 to Python 3 upgrades --- src/ifcopenshell-python/ifcopenshell/entity_instance.py | 2 +- src/ifcopenshell-python/ifcopenshell/express/codegen.py | 2 +- src/ifcopenshell-python/ifcopenshell/file.py | 2 +- src/ifcopenshell-python/ifcopenshell/geom/app.py | 2 +- src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index 57a2ab528f..a0d44b1b23 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -100,7 +100,7 @@ for nm in ifcopenshell_wrapper.schema_names(): register_schema_attributes(schema) -class entity_instance(object): +class entity_instance: """Base class for all IFC objects. An instantiated entity_instance will have methods of Python and the IFC class itself. diff --git a/src/ifcopenshell-python/ifcopenshell/express/codegen.py b/src/ifcopenshell-python/ifcopenshell/express/codegen.py index efdd9c918d..fe997091b1 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/codegen.py +++ b/src/ifcopenshell-python/ifcopenshell/express/codegen.py @@ -29,7 +29,7 @@ def indent(n, s): return "\n".join(" "*n + l for l in splitted) -class Base(object): +class Base: """ A base class for all code generation classes. Currently only working around some python 2/3 incompatibilities in terms of unicode file handling. diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index 0a9f854735..c1ba69c22c 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -176,7 +176,7 @@ class Transaction: file_dict = {} -class file(object): +class file: """Base class for containing IFC files. Class has instance methods for filtering by element Id, Type, etc. diff --git a/src/ifcopenshell-python/ifcopenshell/geom/app.py b/src/ifcopenshell-python/ifcopenshell/geom/app.py index 28747a6667..298b5b37ab 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/app.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/app.py @@ -122,7 +122,7 @@ class geometry_creation_thread(QtCore.QThread): self.signals.completed.emit((it, self.f, list(_()))) -class configuration(object): +class configuration: def __init__(self): try: import ConfigParser diff --git a/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py b/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py index 808eb90b25..f84f45a234 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/code_editor_pane.py @@ -45,7 +45,7 @@ except BaseException: CodeEdit = QtWidgets.QPlainTextEdit -class StdoutRedirector(object): +class StdoutRedirector: """A class for redirecting stdout to this Text widget.""" def __init__(self, widget): From 722201a1aff162924a46f4dd366af222319644e4 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 7 May 2024 17:15:58 +1000 Subject: [PATCH 110/429] Add py.typed for static analysis with mypy --- src/ifcopenshell-python/ifcopenshell/py.typed | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/ifcopenshell-python/ifcopenshell/py.typed diff --git a/src/ifcopenshell-python/ifcopenshell/py.typed b/src/ifcopenshell-python/ifcopenshell/py.typed new file mode 100644 index 0000000000..e69de29bb2 From d76462ca4290c7d29abbba451f95feaf66581683 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 7 May 2024 17:32:47 +1000 Subject: [PATCH 111/429] Write more documentation Sphinx autoapi also now only shows subpackages 1 level deep. This prevents us having a huge long list. Also don't show private or special members. Also show imported members so ifcopenshell.file and ifcopenshell.entity_instance works in docs too. --- .../docs/_autoapi_templates/index.rst | 16 +++ .../docs/_autoapi_templates/python/module.rst | 114 ++++++++++++++++++ src/ifcopenshell-python/docs/conf.py | 5 +- .../ifcopenshell/__init__.py | 38 +++++- .../ifcopenshell/api/__init__.py | 22 ++-- .../ifcopenshell/entity_instance.py | 47 ++++---- src/ifcopenshell-python/ifcopenshell/file.py | 28 +++-- .../ifcopenshell/geom/__init__.py | 10 +- src/ifcopenshell-python/ifcopenshell/guid.py | 8 +- src/ifcopenshell-python/ifcopenshell/main.py | 23 ---- .../ifcopenshell/util/__init__.py | 11 +- 11 files changed, 248 insertions(+), 74 deletions(-) create mode 100644 src/ifcopenshell-python/docs/_autoapi_templates/index.rst create mode 100644 src/ifcopenshell-python/docs/_autoapi_templates/python/module.rst delete mode 100644 src/ifcopenshell-python/ifcopenshell/main.py diff --git a/src/ifcopenshell-python/docs/_autoapi_templates/index.rst b/src/ifcopenshell-python/docs/_autoapi_templates/index.rst new file mode 100644 index 0000000000..8a3234fefc --- /dev/null +++ b/src/ifcopenshell-python/docs/_autoapi_templates/index.rst @@ -0,0 +1,16 @@ +Python API Reference +==================== + +This page contains auto-generated API reference documentation [#f1]_. + +.. toctree:: + :titlesonly: + :maxdepth: 1 + + {% for page in pages %} + {% if page.top_level_object and page.display %} + {{ page.include_path }} + {% endif %} + {% endfor %} + +.. [#f1] Created with `sphinx-autoapi `_ diff --git a/src/ifcopenshell-python/docs/_autoapi_templates/python/module.rst b/src/ifcopenshell-python/docs/_autoapi_templates/python/module.rst new file mode 100644 index 0000000000..c522bf2092 --- /dev/null +++ b/src/ifcopenshell-python/docs/_autoapi_templates/python/module.rst @@ -0,0 +1,114 @@ +{% if not obj.display %} +:orphan: + +{% endif %} +:py:mod:`{{ obj.name }}` +=========={{ "=" * obj.name|length }} + +.. py:module:: {{ obj.name }} + +{% if obj.docstring %} +.. autoapi-nested-parse:: + + {{ obj.docstring|indent(3) }} + +{% endif %} + +{% block subpackages %} +{% set visible_subpackages = obj.subpackages|selectattr("display")|list %} +{% if visible_subpackages %} +Subpackagesa +------------ +.. toctree:: + :titlesonly: + :maxdepth: 1 + +{% for subpackage in visible_subpackages %} + {{ subpackage.short_name }}/index.rst +{% endfor %} + + +{% endif %} +{% endblock %} +{% block submodules %} +{% set visible_submodules = obj.submodules|selectattr("display")|list %} +{% if visible_submodules %} +Submodules +---------- +.. toctree:: + :titlesonly: + :maxdepth: 1 + +{% for submodule in visible_submodules %} + {{ submodule.short_name }}/index.rst +{% endfor %} + + +{% endif %} +{% endblock %} +{% block content %} +{% if obj.all is not none %} +{% set visible_children = obj.children|selectattr("short_name", "in", obj.all)|list %} +{% elif obj.type is equalto("package") %} +{% set visible_children = obj.children|selectattr("display")|list %} +{% else %} +{% set visible_children = obj.children|selectattr("display")|rejectattr("imported")|list %} +{% endif %} +{% if visible_children %} +{{ obj.type|title }} Contents +{{ "-" * obj.type|length }}--------- + +{% set visible_classes = visible_children|selectattr("type", "equalto", "class")|list %} +{% set visible_functions = visible_children|selectattr("type", "equalto", "function")|list %} +{% set visible_attributes = visible_children|selectattr("type", "equalto", "data")|list %} +{% if "show-module-summary" in autoapi_options and (visible_classes or visible_functions) %} +{% block classes scoped %} +{% if visible_classes %} +Classes +~~~~~~~ + +.. autoapisummary:: + +{% for klass in visible_classes %} + {{ klass.id }} +{% endfor %} + + +{% endif %} +{% endblock %} + +{% block functions scoped %} +{% if visible_functions %} +Functions +~~~~~~~~~ + +.. autoapisummary:: + +{% for function in visible_functions %} + {{ function.id }} +{% endfor %} + + +{% endif %} +{% endblock %} + +{% block attributes scoped %} +{% if visible_attributes %} +Attributes +~~~~~~~~~~ + +.. autoapisummary:: + +{% for attribute in visible_attributes %} + {{ attribute.id }} +{% endfor %} + + +{% endif %} +{% endblock %} +{% endif %} +{% for obj_item in visible_children %} +{{ obj_item.render()|indent(0) }} +{% endfor %} +{% endif %} +{% endblock %} diff --git a/src/ifcopenshell-python/docs/conf.py b/src/ifcopenshell-python/docs/conf.py index 6537ba29f8..9106e4359e 100644 --- a/src/ifcopenshell-python/docs/conf.py +++ b/src/ifcopenshell-python/docs/conf.py @@ -74,6 +74,9 @@ autoapi_dirs = ['../ifcopenshell', '../../bcf/src', '../../bsdd', '../../ifccsv' # These are auto-generated based on the IFC schema, so exclude them autoapi_ignore = ['*ifcopenshell/express/rules*'] +# Custom autoapi templates to make it easier to read our docs +autoapi_template_dir = "_autoapi_templates" + # autoapi_options doesn't have show-module-summary, as it tends to create one # page per function which contradicts the presentation of showing all functions # as a list. This creates two possible locations where a function is documented @@ -81,7 +84,7 @@ autoapi_ignore = ['*ifcopenshell/express/rules*'] # ifcopenshell.file is imported from ifcopenshell.file.file, but it gets pretty # confusing to see the docs again in multiple places (seriously, # ifcopenshell.file.file is everywhere). -autoapi_options = ['members', 'undoc-members', 'private-members', 'special-members', 'show-inheritance'] +autoapi_options = ['members', 'undoc-members', 'show-inheritance', 'imported-members'] # This option is set to both to allow both class docstrings and __init__ docstrings. autoapi_python_class_content = 'both' diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py index 9042ff7d1d..75f5f426f4 100644 --- a/src/ifcopenshell-python/ifcopenshell/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/__init__.py @@ -16,18 +16,42 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -"""The entry module for IfcOpenShell +"""Welcome to IfcOpenShell! IfcOpenShell provides a way to read and write IFCs. -Typically used for opening an IFC via a filepath, or accessing one of the -submodules. +IfcOpenShell can open IFC files, read entities (such as walls, buildings, +properties, systems, etc), edit attributes, write out ``.ifc`` files and more. + +This module provides primitive functions to interact with IFC, including: + +- For most users, you can open and read IFC models, see docs for :func:`open`. + This returns an :class:`file` object representing the IFC model. You can then + query the model to filter elements. +- For developers, you can query the schema itself, see docs for + :func:`schema_by_name`. This returns a schema object which you can use to + analyse the definitions of IFC classes and data types. + +You may also be interested in: + +- For model authoring and editing operations, see :mod:`ifcopenshell.api`. +- For extracting information from models, see :mod:`ifcopenshell.util`. +- For processing geometry, see :mod:`ifcopenshell.geom`. + + +For more details, consult https://docs.ifcopenshell.org/ Example: .. code:: python import ifcopenshell + print(ifcopenshell.version) # v0.7.0-1b1fd1e6 + model = ifcopenshell.open("/path/to/model.ifc") + walls = model.by_type("IfcWall") + + for wall in walls: + print(wall.Name) """ import os @@ -219,7 +243,7 @@ def schema_by_name( def guess_format(path: Path) -> Union[str | None]: - """Try to guess format using file extension + """Guesses the IFC format using file extension IFCs may be serialised as different formats. The most common is a ``.ifc`` file, which is plaintext and stores data using the STEP Physical File @@ -229,6 +253,9 @@ def guess_format(path: Path) -> Union[str | None]: has the extension of .xml or .ifcxml (case insensitive), it will return .ifcXML. + Users generally won't call this function. The :func:`open` function uses + this internally to guess the file format. + :return: Either .ifc, .ifcZIP, .ifcXML, .ifcJSON, .ifcSQLite, or None. """ suffix = path.suffix.lower() @@ -245,4 +272,5 @@ def guess_format(path: Path) -> Union[str | None]: return None -from .main import * +version = ifcopenshell_wrapper.version() +get_log = ifcopenshell_wrapper.get_log diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index dcfbd1821c..a4e99ad318 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -16,7 +16,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -"""High level user-oriented IFC authoring capabilities""" +"""High level IFC authoring and editing functions + +Authoring, editing, and deleting IFC data requires a detailed understanding of +the rules of the IFC schema. This API module provides simple to use authoring +functions that hide this complexity from you. Things like managing differences +between IFC versions, tracking owernship changes, or cleaning up after orphaned +relationships are all handled automatically. +""" import json import numpy @@ -24,13 +31,12 @@ import pkgutil import inspect import importlib import ifcopenshell -import ifcopenshell.api from typing import Callable, Any, Optional from functools import partial -pre_listeners = {} -post_listeners = {} +pre_listeners: dict[str, dict] = {} +post_listeners: dict[str, dict] = {} def batching_argument_deprecation( @@ -128,8 +134,8 @@ ARGUMENTS_DEPRECATION = { } -CACHED_USECASE_CLASSES = {} -CACHED_USECASES = {} +CACHED_USECASE_CLASSES: dict[str, Callable] = {} +CACHED_USECASES: dict[str, Callable] = {} def run( @@ -250,8 +256,6 @@ def extract_docs(module, usecase): import typing import collections - results = [] - inputs = collections.OrderedDict() function_init = getattr(getattr(ifcopenshell.api, module), usecase).Usecase.__init__ @@ -307,7 +311,7 @@ def wrap_usecase(usecase_path, usecase): try: result = usecase(*args, **settings) except TypeError as e: - msg = f"Incorrect function arguments provided for {usecase_path}\n{str(e)}. You specified args {args} and settings {settings}\n\nCorrect signature is {inspect.signature(Usecase.__init__)}\nSee help(ifcopenshell.api.{usecase_path}) for documentation." + msg = f"Incorrect function arguments provided for {usecase_path}\n{str(e)}. You specified args {args} and settings {settings}\n\nCorrect signature is {inspect.signature(usecase)}\nSee help(ifcopenshell.api.{usecase_path}) for documentation." raise TypeError(msg) from e if should_run_listeners: diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index a0d44b1b23..c1c4fd79b4 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -196,33 +196,36 @@ class entity_instance: @staticmethod def walk(f: Callable[[Any], bool], g: Callable[[Any], Any], value: Any) -> Any: - """ - Applies transformation to `value` based on a given condition. - If value is a nested structure (e.g., a list or a tuple) will apply transformation to it's elements. - . + """Applies a transformation to `value` based on a given condition. - :param f: A callable that takes a single argument and returns a boolean value. It represents the condition - :type f: Callable - :param g: A callable that takes a single argument and returns a transformed value. It represents the transformation - :type g: Callable - :param value: Any object, the input value to be processed - :type value: Any - :return: Transformed value - :rtype: Any + If value is a nested structure (e.g., a list or a tuple) will apply + transformation to it's elements. - Example: + :param f: A callable that takes a single argument and returns a boolean + value. It represents the condition. + :type f: Callable + :param g: A callable that takes a single argument and returns a + transformed value. It represents the transformation. + :type g: Callable + :param value: Any object, the input value to be processed + :type value: Any + :return: Transformed value + :rtype: Any - .. code:: python + Example: - # Define condition and transformation functions - condition = lambda v: v == old - transform = lambda v: new + .. code:: python - # Usage example - attribute_value = element.RelatedElements - print(old in attribute_value, new in attribute_value) # True, False - result = element.walk(condition, transform, element.RelatedElements) - print(old in attribute_value, new in attribute_value) # False, True + # Define condition and transformation functions + condition = lambda v: v == old + transform = lambda v: new + + # Usage example + attribute_value = element.RelatedElements + print(old in attribute_value, new in attribute_value) # True, False + + result = element.walk(condition, transform, element.RelatedElements) + print(old in attribute_value, new in attribute_value) # False, True """ if isinstance(value, (tuple, list)): diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index c1ba69c22c..85be898392 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -550,20 +550,26 @@ class file: def __iter__(self): return iter(self[id] for id in self.wrapped_data.entity_names()) - def write(self, path: "os.PathLike | str", format=None, zipped=False) -> None: + def write(self, path: "os.PathLike | str", format: Optional[str] = None, zipped: bool = False) -> None: """Write ifc model to file. - :param format: Force use of a specific format. Guessed from file name if None. - Supported formats : .ifc, .ifcXML, .ifcZIP (equivalent to format=".ifc" with zipped=True) - For zipped .ifcXML use format=".ifcXML" with zipped=True + :param format: Force use of a specific format. Guessed from file name + if None. Supported formats : .ifc, .ifcXML, .ifcZIP (equivalent to + format=".ifc" with zipped=True) For zipped .ifcXML use + format=".ifcXML" with zipped=True + :type format: str :param zipped: zip the file after it is written + :type zipped: bool - Examples: - >>> model.write("path/to/model.ifc") - >>> model.write("path/to/model.ifcXML") - >>> model.write("path/to/model.ifcZIP") - >>> model.write("path/to/model.ifcZIP", format=".ifcXML", zipped=True) - >>> model.write("path/to/model.anyextension", format=".ifcXML") + Example: + + .. code:: python + + model.write("path/to/model.ifc") + model.write("path/to/model.ifcXML") + model.write("path/to/model.ifcZIP") + model.write("path/to/model.ifcZIP", format=".ifcXML", zipped=True) + model.write("path/to/model.anyextension", format=".ifcXML") """ path = Path(path) path.parent.mkdir(parents=True, exist_ok=True) @@ -595,7 +601,7 @@ class file: return @staticmethod - def from_string(s: str) -> file: + def from_string(s: str) -> "file": return file(ifcopenshell_wrapper.read(s)) @staticmethod diff --git a/src/ifcopenshell-python/ifcopenshell/geom/__init__.py b/src/ifcopenshell-python/ifcopenshell/geom/__init__.py index 69b7c344a8..38021e325f 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/__init__.py @@ -16,8 +16,16 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -"""Geometry processing and analysis""" +"""Geometry processing and analysis +IFC may define geometry explicitly (such as meshes) or implicitly (such as +parametric extrusions). This module provides methods to extract geometric +definitions in IFC into explicitly tessellated triangles or OpenCASCADE Breps +for further processing. + +This is typically needed when writing software to visualise or analyse +geometry. See also :mod:`ifcopenshell.util.shape` for deriving quantities. +""" def _has_occ(): diff --git a/src/ifcopenshell-python/ifcopenshell/guid.py b/src/ifcopenshell-python/ifcopenshell/guid.py index ac0a2ed181..eb11f31ba1 100644 --- a/src/ifcopenshell-python/ifcopenshell/guid.py +++ b/src/ifcopenshell-python/ifcopenshell/guid.py @@ -16,8 +16,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -"""Reads and writes encoded GlobalIds""" +"""Reads and writes encoded GlobalIds +IFC entities may be identified using a unique ID (called a UUID or GUID). This +128-bit label is often represented in the form +xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. However, in IFC, it is also usually +stored as a 22 character base 64 encoded string. This module lets you convert +between these representations and generate new UUIDs. +""" import uuid import string diff --git a/src/ifcopenshell-python/ifcopenshell/main.py b/src/ifcopenshell-python/ifcopenshell/main.py deleted file mode 100644 index 632208f4d9..0000000000 --- a/src/ifcopenshell-python/ifcopenshell/main.py +++ /dev/null @@ -1,23 +0,0 @@ -# IfcOpenShell - IFC toolkit and geometry engine -# Copyright (C) 2021 Thomas Krijnen -# -# This file is part of IfcOpenShell. -# -# IfcOpenShell is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# IfcOpenShell is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with IfcOpenShell. If not, see . - - -from . import ifcopenshell_wrapper - -version = ifcopenshell_wrapper.version() -get_log = ifcopenshell_wrapper.get_log diff --git a/src/ifcopenshell-python/ifcopenshell/util/__init__.py b/src/ifcopenshell-python/ifcopenshell/util/__init__.py index 944d7db18c..bcd1e83caf 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/util/__init__.py @@ -16,4 +16,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -"""Utility functions for common IFC queries""" +"""Utility functions for extracting IFC data + +Data in IFC files is represented using relationships between IFC entities. To +extract data like "what properties does this wall have" involves looping +through these relationships which can be tedious. + +This module makes it easy to get commonly requested data from IFC +relationships, such as properties of a wall, what elements are connected to +pipes, dates from work schedules, filtering maintainable elements, and more. +""" From 93639e9e50e28dceaf0f9db8f252a4ae52e07693 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 7 May 2024 19:08:13 +1000 Subject: [PATCH 112/429] Even more cleaning of documentation references --- src/blenderbim/docs/_static/custom.css | 3 - .../docs/_autoapi_templates/python/module.rst | 4 +- .../docs/_static/custom.css | 26 +++- .../docs/introduction/how_to_contribute.rst | 7 +- .../ifcopenshell/__init__.py | 4 +- .../ifcopenshell/entity_instance.py | 46 +++++-- src/ifcopenshell-python/ifcopenshell/file.py | 36 ++--- .../ifcopenshell/util/constraint.py | 12 +- .../ifcopenshell/util/element.py | 128 +++++++++--------- .../ifcopenshell/util/geolocation.py | 10 +- .../ifcopenshell/util/placement.py | 10 +- .../ifcopenshell/util/representation.py | 4 +- .../ifcopenshell/util/selector.py | 6 +- .../ifcopenshell/util/shape.py | 16 +-- .../ifcopenshell/util/unit.py | 8 +- 15 files changed, 181 insertions(+), 139 deletions(-) diff --git a/src/blenderbim/docs/_static/custom.css b/src/blenderbim/docs/_static/custom.css index f6939f3ac5..6e5709c7c9 100644 --- a/src/blenderbim/docs/_static/custom.css +++ b/src/blenderbim/docs/_static/custom.css @@ -8,9 +8,6 @@ h1, h2, h3, h4 { -webkit-background-clip: text; -webkit-text-fill-color: transparent; } -h1 code.literal { - background: none; -} a { text-decoration: none; } diff --git a/src/ifcopenshell-python/docs/_autoapi_templates/python/module.rst b/src/ifcopenshell-python/docs/_autoapi_templates/python/module.rst index c522bf2092..cbd5f30094 100644 --- a/src/ifcopenshell-python/docs/_autoapi_templates/python/module.rst +++ b/src/ifcopenshell-python/docs/_autoapi_templates/python/module.rst @@ -17,8 +17,8 @@ {% block subpackages %} {% set visible_subpackages = obj.subpackages|selectattr("display")|list %} {% if visible_subpackages %} -Subpackagesa ------------- +Subpackages +----------- .. toctree:: :titlesonly: :maxdepth: 1 diff --git a/src/ifcopenshell-python/docs/_static/custom.css b/src/ifcopenshell-python/docs/_static/custom.css index a32a849707..1c1de1de08 100644 --- a/src/ifcopenshell-python/docs/_static/custom.css +++ b/src/ifcopenshell-python/docs/_static/custom.css @@ -51,14 +51,32 @@ section img { box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px; border-radius: 5px; } + +/* Make it clearer which signatures are part of a class */ .py.class { - /* Make it clearer which signatures are part of a class */ border-left: 3px solid var(--color-brand-primary); } -.py.function, .py.method { - /* Make it clearer which signatures are part of a method or function */ - border-left: 3px solid var(--color-background-item); +.py.class > .sig { + background: var(--color-brand-primary) !important; + margin: 0; + border-radius: 0; } +.py.class > .sig * { + color: #2e3436 !important; +} +.py.class > .sig a { + color: #fff; +} + +/* Make it easier to spot functions and methods */ +.py.function, .py.method { + border-top: 1px solid var(--color-background-item); +} +dl.py.property, dl.py.attribute, dl.py.method, dl.py.function { + padding-top: 10px; + padding-bottom: 10px; +} + .field-list > dt { /* Clearly distinguish parameters otherwise it looks like a wall of text */ color: var(--color-brand-content); diff --git a/src/ifcopenshell-python/docs/introduction/how_to_contribute.rst b/src/ifcopenshell-python/docs/introduction/how_to_contribute.rst index 59015fe339..212eb0cba8 100644 --- a/src/ifcopenshell-python/docs/introduction/how_to_contribute.rst +++ b/src/ifcopenshell-python/docs/introduction/how_to_contribute.rst @@ -21,14 +21,15 @@ Python API documentation is autogenerated from docstrings present in the source code of the respective Python module. If you want to build the documentation locally, the documentation system uses -`Sphinx `_. First, install the theme and -theme dependencies: +`Sphinx `_. First, install Sphinx and +dependencies: .. code-block:: console - $ pip install furo + $ pip install sphinx $ pip install sphinx-autoapi $ pip install sphinx-copybutton + $ pip install furo Now you can generate the documentation: diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py index 75f5f426f4..739e99bbc6 100644 --- a/src/ifcopenshell-python/ifcopenshell/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/__init__.py @@ -168,7 +168,7 @@ def create_entity(type, schema="IFC4", *args, **kwargs): """Creates a new IFC entity that does not belong to an IFC file object Note that it is more common to create entities within a existing file - object. See :meth:`ifcopenshell.file.file.create_entity`. + object. See :meth:`ifcopenshell.file.create_entity`. :param type: Case insensitive name of the IFC class :type type: string @@ -177,7 +177,7 @@ def create_entity(type, schema="IFC4", *args, **kwargs): :param args: The positional arguments of the IFC class :param kwargs: The keyword arguments of the IFC class :returns: An entity instance - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index c1c4fd79b4..05ad3fd984 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -22,7 +22,6 @@ import importlib import numbers import itertools import operator -import functools import subprocess import sys import time @@ -33,7 +32,7 @@ from . import settings try: import logging -except ImportError as e: +except ImportError: logging = type("logger", (object,), {"exception": staticmethod(lambda s: print(s))}) T = TypeVar("T") @@ -101,20 +100,47 @@ for nm in ifcopenshell_wrapper.schema_names(): class entity_instance: - """Base class for all IFC objects. + """Represents an entity (wall, slab, property, etc) of an IFC model - An instantiated entity_instance will have methods of Python and the IFC class itself. + An IFC model consists of entities. Examples of entities include walls, + slabs, doors and so on. Entities can also be non-physical things, like + properties, systems, construction tasks, colours, geometry, and more. + + Entities are defined through an **IFC Class**. There are hundreds of **IFC + Classes** defined as part of the ISO standard by the buildingSMART + International organisation. The **IFC Class** defines the attributes of an + entity, as well as the data types and whether or not an attribute is + mandatory or optional. + + IfcOpenShell's API dynamically implements the IFC schema. You will not find + documentation about available **IFC Classes**, or what attributes they + have. Please consult the buildingSMART official documentation or start + reading :doc:`/introduction/introduction_to_ifc`. + + In addition to the Python methods you see documented here, an instantiated + entity_instance will have attributes defined by its IFC class. For example, + an entity instance which is an IfcWall class will have a ``Name`` + attribute, and an IfcColourRgb will have a ``Red`` attribute. Please + consult the buildingSMART official documentation. Example: .. code:: python - ifc_file = ifcopenshell.open(file_path) - products = ifc_file.by_type("IfcProduct") - print(products[0].__class__) - >>> - print(products[0].Representation) - >>> #423=IfcProductDefinitionShape($,$,(#409,#421)) + model = ifcopenshell.open(file_path) + walls = model.by_type("IfcWall") + wall = walls[0] + + print(wall) # #38=IFCWALL('2MEinnTPbCMwLOgceaQZFu',$,$,'My Wall',$,#52,#47,$,$); + print(wall.is_a()) # IfcWall + + # Note: the `Name` attribute is dynamic, based on the IFC class. + print(wall.Name) # My Wall + + # Attributes are ordered and may also be accessed via index. + print(wall[3]) # My Wall + + print(wall.__class__) # """ wrapped_data: ifcopenshell_wrapper.entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index 85be898392..fc2fb29f1c 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -307,7 +307,7 @@ class file: :param args: The positional arguments of the IFC class :param kwargs: The keyword arguments of the IFC class :returns: An entity instance - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: @@ -402,8 +402,8 @@ class file: :raises RuntimeError: If `id` is not found. - :returns: An ifcopenshell.entity_instance.entity_instance - :rtype: ifcopenshell.entity_instance.entity_instance + :returns: An ifcopenshell.entity_instance + :rtype: ifcopenshell.entity_instance """ return self[id] @@ -415,8 +415,8 @@ class file: :raises RuntimeError: If `guid` is not found. - :returns: An ifcopenshell.entity_instance.entity_instance - :rtype: ifcopenshell.entity_instance.entity_instance + :returns: An ifcopenshell.entity_instance + :rtype: ifcopenshell.entity_instance """ return self[guid] @@ -426,9 +426,9 @@ class file: If the entity already exists, it is not re-added. Existence of entity is checked by it's `.identity()`. :param inst: The entity instance to add - :type inst: ifcopenshell.entity_instance.entity_instance - :returns: An ifcopenshell.entity_instance.entity_instance - :rtype: ifcopenshell.entity_instance.entity_instance + :type inst: ifcopenshell.entity_instance + :returns: An ifcopenshell.entity_instance + :rtype: ifcopenshell.entity_instance """ if self.transaction: @@ -452,8 +452,8 @@ class file: :raises RuntimeError: If `type` is not found in IFC schema. - :returns: A list of ifcopenshell.entity_instance.entity_instance objects - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :returns: A list of ifcopenshell.entity_instance objects + :rtype: list[ifcopenshell.entity_instance] """ if include_subtypes: return [entity_instance(e, self) for e in self.wrapped_data.by_type(type)] @@ -465,13 +465,13 @@ class file: """Get a list of all referenced instances for a particular instance including itself :param inst: The entity instance to get all sub instances - :type inst: ifcopenshell.entity_instance.entity_instance + :type inst: ifcopenshell.entity_instance :param max_levels: How far deep to recursively fetch sub instances. None or -1 means infinite. :type max_levels: None|int :param breadth_first: Whether to use breadth-first search, the default is depth-first. :type max_levels: bool - :returns: A list of ifcopenshell.entity_instance.entity_instance objects - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :returns: A list of ifcopenshell.entity_instance objects + :rtype: list[ifcopenshell.entity_instance] """ if max_levels is None: max_levels = -1 @@ -489,12 +489,12 @@ class file: """Return a list of entities that reference this entity :param inst: The entity instance to get inverse relationships - :type inst: ifcopenshell.entity_instance.entity_instance + :type inst: ifcopenshell.entity_instance :param allow_duplicate: Returns a `list` when True, `set` when False :param with_attribute_indices: Returns pairs of where i[idx] is inst or contains inst. Requires allow_duplicate=True - :returns: A list of ifcopenshell.entity_instance.entity_instance objects - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :returns: A list of ifcopenshell.entity_instance objects + :rtype: list[ifcopenshell.entity_instance] """ if with_attribute_indices and not allow_duplicate: raise ValueError("with_attribute_indices requires allow_duplicate to be True") @@ -514,7 +514,7 @@ class file: """Returns the number of entities that reference this entity :param inst: The entity instance to get inverse relationships - :type inst: ifcopenshell.entity_instance.entity_instance + :type inst: ifcopenshell.entity_instance :returns: The total number of references :rtype: int """ @@ -528,7 +528,7 @@ class file: the reference to the deleted will be removed from the aggregate. :param inst: The entity instance to delete - :type inst: ifcopenshell.entity_instance.entity_instance + :type inst: ifcopenshell.entity_instance :rtype: None """ if self.transaction: diff --git a/src/ifcopenshell-python/ifcopenshell/util/constraint.py b/src/ifcopenshell-python/ifcopenshell/util/constraint.py index b8f6aac14f..f4e18d61b3 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/util/constraint.py @@ -27,9 +27,9 @@ def get_constraints(product: ifcopenshell.entity_instance) -> list[ifcopenshell. Retrieves the constraints assigned to the `product`. :param product: The IFC element. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :return: List of assigned constraints. - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] """ constraints = [] for rel in product.HasAssociations or []: @@ -43,9 +43,9 @@ def get_constrained_elements(constraint: ifcopenshell.entity_instance) -> set[if Retrieves the elements constrained by a `constraint`. :param product: The IFC element. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :return: Set of elements constrained by a `constrant`. - :rtype: set[ifcopenshell.entity_instance.entity_instance] + :rtype: set[ifcopenshell.entity_instance] """ elements = set() for rel in constraint.file.get_inverse(constraint): @@ -59,9 +59,9 @@ def get_metrics(constraint: ifcopenshell.entity_instance) -> list[ifcopenshell.e Retrieves the list of nested constraints for a IfcObjective `constraint`. :param product: IfcObjective constraint. - :type product: ifcopenshell.entity_instance.entity_instance + :type product: ifcopenshell.entity_instance :return: List of nested constraints. - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] """ metrics = [] diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index bb23d1c95a..70c110a63d 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -40,7 +40,7 @@ def get_pset( occurrence, not the type's pset. :param element: The IFC Element entity - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :param name: The name of the pset :type name: str :param prop: The name of the property @@ -128,7 +128,7 @@ def get_psets( occurrence, not the type's pset. :param element: The IFC Element entity - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :param psets_only: Default as False. Set to true if only property sets are needed. :type psets_only: bool,optional :param qtos_only: Default as False. Set to true if only quantities are needed. @@ -418,7 +418,7 @@ def get_predefined_type(element: ifcopenshell.entity_instance) -> str: considered first. :param element: The IFC Element entity - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The predefined type of the element :rtype: str @@ -448,9 +448,9 @@ def get_type(element: ifcopenshell.entity_instance) -> ifcopenshell.entity_insta """Retrieves the construction type element of an element occurrence :param element: The element occurrence - :type: ifcopenshell.entity_instance.entity_instance + :type: ifcopenshell.entity_instance :return: The related type element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: @@ -473,9 +473,9 @@ def get_types(type: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_in """Get all the occurrences of a type element :param type: The type element - :type type: ifcopenshell.entity_instance.entity_instance + :type type: ifcopenshell.entity_instance :return: A list of occurrences of that type - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -495,9 +495,9 @@ def get_shape_aspects(element: ifcopenshell.entity_instance) -> list[ifcopenshel """Gets element shape aspects :param element: The element to get the shape aspects of. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The associated shape aspects of the element. - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -530,7 +530,7 @@ def get_material( constituent), or a material set usage. :param element: The element to get the material of. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :param should_skip_usage: If set to True, if the material is a material set usage, the material set itself will be returned. Useful if you don't care about occurrence usage parameters. If False, the usage will be @@ -540,7 +540,7 @@ def get_material( types will be considered. :type should_inherit: bool :return: The associated material of the element or `None`. - :rtype: Union[ifcopenshell.entity_instance.entity_instance, None] + :rtype: Union[ifcopenshell.entity_instance, None] Example: @@ -574,11 +574,11 @@ def get_materials( returned as a list. :param element: The element to get the materials of. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :param should_inherit: If True, any inherited materials from associated types will be considered. :return: The associated materials of the element. - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -608,9 +608,9 @@ def get_styles(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entit Styles may be retreived from the material or the body representation. :param element: The element to get the styles of. - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: A list of surface styles - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -655,11 +655,11 @@ def get_elements_by_material( usage. :param ifc_file: The IFC file - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param material: The IFC Material entity - :type material: ifcopenshell.entity_instance.entity_instance + :type material: ifcopenshell.entity_instance :return: A list of elements using the to the material - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -696,11 +696,11 @@ def get_elements_by_style( """Retrieves the elements whose geometric representation uses a style :param ifc_file: The IFC file - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param style: The IfcPresentationStyle entity - :type style: ifcopenshell.entity_instance.entity_instance + :type style: ifcopenshell.entity_instance :return: The elements related to the style - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -738,11 +738,11 @@ def get_elements_by_representation( """Gets all elements using a geometric representation :param ifc_file: The IFC file - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param representation: The IfcShapeRepresentation representation - :type representation: ifcopenshell.entity_instance.entity_instance + :type representation: ifcopenshell.entity_instance :return: The elements using the geometric representation - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -772,11 +772,11 @@ def get_elements_by_layer( """Get all the elements that are used by a presentation layer :param ifc_file: The IFC file - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param layer: The IfcPresentationLayerAssignment layer - :type layer: ifcopenshell.entity_instance.entity_instance + :type layer: ifcopenshell.entity_instance :return: The elements using the geometric representation - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] """ results = set() for item in layer.AssignedItems or []: @@ -798,11 +798,11 @@ def get_layers( traditional CAD presentation layer. :param ifc_file: The IFC file object - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param element: The IFC element to interrogate - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: A list of IfcPresentationLayerAssignment - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -836,7 +836,7 @@ def get_container( Retrieves the spatial structure container of an element. :param element: The IFC element - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :param should_get_direct: If True, a result is only returned if the element is directly contained in a spatial structure element. If False, an indirect spatial container may be returned, such as if an element is a @@ -847,7 +847,7 @@ def get_container( example, you may be after the storey, not a space. :type ifc_class: str, optional :return: The direct or indirect container of the element or None. - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: @@ -892,9 +892,9 @@ def get_referenced_structures(element: ifcopenshell.entity_instance) -> list[ifc as stairs, doors, etc. :param element: The IFC element - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: A list of IfcSpatialElement - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -910,9 +910,9 @@ def get_structure_referenced_elements(structure: ifcopenshell.entity_instance) - """Retreives a set of elements referenced by a structure :param structure: IfcSpatialElement - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: A set of referenced elements, IfcSpatialReferenceSelect - :rtype: set[ifcopenshell.entity_instance.entity_instance] + :rtype: set[ifcopenshell.entity_instance] Example: @@ -934,9 +934,9 @@ def get_decomposition(element: ifcopenshell.entity_instance, is_recursive=True) parts of an aggreate, all openings, and all fills of any openings. :param element: The IFC element - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The decomposition of the element - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -978,9 +978,9 @@ def get_grouped_by(element: ifcopenshell.entity_instance) -> list[ifcopenshell.e """Retrieves all subelements of an element based on the group. :param element: The IFC element - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: All subelements of the group - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -1006,7 +1006,7 @@ def get_groups(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entit :param element: The IFC element :return: List of IfcGroups element is assigned to. - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -1027,9 +1027,9 @@ def get_aggregate(element: ifcopenshell.entity_instance) -> ifcopenshell.entity_ Retrieves the aggregate parent of an element. :param element: The IFC element - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The aggregate of the element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: @@ -1048,9 +1048,9 @@ def get_nest(element: ifcopenshell.entity_instance) -> ifcopenshell.entity_insta Retrieves the nest parent of an element. :param element: The IFC element - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The nested whole of the element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance Example: @@ -1072,9 +1072,9 @@ def get_parts(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entity Retrieves the parts of an element that have an aggregation relationship. :param element: The IFC element - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The parts of the element - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -1098,7 +1098,7 @@ def get_components(element: ifcopenshell.entity_instance, include_ports=False) - :param include_ports: Default as False. Set to true if you also want to get ports. :type include_ports: bool,optional :return: The components of the element - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] Example: @@ -1141,9 +1141,9 @@ def get_referenced_elements(reference: ifcopenshell.entity_instance) -> set[ifco """Get all elements with assigned `reference` :param reference: IfcExternalReference subtype reference - :type reference: ifcopenshell.entity_instance.entity_instance + :type reference: ifcopenshell.entity_instance :return: The elements with assigned `reference` - :rtype: set[ifcopenshell.entity_instance.entity_instance] + :rtype: set[ifcopenshell.entity_instance] Example: @@ -1222,7 +1222,7 @@ def batch_remove_deep2(ifc_file: ifcopenshell.file) -> None: on existing variables in memory. :param ifc_file: The IFC file object - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :rtype: None Example: @@ -1249,9 +1249,9 @@ def unbatch_remove_deep2(ifc_file: ifcopenshell.file) -> ifcopenshell.file: See documentation for batch_remove_deep2. :param ifc_file: The IFC file object - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :return: A newly loaded file with the elements removed. - :rtype: ifcopenshell.file.file + :rtype: ifcopenshell.file """ ifc_string = ifc_file.to_string() lines = iter(ifc_string.split("\n")) @@ -1304,13 +1304,13 @@ def remove_deep2( subgraph but are protected from deletion. :param ifc_file: The IFC file object - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param also_consider: elements to also consider as a part of a subgraph - :type also_consider: list[ifcopenshell.entity_instance.entity_instance], optional + :type also_consider: list[ifcopenshell.entity_instance], optional :param do_not_delete: elements to protect from deletion - :type do_not_delete: list[ifcopenshell.entity_instance.entity_instance], optional + :type do_not_delete: list[ifcopenshell.entity_instance], optional :param element: The starting element that defines the subgraph - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance """ # ifc_file.batch() to_delete = set() @@ -1357,11 +1357,11 @@ def copy(ifc_file: ifcopenshell.file, element: ifcopenshell.entity_instance) -> GlobalIds are regenerated. :param ifc_file: The IFC file object - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param element: The IFC element to copy - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :return: The newly copied element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ new = ifc_file.create_entity(element.is_a()) for i, attribute in enumerate(element): @@ -1387,9 +1387,9 @@ def copy_deep( GlobalIds are regenerated. :param ifc_file: The IFC file object - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param element: The IFC element to copy - :type element: ifcopenshell.entity_instance.entity_instance + :type element: ifcopenshell.entity_instance :param exclude: An optional list of strings of IFC class names to not copy. If any of the subelement is this class, it will not be copied and the original instance will be referenced. @@ -1400,9 +1400,9 @@ def copy_deep( :param copied_entities: A dictionary of IDs as keys and entities as values to reuse when coming across the same entity twice. This can typically be left as None. - :type copied_entities: dict[int:ifcopenshell.entity_instance.entity_instance], optional + :type copied_entities: dict[int:ifcopenshell.entity_instance], optional :return: The newly copied element - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ if copied_entities is None: copied_entities = {} diff --git a/src/ifcopenshell-python/ifcopenshell/util/geolocation.py b/src/ifcopenshell-python/ifcopenshell/util/geolocation.py index 7128630c2f..ffe2d9228f 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/geolocation.py +++ b/src/ifcopenshell-python/ifcopenshell/util/geolocation.py @@ -147,7 +147,7 @@ def auto_xyz2enh(ifc_file, x, y, z): https://www.buildingsmart.org/standards/bsi-standards/standards-library/ :param ifc_file: The IFC file - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param x: The X local engineering coordinate provided in project length units. :type x: float :param y: The Y local engineering coordinate provided in project length units. @@ -215,7 +215,7 @@ def auto_enh2xyz(ifc_file, easting, northing, height): https://www.buildingsmart.org/standards/bsi-standards/standards-library/ :param ifc_file: The IFC file - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param easting: The global easting map coordinate provided in map units. :type easting: float :param northing: The global northing map coordinate provided in map units. @@ -283,7 +283,7 @@ def auto_z2e(ifc_file, z): https://www.buildingsmart.org/standards/bsi-standards/standards-library/ :param ifc_file: The IFC file - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param z: The Z local engineering coordinate provided in project length units. :type z: float :return: The elevation in project length units. @@ -587,7 +587,7 @@ def get_grid_north(ifc_file): https://www.buildingsmart.org/standards/bsi-standards/standards-library/ :param ifc_file: The IFC file - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :return: An angle to grid north in decimal degrees :rtype: float """ @@ -623,7 +623,7 @@ def get_true_north(ifc_file): instead. :param ifc_file: The IFC file - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :return: An angle to true north in decimal degrees :rtype: float """ diff --git a/src/ifcopenshell-python/ifcopenshell/util/placement.py b/src/ifcopenshell-python/ifcopenshell/util/placement.py index a5c3312dab..75a1de6265 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/placement.py +++ b/src/ifcopenshell-python/ifcopenshell/util/placement.py @@ -60,7 +60,7 @@ def get_axis2placement(placement: ifcopenshell.entity_instance) -> MatrixType: should use ``get_local_placement`` instead. :param placement: The IfcLocalPlacement enitity - :type placement: ifcopenshell.entity_instance.entity_instance + :type placement: ifcopenshell.entity_instance :return: A 4x4 numpy matrix :rtype: MatrixType """ @@ -118,7 +118,7 @@ def get_local_placement(placement: ifcopenshell.entity_instance) -> MatrixType: matrix = ifcopenshell.util.placement.get_local_placement(placement) :param placement: The IfcLocalPlacement entity - :type placement: ifcopenshell.entity_instance.entity_instance + :type placement: ifcopenshell.entity_instance :return: A 4x4 numpy matrix :rtype: MatrixType """ @@ -138,7 +138,7 @@ def get_cartesiantransformationoperator3d(inst: ifcopenshell.entity_instance) -> ``get_mappeditem_transformation`` instead. :param item: The IfcCartesianTransformationOperator entity - :type item: ifcopenshell.entity_instance.entity_instance + :type item: ifcopenshell.entity_instance :return: A 4x4 numpy transformation matrix :rtype: MatrixType """ @@ -184,7 +184,7 @@ def get_mappeditem_transformation(item: ifcopenshell.entity_instance) -> MatrixT transformation matrix. :param item: The IfcMappedItem entity - :type item: ifcopenshell.entity_instance.entity_instance + :type item: ifcopenshell.entity_instance :return: A 4x4 numpy transformation matrix :rtype: MatrixType """ @@ -201,7 +201,7 @@ def get_storey_elevation(storey: ifcopenshell.entity_instance) -> float: its placement, or as a fallback the ``Elevation`` attribute. :param storey: The IfcBuildingStorey entity - :type storey: ifcopenshell.entity_instance.entity_instance + :type storey: ifcopenshell.entity_instance :return: The elevation in project units :rtype: float """ diff --git a/src/ifcopenshell-python/ifcopenshell/util/representation.py b/src/ifcopenshell-python/ifcopenshell/util/representation.py index 95e91490d0..9bbfc783c4 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/representation.py +++ b/src/ifcopenshell-python/ifcopenshell/util/representation.py @@ -88,9 +88,9 @@ def resolve_representation(representation: ifcopenshell.entity_instance) -> ifco """Resolve possibly mapped representation. :param representation: IfcRepresentation - :type representation: ifcopenshell.entity_instance.entity_instance + :type representation: ifcopenshell.entity_instance :return: Representation resolved from mappings - :rtype: ifcopenshell.entity_instance.entity_instance + :rtype: ifcopenshell.entity_instance """ if len(representation.Items) == 1 and representation.Items[0].is_a("IfcMappedItem"): return resolve_representation(representation.Items[0].MappingSource.MappedRepresentation) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 15ba9e0762..d713a331c4 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -287,17 +287,17 @@ def filter_elements( Filter elements based on the provided `query`. :param ifc_file: The IFC file object - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param query: Query to execute :type query: str :param elements: Base set of IFC elements for the query. If provided, new elements found for the current query will be added to `elements`. Elements explicitly excluded in the `query` will also be excluded from `elements` - :type elements: set[ifcopenshell.entity_instance.entity_instance], optional + :type elements: set[ifcopenshell.entity_instance], optional :param edit_in_place: If `True`, mutate the provided `elements` in place. Defaults to `False` :type edit_in_place: bool :return: Set of filtered elements - :rtype: set[ifcopenshell.entity_instance.entity_instance] + :rtype: set[ifcopenshell.entity_instance] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape.py b/src/ifcopenshell-python/ifcopenshell/util/shape.py index 931f4c0327..1915c6cde0 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape.py @@ -161,7 +161,7 @@ def get_element_bbox_centroid(element: ifcopenshell.entity_instance, geometry) - is more efficient to use ``get_shape_bbox_centroid``. :param element: The element occurrence - :type: ifcopenshell.entity_instance.entity_instance + :type: ifcopenshell.entity_instance :param geometry: Geometry output calculated by IfcOpenShell :type geometry: geometry :return: A tuple representing the XYZ centroid @@ -271,7 +271,7 @@ def get_element_vertices(element: ifcopenshell.entity_instance, geometry) -> npt Results are a nested numpy array e.g. [[v1x, v1y, v1z], [v2x, v2y, v2z], ...] :param element: The element occurrence - :type: ifcopenshell.entity_instance.entity_instance + :type: ifcopenshell.entity_instance :param geometry: Geometry output calculated by IfcOpenShell :type geometry: geometry :return: A numpy array listing all the vertices. Each vertex is a numpy array with XYZ coordinates. @@ -347,7 +347,7 @@ def get_element_bottom_elevation(element: ifcopenshell.entity_instance, geometry ``get_shape_bottom_elevation``. :param element: The element occurrence - :type: ifcopenshell.entity_instance.entity_instance + :type: ifcopenshell.entity_instance :param geometry: Geometry output calculated by IfcOpenShell :type geometry: geometry :return: The Z value @@ -363,7 +363,7 @@ def get_element_top_elevation(element: ifcopenshell.entity_instance, geometry) - ``get_shape_top_elevation``. :param element: The element occurrence - :type: ifcopenshell.entity_instance.entity_instance + :type: ifcopenshell.entity_instance :param geometry: Geometry output calculated by IfcOpenShell :type geometry: geometry :return: The Z value @@ -656,9 +656,9 @@ def get_profiles(element: ifcopenshell.entity_instance) -> list[ifcopenshell.ent solid extrusions. This is useful for later doing 2D take-off from profiles. :param element: The element occurrence - :type: ifcopenshell.entity_instance.entity_instance + :type: ifcopenshell.entity_instance :return: A list of profiles - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] """ material = ifcopenshell.util.element.get_material(element, should_skip_usage=True) if material and material.is_a("IfcMaterialProfileSet"): @@ -670,9 +670,9 @@ def get_extrusions(element: ifcopenshell.entity_instance) -> list[ifcopenshell.e """Gets all extruded area solids used to define an element's model body geometry :param element: The element occurrence - :type: ifcopenshell.entity_instance.entity_instance + :type: ifcopenshell.entity_instance :return: A list of extrusion representation items - :rtype: list[ifcopenshell.entity_instance.entity_instance] + :rtype: list[ifcopenshell.entity_instance] """ representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") if not representation: diff --git a/src/ifcopenshell-python/ifcopenshell/util/unit.py b/src/ifcopenshell-python/ifcopenshell/util/unit.py index 0e2604e481..fdbee952a4 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/unit.py +++ b/src/ifcopenshell-python/ifcopenshell/util/unit.py @@ -398,7 +398,7 @@ def get_project_unit(ifc_file: ifcopenshell.file, unit_type: str) -> Union[ifcop """Get the default project unit of a particular unit type :param ifc_file: The IFC file. - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param unit_type: The type of unit, taken from the list of IFC unit types, such as "LENGTHUNIT". :type unit_type: str @@ -536,9 +536,9 @@ def convert_unit(value: float, from_unit: ifcopenshell.entity_instance, to_unit: :param value: The numeric value you want to convert :type value: float :param from_unit: The IfcNamedUnit to confirm from. - :type from_unit: ifcopenshell.entity_instance.entity_instance + :type from_unit: ifcopenshell.entity_instance :param to_unit: The IfcNamedUnit to confirm from. - :type to_unit: ifcopenshell.entity_instance.entity_instance + :type to_unit: ifcopenshell.entity_instance :return: The converted value. :rtype: float """ @@ -599,7 +599,7 @@ def calculate_unit_scale(ifc_file: ifcopenshell.file, unit_type: str = "LENGTHUN si_meters / unit_scale = ifc_project_length :param ifc_file: The IFC file. - :type ifc_file: ifcopenshell.file.file + :type ifc_file: ifcopenshell.file :param unit_type: The type of SI unit, defaults to "LENGTHUNIT" :type unit_type: str :returns: The scale factor From 5da4fbb39cf92ca7320cb4a6d9c1878913fa8ed2 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 7 May 2024 23:36:56 +1000 Subject: [PATCH 113/429] Fix #4631. Fix packaging problem on PyPI for IfcPatch. --- src/ifcpatch/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcpatch/pyproject.toml b/src/ifcpatch/pyproject.toml index 7607cf6a00..25c9bb982c 100644 --- a/src/ifcpatch/pyproject.toml +++ b/src/ifcpatch/pyproject.toml @@ -23,5 +23,5 @@ Documentation = "https://docs.ifcopenshell.org" Issues = "https://github.com/IfcOpenShell/IfcOpenShell/issues" [tool.setuptools.packages.find] -include = ["ifcpatch"] +include = ["ifcpatch*"] exclude = ["test*"] From c5b4513f659cc16c6cf19db4e3c8776e3e9e33ed Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Tue, 7 May 2024 09:46:55 -0500 Subject: [PATCH 114/429] fix #4622 - can now reassign IfcWindowStyle and IfcDoorStyle --- src/blenderbim/blenderbim/bim/module/root/data.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/root/data.py b/src/blenderbim/blenderbim/bim/module/root/data.py index 18f7fbffcd..9f9d3a6f91 100644 --- a/src/blenderbim/blenderbim/bim/module/root/data.py +++ b/src/blenderbim/blenderbim/bim/module/root/data.py @@ -185,6 +185,8 @@ class IfcClassData: if element: if element.is_a("IfcOpeningElement") or element.is_a("IfcOpeningStandardCase"): return False + if element.is_a() in ("IfcWindowStyle", "IfcDoorStyle"): #see https://github.com/IfcOpenShell/IfcOpenShell/issues/4622#issuecomment-2095676368 + return True for product in cls.ifc_products(): if element.is_a(product[0]): return True From 267527f3fcea1b1a528e5a70ce7dd4c63a195f20 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 7 May 2024 21:26:48 +0500 Subject: [PATCH 115/429] fix issue after removing ifcopenshell.main in d76462ca4 --- src/ifcopenshell-python/ifcopenshell/template.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/template.py b/src/ifcopenshell-python/ifcopenshell/template.py index 7e506e3fd6..13942431d4 100644 --- a/src/ifcopenshell-python/ifcopenshell/template.py +++ b/src/ifcopenshell-python/ifcopenshell/template.py @@ -22,7 +22,7 @@ import uuid from .file import file from .guid import compress -from . import main +from .ifcopenshell_wrapper import version # A quick way to setup an 'empty' IFC file, taken from: # http://academy.ifcopenshell.org/creating-a-simple-wall-with-property-set-and-quantity-information/ @@ -58,8 +58,8 @@ END-ISO-10303-21; """ DEFAULTS = { - "application": lambda d: "IfcOpenShell-%s" % main.version, - "application_version": lambda d: main.version, + "application": lambda d: "IfcOpenShell-%s" % version(), + "application_version": lambda d: version(), "project_globalid": lambda d: compress(uuid.uuid4().hex), "schema_identifier": lambda d: "IFC4", "timestamp": lambda d: int(time.time()), From b8275f280268713cfec03f8a733ff4daa84d15c4 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 7 May 2024 21:39:06 +0500 Subject: [PATCH 116/429] fix errors using deprecated api after ab696b9 #4632 --- src/ifcopenshell-python/ifcopenshell/api/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index a4e99ad318..2e6e2c1370 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -158,9 +158,6 @@ def run( for listener in pre_listeners.get(usecase_path, {}).values(): listener(usecase_path, ifc_file, settings) - # see #4531 - if usecase_path in ARGUMENTS_DEPRECATION: - usecase_path, settings = ARGUMENTS_DEPRECATION[usecase_path](usecase_path, settings) # TODO: settings serialization for client-server systems # def serialise_entity_instance(entity): @@ -304,10 +301,15 @@ def wrap_usecase(usecase_path, usecase): def wrapper(*args, should_run_listeners: bool = True, **settings): ifc_file = args[0] if args else None + nonlocal usecase_path if should_run_listeners: for listener in pre_listeners.get(usecase_path, {}).values(): listener(usecase_path, ifc_file, settings) + # see #4531 + if usecase_path in ARGUMENTS_DEPRECATION: + usecase_path, settings = ARGUMENTS_DEPRECATION[usecase_path](usecase_path, settings) + try: result = usecase(*args, **settings) except TypeError as e: From bc72c927c1d6737730a2db1391e5b4a9e4de21d3 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 7 May 2024 21:41:01 +0500 Subject: [PATCH 117/429] replace deprecated api call noticed fixing #4632 --- src/blenderbim/blenderbim/bim/module/geometry/operator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 312ceed51a..aacb218c2e 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -926,7 +926,7 @@ class OverrideDuplicateMove(bpy.types.Operator): if r.is_a("IfcRelAssignsToGroup") if "BBIM_Linked_Aggregate" in r.RelatingGroup.Name ] - tool.Ifc.run("group.unassign_group", group=linked_aggregate_group[0], product=new[0]) + tool.Ifc.run("group.unassign_group", group=linked_aggregate_group[0], products=[new[0]]) class OverrideDuplicateMoveLinkedMacro(bpy.types.Macro): From 984b1212a6a394e7f39c37fc7294d2ef8e0d42fc Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 8 May 2024 09:45:05 +1000 Subject: [PATCH 118/429] Whoops --- src/blenderbim/docs/devs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/docs/devs/installation.rst b/src/blenderbim/docs/devs/installation.rst index d3fe796316..20e9a3c6e1 100644 --- a/src/blenderbim/docs/devs/installation.rst +++ b/src/blenderbim/docs/devs/installation.rst @@ -160,7 +160,7 @@ Before running it follow the instructions descibed after `rem` tags. mklink /D "%blenderbim%\bim" "%cd%\src\blenderbim\blenderbim\bim" echo Copy over compiled IfcOpenShell files... - copy %blenderbim%\libs\site\packages\ifcopenshell\*_wrapper* %cd%\src\ifcopenshell-python\ifcopenshell\ + copy "%blenderbim%\libs\site\packages\ifcopenshell\*_wrapper*" "%cd%\src\ifcopenshell-python\ifcopenshell\" echo Remove the IfcOpenShell dependency... rd /S /Q "%blenderbim%\libs\site\packages\ifcopenshell" From 66e829a8aa3032a2d4f79adb1ae2eed37033ed6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Tue, 7 May 2024 20:56:12 -0300 Subject: [PATCH 119/429] - Fix the basepoint to be the parent aggregate. - Change the way that "location_to_cursor_3d" is called. - Create a new operator to use in the ui. --- .../blenderbim/bim/module/aggregate/ui.py | 3 +- .../bim/module/geometry/__init__.py | 1 + .../bim/module/geometry/operator.py | 38 ++++++++++++------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py index 4a6c3c4ae0..f15b0df8d8 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py @@ -144,8 +144,7 @@ class BIM_PT_linked_aggregate(Panel): row.label(text="Not a Linked Aggregate") else: row.label(text=f"{Number_Linked_Aggregates} Linked Aggregates") - op = row.operator("bim.object_duplicate_move_linked_aggregate", text="", icon="DUPLICATE") - op.location_from_3d_cursor = True + op = row.operator("bim.duplicate_linked_aggregate_to_3d_cursor", text="", icon="DUPLICATE") if type(Number_Linked_Aggregates) is int: if Number_Linked_Aggregates > 0: op = row.operator("bim.select_linked_aggregates", text="", icon="OUTLINER_DATA_POINTCLOUD") diff --git a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py index 816718cb06..0bf808c2ef 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py @@ -29,6 +29,7 @@ classes = ( operator.GetRepresentationIfcParameters, operator.DuplicateMoveLinkedAggregate, operator.DuplicateMoveLinkedAggregateMacro, + operator.DuplicateLinkedAggregateTo3dCursor, operator.OverrideDelete, operator.OverrideDuplicateMove, operator.OverrideDuplicateMoveLinked, diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index f2ac8ddcd4..a5839a6a9e 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -936,18 +936,17 @@ class OverrideDuplicateMoveLinked(bpy.types.Operator): class DuplicateMoveLinkedAggregateMacro(bpy.types.Macro): - bl_description = "Create a new linked aggregate" + bl_description = "Create and move a new linked aggregate" bl_idname = "bim.object_duplicate_move_linked_aggregate_macro" - bl_label = "IFC Duplicate Linked Aggregate" + bl_label = "IFC Duplicate and Move Linked Aggregate" bl_options = {"REGISTER", "UNDO"} class DuplicateMoveLinkedAggregate(bpy.types.Operator): bl_idname = "bim.object_duplicate_move_linked_aggregate" - bl_label = "IFC Duplicate Linked Aggregate" + bl_label = "IFC Duplicate and Move Linked Aggregate" bl_options = {"REGISTER", "UNDO"} is_interactive: bpy.props.BoolProperty(name="Is Interactive", default=True) - location_from_3d_cursor: bpy.props.BoolProperty(name="Position Duplicate Based on 3d cursor", default=False) @classmethod def poll(cls, context): @@ -960,7 +959,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): return DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context) @staticmethod - def execute_ifc_duplicate_linked_aggregate_operator(self, context): + def execute_ifc_duplicate_linked_aggregate_operator(self, context, location_from_3d_cursor=False): self.new_active_obj = None self.group_name = "BBIM_Linked_Aggregate" self.pset_name = "BBIM_Linked_Aggregate" @@ -1075,13 +1074,9 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): ] tool.Ifc.run("group.assign_group", group=linked_aggregate_group[0], products=new) - def get_location_from_3d_cursor(old_to_new): - for new in old_to_new.values(): - aggregate = ifcopenshell.util.element.get_aggregate(new[0]) - if aggregate: - base_obj = tool.Ifc.get_object(aggregate) - base_obj_location = base_obj.location.copy() - break + def get_location_from_3d_cursor(old_to_new, aggregate): + base_obj = tool.Ifc.get_object(aggregate) + base_obj_location = base_obj.location.copy() for new in old_to_new.values(): new_obj = tool.Ifc.get_object(new[0]) @@ -1114,14 +1109,29 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): custom_incremental_naming_for_element_assembly(old_to_new) - if self.location_from_3d_cursor: - get_location_from_3d_cursor(old_to_new) + if location_from_3d_cursor: + get_location_from_3d_cursor(old_to_new, selected_element) blenderbim.bim.handler.refresh_ui_data() return old_to_new +class DuplicateLinkedAggregateTo3dCursor(bpy.types.Operator): + bl_idname = "bim.duplicate_linked_aggregate_to_3d_cursor" + bl_label = "IFC Duplicate Linked Aggregate to 3d Cursor" + bl_options = {"REGISTER", "UNDO"} + + @classmethod + def poll(cls, context): + return len(context.selected_objects) > 0 + + def execute(self, context): + return OverrideDuplicateMove.execute_duplicate_operator(self, context, linked=False) + + def _execute(self, context): + return DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context, location_from_3d_cursor=True) + class RefreshLinkedAggregate(bpy.types.Operator): bl_idname = "bim.refresh_linked_aggregate" bl_label = "IFC Refresh Linked Aggregate" From 10d30b0de72527fef4dce37f584478f564f38107 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 8 May 2024 17:00:35 +1000 Subject: [PATCH 120/429] Document api modules and require explicit imports of API submodules --- .../ifcopenshell/api/__init__.py | 58 ++++--------------- .../ifcopenshell/api/aggregate/__init__.py | 11 ++-- .../ifcopenshell/api/attribute/__init__.py | 10 ++++ .../ifcopenshell/api/boundary/__init__.py | 6 ++ .../api/classification/__init__.py | 14 +++++ .../ifcopenshell/api/constraint/__init__.py | 9 +++ .../ifcopenshell/api/context/__init__.py | 12 ++++ .../ifcopenshell/api/control/__init__.py | 9 +++ .../ifcopenshell/api/cost/__init__.py | 11 ++++ .../ifcopenshell/api/document/__init__.py | 11 ++++ .../ifcopenshell/api/drawing/__init__.py | 9 +++ .../ifcopenshell/api/geometry/__init__.py | 10 ++++ .../ifcopenshell/api/georeference/__init__.py | 10 ++++ .../ifcopenshell/api/grid/__init__.py | 8 +++ .../ifcopenshell/api/group/__init__.py | 10 ++++ .../ifcopenshell/api/layer/__init__.py | 12 ++++ .../ifcopenshell/api/library/__init__.py | 10 ++++ .../ifcopenshell/api/material/__init__.py | 18 ++++++ .../ifcopenshell/api/nest/__init__.py | 14 +++++ .../ifcopenshell/api/owner/__init__.py | 11 ++++ .../ifcopenshell/api/profile/__init__.py | 9 +++ .../ifcopenshell/api/project/__init__.py | 13 +++++ .../ifcopenshell/api/pset/__init__.py | 10 ++++ .../api/pset_template/__init__.py | 11 ++++ .../ifcopenshell/api/resource/__init__.py | 10 ++++ .../ifcopenshell/api/root/__init__.py | 13 +++++ .../ifcopenshell/api/sequence/__init__.py | 9 +++ .../ifcopenshell/api/spatial/__init__.py | 9 +++ .../ifcopenshell/api/structural/__init__.py | 9 +++ .../ifcopenshell/api/style/__init__.py | 10 ++++ .../ifcopenshell/api/system/__init__.py | 11 ++++ .../ifcopenshell/api/type/__init__.py | 11 ++++ .../ifcopenshell/api/unit/__init__.py | 10 ++++ .../ifcopenshell/api/void/__init__.py | 11 ++++ 34 files changed, 358 insertions(+), 51 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index 2e6e2c1370..e24870d956 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -27,7 +27,6 @@ relationships are all handled automatically. import json import numpy -import pkgutil import inspect import importlib import ifcopenshell @@ -328,50 +327,15 @@ def wrap_usecase(usecase_path, usecase): return wrapper -# Expose all submodules. This means that the user can just type `import ifcopenshell.api`. -import ifcopenshell.api.aggregate as aggregate -import ifcopenshell.api.attribute as attribute -import ifcopenshell.api.boundary as boundary -import ifcopenshell.api.classification as classification -import ifcopenshell.api.constraint as constraint -import ifcopenshell.api.context as context -import ifcopenshell.api.control as control -import ifcopenshell.api.cost as cost -import ifcopenshell.api.document as document -import ifcopenshell.api.drawing as drawing -import ifcopenshell.api.geometry as geometry -import ifcopenshell.api.georeference as georeference -import ifcopenshell.api.grid as grid -import ifcopenshell.api.group as group -import ifcopenshell.api.layer as layer -import ifcopenshell.api.library as library -import ifcopenshell.api.material as material -import ifcopenshell.api.nest as nest -import ifcopenshell.api.owner as owner -import ifcopenshell.api.profile as profile -import ifcopenshell.api.project as project -import ifcopenshell.api.pset as pset -import ifcopenshell.api.pset_template as pset_template -import ifcopenshell.api.resource as resource -import ifcopenshell.api.root as root -import ifcopenshell.api.sequence as sequence -import ifcopenshell.api.spatial as spatial -import ifcopenshell.api.structural as structural -import ifcopenshell.api.style as style -import ifcopenshell.api.system as system -import ifcopenshell.api.type as type # Whoohoo! -import ifcopenshell.api.unit as unit -import ifcopenshell.api.void as void +def wrap_usecases(path, name): + """This developer feature wraps an API module's usecases with listeners.""" + import sys + import pkgutil -# Wrap all submodule usecases with listeners. -# This for loop also conveniently ensures that the above imports are comprehensive. -for loader, module_name, is_pkg in pkgutil.iter_modules(__path__, __name__ + "."): - # Check if it's a direct child (only one level deep) - if module_name.count(".") == __name__.count(".") + 1: - module_name = module_name.split(".")[-1] - module = globals()[module_name] - for usecase_name in vars(module): - usecase = getattr(module, usecase_name) - if callable(usecase): - usecase_path = f"{module_name}.{usecase_name}" - setattr(module, usecase_name, wrap_usecase(usecase_path, usecase)) + module_name = name.split(".")[-1] + module = sys.modules[name] + for loader, usecase_name, is_pkg in pkgutil.iter_modules(path): + usecase = getattr(module, usecase_name) + if callable(usecase): + usecase_path = f"{module_name}.{usecase_name}" + setattr(module, usecase_name, wrap_usecase(usecase_path, usecase)) diff --git a/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py index bf452c8e2b..21630a9be4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py @@ -16,12 +16,15 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -"""Aggregates are the concept of breaking down larger wholes into smaller parts. +"""Aggregates is the concept of breaking down larger wholes into smaller parts. -One common use is spatial elements, such as how a site has multiple buildings, -and a building has multiple storeys. Another is for regular elements, such as -how a wall is made out of members and coverings. +For example, spatial elements such as sites are broken down into one or more +buildings, and a building is broken down into storeys. Another example is for +physical elements, such as how a wall is made out of members and coverings. """ +from .. import wrap_usecases from .assign_object import assign_object from .unassign_object import unassign_object + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py index 31a605de5d..6d1164b4bd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py @@ -16,4 +16,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Basic modification of the attributes of an element. + +All IFC entities have attributes. Some of these attributes contain rules about +inheritance and what they are allowed to contain. These usecases make sure that +any editing complies with these rules. +""" + +from .. import wrap_usecases from .edit_attributes import edit_attributes + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py index fff4c4e7f5..027c2cf00b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py @@ -18,9 +18,15 @@ """Boundaries are primarily used for representing virtual interfaces between spaces for energy analysis. + +Boundaries may be associated with spaces or physical elements that enclose +spaces such as walls, doors, and windows. """ +from .. import wrap_usecases from .assign_connection_geometry import assign_connection_geometry from .copy_boundary import copy_boundary from .edit_attributes import edit_attributes from .remove_boundary import remove_boundary + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py index 6616ff6f89..1ad42def0c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py @@ -16,9 +16,23 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Classification systems are a way of categorising objects + +Although IFC itself comes with a built-in classification hierarchy (e.g. +IfcWall and its predefined types of PARTITIONING, etc), there are many external +or custom classification systems such as Uniclass, Omniclass and more. IFC is +able to integrate with any external classification system. + +This API allows you to manage and assign external classification systems and +references. +""" + +from .. import wrap_usecases from .add_classification import add_classification from .add_reference import add_reference from .edit_classification import edit_classification from .edit_reference import edit_reference from .remove_classification import remove_classification from .remove_reference import remove_reference + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py index 7309050851..3e17e6a708 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py @@ -16,6 +16,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Constraints are an advanced feature allowing you to specify parametric +limits on properties + +Warning: usage of constraints are mostly untested in real life applications. +""" + +from .. import wrap_usecases from .add_metric import add_metric from .add_metric_reference import add_metric_reference from .add_objective import add_objective @@ -25,3 +32,5 @@ from .edit_objective import edit_objective from .remove_constraint import remove_constraint from .remove_metric import remove_metric from .unassign_constraint import unassign_constraint + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py index 1edb3ee252..556d45145c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py @@ -16,6 +16,18 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Contexts allow you to classify when geometry should be used in different +purposes + +For example, a door may have many geometries assigned to it: a 3D body +geometry, a clearance zone for disabled access and egress, and a 2D top down +plan view representation annotating swing extents. Each geometry is assigned to +a context to distinguish its purpose and level of detail. +""" + +from .. import wrap_usecases from .add_context import add_context from .edit_context import edit_context from .remove_context import remove_context + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py index 792f5eec35..7aa970005e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py @@ -16,5 +16,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Processes and costs may be controlled by other entities which indicate +constraints that determine how they can change + +This is an advanced feature mostly used in 4D/5D +""" + +from .. import wrap_usecases from .assign_control import assign_control from .unassign_control import unassign_control + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py index 4cf5fc63c6..713f243c4a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py @@ -16,6 +16,15 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage cost schedules, cost items, cost estimation and parametric quantity +take-off + +IFC supports storing cost schedules and detailed cost breakdown structures, +including formulas, subtotals, and parametric links to model element +quantities. +""" + +from .. import wrap_usecases from .add_cost_item import add_cost_item from .add_cost_item_quantity import add_cost_item_quantity from .add_cost_schedule import add_cost_schedule @@ -35,3 +44,5 @@ from .remove_cost_item_quantity import remove_cost_item_quantity from .remove_cost_schedule import remove_cost_schedule from .remove_cost_value import remove_cost_value from .unassign_cost_item_quantity import unassign_cost_item_quantity + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py index b1affe3a71..0e18a16fee 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py @@ -16,6 +16,15 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Reference external project documents and associate them to model elements + +Some project information (drawings, specifications, certificates, reports, etc) +may be stored in external documents (locally or in a CDE). IFC lets you store a +register of documents with metadata and associate them with elements (both +physical and non-physical). +""" + +from .. import wrap_usecases from .add_information import add_information from .add_reference import add_reference from .assign_document import assign_document @@ -24,3 +33,5 @@ from .edit_reference import edit_reference from .remove_information import remove_information from .remove_reference import remove_reference from .unassign_document import unassign_document + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py index dd010e886e..50c8838cd6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py @@ -16,6 +16,15 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Create relationships necessary for smart annotations for drawings + +Drawings may be generated from modeled elements and annotations. These +annotations may have relationships which indicate smart data being populated. +""" + +from .. import wrap_usecases from .assign_product import assign_product from .edit_text_literal import edit_text_literal from .unassign_product import unassign_product + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py index 0aa8756ea0..e0b6f83319 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py @@ -16,6 +16,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Create geometric representations and assign them to elements + +These functions support both the creation of arbitrary geometry as well as +geometry that follows parametric rules (e.g. layered geometry or profiled +geometry extrusions). +""" + +from .. import wrap_usecases from .add_axis_representation import add_axis_representation from .add_boolean import add_boolean try: @@ -51,3 +59,5 @@ from .map_representation import map_representation from .remove_boolean import remove_boolean from .remove_representation import remove_representation from .unassign_representation import unassign_representation + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py index 1aa858db17..5488015977 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py @@ -16,6 +16,16 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage georeferencing metadata + +IFC model geometry may have a coordinate reference system (CRS) assigned to it. +It may also optionally have a map conversion defined to transform to and from +map coordinates and project local engineering coordinates. +""" + +from .. import wrap_usecases from .add_georeferencing import add_georeferencing from .edit_georeferencing import edit_georeferencing from .remove_georeferencing import remove_georeferencing + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py index 9991a7bc06..bdbe764870 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py @@ -16,9 +16,17 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manages grid and grid axes + +A grid in IFC may contain two or more axes running in two or more directions. +""" + +from .. import wrap_usecases try: from .create_axis_curve import create_axis_curve except ModuleNotFoundError as e: print(f"Note: API not available due to missing dependencies: grid.create_axis_curve - {e}") from .create_grid_axis import create_grid_axis from .remove_grid_axis import remove_grid_axis + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py index 5b729b0dfc..e5f9c9db67 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py @@ -16,9 +16,19 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Elements may be arbitrarily assigned to groups for organisation + +Groups are useful for filtering elements or non-hierarchical organisation of a +model. Note that this only targets arbitrary groups. If you want to group +elements into a distribution system, see :mod:`ifcopenshell.api.system`. +""" + +from .. import wrap_usecases from .add_group import add_group from .assign_group import assign_group from .edit_group import edit_group from .remove_group import remove_group from .unassign_group import unassign_group from .update_group_products import update_group_products + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py index 03145bf34a..d06b0189d9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py @@ -16,8 +16,20 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage CAD layers + +Note that in IFC, elements cannot be assigned to CAD layers. Instead, the +geometric representation of the element is associated to a layer. + +If you want to associated a whole element to a "layer", consider using +:mod:`ifcopenshell.api.classification`. +""" + +from .. import wrap_usecases from .add_layer import add_layer from .assign_layer import assign_layer from .edit_layer import edit_layer from .remove_layer import remove_layer from .unassign_layer import unassign_layer + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py index dbb74de3d4..f5984dbfff 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py @@ -16,6 +16,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage references to external libraries + +An external library is any system which uses a key to store information. This +allows you to associate IFC entities with any arbitrary external database, API, +system, and so on. This is typically useful in smart building systems. +""" + +from .. import wrap_usecases from .add_library import add_library from .add_reference import add_reference from .assign_reference import assign_reference @@ -24,3 +32,5 @@ from .edit_reference import edit_reference from .remove_library import remove_library from .remove_reference import remove_reference from .unassign_reference import unassign_reference + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py index 2831915f76..a03ccba9aa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py @@ -16,6 +16,22 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage physical materials (concrete, steel, etc) and their association to +elements + +IFC supports both simple materials and parametric materials (materials that +have layered thicknesses or cross sectional profiles). + +Parametric materials will include parametric constraints on the geometry of +the element. These API functions do not cover that responsibility. See +:mod:`ifcopenshell.api.geometry`. + +Note that this API only covers physical materials, not visual styles. If you +want to look at visual styles such as colours, transparency, shading, or +rendering options, see :mod:`ifcopenshell.api.style`. +""" + +from .. import wrap_usecases from .add_constituent import add_constituent from .add_layer import add_layer from .add_list_item import add_list_item @@ -40,3 +56,5 @@ from .remove_material_set import remove_material_set from .remove_profile import remove_profile from .reorder_set_item import reorder_set_item from .unassign_material import unassign_material + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py index 242e12eb11..162f9c07a2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py @@ -16,7 +16,21 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Nesting is when a component is attached to a host element + +Examples include when a faucet is attached using a predrilled hole in a basin, +or when a modular connection occurs through a connection point. This implies +that when a host element moves, the child nested components must move as well. + +Note that this API is not meant to be used for connection points on +distribution systems. For that purpose, such as for pipe fittings and +equipment, please see :mod:`ifcopenshell.api.system`. +""" + +from .. import wrap_usecases from .assign_object import assign_object from .change_nest import change_nest from .reorder_nesting import reorder_nesting from .unassign_object import unassign_object + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py index 755fa4fc5f..f61689b906 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py @@ -16,6 +16,15 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""An element may have an owner, indicating who is responsible, liable, or +contactable regarding that element + +Note that in IFC2X3, element ownership is mandatory and must be addressed prior +to the creation of any element at all. See :func:`create_owner_history` for +examples. +""" + +from .. import wrap_usecases from .add_actor import add_actor from .add_address import add_address from .add_application import add_application @@ -39,3 +48,5 @@ from .remove_person_and_organisation import remove_person_and_organisation from .remove_role import remove_role from .unassign_actor import unassign_actor from .update_owner_history import update_owner_history + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py index 7decc6750b..6b4a5a1efd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py @@ -16,8 +16,17 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Handles the definition of cross sectional profiles + +Maintaining a clean profile library is important for structural simulations and +identification of standardised profiles for fabrication and carbon counting. +""" + +from .. import wrap_usecases from .add_arbitrary_profile import add_arbitrary_profile from .add_arbitrary_profile_with_voids import add_arbitrary_profile_with_voids from .add_parameterized_profile import add_parameterized_profile from .edit_profile import edit_profile from .remove_profile import remove_profile + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py index e9c21fbddd..2641ad8ab8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py @@ -16,7 +16,20 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Create an IFC project + +All IFCs must have one, and only one IFC project before any data may be +associated. If you are starting from scratch, see :func:create_file. + +Once a project exists, you may optionally create project libraries and +associate type assets with it. You may also append assets from other projects +into your project. +""" + +from .. import wrap_usecases from .append_asset import append_asset from .assign_declaration import assign_declaration from .create_file import create_file from .unassign_declaration import unassign_declaration + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py index c3e01e30df..dbb4fb84c2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py @@ -16,8 +16,18 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Property sets and quantity sets let you store simple key value metadata +associated with elements + +This is the simplest and most common way to store information about an element. +For example, if a door has a fire rating, it is stored as a property. +""" + +from .. import wrap_usecases from .add_pset import add_pset from .add_qto import add_qto from .edit_pset import edit_pset from .edit_qto import edit_qto from .remove_pset import remove_pset + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py index 1c5963479c..971067d074 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py @@ -16,9 +16,20 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage property templates to standard project property names and data types + +To help standardise the naming, data types, and association of properties to +elements, IFC supports property set templates. buildingSMART provides their own +built-in ISO-standardised property templates, but governments, companies, and +individuals may also create their own. +""" + +from .. import wrap_usecases from .add_prop_template import add_prop_template from .add_pset_template import add_pset_template from .edit_prop_template import edit_prop_template from .edit_pset_template import edit_pset_template from .remove_prop_template import remove_prop_template from .remove_pset_template import remove_pset_template + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py index 8fcff6a7fc..7d318f8900 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py @@ -16,6 +16,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage construction and maintenance resources + +Resources include equipment (cranes, etc), labour, material, and products. They +are typically referenced in construction planning, maintenance schedules, or +cost items. +""" + +from .. import wrap_usecases from .add_resource import add_resource from .add_resource_quantity import add_resource_quantity from .add_resource_time import add_resource_time @@ -28,3 +36,5 @@ from .edit_resource_time import edit_resource_time from .remove_resource import remove_resource from .remove_resource_quantity import remove_resource_quantity from .unassign_resource import unassign_resource + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py index 309f87cfff..8845c8e663 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py @@ -16,7 +16,20 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Create, copy, or remove physical elements such as walls, doors, slabs, etc + +This is one of the most used API modules and should be used any time you want +to create, remove, copy, or change a physical or spatial element. See +:func:`create_entity` to get started. + +This module should also be used to create types. To then associate types with +elements, see :mod:`ifcopenshell.api.type`. +""" + +from .. import wrap_usecases from .copy_class import copy_class from .create_entity import create_entity from .reassign_class import reassign_class from .remove_product import remove_product + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py index 90cb5f4922..a901acec9c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py @@ -16,6 +16,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage work schedules, tasks, calendars, and more for 4D + +These are typically used for construction planning, but may also be used in +managing recurring facility maintenance schedules. +""" + +from .. import wrap_usecases from .add_task import add_task from .add_task_time import add_task_time from .add_time_period import add_time_period @@ -59,3 +66,5 @@ from .unassign_process import unassign_process from .unassign_product import unassign_product from .unassign_recurrence_pattern import unassign_recurrence_pattern from .unassign_sequence import unassign_sequence + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py index 22891f5c83..564c91606f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py @@ -16,7 +16,16 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Assign spatial relationships such as when an element is in a space + +Physical elements (walls, doors, etc) may be contained in or reference spatial +elements (spaces, storeys, buildings, etc). +""" + +from .. import wrap_usecases from .assign_container import assign_container from .dereference_structure import dereference_structure from .reference_structure import reference_structure from .unassign_container import unassign_container + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py index 3bdaf8c004..d466add6ce 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py @@ -16,6 +16,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage analytical properties for structural simulation + +This only handles authoring the analytical model, and does not actually perform +any structural simulation. To perform the simulation, see IFC2CA. +""" + +from .. import wrap_usecases from .add_structural_activity import add_structural_activity from .add_structural_analysis_model import add_structural_analysis_model from .add_structural_boundary_condition import add_structural_boundary_condition @@ -37,3 +44,5 @@ from .remove_structural_load import remove_structural_load from .remove_structural_load_case import remove_structural_load_case from .remove_structural_load_group import remove_structural_load_group from .unassign_structural_analysis_model import unassign_structural_analysis_model + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py index df9fd47518..e32e13a5b1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py @@ -16,6 +16,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage visual styles of geometry (colours, transparency, rendering, etc) + +Geometry may have visual styles associated with it, including surface styles, +2D curve styles, text styles, and more. Surface styles are most commonly used +for simple colouring. +""" + +from .. import wrap_usecases from .add_style import add_style from .add_surface_style import add_surface_style from .add_surface_textures import add_surface_textures @@ -28,3 +36,5 @@ from .remove_styled_representation import remove_styled_representation from .remove_surface_style import remove_surface_style from .unassign_material_style import unassign_material_style from .unassign_representation_styles import unassign_representation_styles + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py index 14213ca168..0d374c830c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py @@ -16,6 +16,15 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage distribution systems and port connectivity + +Service distribution systems (mechanical, electrical, hydraulic, fire, +logistical, etc) consist of connected distribution segments, fittings, +terminals, control equipment, and more. This module handles port connectivity +and relationships describing distribution flow. +""" + +from .. import wrap_usecases from .add_port import add_port from .add_system import add_system from .assign_flow_control import assign_flow_control @@ -28,3 +37,5 @@ from .remove_system import remove_system from .unassign_flow_control import unassign_flow_control from .unassign_port import unassign_port from .unassign_system import unassign_system + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py index dddd90a49f..39a523123d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py @@ -16,7 +16,18 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Manage common construction types of physical elements + +Almost all constructed elements may be grouped into "types". Types include wall +types, window types, column types, equipment types, and more. + +Using types is critical to the success of any project. +""" + +from .. import wrap_usecases from .assign_type import assign_type from .get_related_objects import get_related_objects from .map_type_representations import map_type_representations from .unassign_type import unassign_type + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py index 3813724dd7..058e3f2c72 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py @@ -16,6 +16,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Define units (length, area, monetary, pressure, etc) + +Units can be defined as a default project unit or used specifically for certain +properties. Units may be especially complex when dealing with services and +equipment. +""" + +from .. import wrap_usecases from .add_context_dependent_unit import add_context_dependent_unit from .add_conversion_based_unit import add_conversion_based_unit from .add_monetary_unit import add_monetary_unit @@ -26,3 +34,5 @@ from .edit_monetary_unit import edit_monetary_unit from .edit_named_unit import edit_named_unit from .remove_unit import remove_unit from .unassign_unit import unassign_unit + +wrap_usecases(__path__, __name__) diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py index 51e0db158b..ae02decb95 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py @@ -16,7 +16,18 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +"""Create void relationships between openings and physical elements + +An opening is a special element (created using +:func:`ifcopenshell.api.root.create_entity`) that may then be used to create +voids in other elements (such as walls and slabs). These voids may then be +filled with doors, trapdoors, skylights, and so on. +""" + +from .. import wrap_usecases from .add_filling import add_filling from .add_opening import add_opening from .remove_filling import remove_filling from .remove_opening import remove_opening + +wrap_usecases(__path__, __name__) From 67f4ed00d0f895e4b57125146de971b9b073dc54 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 8 May 2024 12:53:30 +0500 Subject: [PATCH 121/429] fix couple silent bugs importing containers 1) we were setting OwnerHistory to the "elevation" attribute of SpatialElement (in BIMSpatialProperties.containers) 2) we were setting "elevation" attribute at all when SpatialElement doesn't have "elevation" attribute Though those bugs were silent since PropertyGroup doesn't alarm when we add a completely new attribute to it. --- src/blenderbim/blenderbim/tool/spatial.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index 94fde8ab6e..ffb886ce78 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -113,14 +113,12 @@ class Spatial(blenderbim.core.tool.Spatial): for element in rel.RelatedObjects: related_objects.append((element, ifcopenshell.util.placement.get_storey_elevation(element))) related_objects = sorted(related_objects, key=lambda e: e[1]) - for element in related_objects: - element = element[0] + for element, _ in related_objects: new = props.containers.add() new.name = element.Name or "Unnamed" new.long_name = element.LongName or "" new.has_decomposition = bool(element.IsDecomposedBy) new.ifc_definition_id = element.id() - new.elevation = element[1] @classmethod def run_root_copy_class(cls, obj=None): From 875afd69d58d8966b81865adf221b55197edcb26 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 8 May 2024 12:55:59 +0500 Subject: [PATCH 122/429] skip objects without placements importing containers It seems that IFC doesn't specify that IfcRelAggregates.RelatedObjects should necessary have a placement. E.g. FreeCAD is using IfcGroups in RelatedObjects to store hierarchy in IFC. Example - https://community.osarch.org/discussion/2144/object-information-spatial-container --- src/blenderbim/blenderbim/tool/spatial.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index ffb886ce78..68c1d8c0e8 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -111,6 +111,9 @@ class Spatial(blenderbim.core.tool.Spatial): for rel in parent.IsDecomposedBy or []: related_objects = [] for element in rel.RelatedObjects: + # skip objects without placements + if not element.is_a("IfcProduct"): + continue related_objects.append((element, ifcopenshell.util.placement.get_storey_elevation(element))) related_objects = sorted(related_objects, key=lambda e: e[1]) for element, _ in related_objects: From 37c0084874d2f8b5662438ce5dd11dd05812133b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 8 May 2024 22:26:46 +1000 Subject: [PATCH 123/429] Friendlier error reporting if bbim fails to install --- src/blenderbim/blenderbim/__init__.py | 133 +++++++++++++++++- src/blenderbim/blenderbim/bim/__init__.py | 2 +- .../blenderbim/bim/module/debug/operator.py | 26 +--- src/blenderbim/docs/devs/installation.rst | 2 +- src/blenderbim/docs/devs/writing_docs.rst | 9 +- src/blenderbim/docs/users/installation.rst | 31 ++-- 6 files changed, 158 insertions(+), 45 deletions(-) diff --git a/src/blenderbim/blenderbim/__init__.py b/src/blenderbim/blenderbim/__init__.py index 67b03e5702..2a742ed65d 100644 --- a/src/blenderbim/blenderbim/__init__.py +++ b/src/blenderbim/blenderbim/__init__.py @@ -18,7 +18,12 @@ import os import sys -import site +import bpy +import platform +import traceback +import subprocess +import webbrowser +import addon_utils bl_info = { "name": "BlenderBIM", @@ -32,16 +37,132 @@ bl_info = { "category": "System", } +last_error = None + + +def get_debug_info(): + version = ".".join( + [ + str(x) + for x in [ + addon.bl_info.get("version", (-1, -1, -1)) + for addon in addon_utils.modules() + if addon.bl_info["name"] == "BlenderBIM" + ][0] + ] + ) + return { + "os": platform.system(), + "os_version": platform.version(), + "python_version": platform.python_version(), + "architecture": platform.architecture(), + "machine": platform.machine(), + "processor": platform.processor(), + "blender_version": bpy.app.version_string, + "blenderbim_version": version, + "last_error": last_error, + } + + if sys.modules.get("bpy", None): # Process *.pth in /libs/site/packages to setup globally importable modules # This is 3 levels deep as required by the static RPATH of ../../ from dependencies taken from Anaconda # site.addsitedir(os.path.join(os.path.dirname(os.path.realpath(__file__)), "libs", "site", "packages")) sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), "libs", "site", "packages")) - import blenderbim.bim + try: + import blenderbim.bim - def register(): - blenderbim.bim.register() + def register(): + blenderbim.bim.register() - def unregister(): - blenderbim.bim.unregister() + def unregister(): + blenderbim.bim.unregister() + + except: + last_error = traceback.format_exc() + + print(last_error) + print(get_debug_info()) + print("\nFATAL ERROR: Unable to load the BlenderBIM Add-on") + + class BIM_PT_fatal_error(bpy.types.Panel): + bl_label = "BlenderBIM Fatal Error" + bl_idname = "SCENE_PT_error_message" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + + def draw(self, context): + layout = self.layout + layout.label(text="BlenderBIM could not load.", icon="ERROR") + layout.label(text="View the console for full logs.", icon="CONSOLE") + box = layout.box() + info = get_debug_info() + py = ".".join(info["python_version"].split(".")[0:2]) + b3d = ".".join(info["blender_version"].split(".")[0:2]) + box.label(text=f"Blender {b3d} {info['os']} {info['machine']}", icon="BLENDER") + box.label(text=f"Python {py} BBIM {info['blenderbim_version']}", icon="SCRIPTPLUGINS") + layout.operator("bim.copy_debug_information", text="Copy Error Message To Clipboard") + op = layout.operator("bim.open_uri", text="How Can I Fix This?") + op.uri = "https://docs.blenderbim.org/users/installation.html#faq" + + class OpenUri(bpy.types.Operator): + bl_idname = "bim.open_uri" + bl_label = "Open URI" + uri: bpy.props.StringProperty() + + def execute(self, context): + webbrowser.open(self.uri) + return {"FINISHED"} + + class CopyDebugInformation(bpy.types.Operator): + bl_idname = "bim.copy_debug_information" + bl_label = "Copy Debug Information" + bl_description = "Copies debugging information to your clipboard for use in bugreports" + + def execute(self, context): + info = get_debug_info() + # Format it in a readable way + text = "\n".join(f"{k}: {v}" for k, v in info.items()) + print(text) + + if platform.system() == "Windows": + command = "echo | set /p nul=" + text.strip() + elif platform.system() == "Darwin": # for MacOS + command = 'printf "' + text.strip().replace("\n", "\\n").replace('"', "") + '" | pbcopy' + else: # Linux + command = ( + 'printf "' + + text.strip().replace("\n", "\\n").replace('"', "") + + '" | xclip -selection clipboard' + ) + subprocess.run(command, shell=True, check=True) + return {"FINISHED"} + + class HiddenPanel: + @classmethod + def false_poll(cls, context): + return False + + def register(): + # Only show our error panel and nothing else in the scene tab + for item_name in dir(bpy.types): + item = getattr(bpy.types, item_name) + if not hasattr(item, "bl_rna") or not isinstance(item.bl_rna, bpy.types.Panel): + continue + if getattr(item, "bl_context", None) != "scene": + continue + + # Reregister scene panel with a new poll to hide it + item.poll = HiddenPanel.false_poll + bpy.utils.unregister_class(item) + bpy.utils.register_class(item) + bpy.utils.register_class(BIM_PT_fatal_error) + bpy.utils.register_class(CopyDebugInformation) + bpy.utils.register_class(OpenUri) + + def unregister(): + bpy.utils.unregister_class(OpenUri) + bpy.utils.unregister_class(CopyDebugInformation) + bpy.utils.unregister_class(BIM_PT_fatal_error) diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 1476a30bff..20c39c6aa3 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -17,11 +17,11 @@ # along with BlenderBIM Add-on. If not, see . import os -from pathlib import Path import bpy import bpy.utils.previews import blenderbim import importlib +from pathlib import Path from . import handler, ui, prop, operator, helper from typing import Callable, Union diff --git a/src/blenderbim/blenderbim/bim/module/debug/operator.py b/src/blenderbim/blenderbim/bim/module/debug/operator.py index b6605d9712..7d6b4b8c94 100644 --- a/src/blenderbim/blenderbim/bim/module/debug/operator.py +++ b/src/blenderbim/blenderbim/bim/module/debug/operator.py @@ -24,7 +24,6 @@ import random import logging import platform import subprocess -import addon_utils import ifcopenshell import ifcopenshell.api import ifcopenshell.util.element @@ -34,7 +33,7 @@ import blenderbim.tool as tool import blenderbim.core.debug as core import blenderbim.bim.handler import blenderbim.bim.import_ifc as import_ifc -import blenderbim.tool as tool +from blenderbim import get_debug_info from blenderbim.bim.ifc import IfcStore @@ -44,28 +43,7 @@ class CopyDebugInformation(bpy.types.Operator): bl_description = "Copies debugging information to your clipboard for use in bugreports" def execute(self, context): - version = ".".join( - [ - str(x) - for x in [ - addon.bl_info.get("version", (-1, -1, -1)) - for addon in addon_utils.modules() - if addon.bl_info["name"] == "BlenderBIM" - ][0] - ] - ) - info = { - "os": platform.system(), - "os_version": platform.version(), - "python_version": platform.python_version(), - "architecture": platform.architecture(), - "machine": platform.machine(), - "processor": platform.processor(), - "blender_version": bpy.app.version_string, - "blenderbim_version": version, - "ifc": False, - } - + info = get_debug_info() if tool.Ifc.get(): info.update( { diff --git a/src/blenderbim/docs/devs/installation.rst b/src/blenderbim/docs/devs/installation.rst index 20e9a3c6e1..96ee05e206 100644 --- a/src/blenderbim/docs/devs/installation.rst +++ b/src/blenderbim/docs/devs/installation.rst @@ -20,7 +20,7 @@ instructions as the **Stable installation**. You will need to choose which build to download. - If you are on Blender >=4.1, choose py311 -- If you are on Blender >=3.1 and <=4.0, choose py10 +- If you are on Blender >=3.1 and <=4.0, choose py310 - If you are on Blender >=2.93 and <3.1, choose py39 - Choose ``linux``, ``macos`` (Apple Intel), ``macosm1`` (Apple Silicon), or ``win`` depending on your operating system diff --git a/src/blenderbim/docs/devs/writing_docs.rst b/src/blenderbim/docs/devs/writing_docs.rst index f888b398da..f39b5fdefe 100644 --- a/src/blenderbim/docs/devs/writing_docs.rst +++ b/src/blenderbim/docs/devs/writing_docs.rst @@ -16,9 +16,12 @@ You can press the edit button on the top right on any documentation page to quickly edit their content. You can link to `external websites -`_. -You can also link to sections on the same page, like `Writing technical -documentation`_. You can link to other pages, like :doc:`Hello +`_ +(note the space between the url and the link text). You can also link to +sections on the same page, like :ref:`devs/writing_docs:Writing technical +documentation` or with :ref:`custom text`. Traditional references like `Writing technical documentation`_ +work too but are discouraged. You can link to other pages, like :doc:`Hello World` or sections within other pages, like :ref:`devs/installation:unstable installation`. We have ``autosectionlabel`` enabled so it is not necessary to manually create labels. diff --git a/src/blenderbim/docs/users/installation.rst b/src/blenderbim/docs/users/installation.rst index c429c89012..95a6099913 100644 --- a/src/blenderbim/docs/users/installation.rst +++ b/src/blenderbim/docs/users/installation.rst @@ -106,19 +106,22 @@ On Windows: Updating -------- -First uninstall the current BlenderBIM add-on, then install the latest version. +First follow the `Uninstalling`_ section below, then install the latest version. Uninstalling ------------ Navigate to ``Edit > Preferences > Add-ons``. Due to a limitation in Blender, -you have to first disable the BlenderBIM Add-on in your Blender preferences by -pressing the checkbox next to the add-on, then restart Blender. After -restarting, you can uninstall the BlenderBIM Add-on by pressing the ``Remove`` -button in the Blender preferences window. +you have to **first disable the BlenderBIM Add-on in your Blender preferences** +by pressing the checkbox next to the add-on, then **restart Blender**. It is +critical to follow this sequence of disabling first, and then restarting. -Alternatively, you may uninstall manually by deleting the ``blenderbim/`` -directory in your Blender add-ons directory. +After restarting, you can uninstall the BlenderBIM Add-on by pressing the +``Remove`` button in the Blender preferences window. + +Alternatively, you may uninstall manually by deleting the ``blenderbim`` +directory in :ref:`your Blender add-ons directory`. .. warning:: @@ -130,12 +133,20 @@ directory in your Blender add-ons directory. FAQ --- +If you are unable to install the BlenderBIM Add-on, make sure you are using +**Blender 4.1** installed from https://blender.org/ and are installing the +latest version from https://blenderbim.org. + +Other common solutions are listed below. If none of these fix the problem, you +can `report a bug `_ or +`live chat with a developer `_. + 1. **Some other error prevents me from installing or doing basic functions with the add-on. Is it specific to my environment?** - Sometimes it is helpful to try installing and using the BlenderBIM Add-on on - a "clean environment". A clean environment is defined as a fresh Blender - installation with no other add-ons enabled with factory settings. + Try installing and using the BlenderBIM Add-on on a "clean environment". A + clean environment is a fresh Blender installation with no other add-ons + enabled with factory settings. To quickly test in a clean environment, find your Blender configuration folder based on the `where is the add-on installed`_ section. Rename the From cbf04546b884e779a79abc9322b340d567c75c1e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 8 May 2024 17:21:00 +0500 Subject: [PATCH 124/429] fix many implicit ifcopenshell.guid imports a bit related to 10d30b0de --- src/blenderbim/blenderbim/bim/module/attribute/operator.py | 1 + src/blenderbim/blenderbim/bim/module/search/operator.py | 1 + src/blenderbim/blenderbim/tool/brick.py | 3 ++- src/blenderbim/blenderbim/tool/geometry.py | 1 + src/blenderbim/blenderbim/tool/search.py | 1 + src/blenderbim/scripts/classifications/xml_classification.py | 1 + src/blenderbim/scripts/dxf2ifc.py | 1 + src/blenderbim/scripts/obj2ifc-meshlab.py | 1 + src/blenderbim/scripts/obj2ifc.py | 1 + src/blenderbim/test/tool/test_brick.py | 1 + src/blenderbim/test/tool/test_drawing.py | 1 + src/ifc2ca/_deprecated/ca2ifc.py | 1 + src/ifccityjson/ifccityjson/cityjson2ifc/cityjson2ifc.py | 1 + src/ifcfm/ifcfm/cobie24legacy.py | 1 + .../ifcopenshell/api/aggregate/assign_object.py | 1 + .../ifcopenshell/api/classification/add_classification.py | 1 + .../ifcopenshell/api/classification/add_reference.py | 1 + .../ifcopenshell/api/constraint/assign_constraint.py | 1 + .../ifcopenshell/api/control/assign_control.py | 1 + src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py | 1 + .../ifcopenshell/api/document/add_information.py | 1 + .../ifcopenshell/api/document/assign_document.py | 1 + .../ifcopenshell/api/drawing/assign_product.py | 1 + .../ifcopenshell/api/geometry/connect_element.py | 1 + .../ifcopenshell/api/geometry/connect_path.py | 1 + src/ifcopenshell-python/ifcopenshell/api/group/add_group.py | 1 + src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py | 1 + .../ifcopenshell/api/group/update_group_products.py | 1 + .../ifcopenshell/api/library/assign_reference.py | 1 + .../ifcopenshell/api/material/assign_material.py | 1 + src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py | 1 + src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py | 1 + .../ifcopenshell/api/project/assign_declaration.py | 1 + src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py | 1 + src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py | 1 + .../ifcopenshell/api/pset_template/add_prop_template.py | 1 + .../ifcopenshell/api/pset_template/add_pset_template.py | 1 + .../ifcopenshell/api/resource/assign_resource.py | 1 + src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py | 1 + .../ifcopenshell/api/sequence/assign_process.py | 1 + .../ifcopenshell/api/sequence/assign_product.py | 1 + .../ifcopenshell/api/sequence/assign_sequence.py | 1 + .../ifcopenshell/api/sequence/create_baseline.py | 1 + .../ifcopenshell/api/sequence/duplicate_task.py | 1 + .../ifcopenshell/api/spatial/assign_container.py | 1 + .../ifcopenshell/api/spatial/reference_structure.py | 1 + .../api/structural/assign_structural_analysis_model.py | 1 + src/ifcopenshell-python/ifcopenshell/api/system/add_system.py | 1 + .../ifcopenshell/api/system/assign_flow_control.py | 1 + src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py | 1 + .../ifcopenshell/api/system/connect_port.py | 1 + src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py | 1 + src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py | 1 + src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py | 1 + src/ifcopenshell-python/ifcopenshell/util/element.py | 1 + .../ifcopenshell/util/generate_pset_templates.py | 1 + .../test/api/geometry/test_edit_object_placement.py | 1 + .../test/api/owner/test_remove_organisation.py | 1 + src/ifcopenshell-python/test/api/owner/test_remove_person.py | 1 + .../test/api/owner/test_remove_person_and_organisation.py | 1 + src/ifcopenshell-python/test/api/pset/test_edit_pset.py | 1 + src/ifcopenshell-python/test/api/root/test_remove_product.py | 1 + src/ifcopenshell-python/test/file_gc.py | 1 + src/ifcopenshell-python/test/global_id_updates.py | 2 ++ src/ifcopenshell-python/test/instance_string_formatting.py | 1 + src/ifcopenshell-python/test/test_wall_opening.py | 1 + src/ifcopenshell-python/test/util/test_element.py | 1 + src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py | 1 + src/ifcpatch/ifcpatch/recipes/ExtractElements.py | 1 + src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py | 1 + src/ifcsverchok/nodes/ifc/create_file.py | 1 + src/ifcsverchok/nodes/ifc/generate_guid.py | 1 + src/ifcsverchok/nodes/ifc/read_file.py | 1 + src/ifctester/test/ids_doc_generator.py | 1 + src/ifctester/test/test_facet.py | 1 + src/ifctester/webapp/app.py | 1 + 76 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/attribute/operator.py b/src/blenderbim/blenderbim/bim/module/attribute/operator.py index a86ff15e21..21a81526ce 100644 --- a/src/blenderbim/blenderbim/bim/module/attribute/operator.py +++ b/src/blenderbim/blenderbim/bim/module/attribute/operator.py @@ -20,6 +20,7 @@ import bpy import json import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import blenderbim.bim.helper import blenderbim.bim.handler import blenderbim.tool as tool diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index 6ffe447470..1c22ea0f01 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -20,6 +20,7 @@ import re import bpy import json import ifcopenshell +import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.selector from ifcopenshell.util.selector import Selector diff --git a/src/blenderbim/blenderbim/tool/brick.py b/src/blenderbim/blenderbim/tool/brick.py index 847adfe09f..16d86d5fa3 100644 --- a/src/blenderbim/blenderbim/tool/brick.py +++ b/src/blenderbim/blenderbim/tool/brick.py @@ -19,6 +19,7 @@ import os import bpy import ifcopenshell +import ifcopenshell.guid import ifcopenshell.util.brick import blenderbim.core.tool import blenderbim.tool as tool @@ -604,4 +605,4 @@ class BrickStore: def set_last_saved(cls): save = os.path.getmtime(BrickStore.path) save = datetime.datetime.fromtimestamp(save) - BrickStore.last_saved = f"{save.year}-{save.month}-{save.day} {save.hour}:{save.minute}" \ No newline at end of file + BrickStore.last_saved = f"{save.year}-{save.month}-{save.day} {save.hour}:{save.minute}" diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index eed3d3412b..ba2896839b 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -24,6 +24,7 @@ import logging import numpy as np import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.system import blenderbim.core.tool diff --git a/src/blenderbim/blenderbim/tool/search.py b/src/blenderbim/blenderbim/tool/search.py index 3d77e1653f..984e359d93 100644 --- a/src/blenderbim/blenderbim/tool/search.py +++ b/src/blenderbim/blenderbim/tool/search.py @@ -3,6 +3,7 @@ import json import lark import blenderbim.core.tool import blenderbim.tool as tool +import ifcopenshell.guid import ifcopenshell.util.selector from ifcopenshell.util.selector import Selector from blenderbim.bim.prop import BIMFacet diff --git a/src/blenderbim/scripts/classifications/xml_classification.py b/src/blenderbim/scripts/classifications/xml_classification.py index a66b2b6584..28ed1cd9fc 100644 --- a/src/blenderbim/scripts/classifications/xml_classification.py +++ b/src/blenderbim/scripts/classifications/xml_classification.py @@ -4,6 +4,7 @@ import xml.etree.ElementTree as ET import ifcopenshell +import ifcopenshell.guid import os class IFC4Extractor: diff --git a/src/blenderbim/scripts/dxf2ifc.py b/src/blenderbim/scripts/dxf2ifc.py index 8a1bc4e71b..58e3c9db80 100644 --- a/src/blenderbim/scripts/dxf2ifc.py +++ b/src/blenderbim/scripts/dxf2ifc.py @@ -17,6 +17,7 @@ # along with BlenderBIM Add-on. If not, see . import ifcopenshell +import ifcopenshell.guid import ezdxf diff --git a/src/blenderbim/scripts/obj2ifc-meshlab.py b/src/blenderbim/scripts/obj2ifc-meshlab.py index 2ecb5684fb..f1ac00543c 100644 --- a/src/blenderbim/scripts/obj2ifc-meshlab.py +++ b/src/blenderbim/scripts/obj2ifc-meshlab.py @@ -23,6 +23,7 @@ import pymeshlab import ifcopenshell import ifcopenshell.api import ifcopenshell.api.owner.settings +import ifcopenshell.guid from pathlib import Path import numpy as np diff --git a/src/blenderbim/scripts/obj2ifc.py b/src/blenderbim/scripts/obj2ifc.py index 2999fbb6b6..9f64ab8dd8 100644 --- a/src/blenderbim/scripts/obj2ifc.py +++ b/src/blenderbim/scripts/obj2ifc.py @@ -23,6 +23,7 @@ import pywavefront import ifcopenshell import ifcopenshell.api import ifcopenshell.api.owner.settings +import ifcopenshell.guid from pathlib import Path import numpy as np diff --git a/src/blenderbim/test/tool/test_brick.py b/src/blenderbim/test/tool/test_brick.py index b5d5a1f973..0367f98b32 100644 --- a/src/blenderbim/test/tool/test_brick.py +++ b/src/blenderbim/test/tool/test_brick.py @@ -22,6 +22,7 @@ import brickschema import brickschema.persistent from brickschema.namespaces import REF, A import ifcopenshell +import ifcopenshell.guid import blenderbim.core.tool import blenderbim.tool as tool from rdflib.namespace import RDF diff --git a/src/blenderbim/test/tool/test_drawing.py b/src/blenderbim/test/tool/test_drawing.py index 84e63b0d75..0e6c27f53d 100644 --- a/src/blenderbim/test/tool/test_drawing.py +++ b/src/blenderbim/test/tool/test_drawing.py @@ -21,6 +21,7 @@ from pathlib import Path import bpy import mathutils import ifcopenshell +import ifcopenshell.guid import blenderbim.core.tool import blenderbim.tool as tool from test.bim.bootstrap import NewFile diff --git a/src/ifc2ca/_deprecated/ca2ifc.py b/src/ifc2ca/_deprecated/ca2ifc.py index 7847a88e80..599a94103f 100644 --- a/src/ifc2ca/_deprecated/ca2ifc.py +++ b/src/ifc2ca/_deprecated/ca2ifc.py @@ -19,6 +19,7 @@ import json import ifcopenshell +import ifcopenshell.guid import os from datetime import datetime diff --git a/src/ifccityjson/ifccityjson/cityjson2ifc/cityjson2ifc.py b/src/ifccityjson/ifccityjson/cityjson2ifc/cityjson2ifc.py index e56b5e18a2..d1344aa65d 100644 --- a/src/ifccityjson/ifccityjson/cityjson2ifc/cityjson2ifc.py +++ b/src/ifccityjson/ifccityjson/cityjson2ifc/cityjson2ifc.py @@ -20,6 +20,7 @@ import os import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid from datetime import datetime from .geometry import GeometryIO diff --git a/src/ifcfm/ifcfm/cobie24legacy.py b/src/ifcfm/ifcfm/cobie24legacy.py index 3b81b17a42..1442e1f43e 100644 --- a/src/ifcfm/ifcfm/cobie24legacy.py +++ b/src/ifcfm/ifcfm/cobie24legacy.py @@ -17,6 +17,7 @@ # along with IfcFM. If not, see . import ifcopenshell +import ifcopenshell.guid import ifcopenshell.util.fm import ifcopenshell.util.date import ifcopenshell.util.system diff --git a/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py index c1ffdc5a16..4490266186 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/assign_object.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.placement from typing import Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py index a6e251fcf2..ee72bd7585 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.guid import ifcopenshell.util.schema import ifcopenshell.util.date from typing import Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py index 979bfc40dd..d5d2d94932 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/add_reference.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.schema from typing import Optional, Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py index 89a80d9ab3..646ab57cda 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/assign_constraint.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid from typing import Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py b/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py index 93a4fe2f35..ed52f1be73 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def assign_control(file, relating_control=None, related_object=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py index f270446cfd..461279942a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +import ifcopenshell.guid def add_cost_item(file, cost_schedule=None, cost_item=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py index fc60134477..7754f8cef5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.guid def add_information(file, parent=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py b/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py index 5818347a90..dcd851b897 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/assign_document.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element from typing import Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py index b35d0bd564..c0758c8145 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def assign_product(file, relating_product=None, related_object=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py index 64df2e59d6..d86e2bbca3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py index 7cc60c4ef1..bab818ee64 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py index 1d576f7173..7a233bdcbf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def add_group(file, Name="Unnamed", Description=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py index c5afd5b9b0..a11b15c6de 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid from typing import Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py index f526666fa2..74ef54c0bb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def update_group_products(file, group=None, products=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py index 6cbd208865..ea9fff9623 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/assign_reference.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element from typing import Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py index 9098ca72fc..a238d7a8c9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_material.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.representation from typing import Optional, Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py index 7bf76e5c08..b49adc72a5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element from typing import Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py index 361c32bf2a..1680e5369f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def assign_actor(file, relating_actor=None, related_object=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py index e1be64ba7f..322e8a18ad 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element from typing import Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py index 6cb72e435c..edc1bf5ac6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.guid def add_pset(file, product=None, name=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py index 0215ab31ad..b105179385 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def add_qto(file, product=None, name=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py index 109c830c94..2fbfb4a5c6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.guid def add_prop_template( diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py index 9a22b6a97a..05dee01a45 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.guid def add_pset_template( diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py index 44d856ef0f..eaf49505c0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def assign_resource(file, relating_resource=None, related_object=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py index 7d1a91423f..50ab4f58dc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py @@ -18,6 +18,7 @@ import ifcopenshell.api import ifcopenshell +import ifcopenshell.guid def add_task( diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py index 12f8cfe78c..a5241b530a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def assign_process(file, relating_process=None, related_object=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py index bd9b90d2da..f20c5d5e32 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def assign_product(file, relating_product=None, related_object=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py index ed5103758c..257a1e16d8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def assign_sequence( diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py index a06fe8d722..f45d303500 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.guid import ifcopenshell.util.system import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py index 14016794cd..5578cf57f7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.guid import ifcopenshell.api import ifcopenshell.util.element import ifcopenshell.util.sequence diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py index 298fe3dfdb..02343e4303 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/assign_container.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.guid import ifcopenshell.api import ifcopenshell.util.element import ifcopenshell.util.placement diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py index 48b5c6bc1b..19fe199cb1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/reference_structure.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element from typing import Union diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py index 19c31e34ff..e6aba2d807 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def assign_structural_analysis_model(file, product=None, structural_analysis_model=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py index 75027ee55a..195bca640f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/add_system.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def add_system(file: ifcopenshell.file, ifc_class: str = "IfcDistributionSystem") -> ifcopenshell.entity_instance: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py index 2254a43dec..0f92e006eb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid def assign_flow_control(file, relating_flow_element=None, related_flow_control=None) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py index c424f8eb4b..72afc13db3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.placement diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py index f5773c5a21..c567d75eba 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py b/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py index 9d30d6083a..670297593a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/assign_type.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element from typing import Union, Iterable diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py index 547178fff8..9e8d09744d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.guid import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py index d873ac2cd3..67e7f1b1c1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_opening.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.placement diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 70c110a63d..f57d1891bc 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.guid import ifcopenshell.util.element from typing import Any, Callable, Optional, Union, Literal, overload from collections import namedtuple diff --git a/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py b/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py index 7cf57b225a..fd9abdee5b 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py +++ b/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py @@ -19,6 +19,7 @@ RUN_FROM_DEV_REPO = False import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.attribute import glob import sys diff --git a/src/ifcopenshell-python/test/api/geometry/test_edit_object_placement.py b/src/ifcopenshell-python/test/api/geometry/test_edit_object_placement.py index 73985fd627..2eb72d33b9 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_edit_object_placement.py +++ b/src/ifcopenshell-python/test/api/geometry/test_edit_object_placement.py @@ -20,6 +20,7 @@ import numpy import pytest import test.bootstrap import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.placement diff --git a/src/ifcopenshell-python/test/api/owner/test_remove_organisation.py b/src/ifcopenshell-python/test/api/owner/test_remove_organisation.py index 86a659e541..f669dc6814 100644 --- a/src/ifcopenshell-python/test/api/owner/test_remove_organisation.py +++ b/src/ifcopenshell-python/test/api/owner/test_remove_organisation.py @@ -18,6 +18,7 @@ import test.bootstrap import ifcopenshell.api +import ifcopenshell.guid class TestRemoveOrganisation(test.bootstrap.IFC4): diff --git a/src/ifcopenshell-python/test/api/owner/test_remove_person.py b/src/ifcopenshell-python/test/api/owner/test_remove_person.py index 1bcdafc729..569b42cd60 100644 --- a/src/ifcopenshell-python/test/api/owner/test_remove_person.py +++ b/src/ifcopenshell-python/test/api/owner/test_remove_person.py @@ -18,6 +18,7 @@ import test.bootstrap import ifcopenshell.api +import ifcopenshell.guid class TestRemovePerson(test.bootstrap.IFC4): diff --git a/src/ifcopenshell-python/test/api/owner/test_remove_person_and_organisation.py b/src/ifcopenshell-python/test/api/owner/test_remove_person_and_organisation.py index 3623e5ef0f..0c2c8b53f8 100644 --- a/src/ifcopenshell-python/test/api/owner/test_remove_person_and_organisation.py +++ b/src/ifcopenshell-python/test/api/owner/test_remove_person_and_organisation.py @@ -18,6 +18,7 @@ import test.bootstrap import ifcopenshell.api +import ifcopenshell.guid class TestRemovePersonAndOrganisation(test.bootstrap.IFC4): diff --git a/src/ifcopenshell-python/test/api/pset/test_edit_pset.py b/src/ifcopenshell-python/test/api/pset/test_edit_pset.py index d7c0db240e..7912771759 100644 --- a/src/ifcopenshell-python/test/api/pset/test_edit_pset.py +++ b/src/ifcopenshell-python/test/api/pset/test_edit_pset.py @@ -19,6 +19,7 @@ import operator import test.bootstrap import ifcopenshell.api +import ifcopenshell.guid class TestEditPset(test.bootstrap.IFC4): diff --git a/src/ifcopenshell-python/test/api/root/test_remove_product.py b/src/ifcopenshell-python/test/api/root/test_remove_product.py index ab2d2cf568..418bdbc503 100644 --- a/src/ifcopenshell-python/test/api/root/test_remove_product.py +++ b/src/ifcopenshell-python/test/api/root/test_remove_product.py @@ -18,6 +18,7 @@ import test.bootstrap import ifcopenshell.api +import ifcopenshell.guid class TestRemoveProduct(test.bootstrap.IFC4): diff --git a/src/ifcopenshell-python/test/file_gc.py b/src/ifcopenshell-python/test/file_gc.py index 6b5f5cc627..07d0f18ae2 100644 --- a/src/ifcopenshell-python/test/file_gc.py +++ b/src/ifcopenshell-python/test/file_gc.py @@ -3,6 +3,7 @@ import pytest import weakref import itertools import ifcopenshell +import ifcopenshell.guid import ifcopenshell.api import ifcopenshell.template diff --git a/src/ifcopenshell-python/test/global_id_updates.py b/src/ifcopenshell-python/test/global_id_updates.py index 314843953e..dcf9c442e9 100644 --- a/src/ifcopenshell-python/test/global_id_updates.py +++ b/src/ifcopenshell-python/test/global_id_updates.py @@ -1,5 +1,7 @@ import pytest import ifcopenshell +import ifcopenshell.guid + def test_global_id_updates(): g1, g2, g3 = (ifcopenshell.guid.new() for i in range(3)) diff --git a/src/ifcopenshell-python/test/instance_string_formatting.py b/src/ifcopenshell-python/test/instance_string_formatting.py index 1ba8e28c4c..88ffcd2a02 100644 --- a/src/ifcopenshell-python/test/instance_string_formatting.py +++ b/src/ifcopenshell-python/test/instance_string_formatting.py @@ -1,5 +1,6 @@ import pytest import ifcopenshell +import ifcopenshell.guid def test_file_gc(): f = ifcopenshell.file() diff --git a/src/ifcopenshell-python/test/test_wall_opening.py b/src/ifcopenshell-python/test/test_wall_opening.py index 6c9ed4242d..92ccf69681 100644 --- a/src/ifcopenshell-python/test/test_wall_opening.py +++ b/src/ifcopenshell-python/test/test_wall_opening.py @@ -28,6 +28,7 @@ from dataclasses import dataclass, field import pytest import ifcopenshell +import ifcopenshell.guid import ifcopenshell.template PERF = False diff --git a/src/ifcopenshell-python/test/util/test_element.py b/src/ifcopenshell-python/test/util/test_element.py index ccb548a076..fef03698bd 100644 --- a/src/ifcopenshell-python/test/util/test_element.py +++ b/src/ifcopenshell-python/test/util/test_element.py @@ -19,6 +19,7 @@ import pytest import test.bootstrap import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.element as subject diff --git a/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py b/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py index 5f9e85fc80..d9df05666d 100644 --- a/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py +++ b/src/ifcpatch/ifcpatch/recipes/ConvertNestToAggregate.py @@ -17,6 +17,7 @@ # along with IfcPatch. If not, see . import ifcopenshell +import ifcopenshell.guid class Patcher: diff --git a/src/ifcpatch/ifcpatch/recipes/ExtractElements.py b/src/ifcpatch/ifcpatch/recipes/ExtractElements.py index b2660a9d29..3947dd919d 100644 --- a/src/ifcpatch/ifcpatch/recipes/ExtractElements.py +++ b/src/ifcpatch/ifcpatch/recipes/ExtractElements.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifcopenshell.util.selector from typing import Union from logging import Logger diff --git a/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py b/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py index 947efbfa1a..6a00e54e95 100644 --- a/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py +++ b/src/ifcpatch/ifcpatch/recipes/RegenerateGlobalIds.py @@ -17,6 +17,7 @@ # along with IfcPatch. If not, see . import ifcopenshell +import ifcopenshell.guid from logging import Logger diff --git a/src/ifcsverchok/nodes/ifc/create_file.py b/src/ifcsverchok/nodes/ifc/create_file.py index 71f0263a95..f57c9825ed 100644 --- a/src/ifcsverchok/nodes/ifc/create_file.py +++ b/src/ifcsverchok/nodes/ifc/create_file.py @@ -18,6 +18,7 @@ import bpy import ifcopenshell +import ifcopenshell.guid import ifcsverchok.helper from bpy.props import StringProperty from sverchok.node_tree import SverchCustomTreeNode diff --git a/src/ifcsverchok/nodes/ifc/generate_guid.py b/src/ifcsverchok/nodes/ifc/generate_guid.py index 893a1b972f..cd706bc6a4 100644 --- a/src/ifcsverchok/nodes/ifc/generate_guid.py +++ b/src/ifcsverchok/nodes/ifc/generate_guid.py @@ -18,6 +18,7 @@ import bpy import ifcopenshell +import ifcopenshell.guid import ifcsverchok.helper from sverchok.node_tree import SverchCustomTreeNode diff --git a/src/ifcsverchok/nodes/ifc/read_file.py b/src/ifcsverchok/nodes/ifc/read_file.py index 5b3432a71e..a6b39763d0 100644 --- a/src/ifcsverchok/nodes/ifc/read_file.py +++ b/src/ifcsverchok/nodes/ifc/read_file.py @@ -18,6 +18,7 @@ import bpy import ifcopenshell +import ifcopenshell.guid import ifcsverchok.helper from bpy.props import StringProperty from sverchok.node_tree import SverchCustomTreeNode diff --git a/src/ifctester/test/ids_doc_generator.py b/src/ifctester/test/ids_doc_generator.py index 2543daec23..bb518736db 100644 --- a/src/ifctester/test/ids_doc_generator.py +++ b/src/ifctester/test/ids_doc_generator.py @@ -23,6 +23,7 @@ import pytest import functools import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifctester import test_facet import test_ids diff --git a/src/ifctester/test/test_facet.py b/src/ifctester/test/test_facet.py index ddee91ab36..e5a8f334cd 100644 --- a/src/ifctester/test/test_facet.py +++ b/src/ifctester/test/test_facet.py @@ -20,6 +20,7 @@ import uuid import ifcopenshell import ifcopenshell.api +import ifcopenshell.guid import ifctester.facet from ifctester.facet import Entity, Attribute, Classification, Property, PartOf, Material, Restriction diff --git a/src/ifctester/webapp/app.py b/src/ifctester/webapp/app.py index ca79f7848d..b6bb73a703 100644 --- a/src/ifctester/webapp/app.py +++ b/src/ifctester/webapp/app.py @@ -22,6 +22,7 @@ import time import ifctester import ifctester.reporter import ifcopenshell +import ifcopenshell.guid from flask import Flask, request, send_from_directory app = Flask(__name__) From d4ccadb8329b6b381c430ac2a1246c87a8b3e9c3 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 8 May 2024 18:13:01 +0500 Subject: [PATCH 125/429] fix circular import after 10d30b0de --- .../ifcopenshell/api/geometry/add_representation.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index 6c9a8da058..fee0dc7dd1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -15,13 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . - +from __future__ import annotations import bpy import math import bmesh import ifcopenshell.util.unit from mathutils import Vector, Matrix -from blenderbim.bim.module.geometry.helper import Helper + Z_AXIS = Vector((0, 0, 1)) X_AXIS = Vector((1, 0, 0)) @@ -29,6 +29,10 @@ EPSILON = 1e-6 def add_representation(file: ifcopenshell.file, **usecase_settings) -> ifcopenshell.entity_instance: + # lazy import Helper to avoid circular import + if "Helper" not in globals(): + from blenderbim.bim.module.geometry.helper import Helper + usecase = Usecase() # TODO: This usecase currently depends on Blender's data model usecase.file = file From c5a7a8680e7e9c206db562f14f5e3675d6677992 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 8 May 2024 15:12:45 +0500 Subject: [PATCH 126/429] fix removing references in ifc2x3 #4636 --- .../ifcopenshell/api/document/remove_reference.py | 10 +++++++--- .../test/api/document/test_remove_reference.py | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py index 5321b480f7..42264cdec3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/remove_reference.py @@ -38,11 +38,15 @@ def remove_reference(file: ifcopenshell.file, reference: ifcopenshell.entity_ins reference = ifcopenshell.api.run("document.add_reference", model, information=document) ifcopenshell.api.run("document.remove_reference", model, reference=reference) """ - settings = {"reference": reference} - for rel in settings["reference"].DocumentRefForObjects or []: + if file.schema == "IFC2X3": + rels = [r for r in file.get_inverse(reference) if r.is_a("IfcRelAssociatesDocument")] + else: + rels = reference.DocumentRefForObjects + + for rel in rels: history = rel.OwnerHistory file.remove(rel) if history: ifcopenshell.util.element.remove_deep2(file, history) - file.remove(settings["reference"]) + file.remove(reference) diff --git a/src/ifcopenshell-python/test/api/document/test_remove_reference.py b/src/ifcopenshell-python/test/api/document/test_remove_reference.py index a1b3c260e2..8fc96200ab 100644 --- a/src/ifcopenshell-python/test/api/document/test_remove_reference.py +++ b/src/ifcopenshell-python/test/api/document/test_remove_reference.py @@ -41,3 +41,7 @@ class TestRemoveReference(test.bootstrap.IFC4): assert len(self.file.by_type("IfcDocumentReference")) == 0 assert len(self.file.by_type("IfcDocumentInformation")) == 1 assert len(self.file.by_type("IfcRelAssociatesDocument")) == 1 + + +class TestRemoveReferenceIFC2X3(test.bootstrap.IFC2X3, TestRemoveReference): + pass From d453adb7cf1f1f553f4136fc6a2d5eafc6017be9 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 9 May 2024 10:36:39 +1000 Subject: [PATCH 127/429] Forgot to commit IfcTester fix for missing failed entities --- .../ifcopenshell/api/__init__.py | 13 +++++++++++++ .../ifcopenshell/util/__init__.py | 16 ++++++++++++++++ src/ifctester/ifctester/ids.py | 1 + 3 files changed, 30 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index e24870d956..a0babf7963 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -23,6 +23,19 @@ the rules of the IFC schema. This API module provides simple to use authoring functions that hide this complexity from you. Things like managing differences between IFC versions, tracking owernship changes, or cleaning up after orphaned relationships are all handled automatically. + +If you're new to IFC authoring, start by looking at the following APIs: + +- See :func:`ifcopenshell.api.project.create_file` to create a new IFC. +- See :func:`ifcopenshell.api.root.create_entity` to create new entities, like + the mandatory IfcProject, and then an IfcSite, IfcWall, etc. +- See :func:`ifcopenshell.api.aggregate.assign_object` to create a spatial + hierarchy. +- See :func:`ifcopenshell.api.spatial.assign_container` to place physical + elements (e.g. walls) inside spatial elements (e.g. building storeys). + +Also see how to `create a simple model from scratch +`_. """ import json diff --git a/src/ifcopenshell-python/ifcopenshell/util/__init__.py b/src/ifcopenshell-python/ifcopenshell/util/__init__.py index bcd1e83caf..03fea1cd53 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/util/__init__.py @@ -25,4 +25,20 @@ through these relationships which can be tedious. This module makes it easy to get commonly requested data from IFC relationships, such as properties of a wall, what elements are connected to pipes, dates from work schedules, filtering maintainable elements, and more. + +The most commonly used utilities to help you get started are: + +- See :mod:`ifcopenshell.util.element` which contains a lot of useful functions + for getting most common relationships on elements. +- See :func:`ifcopenshell.util.element.get_psets` to get all properties of an + entity, like a wall. +- See :func:`ifcopenshell.util.element.get_type` to get the corresponding type + object (e.g. the wall type definition) of a single occurrence (e.g. an + individual wall). +- See :func:`ifcopenshell.util.placement.get_local_placement` to get the XYZ + placement point of a single object. +- See :func:`ifcopenshell.util.unit.calculate_unit_scale` to convert between SI + units and project units. +- See :mod:`ifcopenshell.util.shape` to calculate quantities from processed + geometry. """ diff --git a/src/ifctester/ifctester/ids.py b/src/ifctester/ifctester/ids.py index 4703b0445a..ea5c6791f9 100644 --- a/src/ifctester/ifctester/ids.py +++ b/src/ifctester/ifctester/ids.py @@ -174,6 +174,7 @@ class Specification: self.instructions = instructions self.applicable_entities: list[ifcopenshell.entity_instance] = [] + self.failed_entities: set[ifcopenshell.entity_instance] = set() self.status = None def asdict(self): From b57141a80c798d632647fd518c530177a1f39f6d Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 9 May 2024 10:46:57 +1000 Subject: [PATCH 128/429] New type of IfcTester report which doesn't require audit to be run to see a spreadsheet view of requirements --- src/ifctester/ifctester/__main__.py | 18 +-- src/ifctester/ifctester/reporter.py | 165 ++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+), 8 deletions(-) diff --git a/src/ifctester/ifctester/__main__.py b/src/ifctester/ifctester/__main__.py index a49c4c1094..30d1db517d 100644 --- a/src/ifctester/ifctester/__main__.py +++ b/src/ifctester/ifctester/__main__.py @@ -26,7 +26,7 @@ from . import reporter parser = argparse.ArgumentParser(description="Uses an IDS to audit an IFC") parser.add_argument("ids", type=str, help="Path to an IDS") -parser.add_argument("ifc", type=str, help="Path to an IFC") +parser.add_argument("ifc", type=str, help="Path to an IFC", nargs="?") parser.add_argument( "-r", "--reporter", type=str, help="The reporting method to view audit results", default="Console" ) @@ -41,14 +41,14 @@ parser.add_argument( ) args = parser.parse_args() -start = time.time() specs = ids.open(args.ids) -ifc = ifcopenshell.open(args.ifc) -print("Finished loading:", time.time() - start) -start = time.time() -specs.validate(ifc) -print("Finished validating:", time.time() - start) -start = time.time() +if args.ifc: + start = time.time() + ifc = ifcopenshell.open(args.ifc) + print("Finished loading:", time.time() - start) + start = time.time() + specs.validate(ifc) + print("Finished validating:", time.time() - start) if args.reporter == "Console": engine = reporter.Console(specs, use_colour=not args.no_color) @@ -60,6 +60,8 @@ elif args.reporter == "Html": engine = reporter.Html(specs) elif args.reporter == "Ods": engine = reporter.Ods(specs, excel_safe=args.excel_safe) +elif args.reporter == "OdsSummary": + engine = reporter.OdsSummary(specs, excel_safe=args.excel_safe) elif args.reporter == "Bcf": engine = reporter.Bcf(specs) diff --git a/src/ifctester/ifctester/reporter.py b/src/ifctester/ifctester/reporter.py index 90f7fd1c36..cbe56546a1 100644 --- a/src/ifctester/ifctester/reporter.py +++ b/src/ifctester/ifctester/reporter.py @@ -91,6 +91,9 @@ class ResultsSpecification(TypedDict): class ResultsRequirement(TypedDict): + facet_type: str + label: str + value: str description: str status: bool failed_entities: list[ResultsFailedEntity] @@ -291,8 +294,48 @@ class Json(Reporter): percent_pass = math.floor((total_pass / total_applicable) * 100) if total_applicable else "N/A" total_checks += total_applicable total_checks_pass += total_pass + facet_type = type(requirement).__name__ + value = "" + if facet_type == "Entity": + if requirement.predefinedType: + label = "IFC Class / Predefined Type" + value = f"{requirement.name}.{requirement.predefinedType}" + else: + label = "IFC Class" + value = requirement.name + elif facet_type == "Attribute": + label = requirement.name + if requirement.value: + value = requirement.value + elif facet_type == "Classification": + if requirement.system and requirement.value: + label = "System / Reference" + value = f"{requirement.system} / {requirement.value}" + elif requirement.system: + label = "System" + value = requirement.system + elif requirement.value: + label = "Reference" + value = requirement.value + elif facet_type == "PartOf": + label = requirement.relation + if requirement.predefinedType: + value = f"{requirement.name}.{requirement.predefinedType}" + else: + value = requirement.name + elif facet_type == "Property": + label = f"{requirement.propertySet}.{requirement.baseName}" + if requirement.value: + value = requirement.value + elif facet_type == "Material": + label = "Name / Category" + if requirement.value: + value = requirement.value requirements.append( ResultsRequirement( + facet_type=facet_type, + label=label, + value=value, description=requirement.to_string("requirement", specification, requirement), status=requirement.status, failed_entities=self.report_failed_entities(requirement), @@ -527,6 +570,128 @@ class Ods(Json): self.doc.save(filepath, addsuffix=not filepath.lower().endswith(".ods")) +class OdsSummary(Json): + def __init__(self, ids: Ids, excel_safe=False): + super().__init__(ids) + self.excel_safe = excel_safe + self.colours = { + "h": "cccccc", # Header + "p": "97cc64", # Pass + "f": "fb5a3e", # Fail + "t": "ffffff", # Regular text + } + + def excel_safe_spreadsheet_name(self, name: str) -> str: + if not self.excel_safe: + return name + + warning = ( + f'WARNING. Sheet name "{name}" is not valid for Excel and will be changed. ' + "See: https://support.microsoft.com/en-us/office/rename-a-worksheet-3f1f7148-ee83-404d-8ef0-9ff99fbad1f9" + ) + + if not name or name == "History": + print(warning) + return "placeholder spreadsheet name" + + if name.startswith("'") or name.endswith("'"): + print(warning) + name = name.strip("'") + + pattern = r"[\\\/\?\*\:\[\]]" + if re.search(pattern, name): + name = re.sub(pattern, "", name) + print(warning) + + if len(name) > 31: + name = name[:31] + print(warning) + return name + + def to_file(self, filepath: str) -> None: + from odf.opendocument import OpenDocumentSpreadsheet + from odf.style import Style, TableCellProperties + from odf.table import Table, TableRow, TableCell + from odf.text import P + + self.doc = OpenDocumentSpreadsheet() + + self.cell_formats = {} + for key, value in self.colours.items(): + style = Style(name=key, family="table-cell") + style.addElement(TableCellProperties(backgroundcolor="#" + value)) + self.doc.automaticstyles.addElement(style) + self.cell_formats[key] = style + + table = Table(name=self.excel_safe_spreadsheet_name(self.results["title"])) + tr = TableRow() + for header in ["Specification", "Applicability", "Facet Type", "Data Name", "Value Requirements"]: + tc = TableCell(valuetype="string", stylename="h") + tc.addElement(P(text=header)) + tr.addElement(tc) + table.addElement(tr) + + rows = [] + for specification in self.results["specifications"]: + applicability = ", ".join(specification["applicability"]) + for requirement in specification["requirements"]: + rows.append( + [ + specification["name"], + applicability, + requirement["facet_type"], + requirement["label"], + requirement["value"], + ] + ) + + for row in rows: + tr = TableRow() + c = 0 + for col in row: + tc = TableCell(valuetype="string") + if col is None: + col = "NULL" + tc.addElement(P(text=col)) + tr.addElement(tc) + c += 1 + table.addElement(tr) + self.doc.spreadsheet.addElement(table) + + while False: + for requirement in specification["requirements"]: + if requirement["status"]: + continue + for failure in requirement["failed_entities"]: + element = failure.get("element", None) + element_type = failure.get("element_type", None) + row = [ + requirement["description"], + failure.get("reason", "No reason provided"), + failure["class"], + failure["predefined_type"], + failure["name"], + failure["description"], + failure["global_id"], + failure["tag"], + str(element) if element else "N/A", + str(element_type) if element_type else "N/A", + ] + tr = TableRow() + c = 0 + for col in row: + tc = TableCell(valuetype="string", stylename="t") + if col is None: + col = "NULL" + tc.addElement(P(text=col)) + tr.addElement(tc) + c += 1 + table.addElement(tr) + self.doc.spreadsheet.addElement(table) + + self.doc.save(filepath, addsuffix=not filepath.lower().endswith(".ods")) + + class Bcf(Json): def report_failed_entities(self, requirement: Facet) -> list[FacetFailure]: return [FacetFailure(f) for f in requirement.failures] From 5fa385e1e0270bf90538147b44ecb7f529d32cbf Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 9 May 2024 13:27:08 +1000 Subject: [PATCH 129/429] Allow for having wildcard listeners in the api --- src/ifcopenshell-python/ifcopenshell/api/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index a0babf7963..24288cc714 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -315,7 +315,9 @@ def wrap_usecase(usecase_path, usecase): ifc_file = args[0] if args else None nonlocal usecase_path if should_run_listeners: - for listener in pre_listeners.get(usecase_path, {}).values(): + listeners = list(pre_listeners.get(usecase_path, {}).values()) + listeners += pre_listeners.get("*", {}).values() + for listener in listeners: listener(usecase_path, ifc_file, settings) # see #4531 @@ -329,7 +331,9 @@ def wrap_usecase(usecase_path, usecase): raise TypeError(msg) from e if should_run_listeners: - for listener in post_listeners.get(usecase_path, {}).values(): + listeners = list(post_listeners.get(usecase_path, {}).values()) + listeners += post_listeners.get("*", {}).values() + for listener in listeners: listener(usecase_path, ifc_file, settings) return result From f075a6178b42f97ba9efe101d74ab8207441cc64 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 9 May 2024 13:29:26 +1000 Subject: [PATCH 130/429] Experimental code for serialising API settings --- .../ifcopenshell/api/__init__.py | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index 24288cc714..b7670b2293 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -170,31 +170,6 @@ def run( for listener in pre_listeners.get(usecase_path, {}).values(): listener(usecase_path, ifc_file, settings) - - # TODO: settings serialization for client-server systems - # def serialise_entity_instance(entity): - # return {"cast_type": "entity_instance", "value": entity.id(), "Name": getattr(entity, "Name", None)} - # vcs_settings = settings.copy() - # for key, value in settings.items(): - # if isinstance(value, ifcopenshell.entity_instance): - # vcs_settings[key] = serialise_entity_instance(value) - # elif isinstance(value, numpy.ndarray): - # vcs_settings[key] = {"cast_type": "ndarray", "value": value.tolist()} - # elif isinstance(value, list) and value and isinstance(value[0], ifcopenshell.entity_instance): - # vcs_settings[key] = [serialise_entity_instance(i) for i in value] - if "add_representation" in usecase_path: - pass - # print(usecase_path, "{ ... settings too complex right now ... }") - elif "owner." in usecase_path: - pass - else: - pass - # print(vcs_settings) - # try: - # print(usecase_path, json.dumps(vcs_settings)) - # except: - # print(usecase_path, vcs_settings) - usecase_class = CACHED_USECASE_CLASSES.get(usecase_path) if usecase_class is None: importlib.import_module(f"ifcopenshell.api.{usecase_path}") @@ -308,6 +283,28 @@ def extract_docs(module, usecase): return node_data +def serialise_settings(settings): + def serialise_entity_instance(entity): + return {"cast_type": "entity_instance", "value": entity.id(), "Name": getattr(entity, "Name", None)} + + vcs_settings = settings.copy() + for key, value in settings.items(): + if isinstance(value, ifcopenshell.entity_instance): + vcs_settings[key] = serialise_entity_instance(value) + elif isinstance(value, numpy.ndarray): + vcs_settings[key] = {"cast_type": "ndarray", "value": value.tolist()} + elif isinstance(value, list) and value and isinstance(value[0], ifcopenshell.entity_instance): + vcs_settings[key] = [serialise_entity_instance(i) for i in value] + if "add_representation" in usecase_path: + return "" + elif "owner." in usecase_path: + return "" + try: + return json.dumps(vcs_settings) + except: + return str(vcs_settings) + + def wrap_usecase(usecase_path, usecase): """Wraps an API function in pre/post listeners.""" From a1e0b8858ec4aa0d0fa09b4875bbfbf716d63931 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 9 May 2024 13:37:57 +1000 Subject: [PATCH 131/429] Track last actions and friendlier error reporting when something breaks --- src/blenderbim/blenderbim/__init__.py | 43 +++++++++++++------ src/blenderbim/blenderbim/bim/ifc.py | 29 ++++++++----- .../blenderbim/bim/module/debug/operator.py | 14 +++--- .../ifcopenshell/api/__init__.py | 9 ++-- src/ifctester/ifctester/facet.py | 7 ++- src/ifctester/ifctester/ids.py | 5 ++- 6 files changed, 71 insertions(+), 36 deletions(-) diff --git a/src/blenderbim/blenderbim/__init__.py b/src/blenderbim/blenderbim/__init__.py index 2a742ed65d..c5d6420273 100644 --- a/src/blenderbim/blenderbim/__init__.py +++ b/src/blenderbim/blenderbim/__init__.py @@ -24,6 +24,7 @@ import traceback import subprocess import webbrowser import addon_utils +from collections import deque bl_info = { "name": "BlenderBIM", @@ -38,6 +39,7 @@ bl_info = { } last_error = None +last_actions: deque = deque(maxlen=10) def get_debug_info(): @@ -60,10 +62,22 @@ def get_debug_info(): "processor": platform.processor(), "blender_version": bpy.app.version_string, "blenderbim_version": version, + "last_actions": last_actions, "last_error": last_error, } +def format_debug_info(info: dict): + last_actions = "" + for action in info["last_actions"]: + last_actions += f"\n# {action['type']}: {action['name']}" + if settings := action.get("settings"): + last_actions += f"\n>>> {settings}" + info["last_actions"] = last_actions + text = "\n".join(f"{k}: {v}" for k, v in info.items()) + return text.strip() + + if sys.modules.get("bpy", None): # Process *.pth in /libs/site/packages to setup globally importable modules # This is 3 levels deep as required by the static RPATH of ../../ from dependencies taken from Anaconda @@ -72,6 +86,18 @@ if sys.modules.get("bpy", None): try: import blenderbim.bim + import ifcopenshell.api + + def log_api(usecase_path, ifc_file, settings): + last_actions.append( + { + "type": "ifcopenshell.api", + "name": usecase_path, + "settings": ifcopenshell.api.serialise_settings(settings), + } + ) + + ifcopenshell.api.add_pre_listener("*", "action_logger", log_api) def register(): blenderbim.bim.register() @@ -83,7 +109,7 @@ if sys.modules.get("bpy", None): last_error = traceback.format_exc() print(last_error) - print(get_debug_info()) + print(format_debug_info(get_debug_info())) print("\nFATAL ERROR: Unable to load the BlenderBIM Add-on") class BIM_PT_fatal_error(bpy.types.Panel): @@ -122,21 +148,14 @@ if sys.modules.get("bpy", None): bl_description = "Copies debugging information to your clipboard for use in bugreports" def execute(self, context): - info = get_debug_info() - # Format it in a readable way - text = "\n".join(f"{k}: {v}" for k, v in info.items()) - print(text) + info = format_debug_info(get_debug_info()) if platform.system() == "Windows": - command = "echo | set /p nul=" + text.strip() + command = "echo | set /p nul=" + info elif platform.system() == "Darwin": # for MacOS - command = 'printf "' + text.strip().replace("\n", "\\n").replace('"', "") + '" | pbcopy' + command = 'printf "' + info.replace("\n", "\\n").replace('"', "") + '" | pbcopy' else: # Linux - command = ( - 'printf "' - + text.strip().replace("\n", "\\n").replace('"', "") - + '" | xclip -selection clipboard' - ) + command = 'printf "' + info.replace("\n", "\\n").replace('"', "") + '" | xclip -selection clipboard' subprocess.run(command, shell=True, check=True) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/ifc.py b/src/blenderbim/blenderbim/bim/ifc.py index 93014e6cac..60210e9700 100644 --- a/src/blenderbim/blenderbim/bim/ifc.py +++ b/src/blenderbim/blenderbim/bim/ifc.py @@ -22,9 +22,11 @@ import uuid import hashlib import zipfile import tempfile +import traceback import ifcopenshell import ifcopenshell.geom import ifcopenshell.ifcopenshell_wrapper +import blenderbim import blenderbim.bim.handler import blenderbim.tool as tool from pathlib import Path @@ -37,19 +39,19 @@ IFC_CONNECTED_TYPE = Union[bpy.types.Material, bpy.types.Object] class IfcStore: path: str = "" - file: ifcopenshell.file = None - schema: ifcopenshell.ifcopenshell_wrapper.schema_definition = None - cache: ifcopenshell.ifcopenshell_wrapper.HdfSerializer = None - cache_path: str = None + file: Optional[ifcopenshell.file] = None + schema: Optional[ifcopenshell.ifcopenshell_wrapper.schema_definition] = None + cache: Optional[ifcopenshell.ifcopenshell_wrapper.HdfSerializer] = None + cache_path: Optional[str] = None id_map: dict[int, IFC_CONNECTED_TYPE] = {} guid_map: dict[str, IFC_CONNECTED_TYPE] = {} edited_objs: Set[bpy.types.Object] = set() pset_template_path: str = "" - pset_template_file: ifcopenshell.file = None + pset_template_file: Optional[ifcopenshell.file] = None classification_path: str = "" - classification_file: ifcopenshell.file = None + classification_file: Optional[ifcopenshell.file] = None library_path: str = "" - library_file: ifcopenshell.file = None + library_file: Optional[ifcopenshell.file] = None current_transaction = "" last_transaction = "" history = [] @@ -329,6 +331,7 @@ class IfcStore: @staticmethod def execute_ifc_operator(operator: bpy.types.Operator, context: bpy.types.Context, is_invoke=False): + blenderbim.last_actions.append({"type": "operator", "name": operator.bl_idname}) bpy.context.scene.BIMProperties.is_dirty = True is_top_level_operator = not bool(IfcStore.current_transaction) @@ -343,10 +346,14 @@ class IfcStore: else: operator.transaction_key = IfcStore.current_transaction - if is_invoke: - result = getattr(operator, "_invoke")(context, None) - else: - result = getattr(operator, "_execute")(context) + try: + if is_invoke: + result = getattr(operator, "_invoke")(context, None) + else: + result = getattr(operator, "_execute")(context) + except: + blenderbim.last_error = traceback.format_exc() + raise if is_top_level_operator: if tool.Ifc.get(): diff --git a/src/blenderbim/blenderbim/bim/module/debug/operator.py b/src/blenderbim/blenderbim/bim/module/debug/operator.py index 7d6b4b8c94..412d08fd43 100644 --- a/src/blenderbim/blenderbim/bim/module/debug/operator.py +++ b/src/blenderbim/blenderbim/bim/module/debug/operator.py @@ -33,7 +33,7 @@ import blenderbim.tool as tool import blenderbim.core.debug as core import blenderbim.bim.handler import blenderbim.bim.import_ifc as import_ifc -from blenderbim import get_debug_info +from blenderbim import get_debug_info, format_debug_info from blenderbim.bim.ifc import IfcStore @@ -54,16 +54,18 @@ class CopyDebugInformation(bpy.types.Operator): } ) - # Format it in a readable way - text = "\n".join(f"{k}: {v}" for k, v in info.items()) + text = format_debug_info(info) + + print("-" * 80) print(text) + print("-" * 80) if platform.system() == "Windows": - command = "echo | set /p nul=" + text.strip() + command = "echo | set /p nul=" + text elif platform.system() == "Darwin": # for MacOS - command = 'printf "' + text.strip().replace("\n", "\\n").replace('"', "") + '" | pbcopy' + command = 'printf "' + text.replace("\n", "\\n").replace('"', "") + '" | pbcopy' else: # Linux - command = 'printf "' + text.strip().replace("\n", "\\n").replace('"', "") + '" | xclip -selection clipboard' + command = 'printf "' + text.replace("\n", "\\n").replace('"', "") + '" | xclip -selection clipboard' subprocess.run(command, shell=True, check=True) return {"FINISHED"} diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index b7670b2293..9c352f652d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -295,10 +295,11 @@ def serialise_settings(settings): vcs_settings[key] = {"cast_type": "ndarray", "value": value.tolist()} elif isinstance(value, list) and value and isinstance(value[0], ifcopenshell.entity_instance): vcs_settings[key] = [serialise_entity_instance(i) for i in value] - if "add_representation" in usecase_path: - return "" - elif "owner." in usecase_path: - return "" + else: + try: + vcs_settings[key] = str(value) + except: + vcs_settings[key] = "n/a" try: return json.dumps(vcs_settings) except: diff --git a/src/ifctester/ifctester/facet.py b/src/ifctester/ifctester/facet.py index 867e06b36c..e42cbc21f3 100644 --- a/src/ifctester/ifctester/facet.py +++ b/src/ifctester/ifctester/facet.py @@ -72,6 +72,8 @@ class Facet: def __init__(self, *parameters): self.status = None self.failures: list[FacetFailure] = [] + self.parameters = [] + self.applicability_templates = [] for i, name in enumerate(self.parameters): setattr(self, name.replace("@", ""), parameters[i]) @@ -101,8 +103,10 @@ class Facet: return self def filter( - self, ifc_file: ifcopenshell.file, elements: list[ifcopenshell.entity_instance] + self, ifc_file: ifcopenshell.file, elements: Optional[list[ifcopenshell.entity_instance]] ) -> list[ifcopenshell.entity_instance]: + if not elements: + return [] return [e for e in elements if self(e)] def to_string( @@ -133,6 +137,7 @@ class Facet: total_replacements += 1 if total_replacements == total_variables: return template + return "This facet cannot be interpreted" def to_ids_value(self, parameter: Union[str, Restriction, list]) -> dict[str, Any]: if isinstance(parameter, str): diff --git a/src/ifctester/ifctester/ids.py b/src/ifctester/ifctester/ids.py index ea5c6791f9..5b4e0dc3cd 100644 --- a/src/ifctester/ifctester/ids.py +++ b/src/ifctester/ifctester/ids.py @@ -75,8 +75,8 @@ class Ids: milestone=None, ): # Not part of the IDS spec, but very useful in practice - self.filepath = None - self.filename = None + self.filepath: Optional[str] = None + self.filename: Optional[str] = None self.specifications: List[Specification] = [] self.info = {} @@ -300,6 +300,7 @@ class Specification: return "optional" elif self.maxOccurs == 0: return "prohibited" + return "required" # Fallback def set_usage(self, usage: Cardinality) -> None: if usage == "optional": From 2789bc565a7c9ef3cf06a62c54021c1c23a0a978 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 9 May 2024 16:21:24 +1000 Subject: [PATCH 132/429] Write troubleshooting documentation --- src/blenderbim/blenderbim/__init__.py | 2 +- src/blenderbim/blenderbim/bim/ui.py | 12 +- src/blenderbim/docs/devs/installation.rst | 6 +- src/blenderbim/docs/index.rst | 1 + .../docs/users/images/error-message.png | Bin 0 -> 9425 bytes src/blenderbim/docs/users/installation.rst | 123 +++++------------- src/blenderbim/docs/users/troubleshooting.rst | 93 +++++++++++++ 7 files changed, 141 insertions(+), 96 deletions(-) create mode 100644 src/blenderbim/docs/users/images/error-message.png create mode 100644 src/blenderbim/docs/users/troubleshooting.rst diff --git a/src/blenderbim/blenderbim/__init__.py b/src/blenderbim/blenderbim/__init__.py index c5d6420273..e54b2d04ac 100644 --- a/src/blenderbim/blenderbim/__init__.py +++ b/src/blenderbim/blenderbim/__init__.py @@ -131,7 +131,7 @@ if sys.modules.get("bpy", None): box.label(text=f"Python {py} BBIM {info['blenderbim_version']}", icon="SCRIPTPLUGINS") layout.operator("bim.copy_debug_information", text="Copy Error Message To Clipboard") op = layout.operator("bim.open_uri", text="How Can I Fix This?") - op.uri = "https://docs.blenderbim.org/users/installation.html#faq" + op.uri = "https://docs.blenderbim.org/users/troubleshooting.html#installation-issues" class OpenUri(bpy.types.Operator): bl_idname = "bim.open_uri" diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 7654062959..2b55904929 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -29,8 +29,9 @@ from ifcopenshell.util.doc import ( get_attribute_doc, ) from . import ifc -import blenderbim.tool as tool +from blenderbim import get_debug_info import blenderbim.bim +import blenderbim.tool as tool from blenderbim.bim.helper import IfcHeaderExtractor from blenderbim.bim.prop import Attribute @@ -402,6 +403,15 @@ class BIM_PT_tabs(Panel): row = self.layout.row(align=True) row.prop(aprops, "tab", text="") + + if blenderbim.last_error: + box = self.layout.box() + box.label(text="BlenderBIM experienced an error :(", icon="ERROR") + box.label(text="View the console for full logs.", icon="CONSOLE") + box.operator("bim.copy_debug_information", text="Copy Error Message To Clipboard") + op = box.operator("bim.open_uri", text="How Can I Fix This?") + op.uri = "https://docs.blenderbim.org/users/troubleshooting.html" + except: pass # Prior to load_post, we may not have any area properties setup diff --git a/src/blenderbim/docs/devs/installation.rst b/src/blenderbim/docs/devs/installation.rst index 96ee05e206..bda42056bc 100644 --- a/src/blenderbim/docs/devs/installation.rst +++ b/src/blenderbim/docs/devs/installation.rst @@ -13,9 +13,9 @@ Unstable installation **Unstable installation** is almost the same as **Stable installation**, except that they are typically updated every day. Simply download a daily build from -the `Github releases page -`__, then follow the same -instructions as the **Stable installation**. +the `GitHub releases page +`__, then follow the +usual :doc:`installation instructions`. You will need to choose which build to download. diff --git a/src/blenderbim/docs/index.rst b/src/blenderbim/docs/index.rst index b8f21e5a6b..7d6b439721 100644 --- a/src/blenderbim/docs/index.rst +++ b/src/blenderbim/docs/index.rst @@ -32,6 +32,7 @@ Learn how to model a small building and create simple architectural plans, secti users/git_support users/other_addons users/general_usage + users/troubleshooting .. toctree:: :hidden: diff --git a/src/blenderbim/docs/users/images/error-message.png b/src/blenderbim/docs/users/images/error-message.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc1ce38f0573733a69111c949fa86c2336cf3ae GIT binary patch literal 9425 zcmZ{qbyyT%{O>^oq*J<)l3b)gQbf8WmSz!kS>Wk ze(!Ui-~Hp>KX#uv^UUm=GqZC(ulM_XqO>%W2ykg|(a_Kcl;6D4K|@350Ja04U;*Ei zM~_{A9nN+N3R-qnR%mFPNghdUs`8dp{ekunN@RXsBo=l|c<7hNenhvT{CB2u#e}A= zk##z@0^#>|PiP9#oE0AAD&-vHh{@$%S-CZ_ZJY%>=gePSm;95k^EW5`QVRQbes-GZ zq79QdCv}oVR~xzUMe7Q5A~;0(W+SU?G#trnRP_hj@$1T8z3Q3Etg5Pa!&6-|d{V`` zuayl;nCs0Zp8k1qX+Q6+b7kl~m53hZlA817q{@8kEP`ih}fhkk?GEUF$l)SHS$k-M`fsPun zLI1RY$5dBmvY>Qps5T$=kXxFWLsjkRh23=x0W&JBErhI^j@*dXR;=nmrI330hx{rU zlja3~W`tKsyc^dxTC3PD)?u_axo6EJ)o%#rFWhNXM)M`HUV4qS==}KV`E#E2l_-jG zxu=^Mf5d-ukMZ{O{gcVjhZW!f;6UGi-O$kRNdJA%CzbD|%1&!dB1#YGm3Q^_gv zbW_0RYAydj{=D@2aJ}jw=CZxga=DEC=lG&?rs9L`_IL5W_5K$ty7!8$9{U$gP%*lA zn{bhp$Al3`cnWeI+6;q<(eY9{)e-U`23ag?`zY|778}ngfW7MB)g3p_{VwKh*B4zn zD=V_K)KvLe-d$a7CLlR-{gQo>fb)eYer2(x8M4$n%<}o2jVlqjt7D)-`$8cQH{enw zkA~m)VtqT^EzSMu)*<&D$AB@?niie<5xh>Oz^ z8fXCB1DV5hKZ!W?Fh|glmZ)Wt#*1w{S@Z&a6tgP(=Hh_%=4{uh3FE`%A-(5<9fu1z z0$FPTCnM51Xx@xJrCYR&p#R+rbdW~?=uZ7cG7M zt@_h$HB9RphwV<5Mx4)@cY>v?!tn>?jRXIDST$ZlOijq}qEGE)SjB@hLs~Y!6vA!} zTmos+z&4rR-8jiMG^gc13t4mp)hv51f(J+}9+v+E7)Z>{$wiMS=QzS-%747j{8`zw zB5`|O9Vk3<9K+x7B=8E!*fVdNYpS#K$*B<>QffJ^@x$)qN4EHj+g;5-gv583slq^` zM-m=;Z;hbz1lp&z*cldo|8xe<&rNh=GdfbB>nk**6l>OOf`o3DuHB{H`B|ayPh#~g%APho*^55SsSMYXnK2(A26Qpn6Q;EagdEe}oA`v5e z4*dE$Gt&m^bLosB720{6u(an;mo+1eVu zpF6jgcUX_H)^8UJ+}W=E)H5@)re3CV0e=sW_T`mn#?|fj%E23^zPrW9U~Go> zsFx47r)i?7?IGPCSK7vj><1rs81}+w6F&A-%KWZD{&x0Q5ku#x;Z)h{eH2rE^ZmuB zVP_lcYYOTW2R@^8yVe4dNM?y$rGcM}tZAJFYr%DZ-nRT%is8)kYg#ArfZI*R#XRDG zqY%cqAWY6^YzFTxa*U8*c)Zwn>wXn&j^D}9(GikpQJh^Ug#IS}&@k(4A-6qEvcIV7*D~h7*Oorp z=bB$lRs#Myjo{(M(h3^#BuJe^HW;T#AsWl+W$a_Ta~+bjt!viCN=@558=8LC^+yHR zVQ|UrsTvumdA!wlthzf$C3Cl{c_3CUhi}4w#nrv`RjsuJ17{>gZt#_r2hu5Oljw5E zO;hYwUIoicyJ{_6T{T=32|`Z(p^xyP#XUxjN)X>9mS8+Q$waujp4UWI*Y?xcI0-Zhe4{k?bCom@8Wrn&s{v8LmsaOgulJU%+t8K1E*yhc z6Bi~+8JZ->+&8xfs0nhhrjAv$9ojpEvGsgB?tHkbF1gX0sB zzGe<=xsQV5RWT3Kj~uUj_#-^RRZeiq9#HAjEj^s*z{Xn3eZ%NbrZaEoiukGZ#n2^Q z0<1yn+-zA=aQ%1n!5I|B+c?+boKS*GkZ!j(RTdVq5%_m;RYkvRzq->|uGhfae|m`; zi=>?W{;#$Yy|rCrOHK7tLBhO#Zo%LQ95VKdkBak_Ib?ViiR+J^0@JkygsPW|szyzO zok)MvuJp5h@_L-;N==(3y@dOd7dGEB1|}lmhB;D2)}SuoXWOB-kHcH6-rTJKRqE4P zFEYdXc0-;;v*BE!(SCu=*`bP7)H(b7Dbugmk(h=IxOvOHGVch`wG|UR@)yp+(JHWa zLn%g54QCBieR}kgo)x^Ut!V)}2L73tkIrHVZX!Uk(!JGm;$BX=D-wqqV^E*9Ofm+9 zTDL-m&oGXK_Af#M@v-h>dhyID!6?_#IomKR;z9ZpyDH-`1mcYn%|QzG!_%M{3mv0) z${}EMVBIaQSxv-qnTr-A(&xVPJh`|}+PdUq(D&{A@04&s!yh;wH%0m>Xsr|ZxI60u zTH8_^!Ie&**#h-fhX_XY8OfcbuI&`=-Qt$G8vN6wYV}fQ8{rEdrJ~I~r45uwV;I6q zvtiMg_r`z!e&KY66vrX5$zKfmItK9)xt6|dMW#2v$~HZW#V;<4$%Wn&p>0sbU3l3BrdG{TO4HZ_~z$00RCaFQZ!62J5MoJV0Mcbvhb}tnw_G zr1CSk9l-=RwiM^&JRD;h-Er7We&1xq`Y3Vobw5%iJ#5ryf@O?IX>^IcAX*5GVE%)h z6y!r3X(`q6Hbd<-XHiztTpZFnc$bnG#J(rKY9(B{C8^E5kFVC&AR!POXMqkS!qeBL zv<2$4toET*IKPnBpkP_mzp?geF>il_mgIcB?j{<)JiAQ=~v)dTcGqc1sk zLnoRYjL&lbpE}m-rScp70oX$)EFnHTYlb?7vf1rs)5C#_En(2M~RV0t1+Hl zl17<1G#vjG)=rHjl83+xn>w**f4nflb>aonJckTVO$PDWl&&VhKcW)bElTNW*~xL( z$s#oC4XGbe8udEe!sPq+@hgXN1^_JsMR-liKni?hZQ@#Zfc z0+>P{@yacPK;+4X!nJ6k7+JjTvcy*fl;Mkjh+EV0- zW0YB$^Eo{U&Q(9CypL(J*RJ}RZRM!LcR(1-?vynfK9(R!A&7dcJ3=73WTDp1Npdj{ z?Y3{op36uSm?@yE$z$3I^^`PI1e1V$^4)B-%sl6<8*y2&(@1A<%9%mWmgIlF5Pv%P z?_aX59SvLDc;Kv;JZwhZEBGvT_A>Q#SN91i&;+VR}5#3jZ^}J~3oGdQG zyp%hIZezT4pXsiY{Mv){182ygqGQ{0%=A4?A ze~WUH)DXoUL&-QJEmVkQtlFQ<$}nC5vNn&)LAe<^_31=@f1m-9-W92IeoC=pu)A|9{2R8{V7ct z>iKk7eXmq4ZmGs+`{)mq4Kuj5IX)%JkGmvFZkq|Fv4&L<65EVM3h11eCT$8W7jbz~E{&xwyPq`x7VQ+04 ztn^#Jun`?zgH;}%@*xg=Lc2iK;8IWpi$^!h#t%$}lth-B5%YUe>H8}yZkcL=&8w_J z%vO(#Zw>9es!OF5m`^pcd0G!t+<)%&a;NM2po+^%mRNS}xj39sSWrc?3vKl*fMYB2qQk>+v3u`Ef(Rq50($<;{2xC>o4j({%5915-@6be{V5^Qbq7s^ z;ypa;r0`v;+jngFEod_o;&7uyOg{h(r)EI-l*<@F>)oIXlYok2VbvNgZ|d z2nu0Aw8QyHNt46wMsh0U#mCFq4qMB$^%59fE;J8QY*LD--Lv;J5GG47kvc}i! zNPRc?Ecu1P-0ztEgH5bpab%t>r5F}%)k0CR-*?6p`Cn_h+^OSi=_Zg{cTU2E+FC0# zwy**WKQFo)&Mymg1F&J`$7L)KVmbMji^4w*{PlSi5Zt9UxDsRw)Nd%(9YQb?&)@!?8oap#zTvyM6Edy4Apb0-saS`#N) z$C}_IwFyE1@C5=I4a|IsU!8|4K0>u|7HK`!>eOX;ms(Hzke{6^VEIu!wtW-e3lNLy zaL?BuEV>vHPt*6^8Nd0zoh5_0C{3WjNsila#uvYe&VC_2_9iOOPl^--PS3#mW!pRt zRNlTFd?R@P6z{aO2k_l!Ne8O!=Ch<%<3$83Nwixc2j!bZ+!Csj(xqn2rUiR$T8zO6 z`Qi>EKNIl==vWzN@T_^@a*hT{pM6T!ov)mqez{DSI`LWP@Jmv8uK*et+(0?@TC=#uLIIE&A;b?$K( znp?W5Cn!ByaB_2mr!Mxm8#Kh+7@Cg_(_v@--rj6&o9o}mMZZ^ff3t7gR^7Z2ory}I z5&rrX8_WmNqwM6wiPw&(5P?8q{EH{3x(dP;`5F=Kre+Tc{ZSj%+69Ni!SemSfPonS z7)n2%ysF!RtZ&q2*H`+U?^*kkUCQ_e!DwFC#2#E8E-x;8X&5tTz(p15X=hst!l|EC z%mAXEU{vOzor{iLyqpENoiuEZK&)h+&nnFL+mAjHWCNby4=e)iEr9DBOza?I>T(sb z+~S&p8##&bL-H-0eC(#}=E{71FmG!fHBs5d=4e`9MmO?+@TUHRwP_OTIdG}D4bpC{$c?ox|2u_h7%*%%{i zwuHTCW>A5CJVopc8WSx;@;v~fCY6c;Jvu!K?vcG8wQFH&5hpOTK^42ll&o9(*9NZX z{~oF0DobLs-9U0s>B%RG)lAXEO9Z~tTtU=qScsw4OUe$*Or~fliMgLUb1z6%sj9uE zX);ywYN)Zw4@?aT?u$;aQM-vYC&e?o&a?5)=hJMsMD$>zwH{@LfXKGgPp{u(*lZ0s*BzpmZ`}uJnhF z`o_inUmJB9dS4_JH%JjLHwtrdNTdX@1~26+L}Wc;e(jDV5Y3S6f0rR-m)s|rF;?Mh zh=FjAWE5bEs)HT??x>TTwZ0b?X}L_dI=S9V^k{UX2QecD7TJL4gf}+K0+pIlzGOBpyswGlSc1>oyF2#pKF$-Ax&LC=@7`w@m`7NdZQbr|o9T$j~ zzyU0KNC`YDbsF0O`*6^ZKBSl#JxxqE`rKR;|HK(O2>UYiTIU4bj~0V_GO2IaOc%2# zQvEPQc}dPqfTwdv>r9QOpJr0@8D#Z3q*2Gm^pup}SO5 zhG?~Vq1OFDtS(^QY=hqzltJbvtn`8iP3hK@lwr0yb30wpWaa*bA~r?{yBZ4*#XELQ zEXkb=p={k1$NC6%{+-P{AsCCMp9#9X`rG&sMdp&w>8`q0CJ}71M^`mS!n*y8Y`bfp z1aKmU$9lSiu7(+{HA>qVzxOS%-7G(+X1kzQ1%J|BUfIxZINC-#@a=$Aoqs#3Oq z7sZDAo66TR3mu+yND~^ZP-`bcI9CGWS}CsQ+OQ2w)xeEYKPEURy)I|)Rn|R>nc&7s zVX)PeQaefE*Ixvv)i8R}1c)w5QhyPh3_q87fpu&ulcb*_Tpfov`67fhCsz9Dk?(8X z@`r}zH`--YG_-?21+hzHbuRb*-gj5sk-|nNW44|)>17nRV`a2B(uvz_1LmZ&wVJlY zv_?ZM3p@PKqTNM*+u~S@nkW6cIWgsf)U#2{B zD9-kn(z#jHrrj!;;bqdm4?)K=(pBmMg|@rZ`uyRP8KNw?_j-%nhgBONiJVavN6)EZ zYmVCfmpR!7WB0oSDQ;Sa!BcX~w*4z-VBC}I(5X?}AFY;eDN#j_mcm@c=uR>2YsLRR zj>>-yN<3y*PXg%?6*}Xd{nvyONxJwj+II7yx@5)N6rLi$Lun5lRqfu8{1-{tcP+BD zCW;pb&cNXUV7=GB&XWuIU1(xp;;LxciPmjOO7(s{YZK{`O5{T0 z$Q*Y~Ot-oeK2B-m%2{wFz-$sw6aFS(`soauswPtwZ@M!uaI>fUnUV=bP;f><`mwkv zm0DHjy>DRv4G7XJ(Q_v80ZAtBAB z&*8335gWLwiqRO`D^X+|Sq;e010dOR{j=-#721A`(iNM`>kSX58`%J|f)|j% z3<{N0rH^xJ6Rpt*WwOt!0F6<((7S6JiXIJr29gAJ41G3}4_aRP3f2(Qs8hev&Cvp%LkM4(%u2Euii=xSW7wNg@@ZE!I7u$LAUE+0alHf=_MF<_B{dNES)%|@Zc z(pAr#N*3jGbFhQu?1eh^iKmH@U)@ieY`>_?+1p zYNU#xzo%%q!*?v9(}>~ZWU}CohN(%E6T=}y(sO&^1+T@w(k)>0O#|sAp#9%C7^jjE zQJ+$SCng$^5k#VVJsIM2>uI{>kE#@Y3kuk|bX?o$N(i*~FmSWaOZ(r<^>!=Dxki4a zF~Bx*iU%G4^ALR4Sw9&DDBg2+i2fuY>yg-Q?B1SM|2tcB&1=kV1`1ObyEvjbAW^RCR zguMu}peK-?KF!k?;~CKAAjk&ha+_C^d%H#r5VIKu(K)D4q?yo=lcYtHf7+^Sr~;AL zI?6>0sytl(08&e)eiP7r$q6E1-XctSE?{+LEXdvy12EkH{)%0##LhiYjn;#j8P4LP2C zCMov<;Gx(@pGT5_VMTvjNfue|LqDh`W?yv2QIzw6gn#vDYw!k}kMeRTEi?Vo;ik4Lkp@kjyQ5w^vQXMkP7OFKfSWh>(n75s>?<DDUHvbEXR` z(LE_v_QMOSUGd!y`Rg08) z_ah#R?yS7x%-QpJNUNLx$Caxl`=g&0zM3JJ)}(Opek%?Ui6RMWPR&exn=`@@_QeXd z_w`oslDEZ!QbRwjVhHOvvgMkaujE8`4|<|CU;CSG7Vk@Pl$Fj~L(Stlop_tWnPQBQ zaj~uC1C_G2k#F6fx3!~0+UR(_Y4U!?@D^KhcEW1&+gokM{RbYnhf;yiLK@!me&y$n zIVr98c3o4RG%&ycFw9eWfviOC|x9Muz#CE78kDV|{TFWe(8jnD-hG83+~kg))a$4Yh`(@6M1IZ&-?%Is98% zQu6VA0U{@5KqNBAYpbkDC;R+D!OoUB@!E?ks|2wQx3NT9k#~2weI1c2m XZFNAQRE~j_GHA+*8n3G4Ek6D)bmTzE literal 0 HcmV?d00001 diff --git a/src/blenderbim/docs/users/installation.rst b/src/blenderbim/docs/users/installation.rst index 95a6099913..bbcd8fe7c8 100644 --- a/src/blenderbim/docs/users/installation.rst +++ b/src/blenderbim/docs/users/installation.rst @@ -58,51 +58,6 @@ You can enable add-ons permanently by using ``Save User Settings`` from the Addo .. _where is the add-on installed: -Where is the add-on installed? ------------------------------- - -Upon installation, the BlenderBIM Add-on is stored in the -``scripts/addons/blenderbim/`` directory, within your Blender configuration -folder. However, the location of your Blender configuration folder depends on -how you have installed Blender. - -If you downloaded Blender as a ``.zip`` file without running an installer, you -will find the Blender configuration folder in the following directory, where -``X.XX`` is the Blender version: -:: - - /path/to/blender/X.XX/ - -Otherwise, if you installed Blender using an installation package, the Blender -configuration folder depends on which operating system you use. - -On Linux, if you are installing the add-on as a user: -:: - - ~/.config/blender/X.XX/ - -On Linux, if you are deploying the add-on system-wide (this may also depend on -your Linux distribution): -:: - - /usr/share/blender/X.XX/ - -On Mac, if you are installing the add-on as a user: -:: - - /Users/{YOUR_USER}/Library/Application Support/Blender/X.XX/ - -On Mac, if you are deploying the add-on system-wide: - -:: - - /Library/Application Support/Blender/X.XX/ - -On Windows: -:: - - C:\Users\{YOUR_USER}\AppData\Roaming\Blender Foundation\X.XX\ - Updating -------- @@ -129,66 +84,52 @@ installed>`. If you do not restart Blender, the add-on will fail to remove correctly, and you will need to uninstall manually. +Where is the add-on installed? +------------------------------ -FAQ ---- +Upon installation, the BlenderBIM Add-on is stored in the +``scripts/addons/blenderbim/`` directory, within your Blender configuration +folder. However, the location of your Blender configuration folder depends on +how you have installed Blender. -If you are unable to install the BlenderBIM Add-on, make sure you are using -**Blender 4.1** installed from https://blender.org/ and are installing the -latest version from https://blenderbim.org. +If you downloaded Blender as a ``.zip`` file without running an installer, the +BlenderBIM Add-on will be installed in the following directory, where ``X.XX`` +is the Blender version: -Other common solutions are listed below. If none of these fix the problem, you -can `report a bug `_ or -`live chat with a developer `_. +:: -1. **Some other error prevents me from installing or doing basic functions with - the add-on. Is it specific to my environment?** + /path/to/blender/X.XX/scripts/addons/blenderbim/ - Try installing and using the BlenderBIM Add-on on a "clean environment". A - clean environment is a fresh Blender installation with no other add-ons - enabled with factory settings. +Otherwise, if you installed Blender using an installation package, the Blender +configuration folder depends on which operating system you use. - To quickly test in a clean environment, find your Blender configuration - folder based on the `where is the add-on installed`_ section. Rename the - folder from ``X.XX`` to something else like ``X.XX_backup``, then restart - Blender and try follow the installation instructions again. +On Linux, if you are installing the add-on as a user: - If this fixes your issue, consider disabling other add-ons one by one until - you find a conflict as a next step to isolating the issue. +:: -2. **I get an error similar to "ImportError: IfcOpenShell not built for 'linux/64bit/python3.10'"** + ~/.config/blender/X.XX/scripts/addons/blenderbim/ - If you are using a Mac, be sure to use the Mac Silicon version if you have a - newer Mac. The only exception is if you have installed Blender using Steam - on a Mac, in which case you need to use the Mac Intel download. +On Linux, if you are deploying the add-on system-wide (this may also depend on +your Linux distribution): - For all other scenarios, check the BlenderBIM Add-on zip file which you - downloaded. The zip will have either ``py39``, ``py310``, or ``py311`` in - the name. See the instructions in the :ref:`devs/installation:unstable - installation` section to check that you have installed the correct version. +:: -3. **I am on Ubuntu and get an error similar to "ImportError: - /lib/x86_64-linux-gnu/libm.so.6: version GLIBC_2.29 not found"** + /usr/share/blender/X.XX/scripts/addons/blenderbim/ - Our latest package which uses IfcOpenShell v0.7.0 is built using Ubuntu 20 LTS. - If you have an older Ubuntu version, you can either upgrade to 19.10 or above, - or you'll need to compile IfcOpenShell yourself. +On Mac, if you are installing the add-on as a user: -4. **I get an error saying "ModuleNotFoundError: No module named 'numpy'"**" +:: - If you have installed Blender from another source instead of from - `Blender.org `__, such as from your - distro's package repositories, then you may be missing some modules like - ``numpy``. Try installing it manually like ``apt install python-numpy``. + /Users/{YOUR_USER}/Library/Application Support/Blender/X.XX/scripts/addons/blenderbim/ -5. **I get an error similar to RuntimeError: Instance #1234 not found** +On Mac, if you are deploying the add-on system-wide: - Blender saves and loads projects to a ``.blend`` file. However. the - BlenderBIM Add-on works with native IFC, and this means instead of saving - and loading ``.blend`` files, you should instead save and load the ``.ifc`` - project. +:: - If you have opened a ``.blend`` file, there is a risk that the contents of - the ``.blend`` session do not correlate to the contents of the ``.ifc``, - which can cause this error. Unless you are an advanced user, only save and - load ``.ifc`` files. + /Library/Application Support/Blender/X.XX/scripts/addons/blenderbim/ + +On Windows: + +:: + + C:\Users\{YOUR_USER}\AppData\Roaming\Blender Foundation\X.XX\scripts\addons\blenderbim\ diff --git a/src/blenderbim/docs/users/troubleshooting.rst b/src/blenderbim/docs/users/troubleshooting.rst new file mode 100644 index 0000000000..0115bc5d27 --- /dev/null +++ b/src/blenderbim/docs/users/troubleshooting.rst @@ -0,0 +1,93 @@ +Troubleshooting +=============== + +The BlenderBIM Add-on is alpha software. There are many bugs! When something +goes wrong, you may see some computer code flash up on your screen. You may +also see an error message: + +.. image:: images/error-message.png + +**Don't panic!** Click on the button that says **Copy Error Message To +Clipboard**. You will need to paste this text in a bug report. + +If you do not have a GitHub account, you will need to sign up to report a bug. +In addition to pasting the error message text, please also describe what you +were doing, and attach your IFC file or screenshots if relevant. + +.. container:: blockbutton + + `Report a bug `__ + +If your issue is particularly complex, you can also chat live with developers +or other powerusers. + +.. container:: blockbutton + + `Chat live with a developer `_ + +Installation issues +------------------- + +If you are unable to install the BlenderBIM Add-on, make sure you are using +**Blender 4.1** installed from https://blender.org/ and are installing the +latest version from https://blenderbim.org. + +Other common solutions are listed below. If none of these fix the problem, you +can `report a bug `_ or +`live chat with a developer `_. + +1. **Some other error prevents me from installing or doing basic functions with + the add-on. Is it specific to my environment?** + + Try installing and using the BlenderBIM Add-on on a "clean environment". A + clean environment is a fresh Blender installation with no other add-ons + enabled with factory settings. + + To quickly test in a clean environment, first :ref:`find your Blender + configuration folder`. + Rename the folder from ``X.XX`` to something else like ``X.XX_backup``, then + restart Blender and try follow the :doc:`installation + instructions` again. + + If this fixes your issue, consider disabling other add-ons one by one until + you find a conflict as a next step to isolating the issue. + +2. **I get an error similar to "ImportError: IfcOpenShell not built for 'linux/64bit/python3.10'"** + + If you are using a Mac, be sure to use the Mac Silicon version if you have a + newer Mac. The only exception is if you have installed Blender using Steam + on a Mac, in which case you need to use the Mac Intel download. + + For all other scenarios, check the BlenderBIM Add-on zip file which you + downloaded. The zip will have either ``py39``, ``py310``, or ``py311`` in + the name. See the instructions in the :ref:`devs/installation:unstable + installation` section to check that you have installed the correct version. + +3. **I am on Ubuntu and get an error similar to "ImportError: + /lib/x86_64-linux-gnu/libm.so.6: version GLIBC_2.29 not found"** + + Our latest package which uses IfcOpenShell v0.7.0 is built using Ubuntu 20 LTS. + If you have an older Ubuntu version, you can either upgrade to 19.10 or above, + or you'll need to compile IfcOpenShell yourself. + +4. **I get an error saying "ModuleNotFoundError: No module named 'numpy'"**" + + If you have installed Blender from another source instead of from + `Blender.org `__, such as from your + distro's package repositories, then you may be missing some modules like + ``numpy``. Try installing it manually like ``apt install python-numpy``. + +Common issues +------------- + +1. **I get an error similar to RuntimeError: Instance #1234 not found** + + Blender saves and loads projects to a ``.blend`` file. However. the + BlenderBIM Add-on works with native IFC, and this means instead of saving + and loading ``.blend`` files, you should instead save and load the ``.ifc`` + project. + + If you have opened a ``.blend`` file, there is a risk that the contents of + the ``.blend`` session do not correlate to the contents of the ``.ifc``, + which can cause this error. Unless you are an advanced user, only save and + load ``.ifc`` files. From 4c8f93d737020d5fd0fb93f54e6c2736828eabcc Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 9 May 2024 16:33:05 +1000 Subject: [PATCH 133/429] Add error catching to model loading and let users hide error dialog --- src/blenderbim/blenderbim/bim/__init__.py | 1 + .../blenderbim/bim/module/project/operator.py | 27 +++++++++++-------- src/blenderbim/blenderbim/bim/operator.py | 9 +++++++ src/blenderbim/blenderbim/bim/ui.py | 4 ++- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 20c39c6aa3..20979d5360 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -103,6 +103,7 @@ classes = [ operator.BIM_OT_select_object, operator.BIM_OT_show_description, operator.ClippingPlaneCutWithCappings, + operator.CloseError, operator.EditBlenderCollection, operator.FileAssociate, operator.FileUnassociate, diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 11b817c77f..ede1645996 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -21,6 +21,7 @@ import bpy import time import logging import tempfile +import traceback import subprocess import numpy as np import ifcopenshell @@ -674,19 +675,23 @@ class LoadProject(bpy.types.Operator, IFCFileSelector): return self.finish_loading_project(context) def finish_loading_project(self, context): - if not self.is_existing_ifc_file(): - return {"FINISHED"} + try: + if not self.is_existing_ifc_file(): + return {"FINISHED"} - if tool.Blender.is_default_scene(): - for obj in bpy.data.objects: - bpy.data.objects.remove(obj) + if tool.Blender.is_default_scene(): + for obj in bpy.data.objects: + bpy.data.objects.remove(obj) - context.scene.BIMProperties.ifc_file = self.get_filepath() - context.scene.BIMProjectProperties.is_loading = True - context.scene.BIMProjectProperties.total_elements = len(tool.Ifc.get().by_type("IfcElement")) - tool.Blender.register_toolbar() - if not self.is_advanced: - bpy.ops.bim.load_project_elements() + context.scene.BIMProperties.ifc_file = self.get_filepath() + context.scene.BIMProjectProperties.is_loading = True + context.scene.BIMProjectProperties.total_elements = len(tool.Ifc.get().by_type("IfcElement")) + tool.Blender.register_toolbar() + if not self.is_advanced: + bpy.ops.bim.load_project_elements() + except: + blenderbim.last_error = traceback.format_exc() + raise return {"FINISHED"} def invoke(self, context, event): diff --git a/src/blenderbim/blenderbim/bim/operator.py b/src/blenderbim/blenderbim/bim/operator.py index 55032392f7..85249ef19e 100644 --- a/src/blenderbim/blenderbim/bim/operator.py +++ b/src/blenderbim/blenderbim/bim/operator.py @@ -90,6 +90,15 @@ class OpenUri(bpy.types.Operator): return {"FINISHED"} +class CloseError(bpy.types.Operator): + bl_idname = "bim.close_error" + bl_label = "Close Error" + + def execute(self, context): + blenderbim.last_error = None + return {"FINISHED"} + + class SelectURIAttribute(bpy.types.Operator): bl_idname = "bim.select_uri_attribute" bl_label = "Select URI Attribute" diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 2b55904929..29c02d5f63 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -406,7 +406,9 @@ class BIM_PT_tabs(Panel): if blenderbim.last_error: box = self.layout.box() - box.label(text="BlenderBIM experienced an error :(", icon="ERROR") + row = box.row(align=True) + row.label(text="BlenderBIM experienced an error :(", icon="ERROR") + row.operator("bim.close_error", text="", icon="CANCEL") box.label(text="View the console for full logs.", icon="CONSOLE") box.operator("bim.copy_debug_information", text="Copy Error Message To Clipboard") op = box.operator("bim.open_uri", text="How Can I Fix This?") From 6e2edbf101d7a62a9bd428133f675c451599a6f9 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 9 May 2024 13:35:29 +0500 Subject: [PATCH 134/429] explicitly specify available imported symbols Fix LSP warnings like ""entity_instance" is not exported from module "ifcopenshell"PylancereportPrivateImportUsage" for `ifcopenshell.file`, `ifcopenshell.entity_instance` etc. After adding py.typed in 722201a1a it's now a typed library and all imported symbols in modules are considered private by default and should be added to `__all__` if they are supposed to be generally available from imported module. See https://github.com/microsoft/pyright/blob/main/docs/typed-libraries.md#library-interface --- src/ifcopenshell-python/ifcopenshell/__init__.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py index 739e99bbc6..ea695fed78 100644 --- a/src/ifcopenshell-python/ifcopenshell/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/__init__.py @@ -86,6 +86,18 @@ from .file import file from .entity_instance import entity_instance, register_schema_attributes from .sql import sqlite, sqlite_entity +# explicitly specify available imported symbols +# (it's a requirement for a typed library) +__all__ = [ + "ifcopenshell_wrapper", + "file", + "entity_instance", + "sqlite", + "sqlite_entity", + "stream", + "stream_entity", +] + try: from .stream import stream, stream_entity except: From 359dab573bfcbefbaad31848d0bc28ea30cd90b2 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 9 May 2024 13:44:54 +0500 Subject: [PATCH 135/429] document.remove_information to support ifc2x3 #4636 --- .../api/document/remove_information.py | 29 ++++++++++++------- .../api/document/test_remove_information.py | 4 +++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py index 86531252e9..6ee66dd386 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/remove_information.py @@ -22,7 +22,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_information(file, information=None) -> None: +def remove_information(file: ifcopenshell.file, information: ifcopenshell.entity_instance) -> None: """Removes a document information All references and associations are also removed. @@ -41,23 +41,32 @@ def remove_information(file, information=None) -> None: # ... and remove it! ifcopenshell.api.run("document.remove_information", model, information=document) """ - settings = {"information": information} - for reference in settings["information"].HasDocumentReferences or []: + if file.schema == "IFC2X3": + references = information.DocumentReferences or [] + else: + references = information.HasDocumentReferences + + for reference in references: ifcopenshell.api.run("document.remove_reference", file, reference=reference) - for rel in settings["information"].IsPointer or []: - for information in rel.RelatedDocuments: - ifcopenshell.api.run("document.remove_information", file, information=information) + for rel in information.IsPointer or []: + for info in rel.RelatedDocuments: + ifcopenshell.api.run("document.remove_information", file, information=info) - for rel in settings["information"].IsPointedTo or []: - if rel.RelatedDocuments == (settings["information"],): + for rel in information.IsPointedTo or []: + if rel.RelatedDocuments == (information,): # This relationship is non-rooted file.remove(rel) - for rel in settings["information"].DocumentInfoForObjects or []: + if file.schema == "IFC2X3": + rels = [r for r in file.by_type("IfcRelAssociatesDocument") if r.RelatingDocument == information] + else: + rels = information.DocumentInfoForObjects + + for rel in rels: history = rel.OwnerHistory file.remove(rel) if history: ifcopenshell.util.element.remove_deep2(file, history) - file.remove(settings["information"]) + file.remove(information) diff --git a/src/ifcopenshell-python/test/api/document/test_remove_information.py b/src/ifcopenshell-python/test/api/document/test_remove_information.py index ec2adaf9fb..f84d313fe9 100644 --- a/src/ifcopenshell-python/test/api/document/test_remove_information.py +++ b/src/ifcopenshell-python/test/api/document/test_remove_information.py @@ -60,3 +60,7 @@ class TestRemoveInformation(test.bootstrap.IFC4): assert len(self.file.by_type("IfcDocumentReference")) == 0 assert len(self.file.by_type("IfcRelAssociatesDocument")) == 0 assert len(self.file.by_type("IfcDocumentInformationRelationship")) == 0 + + +class TestRemoveInformationIFC2X3(test.bootstrap.IFC2X3, TestRemoveInformation): + pass From 2d35869c41e9e80ff356503b3768e88c590be8ad Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 9 May 2024 14:18:36 +0500 Subject: [PATCH 136/429] typing --- .../api/attribute/edit_attributes.py | 6 +++-- .../boundary/assign_connection_geometry.py | 27 ++++++++++--------- .../api/boundary/copy_boundary.py | 6 ++--- .../api/boundary/edit_attributes.py | 14 +++++----- .../api/boundary/remove_boundary.py | 2 +- .../api/classification/edit_classification.py | 8 ++++-- .../api/classification/edit_reference.py | 8 ++++-- .../classification/remove_classification.py | 2 +- .../ifcopenshell/api/constraint/add_metric.py | 4 +-- .../api/constraint/add_metric_reference.py | 8 +++--- .../api/constraint/add_objective.py | 2 +- .../api/constraint/edit_metric.py | 6 +++-- .../api/constraint/edit_objective.py | 8 ++++-- .../api/constraint/remove_constraint.py | 2 +- .../api/constraint/remove_metric.py | 3 ++- .../api/context/remove_context.py | 4 ++- .../api/control/assign_control.py | 7 ++++- .../api/control/unassign_control.py | 7 ++++- .../ifcopenshell/api/cost/add_cost_item.py | 15 ++++++++--- .../api/cost/add_cost_item_quantity.py | 4 ++- .../api/cost/add_cost_schedule.py | 3 ++- .../ifcopenshell/api/cost/add_cost_value.py | 3 ++- .../api/cost/assign_cost_item_quantity.py | 8 +++++- .../api/cost/assign_cost_value.py | 4 ++- .../calculate_cost_item_resource_value.py | 2 +- .../ifcopenshell/api/cost/copy_cost_item.py | 11 +++++--- .../api/cost/copy_cost_item_values.py | 4 ++- .../ifcopenshell/api/cost/edit_cost_item.py | 8 ++++-- .../api/cost/edit_cost_item_quantity.py | 8 ++++-- .../api/cost/edit_cost_schedule.py | 8 ++++-- .../ifcopenshell/api/cost/edit_cost_value.py | 7 +++-- .../api/cost/edit_cost_value_formula.py | 2 +- .../ifcopenshell/api/cost/remove_cost_item.py | 2 +- .../api/cost/remove_cost_item_quantity.py | 5 +++- .../api/cost/remove_cost_schedule.py | 2 +- .../api/cost/remove_cost_value.py | 5 +++- .../api/cost/unassign_cost_item_quantity.py | 4 ++- .../api/document/add_information.py | 5 +++- .../api/drawing/assign_product.py | 8 ++++-- .../api/drawing/edit_text_literal.py | 8 ++++-- .../api/drawing/unassign_product.py | 11 +++++--- .../ifcopenshell/api/owner/add_person.py | 2 +- .../api/owner/add_person_and_organisation.py | 2 +- .../api/owner/create_owner_history.py | 2 +- .../api/project/assign_declaration.py | 4 +-- .../ifcopenshell/api/pset/edit_pset.py | 2 +- .../api/unit/add_context_dependent_unit.py | 10 +++++-- .../api/unit/add_monetary_unit.py | 3 ++- .../api/unit/edit_derived_unit.py | 6 +++-- .../api/unit/edit_monetary_unit.py | 6 +++-- .../ifcopenshell/api/unit/edit_named_unit.py | 6 +++-- .../ifcopenshell/api/unit/remove_unit.py | 2 +- .../ifcopenshell/api/void/add_filling.py | 8 +++--- .../ifcopenshell/api/void/remove_filling.py | 2 +- .../ifcopenshell/api/void/remove_opening.py | 2 +- .../ifcopenshell/entity_instance.py | 6 ++--- .../ifcopenshell/util/placement.py | 6 ++--- 57 files changed, 221 insertions(+), 109 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py index 05dbff5a5c..650c2c57bd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py +++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/edit_attributes.py @@ -17,9 +17,11 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +import ifcopenshell.util.element +from typing import Any -def edit_attributes(file, product=None, attributes=None) -> None: +def edit_attributes(file: ifcopenshell.file, product: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edit the attributes of a product All IFC entities have attributes. Normally they can be edited directly, @@ -31,7 +33,7 @@ def edit_attributes(file, product=None, attributes=None) -> None: entity. :type product: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py index b184810642..90994d8499 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py @@ -17,17 +17,18 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.unit +from typing import Optional def assign_connection_geometry( - file, - rel_space_boundary=None, - outer_boundary=None, - inner_boundaries=None, - location=None, - axis=None, - ref_direction=None, - unit_scale=None, + file: ifcopenshell.file, + rel_space_boundary: ifcopenshell.entity_instance, + outer_boundary: list[tuple[float, float]], + location: tuple[float, float, float], + axis: tuple[float, float, float], + ref_direction: tuple[float, float, float], + inner_boundaries: Optional[list[list[tuple[float, float]]]] = None, + unit_scale: Optional[float] = None, ) -> None: """Create and assign a connection geometry to a space boundary relationship @@ -44,24 +45,24 @@ def assign_connection_geometry( polyline. The last point will connect to the first point. Each point is represented by an interable of 2 floats. The coordinates of the points are relative to the positional matrix arguments. - :type outer_boundary: list[list[float]] + :type outer_boundary: list[tuple[float, float]] :param inner_boundaries: A list of zero or more inner boundaries to use for the plane. Each boundary is represented by an open polyline, as defined by the outer_boundary argument. - :type inner_boundaries: list[list[list[float]]], optional + :type inner_boundaries: list[list[tuple[float, float]]], optional :param location: The local origin of the connection geometry, defined as an XYZ coordinate relative to the placement of the space that is being bounded. - :type location: list[float] + :type location: tuple[float, float, float] :param axis: The local X axis of the connection geometry, defined as an XYZ vector relative to the placement of the space that is being bounded. - :type axis: list[float] + :type axis: tuple[float, float, float] :param ref_direction: The local Z axis of the connection geometry, defined as an XYZ vector relative to the placement of the space that is being bounded. The Y vector is automatically derived using the right hand rule. - :type ref_direction: list[float] + :type ref_direction: tuple[float, float, float] :param unit_scale: The unit scale as calculated by ifcopenshell.util.unit.calculate_unit_scale. If not provided, it will be automatically calculated for you. diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py index b051bae828..791cc09bbb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/copy_boundary.py @@ -19,13 +19,13 @@ import ifcopenshell.util.element -def copy_boundary(file, boundary=None) -> None: +def copy_boundary(file: ifcopenshell.file, boundary: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: """Copies a space boundary :param boundary: The IfcRelSpaceBoundary you want to copy. :type boundary: ifcopenshell.entity_instance - :return: None - :rtype: None + :return: Duplicate of the IfcRelSpaceBoundary + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py index 663c656dbb..449d16c12a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/edit_attributes.py @@ -15,15 +15,17 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional def edit_attributes( - file, - entity=None, - relating_space=None, - related_building_element=None, - parent_boundary=None, - corresponding_boundary=None, + file: ifcopenshell.file, + entity: ifcopenshell.entity_instance, + relating_space: ifcopenshell.entity_instance, + related_building_element: ifcopenshell.entity_instance, + parent_boundary: Optional[ifcopenshell.entity_instance] = None, + corresponding_boundary: Optional[ifcopenshell.entity_instance] = None, ) -> None: """Modify the relationships of a space boundary relationship diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py index dadf44e3c7..6962a3121a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/remove_boundary.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_boundary(file, boundary=None) -> None: +def remove_boundary(file: ifcopenshell.file, boundary: ifcopenshell.entity_instance) -> None: """Removes a space boundary The relating space or related building element is untouched. Only the diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py index 7568a11d5e..f7577bdc4c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_classification.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_classification(file, classification=None, attributes=None) -> None: +def edit_classification( + file: ifcopenshell.file, classification: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcClassification For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_classification(file, classification=None, attributes=None) -> None: :param classification: The IfcClassification entity you want to edit :type classification: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py index dc5096f38c..d8052a333f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/edit_reference.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_reference(file, reference=None, attributes=None) -> None: +def edit_reference( + file: ifcopenshell.file, reference: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcClassificationReference For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_reference(file, reference=None, attributes=None) -> None: :param reference: The IfcClassificationReference entity you want to edit :type reference: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py index 21e02d7b86..38ae9408e6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_classification(file: ifcopenshell.entity_instance, classification: ifcopenshell.entity_instance) -> None: +def remove_classification(file: ifcopenshell.file, classification: ifcopenshell.entity_instance) -> None: """Removes an IfcClassification from the project and all references The classification and all of its relationships, children references, diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py index ab0870b528..70ca67a743 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric.py @@ -19,7 +19,7 @@ import ifcopenshell -def add_metric(file, objective=None) -> None: +def add_metric(file: ifcopenshell.file, objective: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: """Add a new metric benchmark Qualitative constraints may have a series of quantitative benchmarks @@ -50,7 +50,7 @@ def add_metric(file, objective=None) -> None: "Name": "Unnamed", "ConstraintGrade": "NOTDEFINED", "Benchmark": "EQUALTO", - } + }, ) if settings["objective"]: benchmark_values = list(settings["objective"].BenchmarkValues or []) diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric_reference.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric_reference.py index a3c37392e2..fdcdf50f6f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_metric_reference.py @@ -19,16 +19,18 @@ import ifcopenshell -def add_metric_reference(file, metric=None, reference_path=None) -> None: +def add_metric_reference( + file: ifcopenshell.file, metric: ifcopenshell.entity_instance, reference_path: str +) -> list[ifcopenshell.entity_instance]: """ Adds a chain of references to a metric. The reference path is a string of the form "attribute.attribute.attribute" Used to reference a value of an attribute of an instance through a metric objective entity. """ settings = {"metric": metric, "reference_path": reference_path} + references_created = [] if settings["reference_path"]: attributes = settings["reference_path"].split(".") - references_created = [] for i in range(len(attributes)): if i == 0: reference = file.create_entity("IfcReference") @@ -40,4 +42,4 @@ def add_metric_reference(file, metric=None, reference_path=None) -> None: reference.AttributeIdentifier = attributes[i] references_created[i - 1].InnerReference = reference references_created.append(reference) - return references_created + return references_created diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py index efce0bc080..2d8c0ab8db 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/add_objective.py @@ -19,7 +19,7 @@ import ifcopenshell -def add_objective(file) -> None: +def add_objective(file: ifcopenshell.file) -> ifcopenshell.entity_instance: """Add a new objective constraint Parametric constraints may be defined by the user. The constraint is defined diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py index b1ba5699ca..f90d1590d9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_metric.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_metric(file, metric=None, attributes=None) -> None: +def edit_metric(file: ifcopenshell.file, metric: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edit the attributes of a metric For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_metric(file, metric=None, attributes=None) -> None: :param metric: The IfcMetric you want to edit. :type metric: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py index 6ce5c597e8..0004261031 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/edit_objective.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_objective(file, objective=None, attributes=None) -> None: +def edit_objective( + file: ifcopenshell.file, objective: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edit the attributes of a objective For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_objective(file, objective=None, attributes=None) -> None: :param objective: The IfcObjective you want to edit. :type objective: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py index 30b61fb5c7..aea342e126 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_constraint.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_constraint(file, constraint=None) -> None: +def remove_constraint(file: ifcopenshell.file, constraint: ifcopenshell.entity_instance) -> None: """Remove a constraint (typically an objective) Removes a constraint definition and all of its associations to any diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py index 49203da3c5..2829a3355f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/remove_metric.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_metric(file, metric=None) -> None: +def remove_metric(file: ifcopenshell.file, metric: ifcopenshell.entity_instance) -> None: """Remove a metric benchmark Removes a metric benchmark and all of its associations to any products diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py index 94547b675e..e80cbddaf6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/remove_context.py @@ -17,9 +17,11 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.api +import ifcopenshell.util.element -def remove_context(file: ifcopenshell.entity_instance, context: ifcopenshell.entity_instance) -> None: +def remove_context(file: ifcopenshell.file, context: ifcopenshell.entity_instance) -> None: """Removes an IfcGeometricRepresentationContext Any representation geometry that is assigned to the context is also diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py b/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py index ed52f1be73..b9ca8ab9d0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py @@ -19,9 +19,14 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.guid +from typing import Union -def assign_control(file, relating_control=None, related_object=None) -> None: +def assign_control( + file: ifcopenshell.file, + relating_control: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> Union[ifcopenshell.entity_instance, None]: """Assigns a planning control or constraint to an object IFC can describe concepts that control other objects. For example, a diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py b/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py index 0463689c5f..f2d4cc8a9b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/unassign_control.py @@ -19,9 +19,14 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.util.element +from typing import Union -def unassign_control(file, relating_control=None, related_object=None) -> None: +def unassign_control( + file: ifcopenshell.file, + relating_control: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> Union[ifcopenshell.entity_instance, None]: """Unassigns a planning control or constraint to an object :param relating_control: The IfcControl entity that is creating the diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py index 461279942a..a33c17c890 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item.py @@ -18,22 +18,29 @@ import ifcopenshell.api import ifcopenshell.guid +from typing import Optional -def add_cost_item(file, cost_schedule=None, cost_item=None) -> None: +def add_cost_item( + file: ifcopenshell.file, + cost_schedule: Optional[ifcopenshell.entity_instance] = None, + cost_item: Optional[ifcopenshell.entity_instance] = None, +) -> ifcopenshell.entity_instance: """Add a new cost item A cost item represents a single line item in a cost schedule. Cost items may then be broken down into cost subitems. + Either `cost_schedule` or `cost_item` must be provided. + :param cost_schedule: If the cost item is to be added as a root or top level cost item to a cost schedule, the IfcCostSchedule may be specified. This is mutually exlclusive to the cost_item parameter. - :type cost_schedule: ifcopenshell.entity_instance + :type cost_schedule: ifcopenshell.entity_instance, optional. :param cost_item: If the cost item is to be added as a subitem to an existing cost item, the parent IfcCostItem may be specified. This is mutually exclusive to the cost_schedule parameter. - :type cost_item: ifcopenshell.entity_instance + :type cost_item: ifcopenshell.entity_instance, optional :return: The newly created IfcCostItem :rtype: ifcopenshell.entity_instance @@ -62,7 +69,7 @@ def add_cost_item(file, cost_schedule=None, cost_item=None) -> None: "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), "RelatedObjects": [cost_item], "RelatingControl": settings["cost_schedule"], - } + }, ) elif settings["cost_item"]: ifcopenshell.api.run( diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py index 47a9b3efb9..61ba86f6b2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py @@ -19,7 +19,9 @@ import ifcopenshell.api -def add_cost_item_quantity(file, cost_item=None, ifc_class="IfcQuantityCount") -> None: +def add_cost_item_quantity( + file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance, ifc_class: str = "IfcQuantityCount" +) -> ifcopenshell.entity_instance: """Adds a new quantity associated with a cost item Cost items calculate their subtotal by multiplying the sum of the cost diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py index d72566ae1f..95c638182a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py @@ -19,9 +19,10 @@ import ifcopenshell.api import ifcopenshell.util.date from datetime import datetime +from typing import Optional -def add_cost_schedule(file, name=None, predefined_type="NOTDEFINED") -> None: +def add_cost_schedule(file: ifcopenshell.file, name: Optional[str] = None, predefined_type="NOTDEFINED") -> None: """Add a new cost schedule A cost schedule is a group of cost items which typically represent a diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py index b6fe5f5698..6c59af0bb6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_value.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_cost_value(file, parent=None) -> None: +def add_cost_value(file: ifcopenshell.file, parent: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: """Adds a new value or subvalue to a cost item A cost item's subtotal can be specified in two ways. diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py index 6c13162ed7..bf5b412a21 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py @@ -17,9 +17,15 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +from typing import Optional -def assign_cost_item_quantity(file, cost_item=None, products=None, prop_name="") -> None: +def assign_cost_item_quantity( + file: ifcopenshell.file, + cost_item: ifcopenshell.entity_instance, + products: list[ifcopenshell.entity_instance], + prop_name: Optional[str] = "", +) -> None: """Adds a cost item quantity that is parametrically connected to a product A cost item may have its subtotal calculated by multiplying a unit value diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py index 18bb05694f..dda9d509eb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_value.py @@ -19,7 +19,9 @@ import ifcopenshell.api -def assign_cost_value(file, cost_item=None, cost_rate=None) -> None: +def assign_cost_value( + file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance, cost_rate: ifcopenshell.entity_instance +) -> None: """Assigns a cost value to a cost item from a schedule of rates Instead of assigning cost values from scratch for each cost item in a diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py index c977be1b19..897a2d7412 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/calculate_cost_item_resource_value.py @@ -21,7 +21,7 @@ import ifcopenshell.util.date import ifcopenshell.util.resource -def calculate_cost_item_resource_value(file, cost_item=None) -> None: +def calculate_cost_item_resource_value(file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance) -> None: """Calculates the total cost of all resources associated with a cost item A cost item may have construction resources (e.g. equipment, material, diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py index 13927088ed..7b08df16a5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item.py @@ -19,9 +19,14 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.util.element +from typing import Union -def copy_cost_item(file, cost_item=None) -> None: +def copy_cost_item( + file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance +) -> Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]]: + # TODO: currently it never returns list of duplicated cost items + # though it is stated in the docs """Copies all cost items and related relationships The following relationships are also duplicated: @@ -33,7 +38,7 @@ def copy_cost_item(file, cost_item=None) -> None: :param cost_item: The cost item to be duplicated :type cost_item: ifcopenshell.entity_instance :return: The duplicated cost item or the list of duplicated cost items if the latter has children - :rtype: ifcopenshell.entity_instance or list of ifcopenshell.entity_instance + :rtype: ifcopenshell.entity_instance or list[ifcopenshell.entity_instance] Example: .. code:: python @@ -55,7 +60,7 @@ def copy_cost_item(file, cost_item=None) -> None: class Usecase: def execute(self): self.new_cost_items = [] - self.duplicate_cost_item(self.settings["cost_item"]) + return self.duplicate_cost_item(self.settings["cost_item"]) def duplicate_cost_item(self, cost_item): new_cost_item = ifcopenshell.util.element.copy_deep(self.file, cost_item) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py index 8ccb0a4158..6fadb9a349 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/copy_cost_item_values.py @@ -20,7 +20,9 @@ import ifcopenshell.util.element import ifcopenshell.api -def copy_cost_item_values(file, source=None, destination=None) -> None: +def copy_cost_item_values( + file: ifcopenshell.file, source: ifcopenshell.entity_instance, destination: ifcopenshell.entity_instance +) -> None: """Copies all cost values from one cost item to another Any previously existing values will be removed. The entire value is diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py index 2bf72a5d57..4d168173b6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_cost_item(file, cost_item=None, attributes=None) -> None: +def edit_cost_item( + file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcCostItem For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_cost_item(file, cost_item=None, attributes=None) -> None: :param cost_item: The IfcCostItem entity you want to edit :type cost_item: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py index 178816a593..9d1c7a554c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_item_quantity.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_cost_item_quantity(file, physical_quantity=None, attributes=None) -> None: +def edit_cost_item_quantity( + file: ifcopenshell.file, physical_quantity: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcPhysicalQuantity For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_cost_item_quantity(file, physical_quantity=None, attributes=None) -> No :param physical_quantity: The IfcPhysicalQuantity entity you want to edit :type physical_quantity: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py index 3e47f3a430..f7392951f6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_schedule.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_cost_schedule(file, cost_schedule=None, attributes=None) -> None: +def edit_cost_schedule( + file: ifcopenshell.file, cost_schedule: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcCostSchedule For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_cost_schedule(file, cost_schedule=None, attributes=None) -> None: :param cost_schedule: The IfcCostSchedule entity you want to edit :type cost_schedule: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py index 430b4272aa..a0e74b85af 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value.py @@ -19,9 +19,12 @@ import ifcopenshell import ifcopenshell.util.unit import ifcopenshell.util.element +from typing import Any -def edit_cost_value(file, cost_value=None, attributes=None) -> None: +def edit_cost_value( + file: ifcopenshell.file, cost_value: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcCostValue For more information about the attributes and data types of an @@ -30,7 +33,7 @@ def edit_cost_value(file, cost_value=None, attributes=None) -> None: :param cost_value: The IfcCostValue entity you want to edit :type cost_value: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py index eac443ba40..a9af7572b6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py @@ -22,7 +22,7 @@ import ifcopenshell.util.unit import ifcopenshell.util.element -def edit_cost_value_formula(file, cost_value=None, formula=None) -> None: +def edit_cost_value_formula(file: ifcopenshell.file, cost_value: ifcopenshell.entity_instance, formula: str) -> None: """Sets a cost value based on a formula, similar to formulas in spreadsheets Costs may be made up of many components (e.g. labour, material, waste diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py index e52fd655cb..119b22d135 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_cost_item(file, cost_item=None) -> None: +def remove_cost_item(file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance) -> None: """Removes a cost item All associated relationships with the cost item are also removed, diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py index eed3a7adb3..cc7b8c32cb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_item_quantity.py @@ -15,9 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_cost_item_quantity(file, cost_item=None, physical_quantity=None) -> None: +def remove_cost_item_quantity( + file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance, physical_quantity: ifcopenshell.entity_instance +) -> None: """Removes a quantity assigned to a cost item If the quantity is part of a product (e.g. wall), then the quantity will diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py index 7b73859bb0..01a9c0e0ad 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_schedule.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_cost_schedule(file, cost_schedule=None) -> None: +def remove_cost_schedule(file: ifcopenshell.file, cost_schedule: ifcopenshell.entity_instance) -> None: """Removes a cost schedule All associated relationships with the cost schedule are also removed, diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py index 757877bf9d..10f4054e93 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/remove_cost_value.py @@ -15,9 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_cost_value(file, parent=None, cost_value=None) -> None: +def remove_cost_value( + file: ifcopenshell.file, parent: ifcopenshell.entity_instance, cost_value: ifcopenshell.entity_instance +) -> None: """Removes a cost value The cost value may be assigned either to a cost item, a construction diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py index c7c5fc69fd..a11947c6d8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/unassign_cost_item_quantity.py @@ -19,7 +19,9 @@ import ifcopenshell.api -def unassign_cost_item_quantity(file, cost_item=None, products=None) -> None: +def unassign_cost_item_quantity( + file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance, products: list[ifcopenshell.entity_instance] +) -> None: """Removes quantities of a cost item that are calculated on products A cost item may have quantities that are parametrically calculated on diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py index 7754f8cef5..86db04421c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py @@ -18,9 +18,12 @@ import ifcopenshell import ifcopenshell.guid +from typing import Optional -def add_information(file, parent=None) -> None: +def add_information( + file: ifcopenshell.file, parent: Optional[ifcopenshell.entity_instance] = None +) -> ifcopenshell.entity_instance: """Adds a new document information to the project An IFC document information is a document associated with the project. diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py index c0758c8145..e620724727 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/assign_product.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.guid -def assign_product(file, relating_product=None, related_object=None) -> None: +def assign_product( + file: ifcopenshell.file, + relating_product: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> ifcopenshell.entity_instance: """Associates a product and an object, typically for annotation Warning: this is an experimental API. @@ -104,7 +108,7 @@ def assign_product(file, relating_product=None, related_object=None) -> None: "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), "RelatedObjects": [settings["related_object"]], "RelatingProduct": settings["relating_product"], - } + }, ) if is_grid_axis: diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py index f1aadc25b0..73ba58a776 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/edit_text_literal.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_text_literal(file, text_literal=None, attributes=None) -> None: +def edit_text_literal( + file: ifcopenshell.file, text_literal: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcTextLiteral For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_text_literal(file, text_literal=None, attributes=None) -> None: :param reference: The IfcTextLiteral entity you want to edit :type reference: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py index 8254bffdce..b0f6ad1085 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/unassign_product.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.util.element -def unassign_product(file, relating_product=None, related_object=None) -> None: +def unassign_product( + file: ifcopenshell.file, + relating_product: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> None: """Unassigns a product and an object (typically an annotation) Smart annotation objects can be associated with products so that they @@ -34,8 +38,8 @@ def unassign_product(file, relating_product=None, related_object=None) -> None: :param related_object: The object (typically IfcAnnotation) that the product is related to :type related_object: ifcopenshell.entity_instance - :return: The created IfcRelAssignsToProduct relationship - :rtype: ifcopenshell.entity_instance + :return: None + :rtype: None Example: @@ -68,4 +72,3 @@ def unassign_product(file, relating_product=None, related_object=None) -> None: related_objects.remove(settings["related_object"]) rel.RelatedObjects = related_objects ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) - return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py index 5d571920d4..7abdfb1598 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py @@ -19,7 +19,7 @@ import ifcopenshell def add_person( - file: ifcopenshell.entity_instance, + file: ifcopenshell.file, identification: str = "HSeldon", family_name: str = "Seldon", given_name: str = "Hari", diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py index 7f07c1991c..cf2bdb6507 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person_and_organisation.py @@ -19,7 +19,7 @@ import ifcopenshell def add_person_and_organisation( - file: ifcopenshell.entity_instance, + file: ifcopenshell.file, person: ifcopenshell.entity_instance, organisation: ifcopenshell.entity_instance, ) -> ifcopenshell.entity_instance: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py index 2b4729897f..fbb35dbc45 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/create_owner_history.py @@ -22,7 +22,7 @@ import ifcopenshell.api.owner.settings from typing import Union -def create_owner_history(file: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: +def create_owner_history(file: ifcopenshell.file) -> Union[ifcopenshell.entity_instance, None]: """Creates a new owner history indicating an element was added Any object in IFC with a unique ID and name (such as physical products, diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py index 322e8a18ad..bffef52943 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py @@ -24,7 +24,7 @@ from typing import Union def assign_declaration( - file: ifcopenshell.entity_instance, + file: ifcopenshell.file, definitions: list[ifcopenshell.entity_instance], relating_context: ifcopenshell.entity_instance, ) -> Union[ifcopenshell.entity_instance, None]: @@ -142,6 +142,6 @@ def assign_declaration( "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), "RelatedDefinitions": list(objects_to_change), "RelatingContext": relating_context, - } + }, ) return declares diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py index 01d5d9b2ea..288adebab5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py @@ -22,7 +22,7 @@ from typing import Optional, Any, Union def edit_pset( - file: ifcopenshell.entity_instance, + file: ifcopenshell.file, pset: ifcopenshell.entity_instance, name: Optional[str] = None, properties: Optional[dict[str, Any]] = None, diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py index 5de43a505a..ee37c32f53 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_context_dependent_unit.py @@ -15,9 +15,15 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_context_dependent_unit(file, unit_type="USERDEFINED", name="THINGAMAJIG", dimensions=None) -> None: +def add_context_dependent_unit( + file: ifcopenshell.file, + unit_type: str = "USERDEFINED", + name: str = "THINGAMAJIG", + dimensions: tuple[int, int, int, int, int, int, int] = (0, 0, 0, 0, 0, 0, 0), +) -> ifcopenshell.entity_instance: """Add a new arbitrary unit that can only be interpreted in a project specific context Occasionally the construction industry uses arbitrary units to quantify @@ -51,7 +57,7 @@ def add_context_dependent_unit(file, unit_type="USERDEFINED", name="THINGAMAJIG" # Boxes of things ifcopenshell.api.run("unit.add_context_dependent_unit", model, name="BOXES") """ - settings = {"unit_type": unit_type, "name": name, "dimensions": dimensions or (0, 0, 0, 0, 0, 0, 0)} + settings = {"unit_type": unit_type, "name": name, "dimensions": dimensions} return file.create_entity( "IfcContextDependentUnit", diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py index 7e345b9a7c..4cf9ca6730 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/add_monetary_unit.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_monetary_unit(file, currency="DOLLARYDOO") -> None: +def add_monetary_unit(file: ifcopenshell.file, currency: str = "DOLLARYDOO") -> ifcopenshell.entity_instance: """Add a new currency Currency units are useful in cost plans to know in what currency the diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py index ed56b80461..a8b3316dbd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_derived_unit.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_derived_unit(file, unit=None, attributes=None) -> None: +def edit_derived_unit(file: ifcopenshell.file, unit: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcDerivedUnit For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_derived_unit(file, unit=None, attributes=None) -> None: :param unit: The IfcDerivedUnit entity you want to edit :type unit: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py index b4f14f328a..888bbde510 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_monetary_unit.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_monetary_unit(file, unit=None, attributes=None) -> None: +def edit_monetary_unit(file: ifcopenshell.file, unit: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcMonetaryUnit For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_monetary_unit(file, unit=None, attributes=None) -> None: :param unit: The IfcMonetaryUnit entity you want to edit :type unit: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py index be0384aabb..72cd618839 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/edit_named_unit.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_named_unit(file, unit=None, attributes=None) -> None: +def edit_named_unit(file: ifcopenshell.file, unit: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcNamedUnit Named units include SI units, conversion based units (imperial units), @@ -29,7 +31,7 @@ def edit_named_unit(file, unit=None, attributes=None) -> None: :param unit: The IfcNamedUnit entity you want to edit :type unit: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py b/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py index ae2cd192cb..eb572aa59c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/remove_unit.py @@ -20,7 +20,7 @@ import ifcopenshell.util.unit import ifcopenshell.util.element -def remove_unit(file, unit=None) -> None: +def remove_unit(file: ifcopenshell.file, unit: ifcopenshell.entity_instance) -> None: """Remove a unit Be very careful when a unit is removed, as it may mean that previously diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py b/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py index 9e8d09744d..bdc0422955 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/add_filling.py @@ -21,7 +21,9 @@ import ifcopenshell.guid import ifcopenshell.util.element -def add_filling(file, opening=None, element=None) -> None: +def add_filling( + file: ifcopenshell.file, opening: ifcopenshell.entity_instance, element: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: """Fill an opening with an element Physical elements may have openings in them. For example, a wall might @@ -106,13 +108,13 @@ def add_filling(file, opening=None, element=None) -> None: if fills_voids: if fills_voids[0].RelatingOpeningElement == settings["opening"]: - return + return fills_voids[0] history = fills_voids[0].OwnerHistory file.remove(fills_voids[0]) if history: ifcopenshell.util.element.remove_deep2(file, history) - file.create_entity( + return file.create_entity( "IfcRelFillsElement", GlobalId=ifcopenshell.guid.new(), RelatingOpeningElement=settings["opening"], diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py b/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py index b4c3188672..3cfdd05ce3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/remove_filling.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_filling(file, element=None) -> None: +def remove_filling(file: ifcopenshell.file, element: ifcopenshell.entity_instance) -> None: """Remove a filling relationship If an element is filling an opening, this removes the relationship such diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py index 58b7782333..7217fc627d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/remove_opening.py @@ -20,7 +20,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_opening(file: ifcopenshell.entity_instance, opening: ifcopenshell.entity_instance) -> None: +def remove_opening(file: ifcopenshell.file, opening: ifcopenshell.entity_instance) -> None: """Remove an opening Fillings are retained as orphans. Voided elements remain. Openings diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index 05ad3fd984..499c1a260e 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -281,11 +281,11 @@ class entity_instance: return entity_instance.walk(is_instance, unwrap, v) - def attribute_type(self, attr: int) -> str: + def attribute_type(self, attr: Union[int, str]) -> str: """Return the data type of a positional attribute of the element - :param attr: The index of the attribute - :type attr: int + :param attr: The index or name of the attribute + :type attr: Union[int, str] :rtype: string """ attr_idx = attr if isinstance(attr, numbers.Integral) else self.wrapped_data.get_argument_index(attr) diff --git a/src/ifcopenshell-python/ifcopenshell/util/placement.py b/src/ifcopenshell-python/ifcopenshell/util/placement.py index 75a1de6265..f8b52b274c 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/placement.py +++ b/src/ifcopenshell-python/ifcopenshell/util/placement.py @@ -19,7 +19,7 @@ import numpy as np import numpy.typing as npt import ifcopenshell -from typing import Literal, Iterable +from typing import Literal, Iterable, Optional MatrixType = npt.NDArray[np.float64] @@ -97,7 +97,7 @@ def get_axis2placement(placement: ifcopenshell.entity_instance) -> MatrixType: return a2p(o, z, x) -def get_local_placement(placement: ifcopenshell.entity_instance) -> MatrixType: +def get_local_placement(placement: Optional[ifcopenshell.entity_instance] = None) -> MatrixType: """Parse a local placement into a 4x4 transformation matrix This is typically used to find the location and rotation of an element. The @@ -118,7 +118,7 @@ def get_local_placement(placement: ifcopenshell.entity_instance) -> MatrixType: matrix = ifcopenshell.util.placement.get_local_placement(placement) :param placement: The IfcLocalPlacement entity - :type placement: ifcopenshell.entity_instance + :type placement: ifcopenshell.entity_instance, optional :return: A 4x4 numpy matrix :rtype: MatrixType """ From 8ffb77551ffe337271d7ce95ffef44c4006725ff Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 9 May 2024 14:59:23 +0500 Subject: [PATCH 137/429] more tests for ifc2x3 --- .../classification/remove_classification.py | 23 +++++++++++-------- .../api/cost/add_cost_schedule.py | 14 ++++++++++- .../test/api/aggregate/test_assign_object.py | 4 ++++ .../api/aggregate/test_unassign_object.py | 4 ++++ .../test/api/boundary/test_copy_boundary.py | 4 ++++ .../test/api/boundary/test_remove_boundary.py | 4 ++++ .../classification/test_add_classification.py | 4 ++++ .../test_remove_classification.py | 9 ++++++-- .../test/api/context/test_add_context.py | 4 ++++ .../test/api/context/test_edit_context.py | 4 ++++ .../test/api/context/test_remove_context.py | 14 +++++++---- .../test/api/control/test_assign_control.py | 4 ++++ .../test/api/control/test_unassign_control.py | 4 ++++ .../test/api/cost/test_add_cost_item.py | 7 +++++- .../test/api/cost/test_add_cost_schedule.py | 4 ++++ .../test/api/cost/test_remove_cost_item.py | 4 ++++ .../api/cost/test_remove_cost_schedule.py | 4 ++++ .../test/api/document/test_add_information.py | 9 ++++++-- .../test/api/drawing/test_assign_product.py | 4 ++++ .../api/drawing/test_edit_text_literal.py | 4 ++++ .../test/api/drawing/test_unassign_product.py | 4 ++++ .../api/type/test_map_type_representation.py | 4 ++++ .../unit/test_add_context_dependent_unit.py | 4 ++++ .../unit/test_add_conversion_based_unit.py | 4 +++- .../test/api/unit/test_add_monetary_unit.py | 4 ++++ .../test/api/unit/test_add_si_unit.py | 4 ++++ .../test/api/unit/test_assign_unit.py | 12 ++++++---- .../test/api/unit/test_edit_derived_unit.py | 4 ++++ .../test/api/unit/test_edit_monetary_unit.py | 8 +++++-- .../test/api/unit/test_edit_named_unit.py | 4 +++- .../test/api/unit/test_remove_unit.py | 4 ++++ .../test/api/unit/test_unassign_unit.py | 12 ++++++---- .../test/api/void/test_add_filling.py | 4 ++++ .../test/api/void/test_add_opening.py | 4 ++++ .../test/api/void/test_remove_opening.py | 4 ++++ 35 files changed, 181 insertions(+), 31 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py index 38ae9408e6..0029ac94a0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/remove_classification.py @@ -58,15 +58,20 @@ class Usecase: self.file.remove(rel) if history: ifcopenshell.util.element.remove_deep2(self.file, history) - for rel in self.file.by_type("IfcExternalReferenceRelationship"): - if not rel.RelatingReference: - self.file.remove(rel) - def get_references(self, classification): + if self.file.schema != "IFC2X3": + for rel in self.file.by_type("IfcExternalReferenceRelationship"): + if not rel.RelatingReference: + self.file.remove(rel) + + def get_references(self, classification: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: results = [] - if not classification.HasReferences: - return results - for reference in classification.HasReferences: - results.append(reference) - results.extend(self.get_references(reference)) + if self.file.schema == "IFC2X3": + for reference in self.file.by_type("IfcClassificationReference"): + if reference.ReferencedSource == classification: + results.append(reference) + else: + for reference in classification.HasReferences: + results.append(reference) + results.extend(self.get_references(reference)) return results diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py index 95c638182a..65c95ca0d1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py @@ -62,5 +62,17 @@ def add_cost_schedule(file: ifcopenshell.file, name: Optional[str] = None, prede predefined_type=settings["predefined_type"], name=settings["name"], ) - cost_schedule.UpdateDate = ifcopenshell.util.date.datetime2ifc(datetime.now(), "IfcDateTime") + if file.schema == "IFC2X3": + cost_schedule.UpdateDate = createIfcDateAndTime(file, datetime.now()) + else: + cost_schedule.UpdateDate = ifcopenshell.util.date.datetime2ifc(datetime.now(), "IfcDateTime") return cost_schedule + + +def createIfcDateAndTime(file: ifcopenshell.file, dt: datetime): + ifc_dt = file.create_entity("IfcDateAndTime") + ifc_dt.DateComponent = file.create_entity( + "IfcCalendarDate", **ifcopenshell.util.date.datetime2ifc(dt, "IfcCalendarDate") + ) + ifc_dt.TimeComponent = file.create_entity("IfcLocalTime", **ifcopenshell.util.date.datetime2ifc(dt, "IfcLocalTime")) + return ifc_dt diff --git a/src/ifcopenshell-python/test/api/aggregate/test_assign_object.py b/src/ifcopenshell-python/test/api/aggregate/test_assign_object.py index c43733f426..e1036e16e3 100644 --- a/src/ifcopenshell-python/test/api/aggregate/test_assign_object.py +++ b/src/ifcopenshell-python/test/api/aggregate/test_assign_object.py @@ -121,3 +121,7 @@ class TestAssignObject(test.bootstrap.IFC4): ifcopenshell.api.run("spatial.assign_container", self.file, products=[subelement], relating_structure=container) ifcopenshell.api.run("aggregate.assign_object", self.file, products=[subelement], relating_object=element) assert not ifcopenshell.util.element.get_container(subelement, should_get_direct=True) + + +class TestAssignObjectIFC2X3(test.bootstrap.IFC2X3, TestAssignObject): + pass diff --git a/src/ifcopenshell-python/test/api/aggregate/test_unassign_object.py b/src/ifcopenshell-python/test/api/aggregate/test_unassign_object.py index 64e4fe4fcd..8619275fd7 100644 --- a/src/ifcopenshell-python/test/api/aggregate/test_unassign_object.py +++ b/src/ifcopenshell-python/test/api/aggregate/test_unassign_object.py @@ -49,3 +49,7 @@ class TestUnassignObject(test.bootstrap.IFC4): ifcopenshell.api.run("aggregate.assign_object", self.file, products=[subelement], relating_object=element) ifcopenshell.api.run("aggregate.unassign_object", self.file, products=[subelement]) assert len(self.file.by_type("IfcRelAggregates")) == 0 + + +class TestUnassignObjectIFC2X3(test.bootstrap.IFC2X3, TestUnassignObject): + pass diff --git a/src/ifcopenshell-python/test/api/boundary/test_copy_boundary.py b/src/ifcopenshell-python/test/api/boundary/test_copy_boundary.py index b044d32eac..e5a8b98437 100644 --- a/src/ifcopenshell-python/test/api/boundary/test_copy_boundary.py +++ b/src/ifcopenshell-python/test/api/boundary/test_copy_boundary.py @@ -34,3 +34,7 @@ class TestCopyBoundary(test.bootstrap.IFC4): boundary2 = ifcopenshell.api.run("boundary.copy_boundary", self.file, boundary=boundary) assert boundary2.ConnectionGeometry.is_a("IfcConnectionSurfaceGeometry") assert boundary2.ConnectionGeometry != boundary.ConnectionGeometry + + +class TestCopyBoundaryIFC2X3(test.bootstrap.IFC2X3, TestCopyBoundary): + pass diff --git a/src/ifcopenshell-python/test/api/boundary/test_remove_boundary.py b/src/ifcopenshell-python/test/api/boundary/test_remove_boundary.py index 7a6f3a0a16..cd3b5ff54b 100644 --- a/src/ifcopenshell-python/test/api/boundary/test_remove_boundary.py +++ b/src/ifcopenshell-python/test/api/boundary/test_remove_boundary.py @@ -33,3 +33,7 @@ class TestRemoveBoundary(test.bootstrap.IFC4): ifcopenshell.api.run("boundary.remove_boundary", self.file, boundary=boundary) assert not self.file.by_type("IfcRelSpaceBoundary") assert not self.file.by_type("IfcConnectionSurfaceGeometry") + + +class TestRemoveBoundaryIFC2X3(test.bootstrap.IFC2X3, TestRemoveBoundary): + pass diff --git a/src/ifcopenshell-python/test/api/classification/test_add_classification.py b/src/ifcopenshell-python/test/api/classification/test_add_classification.py index 2c80cfb52f..0255e1240c 100644 --- a/src/ifcopenshell-python/test/api/classification/test_add_classification.py +++ b/src/ifcopenshell-python/test/api/classification/test_add_classification.py @@ -32,3 +32,7 @@ class TestAddClassification(test.bootstrap.IFC4): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") ifcopenshell.api.run("classification.add_classification", self.file, classification=classification) assert self.file.by_type("IfcClassification")[0].Name == "Name" + + +class TestAddClassificationIFC2X3(test.bootstrap.IFC2X3, TestAddClassification): + pass diff --git a/src/ifcopenshell-python/test/api/classification/test_remove_classification.py b/src/ifcopenshell-python/test/api/classification/test_remove_classification.py index fb3537ddf2..319384306e 100644 --- a/src/ifcopenshell-python/test/api/classification/test_remove_classification.py +++ b/src/ifcopenshell-python/test/api/classification/test_remove_classification.py @@ -47,7 +47,7 @@ class TestRemoveClassification(test.bootstrap.IFC4): def test_removing_a_classification_and_all_of_its_references_when_associated_with_a_resource(self): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") result = ifcopenshell.api.run("classification.add_classification", self.file, classification="Name") - element = self.file.createIfcMaterial(Name="Material") + element = self.file.create_entity("IfcWall", Name="Wall") ifcopenshell.api.run( "classification.add_reference", self.file, @@ -59,4 +59,9 @@ class TestRemoveClassification(test.bootstrap.IFC4): ifcopenshell.api.run("classification.remove_classification", self.file, classification=result) assert not self.file.by_type("IfcClassification") assert not self.file.by_type("IfcClassificationReference") - assert not self.file.by_type("IfcExternalReferenceRelationship") + if self.file.schema != "IFC2X3": + assert not self.file.by_type("IfcExternalReferenceRelationship") + + +class TestRemoveClassificationIFC2X3(test.bootstrap.IFC2X3, TestRemoveClassification): + pass diff --git a/src/ifcopenshell-python/test/api/context/test_add_context.py b/src/ifcopenshell-python/test/api/context/test_add_context.py index c44ae9d0f9..2a427ef889 100644 --- a/src/ifcopenshell-python/test/api/context/test_add_context.py +++ b/src/ifcopenshell-python/test/api/context/test_add_context.py @@ -75,3 +75,7 @@ class TestAddContext(test.bootstrap.IFC4): self.test_adding_a_2d_context() project = self.file.by_type("IfcProject")[0] assert len(project.RepresentationContexts) == 2 + + +class TestAddContextIFC2X3(test.bootstrap.IFC2X3, TestAddContext): + pass diff --git a/src/ifcopenshell-python/test/api/context/test_edit_context.py b/src/ifcopenshell-python/test/api/context/test_edit_context.py index 1232496b95..210f667f7d 100644 --- a/src/ifcopenshell-python/test/api/context/test_edit_context.py +++ b/src/ifcopenshell-python/test/api/context/test_edit_context.py @@ -58,3 +58,7 @@ class TestEditContext(test.bootstrap.IFC4): assert subcontext.TargetScale == 0.5 assert subcontext.TargetView == "MODEL_VIEW" assert subcontext.UserDefinedTargetView == "UserDefinedTargetView" + + +class TestEditContext(test.bootstrap.IFC2X3, TestEditContext): + pass diff --git a/src/ifcopenshell-python/test/api/context/test_remove_context.py b/src/ifcopenshell-python/test/api/context/test_remove_context.py index f4948dcb4b..682990e154 100644 --- a/src/ifcopenshell-python/test/api/context/test_remove_context.py +++ b/src/ifcopenshell-python/test/api/context/test_remove_context.py @@ -38,16 +38,22 @@ class TestRemoveContext(test.bootstrap.IFC4): subcontext = self.file.createIfcGeometricRepresentationSubcontext() subcontext.ParentContext = context representation = self.file.createIfcRepresentation(ContextOfItems=subcontext) - projected_crs = self.file.createIfcProjectedCRS() - map_conversion = self.file.createIfcMapConversion(SourceCRS=subcontext, TargetCRS=projected_crs) + if self.file.schema != "IFC2X3": + projected_crs = self.file.createIfcProjectedCRS() + map_conversion = self.file.createIfcMapConversion(SourceCRS=subcontext, TargetCRS=projected_crs) ifcopenshell.api.run("context.remove_context", self.file, context=subcontext) assert len(self.file.by_type("IfcGeometricRepresentationSubcontext")) == 0 assert representation in self.file.get_inverse(context) - assert len(self.file.by_type("IfcMapConversion")) == 0 - assert len(self.file.by_type("IfcProjectedCRS")) == 0 + if self.file.schema != "IFC2X3": + assert len(self.file.by_type("IfcMapConversion")) == 0 + assert len(self.file.by_type("IfcProjectedCRS")) == 0 def test_removing_a_context_with_references(self): context = self.file.createIfcGeometricRepresentationContext() representation = self.file.createIfcRepresentation(ContextOfItems=context) ifcopenshell.api.run("context.remove_context", self.file, context=context) assert len([e for e in self.file]) == 0 + + +class TestRemoveContextIFC2X3(test.bootstrap.IFC2X3, TestRemoveContext): + pass diff --git a/src/ifcopenshell-python/test/api/control/test_assign_control.py b/src/ifcopenshell-python/test/api/control/test_assign_control.py index 18670c86e4..e8d63d5d6f 100644 --- a/src/ifcopenshell-python/test/api/control/test_assign_control.py +++ b/src/ifcopenshell-python/test/api/control/test_assign_control.py @@ -48,3 +48,7 @@ class TestAssignControl(test.bootstrap.IFC4): assert len(self.file.by_type("IfcRelAssignsToControl")) == 1 assert relation.RelatingControl == control assert set(relation.RelatedObjects) == set((wall, wall1)) + + +class TestAssignControlIFC2X3(test.bootstrap.IFC2X3, TestAssignControl): + pass diff --git a/src/ifcopenshell-python/test/api/control/test_unassign_control.py b/src/ifcopenshell-python/test/api/control/test_unassign_control.py index c31014f008..c85ee05765 100644 --- a/src/ifcopenshell-python/test/api/control/test_unassign_control.py +++ b/src/ifcopenshell-python/test/api/control/test_unassign_control.py @@ -41,3 +41,7 @@ class TestUnassignControl(test.bootstrap.IFC4): ifcopenshell.api.run("control.unassign_control", self.file, relating_control=control, related_object=wall1) assert len(self.file.by_type("IfcRelAssignsToControl")) == 1 assert relation.RelatedObjects == (wall,) + + +class TestUnassignControlIFC2X3(test.bootstrap.IFC2X3, TestUnassignControl): + pass diff --git a/src/ifcopenshell-python/test/api/cost/test_add_cost_item.py b/src/ifcopenshell-python/test/api/cost/test_add_cost_item.py index 488f10aadc..b2bec35bbf 100644 --- a/src/ifcopenshell-python/test/api/cost/test_add_cost_item.py +++ b/src/ifcopenshell-python/test/api/cost/test_add_cost_item.py @@ -18,6 +18,7 @@ import test.bootstrap import ifcopenshell.api +import ifcopenshell.util.element class TestAddCostItem(test.bootstrap.IFC4): @@ -33,4 +34,8 @@ class TestAddCostItem(test.bootstrap.IFC4): item1 = ifcopenshell.api.run("cost.add_cost_item", self.file, cost_schedule=schedule) item2 = ifcopenshell.api.run("cost.add_cost_item", self.file, cost_item=item1) assert item2.is_a("IfcCostItem") - assert item2.Nests[0].RelatingObject == item1 + assert ifcopenshell.util.element.get_nest(item2) == item1 + + +class TestAddCostItemIFC2X3(test.bootstrap.IFC2X3, TestAddCostItem): + pass diff --git a/src/ifcopenshell-python/test/api/cost/test_add_cost_schedule.py b/src/ifcopenshell-python/test/api/cost/test_add_cost_schedule.py index e02acb0ff6..5646b67601 100644 --- a/src/ifcopenshell-python/test/api/cost/test_add_cost_schedule.py +++ b/src/ifcopenshell-python/test/api/cost/test_add_cost_schedule.py @@ -33,3 +33,7 @@ class TestAddCostSchedule(test.bootstrap.IFC4): assert schedule.Name == "Foo" assert schedule.PredefinedType == "USERDEFINED" assert schedule.ObjectType == "FOO" + + +class TestAddCostScheduleIFC2X3(test.bootstrap.IFC2X3, TestAddCostSchedule): + pass diff --git a/src/ifcopenshell-python/test/api/cost/test_remove_cost_item.py b/src/ifcopenshell-python/test/api/cost/test_remove_cost_item.py index e6768df8b8..96b7a11657 100644 --- a/src/ifcopenshell-python/test/api/cost/test_remove_cost_item.py +++ b/src/ifcopenshell-python/test/api/cost/test_remove_cost_item.py @@ -45,3 +45,7 @@ class TestRemoveCostItem(test.bootstrap.IFC4): assert not self.file.by_type("IfcCostItem") assert not self.file.by_type("IfcRelAssignsToControl") assert not self.file.by_type("IfcRelNests") + + +class TestRemoveCostItemIFC2X3(test.bootstrap.IFC2X3, TestRemoveCostItem): + pass diff --git a/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py b/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py index 6b88d81a3f..7b2d534653 100644 --- a/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py +++ b/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py @@ -35,3 +35,7 @@ class TestRemoveCostSchedule(test.bootstrap.IFC4): assert not self.file.by_type("IfcCostItem") assert not self.file.by_type("IfcRelNests") assert not self.file.by_type("IfcRelAssignsToControl") + + +class TestRemoveCostSchedule(test.bootstrap.IFC2X3, TestRemoveCostSchedule): + pass diff --git a/src/ifcopenshell-python/test/api/document/test_add_information.py b/src/ifcopenshell-python/test/api/document/test_add_information.py index 4d225e1f39..dcb7eacdb4 100644 --- a/src/ifcopenshell-python/test/api/document/test_add_information.py +++ b/src/ifcopenshell-python/test/api/document/test_add_information.py @@ -30,9 +30,10 @@ class TestAddInformation(test.bootstrap.IFC4): def test_adding_information_to_the_project(self): project = self.file.createIfcProject() element = ifcopenshell.api.run("document.add_information", self.file, parent=None) - rel = element.DocumentInfoForObjects[0] + rel = self.file.by_type("IfcRelAssociatesDocument")[0] assert rel.is_a("IfcRelAssociatesDocument") - assert rel.RelatedObjects[0] == project + assert rel.RelatingDocument == element + assert rel.RelatedObjects == (project,) def test_adding_a_subdocument(self): project = self.file.createIfcProject() @@ -45,3 +46,7 @@ class TestAddInformation(test.bootstrap.IFC4): element2 = ifcopenshell.api.run("document.add_information", self.file, parent=parent) assert element in parent.IsPointer[0].RelatedDocuments assert element2 in parent.IsPointer[0].RelatedDocuments + + +class TestAddInformationIFC2X3(test.bootstrap.IFC2X3, TestAddInformation): + pass diff --git a/src/ifcopenshell-python/test/api/drawing/test_assign_product.py b/src/ifcopenshell-python/test/api/drawing/test_assign_product.py index 78b10e5d76..12e57b7435 100644 --- a/src/ifcopenshell-python/test/api/drawing/test_assign_product.py +++ b/src/ifcopenshell-python/test/api/drawing/test_assign_product.py @@ -37,3 +37,7 @@ class TestAssignProduct(test.bootstrap.IFC4): ifcopenshell.api.run("drawing.assign_product", self.file, relating_product=wall, related_object=label) assert len(wall.ReferencedBy) == 1 assert wall.ReferencedBy[0].RelatedObjects == (label,) + + +class TestAssignProductIFC2X3(test.bootstrap.IFC2X3, TestAssignProduct): + pass diff --git a/src/ifcopenshell-python/test/api/drawing/test_edit_text_literal.py b/src/ifcopenshell-python/test/api/drawing/test_edit_text_literal.py index c0e9e73106..9da51a93e9 100644 --- a/src/ifcopenshell-python/test/api/drawing/test_edit_text_literal.py +++ b/src/ifcopenshell-python/test/api/drawing/test_edit_text_literal.py @@ -36,3 +36,7 @@ class TestEditTextLiteral(test.bootstrap.IFC4): assert text.Literal == "Literal" assert text.Path == "RIGHT" assert text.BoxAlignment == "middle" + + +class TestEditTextLiteralIFC2X3(test.bootstrap.IFC2X3, TestEditTextLiteral): + pass diff --git a/src/ifcopenshell-python/test/api/drawing/test_unassign_product.py b/src/ifcopenshell-python/test/api/drawing/test_unassign_product.py index 39cc64ca16..c23e978b1c 100644 --- a/src/ifcopenshell-python/test/api/drawing/test_unassign_product.py +++ b/src/ifcopenshell-python/test/api/drawing/test_unassign_product.py @@ -27,3 +27,7 @@ class TestUnassignProduct(test.bootstrap.IFC4): ifcopenshell.api.run("drawing.assign_product", self.file, relating_product=wall, related_object=label) ifcopenshell.api.run("drawing.unassign_product", self.file, relating_product=wall, related_object=label) assert len(self.file.by_type("IfcRelAssignsToProduct")) == 0 + + +class TestUnassignProductIFC2X3(test.bootstrap.IFC2X3, TestUnassignProduct): + pass diff --git a/src/ifcopenshell-python/test/api/type/test_map_type_representation.py b/src/ifcopenshell-python/test/api/type/test_map_type_representation.py index a43430a040..a288c60197 100644 --- a/src/ifcopenshell-python/test/api/type/test_map_type_representation.py +++ b/src/ifcopenshell-python/test/api/type/test_map_type_representation.py @@ -49,3 +49,7 @@ class TestMapTypeRepresentations(test.bootstrap.IFC4): assert rep.RepresentationType == "MappedRepresentation" assert rep.Items[0].MappingSource == type.RepresentationMaps[0] assert len(self.file.by_type("IfcShapeRepresentation")) == 2 + + +class TestMapTypeRepresentationsIFC2X3(test.bootstrap.IFC2X3, TestMapTypeRepresentations): + pass diff --git a/src/ifcopenshell-python/test/api/unit/test_add_context_dependent_unit.py b/src/ifcopenshell-python/test/api/unit/test_add_context_dependent_unit.py index b8892fc914..7d6887a893 100644 --- a/src/ifcopenshell-python/test/api/unit/test_add_context_dependent_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_add_context_dependent_unit.py @@ -39,3 +39,7 @@ class TestAddContextDependentUnit(test.bootstrap.IFC4): assert unit.Dimensions.LuminousIntensityExponent == 7 assert unit.UnitType == "LENGTHUNIT" assert unit.Name == "foobar" + + +class TestAddContextDependentUnitIFC2X3(test.bootstrap.IFC2X3, TestAddContextDependentUnit): + pass diff --git a/src/ifcopenshell-python/test/api/unit/test_add_conversion_based_unit.py b/src/ifcopenshell-python/test/api/unit/test_add_conversion_based_unit.py index 0bfe848e0f..87f3513191 100644 --- a/src/ifcopenshell-python/test/api/unit/test_add_conversion_based_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_add_conversion_based_unit.py @@ -20,7 +20,7 @@ import test.bootstrap import ifcopenshell.api -class TestAddConversionBasedUnit(test.bootstrap.IFC4): +class TestAddConversionBasedUnitIFC2X3(test.bootstrap.IFC2X3): def test_run(self): unit = ifcopenshell.api.run("unit.add_conversion_based_unit", self.file, name="foot") assert unit.is_a("IfcConversionBasedUnit") @@ -40,6 +40,8 @@ class TestAddConversionBasedUnit(test.bootstrap.IFC4): assert si_unit.Prefix is None assert si_unit.Name == "METRE" + +class TestAddConversionBasedUnitIFC4(test.bootstrap.IFC4, TestAddConversionBasedUnitIFC2X3): def test_adding_a_unit_with_offset(self): unit = ifcopenshell.api.run("unit.add_conversion_based_unit", self.file, name="fahrenheit") assert unit.is_a("IfcConversionBasedUnitWithOffset") diff --git a/src/ifcopenshell-python/test/api/unit/test_add_monetary_unit.py b/src/ifcopenshell-python/test/api/unit/test_add_monetary_unit.py index af14cf0c2c..47d23505ec 100644 --- a/src/ifcopenshell-python/test/api/unit/test_add_monetary_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_add_monetary_unit.py @@ -25,3 +25,7 @@ class TestAddMonetaryUnit(test.bootstrap.IFC4): unit = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="USD") assert unit.is_a("IfcMonetaryUnit") assert unit.Currency == "USD" + + +class TestAddMonetaryUnitIFC2X3(test.bootstrap.IFC2X3, TestAddMonetaryUnit): + pass diff --git a/src/ifcopenshell-python/test/api/unit/test_add_si_unit.py b/src/ifcopenshell-python/test/api/unit/test_add_si_unit.py index 8ebc7234ad..2c31cef495 100644 --- a/src/ifcopenshell-python/test/api/unit/test_add_si_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_add_si_unit.py @@ -26,3 +26,7 @@ class TestAddSIUnit(test.bootstrap.IFC4): assert unit.UnitType == "LENGTHUNIT" assert unit.Name == "METRE" assert unit.Prefix == "MILLI" + + +class TestAddSIUnitIFC2X3(test.bootstrap.IFC2X3, TestAddSIUnit): + pass diff --git a/src/ifcopenshell-python/test/api/unit/test_assign_unit.py b/src/ifcopenshell-python/test/api/unit/test_assign_unit.py index 198e8b362a..c16c423a9a 100644 --- a/src/ifcopenshell-python/test/api/unit/test_assign_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_assign_unit.py @@ -23,8 +23,8 @@ import ifcopenshell.api class TestAssignUnit(test.bootstrap.IFC4): def test_run(self): project = self.file.createIfcProject() - unit1 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="FOO") - unit2 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="BAR") + unit1 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="USD") + unit2 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="JPY") assignment = ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit1, unit2]) assert project.UnitsInContext == assignment assert assignment.is_a("IfcUnitAssignment") @@ -33,11 +33,15 @@ class TestAssignUnit(test.bootstrap.IFC4): def test_assign_units_to_an_existing_assignment(self): project = self.file.createIfcProject() - unit1 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="FOO") - unit2 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="BAR") + unit1 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="USD") + unit2 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="JPY") assignment1 = ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit1]) assignment2 = ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit2]) assert project.UnitsInContext == assignment1 assert assignment1 == assignment2 assert unit1 in assignment1.Units assert unit2 in assignment1.Units + + +class TestAssignUnitIFC2X3(test.bootstrap.IFC2X3, TestAssignUnit): + pass diff --git a/src/ifcopenshell-python/test/api/unit/test_edit_derived_unit.py b/src/ifcopenshell-python/test/api/unit/test_edit_derived_unit.py index 026163cf0e..3657fb0511 100644 --- a/src/ifcopenshell-python/test/api/unit/test_edit_derived_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_edit_derived_unit.py @@ -31,3 +31,7 @@ class TestEditDerivedUnit(test.bootstrap.IFC4): ) assert unit.UnitType == "USERDEFINED" assert unit.UserDefinedType == "UserDefinedType" + + +class TestEditDerivedUnitIFC2X3(test.bootstrap.IFC2X3, TestEditDerivedUnit): + pass diff --git a/src/ifcopenshell-python/test/api/unit/test_edit_monetary_unit.py b/src/ifcopenshell-python/test/api/unit/test_edit_monetary_unit.py index ef5d10becb..a2d780bfb7 100644 --- a/src/ifcopenshell-python/test/api/unit/test_edit_monetary_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_edit_monetary_unit.py @@ -23,5 +23,9 @@ import ifcopenshell.api class TestEditMonetaryUnit(test.bootstrap.IFC4): def test_run(self): unit = self.file.createIfcMonetaryUnit() - ifcopenshell.api.run("unit.edit_monetary_unit", self.file, unit=unit, attributes={"Currency": "FOO"}) - assert unit.Currency == "FOO" + ifcopenshell.api.run("unit.edit_monetary_unit", self.file, unit=unit, attributes={"Currency": "USD"}) + assert unit.Currency == "USD" + + +class TestEditMonetaryUnitIFC2X3(test.bootstrap.IFC2X3, TestEditMonetaryUnit): + pass diff --git a/src/ifcopenshell-python/test/api/unit/test_edit_named_unit.py b/src/ifcopenshell-python/test/api/unit/test_edit_named_unit.py index 4aba4a43e3..ffaca2d32b 100644 --- a/src/ifcopenshell-python/test/api/unit/test_edit_named_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_edit_named_unit.py @@ -20,7 +20,7 @@ import test.bootstrap import ifcopenshell.api -class TestEditNamedUnit(test.bootstrap.IFC4): +class TestEditNamedUnitIFC2X3(test.bootstrap.IFC2X3): def test_edit_context_dependent_unit(self): unit = self.file.createIfcContextDependentUnit() unit.Dimensions = self.file.createIfcDimensionalExponents() @@ -59,6 +59,8 @@ class TestEditNamedUnit(test.bootstrap.IFC4): assert unit.UnitType == "LENGTHUNIT" assert unit.Name == "Name" + +class TestEditNamedUnitIFC4(test.bootstrap.IFC4, TestEditNamedUnitIFC2X3): def test_edit_conversion_based_unit_with_offset(self): unit = self.file.createIfcConversionBasedUnitWithOffset() unit.Dimensions = self.file.createIfcDimensionalExponents() diff --git a/src/ifcopenshell-python/test/api/unit/test_remove_unit.py b/src/ifcopenshell-python/test/api/unit/test_remove_unit.py index c6a885c6bc..c53d66e2eb 100644 --- a/src/ifcopenshell-python/test/api/unit/test_remove_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_remove_unit.py @@ -47,3 +47,7 @@ class TestRemoveUnit(test.bootstrap.IFC4): unit = ifcopenshell.api.run("unit.add_conversion_based_unit", self.file, name="foot") ifcopenshell.api.run("unit.remove_unit", self.file, unit=unit) assert len([e for e in self.file]) == 0 + + +class TestRemoveUnitIFC2X3(test.bootstrap.IFC2X3, TestRemoveUnit): + pass diff --git a/src/ifcopenshell-python/test/api/unit/test_unassign_unit.py b/src/ifcopenshell-python/test/api/unit/test_unassign_unit.py index 0e0d0f71a3..13087d9e00 100644 --- a/src/ifcopenshell-python/test/api/unit/test_unassign_unit.py +++ b/src/ifcopenshell-python/test/api/unit/test_unassign_unit.py @@ -23,8 +23,8 @@ import ifcopenshell.api class TestUnassignUnit(test.bootstrap.IFC4): def test_run(self): project = self.file.createIfcProject() - unit1 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="FOO") - unit2 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="BAR") + unit1 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="USD") + unit2 = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="JPY") assignment = ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit1, unit2]) ifcopenshell.api.run("unit.unassign_unit", self.file, units=[unit1]) assert unit1 not in assignment.Units @@ -32,11 +32,15 @@ class TestUnassignUnit(test.bootstrap.IFC4): def test_unassigning_the_last_unit(self): project = self.file.createIfcProject() - unit = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="FOO") + unit = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="USD") ifcopenshell.api.run("unit.assign_unit", self.file, units=[unit]) ifcopenshell.api.run("unit.unassign_unit", self.file, units=[unit]) assert project.UnitsInContext is None def test_doing_nothing_if_the_unit_is_not_assigned(self): - unit = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="FOO") + unit = ifcopenshell.api.run("unit.add_monetary_unit", self.file, currency="USD") assert ifcopenshell.api.run("unit.unassign_unit", self.file, units=[unit]) is None + + +class TestUnassignUnitIFC2X3(test.bootstrap.IFC2X3, TestUnassignUnit): + pass diff --git a/src/ifcopenshell-python/test/api/void/test_add_filling.py b/src/ifcopenshell-python/test/api/void/test_add_filling.py index 46ce089190..c29da2323d 100644 --- a/src/ifcopenshell-python/test/api/void/test_add_filling.py +++ b/src/ifcopenshell-python/test/api/void/test_add_filling.py @@ -43,3 +43,7 @@ class TestAddFilling(test.bootstrap.IFC4): ifcopenshell.api.run("void.add_filling", self.file, opening=opening2, element=door) assert not opening1.HasFillings assert opening2.HasFillings[0].RelatedBuildingElement == door + + +class TestAddFillingIFC2X3(test.bootstrap.IFC2X3, TestAddFilling): + pass diff --git a/src/ifcopenshell-python/test/api/void/test_add_opening.py b/src/ifcopenshell-python/test/api/void/test_add_opening.py index 357cc300fb..4a168eead0 100644 --- a/src/ifcopenshell-python/test/api/void/test_add_opening.py +++ b/src/ifcopenshell-python/test/api/void/test_add_opening.py @@ -77,3 +77,7 @@ class TestAddOpening(test.bootstrap.IFC4): opening.ObjectPlacement = placement ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=wall) assert opening.ObjectPlacement == placement + + +class TestAddOpeningIFC2X3(test.bootstrap.IFC2X3, TestAddOpening): + pass diff --git a/src/ifcopenshell-python/test/api/void/test_remove_opening.py b/src/ifcopenshell-python/test/api/void/test_remove_opening.py index 6a121a2a61..fd176cb7fc 100644 --- a/src/ifcopenshell-python/test/api/void/test_remove_opening.py +++ b/src/ifcopenshell-python/test/api/void/test_remove_opening.py @@ -47,3 +47,7 @@ class TestRemoveOpening(test.bootstrap.IFC4): assert len(self.file.by_type("IfcRelFillsElement")) == 0 assert wall assert door + + +class TestRemoveOpeningIFC2X3(test.bootstrap.IFC2X3, TestRemoveOpening): + pass From 1c6a9e2c49797a6f58319fd1822f4b4c70df0438 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 9 May 2024 16:08:41 +0500 Subject: [PATCH 138/429] more descriptive errors settings incorrect data type to attributes Example: ``` ifc_file = ifcopenshell.file(schema="IFC2X3") entity = ifc_file.create_entity("IfcCostSchedule") entity.UpdateDate = ifcopenshell.util.date.datetime2ifc(datetime.now(), "IfcDateTime") ``` --- .../ifcopenshell/entity_instance.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index 499c1a260e..de3ce535a6 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -338,7 +338,18 @@ class entity_instance: ) raise e else: - self.method_list[idx](self.wrapped_data, idx, entity_instance.unwrap_value(value)) + try: + self.method_list[idx](self.wrapped_data, idx, entity_instance.unwrap_value(value)) + except TypeError: + raise TypeError( + "attribute '%s' for entity '%s' is expecting value of type '%s', got '%s'." + % ( + self.wrapped_data.get_argument_name(idx), + self.wrapped_data.is_a(True), + self.wrapped_data.get_argument_type(idx), + type(value).__name__, + ) + ) return value From bdc5a7a01b6e89e6d48ce383c3f62f3e3eab37cc Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 9 May 2024 17:06:18 +0500 Subject: [PATCH 139/429] more descriptive errors creating entities - setting incorrect attributes example: ``` ifc_file = ifcopenshell.file(schema="IFC4") entity = ifc_file.create_entity("IfcRoot", "xxx", None, None, None, None) entity = ifc_file.create_entity("IfcRoot", Location=None) ``` --- src/ifcopenshell-python/ifcopenshell/file.py | 23 +++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index fc2fb29f1c..ee421256c5 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -332,7 +332,14 @@ class file: # @todo we should probably check that values for # attributes are not passed as duplicates using # both regular arguments and keyword arguments. - attrs = list(enumerate(args)) + [(e.wrapped_data.get_argument_index(name), arg) for name, arg in kwargs.items()] + kwargs_attrs = [(e.wrapped_data.get_argument_index(name), arg) for name, arg in kwargs.items()] + attrs = list(enumerate(args)) + kwargs_attrs + + if len(attrs) > len(e): + raise ValueError( + "entity instance of type '%s' has only %s attributes but %s attributes were provided." + % (e.is_a(True), len(e), len(attrs)) + ) # Don't store these attributes as transactions # as the creation it self is already stored with @@ -341,8 +348,18 @@ class file: transaction = self.transaction self.transaction = None - for idx, arg in attrs: - e[idx] = arg + try: + for idx, arg in attrs: + e[idx] = arg + except IndexError: + invalid_attrs = [] + for (attr_index, _), attr_name in zip(kwargs_attrs, kwargs): + if attr_index == 0xFFFFFFFF: + invalid_attrs.append(attr_name) + raise ValueError( + "entity instance of type '%s' doesn't have the following attributes: %s." + % (e.is_a(True), ", ".join(invalid_attrs)) + ) # Restore transaction status if attrs: From b2920996bec60eb0ba0b09d44018b80a333057a7 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 9 May 2024 18:04:25 +0500 Subject: [PATCH 140/429] remove deprecated api method type.get_related_objects --- .../ifcopenshell/api/type/__init__.py | 1 - .../api/type/get_related_objects.py | 58 ------------------- 2 files changed, 59 deletions(-) delete mode 100644 src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py index 39a523123d..6707dd9e8a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py @@ -26,7 +26,6 @@ Using types is critical to the success of any project. from .. import wrap_usecases from .assign_type import assign_type -from .get_related_objects import get_related_objects from .map_type_representations import map_type_representations from .unassign_type import unassign_type diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py b/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py deleted file mode 100644 index 3610f27af5..0000000000 --- a/src/ifcopenshell-python/ifcopenshell/api/type/get_related_objects.py +++ /dev/null @@ -1,58 +0,0 @@ -# IfcOpenShell - IFC toolkit and geometry engine -# Copyright (C) 2021 Dion Moult -# -# This file is part of IfcOpenShell. -# -# IfcOpenShell is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# IfcOpenShell is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with IfcOpenShell. If not, see . - -import ifcopenshell - - -def get_related_objects(file, related_object=None, relating_type=None) -> None: - """Gets all the related occurrences of a type - - Do not use this function. It will be removed. Use - ifcopenshell.util.element.get_type or - ifcopenshell.util.element.get_types instead. - - :param related_object: The IfcElement occurrence. - :type related_object: ifcopenshell.entity_instance - :param relating_type: The IfcElementType type. - :type relating_type: ifcopenshell.entity_instance - :return: A list of occurrences of the type. - :rtype: list[ifcopenshell.entity_instance] - """ - settings = { - "related_object": related_object, - "relating_type": relating_type, - } - - if settings["related_object"]: - if file.schema == "IFC2X3": - is_defined_by = settings["related_object"].IsDefinedBy - for rel in is_defined_by: - if rel.is_a("IfcRelDefinesByType"): - return set([int(o.id()) for o in rel.RelatedObjects]) - else: - is_typed_by = settings["related_object"].IsTypedBy - if is_typed_by: - return set([int(o.id()) for o in is_typed_by[0].RelatedObjects]) - elif settings["relating_type"]: - if file.schema == "IFC2X3": - types = settings["relating_type"].ObjectTypeOf - else: - types = settings["relating_type"].Types - if types: - return set([int(o.id()) for o in types[0].RelatedObjects]) - return set() From 51d3a2b77b75b3a8ba7456520058937e645d871d Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 10 May 2024 16:16:43 +1000 Subject: [PATCH 141/429] Whoops --- src/ifctester/ifctester/facet.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ifctester/ifctester/facet.py b/src/ifctester/ifctester/facet.py index e42cbc21f3..c5fa773ac1 100644 --- a/src/ifctester/ifctester/facet.py +++ b/src/ifctester/ifctester/facet.py @@ -72,8 +72,6 @@ class Facet: def __init__(self, *parameters): self.status = None self.failures: list[FacetFailure] = [] - self.parameters = [] - self.applicability_templates = [] for i, name in enumerate(self.parameters): setattr(self, name.replace("@", ""), parameters[i]) From 57b905862a962ac0eb9ef2a5c8a037a3daefdb01 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 10 May 2024 18:20:41 +1000 Subject: [PATCH 142/429] Fix #4650. When the bbim build hotfixes the bot build, it should replace, not copy over. --- src/blenderbim/Makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/Makefile b/src/blenderbim/Makefile index 2bdf4b27a6..27f089a0bc 100644 --- a/src/blenderbim/Makefile +++ b/src/blenderbim/Makefile @@ -151,8 +151,10 @@ endif cd dist/working && wget https://github.com/IfcOpenShell/IfcOpenShell/archive/v0.7.0.zip cd dist/working && unzip v0.7.0.zip # IfcOpenBot sometimes lags behind, so we hotfix the Python utilities - cp -r dist/working/IfcOpenShell-0.7.0/src/ifcopenshell-python/ifcopenshell/util/* dist/blenderbim/libs/site/packages/ifcopenshell/util/ - cp -r dist/working/IfcOpenShell-0.7.0/src/ifcopenshell-python/ifcopenshell/api/* dist/blenderbim/libs/site/packages/ifcopenshell/api/ + rm -rf dist/blenderbim/libs/site/packages/ifcopenshell/util/ + rm -rf dist/blenderbim/libs/site/packages/ifcopenshell/api/ + cp -r dist/working/IfcOpenShell-0.7.0/src/ifcopenshell-python/ifcopenshell/util dist/blenderbim/libs/site/packages/ifcopenshell/ + cp -r dist/working/IfcOpenShell-0.7.0/src/ifcopenshell-python/ifcopenshell/api dist/blenderbim/libs/site/packages/ifcopenshell/ cp dist/working/IfcOpenShell-0.7.0/src/ifcopenshell-python/ifcopenshell/*.py dist/blenderbim/libs/site/packages/ifcopenshell/ cp dist/working/IfcOpenShell-0.7.0/src/ifcopenshell-python/ifcopenshell/express/rule_executor.py dist/blenderbim/libs/site/packages/ifcopenshell/express/ # Provides bcf functionality From 69e21da60c15ff858af3db01b6caca9d82c58e0a Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 10 May 2024 22:13:39 +1000 Subject: [PATCH 143/429] Minor naming changes in IfcFM to be more true to IFC jargon --- src/ifcfm/ifcfm/basic.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ifcfm/ifcfm/basic.py b/src/ifcfm/ifcfm/basic.py index 61725fc533..28ed242ee3 100644 --- a/src/ifcfm/ifcfm/basic.py +++ b/src/ifcfm/ifcfm/basic.py @@ -72,8 +72,8 @@ def get_facility_data(ifc_file, element): "ModelProjectID": ifc_file.by_type("IfcProject")[0].GlobalId, "ModelSiteID": getattr(get_facility_parent(element, "IfcSite"), "GlobalId", None), "ModelBuildingID": element.GlobalId, - "LinearUnits": "millimeters", - "AreaUnits": "square meters", + "LengthUnit": "millimeters", + "AreaUnit": "square meters", "Phase": ifc_file.by_type("IfcProject")[0].Phase, } @@ -99,7 +99,7 @@ def get_space_data(ifc_file, element): "Description": element.LongName, "ClassificationIdentification": get_classification_identification(element), "ClassificationName": get_classification_name(element), - "LevelName": getattr(get_facility_parent(element, "IfcBuildingStorey"), "Name", None), + "StoreyName": getattr(get_facility_parent(element, "IfcBuildingStorey"), "Name", None), "OrganizationName": get_owner_name(element), "CreationDate": get_owner_creation_date(element), "ModelSoftware": get_owner_application(element), @@ -261,8 +261,8 @@ config = { "ModelProjectID", "ModelSiteID", "ModelBuildingID", - "LinearUnits", - "AreaUnits", + "LengthUnit", + "AreaUnit", "Phase", ], "colours": "ppppreeeeesss", @@ -295,7 +295,7 @@ config = { "Description", "ClassificationIdentification", "ClassificationName", - "LevelName", + "StoreyName", "OrganizationName", "CreationDate", "ModelSoftware", @@ -305,7 +305,7 @@ config = { "NetFloorArea", ], "colours": "ppprreeess", - "sort": [{"name": "LevelName", "order": "ASC"}, {"name": "Name", "order": "ASC"}], + "sort": [{"name": "StoreyName", "order": "ASC"}, {"name": "Name", "order": "ASC"}], "get_category_elements": get_spaces, "get_element_data": get_space_data, }, From cd6eac3c8f73d1afe3a52f8240ffb787a539ec27 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 10 May 2024 22:39:56 +1000 Subject: [PATCH 144/429] See #4652. Fix bug where using create_mesh won't work if you pass it a triangulation. --- src/blenderbim/blenderbim/bim/import_ifc.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 4e9440ad1c..369c0812d3 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -1912,11 +1912,7 @@ class IfcImporter: and geometry.verts and self.is_point_far_away((geometry.verts[0], geometry.verts[1], geometry.verts[2])) ): - m = shape.transformation.matrix.data - mat = np.array( - ([m[0], m[3], m[6], m[9]], [m[1], m[4], m[7], m[10]], [m[2], m[5], m[8], m[11]], [0, 0, 0, 1]) - ) - offset_point = np.linalg.inv(mat) @ np.array( + offset_point = np.array( ( float(props.blender_eastings), float(props.blender_northings), @@ -1924,6 +1920,12 @@ class IfcImporter: 0.0, ) ) + if geometry != shape: + m = shape.transformation.matrix.data + mat = np.array( + ([m[0], m[3], m[6], m[9]], [m[1], m[4], m[7], m[10]], [m[2], m[5], m[8], m[11]], [0, 0, 0, 1]) + ) + offset_point = np.linalg.inv(mat) @ offset_point verts = [None] * len(geometry.verts) for i in range(0, len(geometry.verts), 3): verts[i], verts[i + 1], verts[i + 2] = ifcopenshell.util.geolocation.enh2xyz( From e7eb00eaa3a82816b4e1afb493bf60d0f01572f4 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 10 May 2024 23:28:37 +1000 Subject: [PATCH 145/429] See #4652. Fix bug where auto-detection of a false origin could be incorrect We were incorrectly multiplying a shape matrix in SI units with a vertex in project units. We also didn't do a final check whether or not that final resultant coordinate was far away or not (for example, origin and vertex can cancel each other out) --- src/blenderbim/blenderbim/bim/import_ifc.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 369c0812d3..d58a97108b 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -702,15 +702,17 @@ class IfcImporter: mat = np.array( ([m[0], m[3], m[6], m[9]], [m[1], m[4], m[7], m[10]], [m[2], m[5], m[8], m[11]], [0, 0, 0, 1]) ) - point = np.array( + point = mat @ np.array( ( - shape.geometry.verts[0] / self.unit_scale, - shape.geometry.verts[1] / self.unit_scale, - shape.geometry.verts[2] / self.unit_scale, + shape.geometry.verts[0], + shape.geometry.verts[1], + shape.geometry.verts[2], 0.0, ) ) - return mat @ point + point = point / self.unit_scale + if self.is_point_far_away(point, is_meters=False): + return point def does_element_likely_have_geometry_far_away(self, element): for representation in element.Representation.Representations: @@ -1500,10 +1502,9 @@ class IfcImporter: project_collection = bpy.context.view_layer.layer_collection.children[self.project["blender"].name] types_collection = project_collection.children[self.type_collection.name] types_collection.hide_viewport = False - for obj in types_collection.collection.objects: #turn off all objects inside Types collection. + for obj in types_collection.collection.objects: # turn off all objects inside Types collection. obj.hide_set(True) - def clean_mesh(self): obj = None last_obj = None From c50d1ea2fe65247232dc7eab601d431fdd4b22d0 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 10 May 2024 11:21:53 +0500 Subject: [PATCH 146/429] typing --- .../ifcopenshell/api/project/append_asset.py | 8 ++++++- .../ifcopenshell/api/pset/add_pset.py | 3 ++- .../ifcopenshell/api/pset/add_qto.py | 2 +- .../ifcopenshell/api/pset/edit_qto.py | 11 ++++++++-- .../ifcopenshell/api/pset/remove_pset.py | 4 +++- .../api/pset_template/add_prop_template.py | 15 ++++++------- .../api/pset_template/add_pset_template.py | 10 ++++----- .../api/pset_template/edit_prop_template.py | 10 ++++++--- .../api/pset_template/edit_pset_template.py | 10 ++++++--- .../api/pset_template/remove_prop_template.py | 2 +- .../api/pset_template/remove_pset_template.py | 2 +- .../ifcopenshell/api/resource/add_resource.py | 15 ++++++------- .../api/resource/add_resource_quantity.py | 5 ++++- .../api/resource/add_resource_time.py | 2 +- .../api/resource/assign_resource.py | 8 +++++-- .../api/resource/calculate_resource_usage.py | 3 ++- .../api/resource/calculate_resource_work.py | 3 ++- .../api/resource/edit_resource.py | 8 ++++--- .../api/resource/edit_resource_quantity.py | 10 ++++++--- .../api/resource/edit_resource_time.py | 9 +++++--- .../api/resource/remove_resource.py | 2 +- .../api/resource/remove_resource_quantity.py | 2 +- .../api/resource/unassign_resource.py | 11 ++++++---- .../ifcopenshell/api/root/copy_class.py | 4 +++- .../ifcopenshell/api/root/reassign_class.py | 11 +++++----- .../ifcopenshell/api/sequence/add_task.py | 21 ++++++++++--------- .../api/sequence/add_task_time.py | 5 ++++- .../api/sequence/add_time_period.py | 10 +++++++-- .../api/sequence/add_work_calendar.py | 4 +++- .../api/sequence/add_work_plan.py | 11 ++++++++-- .../api/sequence/add_work_schedule.py | 15 +++++++------ .../api/sequence/add_work_time.py | 5 ++++- .../api/sequence/assign_lag_time.py | 5 ++++- .../api/sequence/assign_process.py | 6 +++++- .../api/sequence/assign_product.py | 8 +++++-- .../api/sequence/assign_recurrence_pattern.py | 5 ++++- .../api/sequence/assign_sequence.py | 10 ++++----- .../api/sequence/assign_workplan.py | 4 +++- .../api/sequence/calculate_task_duration.py | 2 +- .../api/sequence/cascade_schedule.py | 2 +- .../api/sequence/create_baseline.py | 11 ++++++++-- .../api/sequence/duplicate_task.py | 2 +- .../api/sequence/edit_lag_time.py | 7 ++++--- .../api/sequence/edit_recurrence_pattern.py | 9 +++++--- .../api/sequence/edit_sequence.py | 9 +++++--- .../ifcopenshell/api/sequence/edit_task.py | 6 ++++-- .../api/sequence/edit_task_time.py | 8 +++---- .../api/sequence/edit_work_calendar.py | 10 ++++++--- .../api/sequence/edit_work_plan.py | 9 +++++--- .../api/sequence/edit_work_schedule.py | 9 +++++--- .../api/sequence/edit_work_time.py | 8 +++---- .../api/sequence/recalculate_schedule.py | 2 +- .../ifcopenshell/api/sequence/remove_task.py | 2 +- .../api/sequence/remove_time_period.py | 2 +- .../api/sequence/remove_work_calendar.py | 3 ++- .../api/sequence/remove_work_plan.py | 2 +- .../api/sequence/remove_work_schedule.py | 2 +- .../api/sequence/remove_work_time.py | 3 ++- .../api/sequence/unassign_lag_time.py | 2 +- .../api/sequence/unassign_process.py | 6 +++++- .../api/sequence/unassign_product.py | 6 +++++- .../sequence/unassign_recurrence_pattern.py | 3 ++- .../api/sequence/unassign_sequence.py | 6 +++++- .../api/structural/add_structural_activity.py | 13 ++++++------ .../add_structural_analysis_model.py | 4 +--- .../add_structural_boundary_condition.py | 13 ++++++++++-- .../api/structural/add_structural_load.py | 12 +++++------ .../structural/add_structural_load_case.py | 15 ++++++------- .../structural/add_structural_load_group.py | 15 ++++++------- .../add_structural_member_connection.py | 8 +++++-- .../assign_structural_analysis_model.py | 7 ++++++- .../edit_structural_analysis_model.py | 8 +++++-- .../edit_structural_boundary_condition.py | 10 ++++++--- .../edit_structural_connection_cs.py | 20 +++++++++++------- .../structural/edit_structural_item_axis.py | 13 ++++++++---- .../api/structural/edit_structural_load.py | 8 +++++-- .../structural/edit_structural_load_case.py | 8 +++++-- .../remove_structural_analysis_model.py | 4 +++- .../remove_structural_boundary_condition.py | 10 +++++++-- .../remove_structural_connection_condition.py | 2 +- .../api/structural/remove_structural_load.py | 3 ++- .../structural/remove_structural_load_case.py | 2 +- .../remove_structural_load_group.py | 2 +- .../unassign_structural_analysis_model.py | 6 +++++- .../ifcopenshell/api/style/add_style.py | 14 +++++++++---- .../api/style/add_surface_style.py | 8 ++++++- .../api/style/add_surface_textures.py | 19 +++++++++++++---- .../api/style/assign_material_style.py | 6 +++++- .../api/style/assign_representation_styles.py | 15 ++++++------- .../api/style/edit_presentation_style.py | 8 +++++-- .../api/style/edit_surface_style.py | 8 +++++-- .../ifcopenshell/api/style/remove_style.py | 4 ++-- .../api/style/remove_styled_representation.py | 3 ++- .../api/style/remove_surface_style.py | 2 +- .../api/style/unassign_material_style.py | 9 +++++++- .../style/unassign_representation_styles.py | 6 +++++- .../ifcopenshell/api/system/add_port.py | 5 +++-- .../api/system/assign_flow_control.py | 7 ++++++- .../ifcopenshell/api/system/assign_port.py | 8 ++++--- .../ifcopenshell/api/system/connect_port.py | 11 ++++++++-- .../api/system/disconnect_port.py | 2 +- .../ifcopenshell/api/system/edit_system.py | 6 ++++-- .../ifcopenshell/api/system/remove_system.py | 2 +- .../api/system/unassign_flow_control.py | 12 ++++++----- .../ifcopenshell/api/system/unassign_port.py | 5 ++++- 105 files changed, 502 insertions(+), 251 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py index fc101347ee..60e0a134f9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py @@ -19,9 +19,15 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.api.owner.settings +from typing import Optional -def append_asset(file, library=None, element=None, reuse_identities=None) -> None: +def append_asset( + file: ifcopenshell.file, + library: ifcopenshell.file, + element: ifcopenshell.entity_instance, + reuse_identities: Optional[dict[int, ifcopenshell.entity_instance]] = None, +) -> ifcopenshell.entity_instance: """Appends an asset from a library into the active project A BIM library asset may be a type product (e.g. wall type), product diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py index edc1bf5ac6..835bd83d75 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py @@ -17,10 +17,11 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.api import ifcopenshell.guid -def add_pset(file, product=None, name=None) -> None: +def add_pset(file: ifcopenshell.file, product: ifcopenshell.entity_instance, name: str) -> ifcopenshell.entity_instance: """Adds a new property set to a product Products, such as physical objects or types in IFC may have properties diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py index b105179385..f7bcd66d2f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_qto.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.guid -def add_qto(file, product=None, name=None) -> None: +def add_qto(file: ifcopenshell.file, product: ifcopenshell.entity_instance, name: str) -> ifcopenshell.entity_instance: """Adds a new quantity set to a product Products, such as physical objects or types in IFC may have quantities diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py index ba5b7c93e0..e1bd928101 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_qto.py @@ -18,9 +18,16 @@ import ifcopenshell import ifcopenshell.util.pset +from typing import Optional, Any -def edit_qto(file, qto=None, name=None, properties=None, pset_template=None) -> None: +def edit_qto( + file: ifcopenshell.file, + qto: ifcopenshell.entity_instance, + name: Optional[str] = None, + properties: Optional[dict[str, Any]] = None, + pset_template: Optional[ifcopenshell.entity_instance] = None, +) -> None: """Edits a quantity set and its quantities At its simplest usage, this may be used to edit the name of a quantity @@ -50,7 +57,7 @@ def edit_qto(file, qto=None, name=None, properties=None, pset_template=None) -> :param pset_template: If a quantity set template is provided, this will be used to determine data types. If no user-defined template is provided, the built-in buildingSMART templates will be loaded. - :type pset_template: ifcopenshell.entity_instance + :type pset_template: ifcopenshell.entity_instance, optional :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py index 50ef427bb4..b6302bb4b1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/remove_pset.py @@ -20,7 +20,9 @@ import ifcopenshell import ifcopenshell.util.element -def remove_pset(file, product=None, pset=None) -> None: +def remove_pset( + file: ifcopenshell.file, product: ifcopenshell.entity_instance, pset: ifcopenshell.entity_instance +) -> None: """Removes a property set from a product All properties that are part of this property set are also removed. diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py index 2fbfb4a5c6..360b086cab 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_prop_template.py @@ -18,16 +18,17 @@ import ifcopenshell import ifcopenshell.guid +from typing import Optional def add_prop_template( - file, - pset_template=None, - name="NewProperty", - description=None, - template_type="P_SINGLEVALUE", - primary_measure_type="IfcLabel", -) -> None: + file: ifcopenshell.file, + pset_template: ifcopenshell.entity_instance, + name: str = "NewProperty", + description: Optional[str] = None, + template_type: str = "P_SINGLEVALUE", + primary_measure_type: str = "IfcLabel", +) -> ifcopenshell.entity_instance: """Adds new property templates to a property set template Assuming you first have a property set template, this allows you to add diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py index 05dee01a45..e382a3a34d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/add_pset_template.py @@ -21,11 +21,11 @@ import ifcopenshell.guid def add_pset_template( - file, - name="New_Pset", - template_type="PSET_TYPEDRIVENOVERRIDE", - applicable_entity="IfcObject,IfcTypeObject", -) -> None: + file: ifcopenshell.file, + name: str = "New_Pset", + template_type: str = "PSET_TYPEDRIVENOVERRIDE", + applicable_entity: str = "IfcObject,IfcTypeObject", +) -> ifcopenshell.entity_instance: """Adds a new property set template This creates a new template for property sets. A template defines what diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py index dcc6c9b3ae..7a6d33990b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_prop_template(file, prop_template=None, attributes=None) -> None: +def edit_prop_template( + file: ifcopenshell.file, prop_template: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcSimplePropertyTemplate For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_prop_template(file, prop_template=None, attributes=None) -> None: :param prop_template: The IfcSimplePropertyTemplate entity you want to edit :type prop_template: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -43,7 +47,7 @@ def edit_prop_template(file, prop_template=None, attributes=None) -> None: ifcopenshell.api.run("pset_template.edit_prop_template", model, prop_template=prop, attributes={"Name": "DemoA", "PrimaryMeasureType": "IfcLengthMeasure"}) """ - settings = {"prop_template": prop_template, "attributes": attributes or {}} + settings = {"prop_template": prop_template, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["prop_template"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py index 8a0581efdc..6e71d182a5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_pset_template.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_pset_template(file, pset_template=None, attributes=None) -> None: +def edit_pset_template( + file: ifcopenshell.file, pset_template: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcPropertySetTemplate For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_pset_template(file, pset_template=None, attributes=None) -> None: :param pset_template: The IfcPropertySetTemplate entity you want to edit :type pset_template: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -41,7 +45,7 @@ def edit_pset_template(file, pset_template=None, attributes=None) -> None: ifcopenshell.api.run("pset_template.edit_pset_template", model, pset_template=template, attributes={"Name": "ABC_RiskFactors"}) """ - settings = {"pset_template": pset_template, "attributes": attributes or {}} + settings = {"pset_template": pset_template, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["pset_template"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py index 7a247ac383..d5986af02c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_prop_template.py @@ -19,7 +19,7 @@ import ifcopenshell.util.element -def remove_prop_template(file, prop_template=None) -> None: +def remove_prop_template(file: ifcopenshell.file, prop_template: ifcopenshell.entity_instance) -> None: """Removes a property template Note that a property set template should always have at least one diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py index c567a55033..a1731ac5e1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py @@ -19,7 +19,7 @@ import ifcopenshell.util.element -def remove_pset_template(file, pset_template=None) -> None: +def remove_pset_template(file: ifcopenshell.file, pset_template: ifcopenshell.entity_instance) -> None: """Removes a property set template All property templates within the property set template are also removed diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py index e2a1dab308..8131bed326 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py @@ -17,15 +17,16 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +from typing import Optional def add_resource( - file, - parent_resource=None, - ifc_class="IfcCrewResource", - name=None, - predefined_type="NOTDEFINED", -) -> None: + file: ifcopenshell.file, + parent_resource: Optional[ifcopenshell.entity_instance] = None, + ifc_class: str = "IfcCrewResource", + name: Optional[str] = None, + predefined_type: str = "NOTDEFINED", +) -> ifcopenshell.entity_instance: """Add a new construction resource Construction resources may be managed and connected to cost schedules @@ -48,7 +49,7 @@ def add_resource( :param parent_resource: If this is a child resource (typically to a crew resource), then nominate the parent IfcConstructionResource here. - :type parent_resource: ifcopenshell.entity_instance + :type parent_resource: ifcopenshell.entity_instance, optional :param ifc_class: The class of resource chosen from IfcConstructionEquipmentResource, IfcConstructionMaterialResource, IfcConstructionProductResource, IfcCrewResource, IfcLaborResource, diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py index 6600a06ae2..5bba6b3ae1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py @@ -19,7 +19,9 @@ import ifcopenshell.util.element -def add_resource_quantity(file, resource=None, ifc_class="IfcQuantityCount") -> None: +def add_resource_quantity( + file: ifcopenshell.file, resource: ifcopenshell.entity_instance, ifc_class: str = "IfcQuantityCount" +) -> ifcopenshell.entity_instance: """Adds a quantity to a resource The quantity of a resource represents the "unit quantity" of that @@ -65,6 +67,7 @@ def add_resource_quantity(file, resource=None, ifc_class="IfcQuantityCount") -> settings = {"resource": resource, "ifc_class": ifc_class} quantity = file.create_entity(settings["ifc_class"], Name="Unnamed") + # 3 IfcPhysicalSimpleQuantity Value quantity[3] = 0.0 old_quantity = settings["resource"].BaseQuantity settings["resource"].BaseQuantity = quantity diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py index 3066441330..10c9ad27fa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py @@ -19,7 +19,7 @@ import ifcopenshell.util.date -def add_resource_time(file, resource=None) -> None: +def add_resource_time(file: ifcopenshell.file, resource: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: """Adds the time that a resource is used for For labour and equipment resources, the total duration that the resource diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py index eaf49505c0..e86d02cc4f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/assign_resource.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.guid -def assign_resource(file, relating_resource=None, related_object=None) -> None: +def assign_resource( + file: ifcopenshell.file, + relating_resource: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> ifcopenshell.entity_instance: """Assigns a resource to an object Two types of objects are typically assigned to resources: products and @@ -89,7 +93,7 @@ def assign_resource(file, relating_resource=None, related_object=None) -> None: assignment.is_a("IfclRelAssignsToResource") and assignment.RelatingResource == settings["relating_resource"] ): - return + return assignment resource_of = None if settings["relating_resource"].ResourceOf: diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py index fc63b2d9d4..0a68a83df4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_usage.py @@ -18,12 +18,13 @@ import math import ifcopenshell.api +import ifcopenshell.util.constraint import ifcopenshell.util.date import ifcopenshell.util.element import ifcopenshell.util.resource -def calculate_resource_usage(file, resource=None) -> None: +def calculate_resource_usage(file: ifcopenshell.file, resource: ifcopenshell.entity_instance) -> None: """Calculates the number of resources required to perform scheduled work on a task.""" settings = {"resource": resource} diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py index dd5621d386..3bb6fe4cd4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py @@ -18,12 +18,13 @@ import math import ifcopenshell.api +import ifcopenshell.util.constraint import ifcopenshell.util.date import ifcopenshell.util.element import ifcopenshell.util.resource -def calculate_resource_work(file, resource=None) -> None: +def calculate_resource_work(file: ifcopenshell.file, resource: ifcopenshell.entity_instance) -> None: """Calculates the work that a resource is used for This is an unofficial parametric calculation that may be done on a diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py index 2ab8ac669a..6ec4ed0b1a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_resource(file, resource=None, attributes=None) -> None: +def edit_resource(file: ifcopenshell.file, resource: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcResource For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_resource(file, resource=None, attributes=None) -> None: :param resource: The IfcResource entity you want to edit :type resource: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -40,7 +42,7 @@ def edit_resource(file, resource=None, attributes=None) -> None: # Change the name of the resource to "Zone A Crew" ifcopenshell.api.run("resource.edit_resource", model, resource=resource, attributes={"Name": "Foo"}) """ - settings = {"resource": resource, "attributes": attributes or {}} + settings = {"resource": resource, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["resource"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py index b4d016c7ad..3a4e754c6b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_quantity.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_resource_quantity(file, physical_quantity=None, attributes=None) -> None: +def edit_resource_quantity( + file: ifcopenshell.file, physical_quantity: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IFC quantity For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_resource_quantity(file, physical_quantity=None, attributes=None) -> Non :param physical_quantity: The IfC quantity entity you want to edit :type physical_quantity: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -51,7 +55,7 @@ def edit_resource_quantity(file, physical_quantity=None, attributes=None) -> Non """ settings = { "physical_quantity": physical_quantity, - "attributes": attributes or {}, + "attributes": attributes, } for name, value in settings["attributes"].items(): diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py index 9ec41a60c5..ad03df0908 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/edit_resource_time.py @@ -18,9 +18,12 @@ import datetime import ifcopenshell +from typing import Any -def edit_resource_time(file, resource_time=None, attributes=None) -> None: +def edit_resource_time( + file: ifcopenshell.file, resource_time: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcResourceTime For more information about the attributes and data types of an @@ -29,7 +32,7 @@ def edit_resource_time(file, resource_time=None, attributes=None) -> None: :param resource_time: The IfcResourceTime entity you want to edit :type resource_time: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -59,7 +62,7 @@ def edit_resource_time(file, resource_time=None, attributes=None) -> None: """ usecase = Usecase() usecase.file = file - usecase.settings = {"resource_time": resource_time, "attributes": attributes or {}} + usecase.settings = {"resource_time": resource_time, "attributes": attributes} return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py index cfbdd25fd9..e5356a9dd9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_resource(file, resource=None) -> None: +def remove_resource(file: ifcopenshell.file, resource: ifcopenshell.entity_instance) -> None: """Removes a resource and all relationships Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py index 221d94c5a6..9b173f689f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource_quantity.py @@ -19,7 +19,7 @@ import ifcopenshell.util.element -def remove_resource_quantity(file, resource=None) -> None: +def remove_resource_quantity(file: ifcopenshell.file, resource: ifcopenshell.entity_instance) -> None: """Removes the base quantity of a resource Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py index 7b1a59f519..93a8caff93 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/unassign_resource.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.util.element -def unassign_resource(file, relating_resource=None, related_object=None) -> None: +def unassign_resource( + file: ifcopenshell.file, + relating_resource: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> None: """Removes the relationship between a resource and object :param relating_resource: The IfcResource to assign the object to. @@ -29,8 +33,8 @@ def unassign_resource(file, relating_resource=None, related_object=None) -> None :param related_object: The IfcProduct or IfcActor to assign to the object. :type related_object: ifcopenshell.entity_instance - :return: The newly created IfcRelAssignsToResource - :rtype: ifcopenshell.entity_instance + :return: None + :rtype: None Example: @@ -74,4 +78,3 @@ def unassign_resource(file, relating_resource=None, related_object=None) -> None related_objects.remove(settings["related_object"]) rel.RelatedObjects = related_objects ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) - return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py b/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py index 976010c3c3..1c49f178fd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/copy_class.py @@ -17,11 +17,13 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.api import ifcopenshell.util.system import ifcopenshell.util.element +import ifcopenshell.util.placement -def copy_class(file, product=None) -> None: +def copy_class(file: ifcopenshell.file, product: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: """Copies a product The following relationships are also duplicated: diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py b/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py index c124786a83..9bf29a0306 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/reassign_class.py @@ -20,14 +20,15 @@ import ifcopenshell import ifcopenshell.util.type import ifcopenshell.util.schema import ifcopenshell.util.element +from typing import Optional def reassign_class( - file, - product=None, - ifc_class="IfcBuildingElementProxy", - predefined_type=None, -) -> None: + file: ifcopenshell.file, + product: ifcopenshell.entity_instance, + ifc_class: str = "IfcBuildingElementProxy", + predefined_type: Optional[str] = None, +) -> ifcopenshell.entity_instance: """Changes the class of a product If you ever created a wall then realised it's meant to be something diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py index 50ab4f58dc..6fd08d4b1d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py @@ -19,17 +19,18 @@ import ifcopenshell.api import ifcopenshell import ifcopenshell.guid +from typing import Optional def add_task( - file, - work_schedule=None, - parent_task=None, - name=None, - description=None, - identification=None, - predefined_type="NOTDEFINED", -) -> None: + file: ifcopenshell.file, + work_schedule: Optional[ifcopenshell.entity_instance] = None, + parent_task: Optional[ifcopenshell.entity_instance] = None, + name: Optional[str] = None, + description: Optional[str] = None, + identification: Optional[str] = None, + predefined_type: str = "NOTDEFINED", +) -> ifcopenshell.entity_instance: """Adds a new task Tasks are typically used for two purposes: construction scheduling and @@ -66,11 +67,11 @@ def add_task( :param work_schedule: The work schedule to group the task in, if the task is to be a top-level or root task. This is mutually exclusive with the parent_task parameter. - :type work_schedule: ifcopenshell.entity_instance + :type work_schedule: ifcopenshell.entity_instance, optional :param parent_task: The parent task, if the task is to be a subtask or child task. This is mutually exclusive with the work_schedule parameter. - :type parent_task: ifcopenshell.entity_instance + :type parent_task: ifcopenshell.entity_instance, optioanl :param name: The name of the task. :type name: str,optional :param description: The description of the task. diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py index bbd51c2e68..1e755ed6cf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task_time.py @@ -15,9 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_task_time(file, task=None, is_recurring=False) -> None: +def add_task_time( + file: ifcopenshell.file, task: ifcopenshell.entity_instance, is_recurring: bool = False +) -> ifcopenshell.entity_instance: """Adds a task time to a task Some tasks, such as activities within a work breakdown structure or diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py index 479524a4b1..26db76c70c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_time_period.py @@ -19,11 +19,17 @@ import ifcopenshell.api import ifcopenshell.util.date import ifcopenshell.util.sequence -from datetime import datetime +from datetime import datetime, time from datetime import timedelta +from typing import Optional, Union -def add_time_period(file, recurrence_pattern=None, start_time=None, end_time=None) -> None: +def add_time_period( + file: ifcopenshell.file, + recurrence_pattern: ifcopenshell.entity_instance, + start_time: Optional[Union[str, time]] = None, + end_time: Optional[Union[str, time]] = None, +) -> ifcopenshell.entity_instance: """Adds a time period to a recurrence pattern A recurring time may be an all-day event, or only during certain time diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py index 250a1b2fe0..97d06983eb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_calendar.py @@ -19,7 +19,9 @@ import ifcopenshell.api -def add_work_calendar(file, name="Unnamed", predefined_type="NOTDEFINED") -> None: +def add_work_calendar( + file: ifcopenshell.file, name: str = "Unnamed", predefined_type: str = "NOTDEFINED" +) -> ifcopenshell.entity_instance: """Add a work calendar A work calendar defines when work is allowed to occur and when the diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py index 858d944d66..87d01a7dfb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_plan.py @@ -17,11 +17,18 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +import ifcopenshell.api.owner.settings import ifcopenshell.util.date -from datetime import datetime +from datetime import datetime, time +from typing import Optional, Union -def add_work_plan(file, name=None, predefined_type="NOTDEFINED", start_time=None) -> None: +def add_work_plan( + file: ifcopenshell.file, + name: Optional[str] = None, + predefined_type: str = "NOTDEFINED", + start_time: Optional[Union[str, time]] = None, +) -> ifcopenshell.entity_instance: """Add a new work plan A work plan is a group of work schedules. Since work schedules may have diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py index 21f508999c..3fe8e1a003 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py @@ -17,18 +17,21 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +import ifcopenshell.api.owner.settings import ifcopenshell.util.date +from datetime import time from datetime import datetime +from typing import Union, Optional def add_work_schedule( - file, - name="Unnamed", - predefined_type="NOTDEFINED", + file: ifcopenshell.file, + name: str = "Unnamed", + predefined_type: str = "NOTDEFINED", object_type=None, - start_time=None, - work_plan=None, -) -> None: + start_time: Optional[Union[str, time]] = None, + work_plan: Optional[ifcopenshell.entity_instance] = None, +) -> ifcopenshell.entity_instance: """Add a new work schedule A work schedule is a group of tasks, where the tasks are typically diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py index 86d4666ad9..282f402e0c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_time.py @@ -15,9 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_work_time(file, work_calendar=None, time_type="WorkingTimes") -> None: +def add_work_time( + file: ifcopenshell.file, work_calendar: ifcopenshell.entity_instance, time_type: str = "WorkingTimes" +) -> ifcopenshell.entity_instance: """Add either working times or holiday times to a calendar A calendar defines when work occurs by defining working times and diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py index 0ba89d0346..c3986834d6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_lag_time.py @@ -19,7 +19,9 @@ import ifcopenshell.util.date -def assign_lag_time(file, rel_sequence=None, lag_value=None, duration_type="WORKTIME") -> None: +def assign_lag_time( + file: ifcopenshell.file, rel_sequence: ifcopenshell.entity_instance, lag_value: str, duration_type: str = "WORKTIME" +) -> ifcopenshell.entity_instance: """Assign a lag time to a sequence relationship between tasks A task sequence (e.g. finish to start) may optionally have a lag time @@ -94,3 +96,4 @@ def assign_lag_time(file, rel_sequence=None, lag_value=None, duration_type="WORK if settings["rel_sequence"].TimeLag and len(file.get_inverse(settings["rel_sequence"].TimeLag)) == 1: file.remove(settings["rel_sequence"].TimeLag) settings["rel_sequence"].TimeLag = lag_time + return lag_time diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py index a5241b530a..9203d4b4fa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_process.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.guid -def assign_process(file, relating_process=None, related_object=None) -> None: +def assign_process( + file: ifcopenshell.file, + relating_process: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> ifcopenshell.entity_instance: """Assigns an object to be related to a process, typically a construction task Processes work using the ICOM (Input, Controls, Outputs, Mechanisms) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py index f20c5d5e32..e492707c44 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.guid -def assign_product(file, relating_product=None, related_object=None) -> None: +def assign_product( + file: ifcopenshell.entity_instance, + relating_product: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> ifcopenshell.entity_instance: """Assigns a product to be produced as a result of a process A construction task may result in products (e.g. a wall) being @@ -71,7 +75,7 @@ def assign_product(file, relating_product=None, related_object=None) -> None: if settings["related_object"].HasAssignments: for assignment in settings["related_object"].HasAssignments: if assignment.is_a("IfcRelAssignsToProduct") and assignment.RelatingProduct == settings["relating_product"]: - return + return assignment referenced_by = None if settings["relating_product"].ReferencedBy: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py index 177d90fb8d..0ae92e66aa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_recurrence_pattern.py @@ -15,9 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def assign_recurrence_pattern(file, parent=None, recurrence_type="WEEKLY") -> None: +def assign_recurrence_pattern( + file: ifcopenshell.file, parent: ifcopenshell.entity_instance, recurrence_type: str = "WEEKLY" +) -> ifcopenshell.entity_instance: """Define a time to recur at a particular interval There are two scenarios where you might want to define a recurring time diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py index 257a1e16d8..338a03ceed 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_sequence.py @@ -22,11 +22,11 @@ import ifcopenshell.guid def assign_sequence( - file, - relating_process=None, - related_process=None, - sequence_type="FINISH_START", -) -> None: + file: ifcopenshell.file, + relating_process: ifcopenshell.entity_instance, + related_process: ifcopenshell.entity_instance, + sequence_type: str = "FINISH_START", +) -> ifcopenshell.entity_instance: """Assign a sequential relationship between tasks Tasks in construction sequencing typically have sequence relationships diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py index 634f2af494..e2ed6b7c00 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py @@ -20,7 +20,9 @@ import ifcopenshell import ifcopenshell.api -def assign_workplan(file, work_schedule=None, work_plan=None) -> None: +def assign_workplan( + file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance, work_plan: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: """Assigns a work schedule to a work plan Typically, work schedules would be assigned to a work plan at creation. diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py index 22c9ec7dda..95dd1a652b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py @@ -22,7 +22,7 @@ import ifcopenshell.util.date import ifcopenshell.util.element -def calculate_task_duration(file, task=None) -> None: +def calculate_task_duration(file: ifcopenshell.file, task: ifcopenshell.entity_instance) -> None: """Calculates the task duration based on resource usage If a task has labour or equipment resources assigned to it, its duration diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py index 0a2aea7190..22207d4622 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/cascade_schedule.py @@ -21,7 +21,7 @@ import ifcopenshell.util.date import ifcopenshell.util.sequence -def cascade_schedule(file, task=None) -> None: +def cascade_schedule(file: ifcopenshell.file, task: ifcopenshell.entity_instance) -> None: """Cascades start and end dates of tasks based on durations Given a start task with a start date and duration, the end date, and the diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py index f45d303500..8a7439de89 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/create_baseline.py @@ -17,12 +17,17 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.api import ifcopenshell.guid -import ifcopenshell.util.system import ifcopenshell.util.element +import ifcopenshell.util.sequence +import ifcopenshell.util.system +from typing import Optional -def create_baseline(file, work_schedule=None, name=None) -> None: +def create_baseline( + file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance, name: Optional[str] = None +) -> None: """Creates a baseline for your Work Schedule Using a IfcWorkSchdule having PredefinedType=PLANNED, @@ -38,6 +43,8 @@ def create_baseline(file, work_schedule=None, name=None) -> None: :param work_schedule: The planned work_schedule to baseline :type work_schedule: ifcopenshell.entity_instance + :param name: baseline work schedule name + :type name: str, optional :return: The baseline work_schedule :rtype: ifcopenshell.entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py index 5578cf57f7..0861c1bd19 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/duplicate_task.py @@ -23,7 +23,7 @@ import ifcopenshell.util.element import ifcopenshell.util.sequence -def duplicate_task(file, task=None) -> None: +def duplicate_task(file: ifcopenshell.file, task: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: """Duplicates a task in the project The following relationships are also duplicated: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py index 4b77daf9e8..89d042ed40 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_lag_time.py @@ -18,9 +18,10 @@ import ifcopenshell.api import ifcopenshell.util.date +from typing import Any -def edit_lag_time(file, lag_time=None, attributes=None) -> None: +def edit_lag_time(file: ifcopenshell.file, lag_time: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcLagTime For more information about the attributes and data types of an @@ -29,7 +30,7 @@ def edit_lag_time(file, lag_time=None, attributes=None) -> None: :param lag_time: The IfcLagTime entity you want to edit :type lag_time: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -74,7 +75,7 @@ def edit_lag_time(file, lag_time=None, attributes=None) -> None: # Or, let's make it 2 days instead. ifcopenshell.api.run("sequence.edit_lag_time", model, lag_time=lag, attributes={"LagValue": "P2D"}) """ - settings = {"lag_time": lag_time, "attributes": attributes or {}} + settings = {"lag_time": lag_time, "attributes": attributes} for name, value in settings["attributes"].items(): if name == "LagValue" and value is not None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py index 2863102b3d..489aa66d6f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_recurrence_pattern.py @@ -18,9 +18,12 @@ import ifcopenshell import ifcopenshell.util.sequence +from typing import Any -def edit_recurrence_pattern(file, recurrence_pattern=None, attributes=None) -> None: +def edit_recurrence_pattern( + file: ifcopenshell.file, recurrence_pattern: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcRecurrencePattern For more information about the attributes and data types of an @@ -29,7 +32,7 @@ def edit_recurrence_pattern(file, recurrence_pattern=None, attributes=None) -> N :param recurrence_pattern: The IfcRecurrencePattern entity you want to edit :type recurrence_pattern: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -54,7 +57,7 @@ def edit_recurrence_pattern(file, recurrence_pattern=None, attributes=None) -> N """ settings = { "recurrence_pattern": recurrence_pattern, - "attributes": attributes or {}, + "attributes": attributes, } for name, value in settings["attributes"].items(): diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py index bcbc521ef3..b83baa9cb2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_sequence.py @@ -18,9 +18,12 @@ import ifcopenshell import ifcopenshell.api +from typing import Any -def edit_sequence(file, rel_sequence=None, attributes=None) -> None: +def edit_sequence( + file: ifcopenshell.file, rel_sequence: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcRelSequence For more information about the attributes and data types of an @@ -29,7 +32,7 @@ def edit_sequence(file, rel_sequence=None, attributes=None) -> None: :param rel_sequence: The IfcRelSequence entity you want to edit :type rel_sequence: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -59,7 +62,7 @@ def edit_sequence(file, rel_sequence=None, attributes=None) -> None: ifcopenshell.api.run("sequence.edit_sequence", model, rel_sequence=sequence, attributes={"SequenceType": "START_START"}) """ - settings = {"rel_sequence": rel_sequence, "attributes": attributes or {}} + settings = {"rel_sequence": rel_sequence, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["rel_sequence"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py index d151926a69..325c6bdce1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_task(file, task=None, attributes=None) -> None: +def edit_task(file: ifcopenshell.file, task: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcTask For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_task(file, task=None, attributes=None) -> None: :param task: The IfcTask entity you want to edit :type task: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py index f81b2b1f90..d0ecfa29d8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_task_time.py @@ -20,13 +20,13 @@ import datetime import ifcopenshell.util.constraint import ifcopenshell.util.date import ifcopenshell.util.sequence -from typing import Any, Optional +from typing import Any def edit_task_time( file: ifcopenshell.file, task_time: ifcopenshell.entity_instance, - attributes: Optional[dict[str, Any]] = None, + attributes: dict[str, Any], ) -> None: """Edits the attributes of an IfcTaskTime @@ -36,7 +36,7 @@ def edit_task_time( :param task_time: The IfcTaskTime entity you want to edit :type task_time: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -59,7 +59,7 @@ def edit_task_time( """ usecase = Usecase() usecase.file = file - usecase.settings = {"task_time": task_time, "attributes": attributes or {}} + usecase.settings = {"task_time": task_time, "attributes": attributes} return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py index 4efb35da84..6bcfcb3fd3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_calendar.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_work_calendar(file, work_calendar=None, attributes=None) -> None: +def edit_work_calendar( + file: ifcopenshell.file, work_calendar: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcWorkCalendar For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_work_calendar(file, work_calendar=None, attributes=None) -> None: :param work_calendar: The IfcWorkCalendar entity you want to edit :type work_calendar: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -41,7 +45,7 @@ def edit_work_calendar(file, work_calendar=None, attributes=None) -> None: ifcopenshell.api.run("sequence.edit_work_calendar", model, work_calendar=calendar, attributes={"Description": "Monday to Friday 8 hour days"}) """ - settings = {"work_calendar": work_calendar, "attributes": attributes or {}} + settings = {"work_calendar": work_calendar, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["work_calendar"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py index e2bbcae33f..a5e96c16bb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_plan.py @@ -17,9 +17,12 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.date +from typing import Any -def edit_work_plan(file, work_plan=None, attributes=None) -> None: +def edit_work_plan( + file: ifcopenshell.file, work_plan: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcWorkPlan For more information about the attributes and data types of an @@ -28,7 +31,7 @@ def edit_work_plan(file, work_plan=None, attributes=None) -> None: :param work_plan: The IfcWorkPlan entity you want to edit :type work_plan: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -43,7 +46,7 @@ def edit_work_plan(file, work_plan=None, attributes=None) -> None: ifcopenshell.api.run("sequence.edit_work_plan", model, work_plan=work_plan, attributes={"Description": "Construction of phase 1"}) """ - settings = {"work_plan": work_plan, "attributes": attributes or {}} + settings = {"work_plan": work_plan, "attributes": attributes} for name, value in settings["attributes"].items(): if value: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py index 49e6b053ac..79ef8b90de 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py @@ -17,9 +17,12 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.date +from typing import Any -def edit_work_schedule(file, work_schedule=None, attributes=None) -> None: +def edit_work_schedule( + file: ifcopenshell.entity_instance, work_schedule: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcWorkSchedule For more information about the attributes and data types of an @@ -28,7 +31,7 @@ def edit_work_schedule(file, work_schedule=None, attributes=None) -> None: :param work_schedule: The IfcWorkSchedule entity you want to edit :type work_schedule: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -47,7 +50,7 @@ def edit_work_schedule(file, work_schedule=None, attributes=None) -> None: ifcopenshell.api.run("sequence.edit_work_schedule", model, work_schedule=work_schedule, attributes={"Description": "3 crane design option"}) """ - settings = {"work_schedule": work_schedule, "attributes": attributes or {}} + settings = {"work_schedule": work_schedule, "attributes": attributes} for name, value in settings["attributes"].items(): if value: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py index ac0a05dad0..5f16eba16a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_time.py @@ -17,13 +17,13 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.date -from typing import Any, Optional +from typing import Any def edit_work_time( file: ifcopenshell.file, work_time: ifcopenshell.entity_instance, - attributes: Optional[dict[str, Any]] = None, + attributes: dict[str, Any], ) -> None: """Edits the attributes of an IfcWorkTime @@ -33,7 +33,7 @@ def edit_work_time( :param work_time: The IfcWorkTime entity you want to edit :type work_time: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -54,7 +54,7 @@ def edit_work_time( ifcopenshell.api.run("sequence.edit_work_time", model, work_time=work_time, attributes={"StartDate": "2000-01-01", "FinishDate": "2000-01-02"}) """ - settings = {"work_time": work_time, "attributes": attributes or {}} + settings = {"work_time": work_time, "attributes": attributes} for name, value in settings["attributes"].items(): if name in ("Start", "StartDate"): diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py index d54bf01579..ab80999339 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py @@ -23,7 +23,7 @@ import ifcopenshell.util.date import ifcopenshell.util.sequence -def recalculate_schedule(file, work_schedule=None) -> None: +def recalculate_schedule(file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance) -> None: """Calculate the critical path and floats for a work schedule This implements critical path analysis, using the forward pass and diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py index d49da8324e..6f388c7921 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_task.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_task(file, task=None) -> None: +def remove_task(file: ifcopenshell.file, task: ifcopenshell.entity_instance) -> None: """Removes a task All subtasks are also removed recursively. Any relationships such as diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py index 672606c421..0102c552dc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_time_period.py @@ -19,7 +19,7 @@ import ifcopenshell.api -def remove_time_period(file, time_period=None) -> None: +def remove_time_period(file: ifcopenshell.file, time_period: ifcopenshell.entity_instance) -> None: """Removes a time period :param time_period: The IfcTimePeriod to remove. diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py index 22a362c42d..10ad55e5dd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_calendar.py @@ -17,10 +17,11 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.api import ifcopenshell.util.element -def remove_work_calendar(file, work_calendar=None) -> None: +def remove_work_calendar(file: ifcopenshell.file, work_calendar: ifcopenshell.entity_instance) -> None: """Removes a work calendar All relationships are also removed, such as if a task is set to use that diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py index 28675fe6a5..22a19e5051 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_work_plan(file, work_plan=None) -> None: +def remove_work_plan(file: ifcopenshell.entity_instance, work_plan: ifcopenshell.entity_instance) -> None: """Removes a work plan Note that schedules that are grouped under the work plan are not diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py index ec06a9146b..c648cfc576 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_work_schedule(file, work_schedule=None) -> None: +def remove_work_schedule(file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance) -> None: """Removes a work schedule All tasks in the work schedule are also removed recursively. diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py index ab4587ce6a..f6914fefbd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_time.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_work_time(file, work_time=None) -> None: +def remove_work_time(file: ifcopenshell.file, work_time: ifcopenshell.entity_instance) -> None: """Removes a work time :param work_time: The IfcWorkTime to remove. diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py index cac8f95372..716bb64b8b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_lag_time.py @@ -19,7 +19,7 @@ import ifcopenshell.api -def unassign_lag_time(file, rel_sequence=None) -> None: +def unassign_lag_time(file: ifcopenshell.file, rel_sequence: ifcopenshell.entity_instance) -> None: """Removes any lag time in a sequence The schedule is cascaded afterwards. diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py index f7e141afc1..08d9b8ab4f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_process.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.util.element -def unassign_process(file, relating_process=None, related_object=None) -> None: +def unassign_process( + file: ifcopenshell.file, + relating_process: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> None: """Unassigns a process and object relationship See ifcopenshell.api.sequence.assign_process for details. diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py index 23f9281c95..4dc4ee4845 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_product.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.util.element -def unassign_product(file, relating_product=None, related_object=None) -> None: +def unassign_product( + file: ifcopenshell.file, + relating_product: ifcopenshell.entity_instance, + related_object: ifcopenshell.entity_instance, +) -> None: """Unassigns a product and object relationship See ifcopenshell.api.sequence.assign_product for details. diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py index 46c99207f5..0ce5fae546 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_recurrence_pattern.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def unassign_recurrence_pattern(file, recurrence_pattern=None) -> None: +def unassign_recurrence_pattern(file: ifcopenshell.file, recurrence_pattern: ifcopenshell.entity_instance) -> None: """Unassigns a recurrence pattern Note that a recurring task time must have a recurrence pattern, so if diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py index f10b11f893..277dfc67ee 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/unassign_sequence.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.util.element -def unassign_sequence(file, relating_process=None, related_process=None) -> None: +def unassign_sequence( + file: ifcopenshell.file, + relating_process: ifcopenshell.entity_instance, + related_process: ifcopenshell.entity_instance, +) -> None: """Removes a sequence relationship between tasks :param relating_process: The previous / predecessor task. diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py index 4be210fcf1..7680dfd90d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_activity.py @@ -17,15 +17,16 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +from typing import Literal def add_structural_activity( - file, - ifc_class="IfcStructuralPlanarAction", - predefined_type="CONST", - global_or_local="GLOBAL_COORDS", - applied_load=None, - structural_member=None, + file: ifcopenshell.file, + applied_load: ifcopenshell.entity_instance, + structural_member: ifcopenshell.entity_instance, + ifc_class: str = "IfcStructuralPlanarAction", + predefined_type: str = "CONST", + global_or_local: Literal["GLOBAL_COORDS", "LOCAL_COORDS"] = "GLOBAL_COORDS", ) -> None: """Adds a new structural activity diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py index 837fd29cce..ca6f3e2b52 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_analysis_model.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.api -def add_structural_analysis_model(file) -> None: +def add_structural_analysis_model(file: ifcopenshell.file) -> ifcopenshell.entity_instance: """Add a new structural analysis model A structural analysis model is a group of all the loads, reactions, @@ -39,8 +39,6 @@ def add_structural_analysis_model(file) -> None: # Create a fresh blank structural analysis analysis = ifcopenshell.api.run("structural.add_structural_analysis_model", model) """ - settings = {} - return ifcopenshell.api.run( "root.create_entity", file, ifc_class="IfcStructuralAnalysisModel", predefined_type="LOADING_3D" ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py index 5aef16efed..fa88d76b57 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_boundary_condition.py @@ -15,9 +15,16 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional -def add_structural_boundary_condition(file, name=None, connection=None, ifc_class="IfcBoundaryNodeCondition") -> None: +def add_structural_boundary_condition( + file: ifcopenshell.file, + name: Optional[str] = None, + connection: Optional[ifcopenshell.entity_instance] = None, + ifc_class: str = "IfcBoundaryNodeCondition", +) -> ifcopenshell.entity_instance: """Adds a new structural boundary condition to a structural connection The type of boundary condition depends on the connection. Point @@ -60,7 +67,9 @@ def add_structural_boundary_condition(file, name=None, connection=None, ifc_clas elif related_connection.is_a("IfcStructuralSurfaceConnection"): boundary_class = "IfcBoundaryFaceCondition" - settings["connection"].AppliedCondition = file.create_entity(boundary_class, Name=settings["name"]) + condition = file.create_entity(boundary_class, Name=settings["name"]) + settings["connection"].AppliedCondition = condition + return condition else: # add an orphan boundary condition return file.create_entity(settings["ifc_class"], Name=settings["name"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py index 3cb06cd513..d996a84c86 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load.py @@ -17,9 +17,12 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +from typing import Optional -def add_structural_load(file, name=None, ifc_class="IfcStructuralLoadLinearForce") -> None: +def add_structural_load( + file: ifcopenshell.file, name: Optional[str] = None, ifc_class: str = "IfcStructuralLoadLinearForce" +) -> ifcopenshell.entity_instance: """Adds a new structural load Structural loads may be actions or reactions. A simple load might be a @@ -42,9 +45,4 @@ def add_structural_load(file, name=None, ifc_class="IfcStructuralLoadLinearForce # Create a simple linear load ifcopenshell.api.run("structural.add_structural_load", model) """ - settings = { - "name": name, - "ifc_class": ifc_class, - } - - return file.create_entity(settings["ifc_class"], Name=settings["name"]) + return file.create_entity(ifc_class, Name=name) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py index e3d2c4f6c2..32f9906c90 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_case.py @@ -19,7 +19,9 @@ import ifcopenshell.api -def add_structural_load_case(file, name="Unnamed", action_type="NOTDEFINED", action_source="NOTDEFINED") -> None: +def add_structural_load_case( + file: ifcopenshell.file, name: str = "Unnamed", action_type: str = "NOTDEFINED", action_source: str = "NOTDEFINED" +) -> ifcopenshell.entity_instance: """Adds a new load case, which is a collection of related load groups :param name: The name of the load case @@ -34,19 +36,14 @@ def add_structural_load_case(file, name="Unnamed", action_type="NOTDEFINED", act :return: The new IfcStructuralLoadCase :rtype: ifcopenshell.entity_instance """ - settings = { - "name": name, - "action_type": action_type, - "action_source": action_source, - } load_case = ifcopenshell.api.run( "root.create_entity", file, ifc_class="IfcStructuralLoadCase", predefined_type="LOAD_CASE", - name=settings["name"], + name=name ) - load_case.ActionType = settings["action_type"] - load_case.ActionSource = settings["action_source"] + load_case.ActionType = action_type + load_case.ActionSource = action_source return load_case diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py index 3f450df5c8..36aa6bdd80 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_load_group.py @@ -19,7 +19,9 @@ import ifcopenshell.api -def add_structural_load_group(file, name="Unnamed", action_type="NOTDEFINED", action_source="NOTDEFINED") -> None: +def add_structural_load_group( + file: ifcopenshell.file, name: str = "Unnamed", action_type: str = "NOTDEFINED", action_source: str = "NOTDEFINED" +) -> ifcopenshell.entity_instance: """Adds a new load group, which is a collection of related loads :param name: The name of the load group @@ -34,19 +36,14 @@ def add_structural_load_group(file, name="Unnamed", action_type="NOTDEFINED", ac :return: The new IfcStructuralLoadCase :rtype: ifcopenshell.entity_instance """ - settings = { - "name": name, - "action_type": action_type, - "action_source": action_source, - } load_group = ifcopenshell.api.run( "root.create_entity", file, ifc_class="IfcStructuralLoadGroup", predefined_type="LOAD_GROUP", - name=settings["name"], + name=name, ) - load_group.ActionType = settings["action_type"] - load_group.ActionSource = settings["action_source"] + load_group.ActionType = action_type + load_group.ActionSource = action_source return load_group diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py index 792c03b66a..df6d98ef3e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/add_structural_member_connection.py @@ -20,7 +20,11 @@ import ifcopenshell import ifcopenshell.api -def add_structural_member_connection(file, relating_structural_member=None, related_structural_connection=None) -> None: +def add_structural_member_connection( + file: ifcopenshell.file, + relating_structural_member: ifcopenshell.entity_instance, + related_structural_connection: ifcopenshell.entity_instance, +) -> ifcopenshell.entity_instance: """Relates a structural member and a structural connection :param relating_structural_member: The IfcStructuralMember to have a @@ -39,7 +43,7 @@ def add_structural_member_connection(file, relating_structural_member=None, rela for connection in settings["related_structural_connection"].ConnectsStructuralMembers or []: if connection.RelatingStructuralMember == settings["relating_structural_member"]: - return + return connection rel = ifcopenshell.api.run("root.create_entity", file, ifc_class="IfcRelConnectsStructuralMember") rel.RelatingStructuralMember = settings["relating_structural_member"] rel.RelatedStructuralConnection = settings["related_structural_connection"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py index e6aba2d807..39d4d652bf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/assign_structural_analysis_model.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.guid -def assign_structural_analysis_model(file, product=None, structural_analysis_model=None) -> None: +def assign_structural_analysis_model( + file: ifcopenshell.file, + product: ifcopenshell.entity_instance, + structural_analysis_model: ifcopenshell.entity_instance, +) -> ifcopenshell.entity_instance: """Assigns a load or structural member to an analysis model :param product: The structural element that is part of the analysis. @@ -52,3 +56,4 @@ def assign_structural_analysis_model(file, product=None, structural_analysis_mod related_objects.add(settings["product"]) rel.RelatedObjects = list(related_objects) ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) + return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py index 7c41c59478..4b7d94a4a2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_analysis_model.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_structural_analysis_model(file, structural_analysis_model=None, attributes=None) -> None: +def edit_structural_analysis_model( + file: ifcopenshell.file, structural_analysis_model: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcStructuralAnalysisModel For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_structural_analysis_model(file, structural_analysis_model=None, attribu :param structural_analysis_model: The IfcStructuralAnalysisModel entity you want to edit :type structural_analysis_model: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py index 2674a4869e..54963415df 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_boundary_condition.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_structural_boundary_condition(file, condition=None, attributes=None) -> None: +def edit_structural_boundary_condition( + file: ifcopenshell.file, condition: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcBoundaryCondition For more information about the attributes and data types of an @@ -26,11 +30,11 @@ def edit_structural_boundary_condition(file, condition=None, attributes=None) -> :param condition: The IfcBoundaryCondition entity you want to edit :type condition: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None """ - settings = {"condition": condition, "attributes": attributes or {}} + settings = {"condition": condition, "attributes": attributes} for name, data in settings["attributes"].items(): if data["type"] == "string" or data["type"] == "null": diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py index 89faa62ecd..0d569c5f56 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_connection_cs.py @@ -15,26 +15,32 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def edit_structural_connection_cs(file, structural_item=None, axis=None, ref_direction=None) -> None: +def edit_structural_connection_cs( + file: ifcopenshell.file, + structural_item: ifcopenshell.entity_instance, + axis: tuple[float, float, float] = (0.0, 0.0, 1.0), + ref_direction: tuple[float, float, float] = (1.0, 0.0, 0.0), +) -> None: """Edits the coordinate system of a structural connection :param structural_item: The IfcStructuralItem you want to modify. :type structural_item: ifcopenshell.entity_instance :param axis: The unit Z axis vector defined as a list of 3 floats. - Defaults to [0., 0., 1.]. - :type axis: list[float] + Defaults to (0., 0., 1.). + :type axis: tuple[float, float, float] :param ref_direction: The unit X axis vector defined as a list of 3 - floats. Defaults to [1., 0., 0.]. - :type ref_direction: list[float] + floats. Defaults to (1., 0., 0.). + :type ref_direction: tuple[float, float, float] :return: None :rtype: None """ settings = { "structural_item": structural_item, - "axis": axis or [0.0, 0.0, 1.0], - "ref_direction": ref_direction or [1.0, 0.0, 0.0], + "axis": axis, + "ref_direction": ref_direction, } if settings["structural_item"].ConditionCoordinateSystem is None: diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py index dbb2541371..8b90457a47 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_item_axis.py @@ -15,20 +15,25 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def edit_structural_item_axis(file, structural_item=None, axis=None) -> None: +def edit_structural_item_axis( + file: ifcopenshell.file, + structural_item: ifcopenshell.entity_instance, + axis: tuple[float, float, float] = (0.0, 0.0, 1.0), +) -> None: """Edits the coordinate system of a structural connection :param structural_item: The IfcStructuralItem you want to modify. :type structural_item: ifcopenshell.entity_instance :param axis: The unit Z axis vector defined as a list of 3 floats. - Defaults to [0., 0., 1.]. - :type axis: list[float] + Defaults to (0., 0., 1.). + :type axis: tuple[float, float, float] :return: None :rtype: None """ - settings = {"structural_item": structural_item, "axis": axis or [0.0, 0.0, 1.0]} + settings = {"structural_item": structural_item, "axis": axis} if len(file.get_inverse(settings["structural_item"].Axis)) == 1: file.remove(settings["structural_item"].Axis) diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py index 2c577deb83..20298d1c0f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_structural_load(file, structural_load=None, attributes=None) -> None: +def edit_structural_load( + file: ifcopenshell.file, structural_load: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcStructuralLoad For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_structural_load(file, structural_load=None, attributes=None) -> None: :param structural_load: The IfcStructuralLoad entity you want to edit :type structural_load: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py index 4c84573795..59231fb9e4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/edit_structural_load_case.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_structural_load_case(file, load_case=None, attributes=None) -> None: +def edit_structural_load_case( + file: ifcopenshell.file, load_case: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcStructuralLoadCase For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_structural_load_case(file, load_case=None, attributes=None) -> None: :param load_case: The IfcStructuralLoadCase entity you want to edit :type load_case: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py index b238562b18..8135bc0255 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_analysis_model.py @@ -20,7 +20,9 @@ import ifcopenshell import ifcopenshell.util.element -def remove_structural_analysis_model(file, structural_analysis_model=None) -> None: +def remove_structural_analysis_model( + file: ifcopenshell.file, structural_analysis_model: ifcopenshell.entity_instance +) -> None: """Removes an analysis model Note that the contents of an analysis model are currently preserved. diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py index 7aa4f6bd74..bd9018c1e2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_boundary_condition.py @@ -15,16 +15,22 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional -def remove_structural_boundary_condition(file, connection=None, boundary_condition=None) -> None: +def remove_structural_boundary_condition( + file: ifcopenshell.file, + connection: Optional[ifcopenshell.entity_instance] = None, + boundary_condition: Optional[ifcopenshell.entity_instance] = None, +) -> None: """Removes a condition from a connection, or an orphased boundary condition :param connection: The IfcStructuralConnection to remove the condition from. If omitted, it is assumed to be an orphaned condition. :type connection: ifcopenshell.entity_instance,optional :param boundary_condition: The IfcBoundaryCondition to remove. - :type boundary_condition: ifcopenshell.entity_instance + :type boundary_condition: ifcopenshell.entity_instance, optional. :return: None :rtype: None """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py index 21ed51f712..91eb517640 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_connection_condition.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_structural_connection_condition(file, relation=None) -> None: +def remove_structural_connection_condition(file: ifcopenshell.file, relation: ifcopenshell.entity_instance) -> None: """Removes a relationship between a connection and a condition The condition and the member itself is preserved. diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py index afe97029ab..1d406a16e8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_structural_load(file, structural_load=None) -> None: +def remove_structural_load(file: ifcopenshell.file, structural_load: ifcopenshell.entity_instance) -> None: """Removes a structural load :param structural_load: The IfcStructuralLoad to remove. diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py index de317ed354..1d9473515a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_case.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_structural_load_case(file, load_case=None) -> None: +def remove_structural_load_case(file: ifcopenshell.file, load_case: ifcopenshell.entity_instance) -> None: """Removes a structural load case :param load_case: The IfcStructuralLoadCase to remove. diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py index 541dd87811..281630fd7a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/remove_structural_load_group.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_structural_load_group(file, load_group=None) -> None: +def remove_structural_load_group(file: ifcopenshell.file, load_group: ifcopenshell.entity_instance) -> None: """Removes a structural load group :param load_group: The IfcStructuralLoadGroup to remove. diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py b/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py index b4dedc2832..28e6531bfa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/unassign_structural_analysis_model.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.util.element -def unassign_structural_analysis_model(file, product=None, structural_analysis_model=None) -> None: +def unassign_structural_analysis_model( + file: ifcopenshell.file, + product: ifcopenshell.entity_instance, + structural_analysis_model: ifcopenshell.entity_instance, +) -> None: """Removes a relationship between a structural element and the analysis model :param product: The structural element that is part of the analysis. diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py index 599feaef3d..2660cc6335 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_style.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional -def add_style(file, name=None, ifc_class="IfcSurfaceStyle") -> None: +def add_style( + file: ifcopenshell.file, name: Optional[str] = None, ifc_class="IfcSurfaceStyle" +) -> ifcopenshell.entity_instance: """Add a new presentation style A presentation style is a container of visual settings (called @@ -54,8 +58,10 @@ def add_style(file, name=None, ifc_class="IfcSurfaceStyle") -> None: # Create a new surface style style = ifcopenshell.api.run("style.add_style", model) """ - settings = {"name": name, "ifc_class": ifc_class} - if settings["ifc_class"] == "IfcSurfaceStyle": + kwargs = {"Name": name} + if ifc_class == "IfcSurfaceStyle": # Name is filled out because Revit treats this incorrectly as the material name - return file.createIfcSurfaceStyle(settings["name"], "BOTH") + kwargs["Side"] = "BOTH" + + return file.create_entity(ifc_class, **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py index c8f9c415d1..25101ae5ad 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_style.py @@ -18,9 +18,15 @@ import ifcopenshell import ifcopenshell.api +from typing import Any, Optional -def add_surface_style(file, style=None, ifc_class="IfcSurfaceStyleShading", attributes=None) -> None: +def add_surface_style( + file: ifcopenshell.file, + style: ifcopenshell.entity_instance, + ifc_class: str = "IfcSurfaceStyleShading", + attributes: Optional[dict[str, Any]] = None, +) -> None: """Adds a new presentation item to a surface style A surface style can have multiple different types of presentation items diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py index 9b6fbda053..f6c8c3b0c3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py @@ -15,18 +15,29 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . - +from __future__ import annotations import ifcopenshell import ifcopenshell.api +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + import bpy -def add_surface_textures(file, material=None, uv_maps=None, textures=None) -> None: +def add_surface_textures( + file: ifcopenshell.entity_instance, + material: Optional[bpy.types.Material] = None, + textures: Optional[list[dict]] = None, + uv_maps: Optional[list[ifcopenshell.entity_instance]] = None, +) -> list[ifcopenshell.entity_instance]: """Add surface texture based on a Blender material definition or texture data. + Either `material` or `textures` should be provided. + :param material: The Blender material definition with a node tree that is compatible with glTF. See one of the valid combinations here: https://docs.blender.org/manual/en/dev/addons/import_export/scene_gltf2.html - :type material: bpy.types.Material + :type material: bpy.types.Material, optional :param uv_maps: A list of IfcIndexedTextureMap for any IfcTessellatedFaceSets that the representation has, obtained from the HasTextures attribute. @@ -44,7 +55,7 @@ def add_surface_textures(file, material=None, uv_maps=None, textures=None) -> No based on geometry); * `Camera` - IfcTextureCoordinateGenerator with mode COORD_EYE (autogenerated UV based on camera position) - :type textures: list[dict] + :type textures: list[dict], optional :return: A list of IfcImageTexture :rtype: list[ifcopenshell.entity_instance] """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py index 630a842bf6..45bbb3a059 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py @@ -22,7 +22,11 @@ import ifcopenshell.util.element def assign_material_style( - file, material=None, style=None, context=None, should_use_presentation_style_assignment=False + file: ifcopenshell.file, + material: ifcopenshell.entity_instance, + style: ifcopenshell.entity_instance, + context: ifcopenshell.entity_instance, + should_use_presentation_style_assignment: bool = False, ) -> None: """Assigns a style to a material diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py b/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py index e2f5daf766..2aa95e6d94 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py @@ -15,15 +15,16 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell def assign_representation_styles( - file, - shape_representation=None, - styles=None, - replace_previous_same_type_style=True, - should_use_presentation_style_assignment=False, -) -> None: + file: ifcopenshell.file, + shape_representation: ifcopenshell.entity_instance, + styles: list[ifcopenshell.entity_instance], + replace_previous_same_type_style: bool = True, + should_use_presentation_style_assignment: bool = False, +) -> list[ifcopenshell.entity_instance]: """Assigns a style directly to an object representation A style may either be assigned directly to an object's representation, @@ -56,7 +57,7 @@ def assign_representation_styles( that this is no longer a valid IFC. Blame Autodesk. :type should_use_presentation_style_assignment: bool :return: List of created IfcStyledItems - :rtype: ifcopenshell.entity_instance + :rtype: list[ifcopenshell.entity_instance] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py index 268acfdc2e..e8934d4de5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/edit_presentation_style.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_presentation_style(file, style=None, attributes=None) -> None: +def edit_presentation_style( + file: ifcopenshell.file, style: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcPresentationStyle For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_presentation_style(file, style=None, attributes=None) -> None: :param style: The IfcPresentationStyle entity you want to edit :type style: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py index b8c7a30be8..9dbb9245f6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/edit_surface_style.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_surface_style(file, style=None, attributes=None) -> None: +def edit_surface_style( + file: ifcopenshell.file, style: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcPresentationItem For more information about the attributes and data types of an @@ -34,7 +38,7 @@ def edit_surface_style(file, style=None, attributes=None) -> None: :param style: The IfcPresentationStyle entity you want to edit :type style: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py index 453f511f2a..1868847ba4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_style.py @@ -15,11 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . - +import ifcopenshell.api import ifcopenshell.util.element -def remove_style(file, style=None) -> None: +def remove_style(file: ifcopenshell.file, style: ifcopenshell.entity_instance) -> None: """Removes a presentation style All of the presentation items of the style will also be removed. diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py index 62ab7e4973..8b4323f0de 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_styled_representation.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_styled_representation(file, representation=None) -> None: +def remove_styled_representation(file: ifcopenshell.file, representation: ifcopenshell.entity_instance) -> None: """Removes a styled representation Styled representations are typically associated with materials. This diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py index 9621d5b51a..4ec3b9a3f3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_surface_style(file, style=None) -> None: +def remove_surface_style(file: ifcopenshell.file, style: ifcopenshell.entity_instance) -> None: """Removes a presentation item from a presentation style :param style: The IfcPresentationItem to remove. diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py index 59b37a1935..71189f8a88 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py @@ -18,9 +18,16 @@ import ifcopenshell +import ifcopenshell.api +import ifcopenshell.util.element -def unassign_material_style(file, material=None, style=None, context=None) -> None: +def unassign_material_style( + file: ifcopenshell.file, + material: ifcopenshell.entity_instance, + style: ifcopenshell.entity_instance, + context: ifcopenshell.entity_instance, +) -> None: """Unassigns a style to a material This does the inverse of assign_material_style. diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py index 14f52e9c6e..4f5685b150 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_representation_styles.py @@ -15,10 +15,14 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell def unassign_representation_styles( - file, shape_representation=None, styles=None, should_use_presentation_style_assignment=False + file: ifcopenshell.file, + shape_representation: ifcopenshell.entity_instance, + styles: list[ifcopenshell.entity_instance], + should_use_presentation_style_assignment: bool = False, ) -> None: """Unassigns styles directly assigned to an object representation diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py index a3664cffbb..e6311a72e9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/add_port.py @@ -18,9 +18,10 @@ import ifcopenshell import ifcopenshell.api +from typing import Optional -def add_port(file, element=None) -> None: +def add_port(file: ifcopenshell.file, element: Optional[ifcopenshell.entity_instance] = None) -> None: """Adds a new distribution port to an element A distribution port represents a connection point on an element, where @@ -34,7 +35,7 @@ def add_port(file, element=None) -> None: :param element: The IfcDistributionElement you want to add a distribution port to. - :type element: ifcopenshell.entity_instance + :type element: ifcopenshell.entity_instance, optional :return: The newly created IfcDistributionPort :rtype: ifcopenshell.entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py index 0f92e006eb..6b6dcd9be2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_flow_control.py @@ -19,9 +19,14 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.guid +from typing import Union -def assign_flow_control(file, relating_flow_element=None, related_flow_control=None) -> None: +def assign_flow_control( + file: ifcopenshell.file, + relating_flow_element: ifcopenshell.entity_instance, + related_flow_control: ifcopenshell.entity_instance, +) -> Union[ifcopenshell.entity_instance, None]: """Assigns to the flow element control element that either sense or control some aspect of the flow element. diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py index 72afc13db3..7f801fc919 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/assign_port.py @@ -22,7 +22,9 @@ import ifcopenshell.guid import ifcopenshell.util.placement -def assign_port(file, element=None, port=None) -> None: +def assign_port( + file: ifcopenshell.file, element: ifcopenshell.entity_instance, port: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: """Assigns a port to an element If you have an orphaned port, you may assign it to a distribution @@ -73,7 +75,7 @@ class Usecase: for rel in rels: if self.settings["port"] in rel.RelatedObjects: - return + return rel if rels: rel = rels[0] @@ -97,7 +99,7 @@ class Usecase: def execute_ifc2x3(self): for rel in self.settings["element"].HasPorts or []: if rel.RelatingPort == self.settings["port"]: - return + return rel rel = self.file.create_entity( "IfcRelConnectsPortToElement", GlobalId=ifcopenshell.guid.new(), diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py index c567d75eba..aea8575dce 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/connect_port.py @@ -20,9 +20,16 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.guid import ifcopenshell.util.element +from typing import Optional -def connect_port(file, port1=None, port2=None, direction="NOTDEFINED", element=None) -> None: +def connect_port( + file: ifcopenshell.file, + port1: ifcopenshell.entity_instance, + port2: ifcopenshell.entity_instance, + direction: str = "NOTDEFINED", + element: Optional[ifcopenshell.entity_instance] = None, +) -> None: """Connects two ports together A distribution element (e.g. a duct) may be connected to another @@ -61,7 +68,7 @@ def connect_port(file, port1=None, port2=None, direction="NOTDEFINED", element=N connectivity is made, such as a segment or fitting. This is only to be used for implicit port connectivity where the segments and fittings are less important. - :type element: ifcopenshell.entity_instance + :type element: ifcopenshell.entity_instance, optional Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py index 15d5890493..bb2cd9364f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/disconnect_port.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def disconnect_port(file, port=None) -> None: +def disconnect_port(file: ifcopenshell.file, port: ifcopenshell.entity_instance) -> None: """Disconnects a port from any other port A port may only be connected to one other port, so the other port is not diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py index 83fd250ddd..d8c45f495e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/edit_system.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_system(file, system=None, attributes=None) -> None: +def edit_system(file: ifcopenshell.file, system: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcSystem For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_system(file, system=None, attributes=None) -> None: :param system: The IfcSystem entity you want to edit :type system: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py b/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py index a81a06127f..0d1fcf3853 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/remove_system.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_system(file, system=None) -> None: +def remove_system(file: ifcopenshell.file, system: ifcopenshell.entity_instance) -> None: """Removes a distribution system All the distribution elements within the system are retained. diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py index feba961f1b..40a4efdadd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_flow_control.py @@ -21,7 +21,11 @@ import ifcopenshell.api import ifcopenshell.util.element -def unassign_flow_control(file, relating_flow_element=None, related_flow_control=None) -> None: +def unassign_flow_control( + file: ifcopenshell.file, + relating_flow_element: ifcopenshell.entity_instance, + related_flow_control: ifcopenshell.entity_instance, +) -> None: """Unassigns flow control element from the flow element. :param related_flow_control: IfcDistributionControlElement controling the @@ -29,9 +33,8 @@ def unassign_flow_control(file, relating_flow_element=None, related_flow_control :type related_flow_control: ifcopenshell.entity_instance :param relating_flow_element: The IfcDistributionFlowElement that is being controlled :type relating_flow_element: ifcopenshell.entity_instance - :return: If the control still is related to other objects, the - IfcRelFlowControlElements is returned, otherwise None. - :rtype: ifcopenshell.entity_instance, None + :return: None + :rtype: None Example: @@ -71,4 +74,3 @@ def unassign_flow_control(file, relating_flow_element=None, related_flow_control related_flow_controls.remove(settings["related_flow_control"]) assignment.RelatedControlElements = related_flow_controls ifcopenshell.api.run("owner.update_owner_history", file, **{"element": assignment}) - return assignment diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py index 678c086140..c7e079fbf0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/unassign_port.py @@ -18,9 +18,12 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.util.element -def unassign_port(file, element=None, port=None) -> None: +def unassign_port( + file: ifcopenshell.file, element: ifcopenshell.entity_instance, port: ifcopenshell.entity_instance +) -> None: """Unassigns a port to an element Ports are typically always assigned to a distribution element, but in From 1e630ede085fd52c3bc4b257c00e85ffa99581dc Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 10 May 2024 11:33:33 +0500 Subject: [PATCH 147/429] ifc2x3 tests --- .../ifcopenshell/api/pset/add_pset.py | 37 +++++++++++------- .../ifcopenshell/api/resource/add_resource.py | 2 +- .../ifcopenshell/api/sequence/add_task.py | 2 +- .../api/sequence/add_work_schedule.py | 21 ++++++++-- .../api/style/assign_material_style.py | 38 +++++++++++++++--- .../api/style/remove_surface_style.py | 23 ++++++----- .../api/style/unassign_material_style.py | 9 ++++- .../ifcopenshell/util/element.py | 1 + .../test/api/pset/test_add_pset.py | 9 +++-- .../resource/test_calculate_resource_work.py | 2 + .../test/api/root/test_create_entity.py | 38 ++++++++++-------- .../test/api/root/test_reassign_class.py | 11 +++++- .../test/api/root/test_remove_product.py | 14 ++++--- .../test/api/sequence/test_assign_product.py | 4 ++ .../sequence/test_calculate_task_duration.py | 2 + .../api/sequence/test_cascade_schedule.py | 2 + .../test/api/sequence/test_edit_task_time.py | 3 ++ .../test/api/sequence/test_edit_work_time.py | 1 + .../api/sequence/test_recalculate_schedule.py | 2 + .../api/sequence/test_unassign_product.py | 4 ++ .../test/api/spatial/test_assign_container.py | 4 ++ .../api/spatial/test_unassign_container.py | 4 ++ .../test_add_structural_analysis_model.py | 4 ++ .../test_assign_structural_analysis_model.py | 4 ++ .../test_edit_structural_analysis_model.py | 4 ++ .../test_remove_structural_analysis_model.py | 4 ++ ...test_unassign_structural_analysis_model.py | 4 ++ .../test/api/style/test_add_surface_style.py | 39 ++++++++++++++----- .../api/style/test_add_surface_textures.py | 2 + .../api/style/test_assign_material_style.py | 19 +++++++-- .../test/api/style/test_edit_surface_style.py | 12 +++++- .../test/api/style/test_remove_style.py | 4 ++ .../api/style/test_remove_surface_style.py | 19 +++++---- .../api/style/test_unassign_material_style.py | 12 +++++- .../test/api/system/test_add_port.py | 6 ++- .../test/api/system/test_add_system.py | 9 ++++- .../api/system/test_assign_flow_control.py | 8 +++- .../test/api/system/test_connect_port.py | 6 ++- .../test/api/system/test_disconnect_port.py | 6 ++- .../test/api/system/test_remove_system.py | 6 ++- .../api/system/test_unassign_flow_control.py | 8 +++- 41 files changed, 315 insertions(+), 94 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py index 835bd83d75..d28fe9b16d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py @@ -121,27 +121,36 @@ def add_pset(file: ifcopenshell.file, product: ifcopenshell.entity_instance, nam has_property_sets.append(pset) settings["product"].HasPropertySets = has_property_sets return pset - elif settings["product"].is_a("IfcMaterialDefinition"): - for definition in settings["product"].HasProperties or []: - if definition.Name == settings["name"]: + # in IFC2X3 IfcMaterialDefinition not yet existed + elif settings["product"].is_a("IfcMaterialDefinition") or settings["product"].is_a("IfcMaterial"): + if file.schema == "IFC2X3": + ifc_class = "IfcExtendedMaterialProperties" + definitions = (d for d in file.by_type("IfcMaterialProperties") if d.Material == settings["product"]) + else: + ifc_class = "IfcMaterialProperties" + definitions = settings["product"].HasProperties + for definition in definitions: + # In IFC2X3 not all IfcMaterialProperties has Name + if getattr(definition, "Name") == settings["name"]: return definition return file.create_entity( - "IfcMaterialProperties", + ifc_class, **{ "Name": settings["name"], "Material": settings["product"], } ) elif settings["product"].is_a("IfcProfileDef"): - for definition in settings["product"].HasProperties or []: - if definition.Name == settings["name"]: - return definition + # in IFC2X3 IfcProfileProperties doesn't have Name and we cannot identify them + if file.schema != "IFC2X3": + for definition in settings["product"].HasProperties or []: + if definition.Name == settings["name"]: + return definition - return file.create_entity( - "IfcProfileProperties", - **{ - "Name": settings["name"], - "ProfileDefinition": settings["product"], - } - ) + kwargs = {} + kwargs["ProfileDefinition"] = settings["product"] + if file.schema != "IFC2X3": + kwargs["Name"] = settings["name"] + + return file.create_entity("IfcProfileProperties", **kwargs) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py index 8131bed326..dd60840349 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource.py @@ -97,7 +97,7 @@ def add_resource( related_objects=[resource], relating_object=settings["parent_resource"], ) - else: + elif file.schema != "IFC2X3": context = file.by_type("IfcContext")[0] ifcopenshell.api.run( "project.assign_declaration", diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py index 6fd08d4b1d..152c74439b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_task.py @@ -175,6 +175,6 @@ def add_task( related_objects=[task], relating_object=settings["parent_task"], ) - if settings["parent_task"].Identification: + if file.schema != "IFC2X3" and settings["parent_task"].Identification: task.Identification = settings["parent_task"].Identification + "." + str(len(rel.RelatedObjects)) return task diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py index 3fe8e1a003..a3bc13886c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/add_work_schedule.py @@ -90,11 +90,17 @@ def add_work_schedule( predefined_type=settings["predefined_type"], name=settings["name"], ) - work_schedule.CreationDate = ifcopenshell.util.date.datetime2ifc(datetime.now(), "IfcDateTime") + if file.schema == "IFC2X3": + work_schedule.CreationDate = createIfcDateAndTime(file, datetime.now()) + else: + work_schedule.CreationDate = ifcopenshell.util.date.datetime2ifc(datetime.now(), "IfcDateTime") user = ifcopenshell.api.owner.settings.get_user(file) if user: work_schedule.Creators = [user.ThePerson] - work_schedule.StartTime = ifcopenshell.util.date.datetime2ifc(settings["start_time"], "IfcDateTime") + if file.schema == "IFC2X3": + work_schedule.StartTime = createIfcDateAndTime(file, settings["start_time"]) + else: + work_schedule.StartTime = ifcopenshell.util.date.datetime2ifc(settings["start_time"], "IfcDateTime") if settings["object_type"]: work_schedule.ObjectType = settings["object_type"] if settings["work_plan"]: @@ -106,7 +112,7 @@ def add_work_schedule( "relating_object": settings["work_plan"], } ) - else: + elif file.schema != "IFC2X3": # TODO: this is an ambiguity by buildingSMART # See https://forums.buildingsmart.org/t/is-the-ifcworkschedule-project-declaration-mutually-exclusive-to-aggregation-within-a-relating-ifcworkplan/3510 context = file.by_type("IfcContext")[0] @@ -117,3 +123,12 @@ def add_work_schedule( relating_context=context, ) return work_schedule + + +def createIfcDateAndTime(file: ifcopenshell.file, dt: datetime): + ifc_dt = file.create_entity("IfcDateAndTime") + ifc_dt.DateComponent = file.create_entity( + "IfcCalendarDate", **ifcopenshell.util.date.datetime2ifc(dt, "IfcCalendarDate") + ) + ifc_dt.TimeComponent = file.create_entity("IfcLocalTime", **ifcopenshell.util.date.datetime2ifc(dt, "IfcLocalTime")) + return ifc_dt diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py index 45bbb3a059..b1ddd3e298 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py @@ -177,11 +177,31 @@ class Usecase: representations.append(self.create_styled_representation()) definition_representation.Representations = representations - def has_proposed_style(self, styled_item): - return any(s == self.settings["style"] for s in styled_item.Styles) + def has_proposed_style(self, styled_item: ifcopenshell.entity_instance) -> bool: + style = self.settings["style"] + styles = styled_item.Styles + if style in styles: + return True + if self.file.schema != "IFC4X3": + # IfcPresentationStyleAssignment is removed in IFC4X3 + for s in styles: + if s.is_a("IfcPresentationStyleAssignment"): + if style in s.Styles: + return True + return False - def has_same_style_type(self, styled_item): - return any(s.is_a() == self.settings["style"].is_a() for s in styled_item.Styles) + def has_same_style_type(self, styled_item: ifcopenshell.entity_instance) -> bool: + style = self.settings["style"] + style_class = style.is_a() + for s in styled_item.Styles: + s_class = s.is_a() + if s_class == style_class: + return True + elif s_class == "IfcPresentationStyleAssignment": + for ss in s.Styles: + if ss.is_a() == style_class: + return True + return False def create_new_definition_representation(self): representation = self.create_styled_representation() @@ -214,6 +234,14 @@ class Usecase: return self.file.create_entity( "IfcStyledItem", **{"Styles": [self.style], "Name": self.settings["style"].Name} ) - reuse_item.Styles = (self.style,) + + # IfcPresentationStyleAssignment we created end up not being used + # TODO: do not create IfcPresentationStyleAssignment in the first place + # as it might get removed + if reuse_item.is_a("IfcPresentationStyleAssignment") and self.style.is_a("IfcPresentationStyleAssignment"): + self.file.remove(self.style) + self.style = reuse_item + + reuse_item.Styles = (self.settings["style"],) reuse_item.Name = self.settings["style"].Name return reuse_item diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py index 4ec3b9a3f3..98674c5f84 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/remove_surface_style.py @@ -45,22 +45,25 @@ def remove_surface_style(file: ifcopenshell.file, style: ifcopenshell.entity_ins # Remove the shading item ifcopenshell.api.run("style.remove_surface_style", model, style=shading) """ - settings = {"style": style} to_delete = set() - if settings["style"].is_a("IfcSurfaceStyleWithTextures"): - for texture in settings["style"].Textures or []: - if texture.IsMappedBy: - for coordinate in texture.IsMappedBy: - to_delete.add(coordinate) - else: - to_delete.add(texture) + if style.is_a("IfcSurfaceStyleWithTextures"): + textures = style.Textures + if file.schema == "IFC2X3": + to_delete.update(textures) + else: + for texture in textures: + if coords := texture.IsMappedBy: + for coordinate in coords: + to_delete.add(coordinate) + else: + to_delete.add(texture) - for attribute in settings["style"]: + for attribute in style: if isinstance(attribute, ifcopenshell.entity_instance) and attribute.id(): to_delete.add(attribute) - file.remove(settings["style"]) + file.remove(style) for element in to_delete: ifcopenshell.util.element.remove_deep2(file, element) diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py index 71189f8a88..17d0adfb3a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/unassign_material_style.py @@ -65,7 +65,14 @@ def unassign_material_style( for item in representation.Items: if not item.is_a("IfcStyledItem"): continue - styles = [s for s in item.Styles if s != settings["style"]] + styles = [] + for s in item.Styles: + if s == settings["style"]: + continue + if s.is_a("IfcPresentationStyleAssignment"): + if s.Styles == (settings["style"],): + continue + styles.append(s) if not styles: file.remove(item) elif len(styles) != len(item.Styles): diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index f57d1891bc..2430a2553a 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -158,6 +158,7 @@ def get_psets( if qtos_only and not definition.is_a("IfcElementQuantity"): continue psets[definition.Name] = get_property_definition(definition, verbose=verbose) + # NOTE: doesn't account for IFC2X3 missing HasProperties elif element.is_a("IfcMaterialDefinition") or element.is_a("IfcProfileDef"): for definition in getattr(element, "HasProperties", None) or []: if qtos_only: diff --git a/src/ifcopenshell-python/test/api/pset/test_add_pset.py b/src/ifcopenshell-python/test/api/pset/test_add_pset.py index 9d18e16ee2..26c26f26af 100644 --- a/src/ifcopenshell-python/test/api/pset/test_add_pset.py +++ b/src/ifcopenshell-python/test/api/pset/test_add_pset.py @@ -38,13 +38,16 @@ class TestAddPset(test.bootstrap.IFC4): material = ifcopenshell.api.run("material.add_material", self.file) pset = ifcopenshell.api.run("pset.add_pset", self.file, product=material, name="Pset_MaterialCommon") assert pset.is_a("IfcMaterialProperties") - assert "Pset_MaterialCommon" in ifcopenshell.util.element.get_psets(material) + assert pset.Name == "Pset_MaterialCommon" + assert pset.Material == material def test_adding_a_pset_to_a_profile(self): profile = ifcopenshell.api.run("profile.add_parameterized_profile", self.file, ifc_class="IfcCircleProfileDef") pset = ifcopenshell.api.run("pset.add_pset", self.file, product=profile, name="Pset_ProfileMechanical") assert pset.is_a("IfcProfileProperties") - assert "Pset_ProfileMechanical" in ifcopenshell.util.element.get_psets(profile) + if self.file.schema != "IFC2X3": + assert pset.Name == "Pset_ProfileMechanical" + assert pset.ProfileDefinition == profile def test_adding_a_pset_to_a_context(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") @@ -53,7 +56,7 @@ class TestAddPset(test.bootstrap.IFC4): assert "Custom_Pset" in ifcopenshell.util.element.get_psets(element) -class TestAddPsetIFC2X3(test.bootstrap.IFC2X3): +class TestAddPsetIFC2X3(test.bootstrap.IFC2X3, TestAddPset): def test_adding_a_pset_to_a_project(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Custom_Pset") diff --git a/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py b/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py index 83a9d9303d..e81e47f2fc 100644 --- a/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py +++ b/src/ifcopenshell-python/test/api/resource/test_calculate_resource_work.py @@ -21,6 +21,8 @@ import ifcopenshell.api import ifcopenshell.util.constraint +# NOTE: resource module features relies on entities introduced in IFC4 +# therefore no IFC2X3 tests class TestCalculateResourceWork(test.bootstrap.IFC4): def test_calculating_resource_work_based_on_a_daily_productivity_rate(self): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") diff --git a/src/ifcopenshell-python/test/api/root/test_create_entity.py b/src/ifcopenshell-python/test/api/root/test_create_entity.py index 49fc0891c2..9ec93d8933 100644 --- a/src/ifcopenshell-python/test/api/root/test_create_entity.py +++ b/src/ifcopenshell-python/test/api/root/test_create_entity.py @@ -23,22 +23,22 @@ import ifcopenshell.api class TestCreateEntity(test.bootstrap.IFC4): def test_creating_a_simple_entity_with_automatic_global_id(self): wall = ifcopenshell.api.run( - "root.create_entity", self.file, ifc_class="IfcWall", predefined_type="SOLIDWALL", name="Foo" + "root.create_entity", self.file, ifc_class="IfcRailing", predefined_type="HANDRAIL", name="Foo" ) - assert wall.is_a() == "IfcWall" + assert wall.is_a() == "IfcRailing" assert len(wall.GlobalId) == 22 assert wall.Name == "Foo" - assert wall.PredefinedType == "SOLIDWALL" + assert wall.PredefinedType == "HANDRAIL" def test_handling_predefined_types(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall", name="Foo") + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcRailing", name="Foo") assert element.PredefinedType is None element = ifcopenshell.api.run( - "root.create_entity", self.file, ifc_class="IfcWall", predefined_type="SHEAR", name="Foo" + "root.create_entity", self.file, ifc_class="IfcRailing", predefined_type="HANDRAIL", name="Foo" ) - assert element.PredefinedType == "SHEAR" + assert element.PredefinedType == "HANDRAIL" element = ifcopenshell.api.run( - "root.create_entity", self.file, ifc_class="IfcWall", predefined_type="Foobar", name="Foo" + "root.create_entity", self.file, ifc_class="IfcRailing", predefined_type="Foobar", name="Foo" ) assert element.PredefinedType == "USERDEFINED" assert element.ObjectType == "Foobar" @@ -47,11 +47,12 @@ class TestCreateEntity(test.bootstrap.IFC4): ) assert element.PredefinedType == "USERDEFINED" assert element.ElementType == "Foobar" - element = ifcopenshell.api.run( - "root.create_entity", self.file, ifc_class="IfcTaskType", predefined_type="Foobar", name="Foo" - ) - assert element.PredefinedType == "USERDEFINED" - assert element.ProcessType == "Foobar" + if self.file.schema != "IFC2X3": + element = ifcopenshell.api.run( + "root.create_entity", self.file, ifc_class="IfcTaskType", predefined_type="Foobar", name="Foo" + ) + assert element.PredefinedType == "USERDEFINED" + assert element.ProcessType == "Foobar" def test_setting_default_values_for_validity(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType", name="Foo") @@ -66,9 +67,14 @@ class TestCreateEntity(test.bootstrap.IFC4): assert element.ConstructionType == "NOTDEFINED" assert element.ParameterTakesPrecedence == False assert element.Sizeable == False - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDoorType", name="Foo") - assert element.OperationType == "NOTDEFINED" - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWindowType", name="Foo") - assert element.PartitioningType == "NOTDEFINED" + if self.file.schema != "IFC2X3": + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDoorType", name="Foo") + assert element.OperationType == "NOTDEFINED" + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWindowType", name="Foo") + assert element.PartitioningType == "NOTDEFINED" element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcFurnitureType", name="Foo") assert element.AssemblyPlace == "NOTDEFINED" + + +class TestCreateEntityIFC2X3(test.bootstrap.IFC2X3, TestCreateEntity): + pass diff --git a/src/ifcopenshell-python/test/api/root/test_reassign_class.py b/src/ifcopenshell-python/test/api/root/test_reassign_class.py index 17b3fd1801..80276686e9 100644 --- a/src/ifcopenshell-python/test/api/root/test_reassign_class.py +++ b/src/ifcopenshell-python/test/api/root/test_reassign_class.py @@ -18,14 +18,17 @@ import test.bootstrap import ifcopenshell.api +import ifcopenshell.util.element class TestReassignClass(test.bootstrap.IFC4): def test_reassigning_a_simple_class(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + n_elements = len([e for e in self.file]) + original_id = element.id() new = ifcopenshell.api.run("root.reassign_class", self.file, product=element, ifc_class="IfcSlab") - assert len([e for e in self.file]) == 1 - assert new.id() == 1 + assert len([e for e in self.file]) == n_elements + assert new.id() == original_id assert new.is_a("IfcSlab") def test_reassigning_a_predefined_type(self): @@ -92,3 +95,7 @@ class TestReassignClass(test.bootstrap.IFC4): # original clases are gone assert len(self.file.by_type("IfcWall")) == 0 assert len(self.file.by_type("IfcWallType")) == 0 + + +class TestReassignClassIFC2X3(test.bootstrap.IFC2X3, TestReassignClass): + pass diff --git a/src/ifcopenshell-python/test/api/root/test_remove_product.py b/src/ifcopenshell-python/test/api/root/test_remove_product.py index 418bdbc503..91a2cf6e31 100644 --- a/src/ifcopenshell-python/test/api/root/test_remove_product.py +++ b/src/ifcopenshell-python/test/api/root/test_remove_product.py @@ -395,7 +395,7 @@ class TestRemoveProduct(test.bootstrap.IFC4): def test_removing_all_space_boundaries_of_an_element(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - boundary = self.file.createIfcRelSpaceBoundary2ndLevel( + boundary = self.file.createIfcRelSpaceBoundary( GlobalId=ifcopenshell.guid.new(), RelatedBuildingElement=element ) ifcopenshell.api.run("root.remove_product", self.file, product=element) @@ -417,8 +417,8 @@ class TestRemoveProduct(test.bootstrap.IFC4): def test_removing_flow_control_elements(self): flow_element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcFlowSegment") - flow_control = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcController") - flow_control1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcController") + flow_control = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDistributionControlElement") + flow_control1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDistributionControlElement") ifcopenshell.api.run( "system.assign_flow_control", @@ -439,8 +439,8 @@ class TestRemoveProduct(test.bootstrap.IFC4): def test_removing_flow_element_with_flow_controls(self): flow_element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcFlowSegment") - flow_control = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcController") - flow_control1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcController") + flow_control = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDistributionControlElement") + flow_control1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDistributionControlElement") ifcopenshell.api.run( "system.assign_flow_control", @@ -456,3 +456,7 @@ class TestRemoveProduct(test.bootstrap.IFC4): ) ifcopenshell.api.run("root.remove_product", self.file, product=flow_element) assert not self.file.by_type("IfcRelFlowControlElements") + + +class TestRemoveProductIFC2X3(test.bootstrap.IFC2X3, TestRemoveProduct): + pass diff --git a/src/ifcopenshell-python/test/api/sequence/test_assign_product.py b/src/ifcopenshell-python/test/api/sequence/test_assign_product.py index 698752ebc7..f0973e2fd0 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_assign_product.py +++ b/src/ifcopenshell-python/test/api/sequence/test_assign_product.py @@ -36,3 +36,7 @@ class TestAssignProduct(test.bootstrap.IFC4): ifcopenshell.api.run("sequence.assign_product", self.file, relating_product=wall, related_object=task) ifcopenshell.api.run("sequence.assign_product", self.file, relating_product=wall, related_object=task) assert wall.ReferencedBy[0].RelatedObjects == (task,) + + +class TestAssignProductIFC2X3(test.bootstrap.IFC2X3, TestAssignProduct): + pass diff --git a/src/ifcopenshell-python/test/api/sequence/test_calculate_task_duration.py b/src/ifcopenshell-python/test/api/sequence/test_calculate_task_duration.py index 587f7be225..06f0ed367b 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_calculate_task_duration.py +++ b/src/ifcopenshell-python/test/api/sequence/test_calculate_task_duration.py @@ -20,6 +20,8 @@ import test.bootstrap import ifcopenshell.api +# NOTE: sequence module features relies on entities introduced in IFC4 +# therefore no IFC2X3 tests class TestCalculateTaskDuration(test.bootstrap.IFC4): def test_calculating_the_duration_based_on_a_labour_resource_with_work_hours(self): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") diff --git a/src/ifcopenshell-python/test/api/sequence/test_cascade_schedule.py b/src/ifcopenshell-python/test/api/sequence/test_cascade_schedule.py index 9e5f8aa308..dd921ec2ae 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_cascade_schedule.py +++ b/src/ifcopenshell-python/test/api/sequence/test_cascade_schedule.py @@ -22,6 +22,8 @@ import test.bootstrap import ifcopenshell.api +# NOTE: sequence module features relies on entities introduced in IFC4 +# therefore no IFC2X3 tests class TestCascadeSchedule(test.bootstrap.IFC4): def test_doing_nothing_if_the_task_has_no_successors(self): task = ifcopenshell.api.run("sequence.add_task", self.file) diff --git a/src/ifcopenshell-python/test/api/sequence/test_edit_task_time.py b/src/ifcopenshell-python/test/api/sequence/test_edit_task_time.py index 3e59d526bb..efd41b0176 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_edit_task_time.py +++ b/src/ifcopenshell-python/test/api/sequence/test_edit_task_time.py @@ -21,6 +21,9 @@ import test.bootstrap import ifcopenshell.api +# NOTE: IfcTaskTime was introduced in IFC4 + + class TestEditTaskTime(test.bootstrap.IFC4): def test_editing_all_attributes(self): task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=self.file.createIfcTask()) diff --git a/src/ifcopenshell-python/test/api/sequence/test_edit_work_time.py b/src/ifcopenshell-python/test/api/sequence/test_edit_work_time.py index d200116878..ce024a1bca 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_edit_work_time.py +++ b/src/ifcopenshell-python/test/api/sequence/test_edit_work_time.py @@ -21,6 +21,7 @@ import test.bootstrap import ifcopenshell.api +# NOTE: IfcWorkTime was introduced in IFC4 class TestEditWorkTime(test.bootstrap.IFC4): def test_run(self): work_time = self.file.createIfcWorkTime() diff --git a/src/ifcopenshell-python/test/api/sequence/test_recalculate_schedule.py b/src/ifcopenshell-python/test/api/sequence/test_recalculate_schedule.py index 74ef955d66..b08c38273c 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_recalculate_schedule.py +++ b/src/ifcopenshell-python/test/api/sequence/test_recalculate_schedule.py @@ -22,6 +22,8 @@ import test.bootstrap import ifcopenshell.api +# NOTE: sequence module features relies on entities introduced in IFC4 +# therefore no IFC2X3 tests # A good way for checking these is to recreate them in ProjectLibre class TestRecalculateSchedule(test.bootstrap.IFC4): def test_doing_nothing_if_the_task_has_no_time(self): diff --git a/src/ifcopenshell-python/test/api/sequence/test_unassign_product.py b/src/ifcopenshell-python/test/api/sequence/test_unassign_product.py index a70e45d06f..4dba192ef3 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_unassign_product.py +++ b/src/ifcopenshell-python/test/api/sequence/test_unassign_product.py @@ -27,3 +27,7 @@ class TestUnassignProduct(test.bootstrap.IFC4): ifcopenshell.api.run("sequence.assign_product", self.file, relating_product=wall, related_object=task) ifcopenshell.api.run("sequence.unassign_product", self.file, relating_product=wall, related_object=task) assert len(self.file.by_type("IfcRelAssignsToProduct")) == 0 + + +class TestUnassignProductIFC2X3(test.bootstrap.IFC2X3, TestUnassignProduct): + pass diff --git a/src/ifcopenshell-python/test/api/spatial/test_assign_container.py b/src/ifcopenshell-python/test/api/spatial/test_assign_container.py index 533db20267..e4ca971319 100644 --- a/src/ifcopenshell-python/test/api/spatial/test_assign_container.py +++ b/src/ifcopenshell-python/test/api/spatial/test_assign_container.py @@ -121,3 +121,7 @@ class TestAssignContainer(test.bootstrap.IFC4): ifcopenshell.api.run("aggregate.assign_object", self.file, products=[subelement], relating_object=aggregate) ifcopenshell.api.run("spatial.assign_container", self.file, products=[subelement], relating_structure=element) assert not ifcopenshell.util.element.get_aggregate(subelement) + + +class TestAssignContainerIFC2X3(test.bootstrap.IFC2X3, TestAssignContainer): + pass diff --git a/src/ifcopenshell-python/test/api/spatial/test_unassign_container.py b/src/ifcopenshell-python/test/api/spatial/test_unassign_container.py index 033b5cd333..d7f172817c 100644 --- a/src/ifcopenshell-python/test/api/spatial/test_unassign_container.py +++ b/src/ifcopenshell-python/test/api/spatial/test_unassign_container.py @@ -57,3 +57,7 @@ class TestUnassignContainer(test.bootstrap.IFC4): ifcopenshell.api.run("spatial.assign_container", self.file, products=[subelement], relating_structure=element) ifcopenshell.api.run("spatial.unassign_container", self.file, products=[subelement]) assert len(self.file.by_type("IfcRelContainedInSpatialStructure")) == 0 + + +class TestUnassignContainerIFC2X3(test.bootstrap.IFC2X3, TestUnassignContainer): + pass diff --git a/src/ifcopenshell-python/test/api/structural/test_add_structural_analysis_model.py b/src/ifcopenshell-python/test/api/structural/test_add_structural_analysis_model.py index 1849bf33e8..9fb407530d 100644 --- a/src/ifcopenshell-python/test/api/structural/test_add_structural_analysis_model.py +++ b/src/ifcopenshell-python/test/api/structural/test_add_structural_analysis_model.py @@ -28,3 +28,7 @@ class TestAddStructuralAnalysisModel(test.bootstrap.IFC4): models = self.file.by_type("IfcStructuralAnalysisModel") assert subject == models[0] assert subject.is_a("IfcStructuralAnalysisModel") + + +class TestAddStructuralAnalysisModelIFC2X3(test.bootstrap.IFC2X3, TestAddStructuralAnalysisModel): + pass diff --git a/src/ifcopenshell-python/test/api/structural/test_assign_structural_analysis_model.py b/src/ifcopenshell-python/test/api/structural/test_assign_structural_analysis_model.py index b89b061b4c..7146a53f59 100644 --- a/src/ifcopenshell-python/test/api/structural/test_assign_structural_analysis_model.py +++ b/src/ifcopenshell-python/test/api/structural/test_assign_structural_analysis_model.py @@ -37,3 +37,7 @@ class TestAssignStructuralAnalysisModel(test.bootstrap.IFC4): assert rel.is_a("IfcRelAssignsToGroup") assert rel.RelatingGroup == subject assert product in rel.RelatedObjects + + +class TestAssignStructuralAnalysisModelIFC2X3(test.bootstrap.IFC2X3, TestAssignStructuralAnalysisModel): + pass diff --git a/src/ifcopenshell-python/test/api/structural/test_edit_structural_analysis_model.py b/src/ifcopenshell-python/test/api/structural/test_edit_structural_analysis_model.py index 40f0fbfd4a..4527a0d3d8 100644 --- a/src/ifcopenshell-python/test/api/structural/test_edit_structural_analysis_model.py +++ b/src/ifcopenshell-python/test/api/structural/test_edit_structural_analysis_model.py @@ -34,3 +34,7 @@ class TestEditStructuralAnalysisModel(test.bootstrap.IFC4): models = self.file.by_type("IfcStructuralAnalysisModel") assert subject == models[0] assert subject.is_a("IfcStructuralAnalysisModel") + + +class TestEditStructuralAnalysisModelIFC2X3(test.bootstrap.IFC2X3, TestEditStructuralAnalysisModel): + pass diff --git a/src/ifcopenshell-python/test/api/structural/test_remove_structural_analysis_model.py b/src/ifcopenshell-python/test/api/structural/test_remove_structural_analysis_model.py index 2fed85b618..a631d741aa 100644 --- a/src/ifcopenshell-python/test/api/structural/test_remove_structural_analysis_model.py +++ b/src/ifcopenshell-python/test/api/structural/test_remove_structural_analysis_model.py @@ -32,3 +32,7 @@ class TestRemoveStructuralAnalysisModel(test.bootstrap.IFC4): ) models = self.file.by_type("IfcStructuralAnalysisModel") assert len(models) == 0 + + +class TestRemoveStructuralAnalysisModelIFC2X3(test.bootstrap.IFC2X3, TestRemoveStructuralAnalysisModel): + pass diff --git a/src/ifcopenshell-python/test/api/structural/test_unassign_structural_analysis_model.py b/src/ifcopenshell-python/test/api/structural/test_unassign_structural_analysis_model.py index 4168d2404b..b2269b8a3a 100644 --- a/src/ifcopenshell-python/test/api/structural/test_unassign_structural_analysis_model.py +++ b/src/ifcopenshell-python/test/api/structural/test_unassign_structural_analysis_model.py @@ -44,3 +44,7 @@ class TestUnassignStructuralAnalysisModel(test.bootstrap.IFC4): rels = self.file.by_type("IfcRelAssignsToGroup") assert len(models[0].IsGroupedBy) == 0 assert len(rels) == 0 + + +class TestUnassignStructuralAnalysisModelIFC2X3(test.bootstrap.IFC2X3, TestUnassignStructuralAnalysisModel): + pass diff --git a/src/ifcopenshell-python/test/api/style/test_add_surface_style.py b/src/ifcopenshell-python/test/api/style/test_add_surface_style.py index b13fd8e7b7..80e297bed0 100644 --- a/src/ifcopenshell-python/test/api/style/test_add_surface_style.py +++ b/src/ifcopenshell-python/test/api/style/test_add_surface_style.py @@ -24,63 +24,77 @@ import ifcopenshell.api class TestAddSurfaceStyle(test.bootstrap.IFC4): def test_adding_a_surface_style(self): style = self.file.createIfcSurfaceStyle() + attrs = {"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}} + if self.file.schema != "IFC2X3": + attrs["Transparency"] = 0.5 result = ifcopenshell.api.run( "style.add_surface_style", self.file, style=style, ifc_class="IfcSurfaceStyleShading", - attributes={"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}, "Transparency": 0.5}, + attributes=attrs, ) assert result.is_a("IfcSurfaceStyleShading") assert result.SurfaceColour.Red == 1 assert result.SurfaceColour.Green == 1 assert result.SurfaceColour.Blue == 1 - assert result.Transparency == 0.5 + if self.file.schema != "IFC2X3": + assert result.Transparency == 0.5 assert style.Styles[0] == result def test_adding_a_rendering_style(self): style = self.file.createIfcSurfaceStyle() + attrs = {"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}} + if self.file.schema != "IFC2X3": + attrs["Transparency"] = 0.5 result = ifcopenshell.api.run( "style.add_surface_style", self.file, style=style, ifc_class="IfcSurfaceStyleRendering", - attributes={"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}, "Transparency": 0.5}, + attributes=attrs, ) assert result.is_a("IfcSurfaceStyleRendering") assert result.SurfaceColour.Red == 1 assert result.SurfaceColour.Green == 1 assert result.SurfaceColour.Blue == 1 - assert result.Transparency == 0.5 + if self.file.schema != "IFC2X3": + assert result.Transparency == 0.5 assert style.Styles[0] == result def test_not_adding_a_style_twice(self): style = self.file.createIfcSurfaceStyle() + attrs = {"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}} + if self.file.schema != "IFC2X3": + attrs["Transparency"] = 0.5 ifcopenshell.api.run( "style.add_surface_style", self.file, style=style, ifc_class="IfcSurfaceStyleRendering", - attributes={"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}, "Transparency": 0.5}, + attributes=attrs, ) result = ifcopenshell.api.run( "style.add_surface_style", self.file, style=style, ifc_class="IfcSurfaceStyleRendering", - attributes={"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}, "Transparency": 0.5}, + attributes=attrs, ) assert style.Styles[0] == result assert len(style.Styles) == 1 def test_adding_multiple_styles_of_different_types(self): style = self.file.createIfcSurfaceStyle() + attrs = {"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}} + if self.file.schema != "IFC2X3": + attrs["Transparency"] = 0.5 result1 = ifcopenshell.api.run( "style.add_surface_style", self.file, style=style, ifc_class="IfcSurfaceStyleShading", - attributes={"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}, "Transparency": 0.5}, + attributes=attrs, ) result2 = ifcopenshell.api.run( "style.add_surface_style", @@ -95,19 +109,26 @@ class TestAddSurfaceStyle(test.bootstrap.IFC4): def test_ensure_shading_and_rendering_are_mutually_exclusive_when_adding(self): style = self.file.createIfcSurfaceStyle() + attrs = {"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}} + if self.file.schema != "IFC2X3": + attrs["Transparency"] = 0.5 ifcopenshell.api.run( "style.add_surface_style", self.file, style=style, ifc_class="IfcSurfaceStyleShading", - attributes={"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}, "Transparency": 0.5}, + attributes=attrs, ) result = ifcopenshell.api.run( "style.add_surface_style", self.file, style=style, ifc_class="IfcSurfaceStyleRendering", - attributes={"SurfaceColour": {"Name": "", "Red": 1, "Green": 1, "Blue": 1}, "Transparency": 0.5}, + attributes=attrs, ) assert style.Styles[0] == result assert len(style.Styles) == 1 + + +class TestAddSurfaceStyleIFC2X3(test.bootstrap.IFC2X3, TestAddSurfaceStyle): + pass diff --git a/src/ifcopenshell-python/test/api/style/test_add_surface_textures.py b/src/ifcopenshell-python/test/api/style/test_add_surface_textures.py index bdca230d99..590aa02399 100644 --- a/src/ifcopenshell-python/test/api/style/test_add_surface_textures.py +++ b/src/ifcopenshell-python/test/api/style/test_add_surface_textures.py @@ -21,6 +21,7 @@ import test.bootstrap import ifcopenshell.api +# TODO: add ifc2x3 tests after add_surface_textures will support ifc2x3 class TestAddSurfaceTexture(test.bootstrap.IFC4): def get_default_texture_data(self): return [ @@ -67,6 +68,7 @@ class TestAddSurfaceTexture(test.bootstrap.IFC4): for texture, data in zip(textures, texture_data): self.compare_texture_to_data(texture, data) + # NOTE: IfcTextureCoordinate doesn't have Maps in IFC2X3 def test_add_surface_textures_from_data_with_uv_maps(self): texture_data = self.get_default_texture_data() texture_data[0]["uv_mode"] = "Generated" diff --git a/src/ifcopenshell-python/test/api/style/test_assign_material_style.py b/src/ifcopenshell-python/test/api/style/test_assign_material_style.py index 01325d8b99..14bdf5fda9 100644 --- a/src/ifcopenshell-python/test/api/style/test_assign_material_style.py +++ b/src/ifcopenshell-python/test/api/style/test_assign_material_style.py @@ -22,7 +22,7 @@ import ifcopenshell import ifcopenshell.api -class TestAssignMaterialStyle(test.bootstrap.IFC4): +class TestAssignMaterialStyleIFC2X3(test.bootstrap.IFC2X3): def test_run(self): material = ifcopenshell.api.run("material.add_material", self.file) context = self.file.createIfcGeometricRepresentationContext() @@ -38,7 +38,12 @@ class TestAssignMaterialStyle(test.bootstrap.IFC4): assert len(representation.Items) == 1 item = representation.Items[0] assert item.is_a("IfcStyledItem") - assert item.Styles == (style,) + if self.file.schema != "IFC2X3": + assert item.Styles == (style,) + else: + # IfcPresentationStyleAssignment + assert len(item.Styles[0]) == 1 + assert item.Styles[0].Styles == (style,) style2 = self.file.createIfcSurfaceStyle() ifcopenshell.api.run("style.assign_material_style", self.file, material=material, style=style2, context=context) @@ -48,8 +53,16 @@ class TestAssignMaterialStyle(test.bootstrap.IFC4): assert definition.Representations == (representation,) assert len(representation.Items) == 1 assert representation.Items[0] == item - assert representation.Items[0].Styles == (style2,) + if self.file.schema != "IFC2X3": + assert representation.Items[0].Styles == (style2,) + else: + # IfcPresentationStyleAssignment + assert len(representation.Items[0].Styles) == 1 + assert representation.Items[0].Styles == (style2,) + +class TestAssignMaterialStyleIFC4(test.bootstrap.IFC4, TestAssignMaterialStyleIFC2X3): + # IfcMaterialConstituentSet was added in IFC4 def test_update_shape_aspect_representations_items_styles_if_material_is_part_of_matching_material_constituents( self, ): diff --git a/src/ifcopenshell-python/test/api/style/test_edit_surface_style.py b/src/ifcopenshell-python/test/api/style/test_edit_surface_style.py index 48282ece48..54665c70d3 100644 --- a/src/ifcopenshell-python/test/api/style/test_edit_surface_style.py +++ b/src/ifcopenshell-python/test/api/style/test_edit_surface_style.py @@ -25,15 +25,19 @@ class TestEditSurfaceStyle(test.bootstrap.IFC4): def test_editing_a_shading_style(self): colour = self.file.createIfcColourRgb(None, 0, 0, 0) style = self.file.createIfcSurfaceStyleShading(colour) + attrs = {"SurfaceColour": {"Red": 1, "Green": 1, "Blue": 1}} + if self.file.schema != "IFC2X3": + attrs["Transparency"] = 0.5 ifcopenshell.api.run( "style.edit_surface_style", self.file, style=style, - attributes={"SurfaceColour": {"Red": 1, "Green": 1, "Blue": 1}, "Transparency": 0.5}, + attributes=attrs, ) assert style.SurfaceColour == colour assert list(colour) == [None, 1, 1, 1] - assert style.Transparency == 0.5 + if self.file.schema != "IFC2X3": + assert style.Transparency == 0.5 def test_editing_an_empty_colour_or_factor(self): for attribute in [ @@ -170,3 +174,7 @@ class TestEditSurfaceStyle(test.bootstrap.IFC4): ) for attribute in attributes: assert tuple(getattr(style, attribute)) == (None, 1, 1, 1) + + +class TestEditSurfaceStyleIFC2X3(test.bootstrap.IFC2X3, TestEditSurfaceStyle): + pass diff --git a/src/ifcopenshell-python/test/api/style/test_remove_style.py b/src/ifcopenshell-python/test/api/style/test_remove_style.py index 2b8620b442..857dec169f 100644 --- a/src/ifcopenshell-python/test/api/style/test_remove_style.py +++ b/src/ifcopenshell-python/test/api/style/test_remove_style.py @@ -34,3 +34,7 @@ class TestRemoveStyle(test.bootstrap.IFC4): styled_item = self.file.createIfcStyledItem(Styles=[style]) ifcopenshell.api.run("style.remove_style", self.file, style=style) assert len(list(self.file)) == 0 + + +class TestRemoveStyleIFC2X3(test.bootstrap.IFC2X3, TestRemoveStyle): + pass diff --git a/src/ifcopenshell-python/test/api/style/test_remove_surface_style.py b/src/ifcopenshell-python/test/api/style/test_remove_surface_style.py index 2722a1de9a..01394cda6c 100644 --- a/src/ifcopenshell-python/test/api/style/test_remove_surface_style.py +++ b/src/ifcopenshell-python/test/api/style/test_remove_surface_style.py @@ -21,7 +21,7 @@ import test.bootstrap import ifcopenshell.api -class TestRemoveSurfaceStyle(test.bootstrap.IFC4): +class TestRemoveSurfaceStyleIFC2X3(test.bootstrap.IFC2X3): def test_removing_a_shading_style(self): style = self.file.createIfcSurfaceStyleShading(SurfaceColour=self.file.createIfcColourRgb(None, 1, 1, 1)) ifcopenshell.api.run("style.remove_surface_style", self.file, style=style) @@ -33,13 +33,6 @@ class TestRemoveSurfaceStyle(test.bootstrap.IFC4): ifcopenshell.api.run("style.remove_surface_style", self.file, style=style) assert len(list(self.file)) == 0 - def test_removing_a_texture_style_with_all_of_its_coordinates(self): - texture = self.file.createIfcImageTexture() - coordinates = self.file.createIfcTextureCoordinateGenerator(Maps=[texture]) - style = self.file.createIfcSurfaceStyleWithTextures(Textures=[texture]) - ifcopenshell.api.run("style.remove_surface_style", self.file, style=style) - assert len(list(self.file)) == 0 - def test_removing_a_rendering_style(self): style = self.file.createIfcSurfaceStyleRendering( SurfaceColour=self.file.createIfcColourRgb(None, 1, 1, 1), @@ -55,3 +48,13 @@ class TestRemoveSurfaceStyle(test.bootstrap.IFC4): g = ifcopenshell.file.from_string(self.file.wrapped_data.to_string()) ifcopenshell.api.run("style.remove_surface_style", g, style=g.by_type("IfcSurfaceStyleRendering")[0]) assert len(list(g)) == 0 + + +class TestRemoveSurfaceStyleIFC4(test.bootstrap.IFC4, TestRemoveSurfaceStyleIFC2X3): + # IfcTextureCoordinateGenerator doesn't have Maps in IFC2X3 + def test_removing_a_texture_style_with_all_of_its_coordinates(self): + texture = self.file.createIfcImageTexture() + coordinates = self.file.createIfcTextureCoordinateGenerator(Maps=[texture]) + style = self.file.createIfcSurfaceStyleWithTextures(Textures=[texture]) + ifcopenshell.api.run("style.remove_surface_style", self.file, style=style) + assert len(list(self.file)) == 0 diff --git a/src/ifcopenshell-python/test/api/style/test_unassign_material_style.py b/src/ifcopenshell-python/test/api/style/test_unassign_material_style.py index 47c6e6a928..f1e2b1c8a3 100644 --- a/src/ifcopenshell-python/test/api/style/test_unassign_material_style.py +++ b/src/ifcopenshell-python/test/api/style/test_unassign_material_style.py @@ -22,7 +22,7 @@ import ifcopenshell import ifcopenshell.api -class TestAssignMaterialStyle(test.bootstrap.IFC4): +class TestUnassignMaterialStyleIFC2X3(test.bootstrap.IFC2X3): def test_run(self): material = ifcopenshell.api.run("material.add_material", self.file) context = self.file.createIfcGeometricRepresentationContext() @@ -36,7 +36,12 @@ class TestAssignMaterialStyle(test.bootstrap.IFC4): ifcopenshell.api.run( "style.unassign_material_style", self.file, material=material, style=style2, context=context ) - assert item.Styles == (style,) + if self.file.schema != "IFC2X3": + assert item.Styles == (style,) + else: + # IfcPresentationStyleAssignment + assert len(item.Styles) == 1 + assert item.Styles[0].Styles == (style,) # unassign last style ifcopenshell.api.run( @@ -46,6 +51,9 @@ class TestAssignMaterialStyle(test.bootstrap.IFC4): assert len(self.file.by_type("IfcStyledRepresentation")) == 0 assert len(self.file.by_type("IfcStyledItem")) == 0 + +class TestUnassignMaterialStyleIFC4(test.bootstrap.IFC4, TestUnassignMaterialStyleIFC2X3): + # IfcMaterialConstituentSet was added in IFC4 def test_update_shape_aspect_representaitons_items_styles_if_material_is_part_of_matching_material_constituents( self, ): diff --git a/src/ifcopenshell-python/test/api/system/test_add_port.py b/src/ifcopenshell-python/test/api/system/test_add_port.py index e1d74be2e9..5a1a06f59f 100644 --- a/src/ifcopenshell-python/test/api/system/test_add_port.py +++ b/src/ifcopenshell-python/test/api/system/test_add_port.py @@ -26,6 +26,10 @@ class TestAddPort(test.bootstrap.IFC4): assert ifcopenshell.api.run("system.add_port", self.file).is_a("IfcDistributionPort") def test_assigning_a_port_as_well_if_an_element_is_specified(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcChiller") + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcFlowTerminal") port = ifcopenshell.api.run("system.add_port", self.file, element=element) assert ifcopenshell.util.system.get_ports(element) == [port] + + +class TestAddPortIFC2X3(test.bootstrap.IFC2X3, TestAddPort): + pass diff --git a/src/ifcopenshell-python/test/api/system/test_add_system.py b/src/ifcopenshell-python/test/api/system/test_add_system.py index 07c304cbba..2c0ed31b8a 100644 --- a/src/ifcopenshell-python/test/api/system/test_add_system.py +++ b/src/ifcopenshell-python/test/api/system/test_add_system.py @@ -25,4 +25,11 @@ class TestAddSystem(test.bootstrap.IFC4): system = ifcopenshell.api.run("system.add_system", self.file, ifc_class="IfcSystem") system2 = ifcopenshell.api.run("system.add_system", self.file, ifc_class="IfcDistributionSystem") assert system.is_a("IfcSystem") - assert system2.is_a("IfcDistributionSystem") + if self.file.schema == "IFC2X3": + assert system2.is_a("IfcSystem") + else: + assert system2.is_a("IfcDistributionSystem") + + +class TestAddSystemIFC2X3(test.bootstrap.IFC2X3, TestAddSystem): + pass diff --git a/src/ifcopenshell-python/test/api/system/test_assign_flow_control.py b/src/ifcopenshell-python/test/api/system/test_assign_flow_control.py index ac78e66633..038b22b83a 100644 --- a/src/ifcopenshell-python/test/api/system/test_assign_flow_control.py +++ b/src/ifcopenshell-python/test/api/system/test_assign_flow_control.py @@ -23,7 +23,7 @@ import ifcopenshell.api class TestAssignFlowControl(test.bootstrap.IFC4): def test_run(self): flow_element = self.file.createIfcFlowSegment() - flow_control = self.file.createIfcController() + flow_control = self.file.create_entity("IfcDistributionControlElement") # simple assignment relation = ifcopenshell.api.run( @@ -56,7 +56,7 @@ class TestAssignFlowControl(test.bootstrap.IFC4): assert relation is None # assigning another control to the same object - flow_control1 = self.file.createIfcController() + flow_control1 = self.file.create_entity("IfcDistributionControlElement") relation = ifcopenshell.api.run( "system.assign_flow_control", self.file, @@ -66,3 +66,7 @@ class TestAssignFlowControl(test.bootstrap.IFC4): assert len(self.file.by_type("IfcRelFlowControlElements")) == 1 assert relation.RelatingFlowElement == flow_element assert set(relation.RelatedControlElements) == set((flow_control, flow_control1)) + + +class TestAssignFlowControlIFC2X3(test.bootstrap.IFC2X3, TestAssignFlowControl): + pass diff --git a/src/ifcopenshell-python/test/api/system/test_connect_port.py b/src/ifcopenshell-python/test/api/system/test_connect_port.py index ab1325389a..8904ae05b6 100644 --- a/src/ifcopenshell-python/test/api/system/test_connect_port.py +++ b/src/ifcopenshell-python/test/api/system/test_connect_port.py @@ -108,8 +108,12 @@ class TestConnectPort(test.bootstrap.IFC4): def test_connecting_ports_with_a_realising_element(self): port = ifcopenshell.api.run("system.add_port", self.file) port2 = ifcopenshell.api.run("system.add_port", self.file) - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDuctFitting") + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcFlowFitting") ifcopenshell.api.run("system.connect_port", self.file, port1=port, port2=port2, element=element) assert self.file.by_type("IfcRelConnectsPorts")[0].RealizingElement == element ifcopenshell.api.run("system.connect_port", self.file, port1=port, port2=port2) assert self.file.by_type("IfcRelConnectsPorts")[0].RealizingElement is None + + +class TestConnectPortIFC2X3(test.bootstrap.IFC2X3, TestConnectPort): + pass diff --git a/src/ifcopenshell-python/test/api/system/test_disconnect_port.py b/src/ifcopenshell-python/test/api/system/test_disconnect_port.py index 8b2ade0310..a19b665700 100644 --- a/src/ifcopenshell-python/test/api/system/test_disconnect_port.py +++ b/src/ifcopenshell-python/test/api/system/test_disconnect_port.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.system -class TestConnectPort(test.bootstrap.IFC4): +class TestDisconnectPort(test.bootstrap.IFC4): def test_disconnecting_a_port(self): port = ifcopenshell.api.run("system.add_port", self.file) port2 = ifcopenshell.api.run("system.add_port", self.file) @@ -30,3 +30,7 @@ class TestConnectPort(test.bootstrap.IFC4): assert port.FlowDirection == None assert port2.FlowDirection == None assert len(self.file.by_type("IfcRelConnectsPorts")) == 0 + + +class TestDisconnectPortIFC2X3(test.bootstrap.IFC2X3, TestDisconnectPort): + pass diff --git a/src/ifcopenshell-python/test/api/system/test_remove_system.py b/src/ifcopenshell-python/test/api/system/test_remove_system.py index 86118cf943..0e1797eae1 100644 --- a/src/ifcopenshell-python/test/api/system/test_remove_system.py +++ b/src/ifcopenshell-python/test/api/system/test_remove_system.py @@ -27,7 +27,7 @@ class TestRemoveSystem(test.bootstrap.IFC4): assert len(self.file.by_type("IfcSystem")) == 0 def test_removing_orphaned_group_relationships(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcPump") + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcFlowTerminal") system = ifcopenshell.api.run("system.add_system", self.file, ifc_class="IfcSystem") ifcopenshell.api.run("system.assign_system", self.file, product=element, system=system) ifcopenshell.api.run("system.remove_system", self.file, system=system) @@ -41,3 +41,7 @@ class TestRemoveSystem(test.bootstrap.IFC4): assert not self.file.by_type("IfcRelDefinesByProperties") assert not self.file.by_type("IfcPropertySet") assert not self.file.by_type("IfcPropertySingleValue") + + +class TestRemoveSystemIFC2X3(test.bootstrap.IFC2X3, TestRemoveSystem): + pass diff --git a/src/ifcopenshell-python/test/api/system/test_unassign_flow_control.py b/src/ifcopenshell-python/test/api/system/test_unassign_flow_control.py index bb881367e6..873c497505 100644 --- a/src/ifcopenshell-python/test/api/system/test_unassign_flow_control.py +++ b/src/ifcopenshell-python/test/api/system/test_unassign_flow_control.py @@ -23,7 +23,7 @@ import ifcopenshell.api class TestUnassignFlowControl(test.bootstrap.IFC4): def test_run(self): flow_element = self.file.createIfcFlowSegment() - flow_control = self.file.createIfcController() + flow_control = self.file.create_entity("IfcDistributionControlElement") # assign and unassign relation = ifcopenshell.api.run( @@ -41,7 +41,7 @@ class TestUnassignFlowControl(test.bootstrap.IFC4): assert len(self.file.by_type("IfcRelFlowControlElements")) == 0 # 1 element 2 controls - flow_control1 = self.file.createIfcController() + flow_control1 = self.file.create_entity("IfcDistributionControlElement") relation = ifcopenshell.api.run( "system.assign_flow_control", self.file, @@ -62,3 +62,7 @@ class TestUnassignFlowControl(test.bootstrap.IFC4): ) assert len(self.file.by_type("IfcRelFlowControlElements")) == 1 assert relation.RelatedControlElements == (flow_control,) + + +class TestUnassignFlowControlIFC2X3(test.bootstrap.IFC2X3, TestUnassignFlowControl): + pass From 845d772a08f0998db033942370625be48fc9b43d Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 10 May 2024 17:08:35 +0500 Subject: [PATCH 148/429] move sequence.get_related_products to util module --- .../ifcopenshell/api/sequence/__init__.py | 1 - .../api/sequence/get_related_products.py | 76 ------------------- .../ifcopenshell/util/sequence.py | 53 +++++++++++++ 3 files changed, 53 insertions(+), 77 deletions(-) delete mode 100644 src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py index a901acec9c..1c922c364f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py @@ -49,7 +49,6 @@ from .edit_work_calendar import edit_work_calendar from .edit_work_plan import edit_work_plan from .edit_work_schedule import edit_work_schedule from .edit_work_time import edit_work_time -from .get_related_products import get_related_products try: from .recalculate_schedule import recalculate_schedule diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py deleted file mode 100644 index df402c31ed..0000000000 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/get_related_products.py +++ /dev/null @@ -1,76 +0,0 @@ -# IfcOpenShell - IFC toolkit and geometry engine -# Copyright (C) 2021 Dion Moult -# -# This file is part of IfcOpenShell. -# -# IfcOpenShell is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# IfcOpenShell is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with IfcOpenShell. If not, see . - -import ifcopenshell - - -def get_related_products(file, relating_product=None, related_object=None) -> None: - """Gets the related products being output by a task - - This API function will be removed in the future and migrated to a - utility module. - - :param relating_product: One of the products already output by the task. - :type relating_product: ifcopenshell.entity_instance - :param related_object: The IfcTask that you want to get all the related - products for. - :type related_object: ifcopenshell.entity_instance - :return: A set of IfcProducts output by the IfcTask. - :rtype: set[ifcopenshell.entity_instance] - - Example: - - .. code:: python - - # Let's imagine we are creating a construction schedule. All tasks - # need to be part of a work schedule. - schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") - - # Let's create a construction task. Note that the predefined type is - # important to distinguish types of tasks. - task = ifcopenshell.api.run("sequence.add_task", model, - work_schedule=schedule, name="Build wall", identification="A", predefined_type="CONSTRUCTION") - - # Let's say we have a wall somewhere. - wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") - - # Let's construct that wall! - ifcopenshell.api.run("sequence.assign_product", relating_product=wall, related_object=task) - - # This will give us a set with that wall in it. - products = ifcopenshell.api.run("sequence.get_related_products", model, related_object=task) - """ - settings = { - "relating_product": relating_product, - "related_object": related_object, - } - - products = set() - related_object = None - if settings["related_object"]: - related_object = settings["related_object"] - elif settings["relating_product"]: - for reference in settings["relating_product"].ReferencedBy: - if reference.is_a("IfcRelAssignsToProduct"): - related_object = reference.RelatedObjects[0] - if related_object: - assignments = settings["related_object"].HasAssignments - for assignment in assignments: - if assignment.is_a("IfcRelAssignsToProduct"): - products.add(assignment.RelatingProduct.id()) - return products diff --git a/src/ifcopenshell-python/ifcopenshell/util/sequence.py b/src/ifcopenshell-python/ifcopenshell/util/sequence.py index db98be456f..04bb4ad555 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/util/sequence.py @@ -478,3 +478,56 @@ def get_sequence_assignment(task: ifcopenshell.entity_instance, sequence="succes return result return [] + + +def get_related_products( + relating_product: Optional[ifcopenshell.entity_instance] = None, + related_object: Optional[ifcopenshell.entity_instance] = None, +) -> set[ifcopenshell.entity_instance]: + """Gets the related products being output by a task + + :param relating_product: One of the products already output by the task. + :type relating_product: ifcopenshell.entity_instance, optional + :param related_object: The IfcTask that you want to get all the related + products for. + :type related_object: ifcopenshell.entity_instance, optional + :return: A set of IfcProducts output by the IfcTask. + :rtype: set[ifcopenshell.entity_instance] + + Example: + + .. code:: python + + # Let's imagine we are creating a construction schedule. All tasks + # need to be part of a work schedule. + schedule = ifcopenshell.api.run("sequence.add_work_schedule", model, name="Construction Schedule A") + + # Let's create a construction task. Note that the predefined type is + # important to distinguish types of tasks. + task = ifcopenshell.api.run("sequence.add_task", model, + work_schedule=schedule, name="Build wall", identification="A", predefined_type="CONSTRUCTION") + + # Let's say we have a wall somewhere. + wall = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcWall") + + # Let's construct that wall! + ifcopenshell.api.run("sequence.assign_product", relating_product=wall, related_object=task) + + # This will give us a set with that wall in it. + products = ifcopenshell.util.sequence.get_related_products(related_object=task) + """ + + products = set() + related_object = None + if related_object: + related_object = related_object + elif relating_product: + for reference in relating_product.ReferencedBy: + if reference.is_a("IfcRelAssignsToProduct"): + related_object = reference.RelatedObjects[0] + if related_object: + assignments = related_object.HasAssignments + for assignment in assignments: + if assignment.is_a("IfcRelAssignsToProduct"): + products.add(assignment.RelatingProduct.id()) + return products From d2a708fcc4e9ed9a538dd04d08a515835d9dc161 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 10 May 2024 17:46:07 +0500 Subject: [PATCH 149/429] fix bug in ifc2x3 tests bootstrap it was creating new applications and users every time `ifcopenshell.api.owner.settings.get_user` or `ifcopenshell.api.owner.settings.get_application` was called --- src/ifcopenshell-python/test/bootstrap.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/test/bootstrap.py b/src/ifcopenshell-python/test/bootstrap.py index 1603fcdb26..678629cb28 100644 --- a/src/ifcopenshell-python/test/bootstrap.py +++ b/src/ifcopenshell-python/test/bootstrap.py @@ -20,6 +20,7 @@ import pytest import ifcopenshell import ifcopenshell.api import ifcopenshell.api.owner.settings +import functools class IFC4X3: @@ -46,7 +47,14 @@ class IFC2X3: @pytest.fixture(autouse=True) def setup(self): self.file: ifcopenshell.file = ifcopenshell.api.run("project.create_file", version="IFC2X3") - ifcopenshell.api.owner.settings.get_user = lambda ifc: ifc.createIfcPersonAndOrganization() - ifcopenshell.api.owner.settings.get_application = lambda ifc: ifc.createIfcApplication() + + @functools.cache + def get_user(ifc: ifcopenshell.file): + person = ifc.create_entity("IfcPerson") + organization = ifc.create_entity("IfcOrganization") + return ifc.create_entity("IfcPersonAndOrganization", ThePerson=person, TheOrganization=organization) + + ifcopenshell.api.owner.settings.get_user = get_user + ifcopenshell.api.owner.settings.get_application = functools.cache(lambda ifc: ifc.createIfcApplication()) ifcopenshell.api.pre_listeners = {} ifcopenshell.api.post_listeners = {} From 371e11de9bb883ee33843d79caa780a24c238539 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 10 May 2024 17:54:08 +0500 Subject: [PATCH 150/429] root.remove_product to consider IfcRelConnectsPortToElement --- .../ifcopenshell/api/root/remove_product.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py b/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py index 6a1c48b404..b78e75c801 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/remove_product.py @@ -183,6 +183,14 @@ def remove_product(file: ifcopenshell.file, product: ifcopenshell.entity_instanc file.remove(inverse) if history: ifcopenshell.util.element.remove_deep2(file, history) + elif inverse.is_a("IfcRelConnectsPortToElement"): + if inverse.RelatedElement == settings["product"]: + ifcopenshell.api.run("root.remove_product", file, product=inverse.RelatingPort) + elif inverse.RelatingPort == settings["product"]: + history = inverse.OwnerHistory + file.remove(inverse) + if history: + ifcopenshell.util.element.remove_deep2(file, history) elif inverse.is_a("IfcRelConnectsPorts"): if settings["product"] not in (inverse.RelatingPort, inverse.RelatedPort): # if it's not RelatingPort/RelatedPort then it's optional RealizingElement From 8e6c372a4f16f029babb216583eb00d034f9d313 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 15:00:30 +1000 Subject: [PATCH 151/429] Fix ability to run tests and segfaulting test --- src/ifcopenshell-python/ifcopenshell/api/__init__.py | 3 ++- .../ifcopenshell/api/document/add_information.py | 3 --- .../test/api/document/test_remove_information.py | 8 ++++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index 9c352f652d..7ecf53329f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -350,7 +350,8 @@ def wrap_usecases(path, name): module_name = name.split(".")[-1] module = sys.modules[name] for loader, usecase_name, is_pkg in pkgutil.iter_modules(path): - usecase = getattr(module, usecase_name) + # We may not be able to get the usecase if we are missing a dependency. + usecase = getattr(module, usecase_name, None) if callable(usecase): usecase_path = f"{module_name}.{usecase_name}" setattr(module, usecase_name, wrap_usecase(usecase_path, usecase)) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py index 86db04421c..a055399ba3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/add_information.py @@ -56,11 +56,8 @@ def add_information( attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", "Location": "A-GA-6100 - Overall Plan.pdf"}) """ - settings = {"parent": parent} - id_attribute = "DocumentId" if file.schema == "IFC2X3" else "Identification" information = file.create_entity("IfcDocumentInformation", **{id_attribute: "X", "Name": "Unnamed"}) - parent = settings["parent"] if not parent and file.by_type("IfcProject"): parent = file.by_type("IfcProject")[0] if parent.is_a("IfcProject") or parent.is_a("IfcContext"): diff --git a/src/ifcopenshell-python/test/api/document/test_remove_information.py b/src/ifcopenshell-python/test/api/document/test_remove_information.py index f84d313fe9..7615a6e277 100644 --- a/src/ifcopenshell-python/test/api/document/test_remove_information.py +++ b/src/ifcopenshell-python/test/api/document/test_remove_information.py @@ -22,14 +22,14 @@ import ifcopenshell.api class TestRemoveInformation(test.bootstrap.IFC4): def test_remove_information(self): - project = self.file.createIfcProject() + self.file.createIfcProject() element = ifcopenshell.api.run("document.add_information", self.file, parent=None) ifcopenshell.api.run("document.remove_information", self.file, information=element) assert len(self.file.by_type("IfcDocumentInformation")) == 0 assert len(self.file.by_type("IfcRelAssociatesDocument")) == 0 def test_removing_all_references_of_an_information(self): - project = self.file.createIfcProject() + self.file.createIfcProject() information = ifcopenshell.api.run("document.add_information", self.file, parent=None) ifcopenshell.api.run("document.add_reference", self.file, information=information) ifcopenshell.api.run("document.remove_information", self.file, information=information) @@ -51,7 +51,7 @@ class TestRemoveInformation(test.bootstrap.IFC4): assert len(self.file.by_type("IfcDocumentInformationRelationship")) == 0 def test_removing_all_subdocuments_and_their_references_too(self): - project = self.file.createIfcProject() + self.file.createIfcProject() information = ifcopenshell.api.run("document.add_information", self.file, parent=None) information2 = ifcopenshell.api.run("document.add_information", self.file, parent=information) ifcopenshell.api.run("document.add_reference", self.file, information=information2) @@ -62,5 +62,5 @@ class TestRemoveInformation(test.bootstrap.IFC4): assert len(self.file.by_type("IfcDocumentInformationRelationship")) == 0 -class TestRemoveInformationIFC2X3(test.bootstrap.IFC2X3, TestRemoveInformation): +class TestRemoveInformationIFC2X3(TestRemoveInformation, test.bootstrap.IFC2X3): pass From 6df6553935c4a9958b3bdfcaaf41dddcc7c2beeb Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 15:14:39 +1000 Subject: [PATCH 152/429] Notify user if duration parsing not available in util.date --- .../ifcopenshell/api/resource/add_resource_time.py | 6 +----- .../api/resource/calculate_resource_work.py | 12 +++++------- src/ifcopenshell-python/ifcopenshell/util/date.py | 6 ++---- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py index 10c9ad27fa..c353888656 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_time.py @@ -56,10 +56,6 @@ def add_resource_time(file: ifcopenshell.file, resource: ifcopenshell.entity_ins ifcopenshell.api.run("resource.edit_resource_time", model, resource_time=time, attributes={"ScheduleWork": "PT16H"}) """ - settings = { - "resource": resource, - } - resource_time = file.create_entity("IfcResourceTime") - settings["resource"].Usage = resource_time + resource.Usage = resource_time return resource_time diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py index 3bb6fe4cd4..29b80283c0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/calculate_resource_work.py @@ -56,17 +56,15 @@ def calculate_resource_work(file: ifcopenshell.file, resource: ifcopenshell.enti :return None: :rtype: None: """ - settings = {"resource": resource} - - if ifcopenshell.util.constraint.is_attribute_locked(settings["resource"], "Usage.ScheduleWork"): + if ifcopenshell.util.constraint.is_attribute_locked(resource, "Usage.ScheduleWork"): return - amount_worked = ifcopenshell.util.resource.get_resource_required_work(settings["resource"]) + amount_worked = ifcopenshell.util.resource.get_resource_required_work(resource) if not amount_worked: return - if not settings["resource"].Usage: + if not resource.Usage: ifcopenshell.api.run( "resource.add_resource_time", file, - resource=settings["resource"], + resource=resource, ) - settings["resource"].Usage.ScheduleWork = amount_worked + resource.Usage.ScheduleWork = amount_worked diff --git a/src/ifcopenshell-python/ifcopenshell/util/date.py b/src/ifcopenshell-python/ifcopenshell/util/date.py index 3ddee3e18f..ce2c72289a 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/date.py +++ b/src/ifcopenshell-python/ifcopenshell/util/date.py @@ -22,8 +22,8 @@ from dateutil import parser try: import isodate -except: - pass # Duration parsing not supported +except ModuleNotFoundError as e: + print(f"Note: duration parsing not available due to missing dependencies: util.date - {e}") def timedelta2duration(timedelta): @@ -187,8 +187,6 @@ def parse_duration(value): if "P" in value: try: return isodate.parse_duration(value) - except ModuleNotFoundError: - print("Duration parsing not supported: isodate module not found") except: print("Error parsing ISO string duration") return None From cd2570cdbbdda6d3f1e1f1d62c51679be4063ff9 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 15:18:18 +1000 Subject: [PATCH 153/429] Fix #4649. Bug where editing property set template enumerations didn't clean up properly. --- src/blenderbim/blenderbim/bim/import_ifc.py | 1 + .../bim/module/pset_template/operator.py | 38 ++++-------- .../api/pset_template/edit_prop_template.py | 19 +++++- .../test/api/pset_template/__init__.py | 17 +++++ .../pset_template/test_edit_prop_template.py | 62 +++++++++++++++++++ 5 files changed, 107 insertions(+), 30 deletions(-) create mode 100644 src/ifcopenshell-python/test/api/pset_template/__init__.py create mode 100644 src/ifcopenshell-python/test/api/pset_template/test_edit_prop_template.py diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index d58a97108b..7af955b97d 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -1929,6 +1929,7 @@ class IfcImporter: offset_point = np.linalg.inv(mat) @ offset_point verts = [None] * len(geometry.verts) for i in range(0, len(geometry.verts), 3): + # Note: this enh2xyz call is crazy slow. verts[i], verts[i + 1], verts[i + 2] = ifcopenshell.util.geolocation.enh2xyz( geometry.verts[i], geometry.verts[i + 1], diff --git a/src/blenderbim/blenderbim/bim/module/pset_template/operator.py b/src/blenderbim/blenderbim/bim/module/pset_template/operator.py index 895b512b65..e33f6d6c05 100644 --- a/src/blenderbim/blenderbim/bim/module/pset_template/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset_template/operator.py @@ -268,7 +268,6 @@ class RemovePropTemplate(bpy.types.Operator, Operator): prop_template: bpy.props.IntProperty() def _execute(self, context): - props = context.scene.BIMPsetTemplateProperties ifcopenshell.api.run( "pset_template.remove_prop_template", IfcStore.pset_template_file, @@ -287,21 +286,21 @@ class EditPropTemplate(bpy.types.Operator, Operator): def _execute(self, context): props = context.scene.BIMPsetTemplateProperties if props.active_prop_template.template_type == "P_ENUMERATEDVALUE": - enumerator = self.generate_prop_enum(props) + data_type = props.active_prop_template.get_value_name() + prop = props.active_prop_template + enumerators = [getattr(ev, data_type) for ev in prop.enum_values] else: - enumerator = None + enumerators = None ifcopenshell.api.run( "pset_template.edit_prop_template", IfcStore.pset_template_file, - **{ - "prop_template": IfcStore.pset_template_file.by_id(props.active_prop_template_id), - "attributes": { - "Name": props.active_prop_template.name, - "Description": props.active_prop_template.description, - "PrimaryMeasureType": props.active_prop_template.primary_measure_type, - "TemplateType": props.active_prop_template.template_type, - "Enumerators": enumerator, - }, + prop_template=IfcStore.pset_template_file.by_id(props.active_prop_template_id), + attributes={ + "Name": props.active_prop_template.name, + "Description": props.active_prop_template.description, + "PrimaryMeasureType": props.active_prop_template.primary_measure_type, + "TemplateType": props.active_prop_template.template_type, + "Enumerators": enumerators, } ) bpy.ops.bim.disable_editing_prop_template() @@ -309,18 +308,3 @@ class EditPropTemplate(bpy.types.Operator, Operator): blenderbim.bim.handler.refresh_ui_data() if tool.Ifc.get(): blenderbim.bim.schema.reload(tool.Ifc.get().schema) - - # TODO -This will need to go into the - # api code at some point - vulevukusej - def generate_prop_enum(self, props): - self.file = IfcStore.pset_template_file - data_type = props.active_prop_template.get_value_name() - prop = props.active_prop_template - prop_enum = self.file.create_entity( - "IFCPROPERTYENUMERATION", - Name=prop.name, - EnumerationValues=tuple( - self.file.create_entity(prop.primary_measure_type, getattr(ev, data_type)) for ev in prop.enum_values - ), - ) - return prop_enum diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py index 7a6d33990b..5c738bf8e0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/edit_prop_template.py @@ -47,7 +47,20 @@ def edit_prop_template( ifcopenshell.api.run("pset_template.edit_prop_template", model, prop_template=prop, attributes={"Name": "DemoA", "PrimaryMeasureType": "IfcLengthMeasure"}) """ - settings = {"prop_template": prop_template, "attributes": attributes} + if enum_values := attributes.get("Enumerators", None): + prop_name = attributes.get("Name", None) or getattr(prop_template, "Name", None) or "Unnamed" + primary_measure_type = ( + attributes.get("PrimaryMeasureType", None) or getattr(prop_template, "PrimaryMeasureType", None) or "IfcLabel" + ) + enum_values = [file.create_entity(primary_measure_type, v) for v in enum_values] + if enumerators := prop_template.Enumerators: + enumerators.Name = prop_name + enumerators.EnumerationValues = enum_values + else: + prop_template.Enumerators = file.create_entity("IfcPropertyEnumeration", prop_name, enum_values) - for name, value in settings["attributes"].items(): - setattr(settings["prop_template"], name, value) + if "Enumerators" in attributes: + del attributes["Enumerators"] + + for name, value in attributes.items(): + setattr(prop_template, name, value) diff --git a/src/ifcopenshell-python/test/api/pset_template/__init__.py b/src/ifcopenshell-python/test/api/pset_template/__init__.py new file mode 100644 index 0000000000..8bed51a56f --- /dev/null +++ b/src/ifcopenshell-python/test/api/pset_template/__init__.py @@ -0,0 +1,17 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . diff --git a/src/ifcopenshell-python/test/api/pset_template/test_edit_prop_template.py b/src/ifcopenshell-python/test/api/pset_template/test_edit_prop_template.py new file mode 100644 index 0000000000..18522189fc --- /dev/null +++ b/src/ifcopenshell-python/test/api/pset_template/test_edit_prop_template.py @@ -0,0 +1,62 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api + + +class TestEditPropTemplate(test.bootstrap.IFC4): + def test_editing_a_simple_template(self): + template = ifcopenshell.api.run("pset_template.add_pset_template", self.file, name="ABC_RiskFactors") + prop = ifcopenshell.api.run("pset_template.add_prop_template", self.file, pset_template=template) + ifcopenshell.api.run( + "pset_template.edit_prop_template", + self.file, + prop_template=prop, + attributes={"Name": "DemoA", "PrimaryMeasureType": "IfcLabel"}, + ) + ifcopenshell.api.run( + "pset_template.edit_prop_template", self.file, prop_template=prop, attributes={"Name": "DemoB"} + ) + assert prop.Name == "DemoB" + + def test_editing_an_enumeration(self): + template = ifcopenshell.api.run("pset_template.add_pset_template", self.file, name="ABC_RiskFactors") + prop = ifcopenshell.api.run("pset_template.add_prop_template", self.file, pset_template=template) + ifcopenshell.api.run( + "pset_template.edit_prop_template", + self.file, + prop_template=prop, + attributes={"Name": "DemoA", "PrimaryMeasureType": "IfcLabel"}, + ) + ifcopenshell.api.run( + "pset_template.edit_prop_template", + self.file, + prop_template=prop, + attributes={"Enumerators": ["FOO", "BAR"]}, + ) + assert prop.Enumerators.EnumerationValues == tuple(self.file.createIfcLabel(v) for v in ("FOO", "BAR")) + ifcopenshell.api.run( + "pset_template.edit_prop_template", + self.file, + prop_template=prop, + attributes={"Name": "DemoC", "Enumerators": ["BAZ", "BAR"]}, + ) + assert prop.Enumerators.Name == "DemoC" + assert prop.Enumerators.EnumerationValues == tuple(self.file.createIfcLabel(v) for v in ("BAZ", "BAR")) + assert len(self.file.by_type("IfcPropertyEnumeration")) == 1 From 94e5baf48a8f2b6dd7a1ffa2fead26627a0eaeeb Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 19:01:21 +1000 Subject: [PATCH 154/429] Fix #4647. Better error reporting if the user tries to activate a drawing that isn't available. --- .../blenderbim/bim/module/drawing/operator.py | 9 ++++++- src/blenderbim/blenderbim/core/drawing.py | 12 ++++++++- src/blenderbim/blenderbim/core/tool.py | 26 ++++++++++--------- src/blenderbim/blenderbim/tool/blender.py | 21 ++++++++++++--- src/blenderbim/blenderbim/tool/drawing.py | 19 +++----------- 5 files changed, 54 insertions(+), 33 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 41f1c5568d..d2bf5aca24 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -1515,7 +1515,14 @@ class ActivateDrawing(bpy.types.Operator): if not self.camera_view_point: viewport_position = tool.Blender.get_viewport_position() - core.activate_drawing_view(tool.Ifc, tool.Drawing, drawing=drawing) + try: + core.activate_drawing_view(tool.Ifc, tool.Blender, tool.Drawing, drawing=drawing) + except core.CameraNotAvailableError: + self.report( + {"ERROR"}, + "The drawing view is not available. Ensure you have not excluded it in the active view layer.", + ) + return {"CANCELLED"} if not self.camera_view_point: tool.Blender.set_viewport_position(viewport_position) diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index d4f6adab9b..f52fc2e1c5 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -441,9 +441,19 @@ def select_assigned_product(drawing, context): drawing.select_assigned_product(context) -def activate_drawing_view(ifc, drawing_tool, drawing): +def activate_drawing_view(ifc, blender, drawing_tool, drawing): camera = ifc.get_object(drawing) if not camera: camera = drawing_tool.import_drawing(drawing) drawing_tool.import_annotations_in_group(drawing_tool.get_drawing_group(drawing)) + blender.activate_camera(camera) + drawing_tool.isolate_camera_collection(camera) + try: + blender.set_active_object(camera) + except: + raise CameraNotAvailableError() drawing_tool.activate_drawing(camera) + + +class CameraNotAvailableError(Exception): + pass diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index d832bae89b..186ca93001 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -18,6 +18,7 @@ import abc import inspect +from typing import Optional # fmt: off # pylint: skip-file @@ -72,20 +73,21 @@ class Aggregate: @interface class Blender: - def set_active_object(cls, obj): pass - def get_name(cls, ifc_class, name): pass - def get_selected_objects(cls): pass - def create_ifc_object(cls, ifc_class: str, name: str = None, data=None): pass - def get_obj_ifc_definition_id(cls, obj=None, obj_type=None, context=None): pass - def is_ifc_object(cls, obj): pass - def is_ifc_class_active(cls, ifc_class): pass - def get_viewport_context(cls): pass - def update_viewport(cls): pass - def get_default_selection_keypmap(cls): pass - def get_object_bounding_box(cls, obj): pass + def activate_camera(cls, obj): pass def apply_bmesh(cls, mesh, bm, obj=None): pass - def get_bmesh_for_mesh(cls, mesh, clean=False): pass def bmesh_join(cls, bm_a, bm_b, callback=None): pass + def create_ifc_object(cls, ifc_class: str, name: Optional[str] = None, data=None): pass + def get_bmesh_for_mesh(cls, mesh, clean=False): pass + def get_default_selection_keypmap(cls): pass + def get_name(cls, ifc_class, name): pass + def get_obj_ifc_definition_id(cls, obj=None, obj_type=None, context=None): pass + def get_object_bounding_box(cls, obj): pass + def get_selected_objects(cls): pass + def get_viewport_context(cls): pass + def is_ifc_class_active(cls, ifc_class): pass + def is_ifc_object(cls, obj): pass + def set_active_object(cls, obj): pass + def update_viewport(cls): pass @interface diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 63bec8569f..d5055bf9bf 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -49,6 +49,23 @@ class Blender(blenderbim.core.tool.Blender): OBJECT_TYPES_THAT_SUPPORT_EDIT_GPENCIL_MODE = ("GPENCIL",) TYPE_MANAGER_ICON = "LIGHTPROBE_VOLUME" if bpy.app.version >= (4, 1, 0) else "LIGHTPROBE_GRID" + @classmethod + def activate_camera(cls, obj: bpy.types.Object) -> None: + area = tool.Blender.get_view3d_area() + is_local_view = area.spaces[0].local_view is not None + if is_local_view: + # Turn off local view before activating drawing, and then turn it on again. + for a in bpy.context.screen.areas: + if a.type == "VIEW_3D": + override = bpy.context.copy() + override["area"] = a + bpy.ops.view3d.localview(override) + bpy.context.scene.camera = obj + bpy.ops.view3d.localview(override) + else: + bpy.context.scene.camera = obj + area.spaces[0].region_3d.view_perspective = "CAMERA" + @classmethod def get_area_props(cls, context: bpy.types.Context) -> Any: try: @@ -845,9 +862,7 @@ class Blender(blenderbim.core.tool.Blender): bpy.utils.register_tool(ws_model.PipeTool, after={"bim.duct_tool"}, separator=False, group=False) bpy.utils.register_tool(ws_model.BimTool, after={"bim.pipe_tool"}, separator=False, group=False) bpy.utils.register_tool(ws_drawing.AnnotationTool, after={"bim.bim_tool"}, separator=True, group=False) - bpy.utils.register_tool( - ws_spatial.SpatialTool, after={"bim.annotation_tool"}, separator=False, group=False - ) + bpy.utils.register_tool(ws_spatial.SpatialTool, after={"bim.annotation_tool"}, separator=False, group=False) bpy.utils.register_tool( ws_structural.StructuralTool, after={"bim.spatial_tool"}, separator=False, group=False ) diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 7cdb5adfbd..0d38dc2fe7 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -1743,21 +1743,7 @@ class Drawing(blenderbim.core.tool.Drawing): bpy.ops.bim.activate_model() @classmethod - def activate_drawing(cls, camera: bpy.types.Object) -> None: - area = tool.Blender.get_view3d_area() - is_local_view = area.spaces[0].local_view is not None - if is_local_view: - # turn off local view before activating drawing, and then turn it on again. - for a in bpy.context.screen.areas: - if a.type == "VIEW_3D": - override = bpy.context.copy() - override["area"] = a - bpy.ops.view3d.localview(override) - bpy.context.scene.camera = camera - bpy.ops.view3d.localview(override) - else: - bpy.context.scene.camera = camera - area.spaces[0].region_3d.view_perspective = "CAMERA" + def isolate_camera_collection(cls, camera: bpy.types.Object) -> None: views_collection = bpy.data.collections.get("Views") for collection in views_collection.children: # We assume the project collection is at the top level @@ -1775,8 +1761,9 @@ class Drawing(blenderbim.core.tool.Drawing): camera.BIMObjectProperties.collection.name ].hide_viewport = False camera.BIMObjectProperties.collection.hide_render = False - tool.Spatial.set_active_object(camera) + @classmethod + def activate_drawing(cls, camera: bpy.types.Object) -> None: # Sync viewport objects visibility with selectors from EPset_Drawing/Include and /Exclude drawing = tool.Ifc.get_entity(camera) From 811a908cc37c239bca163dfcc6729ed610be3d93 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 19:01:57 +1000 Subject: [PATCH 155/429] More segfault fixes in test suite (maybe order matters only on Linux?) --- src/ifcopenshell-python/test/api/root/test_remove_product.py | 2 +- .../test/api/system/test_unassign_flow_control.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/test/api/root/test_remove_product.py b/src/ifcopenshell-python/test/api/root/test_remove_product.py index 91a2cf6e31..28d5a21f3c 100644 --- a/src/ifcopenshell-python/test/api/root/test_remove_product.py +++ b/src/ifcopenshell-python/test/api/root/test_remove_product.py @@ -458,5 +458,5 @@ class TestRemoveProduct(test.bootstrap.IFC4): assert not self.file.by_type("IfcRelFlowControlElements") -class TestRemoveProductIFC2X3(test.bootstrap.IFC2X3, TestRemoveProduct): +class TestRemoveProductIFC2X3(TestRemoveProduct, test.bootstrap.IFC2X3): pass diff --git a/src/ifcopenshell-python/test/api/system/test_unassign_flow_control.py b/src/ifcopenshell-python/test/api/system/test_unassign_flow_control.py index 873c497505..1ece358dfd 100644 --- a/src/ifcopenshell-python/test/api/system/test_unassign_flow_control.py +++ b/src/ifcopenshell-python/test/api/system/test_unassign_flow_control.py @@ -64,5 +64,5 @@ class TestUnassignFlowControl(test.bootstrap.IFC4): assert relation.RelatedControlElements == (flow_control,) -class TestUnassignFlowControlIFC2X3(test.bootstrap.IFC2X3, TestUnassignFlowControl): +class TestUnassignFlowControlIFC2X3(TestUnassignFlowControl, test.bootstrap.IFC2X3): pass From a0d27c3f1cfd0f047996022138e7f8636773b935 Mon Sep 17 00:00:00 2001 From: Kurt Battisti Date: Sat, 11 May 2024 11:04:35 +0200 Subject: [PATCH 156/429] Make Whole status UI message clearer (#4658) Replace UI text "No Aggregate" with "No Whole relation defined" to avoid misinterpretation when instance is a whole with parts. --- src/blenderbim/blenderbim/bim/module/aggregate/ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py index e7b47eefc3..f585787162 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py @@ -73,7 +73,7 @@ class BIM_PT_aggregate(Panel): row.operator("bim.add_aggregate", icon="ADD", text="") op = row.operator("bim.aggregate_unassign_object", icon="X", text="") else: - row.label(text="No Aggregate", icon="TRIA_UP") + row.label(text="No Whole relation defined", icon="TRIA_UP") row.operator("bim.enable_editing_aggregate", icon="GREASEPENCIL", text="") row.operator("bim.add_aggregate", icon="ADD", text="") From c3fbb110934ff469034541819ee0285261315da1 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 19:38:15 +1000 Subject: [PATCH 157/429] See #4657. Restrict annotation psets to their particular predefined type. --- .../blenderbim/bim/data/pset/EPset_Drawing.ifc | 2 +- .../blenderbim/bim/data/pset/Psets_BBIM_Annotation.ifc | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/data/pset/EPset_Drawing.ifc b/src/blenderbim/blenderbim/bim/data/pset/EPset_Drawing.ifc index 13e2c4e629..9e23793f74 100644 --- a/src/blenderbim/blenderbim/bim/data/pset/EPset_Drawing.ifc +++ b/src/blenderbim/blenderbim/bim/data/pset/EPset_Drawing.ifc @@ -5,7 +5,7 @@ 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,#22,#23)); +#1=IFCPROPERTYSETTEMPLATE('2JhNIvqZrFnAgxfhK0XVQX',$,'EPset_Drawing','',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation/DRAWING',(#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19,#20,#21,#22,#23)); #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.); diff --git a/src/blenderbim/blenderbim/bim/data/pset/Psets_BBIM_Annotation.ifc b/src/blenderbim/blenderbim/bim/data/pset/Psets_BBIM_Annotation.ifc index cefd92a827..9d04b9c00c 100644 --- a/src/blenderbim/blenderbim/bim/data/pset/Psets_BBIM_Annotation.ifc +++ b/src/blenderbim/blenderbim/bim/data/pset/Psets_BBIM_Annotation.ifc @@ -5,20 +5,20 @@ FILE_NAME('Psets_BBIM_Annotation.ifc','2020-01-01T00:00:00',(),(),'Psets_BBIM_An FILE_SCHEMA(('IFC4')); ENDSEC; DATA; -#1=IFCPROPERTYSETTEMPLATE('3VuPUwdCD2Qx3XDDRs0R1N',$,'EPset_Annotation','',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation,IfcTypeProduct',(#2,#3,#4)); +#1=IFCPROPERTYSETTEMPLATE('3VuPUwdCD2Qx3XDDRs0R1N',$,'EPset_Annotation','',.PSET_TYPEDRIVENOVERRIDE.,'IfcAnnotation,IfcTypeProduct',(#2,#3,#4)); #2=IFCSIMPLEPROPERTYTEMPLATE('2P7JN79n96Q9pElZ83LKe4',$,'ZIndex','',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #3=IFCSIMPLEPROPERTYTEMPLATE('1Wpx_r2xj1_9w5JpI0QRJy',$,'Symbol','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #4=IFCSIMPLEPROPERTYTEMPLATE('3q0oxMUKP47vZ4jnyG$dDb',$,'Classes','Classes separarated by spaces that end up in classes for this element in svg. Can be used to specify the text font size: small - 1.8mm; regular - 2.5mm; large - 3.5mm; header - 5mm; title - 7mm. By default regular size is used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#5=IFCPROPERTYSETTEMPLATE('0iKwujnQL9IevVQato8f7Z',$,'BBIM_Batting','',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation,IfcTypeProduct',(#6,#7)); +#5=IFCPROPERTYSETTEMPLATE('0iKwujnQL9IevVQato8f7Z',$,'BBIM_Batting','',.PSET_TYPEDRIVENOVERRIDE.,'IfcAnnotation/BATTING,IfcTypeProduct',(#6,#7)); #6=IFCSIMPLEPROPERTYTEMPLATE('0t2LEesGT1QRQtrIZUAR8L',$,'Thickness','Batting thickness',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #7=IFCSIMPLEPROPERTYTEMPLATE('082PndS6v2kBOiJoSboMnh',$,'Reverse pattern direction','Reverse batting pattern (swap starting and ending points)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#8=IFCPROPERTYSETTEMPLATE('1Dx2EiZnP67xotInXpwz90',$,'BBIM_Section','',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation,IfcTypeProduct',(#9,#10,#11,#12,#13)); +#8=IFCPROPERTYSETTEMPLATE('1Dx2EiZnP67xotInXpwz90',$,'BBIM_Section','',.PSET_TYPEDRIVENOVERRIDE.,'IfcAnnotation/SECTION,IfcTypeProduct',(#9,#10,#11,#12,#13)); #9=IFCSIMPLEPROPERTYTEMPLATE('2a_9s8spHDc9dZHtgg71XL',$,'ShowStartArrow','Display start arrow.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #10=IFCSIMPLEPROPERTYTEMPLATE('3i6SH_GbT7zhKea$wVE56A',$,'StartArrowSymbol','Custom symbol for the start of the section marker arrow. Need to make sure it''s present in "symbols.svg".',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #11=IFCSIMPLEPROPERTYTEMPLATE('1DtsPn5a9FG8$zXHDDMavY',$,'ShowEndArrow','Display end arrow.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #12=IFCSIMPLEPROPERTYTEMPLATE('2$6U0mLI9AiPRWeBabdY3u',$,'EndArrowSymbol','Custom symbol for the end of the section marker arrow. Need to make sure it''s present in "symbols.svg".',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #13=IFCSIMPLEPROPERTYTEMPLATE('1naFqntIL7igCY7hCaE7kq',$,'HasConnectedSectionLine','Connect or disconnect section markers with line (by default = True).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#14=IFCPROPERTYSETTEMPLATE('3V8oZ8YRD3_O7uR5vcUleS',$,'BBIM_Documentation','',.PSET_OCCURRENCEDRIVEN.,'IfcProject',(#15,#16,#17,#18,#19,#20,#21,#22,#23)); +#14=IFCPROPERTYSETTEMPLATE('3V8oZ8YRD3_O7uR5vcUleS',$,'BBIM_Documentation','',.PSET_TYPEDRIVENOVERRIDE.,'IfcProject',(#15,#16,#17,#18,#19,#20,#21,#22,#23)); #15=IFCSIMPLEPROPERTYTEMPLATE('0ulAhgk3v9qfGlDILauR6J',$,'SheetsDir','Default sheets directory',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #16=IFCSIMPLEPROPERTYTEMPLATE('2yvlVKiQXASucfH40deCvu',$,'LayoutsDir','Default layouts directory',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #17=IFCSIMPLEPROPERTYTEMPLATE('2kXZqXicL3jRwsOnLM_0ho',$,'TitleblocksDir','Default titleblocks directory',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -28,7 +28,7 @@ DATA; #21=IFCSIMPLEPROPERTYTEMPLATE('1UDakJ5_f7kBhggNSW4$h5',$,'SymbolsPath','Default symbols SVG',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #22=IFCSIMPLEPROPERTYTEMPLATE('0d53LEtgLDQxnv__NfgH7i',$,'PatternsPath','Default patterns SVG',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #23=IFCSIMPLEPROPERTYTEMPLATE('26qFNMv7nCHgU6Jd7Anga5',$,'ShadingStylesPath','Default shading styles',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#24=IFCPROPERTYSETTEMPLATE('0I9merLinF5Ap$aZwaclgm',$,'BBIM_Dimension','',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation,IfcTypeProduct',(#25,#26,#27,#28)); +#24=IFCPROPERTYSETTEMPLATE('0I9merLinF5Ap$aZwaclgm',$,'BBIM_Dimension','',.PSET_TYPEDRIVENOVERRIDE.,'IfcAnnotation/DIMENSION,IfcTypeProduct',(#25,#26,#27,#28)); #25=IFCSIMPLEPROPERTYTEMPLATE('1rL2AbQsXD8RbpoWH5pYOV',$,'ShowDescriptionOnly','Hide the measurement values and show only annotation description',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #26=IFCSIMPLEPROPERTYTEMPLATE('0SVyOfB0rC2xNfdRYf3XvY',$,'SuppressZeroInches','Suppress 0 inch values in dimension annotation text (for example: 12'' - 0" -> 12'')',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #27=IFCSIMPLEPROPERTYTEMPLATE('2bUmj458PBqPAtUoI3MXsb',$,'TextPrefix','Text to add before annotation measurement value',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); From 00ae6809a92934bbfd9223f2d70f93265c1ca9ad Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 19:59:39 +1000 Subject: [PATCH 158/429] See #4657. Fallback to copying cache if moving cache fails due to permission error. --- src/blenderbim/blenderbim/bim/ifc.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/ifc.py b/src/blenderbim/blenderbim/bim/ifc.py index 60210e9700..3717451b65 100644 --- a/src/blenderbim/blenderbim/bim/ifc.py +++ b/src/blenderbim/blenderbim/bim/ifc.py @@ -19,6 +19,7 @@ import os import bpy import uuid +import shutil import hashlib import zipfile import tempfile @@ -121,7 +122,13 @@ class IfcStore: ifc_hash = hashlib.md5(ifc_key.encode("utf-8")).hexdigest() new_cache_path = os.path.join(bpy.context.scene.BIMProperties.data_dir, "cache", f"{ifc_hash}.h5") IfcStore.cache = None - os.replace(IfcStore.cache_path, new_cache_path) + try: + shutil.move(IfcStore.cache_path, new_cache_path) + except PermissionError: + try: + shutil.copy2(IfcStore.cache_path, new_cache_path) + except PermissionError: + pass # Well we tried. No cache for you! IfcStore.get_cache() @staticmethod From 3fa573e3c108d1706329a3d25991b3b6bbecfb08 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 20:48:38 +1000 Subject: [PATCH 159/429] Fix #4615. Report to user if they are attempting to create an incompatible context-representation combination. --- .../bim/module/geometry/operator.py | 29 ++++++++++++------- src/blenderbim/blenderbim/core/geometry.py | 9 +++++- .../api/geometry/add_representation.py | 22 +++++++------- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index aacb218c2e..7458de0c87 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -149,6 +149,8 @@ class AddRepresentation(bpy.types.Operator, Operator): return ifc_context = tool.Ifc.get().by_id(ifc_context) + original_data = obj.data + if self.representation_conversion_method == "OUTLINE": if ifc_context.ContextType == "Plan": data = tool.Geometry.generate_outline_mesh(obj, axis="+Z") @@ -166,16 +168,23 @@ class AddRepresentation(bpy.types.Operator, Operator): data = tool.Geometry.generate_3d_box_mesh(obj) tool.Geometry.change_object_data(obj, data, is_global=True) - core.add_representation( - tool.Ifc, - tool.Geometry, - tool.Style, - tool.Surveyor, - obj=obj, - context=ifc_context, - ifc_representation_class=None, - profile_set_usage=None, - ) + try: + core.add_representation( + tool.Ifc, + tool.Geometry, + tool.Style, + tool.Surveyor, + obj=obj, + context=ifc_context, + ifc_representation_class=None, + profile_set_usage=None, + ) + except core.IncompatibleRepresentationError: + if obj.data != original_data: + tool.Geometry.change_object_data(obj, original_data, is_global=True) + bpy.data.meshes.remove(data) + self.report({"ERROR"}, "No compatible representation for the context could be created.") + return {"CANCELLED"} def invoke(self, context, event): return context.window_manager.invoke_props_dialog(self) diff --git a/src/blenderbim/blenderbim/core/geometry.py b/src/blenderbim/blenderbim/core/geometry.py index 6226059ebb..6f34203b8a 100644 --- a/src/blenderbim/blenderbim/core/geometry.py +++ b/src/blenderbim/blenderbim/core/geometry.py @@ -47,7 +47,7 @@ def add_representation( data = geometry.get_object_data(obj) if not data and ifc_representation_class != "IfcTextLiteral": - return + raise IncompatibleRepresentationError() representation = ifc.run( "geometry.add_representation", @@ -63,6 +63,9 @@ def add_representation( profile_set_usage=profile_set_usage, ) + if not representation: + raise IncompatibleRepresentationError() + if geometry.is_body_representation(representation): [geometry.run_style_add_style(obj=mat) for mat in geometry.get_object_materials_without_styles(obj)] ifc.run( @@ -221,3 +224,7 @@ def edit_similar_opening_placement(geometry, opening=None, similar_openings=None old_placement = similar_opening.ObjectPlacement similar_opening.ObjectPlacement = opening.ObjectPlacement geometry.delete_opening_object_placement(old_placement) + + +class IncompatibleRepresentationError(Exception): + pass diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index fee0dc7dd1..aa98a15f3c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -352,12 +352,10 @@ class Usecase: ) def create_curve3d_representation(self): - return self.file.createIfcShapeRepresentation( - self.settings["context"], - self.settings["context"].ContextIdentifier, - "Curve3D", - self.create_curves(), - ) + if curves := self.create_curves(): + return self.file.createIfcShapeRepresentation( + self.settings["context"], self.settings["context"].ContextIdentifier, "Curve3D", curves + ) def create_curve2d_representation(self): return self.file.createIfcShapeRepresentation( @@ -425,7 +423,7 @@ class Usecase: results.append(self.file.createIfcSweptDiskSolid(curve, radius)) return results - def is_mesh_curve_consequtive(self, geom_data): + def is_mesh_curve_consecutive(self, geom_data): import blenderbim.tool as tool bm = tool.Blender.get_bmesh_for_mesh(geom_data) @@ -475,11 +473,11 @@ class Usecase: geom_data = self.settings["geometry"] if isinstance(geom_data, bpy.types.Mesh): - if self.is_mesh_curve_consequtive(geom_data): - if self.file.schema == "IFC2X3": - return self.create_curves_from_mesh_ifc2x3(should_exclude_faces=should_exclude_faces, is_2d=is_2d) - else: - return self.create_curves_from_mesh(should_exclude_faces=should_exclude_faces, is_2d=is_2d) + if not self.is_mesh_curve_consecutive(geom_data): + return + if self.file.schema == "IFC2X3": + return self.create_curves_from_mesh_ifc2x3(should_exclude_faces=should_exclude_faces, is_2d=is_2d) + return self.create_curves_from_mesh(should_exclude_faces=should_exclude_faces, is_2d=is_2d) import blenderbim.tool as tool From 55026ca996156c2f2d0b91a19744283af5eb9f54 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 22:29:39 +1000 Subject: [PATCH 160/429] Fix #4616. You can now create a new representation based off any other object. This makes it easy to custom model whatever you want as a starting point. --- .../blenderbim/bim/module/geometry/operator.py | 18 +++++++++++++++--- .../blenderbim/bim/module/geometry/prop.py | 1 + 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 7458de0c87..6a3909539a 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -136,15 +136,17 @@ class AddRepresentation(bpy.types.Operator, Operator): "for Profile - 2D bounding box by local XZ axes.\n" "For other contexts - bounding box is 3d.", ), - ("PROJECT", "Full Representation", ""), + ("OBJECT", "From Object", "Copies geometry from another object"), + ("PROJECT", "Full Representation", "Reuses the current representation"), ], name="Representation Conversion Method", ) def _execute(self, context): obj = context.active_object - props = obj.BIMGeometryProperties - ifc_context = int(props.contexts or "0") or None + props = context.scene.BIMGeometryProperties + oprops = obj.BIMGeometryProperties + ifc_context = int(oprops.contexts or "0") or None if not ifc_context: return ifc_context = tool.Ifc.get().by_id(ifc_context) @@ -167,6 +169,13 @@ class AddRepresentation(bpy.types.Operator, Operator): else: data = tool.Geometry.generate_3d_box_mesh(obj) tool.Geometry.change_object_data(obj, data, is_global=True) + elif ( + self.representation_conversion_method == "OBJECT" + and props.representation_from_object + and props.representation_from_object.data + ): + data = tool.Geometry.duplicate_object_data(props.representation_from_object) + tool.Geometry.change_object_data(obj, data, is_global=True) try: core.add_representation( @@ -192,6 +201,9 @@ class AddRepresentation(bpy.types.Operator, Operator): def draw(self, context): row = self.layout.row() row.prop(self, "representation_conversion_method", text="") + if self.representation_conversion_method == "OBJECT": + row = self.layout.row() + row.prop(context.scene.BIMGeometryProperties, "representation_from_object", text="") class SelectConnection(bpy.types.Operator, Operator): diff --git a/src/blenderbim/blenderbim/bim/module/geometry/prop.py b/src/blenderbim/blenderbim/bim/module/geometry/prop.py index 4960c9f74c..83e1069b7e 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/prop.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/prop.py @@ -138,3 +138,4 @@ class BIMGeometryProperties(PropertyGroup): name="IFC Interaction Mode", update=update_mode, ) + representation_from_object: PointerProperty(type=bpy.types.Object) From b7737cb6d304f565445e5ead6573a675125c202f Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 11 May 2024 22:57:16 +1000 Subject: [PATCH 161/429] Fix #4655. `profiles` is now available as a keyword in the selector syntax. --- .../docs/ifcopenshell-python/selector_syntax.rst | 1 + src/ifcopenshell-python/ifcopenshell/util/selector.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst index a21594ace5..e322ac675c 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst @@ -186,6 +186,7 @@ Valid keys are: "``material`` or ``mat``", "Gets the assigned material, which may be a material set." "``item`` or ``i``", "If the previous key returns a material set, gets the relevant material set items" "``materials`` or ``mats``", "Gets a list of IfcMaterials assigned directly or indirectly (such as via a material set) to the element" + "``profiles``", "Gets a list of IfcProfileDefs assigned (such as via a material profile) or used (such as in an extrusion) in the element" "``x``", "Gets the X coordinate of the element's placement" "``y``", "Gets the Y coordinate of the element's placement" "``z``", "Gets the Z coordinate of the element's placement" diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index d713a331c4..582879f9d3 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -970,6 +970,8 @@ class Selector: value = ifcopenshell.util.element.get_material(value, should_skip_usage=True) elif key in ("materials", "mats"): value = ifcopenshell.util.element.get_materials(value) + elif key == "profiles": + value = ifcopenshell.util.shape.get_profiles(value) elif key == "styles": value = ifcopenshell.util.element.get_styles(value) elif key in ("item", "i"): From aca26c759726b827c56e8e01e8ba9c5e32568eb6 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 12 May 2024 17:16:50 +1000 Subject: [PATCH 162/429] Fix #4659. --- src/blenderbim/blenderbim/core/geometry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/core/geometry.py b/src/blenderbim/blenderbim/core/geometry.py index 6f34203b8a..7e68829c2a 100644 --- a/src/blenderbim/blenderbim/core/geometry.py +++ b/src/blenderbim/blenderbim/core/geometry.py @@ -47,7 +47,7 @@ def add_representation( data = geometry.get_object_data(obj) if not data and ifc_representation_class != "IfcTextLiteral": - raise IncompatibleRepresentationError() + return representation = ifc.run( "geometry.add_representation", From ac686db2989bf2243b322eac7eaa4efbfd6e63cb Mon Sep 17 00:00:00 2001 From: Gorgious56 Date: Mon, 13 May 2024 11:57:48 +0200 Subject: [PATCH 163/429] Prevent error when user deletes all spatial structure elements and the spatial manager panel is expanded --- src/blenderbim/blenderbim/bim/module/spatial/prop.py | 2 ++ src/blenderbim/blenderbim/bim/module/spatial/ui.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/spatial/prop.py b/src/blenderbim/blenderbim/bim/module/spatial/prop.py index 23614a1c96..d9d8aa6357 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/prop.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/prop.py @@ -44,6 +44,8 @@ def update_elevation(self, context): def update_active_container_index(self, context): + if self.active_container_index < 0: + return self.active_container_id = self.containers[self.active_container_index].ifc_definition_id self.container_name = self.containers[self.active_container_index].name self.elevation = self.containers[self.active_container_index].elevation diff --git a/src/blenderbim/blenderbim/bim/module/spatial/ui.py b/src/blenderbim/blenderbim/bim/module/spatial/ui.py index c697ebb8e2..04dfd23926 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/ui.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/ui.py @@ -116,7 +116,7 @@ class BIM_PT_SpatialManager(Panel): self.props = context.scene.BIMSpatialManagerProperties row = self.layout.row() row.operator("bim.load_container_manager", icon="FILE_REFRESH", text="Load Spatial Structure") - if self.props.active_container_index < len(self.props.containers): + if 0 <= self.props.active_container_index < len(self.props.containers): ifc_definition_id = self.props.containers[self.props.active_container_index].ifc_definition_id row = self.layout.row() row.alignment = "RIGHT" @@ -134,7 +134,7 @@ class BIM_PT_SpatialManager(Panel): "active_container_index", ) row = self.layout.row() - if self.props.active_container_index < len(self.props.containers): + if 0 <= self.props.active_container_index < len(self.props.containers): row.prop(self.props, "container_name", text="") row.prop(self.props, "elevation", text="") op = row.operator("bim.edit_container_attributes", icon="CHECKMARK", text="Apply") From 3320accc7a4c93dc3478ba22b00d269d818f9be5 Mon Sep 17 00:00:00 2001 From: Gorgious56 Date: Mon, 13 May 2024 12:00:01 +0200 Subject: [PATCH 164/429] The error box is now drawn in red to draw attention to it --- src/blenderbim/blenderbim/bim/ui.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 29c02d5f63..017304a123 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -406,6 +406,7 @@ class BIM_PT_tabs(Panel): if blenderbim.last_error: box = self.layout.box() + box.alert=True row = box.row(align=True) row.label(text="BlenderBIM experienced an error :(", icon="ERROR") row.operator("bim.close_error", text="", icon="CANCEL") From 76e6c63a018b635a99035b48c2ad3be4d92b5acf Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 11:43:52 +0500 Subject: [PATCH 165/429] ifc2x3 tests - prevent using removed user/application When some test was creating an element and then removing it, it would also remove user and application as they wasn't used anywhere else. `ifcopenshell.util.element.remove_deep2(file, history)` we use in every api for element deletion can possibly remove user and application which can be unsafe if `get_user` is returning some specific entity that then will become invalid. Also fixed tests breaking due ifcownerhistory and user/application appearing in ifc2x3. --- .../test/api/root/test_remove_product.py | 96 ++++++++++--------- src/ifcopenshell-python/test/bootstrap.py | 17 +++- 2 files changed, 64 insertions(+), 49 deletions(-) diff --git a/src/ifcopenshell-python/test/api/root/test_remove_product.py b/src/ifcopenshell-python/test/api/root/test_remove_product.py index 28d5a21f3c..ebfaa8a4d8 100644 --- a/src/ifcopenshell-python/test/api/root/test_remove_product.py +++ b/src/ifcopenshell-python/test/api/root/test_remove_product.py @@ -77,6 +77,7 @@ class TestRemoveProduct(test.bootstrap.IFC4): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") ifcopenshell.api.run("unit.assign_unit", self.file) context = ifcopenshell.api.run("context.add_context", self.file, context_type="Model") + total_entities = len(list(self.file)) element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") element.Representation = self.file.createIfcProductDefinitionShape( Representations=[ @@ -85,9 +86,8 @@ class TestRemoveProduct(test.bootstrap.IFC4): ) ] ) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=element) - assert len(list(self.file)) == total_entities - 4 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcProductDefinitionShape")) == 0 assert len(self.file.by_type("IfcShapeRepresentation")) == 0 assert len(self.file.by_type("IfcExtrudedAreaSolid")) == 0 @@ -97,9 +97,7 @@ class TestRemoveProduct(test.bootstrap.IFC4): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") ifcopenshell.api.run("unit.assign_unit", self.file) context = ifcopenshell.api.run("context.add_context", self.file, context_type="Model") - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") - ifcopenshell.api.run("type.assign_type", self.file, related_objects=[element], relating_type=element_type) rep_map = self.file.createIfcRepresentationMap( MappingOrigin=self.file.createIfcAxis2Placement3D(), MappedRepresentation=self.file.createIfcShapeRepresentation( @@ -107,6 +105,16 @@ class TestRemoveProduct(test.bootstrap.IFC4): ), ) element_type.RepresentationMaps = [rep_map] + total_entities = len(list(self.file)) + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + # should_map_representations=False to create mapping manually + ifcopenshell.api.run( + "type.assign_type", + self.file, + related_objects=[element], + relating_type=element_type, + should_map_representations=False, + ) element.Representation = self.file.createIfcProductDefinitionShape( Representations=[ self.file.createIfcShapeRepresentation( @@ -120,10 +128,9 @@ class TestRemoveProduct(test.bootstrap.IFC4): ) ] ) - total_entities = len(list(self.file)) assert len(self.file.by_type("IfcShapeRepresentation")) == 2 ifcopenshell.api.run("root.remove_product", self.file, product=element) - assert len(list(self.file)) == total_entities - 6 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcProductDefinitionShape")) == 0 assert len(self.file.by_type("IfcShapeRepresentation")) == 1 assert len(self.file.by_type("IfcMappedItem")) == 0 @@ -139,9 +146,8 @@ class TestRemoveProduct(test.bootstrap.IFC4): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement") ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=element) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=element) - assert len(list(self.file)) == total_entities - 3 + assert len(list(self.file)) == 0 assert len(self.file.by_type("IfcWall")) == 0 assert len(self.file.by_type("IfcOpeningElement")) == 0 assert len(self.file.by_type("IfcRelVoidsElement")) == 0 @@ -158,11 +164,11 @@ class TestRemoveProduct(test.bootstrap.IFC4): def test_removing_all_void_relationships_of_an_opening(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + total_entities = len(list(self.file)) opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement") ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=element) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=opening) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcOpeningElement")) == 0 assert len(self.file.by_type("IfcRelVoidsElement")) == 0 @@ -170,121 +176,122 @@ class TestRemoveProduct(test.bootstrap.IFC4): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement") filling = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDoor") + total_entities = len(list(self.file)) ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=element) ifcopenshell.api.run("void.add_filling", self.file, opening=opening, element=filling) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=filling) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcDoor")) == 0 assert len(self.file.by_type("IfcRelFillsElement")) == 0 def test_removing_all_distribution_ports(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcChiller") - port = ifcopenshell.api.run("system.add_port", self.file, element=element) total_entities = len(list(self.file)) + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcFlowSegment") + port = ifcopenshell.api.run("system.add_port", self.file, element=element) ifcopenshell.api.run("root.remove_product", self.file, product=element) - assert len(list(self.file)) == total_entities - 3 - assert len(self.file.by_type("IfcChiller")) == 0 + assert len(list(self.file)) == total_entities + assert len(self.file.by_type("IfcFlowSegment")) == 0 assert len(self.file.by_type("IfcRelNests")) == 0 assert len(self.file.by_type("IfcDistributionPort")) == 0 def test_removing_all_nesting_relationships_of_a_whole(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam") - ifcopenshell.api.run("nest.assign_object", self.file, related_objects=[subelement], relating_object=element) total_entities = len(list(self.file)) + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + ifcopenshell.api.run("nest.assign_object", self.file, related_objects=[subelement], relating_object=element) ifcopenshell.api.run("root.remove_product", self.file, product=element) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcRelNests")) == 0 assert len(self.file.by_type("IfcWall")) == 0 assert len(self.file.by_type("IfcBeam")) == 1 def test_removing_all_nesting_relationships_of_a_part(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + total_entities = len(list(self.file)) subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam") ifcopenshell.api.run("nest.assign_object", self.file, related_objects=[subelement], relating_object=element) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=subelement) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcRelNests")) == 0 assert len(self.file.by_type("IfcWall")) == 1 assert len(self.file.by_type("IfcBeam")) == 0 def test_removing_all_aggregate_relationships_of_a_whole(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcElementAssembly") subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam") - ifcopenshell.api.run("aggregate.assign_object", self.file, products=[subelement], relating_object=element) total_entities = len(list(self.file)) + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcElementAssembly") + ifcopenshell.api.run("aggregate.assign_object", self.file, products=[subelement], relating_object=element) ifcopenshell.api.run("root.remove_product", self.file, product=element) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcRelAggregates")) == 0 assert len(self.file.by_type("IfcElementAssembly")) == 0 assert len(self.file.by_type("IfcBeam")) == 1 def test_removing_all_aggregate_relationships_of_a_part(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcElementAssembly") + total_entities = len(list(self.file)) subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam") ifcopenshell.api.run("aggregate.assign_object", self.file, products=[subelement], relating_object=element) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=subelement) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcRelAggregates")) == 0 assert len(self.file.by_type("IfcElementAssembly")) == 1 assert len(self.file.by_type("IfcBeam")) == 0 def test_removing_all_containment_relationships_of_a_container(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSpace") + total_entities = len(list(self.file)) subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") ifcopenshell.api.run("spatial.assign_container", self.file, products=[subelement], relating_structure=element) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=element) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcRelContainedInSpatialStructure")) == 0 assert len(self.file.by_type("IfcSpace")) == 0 assert len(self.file.by_type("IfcWall")) == 1 def test_removing_all_containment_relationships_of_an_element(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSpace") + total_entities = len(list(self.file)) subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") ifcopenshell.api.run("spatial.assign_container", self.file, products=[subelement], relating_structure=element) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=subelement) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcRelContainedInSpatialStructure")) == 0 assert len(self.file.by_type("IfcSpace")) == 1 assert len(self.file.by_type("IfcWall")) == 0 def test_removing_path_connection_relationships_of_an_element(self): - element1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam") element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcColumn") - ifcopenshell.api.run("geometry.connect_path", self.file, relating_element=element1, related_element=element2) total_entities = len(list(self.file)) + element1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBeam") + ifcopenshell.api.run("geometry.connect_path", self.file, relating_element=element1, related_element=element2) ifcopenshell.api.run("root.remove_product", self.file, product=element1) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcRelConnectsPathElements")) == 0 assert len(self.file.by_type("IfcColumn")) == 1 assert len(self.file.by_type("IfcBeam")) == 0 def test_removing_connection_relationships_of_an_element(self): - element1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") + total_entities = len(list(self.file)) + element1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") ifcopenshell.api.run( "geometry.connect_element", self.file, related_element=element1, relating_element=element2, ) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=element1) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcRelConnectsElements")) == 0 assert len(self.file.by_type("IfcSlab")) == 1 assert len(self.file.by_type("IfcWall")) == 0 def test_removing_connection_relationships_of_an_element_with_additional_realizing_element(self): - wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") slab1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") slab2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") + total_entities = len(list(self.file)) + wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") self.file.createIfcRelConnectsWithRealizingElements( ifcopenshell.guid.new(), OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", self.file), @@ -292,9 +299,8 @@ class TestRemoveProduct(test.bootstrap.IFC4): RelatedElement=slab1, RealizingElements=(wall, slab1, slab2), ) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=wall) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcRelConnectsElements")) == 0 assert len(self.file.by_type("IfcSlab")) == 2 assert len(self.file.by_type("IfcWall")) == 0 @@ -302,7 +308,9 @@ class TestRemoveProduct(test.bootstrap.IFC4): def test_removing_connection_relationships_of_an_element_element_is_realizing_element(self): wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") slab1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") + total_entities = len(list(self.file)) slab2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") + slab2_entities = len(list(self.file)) - total_entities self.file.createIfcRelConnectsWithRealizingElements( ifcopenshell.guid.new(), OwnerHistory=ifcopenshell.api.run("owner.create_owner_history", self.file), @@ -312,7 +320,7 @@ class TestRemoveProduct(test.bootstrap.IFC4): ) total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=slab2) - assert len(list(self.file)) == total_entities - 1 + assert len(list(self.file)) == (total_entities - slab2_entities) assert len(self.file.by_type("IfcRelConnectsElements")) == 1 assert len(self.file.by_type("IfcSlab")) == 1 assert len(self.file.by_type("IfcWall")) == 1 @@ -320,6 +328,7 @@ class TestRemoveProduct(test.bootstrap.IFC4): def test_removing_connection_relationships_of_an_element_element_is_only_realizing_element(self): wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") slab1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") + total_entities = len(list(self.file)) slab2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") self.file.createIfcRelConnectsWithRealizingElements( ifcopenshell.guid.new(), @@ -328,9 +337,8 @@ class TestRemoveProduct(test.bootstrap.IFC4): RelatedElement=slab1, RealizingElements=(slab2,), ) - total_entities = len(list(self.file)) ifcopenshell.api.run("root.remove_product", self.file, product=slab2) - assert len(list(self.file)) == total_entities - 2 + assert len(list(self.file)) == total_entities assert len(self.file.by_type("IfcRelConnectsElements")) == 0 assert len(self.file.by_type("IfcSlab")) == 1 assert len(self.file.by_type("IfcWall")) == 1 @@ -395,9 +403,7 @@ class TestRemoveProduct(test.bootstrap.IFC4): def test_removing_all_space_boundaries_of_an_element(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - boundary = self.file.createIfcRelSpaceBoundary( - GlobalId=ifcopenshell.guid.new(), RelatedBuildingElement=element - ) + boundary = self.file.createIfcRelSpaceBoundary(GlobalId=ifcopenshell.guid.new(), RelatedBuildingElement=element) ifcopenshell.api.run("root.remove_product", self.file, product=element) assert not self.file.by_type("IfcRelSpaceBoundary") diff --git a/src/ifcopenshell-python/test/bootstrap.py b/src/ifcopenshell-python/test/bootstrap.py index 678629cb28..c23d2ddba9 100644 --- a/src/ifcopenshell-python/test/bootstrap.py +++ b/src/ifcopenshell-python/test/bootstrap.py @@ -20,7 +20,6 @@ import pytest import ifcopenshell import ifcopenshell.api import ifcopenshell.api.owner.settings -import functools class IFC4X3: @@ -48,13 +47,23 @@ class IFC2X3: def setup(self): self.file: ifcopenshell.file = ifcopenshell.api.run("project.create_file", version="IFC2X3") - @functools.cache - def get_user(ifc: ifcopenshell.file): + def get_user(ifc: ifcopenshell.file) -> ifcopenshell.entity_instance: + user = next(iter(ifc.by_type("IfcPersonAndOrganization")), None) + if user: + return user person = ifc.create_entity("IfcPerson") organization = ifc.create_entity("IfcOrganization") return ifc.create_entity("IfcPersonAndOrganization", ThePerson=person, TheOrganization=organization) ifcopenshell.api.owner.settings.get_user = get_user - ifcopenshell.api.owner.settings.get_application = functools.cache(lambda ifc: ifc.createIfcApplication()) + + def get_application(ifc: ifcopenshell.file) -> ifcopenshell.entity_instance: + application = next(iter(ifc.by_type("IfcApplication")), None) + if application: + return application + return ifc.create_entity("IfcApplication") + + ifcopenshell.api.owner.settings.get_application = get_application + ifcopenshell.api.pre_listeners = {} ifcopenshell.api.post_listeners = {} From 865dbab3ecf2473fb87dd27268d4851bdbe7de27 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 11:55:14 +0500 Subject: [PATCH 166/429] fix error removing array pset after c50d1ea2f --- src/blenderbim/blenderbim/bim/module/model/array.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/array.py b/src/blenderbim/blenderbim/bim/module/model/array.py index 4e51931479..8da6dfb74e 100644 --- a/src/blenderbim/blenderbim/bim/module/model/array.py +++ b/src/blenderbim/blenderbim/bim/module/model/array.py @@ -193,7 +193,7 @@ class RemoveArray(bpy.types.Operator, tool.Ifc.Operator): pset = tool.Ifc.get().by_id(pset["id"]) if len(data) == 1: - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=element, pset=pset) else: del data[self.item] data = tool.Ifc.get().createIfcText(json.dumps(data)) From c6106e6636d73b124a7bbd232751626ece6d25cf Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 12:27:43 +0500 Subject: [PATCH 167/429] fix edit_pset error for editing material properties in ifc2x3 --- .../ifcopenshell/api/pset/edit_pset.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py index 288adebab5..f8c0974b0d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py @@ -378,18 +378,29 @@ class Usecase: def assign_new_properties(self, props: ifcopenshell.entity_instance) -> None: if hasattr(self.settings["pset"], "HasProperties"): self.settings["pset"].HasProperties = props + + # Material / Profile properties elif hasattr(self.settings["pset"], "Properties"): self.settings["pset"].Properties = props + # IFC2X3 IfcMaterialProperties + elif self.settings["pset"].is_a("IfcMaterialProperties"): + self.settings["pset"].ExtendedProperties = props + def get_properties(self) -> list[ifcopenshell.entity_instance]: """ Returns list of existing properties """ - if hasattr(self.settings["pset"], "HasProperties"): - return self.settings["pset"].HasProperties or [] + if (props := getattr(self.settings["pset"], "HasProperties", ...)) is not ...: + return props or [] - elif hasattr(self.settings["pset"], "Properties"): # For IfcMaterialProperties - return self.settings["pset"].Properties or [] + # Material / Profile properties + elif (props := getattr(self.settings["pset"], "Properties", ...)) is not ...: + return props or [] + + # IFC2X3 IfcMaterialProperties + elif (props := getattr(self.settings["pset"], "ExtendedProperties", ...)) is not ...: + return props or [] raise TypeError(f"'{self.settings['pset']}' is not a valid pset") From 54b4cef25ec1daaba1676d4910c0415b0f2f7aae Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 12:44:49 +0500 Subject: [PATCH 168/429] fix errors appending related materials in ifc2x3 it wasn't processing materials properties correctly because it was expecting material to have class IfcMaterialDefinition --- .../ifcopenshell/api/project/append_asset.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py index 60e0a134f9..b63b4cb719 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py @@ -129,6 +129,8 @@ class Usecase: self.added_elements: dict[int, ifcopenshell.entity_instance] = {} self.reuse_identities: dict[int, ifcopenshell.entity_instance] = self.settings["reuse_identities"] self.whitelisted_inverse_attributes = {} + self.base_material_class = "IfcMaterial" if self.file.schema == "IFC2X3" else "IfcMaterialDefinition" + if self.settings["element"].is_a("IfcTypeProduct"): self.target_class = "IfcTypeProduct" return self.append_type_product() @@ -179,7 +181,7 @@ class Usecase: def append_type_product(self): self.whitelisted_inverse_attributes = { "IfcObjectDefinition": ["HasAssociations"], - "IfcMaterialDefinition": ["HasExternalReferences", "HasProperties", "HasRepresentation"], + self.base_material_class: ["HasExternalReferences", "HasProperties", "HasRepresentation"], "IfcRepresentationItem": ["StyledByItem"], } self.existing_contexts = self.file.by_type("IfcGeometricRepresentationContext") @@ -192,7 +194,7 @@ class Usecase: "IfcObjectDefinition": ["HasAssociations"], "IfcObject": ["IsDefinedBy.IfcRelDefinesByProperties"], "IfcElement": ["HasOpenings"], - "IfcMaterialDefinition": ["HasExternalReferences", "HasProperties", "HasRepresentation"], + self.base_material_class: ["HasExternalReferences", "HasProperties", "HasRepresentation"], "IfcRepresentationItem": ["StyledByItem"], } self.existing_contexts = self.file.by_type("IfcGeometricRepresentationContext") From 2f554db54b68da9bcbeb2a6f65e46728bd4ad5ab Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 14:55:48 +0500 Subject: [PATCH 169/429] owner.remove_person to remove IfcInventory in ifc2x3 --- .../ifcopenshell/api/owner/remove_person.py | 6 +++++- .../test/api/owner/test_remove_person.py | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py index aac583b22e..77d297527f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py @@ -24,6 +24,8 @@ def remove_person(file, person=None) -> None: All roles and addresses assigned to the person will also be removed. + In IFC2X3 will also remove related inventories if `person` was + the only responsile person for them. :param person: The IfcPerson to remove :type person: ifcopenshell.entity_instance @@ -52,7 +54,9 @@ def remove_person(file, person=None) -> None: inverse.Creators = None elif inverse.is_a("IfcInventory"): if inverse.ResponsiblePersons == (settings["person"],): - inverse.ResponsiblePersons = None + # in IFC2X3 ResponsiblePersons is not optional and without it IfcInventory is not valid + if file.schema == "IFC2X3": + ifcopenshell.api.run("root.remove_product", file, product=inverse) elif inverse.is_a("IfcDocumentInformation"): if inverse.Editors == (settings["person"],): inverse.Editors = None diff --git a/src/ifcopenshell-python/test/api/owner/test_remove_person.py b/src/ifcopenshell-python/test/api/owner/test_remove_person.py index 569b42cd60..76d641a85f 100644 --- a/src/ifcopenshell-python/test/api/owner/test_remove_person.py +++ b/src/ifcopenshell-python/test/api/owner/test_remove_person.py @@ -61,8 +61,13 @@ class TestRemovePerson(test.bootstrap.IFC4): def test_ensuring_inventory_should_not_be_left_in_an_invalid_set_cardinality(self): person = self.file.createIfcPerson() inventory = self.file.createIfcInventory(ResponsiblePersons=[person]) + inventory_id = inventory.id() ifcopenshell.api.run("owner.remove_person", self.file, person=person) - assert inventory.ResponsiblePersons is None + if self.file.schema != "IFC2X3": + assert inventory.ResponsiblePersons is None + else: + with pytest.raises(RuntimeError): + self.file.by_id(inventory_id) def test_deleting_person_and_organisations(self): person = self.file.createIfcPerson() From 1d046eaadf24480c9cd02172b0640931ab979ef2 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 15:46:15 +0500 Subject: [PATCH 170/429] material.remove_material and copy_material to handle ifc2x3 props --- .../api/material/copy_material.py | 20 +++++++++++++++---- .../api/material/remove_material.py | 8 +++++++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py index c862e9cb4b..45886e7121 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py @@ -48,11 +48,23 @@ def copy_material(file, material=None) -> None: if inverse.is_a("IfcMaterialProperties"): # Properties must not be shared between objects for convenience of authoring inverse = ifcopenshell.util.element.copy(file, inverse) - properties = [] - for pset in inverse.Properties: - properties.append(ifcopenshell.util.element.copy_deep(file, pset)) - inverse.Properties = properties inverse.Material = new + + props_attribute = "Properties" + if file.schema == "IFC2X3": + if not inverse.is_a("IfcExtendedMaterialProperties"): + continue + props_attribute = "ExtendedProperties" + + props = getattr(inverse, props_attribute) + if not props: + continue + + copied_props = [] + for pset in props: + copied_props.append(ifcopenshell.util.element.copy_deep(file, pset)) + setattr(inverse, props_attribute, copied_props) + elif inverse.is_a("IfcMaterialDefinitionRepresentation"): inverse = ifcopenshell.util.element.copy_deep( file, inverse, exclude=["IfcRepresentationContext", "IfcMaterial"] diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py index a59fee6caf..1b0924f717 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py @@ -62,7 +62,13 @@ def remove_material(file, material=None) -> None: if history: ifcopenshell.util.element.remove_deep2(file, history) elif inverse.is_a("IfcMaterialProperties"): - for prop in inverse.Properties or []: + if file.schema != "IFC2X3": + props = inverse.Properties + else: + # only IfcExtendedMaterialProperties have properties in IFC2X3 + props = getattr(inverse, "ExtendedProperties", None) + props = props or [] + for prop in props: file.remove(prop) file.remove(inverse) elif inverse.is_a("IfcMaterialDefinitionRepresentation"): From c3bfd7354f600267f38fa3b112d8f445a5c72031 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 16:16:04 +0500 Subject: [PATCH 171/429] pset.add_pset - throw an error if entity doesn't support adding a pset --- src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py index d28fe9b16d..349a1fa85f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/add_pset.py @@ -61,6 +61,9 @@ def add_pset(file: ifcopenshell.file, product: ifcopenshell.entity_instance, nam that prefix. It is recommended to use your own prefix tailored to your project, company, or local government requirement. :type name: str + + :raises TypeError: If `product` class doesn't support adding a pset. + :return: The newly created IfcPropertySet :rtype: ifcopenshell.entity_instance @@ -154,3 +157,5 @@ def add_pset(file: ifcopenshell.file, product: ifcopenshell.entity_instance, nam kwargs["Name"] = settings["name"] return file.create_entity("IfcProfileProperties", **kwargs) + + raise TypeError(f"Class '{settings['product'].is_a(True)}' doesn't support adding a property set.") From ebd03e9290cb3b3ee2134fc07f839dbe993a2a66 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 12:27:53 +0500 Subject: [PATCH 172/429] typing --- .../ifcopenshell/api/layer/add_layer.py | 8 ++++---- .../ifcopenshell/api/layer/edit_layer.py | 8 +++++--- .../ifcopenshell/api/layer/remove_layer.py | 7 +++---- .../ifcopenshell/api/library/add_library.py | 6 ++---- .../ifcopenshell/api/library/edit_library.py | 8 +++++--- .../api/library/edit_reference.py | 10 +++++++--- .../api/library/remove_library.py | 2 +- .../api/material/add_constituent.py | 5 ++++- .../ifcopenshell/api/material/add_layer.py | 5 ++++- .../api/material/add_list_item.py | 4 +++- .../ifcopenshell/api/material/add_material.py | 8 ++++++-- .../api/material/add_material_set.py | 5 ++++- .../api/material/assign_profile.py | 9 ++++++--- .../api/material/copy_material.py | 2 +- .../api/material/edit_assigned_material.py | 8 +++++--- .../api/material/edit_constituent.py | 9 ++++++++- .../ifcopenshell/api/material/edit_layer.py | 9 ++++++++- .../api/material/edit_layer_usage.py | 8 +++++--- .../api/material/edit_material.py | 10 +++++----- .../ifcopenshell/api/material/edit_profile.py | 12 +++++++++++- .../api/material/edit_profile_usage.py | 6 ++++-- .../api/material/remove_constituent.py | 3 ++- .../ifcopenshell/api/material/remove_layer.py | 3 ++- .../api/material/remove_list_item.py | 4 +++- .../api/material/remove_material.py | 2 +- .../api/material/remove_material_set.py | 2 +- .../api/material/remove_profile.py | 2 +- .../api/material/reorder_set_item.py | 5 ++++- .../ifcopenshell/api/nest/change_nest.py | 16 ++++++++-------- .../ifcopenshell/api/nest/reorder_nesting.py | 19 +++++++++---------- .../ifcopenshell/api/owner/add_actor.py | 7 ++++++- .../ifcopenshell/api/owner/add_address.py | 5 ++++- .../ifcopenshell/api/owner/add_application.py | 15 +++++++++------ .../ifcopenshell/api/owner/add_person.py | 2 +- .../ifcopenshell/api/owner/add_role.py | 5 +++-- .../ifcopenshell/api/owner/assign_actor.py | 6 ++++-- .../ifcopenshell/api/owner/edit_actor.py | 8 +++++--- .../ifcopenshell/api/owner/edit_address.py | 8 +++++--- .../api/owner/edit_organisation.py | 8 +++++--- .../ifcopenshell/api/owner/edit_person.py | 8 +++++--- .../ifcopenshell/api/owner/edit_role.py | 8 +++++--- .../ifcopenshell/api/owner/remove_actor.py | 2 +- .../ifcopenshell/api/owner/remove_address.py | 3 ++- .../api/owner/remove_application.py | 3 ++- .../api/owner/remove_organisation.py | 2 +- .../ifcopenshell/api/owner/remove_person.py | 2 +- .../owner/remove_person_and_organisation.py | 4 +++- .../ifcopenshell/api/owner/remove_role.py | 3 ++- .../ifcopenshell/api/owner/unassign_actor.py | 10 +++++----- .../api/profile/add_arbitrary_profile.py | 7 +++++-- .../add_arbitrary_profile_with_voids.py | 12 +++++++++--- .../api/profile/add_parameterized_profile.py | 3 ++- .../ifcopenshell/api/profile/edit_profile.py | 8 +++++--- .../api/profile/remove_profile.py | 2 +- .../ifcopenshell/api/project/append_asset.py | 10 +++++++--- .../ifcopenshell/util/date.py | 15 ++++++++++++++- 56 files changed, 244 insertions(+), 127 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py index 5379ff1b3a..df171a4ded 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional -def add_layer(file, Name=None) -> None: +def add_layer(file: ifcopenshell.file, Name: Optional[str] = None) -> ifcopenshell.entity_instance: """Adds a new layer An IFC layer is like a CAD layer. Portions of an object's geometry @@ -41,6 +43,4 @@ def add_layer(file, Name=None) -> None: ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL-FULL-DIMS-N") """ - settings = {"Name": Name or "Unnamed"} - - return file.create_entity("IfcPresentationLayerAssignment", Name=settings["Name"]) + return file.create_entity("IfcPresentationLayerAssignment", Name=Name) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py index 9d96156cfc..1590cc4559 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_layer(file, layer=None, attributes=None) -> None: +def edit_layer(file: ifcopenshell.file, layer: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcPresentationLayerAssignment For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_layer(file, layer=None, attributes=None) -> None: :param layer: The IfcPresentationLayerAssignment entity you want to edit :type layer: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -38,7 +40,7 @@ def edit_layer(file, layer=None, attributes=None) -> None: ifcopenshell.api.run("layer.edit_layer", model, layer=layer, attributes={"Description": "All walls, based on the AIA standard."}) """ - settings = {"layer": layer, "attributes": attributes or {}} + settings = {"layer": layer, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["layer"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py index 790b396174..27b3e80ac1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_layer(file, layer=None) -> None: +def remove_layer(file: ifcopenshell.file, layer: ifcopenshell.entity_instance) -> None: """Removes a layer All representation items assigned to the layer will remain, but the @@ -35,6 +36,4 @@ def remove_layer(file, layer=None) -> None: layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") ifcopenshell.api.run("layer.remove_layer", model, layer=layer) """ - settings = {"layer": layer} - - file.remove(settings["layer"]) + file.remove(layer) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py index 16cd00b914..fdd21c3424 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py @@ -21,7 +21,7 @@ import ifcopenshell.util.schema import ifcopenshell.util.date -def add_library(file, name=None) -> None: +def add_library(file: ifcopenshell.entity_instance, name: str) -> ifcopenshell.entity_instance: """Adds a new library to the project A library is an external data source that is related to the project. It @@ -60,6 +60,4 @@ def add_library(file, name=None) -> None: ifcopenshell.api.run("library.add_library", model, name="Brickschema") """ - settings = {"name": name} - - return file.create_entity("IfcLibraryInformation", Name=settings["name"]) + return file.create_entity("IfcLibraryInformation", Name=name) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py index 5a53869a3f..81b96c0692 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_library(file, library=None, attributes=None) -> None: +def edit_library(file: ifcopenshell.file, library: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcLibraryInformation For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_library(file, library=None, attributes=None) -> None: :param library: The IfcLibraryInformation entity you want to edit :type library: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -39,7 +41,7 @@ def edit_library(file, library=None, attributes=None) -> None: attributes={"Description": "A Brickschema TTL including only mechanical distribution systems."}) """ - settings = {"library": library, "attributes": attributes or {}} + settings = {"library": library, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["library"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py index 1d2487820a..621dd32271 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/edit_reference.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_reference(file, reference=None, attributes=None) -> None: +def edit_reference( + file: ifcopenshell.file, reference: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcLibraryReference For more information about the attributes and data types of an @@ -26,7 +30,7 @@ def edit_reference(file, reference=None, attributes=None) -> None: :param reference: The IfcLibraryReference entity you want to edit :type reference: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -40,7 +44,7 @@ def edit_reference(file, reference=None, attributes=None) -> None: ifcopenshell.api.run("library.edit_reference", model, reference=reference, attributes={"Identification": "http://example.org/digitaltwin#AHU01"}) """ - settings = {"reference": reference, "attributes": attributes or {}} + settings = {"reference": reference, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["reference"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py index ba5244537c..d0c6cc4cc5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_library(file, library=None) -> None: +def remove_library(file: ifcopenshell.file, library: ifcopenshell.entity_instance) -> None: """Removes a library All references along with their relationships will also be removed. Any diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py index b1f3f76073..d7a8a19ace 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_constituent.py @@ -15,9 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_constituent(file, constituent_set=None, material=None) -> None: +def add_constituent( + file: ifcopenshell.file, constituent_set: ifcopenshell.entity_instance, material: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: """Adds a new constituent to a constituent set A constituent describes how a portion of an object is made out of a diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py index 68885715ee..c0dc7c8b76 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_layer.py @@ -15,9 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_layer(file, layer_set=None, material=None) -> None: +def add_layer( + file: ifcopenshell.file, layer_set: ifcopenshell.entity_instance, material: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: """Adds a new layer to a layer set A layer represents a portion of material within a layered build up, diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py index 7eaa8159ce..52cb4ecfa8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_list_item.py @@ -19,7 +19,9 @@ import ifcopenshell -def add_list_item(file, material_list=None, material=None) -> None: +def add_list_item( + file: ifcopenshell.file, material_list: ifcopenshell.entity_instance, material: ifcopenshell.entity_instance +) -> None: """Adds a new material in a list of materials In IFC2X3, if you wanted an object to have multiple materials (i.e. a diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py index 534d9e911c..f8cd351e03 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py @@ -15,9 +15,13 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional -def add_material(file, name=None, category=None) -> None: +def add_material( + file: ifcopenshell.file, name: Optional[str] = None, category: Optional[str] = None +) -> ifcopenshell.entity_instance: """Adds a new material A material in IFC represents a physical material, such as timber, steel, @@ -48,7 +52,7 @@ def add_material(file, name=None, category=None) -> None: :param name: The name of the material, typically tagged in a finishes drawing or schedule. - :type name: str + :type name: str, optional :param category: The category of the material. :type category: str, optional :return: The newly created IfcMaterial diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py index 99cfafad41..51edd0b2be 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_material_set.py @@ -15,9 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_material_set(file, name="Unnamed", set_type="IfcMaterialConstituentSet") -> None: +def add_material_set( + file: ifcopenshell.file, name: str = "Unnamed", set_type: str = "IfcMaterialConstituentSet" +) -> ifcopenshell.entity_instance: """Adds a new material set IFC allows you to state that objects are made out of multiple materials. diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py index 15c7e4d779..d82a296f34 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/assign_profile.py @@ -19,7 +19,9 @@ import ifcopenshell.util.representation -def assign_profile(file, material_profile=None, profile=None) -> None: +def assign_profile( + file: ifcopenshell.file, material_profile: ifcopenshell.entity_instance, profile: ifcopenshell.entity_instance +) -> None: """Changes the profile curve of a material profile item in a profile set In addition to changing the profile curve, it will also change the @@ -94,7 +96,8 @@ def assign_profile(file, material_profile=None, profile=None) -> None: class Usecase: - def execute(self): + file: ifcopenshell.file + def execute(self) -> None: # TODO: handle composite profiles old_profile = self.settings["material_profile"].Profile self.settings["material_profile"].Profile = self.settings["profile"] @@ -117,7 +120,7 @@ class Usecase: # TODO: check remove deep self.file.remove(old_profile) - def change_profile(self, element): + def change_profile(self, element: ifcopenshell.entity_instance) -> None: representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") if not representation: return diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py index 45886e7121..5655fa97da 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def copy_material(file, material=None) -> None: +def copy_material(file: ifcopenshell.file, material: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: """Copies a material All material psets and styles are copied. The copied material is not diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py index 3102d5a645..129654d902 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_assigned_material.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_assigned_material(file, element=None, attributes=None) -> None: +def edit_assigned_material(file: ifcopenshell.file, element: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcMaterial For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_assigned_material(file, element=None, attributes=None) -> None: :param element: The IfcMaterial entity you want to edit :type element: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -38,7 +40,7 @@ def edit_assigned_material(file, element=None, attributes=None) -> None: ifcopenshell.api.run("material.edit_assigned_material", model, element=concrete, attributes={"Description": "40MPA concrete with broom finish"}) """ - settings = {"element": element, "attributes": attributes or {}} + settings = {"element": element, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["element"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py index 998bef98bd..a11a5ed630 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_constituent.py @@ -15,9 +15,16 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional, Any -def edit_constituent(file, constituent=None, attributes=None, material=None) -> None: +def edit_constituent( + file: ifcopenshell.file, + constituent: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, + material: Optional[ifcopenshell.entity_instance] = None, +) -> None: """Edits the attributes of an IfcMaterialConstituent For more information about the attributes and data types of an diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py index 78ce15132f..57d0b04795 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer.py @@ -15,9 +15,16 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional, Any -def edit_layer(file, layer=None, attributes=None, material=None) -> None: +def edit_layer( + file: ifcopenshell.file, + layer: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, + material: Optional[ifcopenshell.entity_instance] = None, +) -> None: """Edits the attributes of an IfcMaterialLayer For more information about the attributes and data types of an diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py index 9204728004..e05fc02cab 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_layer_usage.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_layer_usage(file, usage=None, attributes=None) -> None: +def edit_layer_usage(file: ifcopenshell.file, usage: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcMaterialLayerSetUsage This is typically used to change the offset from the reference line to @@ -29,7 +31,7 @@ def edit_layer_usage(file, usage=None, attributes=None) -> None: :param usage: The IfcMaterialLayerSetUsage entity you want to edit :type usage: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -73,7 +75,7 @@ def edit_layer_usage(file, usage=None, attributes=None) -> None: ifcopenshell.api.run("material.edit_layer_usage", model, usage=rel.RelatingMaterial, attributes={"OffsetFromReferenceLine": 200}) """ - settings = {"usage": usage, "attributes": attributes or {}} + settings = {"usage": usage, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["usage"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_material.py index 87b3f2c7fb..ddf541503c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_material.py @@ -15,12 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_material(file, material=None, attributes=None) -> None: +def edit_material(file: ifcopenshell.file, material: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcMaterial""" - settings = {"material": material, "attributes": attributes or {}} - - for name, value in settings["attributes"].items(): - setattr(settings["material"], name, value) + for name, value in attributes.items(): + setattr(material, name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py index aa1310dbca..e4fe4b3610 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile.py @@ -17,7 +17,17 @@ # along with IfcOpenShell. If not, see . -def edit_profile(file, profile=None, attributes=None, profile_def=None, material=None) -> None: +from typing import Any, Optional +import ifcopenshell + + +def edit_profile( + file: ifcopenshell.file, + profile: ifcopenshell.entity_instance, + attributes: Optional[dict[str, Any]] = None, + profile_def: Optional[ifcopenshell.entity_instance] = None, + material: Optional[ifcopenshell.entity_instance] = None, +) -> None: """Edits the attributes of an IfcMaterialProfile For more information about the attributes and data types of an diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py index 8ad5192570..37a57825f5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py @@ -15,12 +15,14 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . - import ifcopenshell.geom import ifcopenshell.util.representation +from typing import Any -def edit_profile_usage(file, usage=None, attributes=None) -> None: +def edit_profile_usage( + file: ifcopenshell.file, usage: ifcopenshell.entity_instance, attributes: dict[str, Any] +) -> None: """Edits the attributes of an IfcMaterialProfileSetUsage This is typically used to change the cardinal point of the profile. diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py index 02256e0695..d28934e77e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_constituent.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_constituent(file, constituent=None) -> None: +def remove_constituent(file: ifcopenshell.file, constituent: ifcopenshell.entity_instance) -> None: """Removes a constituent from a constituent set Note that it is invalid to have zero items in a set, so you should leave diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py index fda5cf2151..744a59b65d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_layer.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_layer(file, layer=None) -> None: +def remove_layer(file: ifcopenshell.file, layer: ifcopenshell.entity_instance) -> None: """Removes a layer from a layer set Note that it is invalid to have zero items in a set, so you should leave diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py index a41b6ec7a8..cdcf8d42cd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_list_item.py @@ -19,7 +19,9 @@ import ifcopenshell -def remove_list_item(file, material_list=None, material_index=0) -> None: +def remove_list_item( + file: ifcopenshell.file, material_list: ifcopenshell.entity_instance, material_index: int = 0 +) -> None: """Removes an item in an material list Note that it is invalid to have zero items in a list, so you should leave diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py index 1b0924f717..fe75da3039 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_material(file, material=None) -> None: +def remove_material(file: ifcopenshell.file, material: ifcopenshell.entity_instance) -> None: """Removes a material If the material is used in a material set, the corresponding layer, diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py index 5ede76c1c2..d38b1ec03d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_material_set.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_material_set(file, material=None) -> None: +def remove_material_set(file: ifcopenshell.file, material: ifcopenshell.entity_instance) -> None: """Removes a material set All set items, such as layers, profiles, or constituents will also be diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py b/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py index 858b6f1289..699c265708 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/remove_profile.py @@ -21,7 +21,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_profile(file, profile=None) -> None: +def remove_profile(file: ifcopenshell.file, profile: ifcopenshell.entity_instance) -> None: """Removes a profile item from a profile set Note that it is invalid to have zero items in a set, so you should leave diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py b/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py index 481050ff63..fbe8dd7bd9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/reorder_set_item.py @@ -15,9 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def reorder_set_item(file, material_set=None, old_index=0, new_index=0) -> None: +def reorder_set_item( + file: ifcopenshell.file, material_set: ifcopenshell.entity_instance, old_index: int = 0, new_index: int = 0 +) -> None: """Reorders an item in a material set In some material sets, the order have meaning, like in a layer set. In diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/change_nest.py b/src/ifcopenshell-python/ifcopenshell/api/nest/change_nest.py index 22ba7d0fc3..fec740477b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/change_nest.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/change_nest.py @@ -21,15 +21,15 @@ import ifcopenshell.api import ifcopenshell.util.element -def change_nest(file, item=None, new_parent=None) -> None: +def change_nest( + file: ifcopenshell.file, item: ifcopenshell.entity_instance, new_parent: ifcopenshell.entity_instance +) -> None: """Assigns a cost item to a new parent cost item""" - settings = {"item": item, "new_parent": new_parent} - - if not settings["item"].Nests: + if not item.Nests: return - nests = settings["item"].Nests[0] + nests = item.Nests[0] related_objects = list(nests.RelatedObjects) - related_objects.remove(settings["item"]) + related_objects.remove(item) if related_objects: nests.RelatedObjects = related_objects ifcopenshell.api.run("owner.update_owner_history", file, **{"element": nests}) @@ -41,6 +41,6 @@ def change_nest(file, item=None, new_parent=None) -> None: ifcopenshell.api.run( "nest.assign_object", file, - related_objects=[settings["item"]], - relating_object=settings["new_parent"], + related_objects=[item], + relating_object=new_parent, ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/reorder_nesting.py b/src/ifcopenshell-python/ifcopenshell/api/nest/reorder_nesting.py index 63b591ee28..88eab25513 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/reorder_nesting.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/reorder_nesting.py @@ -15,19 +15,18 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def reorder_nesting(file, item=None, old_index=0, new_index=0) -> None: +def reorder_nesting( + file: ifcopenshell.file, item: ifcopenshell.entity_instance, old_index: int = 0, new_index: int = 0 +) -> None: """Reorders an item in a nesting set""" - settings = {"item": item, "old_index": old_index, "new_index": new_index} - - if not settings["item"].Nests: + if not item.Nests: return - nesting_set = settings["item"].Nests[0] - if not settings["old_index"]: - old_index = nesting_set.RelatedObjects.index(settings["item"]) - else: - old_index = settings["old_index"] + nesting_set = item.Nests[0] + if not old_index: + old_index = nesting_set.RelatedObjects.index(item) items = list(getattr(nesting_set, "RelatedObjects") or []) - items.insert(settings["new_index"], items.pop(old_index)) + items.insert(new_index, items.pop(old_index)) setattr(nesting_set, "RelatedObjects", items) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py index 124561f136..d4c82315c9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_actor.py @@ -19,9 +19,14 @@ import ifcopenshell import ifcopenshell.api +from typing import Literal -def add_actor(file, actor=None, ifc_class="IfcActor") -> None: +def add_actor( + file: ifcopenshell.file, + actor: ifcopenshell.entity_instance, + ifc_class: Literal["IfcActor", "IfcOccupant"] = "IfcActor", +) -> ifcopenshell.entity_instance: """Adds a new actor An actor is a person or an organisation who has a responsibility or role diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py index a214c86d81..cc8d8bfb33 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_address.py @@ -15,9 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_address(file, assigned_object=None, ifc_class="IfcPostalAddress") -> None: +def add_address( + file: ifcopenshell.file, assigned_object: ifcopenshell.entity_instance, ifc_class: str = "IfcPostalAddress" +) -> ifcopenshell.entity_instance: """Add a new telecom or postal address to an organisation or person A person or organisation may have associated contact details such as diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py index 07a59db0d7..fd46625ae5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_application.py @@ -17,15 +17,16 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +from typing import Optional def add_application( - file, - application_developer=None, - version=None, - application_full_name="IfcOpenShell", - application_identifier="IfcOpenShell", -) -> None: + file: ifcopenshell.file, + application_developer: Optional[ifcopenshell.entity_instance] = None, + version: Optional[str] = None, + application_full_name: str = "IfcOpenShell", + application_identifier: str = "IfcOpenShell", +) -> ifcopenshell.entity_instance: """Adds a new application IFC data may be associated with an authoring application to identify @@ -46,6 +47,8 @@ def add_application( :param application_identifier: An identification string for the application intended for computers to read. :type application_identifier: str, optional + :return: The newly created IfcApplication + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py index 7abdfb1598..d408f39b69 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_person.py @@ -23,7 +23,7 @@ def add_person( identification: str = "HSeldon", family_name: str = "Seldon", given_name: str = "Hari", -) -> None: +) -> ifcopenshell.entity_instance: """Adds a new person Persons are used to identify a legal or liable representative of an diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py index 415ed4efde..7c73de69a9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/add_role.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_role(file, assigned_object=None, role="ARCHITECT") -> None: +def add_role(file: ifcopenshell.file, assigned_object: ifcopenshell.entity_instance, role: str = "ARCHITECT") -> ifcopenshell.entity_instance: """Adds and assigns a new role People and organisations must play one or more roles on a project. Roles @@ -32,7 +33,7 @@ def add_role(file, assigned_object=None, role="ARCHITECT") -> None: be assigned to. :type assigned_object: ifcopenshell.entity_instance :param role: The type of role, taken from the IFC documentation for - IfcActorRole, or a custom name. + IfcActorRole, or a custom name. Defaults to "ARCHITECT". :type role: str, optional :return: The newly created IfcActorRole :rtype: ifcopenshell.entity_instance diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py index 1680e5369f..7f2e4a863b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/assign_actor.py @@ -21,7 +21,9 @@ import ifcopenshell.api import ifcopenshell.guid -def assign_actor(file, relating_actor=None, related_object=None) -> None: +def assign_actor( + file: ifcopenshell.file, relating_actor: ifcopenshell.entity_instance, related_object: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: """Assigns an actor to an object An actor may be assigned to objects which implies that the actor is @@ -80,7 +82,7 @@ def assign_actor(file, relating_actor=None, related_object=None) -> None: if settings["related_object"].HasAssignments: for rel in settings["related_object"].HasAssignments: if rel.is_a("IfcRelAssignsToActor") and rel.RelatingActor == settings["relating_actor"]: - return + return rel rel = None diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py index e1125ab212..619e806097 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_actor.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_actor(file, actor=None, attributes=None) -> None: +def edit_actor(file: ifcopenshell.file, actor: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcActor For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_actor(file, actor=None, attributes=None) -> None: :param actor: The IfcActor entity you want to edit :type actor: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -47,7 +49,7 @@ def edit_actor(file, actor=None, attributes=None) -> None: ifcopenshell.api.run("actor.edit_actor", model, actor=actor, attributes={"Description": "Responsible for buildings A, B, and C."}) """ - settings = {"actor": actor, "attributes": attributes or {}} + settings = {"actor": actor, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["actor"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py index ba74f0ede6..4f6df196db 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_address.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_address(file, address=None, attributes=None) -> None: +def edit_address(file: ifcopenshell.file, address: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcAddress For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_address(file, address=None, attributes=None) -> None: :param address: The IfcAddress entity you want to edit :type address: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -49,7 +51,7 @@ def edit_address(file, address=None, attributes=None) -> None: "ElectronicMailAddresses": ["bobthebuilder@example.com"], "WWWHomePageURL": "https://thinkmoult.com"}) """ - settings = {"address": address, "attributes": attributes or {}} + settings = {"address": address, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["address"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py index 012e9152ba..f3991918ca 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_organisation.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_organisation(file, organisation=None, attributes=None) -> None: +def edit_organisation(file: ifcopenshell.file, organisation: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcOrganization For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_organisation(file, organisation=None, attributes=None) -> None: :param organisation: The IfcOrganization entity you want to edit :type organisation: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -39,7 +41,7 @@ def edit_organisation(file, organisation=None, attributes=None) -> None: ifcopenshell.api.run("owner.edit_organisation", model, organisation=organisation, attributes={"name": "Architects Without Ballpens"}) """ - settings = {"organisation": organisation, "attributes": attributes or {}} + settings = {"organisation": organisation, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["organisation"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py index a8fdb56168..1a66068727 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_person.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_person(file, person=None, attributes=None) -> None: +def edit_person(file: ifcopenshell.file, person: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcPerson For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_person(file, person=None, attributes=None) -> None: :param person: The IfcPerson entity you want to edit :type person: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -39,7 +41,7 @@ def edit_person(file, person=None, attributes=None) -> None: ifcopenshell.api.run("owner.edit_person", model, person=person, attributes={"MiddleNames": ["The"], "FamilyName": "Builder"}) """ - settings = {"person": person, "attributes": attributes or {}} + settings = {"person": person, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["person"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py index 6934af27e0..034a685d5d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/edit_role.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_role(file, role=None, attributes=None) -> None: +def edit_role(file: ifcopenshell.file, role: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcActorRole For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_role(file, role=None, attributes=None) -> None: :param role: The IfcActorRole entity you want to edit :type role: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -43,7 +45,7 @@ def edit_role(file, role=None, attributes=None) -> None: # But Bob is not an architect ifcopenshell.api.run("owner.edit_role", model, role=role, attributes={"Role": "CONSTRUCTIONMANAGER"}) """ - settings = {"role": role, "attributes": attributes or {}} + settings = {"role": role, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["role"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py index 49feb54179..d11f18657d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_actor.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_actor(file, actor=None) -> None: +def remove_actor(file: ifcopenshell.file, actor: ifcopenshell.entity_instance) -> None: """Removes an actor :param actor: The IfcActor to remove. diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py index 5fba84583b..31fc19b675 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_address.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_address(file, address=None) -> None: +def remove_address(file: ifcopenshell.file, address: ifcopenshell.entity_instance) -> None: """Removes an address Naturally, any organisations or people using that address will have the diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py index 16973cfcc4..f441205925 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_application.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_application(file, application=None) -> None: +def remove_application(file: ifcopenshell.file, application: ifcopenshell.entity_instance) -> None: """Removes an application Warning: removing an application may invalidate ownership histories. diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py index 42111e017e..c1652a1fce 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_organisation.py @@ -19,7 +19,7 @@ import ifcopenshell.api -def remove_organisation(file, organisation=None) -> None: +def remove_organisation(file: ifcopenshell.file, organisation: ifcopenshell.entity_instance) -> None: """Remove an organisation All roles and addresses assigned to the organisation will also be diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py index 77d297527f..5ce265cae2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person.py @@ -19,7 +19,7 @@ import ifcopenshell.api -def remove_person(file, person=None) -> None: +def remove_person(file: ifcopenshell.file, person: ifcopenshell.entity_instance) -> None: """Remove an person All roles and addresses assigned to the person will also be diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py index 8473e04b87..1311dfa642 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_person_and_organisation.py @@ -19,7 +19,9 @@ import ifcopenshell.api -def remove_person_and_organisation(file, person_and_organisation=None) -> None: +def remove_person_and_organisation( + file: ifcopenshell.file, person_and_organisation: ifcopenshell.entity_instance +) -> None: """Removes a person and organisation Note that the underlying person and organisation is not removed, only diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py index 08bf39881c..7ecfa8847e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/remove_role.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_role(file, role=None) -> None: +def remove_role(file: ifcopenshell.file, role: ifcopenshell.entity_instance) -> None: """Removes a role People and organisations using the role will be untouched. This may diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py b/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py index c57d0172f5..38f63688a6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/unassign_actor.py @@ -21,7 +21,9 @@ import ifcopenshell.api import ifcopenshell.util.element -def unassign_actor(file, relating_actor=None, related_object=None) -> None: +def unassign_actor( + file: ifcopenshell.file, relating_actor: ifcopenshell.entity_instance, related_object: ifcopenshell.entity_instance +) -> None: """Unassigns an actor to an object This means that the actor is no longer responsible for the object. @@ -30,9 +32,8 @@ def unassign_actor(file, relating_actor=None, related_object=None) -> None: :type relating_actor: ifcopenshell.entity_instance :param related_object: The object the actor is responsible for. :type related_object: ifcopenshell.entity_instance - :return: The updated IfcRelAssignsToActor relationship or none if there - is no more valid relationship. - :rtype: None, ifcopenshell.entity_instance + :return: None + :rtype: None Example: @@ -72,4 +73,3 @@ def unassign_actor(file, relating_actor=None, related_object=None) -> None: related_objects.remove(settings["related_object"]) rel.RelatedObjects = related_objects ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) - return rel diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py index 9acc800b89..8c432c9626 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile.py @@ -17,9 +17,12 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.unit +from typing import Optional -def add_arbitrary_profile(file, profile=None, name=None) -> None: +def add_arbitrary_profile( + file: ifcopenshell.file, profile: list[tuple[float, float]], name: Optional[str] = None +) -> ifcopenshell.entity_instance: """Adds a new arbitrary polyline-based profile The profile is represented as a polyline defined by a list of @@ -30,7 +33,7 @@ def add_arbitrary_profile(file, profile=None, name=None) -> None: identical. :param profile: A list of coordinates - :type profile: list[list[float]] + :type profile: list[tuple[float, float]] :param name: If the profile is semantically significant (i.e. to be managed and reused by the user) then it must be named. Otherwise, this may be left as none. diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py index e1a6fe9cdb..52287aee7c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/add_arbitrary_profile_with_voids.py @@ -17,9 +17,15 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.unit +from typing import Optional -def add_arbitrary_profile_with_voids(file, outer_profile=None, inner_profiles=None, name=None) -> None: +def add_arbitrary_profile_with_voids( + file: ifcopenshell.file, + outer_profile: list[tuple[float, float]], + inner_profiles: list[list[tuple[float, float]]], + name: Optional[str] = None, +) -> ifcopenshell.entity_instance: """Adds a new arbitrary polyline-based profile with voids The outer profile is represented as a polyline defined by a list of @@ -35,9 +41,9 @@ def add_arbitrary_profile_with_voids(file, outer_profile=None, inner_profiles=No provided in SI meters. :param outer_profile: A list of coordinates - :type profile: list[float] + :type profile: list[tuple[float, float]] :param inner_profiles: A list of polylines - :type profile: list[list[float]] + :type profile: list[list[tuple[float, float]]] :param name: If the profile is semantically significant (i.e. to be managed and reused by the user) then it must be named. Otherwise, this may be left as none. diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py index c0a6348656..abb205ba5e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/add_parameterized_profile.py @@ -15,9 +15,10 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_parameterized_profile(file, ifc_class=None) -> None: +def add_parameterized_profile(file: ifcopenshell.file, ifc_class: str) -> ifcopenshell.entity_instance: """Adds a new parameterised profile IFC offers parameterised profiles for common standardised hot roll diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py index 4d525a5d32..bfcb9da595 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/edit_profile.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_profile(file, profile=None, attributes=None) -> None: +def edit_profile(file: ifcopenshell.file, profile: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcProfileDef For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_profile(file, profile=None, attributes=None) -> None: :param profile: The IfcProfileDef entity you want to edit :type profile: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -41,7 +43,7 @@ def edit_profile(file, profile=None, attributes=None) -> None: ifcopenshell.api.run("profile.edit_profile", model, profile=circle, attributes={"ProfileName": "1000mm Dia"}) """ - settings = {"profile": profile, "attributes": attributes or {}} + settings = {"profile": profile, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["profile"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py b/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py index 58f3eebedb..f20cfc89fc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/remove_profile.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_profile(file, profile=None) -> None: +def remove_profile(file: ifcopenshell.file, profile: ifcopenshell.entity_instance) -> None: """Removes a profile :param profile: The IfcProfileDef to remove. diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py index b63b4cb719..df1a3246c6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py @@ -19,7 +19,8 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.api.owner.settings -from typing import Optional +import ifcopenshell.util.element +from typing import Optional, Any, Union def append_asset( @@ -124,6 +125,9 @@ def append_asset( class Usecase: + file: ifcopenshell.file + settings: dict[str, Any] + def execute(self): # mapping of old element ids to new elements self.added_elements: dict[int, ifcopenshell.entity_instance] = {} @@ -223,7 +227,7 @@ class Usecase: return element - def add_element(self, element): + def add_element(self, element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: if element.id() == 0: return existing_element = self.get_existing_element(element) @@ -262,7 +266,7 @@ class Usecase: elif value: return True - def check_inverses(self, element): + def check_inverses(self, element: ifcopenshell.entity_instance) -> None: for source_class, attributes in self.whitelisted_inverse_attributes.items(): if not element.is_a(source_class): continue diff --git a/src/ifcopenshell-python/ifcopenshell/util/date.py b/src/ifcopenshell-python/ifcopenshell/util/date.py index ce2c72289a..e547e5dbbf 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/date.py +++ b/src/ifcopenshell-python/ifcopenshell/util/date.py @@ -19,6 +19,7 @@ import datetime from re import findall from dateutil import parser +from typing import Literal, Union, Any try: import isodate @@ -104,7 +105,18 @@ def readable_ifc_duration(string): return final_string -def datetime2ifc(dt, ifc_type): +def datetime2ifc( + dt: Union[datetime.date, str], + ifc_type: Literal[ + "IfcDuration", + "IfcTimeStamp", + "IfcDateTime", + "IfcDate", + "IfcTime", + "IfcCalendarDate", + "IfcLocalTime", + ], +) -> Union[int, str, dict[str, Any]]: if isinstance(dt, str): if ifc_type == "IfcDuration": return dt @@ -145,6 +157,7 @@ def datetime2ifc(dt, ifc_type): "MinuteComponent": dt.minute, "SecondComponent": dt.second, } + raise TypeError(f"Unsupported ifc_type for conversion from datetime.datetime = {ifc_type}.") def string_to_date(string): From 5e394e157612a9e5c72a7f4106ac79745ad1e691 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 17:10:21 +0500 Subject: [PATCH 173/429] library.edit_library - support datetime for VersionDate attribute --- .../ifcopenshell/api/library/edit_library.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py index 81b96c0692..fa4e6b5229 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/edit_library.py @@ -16,6 +16,8 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.util.date +import datetime from typing import Any @@ -41,7 +43,16 @@ def edit_library(file: ifcopenshell.file, library: ifcopenshell.entity_instance, attributes={"Description": "A Brickschema TTL including only mechanical distribution systems."}) """ - settings = {"library": library, "attributes": attributes} + if "VersionDate" in attributes: + dt = attributes["VersionDate"] + if isinstance(dt, datetime.datetime): + if file.schema != "IFC2X3": + dt = ifcopenshell.util.date.datetime2ifc(dt, "IfcDateTime") + else: + calendar_date = ifcopenshell.util.date.datetime2ifc(dt, "IfcCalendarDate") + dt = file.create_entity("IfcCalendarDate", **calendar_date) + attributes = attributes.copy() + attributes["VersionDate"] = dt - for name, value in settings["attributes"].items(): - setattr(settings["library"], name, value) + for name, value in attributes.items(): + setattr(library, name, value) From f2696d5352547e6ce0d1c9145c6a4157adbbf36e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 17:25:05 +0500 Subject: [PATCH 174/429] avoid confusing TypeErrors from api calls After ab5ea4c85 it was always throwing wrong singature errors like below even if TypeError was caused by some internal issues inside API - it was adding couple extra steps to traceback making errors more noisy. TypeError: Incorrect function arguments provided for library.edit_library attribute 'VersionDate' for entity 'IFC2X3.IfcLibraryInformation' is expecting value of type 'ENTITY INSTANCE', got 'str'.. You specified args (,) and settings {'library': #1=IfcLibraryInformation('Name','Version',$,$,$), 'attributes': {'Name': 'Name', 'Version': 'Version', 'VersionDate': 'VersionDate', 'Location': 'Location', 'Description': 'Description'}} E Correct signature is (file: ifcopenshell.file.file, library: ifcopenshell.entity_instance.entity_instance, attributes: dict[str, typing.Any]) -> None See help(ifcopenshell.api.library.edit_library) for documentation. --- .../ifcopenshell/api/__init__.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index 7ecf53329f..b4311519fc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -324,8 +324,18 @@ def wrap_usecase(usecase_path, usecase): try: result = usecase(*args, **settings) - except TypeError as e: - msg = f"Incorrect function arguments provided for {usecase_path}\n{str(e)}. You specified args {args} and settings {settings}\n\nCorrect signature is {inspect.signature(usecase)}\nSee help(ifcopenshell.api.{usecase_path}) for documentation." + except NotImplementedError as e: + if not e.args[0].startswith(f"{usecase.__name__}()"): + # signature errors typically start with function name + # e.g. "TypeError: edit_library() got an unexpected keyword argument 'test'" + # otherwise it's an error inside api call and we shouldn't get in the way + raise e + msg = ( + f"Incorrect function arguments provided for {usecase_path}\n{str(e)}. " + f"You specified args {args} and settings {settings}\n\n" + f"Correct signature is {inspect.signature(usecase)}\n" + f"See help(ifcopenshell.api.{usecase_path}) for documentation." + ) raise TypeError(msg) from e if should_run_listeners: From 3665dda87c85b2bbe78c13238ca203ff759edec6 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 17:44:19 +0500 Subject: [PATCH 175/429] library.remove_library, remove_reference to support ifc2x3 --- .../api/library/remove_library.py | 29 ++++++++++++------- .../api/library/remove_reference.py | 9 ++++-- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py index d0c6cc4cc5..4f5037f4d6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/remove_library.py @@ -38,14 +38,23 @@ def remove_library(file: ifcopenshell.file, library: ifcopenshell.entity_instanc library = ifcopenshell.api.run("library.add_library", model, name="Brickschema") ifcopenshell.api.run("library.remove_library", model, library=library) """ - settings = {"library": library} - for reference in set(settings["library"].HasLibraryReferences or []): - file.remove(reference) - file.remove(settings["library"]) - for rel in file.by_type("IfcRelAssociatesLibrary"): - if not rel.RelatingLibrary: - history = rel.OwnerHistory - file.remove(rel) - if history: - ifcopenshell.util.element.remove_deep2(file, history) + if file.schema != "IFC2X3": + rels = [] + for reference in set(library.HasLibraryReferences): + rels.extend(reference.LibraryRefForObjects) + file.remove(reference) + rels.extend(library.LibraryInfoForObjects) + file.remove(library) + else: + for reference in set(library.LibraryReference or []): + file.remove(reference) + file.remove(library) + # RelatingLibrary could either be library itself or library reference we removed + rels = [rel for rel in file.by_type("IfcRelAssociatesLibrary") if rel.RelatingLibrary is None] + + for rel in rels: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py b/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py index 0b5ad42d1a..59ac1eafaa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/remove_reference.py @@ -40,11 +40,14 @@ def remove_reference(file: ifcopenshell.file, reference: ifcopenshell.entity_ins # Let's change our mind and remove it. ifcopenshell.api.run("library.remove_reference", model, reference=reference) """ - settings = {"reference": reference} + if file.schema != "IFC2X3": + rels = reference.LibraryRefForObjects + else: + rels = [rel for rel in file.by_type("IfcRelAssociatesLibrary") if rel.RelatingLibrary == reference] - for rel in settings["reference"].LibraryRefForObjects: + for rel in rels: history = rel.OwnerHistory file.remove(rel) if history: ifcopenshell.util.element.remove_deep2(file, history) - file.remove(settings["reference"]) + file.remove(reference) From a9cba30da6fd36499dd545d98731940ac1470f82 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 12:32:58 +0500 Subject: [PATCH 176/429] ifc2x3 tests removed part of test_append_two_type_products_sharing_the_same_material_indirectly_via_a_material_set for ifc2x3 compatibility and removed part is already tested in test_append_two_type_products_sharing_the_same_material_with_properties --- .../test/api/layer/test_assign_layer.py | 4 + .../test/api/layer/test_unassign_layer.py | 4 + .../test/api/library/test_add_library.py | 4 + .../test/api/library/test_assign_reference.py | 22 --- .../test/api/library/test_edit_library.py | 35 ++-- .../test/api/library/test_edit_reference.py | 28 +-- .../test/api/library/test_remove_library.py | 16 +- .../test/api/library/test_remove_reference.py | 4 + .../api/material/test_add_material_set.py | 13 +- .../test/api/material/test_copy_material.py | 25 ++- .../test/api/material/test_remove_material.py | 74 ++++---- .../api/material/test_remove_material_set.py | 5 +- .../test/api/owner/test_add_actor.py | 4 + .../test/api/owner/test_add_address.py | 4 + .../test/api/owner/test_add_application.py | 7 +- .../test/api/owner/test_add_organisation.py | 7 +- .../test/api/owner/test_add_person.py | 7 +- .../owner/test_add_person_and_organisation.py | 4 + .../test/api/owner/test_add_role.py | 4 + .../test/api/owner/test_assign_actor.py | 6 +- .../api/owner/test_create_owner_history.py | 27 ++- .../test/api/owner/test_edit_actor.py | 4 + .../test/api/owner/test_edit_address.py | 32 ++-- .../test/api/owner/test_edit_organisation.py | 9 +- .../test/api/owner/test_edit_person.py | 9 +- .../test/api/owner/test_edit_role.py | 4 + .../test/api/owner/test_remove_actor.py | 4 + .../test/api/owner/test_remove_address.py | 4 + .../api/owner/test_remove_organisation.py | 41 +++-- .../test/api/owner/test_remove_person.py | 18 +- .../test_remove_person_and_organisation.py | 41 +++-- .../test/api/owner/test_remove_role.py | 16 +- .../test/api/owner/test_unassign_actor.py | 4 + .../api/owner/test_update_owner_history.py | 4 + .../test/api/project/test_append_asset.py | 163 ++++++++---------- 35 files changed, 395 insertions(+), 262 deletions(-) diff --git a/src/ifcopenshell-python/test/api/layer/test_assign_layer.py b/src/ifcopenshell-python/test/api/layer/test_assign_layer.py index f2d4eca384..2e05162aad 100644 --- a/src/ifcopenshell-python/test/api/layer/test_assign_layer.py +++ b/src/ifcopenshell-python/test/api/layer/test_assign_layer.py @@ -37,3 +37,7 @@ class TestAssignLayer(test.bootstrap.IFC4): ifcopenshell.api.run("layer.assign_layer", self.file, items=items[2:], layer=layer) assert len(layer.AssignedItems) == 4 assert set(layer.AssignedItems) == set(items) + + +class TestAssignLayerIFC2X3(test.bootstrap.IFC2X3, TestAssignLayer): + pass diff --git a/src/ifcopenshell-python/test/api/layer/test_unassign_layer.py b/src/ifcopenshell-python/test/api/layer/test_unassign_layer.py index 7a29896500..7332c67715 100644 --- a/src/ifcopenshell-python/test/api/layer/test_unassign_layer.py +++ b/src/ifcopenshell-python/test/api/layer/test_unassign_layer.py @@ -37,3 +37,7 @@ class TestUnassignLayer(test.bootstrap.IFC4): ifcopenshell.api.run("layer.assign_layer", self.file, items=items, layer=layer) ifcopenshell.api.run("layer.unassign_layer", self.file, items=items, layer=layer) assert not self.file.by_type("IfcPresentationLayerAssignment") + + +class TestUnassignLayerIFC2X3(test.bootstrap.IFC2X3, TestUnassignLayer): + pass diff --git a/src/ifcopenshell-python/test/api/library/test_add_library.py b/src/ifcopenshell-python/test/api/library/test_add_library.py index 731393aeaa..f964b180ac 100644 --- a/src/ifcopenshell-python/test/api/library/test_add_library.py +++ b/src/ifcopenshell-python/test/api/library/test_add_library.py @@ -25,3 +25,7 @@ class TestAddLibrary(test.bootstrap.IFC4): library = ifcopenshell.api.run("library.add_library", self.file, name="Name") assert library.is_a("IfcLibraryInformation") assert library.Name == "Name" + + +class TestAddLibraryIFC2X3(test.bootstrap.IFC2X3, TestAddLibrary): + pass diff --git a/src/ifcopenshell-python/test/api/library/test_assign_reference.py b/src/ifcopenshell-python/test/api/library/test_assign_reference.py index 550df3940f..5d00d20972 100644 --- a/src/ifcopenshell-python/test/api/library/test_assign_reference.py +++ b/src/ifcopenshell-python/test/api/library/test_assign_reference.py @@ -20,28 +20,6 @@ import test.bootstrap import ifcopenshell.api -def validate_ifc_file(ifc_file: ifcopenshell.file, use_json=True): - import ifcopenshell - import ifcopenshell.validate - - if use_json: - logger = ifcopenshell.validate.json_logger() - else: - import logging - - logger = logging.getLogger("validate") - logger.setLevel(logging.DEBUG) - - ifcopenshell.validate.validate(ifc_file, logger, express_rules=True) - if use_json: - if logger.statements: - from pprint import pprint - - pprint(logger.statements) - else: - print("IFC is completely valid.") - - class TestAssignReference(test.bootstrap.IFC4): def test_assigning_a_reference(self): reference = self.file.createIfcLibraryReference() diff --git a/src/ifcopenshell-python/test/api/library/test_edit_library.py b/src/ifcopenshell-python/test/api/library/test_edit_library.py index 362597d519..7d6d570666 100644 --- a/src/ifcopenshell-python/test/api/library/test_edit_library.py +++ b/src/ifcopenshell-python/test/api/library/test_edit_library.py @@ -17,26 +17,41 @@ # along with IfcOpenShell. If not, see . import test.bootstrap +import datetime import ifcopenshell.api +import ifcopenshell.util.date class TestEditLibrary(test.bootstrap.IFC4): def test_editing_a_library(self): library = self.file.createIfcLibraryInformation() + dt = datetime.datetime.now() + attributes = { + "Name": "Name", + "Version": "Version", + "VersionDate": dt, + } + if self.file.schema != "IFC2X3": + attributes["Location"] = "Location" + attributes["Description"] = "Description" + ifcopenshell.api.run( "library.edit_library", self.file, library=library, - attributes={ - "Name": "Name", - "Version": "Version", - "VersionDate": "VersionDate", - "Location": "Location", - "Description": "Description", - }, + attributes=attributes, ) assert library.Name == "Name" assert library.Version == "Version" - assert library.VersionDate == "VersionDate" - assert library.Location == "Location" - assert library.Description == "Description" + if self.file.schema != "IFC2X3": + assert library.VersionDate == ifcopenshell.util.date.datetime2ifc(dt, "IfcDateTime") + assert library.Location == "Location" + assert library.Description == "Description" + else: + info = library.VersionDate.get_info() + del info["id"], info["type"] + assert info == ifcopenshell.util.date.datetime2ifc(dt, "IfcCalendarDate") + + +class TestEditLibraryIFC2X3(test.bootstrap.IFC2X3, TestEditLibrary): + pass diff --git a/src/ifcopenshell-python/test/api/library/test_edit_reference.py b/src/ifcopenshell-python/test/api/library/test_edit_reference.py index 56f169977e..338b9f4f74 100644 --- a/src/ifcopenshell-python/test/api/library/test_edit_reference.py +++ b/src/ifcopenshell-python/test/api/library/test_edit_reference.py @@ -23,20 +23,28 @@ import ifcopenshell.api class TestEditReference(test.bootstrap.IFC4): def test_editing_a_reference(self): reference = self.file.createIfcLibraryReference() + attributes = { + "Location": "Location", + "Identification" if self.file.schema != "IFC2X3" else "ItemReference": "Identification", + "Name": "Name", + } + if self.file.schema != "IFC2X3": + attributes["Description"] = "Description" + attributes["Language"] = "Language" ifcopenshell.api.run( "library.edit_reference", self.file, reference=reference, - attributes={ - "Location": "Location", - "Identification": "Identification", - "Name": "Name", - "Description": "Description", - "Language": "Language", - }, + attributes=attributes, ) assert reference.Location == "Location" - assert reference.Identification == "Identification" + # 1 IfcExternalReference Identification(>IFC2X3) / ItemReference (IFC2X3) + assert reference[1] == "Identification" assert reference.Name == "Name" - assert reference.Description == "Description" - assert reference.Language == "Language" + if self.file.schema != "IFC2X3": + assert reference.Description == "Description" + assert reference.Language == "Language" + + +class TestEditReferenceIFC2X3(test.bootstrap.IFC2X3, TestEditReference): + pass diff --git a/src/ifcopenshell-python/test/api/library/test_remove_library.py b/src/ifcopenshell-python/test/api/library/test_remove_library.py index 9ca623b9b6..a4743deb99 100644 --- a/src/ifcopenshell-python/test/api/library/test_remove_library.py +++ b/src/ifcopenshell-python/test/api/library/test_remove_library.py @@ -27,11 +27,21 @@ class TestRemoveLibrary(test.bootstrap.IFC4): assert len(self.file.by_type("IfcLibraryInformation")) == 0 def test_removing_a_library_and_all_references(self): - library = self.file.createIfcLibraryInformation() - reference1 = self.file.createIfcLibraryReference(ReferencedLibrary=library) - reference2 = self.file.createIfcLibraryReference(ReferencedLibrary=library) + if self.file.schema != "IFC2X3": + library = self.file.createIfcLibraryInformation() + reference1 = self.file.createIfcLibraryReference(ReferencedLibrary=library) + reference2 = self.file.createIfcLibraryReference(ReferencedLibrary=library) + else: + reference1 = self.file.createIfcLibraryReference() + reference2 = self.file.createIfcLibraryReference() + library = self.file.createIfcLibraryInformation(LibraryReference=[reference1, reference2]) + self.file.createIfcRelAssociatesLibrary(GlobalId="foo", RelatingLibrary=library) self.file.createIfcRelAssociatesLibrary(GlobalId="bar", RelatingLibrary=reference1) ifcopenshell.api.run("library.remove_library", self.file, library=library) assert len(self.file.by_type("IfcLibraryReference")) == 0 assert len(self.file.by_type("IfcRelAssociatesLibrary")) == 0 + + +class TestRemoveLibraryIFC2X3(test.bootstrap.IFC2X3, TestRemoveLibrary): + pass diff --git a/src/ifcopenshell-python/test/api/library/test_remove_reference.py b/src/ifcopenshell-python/test/api/library/test_remove_reference.py index a98ed2f083..fdeca97fb5 100644 --- a/src/ifcopenshell-python/test/api/library/test_remove_reference.py +++ b/src/ifcopenshell-python/test/api/library/test_remove_reference.py @@ -28,3 +28,7 @@ class TestRemoveReference(test.bootstrap.IFC4): ifcopenshell.api.run("library.remove_reference", self.file, reference=reference) assert len(self.file.by_type("IfcLibraryReference")) == 0 assert len(self.file.by_type("IfcRelAssociatesLibrary")) == 0 + + +class TestRemoveReferenceIFC2X3(test.bootstrap.IFC2X3, TestRemoveReference): + pass diff --git a/src/ifcopenshell-python/test/api/material/test_add_material_set.py b/src/ifcopenshell-python/test/api/material/test_add_material_set.py index 7adb706f08..ec711d8a0e 100644 --- a/src/ifcopenshell-python/test/api/material/test_add_material_set.py +++ b/src/ifcopenshell-python/test/api/material/test_add_material_set.py @@ -20,12 +20,19 @@ import test.bootstrap import ifcopenshell.api -class TestAddMaterialSet(test.bootstrap.IFC4): +class TestAddMaterialSetIFC2X3(test.bootstrap.IFC2X3): def test_add_layer_set(self): material = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialLayerSet") assert material.LayerSetName == "Unnamed" assert material.is_a("IfcMaterialLayerSet") + def test_add_list(self): + material = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialList") + assert material.is_a("IfcMaterialList") + + +class TestAddMaterialSetIFC4(test.bootstrap.IFC4, TestAddMaterialSetIFC2X3): + # entities added in IFC4 def test_add_profile_set(self): material = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialProfileSet") assert material.Name == "Unnamed" @@ -35,7 +42,3 @@ class TestAddMaterialSet(test.bootstrap.IFC4): material = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialConstituentSet") assert material.Name == "Unnamed" assert material.is_a("IfcMaterialConstituentSet") - - def test_add_list(self): - material = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialList") - assert material.is_a("IfcMaterialList") diff --git a/src/ifcopenshell-python/test/api/material/test_copy_material.py b/src/ifcopenshell-python/test/api/material/test_copy_material.py index ce52bbd769..623814c266 100644 --- a/src/ifcopenshell-python/test/api/material/test_copy_material.py +++ b/src/ifcopenshell-python/test/api/material/test_copy_material.py @@ -33,19 +33,31 @@ class TestCopyMaterial(test.bootstrap.IFC4): material = ifcopenshell.api.run("material.add_material", self.file, name="CON01") ifcopenshell.api.run("material.assign_material", self.file, products=[element], material=material) new = ifcopenshell.api.run("material.copy_material", self.file, material=material) - assert material.AssociatedTo - assert not new.AssociatedTo + assert ifcopenshell.util.element.get_elements_by_material(self.file, material) + assert not ifcopenshell.util.element.get_elements_by_material(self.file, new) def test_copy_a_material_with_properties(self): + def get_material_props(material: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: + if self.file.schema != "IFC2X3": + return material.HasProperties + return [i for i in self.file.get_inverse(material) if i.is_a("IfcMaterialProperties")] + material = ifcopenshell.api.run("material.add_material", self.file, name="CON01") pset = ifcopenshell.api.run("pset.add_pset", self.file, product=material, name="Foo_Bar") ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"foo": "bar"}) new = ifcopenshell.api.run("material.copy_material", self.file, material=material) assert new.Name == "CON01" assert len(self.file.by_type("IfcMaterial")) == 2 - assert new.HasProperties[0] != material.HasProperties[0] - assert new.HasProperties[0].Properties[0] != material.HasProperties[0].Properties[0] - assert ifcopenshell.util.element.get_pset(new, "Foo_Bar", "foo") == "bar" + assert len(self.file.by_type("IfcMaterialProperties")) == 2 + props_old = get_material_props(material)[0] + props_new = get_material_props(new)[0] + assert props_old != props_new + if self.file.schema != "IFC2X3": + assert props_old.Properties[0] != props_new.Properties[0] + assert ifcopenshell.util.element.get_pset(new, "Foo_Bar", "foo") == "bar" + else: + assert props_old.ExtendedProperties[0] != props_new.ExtendedProperties[0] + assert props_new.ExtendedProperties[0].NominalValue.wrappedValue == "bar" def test_copy_a_material_with_a_style_representation(self): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") @@ -59,3 +71,6 @@ class TestCopyMaterial(test.bootstrap.IFC4): assert new.HasRepresentation[0] != material.HasRepresentation[0] assert new.HasRepresentation[0].Representations[0] != material.HasRepresentation[0].Representations[0] assert new.HasRepresentation[0].Representations[0].ContextOfItems == context + +class TestCopyMaterialIFC2X3(test.bootstrap.IFC2X3, TestCopyMaterial): + pass diff --git a/src/ifcopenshell-python/test/api/material/test_remove_material.py b/src/ifcopenshell-python/test/api/material/test_remove_material.py index 0670c09bbb..e5690dcfd5 100644 --- a/src/ifcopenshell-python/test/api/material/test_remove_material.py +++ b/src/ifcopenshell-python/test/api/material/test_remove_material.py @@ -20,7 +20,7 @@ import test.bootstrap import ifcopenshell.api -class TestRemoveMaterial(test.bootstrap.IFC4): +class TestRemoveMaterialIFC2X3(test.bootstrap.IFC2X3): def test_removing_material(self): material = ifcopenshell.api.run("material.add_material", self.file) ifcopenshell.api.run("material.remove_material", self.file, material=material) @@ -37,9 +37,7 @@ class TestRemoveMaterial(test.bootstrap.IFC4): def test_removing_material_in_layer(self): wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") material = ifcopenshell.api.run("material.add_material", self.file) - material_set = ifcopenshell.api.run( - "material.add_material_set", self.file, set_type="IfcMaterialLayerSet" - ) + material_set = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialLayerSet") ifcopenshell.api.run("material.add_layer", self.file, layer_set=material_set, material=material) ifcopenshell.api.run("material.assign_material", self.file, products=[wall], material=material_set) assert len(self.file.by_type("IfcMaterialLayerSet")[0].MaterialLayers) == 1 @@ -48,40 +46,10 @@ class TestRemoveMaterial(test.bootstrap.IFC4): assert len(self.file.by_type("IfcRelAssociatesMaterial")) == 1 assert len(self.file.by_type("IfcMaterialLayerSet")[0].MaterialLayers) == 0 - def test_removing_material_in_profile(self): - wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - material = ifcopenshell.api.run("material.add_material", self.file) - material_set = ifcopenshell.api.run( - "material.add_material_set", self.file, set_type="IfcMaterialProfileSet" - ) - ifcopenshell.api.run("material.add_profile", self.file, profile_set=material_set, material=material) - ifcopenshell.api.run("material.assign_material", self.file, products=[wall], material=material_set) - assert len(self.file.by_type("IfcMaterialProfileSet")[0].MaterialProfiles) == 1 - ifcopenshell.api.run("material.remove_material", self.file, material=material) - assert len(self.file.by_type("IfcMaterial")) == 0 - assert len(self.file.by_type("IfcRelAssociatesMaterial")) == 1 - assert len(self.file.by_type("IfcMaterialProfileSet")[0].MaterialProfiles) == 0 - - def test_removing_material_in_constituent(self): - wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - material = ifcopenshell.api.run("material.add_material", self.file) - material_set = ifcopenshell.api.run( - "material.add_material_set", self.file, set_type="IfcMaterialConstituentSet" - ) - ifcopenshell.api.run("material.add_constituent", self.file, constituent_set=material_set, material=material) - ifcopenshell.api.run("material.assign_material", self.file, products=[wall], material=material_set) - assert len(self.file.by_type("IfcMaterialConstituentSet")[0].MaterialConstituents) == 1 - ifcopenshell.api.run("material.remove_material", self.file, material=material) - assert len(self.file.by_type("IfcMaterial")) == 0 - assert len(self.file.by_type("IfcRelAssociatesMaterial")) == 1 - assert self.file.by_type("IfcMaterialConstituentSet")[0].MaterialConstituents is None - def test_removing_material_in_list(self): wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") material = ifcopenshell.api.run("material.add_material", self.file) - material_set = ifcopenshell.api.run( - "material.add_material_set", self.file, set_type="IfcMaterialList" - ) + material_set = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialList") ifcopenshell.api.run("material.add_list_item", self.file, material_list=material_set, material=material) ifcopenshell.api.run("material.assign_material", self.file, products=[wall], material=material_set) assert len(self.file.by_type("IfcMaterialList")[0].Materials) == 1 @@ -108,10 +76,44 @@ class TestRemoveMaterial(test.bootstrap.IFC4): assert len(self.file.by_type("IfcSurfaceStyle")) == 1 def test_removing_a_material_with_properties(self): + def get_material_props(material: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: + if self.file.schema != "IFC2X3": + return material.HasProperties + return [i for i in self.file.get_inverse(material) if i.is_a("IfcMaterialProperties")] + material = ifcopenshell.api.run("material.add_material", self.file) pset = ifcopenshell.api.run("pset.add_pset", self.file, product=material, name="Foo_Bar") ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": "Bar"}) - assert material.HasProperties + assert get_material_props(material) ifcopenshell.api.run("material.remove_material", self.file, material=material) assert len(self.file.by_type("IfcMaterialProperties")) == 0 assert len(self.file.by_type("IfcPropertySingleValue")) == 0 + + +class TestRemoveMaterialIFC4(test.bootstrap.IFC4, TestRemoveMaterialIFC2X3): + # IfcMaterialProfileSet added in IFC4 + def test_removing_material_in_profile(self): + wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + material = ifcopenshell.api.run("material.add_material", self.file) + material_set = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialProfileSet") + ifcopenshell.api.run("material.add_profile", self.file, profile_set=material_set, material=material) + ifcopenshell.api.run("material.assign_material", self.file, products=[wall], material=material_set) + assert len(self.file.by_type("IfcMaterialProfileSet")[0].MaterialProfiles) == 1 + ifcopenshell.api.run("material.remove_material", self.file, material=material) + assert len(self.file.by_type("IfcMaterial")) == 0 + assert len(self.file.by_type("IfcRelAssociatesMaterial")) == 1 + assert len(self.file.by_type("IfcMaterialProfileSet")[0].MaterialProfiles) == 0 + + def test_removing_material_in_constituent(self): + wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + material = ifcopenshell.api.run("material.add_material", self.file) + material_set = ifcopenshell.api.run( + "material.add_material_set", self.file, set_type="IfcMaterialConstituentSet" + ) + ifcopenshell.api.run("material.add_constituent", self.file, constituent_set=material_set, material=material) + ifcopenshell.api.run("material.assign_material", self.file, products=[wall], material=material_set) + assert len(self.file.by_type("IfcMaterialConstituentSet")[0].MaterialConstituents) == 1 + ifcopenshell.api.run("material.remove_material", self.file, material=material) + assert len(self.file.by_type("IfcMaterial")) == 0 + assert len(self.file.by_type("IfcRelAssociatesMaterial")) == 1 + assert self.file.by_type("IfcMaterialConstituentSet")[0].MaterialConstituents is None diff --git a/src/ifcopenshell-python/test/api/material/test_remove_material_set.py b/src/ifcopenshell-python/test/api/material/test_remove_material_set.py index 7554225efe..0ec549d67a 100644 --- a/src/ifcopenshell-python/test/api/material/test_remove_material_set.py +++ b/src/ifcopenshell-python/test/api/material/test_remove_material_set.py @@ -20,7 +20,7 @@ import test.bootstrap import ifcopenshell.api -class TestRemoveMaterialSet(test.bootstrap.IFC4): +class TestRemoveMaterialSetIFC2X3(test.bootstrap.IFC2X3): def test_removing_material_set(self): material = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialLayerSet") ifcopenshell.api.run("material.remove_material_set", self.file, material=material) @@ -43,6 +43,9 @@ class TestRemoveMaterialSet(test.bootstrap.IFC4): assert len(self.file.by_type("IfcMaterialLayer")) == 0 assert len(self.file.by_type("IfcMaterial")) == 1 + +class TestRemoveMaterialSetIFC4(test.bootstrap.IFC4, TestRemoveMaterialSetIFC2X3): + # IFC2X3 doesn't support adding a pset to IfcMaterialLayerSet def test_removing_a_material_set_with_properties(self): material = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialLayerSet") pset = ifcopenshell.api.run("pset.add_pset", self.file, product=material, name="Foo_Bar") diff --git a/src/ifcopenshell-python/test/api/owner/test_add_actor.py b/src/ifcopenshell-python/test/api/owner/test_add_actor.py index 0d9af85100..82b43f9a96 100644 --- a/src/ifcopenshell-python/test/api/owner/test_add_actor.py +++ b/src/ifcopenshell-python/test/api/owner/test_add_actor.py @@ -32,3 +32,7 @@ class TestAddActor(test.bootstrap.IFC4): actor = ifcopenshell.api.run("owner.add_actor", self.file, ifc_class="IfcOccupant", actor=person) assert actor.is_a() == "IfcOccupant" assert actor.TheActor == person + + +class TestAddActorIFC2X3(test.bootstrap.IFC2X3, TestAddActor): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_add_address.py b/src/ifcopenshell-python/test/api/owner/test_add_address.py index 452d0fea5f..31c18f6be4 100644 --- a/src/ifcopenshell-python/test/api/owner/test_add_address.py +++ b/src/ifcopenshell-python/test/api/owner/test_add_address.py @@ -48,3 +48,7 @@ class TestAddAddress(test.bootstrap.IFC4): assert postal.Purpose == telecom.Purpose == "OFFICE" assert postal in organisation.Addresses assert telecom in organisation.Addresses + + +class TestAddAddressIFC2X3(test.bootstrap.IFC2X3, TestAddAddress): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_add_application.py b/src/ifcopenshell-python/test/api/owner/test_add_application.py index 3c28bb3e2d..182f4feea9 100644 --- a/src/ifcopenshell-python/test/api/owner/test_add_application.py +++ b/src/ifcopenshell-python/test/api/owner/test_add_application.py @@ -28,7 +28,8 @@ class TestAddApplication(test.bootstrap.IFC4): assert application.ApplicationFullName == "IfcOpenShell" assert application.ApplicationIdentifier == "IfcOpenShell" assert developer.is_a("IfcOrganization") - assert developer.Identification == "IfcOpenShell" + # 0 IfcOrganization Identification(>IFC2X3) / Id (IFC2X3) + assert developer[0] == "IfcOpenShell" assert developer.Name == "IfcOpenShell" assert ( developer.Description @@ -40,3 +41,7 @@ class TestAddApplication(test.bootstrap.IFC4): assert developer.Addresses[0].Purpose == "USERDEFINED" assert developer.Addresses[0].UserDefinedPurpose == "WEBPAGE" assert developer.Addresses[0].WWWHomePageURL == "https://ifcopenshell.org" + + +class TestAddApplicationIFC2X3(test.bootstrap.IFC2X3, TestAddApplication): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_add_organisation.py b/src/ifcopenshell-python/test/api/owner/test_add_organisation.py index e6fffab2ae..f7aad1c0a0 100644 --- a/src/ifcopenshell-python/test/api/owner/test_add_organisation.py +++ b/src/ifcopenshell-python/test/api/owner/test_add_organisation.py @@ -23,5 +23,10 @@ import ifcopenshell.api class TestAddOrganisation(test.bootstrap.IFC4): def test_adding_an_organisation(self): org = ifcopenshell.api.run("owner.add_organisation", self.file, identification="Id", name="Name") - assert org.Identification == "Id" + # 0 IfcOrganization Identification(>IFC2X3) / Id (IFC2X3) + assert org[0] == "Id" assert org.Name == "Name" + + +class TestAddOrganisationIFC2X3(test.bootstrap.IFC2X3, TestAddOrganisation): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_add_person.py b/src/ifcopenshell-python/test/api/owner/test_add_person.py index 5d3a272119..6aed44c8db 100644 --- a/src/ifcopenshell-python/test/api/owner/test_add_person.py +++ b/src/ifcopenshell-python/test/api/owner/test_add_person.py @@ -29,6 +29,11 @@ class TestAddPerson(test.bootstrap.IFC4): family_name="FamilyName", given_name="GivenName", ) - assert person.Identification == "Identification" + # 0 IfcPerson Identification(>IFC2X3) / Id (IFC2X3) + assert person[0] == "Identification" assert person.FamilyName == "FamilyName" assert person.GivenName == "GivenName" + + +class TestAddPersonIFC2X3(test.bootstrap.IFC2X3, TestAddPerson): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_add_person_and_organisation.py b/src/ifcopenshell-python/test/api/owner/test_add_person_and_organisation.py index a82d99691e..079d162433 100644 --- a/src/ifcopenshell-python/test/api/owner/test_add_person_and_organisation.py +++ b/src/ifcopenshell-python/test/api/owner/test_add_person_and_organisation.py @@ -27,3 +27,7 @@ class TestAddPersonAndOrganisation(test.bootstrap.IFC4): person_and_organisation = ifcopenshell.api.run( "owner.add_person_and_organisation", self.file, person=person, organisation=organisation ) + + +class TestAddPersonAndOrganisationIFC2X3(test.bootstrap.IFC2X3, TestAddPersonAndOrganisation): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_add_role.py b/src/ifcopenshell-python/test/api/owner/test_add_role.py index 393ff5964d..08351996b6 100644 --- a/src/ifcopenshell-python/test/api/owner/test_add_role.py +++ b/src/ifcopenshell-python/test/api/owner/test_add_role.py @@ -34,3 +34,7 @@ class TestAddRole(test.bootstrap.IFC4): assert role.is_a("IfcActorRole") assert role.Role == "ARCHITECT" assert organisation.Roles == (role,) + + +class TestAddRoleIFC2X3(test.bootstrap.IFC2X3, TestAddRole): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_assign_actor.py b/src/ifcopenshell-python/test/api/owner/test_assign_actor.py index 720cf1492b..bfd846ecfd 100644 --- a/src/ifcopenshell-python/test/api/owner/test_assign_actor.py +++ b/src/ifcopenshell-python/test/api/owner/test_assign_actor.py @@ -20,7 +20,7 @@ import test.bootstrap import ifcopenshell.api -class TestAssignProduct(test.bootstrap.IFC4): +class TestAssignActor(test.bootstrap.IFC4): def test_assigning_an_actor(self): wall = self.file.createIfcWall() wall2 = self.file.createIfcWall() @@ -36,3 +36,7 @@ class TestAssignProduct(test.bootstrap.IFC4): ifcopenshell.api.run("owner.assign_actor", self.file, relating_actor=actor, related_object=wall) ifcopenshell.api.run("owner.assign_actor", self.file, relating_actor=actor, related_object=wall) assert actor.IsActingUpon[0].RelatedObjects == (wall,) + + +class TestAssignActorIFC2X3(test.bootstrap.IFC2X3, TestAssignActor): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_create_owner_history.py b/src/ifcopenshell-python/test/api/owner/test_create_owner_history.py index b57f08a6af..a9a60472bb 100644 --- a/src/ifcopenshell-python/test/api/owner/test_create_owner_history.py +++ b/src/ifcopenshell-python/test/api/owner/test_create_owner_history.py @@ -17,25 +17,36 @@ # along with IfcOpenShell. If not, see . import time +import pytest import test.bootstrap import ifcopenshell.api +import ifcopenshell.api.owner.settings class TestCreateOwnerHistory(test.bootstrap.IFC4): def test_creating_nothing_if_no_user_or_application_is_available(self): - history = ifcopenshell.api.run("owner.create_owner_history", self.file) - assert history is None + if self.file.schema != "IFC2X3": + history = ifcopenshell.api.run("owner.create_owner_history", self.file) + assert history is None + else: + ifcopenshell.api.owner.settings.factory_reset() + # create new file as bootstrap is creating users in ifc2x3 by default + file = ifcopenshell.file(schema="IFC2X3") + with pytest.raises(Exception) as e: + ifcopenshell.api.run("owner.create_owner_history", file) + assert "Please create a user to continue" in str(e.value) + ifcopenshell.api.owner.settings.restore() def test_creating_a_history_using_a_specified_user_and_application(self): - old_get_user = ifcopenshell.api.owner.settings.get_user - old_get_application = ifcopenshell.api.owner.settings.get_application + ifcopenshell.api.owner.settings.factory_reset() + user = self.file.createIfcPersonAndOrganization() application = self.file.createIfcApplication() ifcopenshell.api.owner.settings.get_user = lambda x: user ifcopenshell.api.owner.settings.get_application = lambda x: application history = ifcopenshell.api.run("owner.create_owner_history", self.file) - ifcopenshell.api.owner.settings.get_user = old_get_user - ifcopenshell.api.owner.settings.get_application = old_get_application + ifcopenshell.api.owner.settings.restore() + assert history.is_a("IfcOwnerHistory") assert history.OwningUser == user assert history.OwningApplication == application @@ -45,3 +56,7 @@ class TestCreateOwnerHistory(test.bootstrap.IFC4): assert history.LastModifyingUser == user assert history.LastModifyingApplication == application assert abs(time.time() - history.CreationDate) < 5 + + +class TestCreateOwnerHistoryIFC2X3(test.bootstrap.IFC2X3, TestCreateOwnerHistory): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_edit_actor.py b/src/ifcopenshell-python/test/api/owner/test_edit_actor.py index 94227a055e..de30e7ba29 100644 --- a/src/ifcopenshell-python/test/api/owner/test_edit_actor.py +++ b/src/ifcopenshell-python/test/api/owner/test_edit_actor.py @@ -52,3 +52,7 @@ class TestEditActor(test.bootstrap.IFC4): assert actor.Description == "Description" assert actor.ObjectType == "ObjectType" assert actor.PredefinedType == "TENANT" + + +class TestEditActorIFC2X3(test.bootstrap.IFC2X3, TestEditActor): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_edit_address.py b/src/ifcopenshell-python/test/api/owner/test_edit_address.py index d56e9860f6..c7a69db019 100644 --- a/src/ifcopenshell-python/test/api/owner/test_edit_address.py +++ b/src/ifcopenshell-python/test/api/owner/test_edit_address.py @@ -53,21 +53,24 @@ class TestEditAddress(test.bootstrap.IFC4): def test_editing_a_telecom_address(self): address = self.file.createIfcTelecomAddress() + attributes = { + "Purpose": "OFFICE", + "Description": "Description", + "UserDefinedPurpose": "UserDefinedPurpose", + "TelephoneNumbers": ["Telephone", "Numbers"], + "FacsimileNumbers": ["Facsimile", "Numbers"], + "PagerNumber": "PagerNumber", + "ElectronicMailAddresses": ["Electronic", "Mail", "Addresses"], + "WWWHomePageURL": "WWWHomePageURL", + } + if self.file.schema != "IFC2X3": + attributes["MessagingIDs"] = ["Messaging", "IDs"] + ifcopenshell.api.run( "owner.edit_address", self.file, address=address, - attributes={ - "Purpose": "OFFICE", - "Description": "Description", - "UserDefinedPurpose": "UserDefinedPurpose", - "TelephoneNumbers": ["Telephone", "Numbers"], - "FacsimileNumbers": ["Facsimile", "Numbers"], - "PagerNumber": "PagerNumber", - "ElectronicMailAddresses": ["Electronic", "Mail", "Addresses"], - "WWWHomePageURL": "WWWHomePageURL", - "MessagingIDs": ["Messaging", "IDs"], - }, + attributes=attributes, ) assert address.Purpose == "OFFICE" assert address.Description == "Description" @@ -77,4 +80,9 @@ class TestEditAddress(test.bootstrap.IFC4): assert address.PagerNumber == "PagerNumber" assert address.ElectronicMailAddresses == ("Electronic", "Mail", "Addresses") assert address.WWWHomePageURL == "WWWHomePageURL" - assert address.MessagingIDs == ("Messaging", "IDs") + if self.file.schema != "IFC2X3": + assert address.MessagingIDs == ("Messaging", "IDs") + + +class TestEditAddressIFC2X3(test.bootstrap.IFC2X3, TestEditAddress): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_edit_organisation.py b/src/ifcopenshell-python/test/api/owner/test_edit_organisation.py index a7a5e41a3c..8ec224dd25 100644 --- a/src/ifcopenshell-python/test/api/owner/test_edit_organisation.py +++ b/src/ifcopenshell-python/test/api/owner/test_edit_organisation.py @@ -28,11 +28,16 @@ class TestEditOrganisation(test.bootstrap.IFC4): self.file, organisation=organisation, attributes={ - "Identification": "Identification", + "Identification" if self.file.schema != "IFC2X3" else "Id": "Identification", "Name": "Name", "Description": "Description", }, ) - assert organisation.Identification == "Identification" + # 0 IfcOrganization Identification(>IFC2X3) / Id (IFC2X3) + assert organisation[0] == "Identification" assert organisation.Name == "Name" assert organisation.Description == "Description" + + +class TestEditOrganisationIFC2X3(test.bootstrap.IFC2X3, TestEditOrganisation): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_edit_person.py b/src/ifcopenshell-python/test/api/owner/test_edit_person.py index ef35b5d173..0d5d8a2c97 100644 --- a/src/ifcopenshell-python/test/api/owner/test_edit_person.py +++ b/src/ifcopenshell-python/test/api/owner/test_edit_person.py @@ -28,7 +28,7 @@ class TestEditPerson(test.bootstrap.IFC4): self.file, person=person, attributes={ - "Identification": "Identification", + "Identification" if self.file.schema != "IFC2X3" else "Id": "Identification", "FamilyName": "FamilyName", "GivenName": "GivenName", "MiddleNames": ["Middle", "Names"], @@ -36,9 +36,14 @@ class TestEditPerson(test.bootstrap.IFC4): "SuffixTitles": ["Suffix", "Titles"], }, ) - assert person.Identification == "Identification" + # 0 IfcPerson Identification(>IFC2X3) / Id (IFC2X3) + assert person[0] == "Identification" assert person.FamilyName == "FamilyName" assert person.GivenName == "GivenName" assert person.MiddleNames == ("Middle", "Names") assert person.PrefixTitles == ("Prefix", "Titles") assert person.SuffixTitles == ("Suffix", "Titles") + + +class TestEditPersonIFC2X3(test.bootstrap.IFC2X3, TestEditPerson): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_edit_role.py b/src/ifcopenshell-python/test/api/owner/test_edit_role.py index f47b1601e8..693ff29c5b 100644 --- a/src/ifcopenshell-python/test/api/owner/test_edit_role.py +++ b/src/ifcopenshell-python/test/api/owner/test_edit_role.py @@ -32,3 +32,7 @@ class TestEditRole(test.bootstrap.IFC4): assert role.Role == "ARCHITECT" assert role.UserDefinedRole == "UserDefinedRole" assert role.Description == "Description" + + +class TestEditRoleIFC2X3(test.bootstrap.IFC2X3, TestEditRole): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_remove_actor.py b/src/ifcopenshell-python/test/api/owner/test_remove_actor.py index 7a068d3735..b3a387f2e6 100644 --- a/src/ifcopenshell-python/test/api/owner/test_remove_actor.py +++ b/src/ifcopenshell-python/test/api/owner/test_remove_actor.py @@ -26,3 +26,7 @@ class TestRemoveActor(test.bootstrap.IFC4): actor = ifcopenshell.api.run("owner.add_actor", self.file, ifc_class="IfcActor", actor=person) ifcopenshell.api.run("owner.remove_actor", self.file, actor=actor) assert len(self.file.by_type("IfcActor")) == 0 + + +class TestRemoveActorIFC2X3(test.bootstrap.IFC2X3, TestRemoveActor): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_remove_address.py b/src/ifcopenshell-python/test/api/owner/test_remove_address.py index f8f61a888b..d0a26a10aa 100644 --- a/src/ifcopenshell-python/test/api/owner/test_remove_address.py +++ b/src/ifcopenshell-python/test/api/owner/test_remove_address.py @@ -41,3 +41,7 @@ class TestRemoveAddress(test.bootstrap.IFC4): person.Addresses = [address] ifcopenshell.api.run("owner.remove_address", self.file, address=address) assert person.Addresses is None + + +class TestRemoveAddressIFC2X3(test.bootstrap.IFC2X3, TestRemoveAddress): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_remove_organisation.py b/src/ifcopenshell-python/test/api/owner/test_remove_organisation.py index f669dc6814..232b74795c 100644 --- a/src/ifcopenshell-python/test/api/owner/test_remove_organisation.py +++ b/src/ifcopenshell-python/test/api/owner/test_remove_organisation.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.guid -class TestRemoveOrganisation(test.bootstrap.IFC4): +class TestRemoveOrganisationIFC2X3(test.bootstrap.IFC2X3): def test_removing_a_organisation(self): organisation = self.file.createIfcOrganization() ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) @@ -82,26 +82,29 @@ class TestRemoveOrganisation(test.bootstrap.IFC4): ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) assert document_information.Editors is None - def test_deleting_resource_approval_relationships(self): - organisation = self.file.createIfcOrganization() - self.file.createIfcResourceApprovalRelationship(RelatedResourceObjects=[organisation]) - ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) - assert len(self.file.by_type("IfcResourceApprovalRelationship")) == 0 - - def test_deleting_resource_constraint_relationships(self): - organisation = self.file.createIfcOrganization() - self.file.createIfcResourceConstraintRelationship(RelatedResourceObjects=[organisation]) - ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) - assert len(self.file.by_type("IfcResourceConstraintRelationship")) == 0 - - def test_deleting_external_reference_relationships(self): - organisation = self.file.createIfcOrganization() - self.file.createIfcExternalReferenceRelationship(RelatedResourceObjects=[organisation]) - ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) - assert len(self.file.by_type("IfcExternalReferenceRelationship")) == 0 - def test_deleting_an_application(self): organisation = self.file.createIfcOrganization() self.file.createIfcApplication(ApplicationDeveloper=organisation) ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) assert len(self.file.by_type("IfcApplication")) == 0 + + +class TestRemoveOrganisationIFC4(test.bootstrap.IFC4, TestRemoveOrganisationIFC2X3): + # IfcResourceLevelRelationships were added in IFC4 + def test_deleting_resource_approval_relationships(self): + organisation = self.file.create_entity("IfcOrganization") + self.file.create_entity("IfcResourceApprovalRelationship", RelatedResourceObjects=[organisation]) + ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) + assert len(self.file.by_type("IfcResourceApprovalRelationship")) == 0 + + def test_deleting_resource_constraint_relationships(self): + organisation = self.file.create_entity("IfcOrganization") + self.file.create_entity("IfcResourceConstraintRelationship", RelatedResourceObjects=[organisation]) + ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) + assert len(self.file.by_type("IfcResourceConstraintRelationship")) == 0 + + def test_deleting_external_reference_relationships(self): + organisation = self.file.create_entity("IfcOrganization") + self.file.create_entity("IfcExternalReferenceRelationship", RelatedResourceObjects=[organisation]) + ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) + assert len(self.file.by_type("IfcExternalReferenceRelationship")) == 0 diff --git a/src/ifcopenshell-python/test/api/owner/test_remove_person.py b/src/ifcopenshell-python/test/api/owner/test_remove_person.py index 76d641a85f..0f4f6d55da 100644 --- a/src/ifcopenshell-python/test/api/owner/test_remove_person.py +++ b/src/ifcopenshell-python/test/api/owner/test_remove_person.py @@ -16,12 +16,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import pytest import test.bootstrap import ifcopenshell.api import ifcopenshell.guid -class TestRemovePerson(test.bootstrap.IFC4): +class TestRemovePersonIFC2X3(test.bootstrap.IFC2X3): def test_removing_a_person(self): person = self.file.createIfcPerson() ifcopenshell.api.run("owner.remove_person", self.file, person=person) @@ -87,20 +88,23 @@ class TestRemovePerson(test.bootstrap.IFC4): ifcopenshell.api.run("owner.remove_person", self.file, person=person) assert document_information.Editors is None + +class TestRemovePersonIFC4(test.bootstrap.IFC4, TestRemovePersonIFC2X3): + # IfcResourceLevelRelationships were added in IFC4 def test_deleting_resource_approval_relationships(self): - person = self.file.createIfcPerson() - self.file.createIfcResourceApprovalRelationship(RelatedResourceObjects=[person]) + person = self.file.create_entity("IfcPerson") + self.file.create_entity("IfcResourceApprovalRelationship", RelatedResourceObjects=[person]) ifcopenshell.api.run("owner.remove_person", self.file, person=person) assert len(self.file.by_type("IfcResourceApprovalRelationship")) == 0 def test_deleting_resource_constraint_relationships(self): - person = self.file.createIfcPerson() - self.file.createIfcResourceConstraintRelationship(RelatedResourceObjects=[person]) + person = self.file.create_entity("IfcPerson") + self.file.create_entity("IfcResourceConstraintRelationship", RelatedResourceObjects=[person]) ifcopenshell.api.run("owner.remove_person", self.file, person=person) assert len(self.file.by_type("IfcResourceConstraintRelationship")) == 0 def test_deleting_external_reference_relationships(self): - person = self.file.createIfcPerson() - self.file.createIfcExternalReferenceRelationship(RelatedResourceObjects=[person]) + person = self.file.create_entity("IfcPerson") + self.file.create_entity("IfcExternalReferenceRelationship", RelatedResourceObjects=[person]) ifcopenshell.api.run("owner.remove_person", self.file, person=person) assert len(self.file.by_type("IfcExternalReferenceRelationship")) == 0 diff --git a/src/ifcopenshell-python/test/api/owner/test_remove_person_and_organisation.py b/src/ifcopenshell-python/test/api/owner/test_remove_person_and_organisation.py index 0c2c8b53f8..4b0956b126 100644 --- a/src/ifcopenshell-python/test/api/owner/test_remove_person_and_organisation.py +++ b/src/ifcopenshell-python/test/api/owner/test_remove_person_and_organisation.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.guid -class TestRemovePersonAndOrganisation(test.bootstrap.IFC4): +class TestRemovePersonAndOrganisationIFC2X3(test.bootstrap.IFC2X3): def test_removing(self): user = self.file.createIfcPersonAndOrganization() ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=user) @@ -39,26 +39,29 @@ class TestRemovePersonAndOrganisation(test.bootstrap.IFC4): ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=user) assert document_information.Editors is None - def test_deleting_resource_approval_relationships(self): - user = self.file.createIfcPersonAndOrganization() - self.file.createIfcResourceApprovalRelationship(RelatedResourceObjects=[user]) - ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=user) - assert len(self.file.by_type("IfcResourceApprovalRelationship")) == 0 - - def test_deleting_resource_constraint_relationships(self): - user = self.file.createIfcPersonAndOrganization() - self.file.createIfcResourceConstraintRelationship(RelatedResourceObjects=[user]) - ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=user) - assert len(self.file.by_type("IfcResourceConstraintRelationship")) == 0 - - def test_deleting_external_reference_relationships(self): - user = self.file.createIfcPersonAndOrganization() - self.file.createIfcExternalReferenceRelationship(RelatedResourceObjects=[user]) - ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=user) - assert len(self.file.by_type("IfcExternalReferenceRelationship")) == 0 - def test_deleting_owner_history(self): user = self.file.createIfcPersonAndOrganization() self.file.createIfcOwnerHistory(OwningUser=user) ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=user) assert len(self.file.by_type("IfcOwnerHistory")) == 0 + + +class TestRemovePersonAndOrganisationIFC4(test.bootstrap.IFC4, TestRemovePersonAndOrganisationIFC2X3): + # IfcResourceLevelRelationships were added in IFC4 + def test_deleting_resource_approval_relationships(self): + user = self.file.create_entity("IfcPersonAndOrganization") + self.file.create_entity("IfcResourceApprovalRelationship", RelatedResourceObjects=[user]) + ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=user) + assert len(self.file.by_type("IfcResourceApprovalRelationship")) == 0 + + def test_deleting_resource_constraint_relationships(self): + user = self.file.create_entity("IfcPersonAndOrganization") + self.file.create_entity("IfcResourceConstraintRelationship", RelatedResourceObjects=[user]) + ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=user) + assert len(self.file.by_type("IfcResourceConstraintRelationship")) == 0 + + def test_deleting_external_reference_relationships(self): + user = self.file.create_entity("IfcPersonAndOrganization") + self.file.create_entity("IfcExternalReferenceRelationship", RelatedResourceObjects=[user]) + ifcopenshell.api.run("owner.remove_person_and_organisation", self.file, person_and_organisation=user) + assert len(self.file.by_type("IfcExternalReferenceRelationship")) == 0 diff --git a/src/ifcopenshell-python/test/api/owner/test_remove_role.py b/src/ifcopenshell-python/test/api/owner/test_remove_role.py index 9aae7324f2..110adbd9bf 100644 --- a/src/ifcopenshell-python/test/api/owner/test_remove_role.py +++ b/src/ifcopenshell-python/test/api/owner/test_remove_role.py @@ -20,7 +20,7 @@ import test.bootstrap import ifcopenshell.api -class TestRemoveRole(test.bootstrap.IFC4): +class TestRemoveRoleIFC2X3(test.bootstrap.IFC2X3): def test_removing_a_role(self): role = self.file.createIfcActorRole() ifcopenshell.api.run("owner.remove_role", self.file, role=role) @@ -47,20 +47,22 @@ class TestRemoveRole(test.bootstrap.IFC4): ifcopenshell.api.run("owner.remove_role", self.file, role=role) assert person_and_organisation.Roles is None + +class TestRemoveRoleIFC4(test.bootstrap.IFC4, TestRemoveRoleIFC2X3): def test_deleting_resource_approval_relationships(self): - organisation = self.file.createIfcOrganization() - self.file.createIfcResourceApprovalRelationship(RelatedResourceObjects=[organisation]) + organisation = self.file.create_entity("IfcOrganization") + self.file.create_entity("IfcResourceApprovalRelationship", RelatedResourceObjects=[organisation]) ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) assert len(self.file.by_type("IfcResourceApprovalRelationship")) == 0 def test_deleting_resource_constraint_relationships(self): - organisation = self.file.createIfcOrganization() - self.file.createIfcResourceConstraintRelationship(RelatedResourceObjects=[organisation]) + organisation = self.file.create_entity("IfcOrganization") + self.file.create_entity("IfcResourceConstraintRelationship", RelatedResourceObjects=[organisation]) ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) assert len(self.file.by_type("IfcResourceConstraintRelationship")) == 0 def test_deleting_external_reference_relationships(self): - organisation = self.file.createIfcOrganization() - self.file.createIfcExternalReferenceRelationship(RelatedResourceObjects=[organisation]) + organisation = self.file.create_entity("IfcOrganization") + self.file.create_entity("IfcExternalReferenceRelationship", RelatedResourceObjects=[organisation]) ifcopenshell.api.run("owner.remove_organisation", self.file, organisation=organisation) assert len(self.file.by_type("IfcExternalReferenceRelationship")) == 0 diff --git a/src/ifcopenshell-python/test/api/owner/test_unassign_actor.py b/src/ifcopenshell-python/test/api/owner/test_unassign_actor.py index c7e4e7c220..7f0b6f378f 100644 --- a/src/ifcopenshell-python/test/api/owner/test_unassign_actor.py +++ b/src/ifcopenshell-python/test/api/owner/test_unassign_actor.py @@ -27,3 +27,7 @@ class TestUnassignActor(test.bootstrap.IFC4): ifcopenshell.api.run("owner.assign_actor", self.file, relating_actor=actor, related_object=wall) ifcopenshell.api.run("owner.unassign_actor", self.file, relating_actor=actor, related_object=wall) assert len(self.file.by_type("IfcRelAssignsToActor")) == 0 + + +class TestUnassignActorIFC2X3(test.bootstrap.IFC2X3, TestUnassignActor): + pass diff --git a/src/ifcopenshell-python/test/api/owner/test_update_owner_history.py b/src/ifcopenshell-python/test/api/owner/test_update_owner_history.py index 3d2fa4aa83..107fb5a0ab 100644 --- a/src/ifcopenshell-python/test/api/owner/test_update_owner_history.py +++ b/src/ifcopenshell-python/test/api/owner/test_update_owner_history.py @@ -96,3 +96,7 @@ class TestUpdateOwnerHistory(test.bootstrap.IFC4): def test_doing_nothing_if_no_history_can_be_updated(self): person = self.file.createIfcPerson() assert ifcopenshell.api.run("owner.update_owner_history", self.file, element=person) == None + + +class TestUpdateOwnerHistoryIFC2X3(test.bootstrap.IFC2X3, TestUpdateOwnerHistory): + pass diff --git a/src/ifcopenshell-python/test/api/project/test_append_asset.py b/src/ifcopenshell-python/test/api/project/test_append_asset.py index 84444218d6..552c865fe4 100644 --- a/src/ifcopenshell-python/test/api/project/test_append_asset.py +++ b/src/ifcopenshell-python/test/api/project/test_append_asset.py @@ -21,9 +21,9 @@ import ifcopenshell.api import ifcopenshell.util.element -class TestAppendAsset(test.bootstrap.IFC4): +class TestAppendAssetIFC2X3(test.bootstrap.IFC2X3): def test_do_not_append_twice(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") material = ifcopenshell.api.run("material.add_material", library, name="Material") schedule = ifcopenshell.api.run("cost.add_cost_schedule", library, name="Schedule") @@ -40,13 +40,13 @@ class TestAppendAsset(test.bootstrap.IFC4): assert len(self.file.by_type("IfcWallType")) == 1 def test_append_a_type_product(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element) assert len(self.file.by_type("IfcWallType")) == 1 def test_reuse_an_existing_context_if_it_was_added_from_library_previously(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) project = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject") lib_context = ifcopenshell.api.run("context.add_context", library, context_type="Model") @@ -66,7 +66,7 @@ class TestAppendAsset(test.bootstrap.IFC4): assert context.WorldCoordinateSystem def test_append_a_single_type_product_even_though_an_inverse_material_relationship_is_shared(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") element2 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") material = ifcopenshell.api.run("material.add_material", library, name="Material") @@ -76,7 +76,7 @@ class TestAppendAsset(test.bootstrap.IFC4): assert len(self.file.by_type("IfcWallType")) == 1 def test_append_a_type_product_with_its_materials(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") material = ifcopenshell.api.run("material.add_material", library, name="Material") ifcopenshell.api.run("material.assign_material", library, products=[element], material=material) @@ -84,7 +84,7 @@ class TestAppendAsset(test.bootstrap.IFC4): assert self.file.by_type("IfcWallType")[0].HasAssociations[0].RelatingMaterial.Name == "Material" def test_append_a_type_product_where_its_inverse_material_relationship_refers_to_products_not_in_scope(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") element_type = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") element_type2 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") @@ -102,34 +102,11 @@ class TestAppendAsset(test.bootstrap.IFC4): ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element_type2) assert set(self.file.by_type("IfcWall")) == set() - def test_append_two_type_products_sharing_the_same_material_with_properties(self): - library = ifcopenshell.api.run("project.create_file") - element1 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") - element2 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") - material = ifcopenshell.api.run("material.add_material", library, name="Material") - - pset = ifcopenshell.api.run("pset.add_pset", library, product=material, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", library, pset=pset, properties={"Foo": "Bar"}) - - ifcopenshell.api.run("material.assign_material", library, products=[element1], material=material) - ifcopenshell.api.run("material.assign_material", library, products=[element2], material=material) - new1 = ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element1) - new2 = ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element2) - - assert len(self.file.by_type("IfcMaterialProperties")) == 1 - material = self.file.by_type("IfcMaterial")[0] - assert ifcopenshell.util.element.get_material(new1) == material - assert ifcopenshell.util.element.get_material(new2) == material - assert ifcopenshell.util.element.get_psets(material)["Foo_Bar"]["Foo"] == "Bar" - def test_append_two_type_products_sharing_the_same_material_indirectly_via_a_material_set(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element1 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") element2 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") - material = ifcopenshell.api.run("material.add_material", library, name="Material") - pset = ifcopenshell.api.run("pset.add_pset", library, product=material, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", library, pset=pset, properties={"Foo": "Bar"}) layer_set1 = ifcopenshell.api.run("material.add_material_set", library, set_type="IfcMaterialLayerSet") ifcopenshell.api.run("material.add_layer", library, layer_set=layer_set1, material=material) @@ -145,16 +122,14 @@ class TestAppendAsset(test.bootstrap.IFC4): new1 = ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element1) new2 = ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element2) - assert len(self.file.by_type("IfcMaterialProperties")) == 1 material = self.file.by_type("IfcMaterial")[0] assert ifcopenshell.util.element.get_material(new1).MaterialLayers[0].Material == material assert ifcopenshell.util.element.get_material(new1).MaterialLayers[1].Material == material assert ifcopenshell.util.element.get_material(new2).MaterialLayers[0].Material == material assert ifcopenshell.util.element.get_material(new2).MaterialLayers[1].Material == material - assert ifcopenshell.util.element.get_psets(material)["Foo_Bar"]["Foo"] == "Bar" def test_append_a_type_product_with_its_styles(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") history = library.createIfcOwnerHistory() element.OwnerHistory = history @@ -175,7 +150,7 @@ class TestAppendAsset(test.bootstrap.IFC4): assert self.file.by_type("IfcStyledItem")[0].Item == self.file.by_type("IfcBoundingBox")[0] def test_append_product_with_styles_to_reuse_styleditems(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element_type = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") history = library.createIfcOwnerHistory() element_type.OwnerHistory = history @@ -195,7 +170,7 @@ class TestAppendAsset(test.bootstrap.IFC4): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") local_context = ifcopenshell.api.run("context.add_context", self.file, context_type="Model") - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject") context = ifcopenshell.api.run("context.add_context", library, context_type="Model") @@ -210,7 +185,7 @@ class TestAppendAsset(test.bootstrap.IFC4): assert len(self.file.by_type("IfcGeometricRepresentationContext")) == 1 def test_append_a_material(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) material = ifcopenshell.api.run("material.add_material", library, name="Material") ifcopenshell.api.run("project.append_asset", self.file, library=library, element=material) assert len(self.file.by_type("IfcMaterial")) == 1 @@ -218,7 +193,7 @@ class TestAppendAsset(test.bootstrap.IFC4): def test_append_a_material_with_a_representation(self): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject") material = ifcopenshell.api.run("material.add_material", library, name="Material") style = ifcopenshell.api.run("style.add_style", library) @@ -234,7 +209,7 @@ class TestAppendAsset(test.bootstrap.IFC4): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") file_context = ifcopenshell.api.run("context.add_context", self.file, context_type="Model") - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject") material = ifcopenshell.api.run("material.add_material", library, name="Material") style = ifcopenshell.api.run("style.add_style", library) @@ -261,7 +236,7 @@ class TestAppendAsset(test.bootstrap.IFC4): target_view="MODEL_VIEW", ) - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject") material = ifcopenshell.api.run("material.add_material", library, name="Material") style = ifcopenshell.api.run("style.add_style", library) @@ -288,7 +263,7 @@ class TestAppendAsset(test.bootstrap.IFC4): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") file_context = ifcopenshell.api.run("context.add_context", self.file, context_type="Model") - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcProject") material = ifcopenshell.api.run("material.add_material", library, name="Material") style = ifcopenshell.api.run("style.add_style", library) @@ -312,48 +287,27 @@ class TestAppendAsset(test.bootstrap.IFC4): assert subcontext.TargetView == "MODEL_VIEW" assert subcontext.ParentContext == file_context - def test_append_a_cost_schedule(self): - library = ifcopenshell.api.run("project.create_file") - schedule = ifcopenshell.api.run("cost.add_cost_schedule", library, name="Schedule") - item = ifcopenshell.api.run("cost.add_cost_item", library, cost_schedule=schedule) - item2 = ifcopenshell.api.run("cost.add_cost_item", library, cost_item=item) - ifcopenshell.api.run("project.append_asset", self.file, library=library, element=schedule) - assert len(self.file.by_type("IfcCostSchedule")) == 1 - assert len(self.file.by_type("IfcCostItem")) == 2 - assert self.file.by_type("IfcCostSchedule")[0].Name == "Schedule" - appended_item = self.file.by_type("IfcCostSchedule")[0].Controls[0].RelatedObjects[0] - assert appended_item.is_a("IfcCostItem") - assert appended_item.IsNestedBy[0].RelatedObjects[0].is_a("IfcCostItem") - def test_append_a_profile_def(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) profile = library.createIfcIShapeProfileDef() ifcopenshell.api.run("project.append_asset", self.file, library=library, element=profile) assert len(self.file.by_type("IfcIShapeProfileDef")) == 1 - def test_append_a_profile_def_with_all_properties(self): - library = ifcopenshell.api.run("project.create_file") - profile = library.createIfcIShapeProfileDef() - ifcopenshell.api.run("pset.add_pset", library, product=profile, name="Foo_Bar") - ifcopenshell.api.run("project.append_asset", self.file, library=library, element=profile) - assert len(self.file.by_type("IfcIShapeProfileDef")) == 1 - assert self.file.by_type("IfcIShapeProfileDef")[0].HasProperties[0].Name == "Foo_Bar" - def test_append_a_product(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element) assert len(self.file.by_type("IfcWall")) == 1 def test_append_a_product_with_all_properties(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") ifcopenshell.api.run("pset.add_pset", library, product=element, name="Foo_Bar") ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element) assert ifcopenshell.util.element.get_psets(self.file.by_type("IfcWall")[0])["Foo_Bar"] def test_append_a_product_with_its_type(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") element_type = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") ifcopenshell.api.run("type.assign_type", library, related_objects=[element], relating_type=element_type) @@ -361,7 +315,7 @@ class TestAppendAsset(test.bootstrap.IFC4): assert ifcopenshell.util.element.get_type(self.file.by_type("IfcWall")[0]).is_a("IfcWallType") def test_append_only_specified_occurrences_of_a_typed_product(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") element2 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") element3 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") @@ -375,7 +329,7 @@ class TestAppendAsset(test.bootstrap.IFC4): assert len(self.file.by_type("IfcWall")) == 2 def test_append_a_product_with_materials(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") material = ifcopenshell.api.run("material.add_material", library, name="Material") ifcopenshell.api.run("material.assign_material", library, products=[element], material=material) @@ -383,7 +337,7 @@ class TestAppendAsset(test.bootstrap.IFC4): assert ifcopenshell.util.element.get_material(self.file.by_type("IfcWall")[0]).Name == "Material" def test_append_a_product_where_its_inverse_material_relationship_refers_to_product_types_not_in_scope(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") element_type = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") element_type2 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") @@ -396,7 +350,7 @@ class TestAppendAsset(test.bootstrap.IFC4): assert [e.GlobalId for e in self.file.by_type("IfcWallType")] == [element_type.GlobalId] def test_append_a_product_with_its_styles(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") item = library.createIfcBoundingBox() library.createIfcStyledItem(Item=item) @@ -406,7 +360,7 @@ class TestAppendAsset(test.bootstrap.IFC4): assert self.file.by_type("IfcStyledItem")[0].Item == self.file.by_type("IfcBoundingBox")[0] def test_append_a_product_with_openings(self): - library = ifcopenshell.api.run("project.create_file") + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") opening = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcOpeningElement") ifcopenshell.api.run("void.add_opening", library, opening=opening, element=element) @@ -414,25 +368,50 @@ class TestAppendAsset(test.bootstrap.IFC4): assert self.file.by_type("IfcWall")[0].HasOpenings[0].RelatedOpeningElement.is_a("IfcOpeningElement") -class TestAppendAssetIFC2X3(test.bootstrap.IFC2X3): - def test_append_a_product_with_its_type(self): - library = ifcopenshell.api.run("project.create_file", version="IFC2X3") - element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") - element_type = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") - ifcopenshell.api.run("type.assign_type", library, related_objects=[element], relating_type=element_type) - ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element) - assert ifcopenshell.util.element.get_type(self.file.by_type("IfcWall")[0]).is_a("IfcWallType") +class TestAppendAssetIFC4(test.bootstrap.IFC4, TestAppendAssetIFC2X3): + # NOTE: breaks in IFC2X3 since IfcProfileDef doesn't have "HasProperties" inverse in ifc2x3 + # and we use it in whitelisted_inverse_attributes for appending IfcProfileDef + def test_append_a_profile_def_with_all_properties(self): + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) + profile = library.createIfcIShapeProfileDef() + ifcopenshell.api.run("pset.add_pset", library, product=profile, name="Foo_Bar") + ifcopenshell.api.run("project.append_asset", self.file, library=library, element=profile) + assert len(self.file.by_type("IfcIShapeProfileDef")) == 1 + assert self.file.by_type("IfcIShapeProfileDef")[0].HasProperties[0].Name == "Foo_Bar" - def test_append_only_specified_occurrences_of_a_typed_product(self): - library = ifcopenshell.api.run("project.create_file", version="IFC2X3") - element = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") - element2 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") - element3 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWall") - element_type = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") - ifcopenshell.api.run("type.assign_type", library, related_objects=[element], relating_type=element_type) - ifcopenshell.api.run("type.assign_type", library, related_objects=[element2], relating_type=element_type) - ifcopenshell.api.run("type.assign_type", library, related_objects=[element3], relating_type=element_type) - ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element) - ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element2) - assert len(ifcopenshell.util.element.get_types(self.file.by_type("IfcWallType")[0])) == 2 - assert len(self.file.by_type("IfcWall")) == 2 + # NOTE: breaks in IFC2X3 since IfcMaterial doesn't have "HasProperties" inverse in ifc2x3 + # and we use it in whitelisted_inverse_attributes for appending IfcTypeProduct + def test_append_two_type_products_sharing_the_same_material_with_properties(self): + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) + element1 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") + element2 = ifcopenshell.api.run("root.create_entity", library, ifc_class="IfcWallType") + material = ifcopenshell.api.run("material.add_material", library, name="Material") + + pset = ifcopenshell.api.run("pset.add_pset", library, product=material, name="Foo_Bar") + ifcopenshell.api.run("pset.edit_pset", library, pset=pset, properties={"Foo": "Bar"}) + + ifcopenshell.api.run("material.assign_material", library, products=[element1], material=material) + ifcopenshell.api.run("material.assign_material", library, products=[element2], material=material) + new1 = ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element1) + new2 = ifcopenshell.api.run("project.append_asset", self.file, library=library, element=element2) + + assert len(self.file.by_type("IfcMaterialProperties")) == 1 + material = self.file.by_type("IfcMaterial")[0] + assert ifcopenshell.util.element.get_material(new1) == material + assert ifcopenshell.util.element.get_material(new2) == material + assert ifcopenshell.util.element.get_psets(material)["Foo_Bar"]["Foo"] == "Bar" + + # NOTE: breaks in IFC2X3 since IfcCostItem doesn't have "IsNestedBy" inverse in ifc2x3 + # and we use it in whitelisted_inverse_attributes for appending IfcCostSchedule + def test_append_a_cost_schedule(self): + library = ifcopenshell.api.run("project.create_file", version=self.file.schema) + schedule = ifcopenshell.api.run("cost.add_cost_schedule", library, name="Schedule") + item = ifcopenshell.api.run("cost.add_cost_item", library, cost_schedule=schedule) + item2 = ifcopenshell.api.run("cost.add_cost_item", library, cost_item=item) + ifcopenshell.api.run("project.append_asset", self.file, library=library, element=schedule) + assert len(self.file.by_type("IfcCostSchedule")) == 1 + assert len(self.file.by_type("IfcCostItem")) == 2 + assert self.file.by_type("IfcCostSchedule")[0].Name == "Schedule" + appended_item = self.file.by_type("IfcCostSchedule")[0].Controls[0].RelatedObjects[0] + assert appended_item.is_a("IfcCostItem") + assert appended_item.IsNestedBy[0].RelatedObjects[0].is_a("IfcCostItem") From da1bdc802da0ad29299596ec4a1aeacbd93bc950 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 14 May 2024 16:16:09 +1000 Subject: [PATCH 177/429] Accommodate invalid models coming from Cadwork --- src/blenderbim/blenderbim/bim/import_ifc.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 7af955b97d..9318328dd3 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -608,7 +608,8 @@ class IfcImporter: threshold = 10000 # Just from experience. - faces = [len(e.CfsFaces) for e in self.file.by_type("IfcClosedShell")] + # The check for CfsFaces/Faces/CoordIndex accommodates invalid data from Cadwork + faces = [len(e.CfsFaces) for e in self.file.by_type("IfcClosedShell") if e.CfsFaces] if faces and max(faces) > threshold: self.ifc_import_settings.should_use_native_meshes = True return @@ -616,12 +617,12 @@ class IfcImporter: if self.file.schema == "IFC2X3": return - faces = [len(e.Faces) for e in self.file.by_type("IfcPolygonalFaceSet")] + faces = [len(e.Faces) for e in self.file.by_type("IfcPolygonalFaceSet") if e.Faces] if faces and max(faces) > threshold: self.ifc_import_settings.should_use_native_meshes = True return - faces = [len(e.CoordIndex) for e in self.file.by_type("IfcTriangulatedFaceSet")] + faces = [len(e.CoordIndex) for e in self.file.by_type("IfcTriangulatedFaceSet") if e.CoordIndex] if faces and max(faces) > threshold: self.ifc_import_settings.should_use_native_meshes = True From c50149ad874c48acd0070ab1868d13aefb8a9a01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Mon, 13 May 2024 16:01:13 -0300 Subject: [PATCH 178/429] added 'product' parameter to a few usages of 'pset.remove_pset' after ebd03e9 --- src/blenderbim/blenderbim/bim/module/aggregate/operator.py | 2 +- src/blenderbim/blenderbim/bim/module/geometry/operator.py | 2 +- src/blenderbim/blenderbim/bim/module/model/door.py | 2 +- src/blenderbim/blenderbim/bim/module/model/railing.py | 2 +- src/blenderbim/blenderbim/bim/module/model/roof.py | 2 +- src/blenderbim/blenderbim/bim/module/model/stair.py | 2 +- src/blenderbim/blenderbim/bim/module/model/window.py | 2 +- src/blenderbim/blenderbim/tool/model.py | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index db4c1232cd..b53ab75a10 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -100,7 +100,7 @@ class BIM_OT_aggregate_unassign_object(bpy.types.Operator, Operator): pset = ifcopenshell.util.element.get_pset(element, 'BBIM_Linked_Aggregate') if pset: pset = tool.Ifc.get().by_id(pset["id"]) - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=element, pset=pset) class BIM_OT_enable_editing_aggregate(bpy.types.Operator, Operator): diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 6a3909539a..ad207685e1 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -938,7 +938,7 @@ class OverrideDuplicateMove(bpy.types.Operator): pset = ifcopenshell.util.element.get_pset(new[0], "BBIM_Linked_Aggregate") if pset: pset = tool.Ifc.get().by_id(pset["id"]) - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=new[0],pset=pset) if new[0].is_a("IfcElementAssembly"): linked_aggregate_group = [ diff --git a/src/blenderbim/blenderbim/bim/module/model/door.py b/src/blenderbim/blenderbim/bim/module/model/door.py index 7cc7936cde..1bda53682b 100644 --- a/src/blenderbim/blenderbim/bim/module/model/door.py +++ b/src/blenderbim/blenderbim/bim/module/model/door.py @@ -644,6 +644,6 @@ class RemoveDoor(bpy.types.Operator, tool.Ifc.Operator): obj.BIMDoorProperties.is_editing = False pset = tool.Pset.get_element_pset(element, "BBIM_Door") - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=element, pset=pset) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/model/railing.py b/src/blenderbim/blenderbim/bim/module/model/railing.py index fff6099297..9887e8eb71 100644 --- a/src/blenderbim/blenderbim/bim/module/model/railing.py +++ b/src/blenderbim/blenderbim/bim/module/model/railing.py @@ -535,5 +535,5 @@ class RemoveRailing(bpy.types.Operator, tool.Ifc.Operator): obj.BIMRailingProperties.is_editing = False pset = tool.Pset.get_element_pset(element, "BBIM_Railing") - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=element, pset=pset) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/model/roof.py b/src/blenderbim/blenderbim/bim/module/model/roof.py index 53b9d6dce3..9e7344b75b 100644 --- a/src/blenderbim/blenderbim/bim/module/model/roof.py +++ b/src/blenderbim/blenderbim/bim/module/model/roof.py @@ -757,7 +757,7 @@ class RemoveRoof(bpy.types.Operator, tool.Ifc.Operator): obj.BIMRoofProperties.is_editing = False pset = tool.Pset.get_element_pset(element, "BBIM_Roof") - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=element, pset=pset) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/model/stair.py b/src/blenderbim/blenderbim/bim/module/model/stair.py index 52a5d847c0..af34428d44 100644 --- a/src/blenderbim/blenderbim/bim/module/model/stair.py +++ b/src/blenderbim/blenderbim/bim/module/model/stair.py @@ -337,6 +337,6 @@ class RemoveStair(bpy.types.Operator, tool.Ifc.Operator): obj.BIMStairProperties.is_editing = False pset = tool.Pset.get_element_pset(element, "BBIM_Stair") - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=element, pset=pset) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/model/window.py b/src/blenderbim/blenderbim/bim/module/model/window.py index 0843b20fe4..f2d7a17c4d 100644 --- a/src/blenderbim/blenderbim/bim/module/model/window.py +++ b/src/blenderbim/blenderbim/bim/module/model/window.py @@ -590,6 +590,6 @@ class RemoveWindow(bpy.types.Operator, tool.Ifc.Operator): obj.BIMWindowProperties.is_editing = False pset = tool.Pset.get_element_pset(element, "BBIM_Window") - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=element, pset=pset) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/tool/model.py b/src/blenderbim/blenderbim/tool/model.py index 32c2856389..4025d37d39 100644 --- a/src/blenderbim/blenderbim/tool/model.py +++ b/src/blenderbim/blenderbim/tool/model.py @@ -551,7 +551,7 @@ class Model(blenderbim.core.tool.Model): data = tool.Ifc.get().createIfcText(json.dumps(data)) ifcopenshell.api.run("pset.edit_pset", tool.Ifc.get(), pset=pset, properties={"Data": data}) else: - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), pset=pset) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=element, pset=pset) @classmethod def get_flow_segment_axis(cls, obj): From 2fa30be0d0669dc655bde66e93692c6faeec7463 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 14 May 2024 15:43:19 +0500 Subject: [PATCH 179/429] small optimization for da1bdc802 On large projects predict dense mesh stage can take 20s+ and reusing attribute value can save up to half of this time. Using indices also helps but it's not that significant and sometimes it's the same time as using attribute names. --- src/blenderbim/blenderbim/bim/import_ifc.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 9318328dd3..81f20c809e 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -609,7 +609,8 @@ class IfcImporter: threshold = 10000 # Just from experience. # The check for CfsFaces/Faces/CoordIndex accommodates invalid data from Cadwork - faces = [len(e.CfsFaces) for e in self.file.by_type("IfcClosedShell") if e.CfsFaces] + # 0 IfcClosedShell.CfsFaces + faces = [len(faces) for e in self.file.by_type("IfcClosedShell") if (faces := e[0])] if faces and max(faces) > threshold: self.ifc_import_settings.should_use_native_meshes = True return @@ -617,12 +618,14 @@ class IfcImporter: if self.file.schema == "IFC2X3": return - faces = [len(e.Faces) for e in self.file.by_type("IfcPolygonalFaceSet") if e.Faces] + # 2 IfcPolygonalFaceSet.Faces + faces = [len(faces) for e in self.file.by_type("IfcPolygonalFaceSet") if (faces := e[2])] if faces and max(faces) > threshold: self.ifc_import_settings.should_use_native_meshes = True return - faces = [len(e.CoordIndex) for e in self.file.by_type("IfcTriangulatedFaceSet") if e.CoordIndex] + # 3 IfcTriangulatedFaceSet.CoordIndex + faces = [len(index) for e in self.file.by_type("IfcTriangulatedFaceSet") if (index := e[3])] if faces and max(faces) > threshold: self.ifc_import_settings.should_use_native_meshes = True From bb8e84e5ec89baf49fafdbcbcdf6acb1e2df4acc Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 15 May 2024 10:55:29 +0500 Subject: [PATCH 180/429] typing --- .../blenderbim/bim/module/search/operator.py | 1 + .../boundary/assign_connection_geometry.py | 1 - .../ifcopenshell/api/context/add_context.py | 13 +- .../ifcopenshell/api/context/edit_context.py | 9 +- .../api/cost/add_cost_schedule.py | 4 +- .../api/document/edit_information.py | 8 +- .../api/document/edit_reference.py | 8 +- .../api/geometry/add_axis_representation.py | 7 +- .../ifcopenshell/api/geometry/add_boolean.py | 50 +++- .../api/geometry/add_door_representation.py | 267 +++++++++++++----- .../geometry/add_footprint_representation.py | 14 +- .../api/geometry/add_mesh_representation.py | 45 ++- .../geometry/add_profile_representation.py | 34 ++- .../geometry/add_railing_representation.py | 100 +++++-- .../api/geometry/add_representation.py | 76 +++-- .../api/geometry/add_slab_representation.py | 28 +- .../api/geometry/add_wall_representation.py | 40 ++- .../api/geometry/add_window_representation.py | 258 +++++++++++++---- .../api/geometry/assign_representation.py | 8 +- .../api/geometry/connect_element.py | 16 +- .../ifcopenshell/api/geometry/connect_path.py | 22 +- .../api/geometry/create_2pt_wall.py | 12 +- .../api/geometry/disconnect_element.py | 33 +-- .../api/geometry/disconnect_path.py | 39 +-- .../api/geometry/edit_object_placement.py | 4 +- .../api/geometry/map_representation.py | 11 +- .../api/geometry/remove_boolean.py | 6 +- .../api/geometry/unassign_representation.py | 8 +- .../api/georeference/add_georeferencing.py | 4 +- .../api/georeference/edit_georeferencing.py | 16 +- .../api/georeference/remove_georeferencing.py | 4 +- .../api/grid/create_axis_curve.py | 7 +- .../ifcopenshell/api/grid/create_grid_axis.py | 24 +- .../ifcopenshell/api/grid/remove_grid_axis.py | 13 +- .../ifcopenshell/api/group/add_group.py | 5 +- .../ifcopenshell/api/group/edit_group.py | 8 +- .../ifcopenshell/api/group/remove_group.py | 2 +- .../api/group/update_group_products.py | 4 +- .../ifcopenshell/api/library/add_library.py | 2 +- .../api/material/edit_profile_usage.py | 4 +- .../api/sequence/assign_product.py | 2 +- .../api/sequence/edit_work_schedule.py | 2 +- .../api/sequence/remove_work_plan.py | 2 +- .../api/style/add_surface_textures.py | 2 +- src/ifcopenshell-python/ifcopenshell/file.py | 4 +- .../ifcopenshell/util/element.py | 2 +- .../ifcopenshell/util/shape_builder.py | 158 +++++++---- .../test/api/pset/test_remove_pset.py | 1 + 48 files changed, 978 insertions(+), 410 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index 1c22ea0f01..9865e7cd28 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -20,6 +20,7 @@ import re import bpy import json import ifcopenshell +import ifcopenshell.api import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.selector diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py index 90994d8499..a5693324e4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/assign_connection_geometry.py @@ -89,7 +89,6 @@ def assign_connection_geometry( usecase.axis = axis usecase.ref_direction = ref_direction usecase.unit_scale = unit_scale - usecase.ifc_vertices = [] return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py index 95a0929ab6..38c79d20f2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py @@ -16,8 +16,17 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional -def add_context(file, context_type=None, context_identifier=None, target_view=None, parent=None) -> None: + +def add_context( + file: ifcopenshell.file, + context_type: str, + context_identifier: Optional[str] = None, + target_view: Optional[str] = None, + parent: Optional[ifcopenshell.entity_instance] = None, +) -> ifcopenshell.entity_instance: """Adds a new geometric representation context In IFC, physical objects may have zero, one, or multiple geometric @@ -104,7 +113,7 @@ def add_context(file, context_type=None, context_identifier=None, target_view=No :type parent: ifcopenshell.entity_instance, optional :return: the newly created IfcGeometricRepresentationContext or IfcGeometricRepresentationSubContext entity - :rtype: ifcopenshell.entity_instance, optional + :rtype: ifcopenshell.entity_instance Example: diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py index 30f6d642b1..5bef4c9956 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/edit_context.py @@ -16,8 +16,11 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_context(file, context, attributes) -> None: + +def edit_context(file: ifcopenshell.file, context: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcGeometricRepresentationContext For more information about the attributes and data types of an @@ -26,7 +29,7 @@ def edit_context(file, context, attributes) -> None: :param context: The IfcGeometricRepresentationContext entity you want to edit :type context: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -44,7 +47,7 @@ def edit_context(file, context, attributes) -> None: ifcopenshell.api.run("context.edit_context", model, context=body, attributes={"ContextIdentifier": "Body"}) """ - settings = {"context": context, "attributes": attributes or {}} + settings = {"context": context, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["context"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py index 65c95ca0d1..cb8e678420 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_schedule.py @@ -22,7 +22,9 @@ from datetime import datetime from typing import Optional -def add_cost_schedule(file: ifcopenshell.file, name: Optional[str] = None, predefined_type="NOTDEFINED") -> None: +def add_cost_schedule( + file: ifcopenshell.file, name: Optional[str] = None, predefined_type: str = "NOTDEFINED" +) -> ifcopenshell.entity_instance: """Add a new cost schedule A cost schedule is a group of cost items which typically represent a diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py b/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py index 478c1c11da..0c9ef1cce0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/edit_information.py @@ -16,13 +16,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . import ifcopenshell -from typing import Any, Optional +from typing import Any def edit_information( file: ifcopenshell.file, information: ifcopenshell.entity_instance, - attributes: Optional[dict[str, Any]] = None, + attributes: dict[str, Any], ) -> None: """Edits the attributes of an IfcDocumentInformation @@ -32,7 +32,7 @@ def edit_information( :param reference: The IfcDocumentInformation entity you want to edit :type reference: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -46,7 +46,7 @@ def edit_information( attributes={"Identification": "A-GA-6100", "Name": "Overall Plan", "Location": "A-GA-6100 - Overall Plan.pdf"}) """ - settings = {"information": information, "attributes": attributes or {}} + settings = {"information": information, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["information"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py b/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py index fb705fbbc2..3ba210cef1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/edit_reference.py @@ -16,13 +16,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . import ifcopenshell -from typing import Any, Optional +from typing import Any def edit_reference( file: ifcopenshell.file, reference: ifcopenshell.entity_instance, - attributes: Optional[dict[str, Any]] = None, + attributes: dict[str, Any], ) -> None: """Edits the attributes of an IfcDocumentReference @@ -32,7 +32,7 @@ def edit_reference( :param reference: The IfcDocumentReference entity you want to edit :type reference: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -49,7 +49,7 @@ def edit_reference( ifcopenshell.api.run("document.edit_reference", model, reference=reference, attributes={"Identification": "2.1.15"}) """ - settings = {"reference": reference, "attributes": attributes or {}} + settings = {"reference": reference, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["reference"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py index d8180d287f..0c78866ccc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_axis_representation.py @@ -17,9 +17,14 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.unit +from typing import Union + +COORD = Union[tuple[float, float], tuple[float, float, float]] -def add_axis_representation(file, context=None, axis=None) -> None: +def add_axis_representation( + file: ifcopenshell.file, context: ifcopenshell.entity_instance, axis: tuple[COORD, COORD] +) -> ifcopenshell.entity_instance: """Adds a new axis representation Certain objects are typically "axis-based", such as walls, beams, diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py index 3ec590a6f3..026e118805 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_boolean.py @@ -16,27 +16,51 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +from __future__ import annotations import ifcopenshell.util.unit import numpy as np +import numpy.typing as npt +from typing import Optional, TYPE_CHECKING, Literal + +if TYPE_CHECKING: + import bpy.types -def add_boolean(file, **usecase_settings) -> None: +NPArrayOfFloats = npt.NDArray[np.float64] + + +def add_boolean( + file: ifcopenshell.file, + representation: ifcopenshell.entity_instance, + # A matrix to define a clipping Ifchalfspacesolid. + # The XY plane is the clipping boundary and +Z is removed. + operator: str = "DIFFERENCE", + # IfcHalfSpaceSolid, Mesh + type: Literal["IfcHalfSpaceSolid", "Mesh"] = "IfcHalfSpaceSolid", + matrix: Optional[NPArrayOfFloats] = None, + # A Blender OBJ to define the voided OBJ for a "Mesh" type + blender_obj: Optional[bpy.types.Object] = None, + # A Blender OBJ to define the void OBJ for a "Mesh" type + blender_void: Optional[bpy.types.Object] = None, + should_force_faceted_brep: bool = False, + should_force_triangulation: bool = False, +) -> list[ifcopenshell.entity_instance]: + """For `type` values: + - "IfcHalfSpaceSolid" - `matrix` is not optional. + - "Mesh" - `blender_obj` and `blender_void` are not optional + """ usecase = Usecase() usecase.file = file usecase.settings = { - "representation": None, - "operator": "DIFFERENCE", - # IfcHalfSpaceSolid, Mesh - "type": "IfcHalfSpaceSolid", - # The XY plane is the clipping boundary and +Z is removed. - "matrix": None, # A matrix to define a clipping Ifchalfspacesolid. - "blender_obj": None, # A Blender OBJ to define the voided OBJ for a "Mesh" type - "blender_void": None, # A Blender OBJ to define the void OBJ for a "Mesh" type - "should_force_faceted_brep": False, - "should_force_triangulation": False, + "representation": representation, + "operator": operator, + "type": type, + "matrix": matrix, + "blender_obj": blender_obj, + "blender_void": blender_void, + "should_force_faceted_brep": should_force_faceted_brep, + "should_force_triangulation": should_force_triangulation, } - for key, value in usecase_settings.items(): - usecase.settings[key] = value return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py index da7678aac4..73feca9326 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py @@ -16,13 +16,15 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +from __future__ import annotations +import collections.abc import ifcopenshell.util.unit from ifcopenshell.util.shape_builder import ShapeBuilder, V from ifcopenshell.api.geometry.add_window_representation import create_ifc_window from mathutils import Vector from math import cos, radians - -import collections +from typing import Any, Optional, Literal, Union +import dataclasses SUPPORTED_DOOR_TYPES = ( @@ -38,9 +40,14 @@ SUPPORTED_DOOR_TYPES = ( ) +def mm(x: float) -> float: + """mm to meters shortcut for readability""" + return x / 1000 + + def create_ifc_door_lining( builder: ShapeBuilder, size: Vector, thickness: list, position: Vector = V(0, 0, 0).freeze() -): +) -> ifcopenshell.entity_instance: """`thickness` of the profile is defined as list in the following order: `(SIDE, TOP)` `thickness` can be also defined just as 1 float value. @@ -69,80 +76,212 @@ def create_ifc_door_lining( return door_lining -def create_ifc_box(builder: ShapeBuilder, size: Vector, position: Vector = V(0, 0, 0).freeze()): +def create_ifc_box( + builder: ShapeBuilder, size: Vector, position: Vector = V(0, 0, 0).freeze() +) -> ifcopenshell.entity_instance: rect = builder.rectangle(size.xy) box = builder.extrude(rect, size.z, position=position, extrusion_vector=V(0, 0, 1)) return box -def add_door_representation(file, **usecase_settings) -> None: - """units in usecase_settings expected to be in ifc project units""" +# we use dataclass as we need default values for arguments +# it's okay to use slots since we don't need dynamic attributes +@dataclasses.dataclass(slots=True) +class DoorLiningProperties: + LiningDepth: Optional[float] = None + """Optional, defaults to 50mm.""" + + LiningThickness: Optional[float] = None + """Optional, defaults to 50mm.""" + + LiningOffset: Optional[float] = None + """Offset from the outer side of the wall (by Y-axis). Optional, defaults to 0.0.""" + + LiningToPanelOffsetX: Optional[float] = None + """Offset from the wall. Optional, defaults to 25mm.""" + + LiningToPanelOffsetY: Optional[float] = None + """Offset from the X-axis (unlike windows). Optional, defaults to 25mm.""" + + TransomThickness: Optional[float] = None + """Vertical distance between door and window panels. Optional, defaults to 0.0.""" + + TransomOffset: Optional[float] = None + """Distance from the bottom door opening + to the beginning of the transom + unlike windows TransomOffset which goes to the center of the transom. + Optional, defaults 1.525m.""" + + ShapeAspectStyle: None = None + """Optional. Deprecated argument.""" + + CasingDepth: Optional[float] = None + """Casing cover wall faces around the opening + on the left, right and upper sides + Casing should be either on both sides of the wall or no casing + If `LiningOffset` is present then therefore casing is not possible on outer wall + therefore there will be no casing on inner wall either. Optional, defaults to 5mm.""" + + CasingThickness: Optional[float] = None + """Casing thickness by Z-axis. Optional, defaults to 75mm.""" + + ThresholdDepth: Optional[float] = None + """Threshold covers the bottom side of the opening. Optional, defaults to 100mm.""" + + ThresholdThickness: Optional[float] = None + """Theshold thickness by Z-axis. Optional, defaults to 25mm.""" + + ThresholdOffset: Optional[float] = None + """Threshold offset by Y-axis. Optional, defaults to 0.0.""" + + def initialize_properties(self, unit_scale: float) -> None: + # in meters + # fmt: off + default_values: dict[str, float] = dict( + LiningDepth = mm(50), + LiningThickness = mm(50), + LiningOffset = 0.0, + LiningToPanelOffsetX = mm(25), + LiningToPanelOffsetY = mm(25), + TransomThickness = 0.0, + TransomOffset = mm(1525), + CasingDepth = mm(5), + CasingThickness = mm(75), + ThresholdDepth = mm(100), + ThresholdThickness = mm(25), + ThresholdOffset = 0.0, + ) + # fmt: on + + si_conversion = 1 / unit_scale + for attr, default_value in default_values.items(): + if getattr(self, attr) is not None: + continue + setattr(self, attr, default_value * si_conversion) + + +@dataclasses.dataclass(slots=True) +class DoorPanelProperties: + PanelDepth: Optional[float] = None + """Frame thickness by Y axis. Optional, defaults to 35 mm.""" + + PanelWidth: float = 1.0 + """Ratio to the clear door opening. Optional, defaults to 1.0.""" + + FrameDepth: Optional[float] = None + """Frame thickness by Y axis. Optional, defaults to 35 mm.""" + + FrameThickness: Optional[float] = None + """Frame thickness by X axis. Optional, defaults to 35 mm.""" + + PanelPosition: None = None + """Optional, value is never used""" + + PanelOperation: None = None + """Optional, value is never used. + Defines the basic ways to describe how door panels operate.""" + + ShapeAspectStyle: None = None + """Optional. Deprecated argument.""" + + def initialize_properties(self, unit_scale: float) -> None: + # in meters + # fmt: off + default_values: dict[str, float] = dict( + PanelDepth = mm(35), + FrameDepth = mm(35), + FrameThickness = mm(35), + ) + # fmt: on + + si_conversion = 1 / unit_scale + for attr, default_value in default_values.items(): + if getattr(self, attr) is not None: + continue + setattr(self, attr, default_value * si_conversion) + + +def add_door_representation( + file: ifcopenshell.file, + *, # keywords only as this API implementation is probably not final + context: ifcopenshell.entity_instance, + overall_height: Optional[float] = None, + overall_width: Optional[float] = None, + # door type + # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoorTypeOperationEnum.htm + operation_type: Literal[ + "SINGLE_SWING_LEFT", + "SINGLE_SWING_RIGHT", + "DOUBLE_SWING_RIGHT", + "DOUBLE_SWING_LEFT", + "DOUBLE_DOOR_SINGLE_SWING", + "DOUBLE_DOOR_DOUBLE_SWING", + "SLIDING_TO_LEFT", + "SLIDING_TO_RIGHT", + "DOUBLE_DOOR_SLIDING", + ] = "SINGLE_SWING_LEFT", + lining_properties: Optional[Union[DoorLiningProperties, dict[str, Any]]] = None, + panel_properties: Optional[Union[DoorPanelProperties, dict[str, Any]]] = None, + unit_scale: Optional[float] = None, +) -> ifcopenshell.entity_instance: + """units in usecase_settings expected to be in ifc project units + + :param context: IfcGeometricRepresentationContext for the representation. + :type context: ifcopenshell.entity_instance + :param overall_height: Overall door height. Defaults to 2m. + :type overall_height: float, optional + :param overall_width: Overall door width. Defaults to 0.9m. + :type overall_width: float, optional + :param operation_type: Type of the door. Defaults to SINGLE_SWING_LEFT. + :type operation_type: str, optional + :param lining_properties: DoorLiningProperties or a dictionary to create one. + See DoorLiningProperties description for details. + :type lining_properties: Union[DoorLiningProperties, dict[str, Any]]] + :param panel_properties: DoorPanelProperties or a dictionary to create one. + See DoorPanelProperties description for details. + :type panel_properties: Union[DoorPanelProperties, dict[str, Any]]] + :param unit_scale: The unit scale as calculated by + ifcopenshell.util.unit.calculate_unit_scale. If not provided, it + will be automatically calculated for you. + :type unit_scale: float, optional + :return: IfcShapeRepresentation for a door. + :rtype: ifcopenshell.entity_instance + + """ usecase = Usecase() usecase.file = file # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoor.htm - # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoorTypeOperationEnum.htm # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoorLiningProperties.htm # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcDoorPanelProperties.htm - usecase.settings = {"unit_scale": ifcopenshell.util.unit.calculate_unit_scale(usecase.file)} - usecase.settings.update( + # define unit_scale first as it's going to be used setting default arguments + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(file) if unit_scale is None else unit_scale + settings: dict[str, Any] = {"unit_scale": unit_scale} + + if lining_properties is None: + lining_properties = DoorLiningProperties() + elif not isinstance(lining_properties, DoorLiningProperties): + lining_properties = DoorLiningProperties(**lining_properties) + lining_properties.initialize_properties(unit_scale) + lining_properties = dataclasses.asdict(lining_properties) + + if panel_properties is None: + panel_properties = DoorPanelProperties() + elif not isinstance(panel_properties, DoorPanelProperties): + panel_properties = DoorPanelProperties(**panel_properties) + panel_properties.initialize_properties(unit_scale) + panel_properties = dataclasses.asdict(panel_properties) + + settings.update( { - "context": None, # IfcGeometricRepresentationContext - "overall_height": usecase.convert_si_to_unit(2.0), - "overall_width": usecase.convert_si_to_unit(0.9), - # DOUBLE_DOOR_DOUBLE_SWING, DOUBLE_DOOR_FOLDING, DOUBLE_DOOR_LIFTING_VERTICAL, - # DOUBLE_DOOR_SINGLE_SWING, DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT, - # DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT, DOUBLE_DOOR_SLIDING, - # DOUBLE_SWING_LEFT, DOUBLE_SWING_RIGHT, FOLDING_TO_LEFT, - # FOLDING_TO_RIGHT, LIFTING_HORIZONTAL, LIFTING_VERTICAL_LEFT, - # LIFTING_VERTICAL_RIGHT, REVOLVING, REVOLVING_VERTICAL, - # ROLLINGUP, SINGLE_SWING_LEFT, SINGLE_SWING_RIGHT, SLIDING_TO_LEFT, - # SLIDING_TO_RIGHT, SWING_FIXED_LEFT, SWING_FIXED_RIGHT - "operation_type": "SINGLE_SWING_LEFT", # door type - "lining_properties": { - "LiningDepth": usecase.convert_si_to_unit(0.050), - "LiningThickness": usecase.convert_si_to_unit(0.050), - # offset from the outer side of the wall (by Y-axis) - "LiningOffset": usecase.convert_si_to_unit(0.0), - # offset from the wall - "LiningToPanelOffsetX": usecase.convert_si_to_unit(0.025), - # offset from the X-axis (unlike windows) - "LiningToPanelOffsetY": usecase.convert_si_to_unit(0.025), - # transom - vertical distance between door and window panels - "TransomThickness": usecase.convert_si_to_unit(0.000), - # TransomOffset - distance from the bottom door opening - # to the beginning of the transom - # unlike windows TransomOffset which goes to the center of the transom - "TransomOffset": usecase.convert_si_to_unit(1.525), - "ShapeAspectStyle": None, # DEPRECATED - # Casing cover wall faces around the opening - # on the left, right and upper sides - # Casing should be either on both sides of the wall or no casing - # If `LiningOffset` is present then therefore casing is not possible on outer wall - # therefore there will be no casing on inner wall either - "CasingDepth": usecase.convert_si_to_unit(0.005), - "CasingThickness": usecase.convert_si_to_unit(0.075), # by Z-axis - # Threshold covers the bottom side of the opening - "ThresholdDepth": usecase.convert_si_to_unit(0.1), - "ThresholdThickness": usecase.convert_si_to_unit(0.025), # by Z-axis - # offset by Y-axis - "ThresholdOffset": usecase.convert_si_to_unit(0.000), - }, - "panel_properties": { - "PanelDepth": usecase.convert_si_to_unit(0.035), # by Y - "PanelWidth": 1.0, # as ratio to the clear door opening - "FrameDepth": usecase.convert_si_to_unit(0.035), # by Y - "FrameThickness": usecase.convert_si_to_unit(0.035), # by X - # LEFT, MIDDLE, RIGHT, NOTDEFINED - "PanelPosition": ..., # NEVER USED - # defines the basic ways to describe how door panels operate - # basically how it opens - "PanelOperation": None, # NEVER USED - "ShapeAspectStyle": None, # DEPRECATED - }, + "context": context, + "overall_height": overall_height if overall_height is not None else usecase.convert_si_to_unit(2.0), + "overall_width": overall_width if overall_width is not None else usecase.convert_si_to_unit(0.9), + "operation_type": operation_type, + "lining_properties": lining_properties, + "panel_properties": panel_properties, } ) - for key, value in usecase_settings.items(): - usecase.settings[key] = value + usecase.settings = settings return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_footprint_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_footprint_representation.py index 976b48e5ce..6b48845e4e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_footprint_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_footprint_representation.py @@ -19,13 +19,17 @@ import ifcopenshell.util.unit -def add_footprint_representation(file, **usecase_settings) -> None: +def add_footprint_representation( + file, + # IfcGeometricRepresentationContext + context: ifcopenshell.entity_instance, + # A list of IFC curves to include in the curve set + curves: list[ifcopenshell.entity_instance], +) -> ifcopenshell.entity_instance: settings = { - "context": None, # IfcGeometricRepresentationContext - "curves": [], # A list of IFC curves to include in the curve set + "context": context, + "curves": curves, } - for key, value in usecase_settings.items(): - settings[key] = value return file.createIfcShapeRepresentation( settings["context"], diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_mesh_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_mesh_representation.py index fbe42063d9..e26c5c39b8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_mesh_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_mesh_representation.py @@ -17,26 +17,43 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.unit +from typing import Optional + +COORD_3D = tuple[float, float, float] -def add_mesh_representation(file: ifcopenshell.file, **usecase_settings) -> None: +def add_mesh_representation( + file: ifcopenshell.file, + # IfcGeometricRepresentationContext + context: ifcopenshell.entity_instance, + # Vertices, edges, and faces are given in the form of: [item1, item2, item3, ...] + # A list of coordinates + # ... where itemN = [(0., 0., 0.), (1., 1., 1.), (x, y, z), ...] + vertices: list[COORD_3D], + # A list of edges, represented by vertex index pairs + # ... where itemN = [(0, 1), (1, 2), (v1, v2), ...] + edges: list[tuple[int, int]], + # A list of polygons, represented by vertex indices + # ... where itemN = [(0, 1, 2), (5, 4, 2, 3), (v1, v2, v3, ... vN), ...] + faces: list[list[int]], + # Optionally apply a vector offset to all coordinates + cooridnate_offset: Optional[COORD_3D] = None, + # A scale factor to apply for all vectors in case the unit is different + unit_scale: Optional[float] = None, + # Force using IfcFacetedBreps instead of IfcPolygonalFaceSets + force_faceted_brep: bool = False, +) -> ifcopenshell.entity_instance: usecase = Usecase() usecase.file = file usecase.settings = { - "context": None, # IfcGeometricRepresentationContext - # Vertices, edges, and faces are given in the form of: [item1, item2, item3, ...] - # ... where itemN = [(0., 0., 0.), (1., 1., 1.), (x, y, z), ...] - "vertices": None, # A list of coordinates - # ... where itemN = [(0, 1), (1, 2), (v1, v2), ...] - "edges": None, # A list of edges, represented by vertex index pairs - # ... where itemN = [(0, 1, 2), (5, 4, 2, 3), (v1, v2, v3, ... vN), ...] - "faces": None, # A list of polygons, represented by vertex indices - "coordinate_offset": None, # Optionally apply a vector offset to all coordinates - "unit_scale": None, # A scale factor to apply for all vectors in case the unit is different - "force_faceted_brep": False, # Force using IfcFacetedBreps instead of IfcPolygonalFaceSets + "context": context, + "vertices": vertices, + "edges": edges, + "faces": faces, + "coordinate_offset": cooridnate_offset, + "unit_scale": unit_scale, + "force_faceted_brep": force_faceted_brep, } - for key, value in usecase_settings.items(): - usecase.settings[key] = value return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_profile_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_profile_representation.py index 025f09f0fc..18dffbc6b3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_profile_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_profile_representation.py @@ -19,23 +19,35 @@ import ifcopenshell.geom import ifcopenshell.util.unit from ifcopenshell.util.data import Clipping +from typing import Any, Union, Optional, Literal + +VECTOR_3D = tuple[float, float, float] -def add_profile_representation(file, **usecase_settings) -> None: +def add_profile_representation( + file: ifcopenshell.file, + # IfcGeometricRepresentationContext + context: ifcopenshell.entity_instance, + profile: ifcopenshell.entity_instance, + # in meters + depth: float = 1.0, + cardinal_point: Literal[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] = 5, + # A list of planes that define clipping half space solids + # Planes are defined either by Clipping objects + # or by dictionaries of arguments for `Clipping.parse` + clippings: Optional[list[Union[Clipping, dict[str, Any]]]] = None, + placement_zx_axes: tuple[Union[VECTOR_3D, None], Union[VECTOR_3D, None]] = (None, None), +) -> None: usecase = Usecase() usecase.file = file usecase.settings = { - "context": None, # IfcGeometricRepresentationContext - "profile": None, - "depth": 1.0, - "cardinal_point": 5, - # Planes are defined either by Clipping objects - # or by dictionaries of arguments for `Clipping.parse` - "clippings": [], # A list of planes that define clipping half space solids - "placement_zx_axes": (None, None), + "context": context, + "profile": profile, + "depth": depth, + "cardinal_point": cardinal_point, + "clippings": clippings if clippings is not None else [], + "placement_zx_axes": placement_zx_axes, } - for key, value in usecase_settings.items(): - usecase.settings[key] = value return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_railing_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_railing_representation.py index 9de884c8c2..b6dc8653d8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_railing_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_railing_representation.py @@ -22,46 +22,100 @@ from itertools import chain from mathutils import Vector, Matrix import collections import mathutils -from pprint import pprint from math import pi, cos, sin, tan, radians +from typing import Literal, Optional, Any -def mm(x): +def mm(x: float) -> float: """mm to meters shortcut for readability""" return x / 1000 -def add_railing_representation(file, **usecase_settings) -> None: +def add_railing_representation( + file: ifcopenshell.file, + *, # keywords only as this API implementation is probably not final + # IfcGeometricRepresentationContext + context: ifcopenshell.entity_instance, + railing_type: Literal["WALL_MOUNTED_HANDRAIL"] = "WALL_MOUNTED_HANDRAIL", + railing_path: list[Vector], + use_manual_supports: bool = False, + support_spacing: Optional[float] = None, + railing_diameter: Optional[float] = None, + clear_width: Optional[float] = None, + terminal_type: Literal[ + "180", + "TO_END_POST", + "TO_WALL", + "TO_FLOOR", + "TO_END_POST_AND_FLOOR", + ] = "180", + height: Optional[float] = None, + looped_path: bool = False, + unit_scale: Optional[float] = None, +) -> ifcopenshell.entity_instance: """ - units in usecase_settings expected to be in ifc project units + Units are expected to be in IFC project units. - `railing_path` is a list of point coordinates for the railing path, - coordinates are expected to be at the top of the railing, not at the center + :param context: IfcGeometricRepresentationContext for the representation. + :type context: ifcopenshell.entity_instance + :param railing_type: Type of the railing. Defaults to "WALL_MOUNTED_HANDRAIL". + :type railing_type: Literal["WALL_MOUNTED_HANDRAIL"], optional + :param railing_path: A list of points coordinates for the railing path, + coordinates are expected to be at the top of the railing, not at the center. + If not provided, default path [(0, 0, 1), (1, 0, 1), (2, 0, 1)] (in meters) will be used + :type railing_path: list[Vector], optional. + :param use_manual_supports: If enabled, supports are added on every vertex on the edges of the railing path. + If disabled, supports are added automatically based on the support spacing. Default to False. + :type use_manual_supports: bool, optional + :param support_spacing: Distance between supports if automatic supports are used. Defaults to 1m. + :type support_spacing: float, optional + :param railing_diameter: Railing diameter. Defaults to 50mm. + :type railing_diameter: float, optional + :param clear_width: Clear width between the railing and the wall. Defaults to 40mm. + :type clear_width: float, optional + :param terminal_type: type of the cap. Defaults to "180". + :type terminal_type: Literal["180","TO_END_POST","TO_WALL","TO_FLOOR","TO_END_POST_AND_FLOOR"], optional + :param height: defaults to 1m + :type height: float, optional + :param looped_path: Whether to end the railing on the first point of `railing_path`. Defaults to False. + :type looped_path: bool, optional + :param unit_scale: The unit scale as calculated by + ifcopenshell.util.unit.calculate_unit_scale. If not provided, it + will be automatically calculated for you. + :type unit_scale: float, optional + :return: IfcShapeRepresentation for a railing. + :rtype: ifcopenshell.entity_instance - `railing_path` is expected to be a list of Vector objects """ usecase = Usecase() usecase.file = file - usecase.settings = {"unit_scale": ifcopenshell.util.unit.calculate_unit_scale(usecase.file)} - usecase.settings.update( + # define unit_scale first as it's going to be used setting default arguments + settings: dict[str, Any] = { + "unit_scale": ifcopenshell.util.unit.calculate_unit_scale(file) if unit_scale is None else unit_scale, + } + settings.update( { - "context": None, # IfcGeometricRepresentationContext - "railing_type": "WALL_MOUNTED_HANDRAIL", - "railing_path": usecase.path_si_to_units([V(0, 0, 1), V(1, 0, 1), V(2, 0, 1)]), - "use_manual_supports": False, - "support_spacing": usecase.convert_si_to_unit(mm(1000)), - "railing_diameter": usecase.convert_si_to_unit(mm(50)), - "clear_width": usecase.convert_si_to_unit(mm(40)), - "terminal_type": "180", - "height": usecase.convert_si_to_unit(mm(1000)), - "looped_path": False, + "context": context, + "railing_type": railing_path, + "railing_path": ( + railing_path + if railing_path is not None + else usecase.path_si_to_units([V(0, 0, 1), V(1, 0, 1), V(2, 0, 1)]) + ), + "use_manual_supports": use_manual_supports, + "support_spacing": support_spacing if support_spacing is not None else usecase.convert_si_to_unit(mm(1000)), + "railing_diameter": ( + railing_diameter if railing_diameter is not None else usecase.convert_si_to_unit(mm(50)) + ), + "clear_width": clear_width if clear_width is not None else usecase.convert_si_to_unit(mm(40)), + "terminal_type": terminal_type, + "height": height if height is not None else usecase.convert_si_to_unit(mm(1000)), + "looped_path": looped_path, } ) + usecase.settings = settings - for key, value in usecase_settings.items(): - usecase.settings[key] = value - - if usecase.settings["railing_type"] != "WALL_MOUNTED_HANDRAIL": + if railing_type != "WALL_MOUNTED_HANDRAIL": raise Exception('Only "WALL_MOUNTED_HANDRAIL" railing_type is supported at the moment.') return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index aa98a15f3c..9693e46340 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -16,11 +16,12 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . from __future__ import annotations -import bpy +import bpy.types import math import bmesh import ifcopenshell.util.unit from mathutils import Vector, Matrix +from typing import Union, Optional, Literal Z_AXIS = Vector((0, 0, 1)) @@ -28,7 +29,44 @@ X_AXIS = Vector((1, 0, 0)) EPSILON = 1e-6 -def add_representation(file: ifcopenshell.file, **usecase_settings) -> ifcopenshell.entity_instance: +def add_representation( + file: ifcopenshell.file, + *, # keywords only as this API implementation is probably not final + # IfcGeometricRepresentationContext + context: ifcopenshell.entity_instance, + # This is (currently) a Blender object, hence this depends on Blender now + blender_object: bpy.types.Object, + # This is (currently) a Blender data object, hence this depends on Blender now + geometry: Union[bpy.types.Mesh, bpy.types.Curve], + # Optionally apply a vector offset to all coordinates + coordinate_offset: Optional[Vector] = None, + # How many representation items to create + total_items: int = 1, + # A scale factor to apply for all vectors in case the unit is different + unit_scale: Optional[float] = None, + # If we should force faceted breps for meshes + should_force_faceted_brep: bool = False, + # If we should force triangulation for meshes + should_force_triangulation: bool = False, + # If UV coordinates should also be generated + should_generate_uvs: bool = False, + # Whether to cast a mesh into a particular class + ifc_representation_class: Optional[ + Literal[ + "IfcExtrudedAreaSolid/IfcRectangleProfileDef", + "IfcExtrudedAreaSolid/IfcCircleProfileDef", + "IfcExtrudedAreaSolid/IfcArbitraryClosedProfileDef", + "IfcExtrudedAreaSolid/IfcArbitraryProfileDefWithVoids", + "IfcExtrudedAreaSolid/IfcMaterialProfileSetUsage", + "IfcGeometricCurveSet/IfcTextLiteral", + "IfcTextLiteral", + ] + ] = None, + # The material profile set if the extrusion requires it + profile_set_usage: Optional[ifcopenshell.entity_instance] = None, + # The text literal if the representation requires it + text_literal: Optional[ifcopenshell.entity_instance] = None, +) -> ifcopenshell.entity_instance: # lazy import Helper to avoid circular import if "Helper" not in globals(): from blenderbim.bim.module.geometry.helper import Helper @@ -37,30 +75,20 @@ def add_representation(file: ifcopenshell.file, **usecase_settings) -> ifcopensh # TODO: This usecase currently depends on Blender's data model usecase.file = file usecase.settings = { - "context": None, # IfcGeometricRepresentationContext - "blender_object": None, # This is (currently) a Blender object, hence this depends on Blender now - "geometry": None, # This is (currently) a Blender data object, hence this depends on Blender now - "coordinate_offset": None, # Optionally apply a vector offset to all coordinates - "total_items": 1, # How many representation items to create - "unit_scale": None, # A scale factor to apply for all vectors in case the unit is different - "should_force_faceted_brep": False, # If we should force faceted breps for meshes - "should_force_triangulation": False, # If we should force triangulation for meshes - "should_generate_uvs": False, # If UV coordinates should also be generated - # Possible IFC representation classes: - # IfcExtrudedAreaSolid/IfcRectangleProfileDef - # IfcExtrudedAreaSolid/IfcCircleProfileDef - # IfcExtrudedAreaSolid/IfcArbitraryClosedProfileDef - # IfcExtrudedAreaSolid/IfcArbitraryProfileDefWithVoids - # IfcExtrudedAreaSolid/IfcMaterialProfileSetUsage - # IfcGeometricCurveSet/IfcTextLiteral - # IfcTextLiteral - "ifc_representation_class": None, # Whether to cast a mesh into a particular class - "profile_set_usage": None, # The material profile set if the extrusion requires it - "text_literal": None, # The text literal if the representation requires it + "context": context, + "blender_object": blender_object, + "geometry": geometry, + "coordinate_offset": coordinate_offset, + "total_items": total_items, + "unit_scale": unit_scale, + "should_force_faceted_brep": should_force_faceted_brep, + "should_force_triangulation": should_force_triangulation, + "should_generate_uvs": should_generate_uvs, + "ifc_representation_class": ifc_representation_class, + "profile_set_usage": profile_set_usage, + "text_literal": text_literal, } usecase.ifc_vertices = [] - for key, value in usecase_settings.items(): - usecase.settings[key] = value return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py index 7514ade38f..5a46ba0f49 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_slab_representation.py @@ -17,22 +17,32 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.unit +from ifcopenshell.util.data import Clipping from math import sin, cos +from typing import Any, Optional, Union -def add_slab_representation(file, **usecase_settings) -> None: +def add_slab_representation( + file, + # IfcGeometricRepresentationContext + context: ifcopenshell.entity_instance, + # in meters + depth: float = 0.2, + # in radians + x_angle: float = 0.0, + # A list of planes that define clipping half space solids + # Planes are defined either by Clipping objects + # or by dictionaries of arguments for `Clipping.parse` + clippings: Optional[list[Union[Clipping, dict[str, Any]]]] = None, +) -> ifcopenshell.entity_instance: usecase = Usecase() usecase.file = file usecase.settings = { - "context": None, # IfcGeometricRepresentationContext - "depth": 0.2, - "x_angle": 0, # Radians - # Planes are defined either by Clipping objects - # or by dictionaries of arguments for `Clipping.parse` - "clippings": [], # A list of planes that define clipping half space solids + "context": context, + "depth": depth, + "x_angle": x_angle, + "clippings": clippings if clippings is not None else [], } - for key, value in usecase_settings.items(): - usecase.settings[key] = value return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py index 504a89078b..945400fcfa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_wall_representation.py @@ -18,27 +18,39 @@ import ifcopenshell.util.unit from math import sin, cos +from typing import Optional, Union, Any from ifcopenshell.util.data import Clipping -def add_wall_representation(file, **usecase_settings) -> None: +def add_wall_representation( + file: ifcopenshell.file, + context: ifcopenshell.entity_instance, # IfcGeometricRepresentationContext + # all lengths are in meters + length: float = 1.0, + height: float = 3.0, + offset: float = 0.0, + thickness: float = 0.2, + # Sloped walls along the wall's X axis, provided in radians + x_angle: float = 0.0, + # A list of planes that define clipping half space solids + # Planes are defined either by Clipping objects + # or by dictionaries of arguments for `Clipping.parse` + clippings: Optional[list[Union[Clipping, dict[str, Any]]]] = None, + # Any existing IfcBooleanResults + booleans: Optional[list[ifcopenshell.entity_instance]] = None, +) -> ifcopenshell.entity_instance: usecase = Usecase() usecase.file = file usecase.settings = { - "context": None, # IfcGeometricRepresentationContext - "length": 1.0, - "height": 3.0, - "offset": 0.0, - "thickness": 0.2, - # Sloped walls along the wall's X axis, provided in radians - "x_angle": 0, - # Planes are defined either by Clipping objects - # or by dictionaries of arguments for `Clipping.parse` - "clippings": [], # A list of planes that define clipping half space solids - "booleans": [], # Any existing IfcBooleanResults + "context": context, + "length": length, + "height": height, + "offset": offset, + "thickness": thickness, + "x_angle": x_angle, + "clippings": clippings if clippings is not None else [], + "booleans": booleans if booleans is not None else [], } - for key, value in usecase_settings.items(): - usecase.settings[key] = value return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_window_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_window_representation.py index b0a46e69ab..73a9c255a2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_window_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_window_representation.py @@ -16,11 +16,14 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +from __future__ import annotations +import collections.abc import ifcopenshell.util.unit from ifcopenshell.util.shape_builder import ShapeBuilder, V from itertools import chain from mathutils import Vector -import collections +import dataclasses +from typing import Any, Optional, Literal, Union # SCHEMAS describe panels setup @@ -42,6 +45,11 @@ DEFAULT_PANEL_SCHEMAS = { } +def mm(x: float) -> float: + """mm to meters shortcut for readability""" + return x / 1000 + + def create_ifc_window_frame_simple( builder: ShapeBuilder, size: Vector, thickness: list, position: Vector = V(0, 0, 0).freeze() ): @@ -210,71 +218,209 @@ def create_ifc_window( return output_items -def add_window_representation(file, **usecase_settings) -> None: - """units in usecase_settings expected to be in ifc project units""" +# we use dataclass as we need default values for arguments +# it's okay to use slots since we don't need dynamic attributes +@dataclasses.dataclass(slots=True) +class WindowLiningProperties: + LiningDepth: Optional[float] = None + """Optional, defaults to 50mm.""" + + LiningThickness: Optional[float] = None + """Optional, defaults to 50mm.""" + + LiningOffset: Optional[float] = None + """Offset to the wall. Optional, defaults to 50mm.""" + + LiningToPanelOffsetX: Optional[float] = None + """Offset from the wall. Optional, defaults to 25mm.""" + + # that way it allows you to define overall_depth constant between all panels + # and still have panels with different size: + # overall_depth = lining_depth + offset_y + # full offset from X axis = overall_depth - frame_depth. + LiningToPanelOffsetY: Optional[float] = None + """Offset from the lining. Optional, defaults to 25mm.""" + + MullionThickness: Optional[float] = None + """Mullion thickness (horizontal distance between panels). + + Applies to windows of types: DoublePanelVertical, TriplePanelBottom, TriplePanelTop, + TriplePanelLeft, TriplePanelRight. + + Optional, defaults to 50mm.""" + + FirstMullionOffset: Optional[float] = None + """Distance from the first lining to the mullion center. Optional, defaults to 300mm.""" + + SecondMullionOffset: Optional[float] = None + """Distance from the first lining to the second mullion center. + + Applies to windows of type: TriplePanelVertical. + + Optional, defaults to 450mm.""" + + TransomThickness: Optional[float] = None + """Transom thickness (vertical distance between panels), works similar way to mullions. + + Applies to windows of types:DoublePanelHorizontal, TriplePanelBottom, TriplePanelTop, + TriplePanelLeft, TriplePanelRight. + + Optional, defaults to 50mm.""" + + FirstTransomOffset: Optional[float] = None + """Optional, defaults to 300mm.""" + + SecondTransomOffset: Optional[float] = None + """ + Applies to windows of type: TriplePanelHorizontal. + Optional, defaults to 600mm.""" + + ShapeAspectStyle: None = None + """Optional. Deprecated argument.""" + + def initialize_properties(self, unit_scale: float) -> None: + # in meters + # fmt: off + default_values: dict[str, float] = dict( + LiningDepth = mm(50), + LiningThickness = mm(50), + LiningOffset = mm(50), + LiningToPanelOffsetX = mm(25), + LiningToPanelOffsetY = mm(25), + MullionThickness = mm(50), + FirstMullionOffset = mm(300), + SecondMullionOffset = mm(450), + TransomThickness = mm(50), + FirstTransomOffset = mm(300), + SecondTransomOffset = mm(600), + ) + # fmt: on + + si_conversion = 1 / unit_scale + for attr, default_value in default_values.items(): + if getattr(self, attr) is not None: + continue + setattr(self, attr, default_value * si_conversion) + + +@dataclasses.dataclass(slots=True) +class WindowPanelProperties: + FrameDepth: Optional[float] = None + """Frame thickness by Y axis. Optional, defaults to 35 mm.""" + + FrameThickness: Optional[float] = None + """Frame thickness by X axis. Optional, defaults to 35 mm.""" + + PanelPosition: None = None + """Optional, value is never used""" + + PanelOperation: None = None + """Optional, value is never used. + Defines the basic ways to describe how window panels operate.""" + + ShapeAspectStyle: None = None + """Optional. Deprecated argument.""" + + def initialize_properties(self, unit_scale: float) -> None: + # in meters + # fmt: off + default_values: dict[str, float] = dict( + FrameDepth = mm(35), + FrameThickness = mm(35), + ) + # fmt: on + + si_conversion = 1 / unit_scale + for attr, default_value in default_values.items(): + if getattr(self, attr) is not None: + continue + setattr(self, attr, default_value * si_conversion) + + +def add_window_representation( + file: ifcopenshell.file, + *, # keywords only as this API implementation is probably not final + context: ifcopenshell.entity_instance, + overall_height: Optional[float] = None, + overall_width: Optional[float] = None, + partition_type: Literal[ + "SINGLE_PANEL", + "DOUBLE_PANEL_HORIZONTAL", + "DOUBLE_PANEL_VERTICAL", + "TRIPLE_PANEL_BOTTOM", + "TRIPLE_PANEL_HORIZONTAL", + "TRIPLE_PANEL_LEFT", + "TRIPLE_PANEL_RIGHT", + "TRIPLE_PANEL_TOP", + "TRIPLE_PANEL_VERTICAL", + ] = "SINGLE_PANEL", + lining_properties: Optional[Union[WindowLiningProperties, dict[str, Any]]] = None, + panel_properties: Optional[list[Union[WindowPanelProperties, dict[str, Any]]]] = None, + unit_scale: Optional[float] = None, +) -> ifcopenshell.entity_instance: + """units in usecase_settings expected to be in ifc project units + + :param context: IfcGeometricRepresentationContext for the representation. + :type context: ifcopenshell.entity_instance + :param overall_height: Overall window height. Defaults to 0.9m. + :type overall_height: float, optional + :param overall_width: Overall window width. Defaults to 0.6m. + :type overall_width: float, optional + :param partition_type: Type of the window. Defaults to SINGLE_PANEL. + :type partition_type: str, optional + :param lining_properties: WindowLiningProperties or a dictionary to create one. + See WindowLiningProperties description for details. + :type lining_properties: Union[WindowLiningProperties, dict[str, Any]]] + :param panel_properties: A list of WindowPanelProperties or dictionaries to create one. + See WindowPanelProperties description for details. + :type panel_properties: list[Union[WindowPanelProperties, dict[str, Any]]]] + :param unit_scale: The unit scale as calculated by + ifcopenshell.util.unit.calculate_unit_scale. If not provided, it + will be automatically calculated for you. + :type unit_scale: float, optional + :return: IfcShapeRepresentation for a window. + :rtype: ifcopenshell.entity_instance + + """ usecase = Usecase() usecase.file = file # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindow.htm # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindowTypePartitioningEnum.htm # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindowLiningProperties.htm # http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWindowPanelProperties.htm - usecase.settings = {"unit_scale": ifcopenshell.util.unit.calculate_unit_scale(usecase.file)} - usecase.settings.update( + # define unit_scale first as it's going to be used setting default arguments + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(file) if unit_scale is None else unit_scale + settings: dict[str, Any] = {"unit_scale": unit_scale} + + if lining_properties is None: + lining_properties = WindowLiningProperties() + elif not isinstance(lining_properties, WindowLiningProperties): + lining_properties = WindowLiningProperties(**lining_properties) + lining_properties.initialize_properties(unit_scale) + lining_properties = dataclasses.asdict(lining_properties) + + if panel_properties is None: + panel_properties = [WindowPanelProperties()] + + for i in range(len(panel_properties)): + properties = panel_properties[i] + if not isinstance(properties, WindowPanelProperties): + properties = WindowPanelProperties(**properties) + properties.initialize_properties(unit_scale) + panel_properties[i] = dataclasses.asdict(properties) + + settings.update( { - "context": None, # IfcGeometricRepresentationContext - # SINGLE_PANEL, DOUBLE_PANEL_HORIZONTAL, DOUBLE_PANEL_VERTICAL, - # TRIPLE_PANEL_BOTTOM, TRIPLE_PANEL_HORIZONTAL, TRIPLE_PANEL_LEFT, - # TRIPLE_PANEL_RIGHT, TRIPLE_PANEL_TOP, TRIPLE_PANEL_VERTICAL - "partition_type": "SINGLE_PANEL", - "overall_height": usecase.convert_si_to_unit(0.9), - "overall_width": usecase.convert_si_to_unit(0.6), - "lining_properties": { - "LiningDepth": usecase.convert_si_to_unit(0.050), - "LiningThickness": usecase.convert_si_to_unit(0.050), - "LiningOffset": usecase.convert_si_to_unit(0.050), # offset to the wall - # offset from the wall - "LiningToPanelOffsetX": usecase.convert_si_to_unit(0.025), - # offset from the lining - # that way it allows you to define overall_depth constant between all panels - # and still have panels with different size: - # overall_depth = lining_depth + offset_y - # full offset from X axis = overall_depth - frame_depth - "LiningToPanelOffsetY": usecase.convert_si_to_unit(0.025), - # applies to DoublePanelVertical, TriplePanelBottom, TriplePanelTop, - # TriplePanelLeft, TriplePanelRight - # mullion - horizontal distance between panels - "MullionThickness": usecase.convert_si_to_unit(0.050), - # distance from the first lining to the mullion center - "FirstMullionOffset": usecase.convert_si_to_unit(0.3), - # applies to TriplePanelVertical - # distance from the first lining to the second mullion center - "SecondMullionOffset": usecase.convert_si_to_unit(0.45), - # applies to DoublePanelHorizontal, TriplePanelBottom, TriplePanelTop, - # TriplePanelLeft, TriplePanelRight - # works similar way to mullion - "TransomThickness": usecase.convert_si_to_unit(0.050), - "FirstTransomOffset": usecase.convert_si_to_unit(0.3), - # applies to TriplePanelHorizontal - "SecondTransomOffset": usecase.convert_si_to_unit(0.6), - "ShapeAspectStyle": None, # DEPRECATED - }, - "panel_properties": [ - { - "FrameDepth": usecase.convert_si_to_unit(0.035), # by Y - "FrameThickness": usecase.convert_si_to_unit(0.035), # by X - # BOTTOM, LEFT, MIDDLE, RIGHT, TOP - "PanelPosition": ..., # NEVER USED - # defines the basic ways to describe how window panels operate - # how it's hanged, how it opens - "OperationType": None, # NEVER USED - "ShapeAspectStyle": None, # DEPRECATED - }, - ], + "context": context, + "overall_height": overall_height if overall_height is not None else usecase.convert_si_to_unit(0.9), + "overall_width": overall_width if overall_width is not None else usecase.convert_si_to_unit(0.6), + "partition_type": partition_type, + "lining_properties": lining_properties, + "panel_properties": panel_properties, } ) - for key, value in usecase_settings.items(): - usecase.settings[key] = value + usecase.settings = settings usecase.settings["panel_schema"] = DEFAULT_PANEL_SCHEMAS[usecase.settings["partition_type"]] return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py index 1df964d845..c89c6fd819 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/assign_representation.py @@ -20,12 +20,12 @@ import ifcopenshell.api import ifcopenshell.util.element -def assign_representation(file, **usecase_settings) -> None: +def assign_representation( + file: ifcopenshell.file, product: ifcopenshell.entity_instance, representation: ifcopenshell.entity_instance +) -> None: usecase = Usecase() usecase.file = file - usecase.settings = {"product": None, "representation": None} - for key, value in usecase_settings.items(): - usecase.settings[key] = value + usecase.settings = {"product": product, "representation": representation} return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py index d86e2bbca3..87d0149407 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_element.py @@ -20,16 +20,20 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.guid import ifcopenshell.util.element +from typing import Optional -def connect_element(file, **usecase_settings) -> None: +def connect_element( + file: ifcopenshell.file, + relating_element: ifcopenshell.entity_instance, + related_element: ifcopenshell.entity_instance, + description: Optional[str] = None, +) -> ifcopenshell.entity_instance: settings = { - "relating_element": None, - "related_element": None, - "description": None, + "relating_element": relating_element, + "related_element": related_element, + "description": description, } - for key, value in usecase_settings.items(): - settings[key] = value incompatible_connections = [] diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py index bab818ee64..9e18ca0f18 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/connect_path.py @@ -20,18 +20,24 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.guid import ifcopenshell.util.element +from typing import Optional -def connect_path(file, **usecase_settings) -> None: +def connect_path( + file: ifcopenshell.file, + relating_element: ifcopenshell.entity_instance, + related_element: ifcopenshell.entity_instance, + relating_connection: str = "NOTDEFINED", + related_connection: str = "NOTDEFINED", + description: Optional[str] = None, +) -> ifcopenshell.entity_instance: settings = { - "relating_element": None, - "related_element": None, - "relating_connection": "NOTDEFINED", - "related_connection": "NOTDEFINED", - "description": None, + "relating_element": relating_element, + "related_element": related_element, + "relating_connection": relating_connection, + "related_connection": related_connection, + "description": description, } - for key, value in usecase_settings.items(): - settings[key] = value incompatible_connections = [] for rel in settings["relating_element"].ConnectedTo: diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/create_2pt_wall.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/create_2pt_wall.py index cd508d4a3e..74c487b47e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/create_2pt_wall.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/create_2pt_wall.py @@ -22,8 +22,16 @@ import ifcopenshell.util.unit def create_2pt_wall( - file, element=None, context=None, p1=None, p2=None, elevation=None, height=None, thickness=None, is_si=True -) -> None: + file: ifcopenshell.file, + element: ifcopenshell.entity_instance, + context: ifcopenshell.entity_instance, + p1: tuple[float, float], + p2: tuple[float, float], + elevation: float, + height: float, + thickness: float, + is_si: bool = True, +) -> ifcopenshell.entity_instance: usecase = Usecase() usecase.file = file usecase.settings = { diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_element.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_element.py index 1e1eaaa82b..666d3d35b4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_element.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_element.py @@ -20,30 +20,31 @@ import ifcopenshell import ifcopenshell.util.element -def disconnect_element(file, **usecase_settings) -> None: - settings = { - "relating_element": None, - "related_element": None, - } - for key, value in usecase_settings.items(): - settings[key] = value - +def disconnect_element( + file: ifcopenshell.file, + relating_element: ifcopenshell.entity_instance, + related_element: ifcopenshell.entity_instance, +) -> None: + # TODO: arguments relating_element, related_element probably + # should be renamed to element1, element2 + # as api call doesn't really treat them as "relating" and "related" + # and just purging all connections between them incompatible_connections = [] - for rel in settings["relating_element"].ConnectedTo: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == settings["related_element"]: + for rel in relating_element.ConnectedTo: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == related_element: incompatible_connections.append(rel) - for rel in settings["relating_element"].ConnectedFrom: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatingElement == settings["related_element"]: + for rel in relating_element.ConnectedFrom: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatingElement == related_element: incompatible_connections.append(rel) - for rel in settings["related_element"].ConnectedTo: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == settings["relating_element"]: + for rel in related_element.ConnectedTo: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatedElement == relating_element: incompatible_connections.append(rel) - for rel in settings["related_element"].ConnectedFrom: - if rel.is_a() == "IfcRelConnectsElements" and rel.RelatingElement == settings["relating_element"]: + for rel in related_element.ConnectedFrom: + if rel.is_a() == "IfcRelConnectsElements" and rel.RelatingElement == relating_element: incompatible_connections.append(rel) if incompatible_connections: diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py index 14bbaf9e7c..787f7a5633 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/disconnect_path.py @@ -19,33 +19,36 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.util.element +from typing import Optional -def disconnect_path(file, **usecase_settings) -> None: - settings = { - "relating_element": None, - "related_element": None, - "element": None, - "connection_type": None, - } - for key, value in usecase_settings.items(): - settings[key] = value - - if settings["connection_type"] and settings["element"]: +def disconnect_path( + file: ifcopenshell.file, + element: Optional[ifcopenshell.entity_instance] = None, + connection_type: Optional[str] = None, + relating_element: Optional[ifcopenshell.entity_instance] = None, + related_element: Optional[ifcopenshell.entity_instance] = None, +) -> None: + """There are two options to use this API method: + - provide `element` (connected from) and `connection_type` that should be disconnected. + - provide connected elements to disconnect explicitly: + `relating_element` (connected from) and `related_element` (connected to) + """ + if connection_type and element: connections = [ r - for r in settings["element"].ConnectedTo - if r.is_a("IfcRelConnectsPathElements") and r.RelatingConnectionType == settings["connection_type"] + for r in element.ConnectedTo + if r.is_a("IfcRelConnectsPathElements") and r.RelatingConnectionType == connection_type ] + [ r - for r in settings["element"].ConnectedFrom - if r.is_a("IfcRelConnectsPathElements") and r.RelatedConnectionType == settings["connection_type"] + for r in element.ConnectedFrom + if r.is_a("IfcRelConnectsPathElements") and r.RelatedConnectionType == connection_type ] - else: + elif related_element: connections = [ r - for r in settings["relating_element"].ConnectedTo - if r.is_a("IfcRelConnectsPathElements") and r.RelatedElement == settings["related_element"] + for r in relating_element.ConnectedTo + if r.is_a("IfcRelConnectsPathElements") and r.RelatedElement == related_element ] for connection in set(connections): diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py index 768468e03a..c71d803ce7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/edit_object_placement.py @@ -31,8 +31,8 @@ def edit_object_placement( file: ifcopenshell.file, product: ifcopenshell.entity_instance, matrix: Optional[NPArrayOfFloats] = None, - is_si=True, - should_transform_children=False, + is_si: bool = True, + should_transform_children: bool = False, ) -> ifcopenshell.entity_instance: usecase = Usecase() usecase.file = file diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py index 83e1e1e821..597463a3e5 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py @@ -16,14 +16,15 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def map_representation(file, **usecase_settings) -> None: + +def map_representation( + file: ifcopenshell.file, representation: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: usecase = Usecase() usecase.file = file - usecase.settings = {"representation": None} - usecase.ifc_vertices = [] - for key, value in usecase_settings.items(): - usecase.settings[key] = value + usecase.settings = {"representation": representation} return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_boolean.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_boolean.py index 5d81203a5d..c24bcdbc1b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_boolean.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/remove_boolean.py @@ -19,12 +19,10 @@ import ifcopenshell.util.element -def remove_boolean(file, **usecase_settings) -> None: +def remove_boolean(file: ifcopenshell.file, item: ifcopenshell.entity_instance) -> None: usecase = Usecase() usecase.file = file - usecase.settings = {"item": None} - for key, value in usecase_settings.items(): - usecase.settings[key] = value + usecase.settings = {"item": item} return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py index 83b1570ac6..435ea5207c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py @@ -20,12 +20,12 @@ import ifcopenshell.api import ifcopenshell.util.element -def unassign_representation(file, **usecase_settings) -> None: +def unassign_representation( + file: ifcopenshell.file, product: ifcopenshell.entity_instance, representation: ifcopenshell.entity_instance +) -> None: usecase = Usecase() usecase.file = file - usecase.settings = {"product": None, "representation": None} - for key, value in usecase_settings.items(): - usecase.settings[key] = value + usecase.settings = {"product": product, "representation": representation} return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py index 5da8819e47..8b6ed48337 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/add_georeferencing.py @@ -16,8 +16,10 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def add_georeferencing(file) -> None: + +def add_georeferencing(file: ifcopenshell.file) -> None: """Add empty georeferencing entities to a model By default, models are not georeferenced. Georeferencing requires two diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py index f4118d96e1..08d7361935 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py @@ -16,8 +16,16 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional, Any -def edit_georeferencing(file, map_conversion=None, projected_crs=None, true_north=None) -> None: + +def edit_georeferencing( + file: ifcopenshell.file, + map_conversion: Optional[dict[str, Any]] = None, + projected_crs: Optional[dict[str, Any]] = None, + true_north: Optional[tuple[float, float]] = None, +) -> None: """Edits the attributes of a map conversion, projected CRS, and true north Setting the correct georeferencing parameters is a complex topic and @@ -47,7 +55,7 @@ def edit_georeferencing(file, map_conversion=None, projected_crs=None, true_nort names and values you want to edit. :type projected_crs: dict, optional :param true_north: A unitised 2D vector, where each ordinate is a float - :type true_north: list[float] + :type true_north: tuple[float, float], optional :return: None :rtype: None @@ -101,7 +109,7 @@ class Usecase: self.set_true_north() def set_true_north(self): - if self.settings["true_north"] == []: + if self.settings["true_north"] == None: return for context in self.file.by_type("IfcGeometricRepresentationContext", include_subtypes=False): if context.TrueNorth: @@ -111,6 +119,8 @@ class Usecase: context.TrueNorth = self.file.create_entity("IfcDirection") direction = context.TrueNorth if self.settings["true_north"] is None: + # TODO: code will never be executed since None value + # is substituted by an empty list context.TrueNorth = self.settings["true_north"] elif context.CoordinateSpaceDimension == 2: direction.DirectionRatios = self.settings["true_north"][0:2] diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py index 3d3941ed7c..bac0f6253d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/remove_georeferencing.py @@ -16,8 +16,10 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell -def remove_georeferencing(file) -> None: + +def remove_georeferencing(file: ifcopenshell.file) -> None: """Remove georeferencing data All georeferencing parameters such as projected CRS and map conversion diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py b/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py index 2f3520c662..abb2848205 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/create_axis_curve.py @@ -16,13 +16,18 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +from __future__ import annotations import ifcopenshell +import ifcopenshell.util.element import ifcopenshell.util.unit import ifcopenshell.util.placement from mathutils import Matrix # For now, we depend on Blender +import bpy.types -def create_axis_curve(file, axis_curve=None, grid_axis=None) -> None: +def create_axis_curve( + file: ifcopenshell.file, axis_curve: bpy.types.Object, grid_axis: ifcopenshell.entity_instance +) -> None: """Adds curve geometry to a grid axis to represent the axis extents This currently depends on the Blender geometry kernel to function. diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py b/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py index f089b43b98..b91d86e259 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/create_grid_axis.py @@ -15,9 +15,17 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Optional, Literal -def create_grid_axis(file, axis_tag=None, same_sense=None, uvw_axes=None, grid=None) -> None: +def create_grid_axis( + file: ifcopenshell.file, + grid: ifcopenshell.entity_instance, + axis_tag: str = "A", + same_sense: bool = True, + uvw_axes: Literal["UAxes", "VAxes", "WAxes"] = "UAxes", +) -> ifcopenshell.entity_instance: """Adds a new grid axis to a grid An IFC grid will typically have a minimum of two axes which will be @@ -66,17 +74,9 @@ def create_grid_axis(file, axis_tag=None, same_sense=None, uvw_axes=None, grid=N axis_1 = ifcopenshell.api.run("grid.create_grid_axis", model, axis_tag="1", uvw_axes="VAxes", grid=grid) """ - settings = { - "axis_tag": axis_tag or "A", - "same_sense": same_sense or True, - "uvw_axes": uvw_axes or "UAxes", # Choose which axes - "grid": grid, - } - element = file.create_entity( - "IfcGridAxis", **{"AxisTag": settings["axis_tag"], "SameSense": settings["same_sense"]} - ) - axes = list(getattr(settings["grid"], settings["uvw_axes"]) or []) + element = file.create_entity("IfcGridAxis", **{"AxisTag": axis_tag, "SameSense": same_sense}) + axes = list(getattr(grid, uvw_axes) or []) axes.append(element) - setattr(settings["grid"], settings["uvw_axes"], axes) + setattr(grid, uvw_axes, axes) return element diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py b/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py index 51032ed52f..2e3ff1b005 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/remove_grid_axis.py @@ -19,7 +19,7 @@ import ifcopenshell.util.element -def remove_grid_axis(file, axis=None) -> None: +def remove_grid_axis(file: ifcopenshell.file, axis: ifcopenshell.entity_instance) -> None: """Removes a grid axis from a grid :param axis: The IfcGridAxis you want to remove. @@ -43,9 +43,8 @@ def remove_grid_axis(file, axis=None) -> None: # Let's remove it! ifcopenshell.api.run("grid.remove_grid_axis", model, axis=axis_2) """ - settings = {"axis": axis} - - if len(file.get_inverse(settings["axis"].AxisCurve)) == 1: - ifcopenshell.util.element.remove_deep(file, settings["axis"].AxisCurve) - file.remove(settings["axis"].AxisCurve) - file.remove(settings["axis"]) + axis_curve = axis.AxisCurve + if len(file.get_inverse(axis_curve)) == 1: + ifcopenshell.util.element.remove_deep(file, axis_curve) + file.remove(axis_curve) + file.remove(axis) diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py index 7a233bdcbf..44553bddcf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py @@ -19,9 +19,12 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.guid +from typing import Optional -def add_group(file, Name="Unnamed", Description=None) -> None: +def add_group( + file: ifcopenshell.file, Name: str = "Unnamed", Description: Optional[str] = None +) -> ifcopenshell.entity_instance: """Adds a new group An IFC group is an arbitrary collection of products, which are typically diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py index 1eb0c8d6f4..912b3c30c9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py @@ -15,9 +15,11 @@ # # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell +from typing import Any -def edit_group(file, group=None, attributes=None) -> None: +def edit_group(file: ifcopenshell.file, group: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: """Edits the attributes of an IfcGroup For more information about the attributes and data types of an @@ -26,7 +28,7 @@ def edit_group(file, group=None, attributes=None) -> None: :param group: The IfcGroup entity you want to edit :type group: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -38,7 +40,7 @@ def edit_group(file, group=None, attributes=None) -> None: ifcopenshell.api.run("group.edit_group", model, group=group, attributes={"Description": "All furniture and joinery included in the unit"}) """ - settings = {"group": group, "attributes": attributes or {}} + settings = {"group": group, "attributes": attributes} for name, value in settings["attributes"].items(): setattr(settings["group"], name, value) diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py index 05e85f3fc0..d17806d6c3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py @@ -21,7 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.element -def remove_group(file, group=None) -> None: +def remove_group(file: ifcopenshell.file, group: ifcopenshell.entity_instance) -> None: """Removes a group All products assigned to the group will remain, but the relationship to diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py index 74ef54c0bb..c68992f7a3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py @@ -21,7 +21,9 @@ import ifcopenshell.api import ifcopenshell.guid -def update_group_products(file, group=None, products=None) -> None: +def update_group_products( + file: ifcopenshell.file, group: ifcopenshell.entity_instance, products: list[ifcopenshell.entity_instance] +) -> ifcopenshell.entity_instance: """Sets a group products to be an explicit list of products Any previous products assigned to that group will have their assignment diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py b/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py index fdd21c3424..00af1708e4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/add_library.py @@ -21,7 +21,7 @@ import ifcopenshell.util.schema import ifcopenshell.util.date -def add_library(file: ifcopenshell.entity_instance, name: str) -> ifcopenshell.entity_instance: +def add_library(file: ifcopenshell.file, name: str) -> ifcopenshell.entity_instance: """Adds a new library to the project A library is an external data source that is related to the project. It diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py index 37a57825f5..f584c341ca 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/edit_profile_usage.py @@ -36,7 +36,7 @@ def edit_profile_usage( :param usage: The IfcMaterialProfileSetUsage entity you want to edit :type usage: ifcopenshell.entity_instance :param attributes: a dictionary of attribute names and values. - :type attributes: dict, optional + :type attributes: dict :return: None :rtype: None @@ -93,7 +93,7 @@ def edit_profile_usage( usecase = Usecase() usecase.file = file - usecase.settings = {"usage": usage, "attributes": attributes or {}} + usecase.settings = {"usage": usage, "attributes": attributes} return usecase.execute() diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py index e492707c44..a033030530 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py @@ -22,7 +22,7 @@ import ifcopenshell.guid def assign_product( - file: ifcopenshell.entity_instance, + file: ifcopenshell.file, relating_product: ifcopenshell.entity_instance, related_object: ifcopenshell.entity_instance, ) -> ifcopenshell.entity_instance: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py index 79ef8b90de..5179073e70 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/edit_work_schedule.py @@ -21,7 +21,7 @@ from typing import Any def edit_work_schedule( - file: ifcopenshell.entity_instance, work_schedule: ifcopenshell.entity_instance, attributes: dict[str, Any] + file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance, attributes: dict[str, Any] ) -> None: """Edits the attributes of an IfcWorkSchedule diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py index 22a19e5051..05ec24adff 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py @@ -20,7 +20,7 @@ import ifcopenshell import ifcopenshell.util.element -def remove_work_plan(file: ifcopenshell.entity_instance, work_plan: ifcopenshell.entity_instance) -> None: +def remove_work_plan(file: ifcopenshell.file, work_plan: ifcopenshell.entity_instance) -> None: """Removes a work plan Note that schedules that are grouped under the work plan are not diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py index f6c8c3b0c3..48583984aa 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/add_surface_textures.py @@ -25,7 +25,7 @@ if TYPE_CHECKING: def add_surface_textures( - file: ifcopenshell.entity_instance, + file: ifcopenshell.file, material: Optional[bpy.types.Material] = None, textures: Optional[list[dict]] = None, uv_maps: Optional[list[ifcopenshell.entity_instance]] = None, diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index ee421256c5..53513cfb05 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -24,7 +24,7 @@ import zipfile import functools import ifcopenshell from pathlib import Path -from typing import Optional, Any +from typing import Optional, Any, Union, Callable from . import ifcopenshell_wrapper from .entity_instance import entity_instance @@ -379,7 +379,7 @@ class file: return e - def __getattr__(self, attr): + def __getattr__(self, attr) -> Union[Any, Callable[..., ifcopenshell.entity_instance]]: if attr[0:6] == "create": return functools.partial(self.create_entity, attr[6:]) elif attr == "schema": diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 2430a2553a..60ac89044c 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -979,7 +979,7 @@ def get_decomposition(element: ifcopenshell.entity_instance, is_recursive=True) def get_grouped_by(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: """Retrieves all subelements of an element based on the group. - :param element: The IFC element + :param element: IfcGroup entity :type element: ifcopenshell.entity_instance :return: All subelements of the group :rtype: list[ifcopenshell.entity_instance] diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py index 29ed257cc8..81ec583419 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py @@ -26,7 +26,7 @@ import ifcopenshell.util.element import ifcopenshell.util.representation import ifcopenshell.util.unit from math import cos, sin, pi, tan, radians, degrees, atan, sqrt, ceil -from typing import List, Tuple, Type, Union +from typing import Union, Optional, Literal, Any from itertools import chain from mathutils import Vector, Matrix @@ -34,7 +34,7 @@ V = lambda *x: Vector([float(i) for i in x]) sign = lambda x: x and (1, -1)[x < 0] PRECISION = 1.0e-5 -VectorTuple = Type[Tuple[float, float, float]] +VectorTuple = type[tuple[float, float, float]] "tuple of 3 `float` values" @@ -59,13 +59,17 @@ class ShapeBuilder: self.file = ifc_file def polyline( - self, points: List[Vector], closed: bool = False, position_offset: Vector = None, arc_points: List[int] = [] + self, + points: list[Vector], + closed: bool = False, + position_offset: Optional[Vector] = None, + arc_points: list[int] = [], ) -> ifcopenshell.entity_instance: """ Generate an IfcIndexedPolyCurve based on the provided points. :param points: List of 2d or 3d points - :type points: List[Vector] + :type points: list[Vector] :param closed: Whether polyline should be closed. Default is `False` :type closed: bool, optional :param position_offset: offset to be applied to all points @@ -73,7 +77,7 @@ class ShapeBuilder: :param arc_points: Indices of the middle points for arcs. For creating an arc segment, provide 3 points: `arc_start`, `arc_middle` and `arc_end` to `points` and add the `arc_middle` point's index to `arc_points` - :type arc_points: List[int], optional + :type arc_points: list[int], optional :return: IfcIndexedPolyCurve :rtype: ifcopenshell.entity_instance @@ -155,7 +159,9 @@ class ShapeBuilder: ifc_curve = self.file.createIfcIndexedPolyCurve(Points=ifc_points, Segments=ifc_segments) return ifc_curve - def get_rectangle_coords(self, size: Vector = Vector((1.0, 1.0)).freeze(), position: Vector = None) -> List[Vector]: + def get_rectangle_coords( + self, size: Vector = Vector((1.0, 1.0)).freeze(), position: Optional[Vector] = None + ) -> list[Vector]: """ Get rectangle coords arranged as below: @@ -248,7 +254,7 @@ class ShapeBuilder: # TODO: explain points order for the curve_between_two_points # because the order is important and defines the center of the curve # currently it seems like the first point shifted by x-axis defines the center - def curve_between_two_points(self, points): + def curve_between_two_points(self, points: tuple[Vector, Vector]) -> ifcopenshell.entity_instance: # > points - list of 2 Vectors """Simple circle based curve between two points Good for creating curves and fillets, won't work for continuous ellipse shapes. @@ -268,7 +274,13 @@ class ShapeBuilder: curve = self.file.createIfcIndexedPolyCurve(Points=ifc_points, Segments=[seg]) return curve - def get_trim_points_from_mask(self, x_axis_radius, y_axis_radius, trim_points_mask, position_offset=None): + def get_trim_points_from_mask( + self, + x_axis_radius: float, + y_axis_radius: float, + trim_points_mask: list[int], + position_offset: Optional[Vector] = None, + ) -> list[Vector]: """Handy way to get edge points of the ellipse like shape of a given radiuses. Mask points are numerated from 0 to 3 ccw starting from (x_axis_radius/2; 0). @@ -289,13 +301,13 @@ class ShapeBuilder: def create_ellipse_curve( self, - x_axis_radius, - y_axis_radius, + x_axis_radius: float, + y_axis_radius: float, position=Vector((0.0, 0.0)).freeze(), - trim_points=[], - ref_x_direction=Vector((1.0, 0.0)), - trim_points_mask=[], - ): + trim_points: list[Vector] = (), + ref_x_direction: Vector = Vector((1.0, 0.0)), + trim_points_mask: list[int] = (), + ) -> ifcopenshell.entity_instance: """ Ellipse trimming points should be specified in counter clockwise order. @@ -329,7 +341,13 @@ class ShapeBuilder: ) return trim_ellipse - def profile(self, outer_curve, name=None, inner_curves=[], profile_type="AREA"): + def profile( + self, + outer_curve: ifcopenshell.entity_instance, + name: Optional[str] = None, + inner_curves: list[ifcopenshell.entity_instance] = (), + profile_type: str = "AREA", + ) -> ifcopenshell.entity_instance: # > inner_curves - list of IfcCurve; # inner_curves could be used as a tool for boolean operation # but if any point of inner curve will go outside the outer curve @@ -369,7 +387,12 @@ class ShapeBuilder: profile = self.file.create_entity("IfcArbitraryClosedProfileDef", **kwargs) return profile - def translate(self, curve_or_item, translation: Vector, create_copy=False): + def translate( + self, + curve_or_item: Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]], + translation: Vector, + create_copy: bool = False, + ) -> Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]]: # > curve_or_item - could be a list of curves or items or representations # < returns translated object @@ -413,7 +436,7 @@ class ShapeBuilder: def rotate_2d_point( self, point_2d: Vector, angle=90, pivot_point: Vector = Vector((0.0, 0.0)).freeze(), counter_clockwise=False - ): + ) -> Vector: # > angle - in degrees # < rotated Vector @@ -425,12 +448,12 @@ class ShapeBuilder: def rotate( self, - curve_or_item, - angle=90, + curve_or_item: Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]], + angle: float = 90, pivot_point: Vector = Vector((0.0, 0.0)).freeze(), - counter_clockwise=False, - create_copy=False, - ): + counter_clockwise: bool = False, + create_copy: bool = False, + ) -> Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]]: # > curve_or_item - could be a list of curves or items # > angle - in degrees # < returns rotated object @@ -479,7 +502,7 @@ class ShapeBuilder: point_2d: Vector, mirror_axes: Vector = Vector((1.0, 1.0)).freeze(), mirror_point: Vector = Vector((0.0, 0.0)).freeze(), - ): + ) -> Vector: """mirror_axes - along which axes mirror will be applied""" base = point_2d # prevent mutating the argument mirror_axes = Vector([-1 if i > 0 else 1 for i in mirror_axes]) @@ -558,12 +581,12 @@ class ShapeBuilder: def mirror( self, - curve_or_item, + curve_or_item: Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]], mirror_axes: Vector = Vector((1.0, 1.0)).freeze(), mirror_point: Vector = Vector((0.0, 0.0)).freeze(), - create_copy=False, - placement_matrix=None, - ): + create_copy: bool = False, + placement_matrix: Optional[Matrix] = None, + ) -> Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]]: """mirror_axes - along which axes mirror will be applied For example, mirroring `A(1,0)` by axis `(1,0)` will result in `A'(-1,0)` @@ -687,14 +710,14 @@ class ShapeBuilder: def extrude( self, - profile_or_curve, - magnitude=1.0, + profile_or_curve: ifcopenshell.entity_instance, + magnitude: float = 1.0, position: Vector = Vector([0.0, 0.0, 0.0]).freeze(), extrusion_vector: Vector = Vector((0.0, 0.0, 1.0)).freeze(), position_z_axis: Vector = Vector((0.0, 0.0, 1.0)).freeze(), position_x_axis: Vector = Vector((1.0, 0.0, 0.0)).freeze(), - position_y_axis: Vector = None, - ): + position_y_axis: Optional[Vector] = None, + ) -> ifcopenshell.entity_instance: """Extrude profile or curve to get IfcExtrudedAreaSolid. REMEMBER when handling custom axes - IFC is using RIGHT handed coordinate system. @@ -730,7 +753,9 @@ class ShapeBuilder: ) return extruded_area - def create_swept_disk_solid(self, path_curve, radius): + def create_swept_disk_solid( + self, path_curve: ifcopenshell.entity_instance, radius: float + ) -> ifcopenshell.entity_instance: """Create IfcSweptDiskSolid from `path_curve` (must be 3D) and `radius`""" if path_curve.Dim != 3: raise Exception( @@ -741,16 +766,22 @@ class ShapeBuilder: disk_solid = self.file.createIfcSweptDiskSolid(Directrix=path_curve, Radius=radius) return disk_solid - def get_representation(self, context, items, representation_type: str = None) -> ifcopenshell.entity_instance: + def get_representation( + self, + context: ifcopenshell.entity_instance, + items: Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]], + representation_type: Optional[str] = None, + ) -> ifcopenshell.entity_instance: """Create IFC representation for the specified context and items. :param context: IfcGeometricRepresentationSubContext + :type context: ifcopenshell.entity_instance :param items: could be a list or single curve/IfcExtrudedAreaSolid :param representation_type: Explicitly specified RepresentationType, defaults to `None`. If not provided it will be guessed from the items types :type representation_type: str, optional - :return: IfcRepresentation + :return: IfcShapeRepresentation :rtype: ifcopenshell.entity_instance """ if not isinstance(items, collections.abc.Iterable): @@ -779,11 +810,11 @@ class ShapeBuilder: ) return representation - def deep_copy(self, element): + def deep_copy(self, element: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: return ifcopenshell.util.element.copy_deep(self.file, element) # UTILITIES - def extrude_kwargs(self, axis): + def extrude_kwargs(self, axis: Literal["Y", "X", "Z"]) -> dict[str, Vector]: """Shortcut to get kwargs for `ShapeBuilder.extrude` to extrude by some axis. It assumes you have 2D profile in: @@ -814,7 +845,9 @@ class ShapeBuilder: "extrusion_vector": Vector((0, 0, 1)), } - def rotate_extrusion_kwargs_by_z(self, kwargs, angle, counter_clockwise=False): + def rotate_extrusion_kwargs_by_z( + self, kwargs: dict[str, Any], angle: float, counter_clockwise: bool = False + ) -> dict[str, Vector]: """shortcut to rotate extrusion kwargs by z axis `kwargs` expected to have `position_x_axis` and `position_z_axis` keys @@ -829,7 +862,7 @@ class ShapeBuilder: kwargs["position_z_axis"].rotate(rot) return kwargs - def get_polyline_coords(self, polyline): + def get_polyline_coords(self, polyline: ifcopenshell.entity_instance) -> list[Vector]: """polyline should be either `IfcIndexedPolyCurve` or `IfcPolyline`""" coords = None if polyline.is_a("IfcIndexedPolyCurve"): @@ -838,7 +871,7 @@ class ShapeBuilder: coords = [p.Coordinates for p in polyline.Points] return coords - def set_polyline_coords(self, polyline, coords): + def set_polyline_coords(self, polyline: ifcopenshell.entity_instance, coords: list[Vector]) -> None: """polyline should be either `IfcIndexedPolyCurve` or `IfcPolyline`""" if polyline.is_a("IfcIndexedPolyCurve"): polyline.Points.CoordList = coords @@ -846,7 +879,14 @@ class ShapeBuilder: for i, co in enumerate(coords): polyline.Points[i].Coordinates = co - def get_simple_2dcurve_data(self, coords, fillets=[], fillet_radius=[], closed=True, create_ifc_curve=None): + def get_simple_2dcurve_data( + self, + coords: list[Vector], + fillets: list[int] = (), + fillet_radius: list[float] = (), + closed: bool = True, + create_ifc_curve: bool = False, + ) -> tuple[list[Vector], list[tuple[int, int], Union[ifcopenshell.entity_instance, None]]]: """ Creates simple 2D curve from set of 2d coords and list of points with fillets. Simple curve means that all fillets are based on 90 degree angle. @@ -957,8 +997,14 @@ class ShapeBuilder: return (points, segments, ifc_curve) def create_z_profile_lips_curve( - self, FirstFlangeWidth, SecondFlangeWidth, Depth, Girth, WallThickness, FilletRadius - ): + self, + FirstFlangeWidth: float, + SecondFlangeWidth: float, + Depth: float, + Girth: float, + WallThickness: float, + FilletRadius: float, + ) -> ifcopenshell.entity_instance: x1 = FirstFlangeWidth x2 = SecondFlangeWidth y = Depth / 2 @@ -996,7 +1042,9 @@ class ShapeBuilder: return ifc_curve - def create_transition_arc_ifc(self, width, height, create_ifc_curve=False): + def create_transition_arc_ifc( + self, width: str, height: str, create_ifc_curve: bool = False + ) -> tuple[list[Vector], list[tuple[int, int], Union[ifcopenshell.entity_instance, None]]]: # create an arc in the rectangle with specified width and height # if it's not possible to make a complete arc # it will create arc with longest radius possible @@ -1028,7 +1076,7 @@ class ShapeBuilder: ) return points, segments, transition_arc - def polygonal_face_set(self, points, faces): + def polygonal_face_set(self, points: list[Vector], faces: list[[list[int]]]) -> ifcopenshell.entity_instance: """ > `points` - list of points @@ -1048,8 +1096,14 @@ class ShapeBuilder: return face_set def extrude_face_set( - self, points, magnitude: float, extrusion_vector=V(0, 0, 1).freeze(), offset=None, start_cap=True, end_cap=True - ): + self, + points: list[Vector], + magnitude: float, + extrusion_vector: Vector = V(0, 0, 1).freeze(), + offset: Optional[Vector] = None, + start_cap: bool = True, + end_cap: bool = True, + ) -> ifcopenshell.entity_instance: """ Method to extrude by creating face sets rather than creating IfcExtrudedAreaSolid. @@ -1057,18 +1111,20 @@ class ShapeBuilder: to assure CorrectItemsForType. :param points: list of points, assuming they form consecutive closed polyline. + :type points: list[Vector] :param magnitude: extrusion magnitude - :param type: float + :type magnitude: float :param extrusion_vector: extrusion direction, by default it's extruding by Z+ axis - :param type: Vector, optional + :type extrusion_vector: Vector, optional :param offset: offset from the points - :param type: Vector, optional + :type offset: Vector, optional :param start_cap: if True, create start cap, by default it's True - :param type: bool, optional + :type start_cap: bool, optional :param end_cap: if True, create end cap, by default it's True - :param type: bool, optional + :type end_cap: bool, optional :return: IfcPolygonalFaceSet + :rtype: ifcopenshell.entity_instance """ # prevent mutating arguments, deepcopy doesn't work diff --git a/src/ifcopenshell-python/test/api/pset/test_remove_pset.py b/src/ifcopenshell-python/test/api/pset/test_remove_pset.py index 1685f158e8..134bf1b9a7 100644 --- a/src/ifcopenshell-python/test/api/pset/test_remove_pset.py +++ b/src/ifcopenshell-python/test/api/pset/test_remove_pset.py @@ -18,6 +18,7 @@ import test.bootstrap import ifcopenshell.api +import ifcopenshell.util.element class TestRemovePset(test.bootstrap.IFC4): From 335e2b7a788a94ba717b346fc407f1906c08b210 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 15 May 2024 15:46:45 +0500 Subject: [PATCH 181/429] ifc2x3 tests --- .../test/api/geometry/test_add_boolean.py | 4 ++++ .../api/geometry/test_assign_representation.py | 4 ++++ .../test/api/geometry/test_connect_element.py | 6 +++++- .../test/api/geometry/test_connect_path.py | 4 ++++ .../test/api/geometry/test_disconnect_element.py | 6 +++++- .../test/api/geometry/test_disconnect_path.py | 4 ++++ .../api/geometry/test_edit_object_placement.py | 6 +++--- .../test/api/grid/test_create_grid_axis.py | 4 ++++ .../test/api/group/test_remove_group.py | 6 +++++- .../test/api/group/test_unassign_group.py | 14 +++++++++----- 10 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/ifcopenshell-python/test/api/geometry/test_add_boolean.py b/src/ifcopenshell-python/test/api/geometry/test_add_boolean.py index 10e938b5b4..7f4dd68b00 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_add_boolean.py +++ b/src/ifcopenshell-python/test/api/geometry/test_add_boolean.py @@ -53,3 +53,7 @@ class TestAddBoolean(test.bootstrap.IFC4): ifcopenshell.api.run("geometry.add_boolean", self.file, representation=rep, matrix=np.eye(4)) assert rep.Items[0].is_a() == "IfcBooleanClippingResult" assert rep.RepresentationType == "Clipping" + + +class TestAddBooleanIFC2X3(test.bootstrap.IFC2X3, TestAddBoolean): + pass diff --git a/src/ifcopenshell-python/test/api/geometry/test_assign_representation.py b/src/ifcopenshell-python/test/api/geometry/test_assign_representation.py index 654e4d383a..3a33261107 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_assign_representation.py +++ b/src/ifcopenshell-python/test/api/geometry/test_assign_representation.py @@ -89,3 +89,7 @@ class TestAssignRepresentation(test.bootstrap.IFC4): assert wall.Representation.Representations[0].RepresentationType != "MappedRepresentation" assert wall.Representation.Representations[0] == rep assert not walltype.RepresentationMaps + + +class TestAssignRepresentationIFC2X3(test.bootstrap.IFC2X3, TestAssignRepresentation): + pass diff --git a/src/ifcopenshell-python/test/api/geometry/test_connect_element.py b/src/ifcopenshell-python/test/api/geometry/test_connect_element.py index 1b4123b731..8550b7b016 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_connect_element.py +++ b/src/ifcopenshell-python/test/api/geometry/test_connect_element.py @@ -20,7 +20,7 @@ import test.bootstrap import ifcopenshell.api -class TestConnectPath(test.bootstrap.IFC4): +class TestConnectElement(test.bootstrap.IFC4): def test_connecting_an_element(self): wall1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") wall2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") @@ -85,3 +85,7 @@ class TestConnectPath(test.bootstrap.IFC4): ) assert rel.RelatingElement == wall2 assert rel.RelatedElement == wall1 + + +class TestConnectElementIFC2X3(test.bootstrap.IFC2X3, TestConnectElement): + pass diff --git a/src/ifcopenshell-python/test/api/geometry/test_connect_path.py b/src/ifcopenshell-python/test/api/geometry/test_connect_path.py index d5b38b8d30..468c38754a 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_connect_path.py +++ b/src/ifcopenshell-python/test/api/geometry/test_connect_path.py @@ -146,3 +146,7 @@ class TestConnectPath(test.bootstrap.IFC4): related_connection=related_connection, description=description, ) + + +class TestConnectPathIFC2X3(test.bootstrap.IFC2X3, TestConnectPath): + pass diff --git a/src/ifcopenshell-python/test/api/geometry/test_disconnect_element.py b/src/ifcopenshell-python/test/api/geometry/test_disconnect_element.py index ebb3b8c7a8..2920231624 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_disconnect_element.py +++ b/src/ifcopenshell-python/test/api/geometry/test_disconnect_element.py @@ -20,7 +20,7 @@ import test.bootstrap import ifcopenshell.api -class TestDisconnectPath(test.bootstrap.IFC4): +class TestDisconnectElement(test.bootstrap.IFC4): def test_disconnecting_an_element(self): wall1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") wall2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") @@ -34,3 +34,7 @@ class TestDisconnectPath(test.bootstrap.IFC4): ifcopenshell.api.run("geometry.connect_element", self.file, relating_element=wall1, related_element=wall2) ifcopenshell.api.run("geometry.disconnect_element", self.file, relating_element=wall2, related_element=wall1) assert not self.file.by_type("IfcRelConnectsElements") + + +class TestDisconnectElementIFC2X3(test.bootstrap.IFC2X3, TestDisconnectElement): + pass diff --git a/src/ifcopenshell-python/test/api/geometry/test_disconnect_path.py b/src/ifcopenshell-python/test/api/geometry/test_disconnect_path.py index 9c0aacbd31..a09eba8725 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_disconnect_path.py +++ b/src/ifcopenshell-python/test/api/geometry/test_disconnect_path.py @@ -68,3 +68,7 @@ class TestDisconnectPath(test.bootstrap.IFC4): total_elements = len([e for e in self.file]) ifcopenshell.api.run("geometry.disconnect_path", self.file, relating_element=wall2, related_element=wall1) assert len([e for e in self.file]) == total_elements + + +class TestDisconnectPathIFC2X3(test.bootstrap.IFC2X3, TestDisconnectPath): + pass diff --git a/src/ifcopenshell-python/test/api/geometry/test_edit_object_placement.py b/src/ifcopenshell-python/test/api/geometry/test_edit_object_placement.py index 2eb72d33b9..ff7a9c587a 100644 --- a/src/ifcopenshell-python/test/api/geometry/test_edit_object_placement.py +++ b/src/ifcopenshell-python/test/api/geometry/test_edit_object_placement.py @@ -268,7 +268,7 @@ class TestEditObjectPlacement(test.bootstrap.IFC4): def test_changing_placements_relative_to_a_nest_parent(self): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") ifcopenshell.api.run("unit.assign_unit", self.file) - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcChiller") + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcFlowSegment") subelement = ifcopenshell.api.run("system.add_port", self.file, element=element) matrix = numpy.array( ( @@ -546,7 +546,7 @@ class TestEditObjectPlacement(test.bootstrap.IFC4): def test_changing_placements_always_affecting_child_ports_as_a_special_case(self): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") ifcopenshell.api.run("unit.assign_unit", self.file) - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcChiller") + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcFlowSegment") subelement = ifcopenshell.api.run("system.add_port", self.file, element=element) matrix = numpy.eye(4) @@ -662,7 +662,7 @@ class TestEditObjectPlacement(test.bootstrap.IFC4): assert numpy.array_equal(ifcopenshell.util.placement.get_local_placement(wall.ObjectPlacement), matrix) -class TestEditObjectPlacementIFC2X3(test.bootstrap.IFC2X3): +class TestEditObjectPlacementIFC2X3(test.bootstrap.IFC2X3, TestEditObjectPlacement): def test_changing_placements_relative_to_a_distribution_element(self): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") ifcopenshell.api.run("unit.assign_unit", self.file) diff --git a/src/ifcopenshell-python/test/api/grid/test_create_grid_axis.py b/src/ifcopenshell-python/test/api/grid/test_create_grid_axis.py index 524f5fcc33..ef151cc2ee 100644 --- a/src/ifcopenshell-python/test/api/grid/test_create_grid_axis.py +++ b/src/ifcopenshell-python/test/api/grid/test_create_grid_axis.py @@ -33,3 +33,7 @@ class TestCreateGridAxis(test.bootstrap.IFC4): "grid.create_grid_axis", self.file, axis_tag="axis_tag", same_sense=True, uvw_axes="UAxes", grid=grid ) assert grid.UAxes == (axis, axis2) + + +class TestCreateGridAxisIFC2X3(test.bootstrap.IFC2X3, TestCreateGridAxis): + pass diff --git a/src/ifcopenshell-python/test/api/group/test_remove_group.py b/src/ifcopenshell-python/test/api/group/test_remove_group.py index c5b55f3006..5936a40058 100644 --- a/src/ifcopenshell-python/test/api/group/test_remove_group.py +++ b/src/ifcopenshell-python/test/api/group/test_remove_group.py @@ -27,7 +27,7 @@ class TestRemoveGroup(test.bootstrap.IFC4): assert len(self.file.by_type("IfcGroup")) == 0 def test_removing_orphaned_group_relationships(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcPump") + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") group = ifcopenshell.api.run("group.add_group", self.file) ifcopenshell.api.run("group.assign_group", self.file, products=[element], group=group) ifcopenshell.api.run("group.remove_group", self.file, group=group) @@ -41,3 +41,7 @@ class TestRemoveGroup(test.bootstrap.IFC4): assert not self.file.by_type("IfcRelDefinesByProperties") assert not self.file.by_type("IfcPropertySet") assert not self.file.by_type("IfcPropertySingleValue") + + +class TestRemoveGroupIFC2X3(test.bootstrap.IFC2X3, TestRemoveGroup): + pass diff --git a/src/ifcopenshell-python/test/api/group/test_unassign_group.py b/src/ifcopenshell-python/test/api/group/test_unassign_group.py index d7b1179f03..86029ab6d9 100644 --- a/src/ifcopenshell-python/test/api/group/test_unassign_group.py +++ b/src/ifcopenshell-python/test/api/group/test_unassign_group.py @@ -22,9 +22,9 @@ import ifcopenshell.api class TestAssignGroup(test.bootstrap.IFC4): def test_group_unassignment(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcPump") - element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcPump") - element3 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcPump") + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + element3 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") group = ifcopenshell.api.run("group.add_group", self.file) ifcopenshell.api.run("group.assign_group", self.file, products=[element, element2, element3], group=group) ifcopenshell.api.run("group.unassign_group", self.file, products=[element2, element3], group=group) @@ -35,9 +35,13 @@ class TestAssignGroup(test.bootstrap.IFC4): assert rel.RelatedObjects == (element,) def test_remove_relationship_unassigning_last_element(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcPump") - element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcPump") + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") group = ifcopenshell.api.run("group.add_group", self.file) ifcopenshell.api.run("group.assign_group", self.file, products=[element, element2], group=group) ifcopenshell.api.run("group.unassign_group", self.file, products=[element, element2], group=group) assert len(self.file.by_type("IfcRelAssignsToGroup")) == 0 + + +class TestAssignGroupIFC2X3(test.bootstrap.IFC2X3, TestAssignGroup): + pass From c2049246cdc51e7ab6b0018bd26874daeacc9e5c Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 15 May 2024 16:01:06 +0500 Subject: [PATCH 182/429] fix issue adding classification failing to use a None value for the date --- .../ifcopenshell/api/classification/add_classification.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py index ee72bd7585..d0e18d265e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/add_classification.py @@ -110,7 +110,9 @@ class Usecase: "IfcCalendarDate", **ifcopenshell.util.date.datetime2ifc(edition_date, "IfcCalendarDate") ) else: - result.EditionDate = ifcopenshell.util.date.datetime2ifc(edition_date, "IfcDate") + if edition_date: + edition_date = ifcopenshell.util.date.datetime2ifc(edition_date, "IfcDate") + result.EditionDate = edition_date self.relate_to_project(result) From 4e39fb3edd78d63b4285f8d17bd19d9a137c893f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 15 May 2024 16:03:51 +0500 Subject: [PATCH 183/429] fix issue adding layers (name is not optional in ifc) --- src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py index df171a4ded..d3a6c162c8 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py @@ -43,4 +43,4 @@ def add_layer(file: ifcopenshell.file, Name: Optional[str] = None) -> ifcopenshe ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL-FULL-DIMS-N") """ - return file.create_entity("IfcPresentationLayerAssignment", Name=Name) + return file.create_entity("IfcPresentationLayerAssignment", Name=Name or "Unnamed") From fdbe74a432018802432e2e304b4c164da653605d Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 13 May 2024 17:51:19 +0500 Subject: [PATCH 184/429] maintain snake in api calls there were only two methods using camel case for arguments --- .../bim/module/geometry/operator.py | 2 +- .../blenderbim/bim/module/search/operator.py | 4 +- src/blenderbim/blenderbim/tool/sequence.py | 2 +- .../ifcopenshell/api/__init__.py | 18 +++++++++ .../ifcopenshell/api/group/add_group.py | 16 ++++---- .../ifcopenshell/api/group/assign_group.py | 2 +- .../ifcopenshell/api/group/edit_group.py | 2 +- .../ifcopenshell/api/group/remove_group.py | 2 +- .../ifcopenshell/api/group/unassign_group.py | 2 +- .../api/group/update_group_products.py | 2 +- .../ifcopenshell/api/layer/add_layer.py | 10 ++--- .../ifcopenshell/api/layer/assign_layer.py | 2 +- .../ifcopenshell/api/layer/edit_layer.py | 2 +- .../ifcopenshell/api/layer/remove_layer.py | 2 +- .../ifcopenshell/api/layer/unassign_layer.py | 2 +- .../test/api/group/test_add_group.py | 37 +++++++++++++++++++ .../test/api/layer/test_add_layer.py | 34 +++++++++++++++++ .../test/api/root/test_remove_product.py | 2 +- src/ifcopenshell-python/test/api/test_api.py | 11 ++++++ 19 files changed, 127 insertions(+), 27 deletions(-) create mode 100644 src/ifcopenshell-python/test/api/group/test_add_group.py create mode 100644 src/ifcopenshell-python/test/api/layer/test_add_layer.py diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index ad207685e1..d23552506f 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -1050,7 +1050,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): if self.group_name in product_groups_name: return - linked_aggregate_group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), Name=self.group_name) + linked_aggregate_group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), name=self.group_name) ifcopenshell.api.run("group.assign_group", tool.Ifc.get(), products=[element], group=linked_aggregate_group) def custom_incremental_naming_for_element_assembly(old_to_new): diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index 9865e7cd28..c2bc7dba21 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -215,7 +215,7 @@ class SaveSearch(Operator, tool.Ifc.Operator): group = group[0] group.Description = description else: - group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), Name=self.name, Description=description) + group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), name=self.name, description=description) if results: ifcopenshell.api.run("group.assign_group", tool.Ifc.get(), products=list(results), group=group) @@ -368,7 +368,7 @@ class SaveColourscheme(Operator, tool.Ifc.Operator): description = json.dumps( {"type": "BBIM_Search", "colourscheme": colourscheme, "colourscheme_query": query} ) - group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), Name=self.name, Description=description) + group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), name=self.name, description=description) def invoke(self, context, event): return context.window_manager.invoke_props_dialog(self) diff --git a/src/blenderbim/blenderbim/tool/sequence.py b/src/blenderbim/blenderbim/tool/sequence.py index 17c08f3093..618a678f78 100644 --- a/src/blenderbim/blenderbim/tool/sequence.py +++ b/src/blenderbim/blenderbim/tool/sequence.py @@ -1630,7 +1630,7 @@ class Sequence(blenderbim.core.tool.Sequence): group.Description = json.dumps(description) else: description = json.dumps({"type": "BBIM_AnimationColorScheme", "colourscheme": colour_scheme}) - group = tool.Ifc.run("group.add_group", Name=name, Description=description) + group = tool.Ifc.run("group.add_group", name=name, description=description) return group[0] @classmethod diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index b4311519fc..d3d0b2f475 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -67,6 +67,20 @@ def batching_argument_deprecation( return (replace_usecase or usecase_path, settings) +def renamed_arguments_deprecation( + usecase_path: str, settings: dict, arguments_remapped: dict[str, str] +) -> tuple[str, dict]: + for prev_argument, new_argument in arguments_remapped.items(): + if prev_argument in settings: + print( + f"WARNING. `{prev_argument}` argument is deprecated for API method " + f'"{usecase_path}" and should be replaced with `{new_argument}`.' + ) + settings = settings | {new_argument: settings[prev_argument]} + settings.pop(prev_argument) + return (usecase_path, settings) + + ARGUMENTS_DEPRECATION = { "spatial.assign_container": partial( batching_argument_deprecation, prev_argument="product", new_argument="products" @@ -143,6 +157,10 @@ ARGUMENTS_DEPRECATION = { "project.unassign_declaration": partial( batching_argument_deprecation, prev_argument="definition", new_argument="definitions" ), + "group.add_group": partial( + renamed_arguments_deprecation, arguments_remapped={"Name": "name", "Description": "description"} + ), + "layer.add_layer": partial(renamed_arguments_deprecation, arguments_remapped={"Name": "name"}), } diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py index 44553bddcf..bce9ca61bd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/add_group.py @@ -23,7 +23,7 @@ from typing import Optional def add_group( - file: ifcopenshell.file, Name: str = "Unnamed", Description: Optional[str] = None + file: ifcopenshell.file, name: str = "Unnamed", description: Optional[str] = None ) -> ifcopenshell.entity_instance: """Adds a new group @@ -37,8 +37,8 @@ def add_group( :param Name: The name of the group. Defaults to "Unnamed" :type Name: str, optional - :param Description: The description of the purpose of the group. - :type Description: str, optional + :param description: The description of the purpose of the group. + :type description: str, optional :return: The newly created IfcGroup :rtype: ifcopenshell.entity_instance @@ -46,11 +46,11 @@ def add_group( .. code:: python - ifcopenshell.api.run("group.add_group", model, Name="Unit 1A") + ifcopenshell.api.run("group.add_group", model, name="Unit 1A") """ settings = { - "Name": Name or "Unnamed", - "Description": Description, + "name": name or "Unnamed", + "description": description, } return file.create_entity( @@ -58,7 +58,7 @@ def add_group( **{ "GlobalId": ifcopenshell.guid.new(), "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), - "Name": settings["Name"], - "Description": settings["Description"], + "Name": settings["name"], + "Description": settings["description"], } ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py index a11b15c6de..0edceb9fa2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/assign_group.py @@ -42,7 +42,7 @@ def assign_group( .. code:: python - group = ifcopenshell.api.run("group.add_group", model, Name="Furniture") + group = ifcopenshell.api.run("group.add_group", model, name="Furniture") ifcopenshell.api.run("group.assign_group", model, products=model.by_type("IfcFurniture"), group=group) """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py index 912b3c30c9..dca5f781f4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/edit_group.py @@ -36,7 +36,7 @@ def edit_group(file: ifcopenshell.file, group: ifcopenshell.entity_instance, att .. code:: python - group = ifcopenshell.api.run("group.add_group", model, Name="Unit 1A") + group = ifcopenshell.api.run("group.add_group", model, name="Unit 1A") ifcopenshell.api.run("group.edit_group", model, group=group, attributes={"Description": "All furniture and joinery included in the unit"}) """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py index d17806d6c3..9097e1e229 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/remove_group.py @@ -36,7 +36,7 @@ def remove_group(file: ifcopenshell.file, group: ifcopenshell.entity_instance) - .. code:: python - group = ifcopenshell.api.run("group.add_group", model, Name="Unit 1A") + group = ifcopenshell.api.run("group.add_group", model, name="Unit 1A") ifcopenshell.api.run("group.remove_group", model, group=group) """ settings = {"group": group} diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py b/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py index c486cceab6..7d181455cc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/unassign_group.py @@ -39,7 +39,7 @@ def unassign_group( .. code:: python - group = ifcopenshell.api.run("group.add_group", model, Name="Furniture") + group = ifcopenshell.api.run("group.add_group", model, name="Furniture") furniture = model.by_type("IfcFurniture") ifcopenshell.api.run("group.assign_group", model, products=furniture, group=group) diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py index c68992f7a3..dda9ba954d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py @@ -40,7 +40,7 @@ def update_group_products( .. code:: python - group = ifcopenshell.api.run("group.add_group", model, Name="Furniture") + group = ifcopenshell.api.run("group.add_group", model, name="Furniture") ifcopenshell.api.run("group.update_group_products", model, products=model.by_type("IfcFurniture"), group=group) """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py index d3a6c162c8..d09675cabe 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/add_layer.py @@ -19,7 +19,7 @@ import ifcopenshell from typing import Optional -def add_layer(file: ifcopenshell.file, Name: Optional[str] = None) -> ifcopenshell.entity_instance: +def add_layer(file: ifcopenshell.file, name: str = "Unnamed") -> ifcopenshell.entity_instance: """Adds a new layer An IFC layer is like a CAD layer. Portions of an object's geometry @@ -34,13 +34,13 @@ def add_layer(file: ifcopenshell.file, Name: Optional[str] = None) -> ifcopenshe Some software that are still based on layers, such as Tekla or ArchiCAD may also use this layer information for filtering. - :param Name: The name of the layer. Defaults to "Unnamed". - :type Name: str, optional + :param name: The name of the layer. Defaults to "Unnamed". + :type name: str, optional :return: The newly created IfcPresentationLayerAssignment element :rtype: ifcopenshell.entity_instance Example: - ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL-FULL-DIMS-N") + ifcopenshell.api.run("layer.add_layer", model, name="AI-WALL-FULL-DIMS-N") """ - return file.create_entity("IfcPresentationLayerAssignment", Name=Name or "Unnamed") + return file.create_entity("IfcPresentationLayerAssignment", Name=name) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py index 70926625c3..9c7cbd4c46 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/assign_layer.py @@ -59,7 +59,7 @@ def assign_layer( ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) # Now let's create a layer that contains walls - layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") + layer = ifcopenshell.api.run("layer.add_layer", model, name="AI-WALL") # And assign our wall representation item (in this example, there is # only one item) to the layer. diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py index 1590cc4559..9ef941c82d 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/edit_layer.py @@ -36,7 +36,7 @@ def edit_layer(file: ifcopenshell.file, layer: ifcopenshell.entity_instance, att .. code:: python - layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") + layer = ifcopenshell.api.run("layer.add_layer", model, name="AI-WALL") ifcopenshell.api.run("layer.edit_layer", model, layer=layer, attributes={"Description": "All walls, based on the AIA standard."}) """ diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py index 27b3e80ac1..d576897fd6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/remove_layer.py @@ -33,7 +33,7 @@ def remove_layer(file: ifcopenshell.file, layer: ifcopenshell.entity_instance) - .. code:: python - layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") + layer = ifcopenshell.api.run("layer.add_layer", model, name="AI-WALL") ifcopenshell.api.run("layer.remove_layer", model, layer=layer) """ file.remove(layer) diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py b/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py index 9418a28ad6..3fde793058 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/unassign_layer.py @@ -56,7 +56,7 @@ def unassign_layer( ifcopenshell.api.run("geometry.edit_object_placement", model, product=wall) # Now let's create a layer that contains walls - layer = ifcopenshell.api.run("layer.add_layer", model, Name="AI-WALL") + layer = ifcopenshell.api.run("layer.add_layer", model, name="AI-WALL") # And assign our wall representation item (in this example, there is # only one item) to the layer. diff --git a/src/ifcopenshell-python/test/api/group/test_add_group.py b/src/ifcopenshell-python/test/api/group/test_add_group.py new file mode 100644 index 0000000000..49e5379ade --- /dev/null +++ b/src/ifcopenshell-python/test/api/group/test_add_group.py @@ -0,0 +1,37 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api +import ifcopenshell.util.element + + +class TestAddGroup(test.bootstrap.IFC4): + def test_add_group_no_arguments(self): + group = ifcopenshell.api.run("group.add_group", self.file) + assert group.Name == "Unnamed" + assert group.Description == None + + def test_add_group(self): + group = ifcopenshell.api.run("group.add_group", self.file, name="Name", description="Description") + assert group.Name == "Name" + assert group.Description == "Description" + + +class TestAddGroupIFC2X3(test.bootstrap.IFC2X3, TestAddGroup): + pass diff --git a/src/ifcopenshell-python/test/api/layer/test_add_layer.py b/src/ifcopenshell-python/test/api/layer/test_add_layer.py new file mode 100644 index 0000000000..8889674075 --- /dev/null +++ b/src/ifcopenshell-python/test/api/layer/test_add_layer.py @@ -0,0 +1,34 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api + + +class TestAddLayer(test.bootstrap.IFC4): + def test_add_layer_no_arguments(self): + layer = ifcopenshell.api.run("layer.add_layer", self.file) + assert layer.Name == "Unnamed" + + def test_assign_additional_items(self): + layer = ifcopenshell.api.run("layer.add_layer", self.file, name="Name") + assert layer.Name == "Name" + + +class TestAddLayerIFC2X3(test.bootstrap.IFC2X3, TestAddLayer): + pass diff --git a/src/ifcopenshell-python/test/api/root/test_remove_product.py b/src/ifcopenshell-python/test/api/root/test_remove_product.py index ebfaa8a4d8..176d39be25 100644 --- a/src/ifcopenshell-python/test/api/root/test_remove_product.py +++ b/src/ifcopenshell-python/test/api/root/test_remove_product.py @@ -409,7 +409,7 @@ class TestRemoveProduct(test.bootstrap.IFC4): def test_removing_orphaned_group_relationships(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - group = ifcopenshell.api.run("group.add_group", self.file, Name="Unit 1A") + group = ifcopenshell.api.run("group.add_group", self.file, name="Unit 1A") ifcopenshell.api.run("group.assign_group", self.file, products=[element], group=group) ifcopenshell.api.run("root.remove_product", self.file, product=element) assert not self.file.by_type("IfcRelAssignsToGroup") diff --git a/src/ifcopenshell-python/test/api/test_api.py b/src/ifcopenshell-python/test/api/test_api.py index 00d33b8b8a..40e2135127 100644 --- a/src/ifcopenshell-python/test/api/test_api.py +++ b/src/ifcopenshell-python/test/api/test_api.py @@ -348,3 +348,14 @@ class TestTemporarySupportForDeprecatedAPIArguments(test.bootstrap.IFC4): ) assert get_context(element_type) == None assert len(self.file.by_type("IfcRelDeclares")) == 0 + + @deprecation_check + def test_add_group(self): + group = ifcopenshell.api.run("group.add_group", self.file, Name="Name", Description="Description") + assert group.Name == "Name" + assert group.Description == "Description" + + @deprecation_check + def test_add_layer(self): + layer = ifcopenshell.api.run("layer.add_layer", self.file, Name="Name") + assert layer.Name == "Name" From a2ee920a5fd60b39c2815d63f57a0f2ab727f137 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 15 May 2024 17:09:49 +0500 Subject: [PATCH 185/429] fix group.update_group_products to work with multiple rels --- .../api/group/update_group_products.py | 21 +++++--- .../api/group/test_update_group_products.py | 54 +++++++++++++++++++ 2 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 src/ifcopenshell-python/test/api/group/test_update_group_products.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py index dda9ba954d..d71f31a2ff 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/update_group_products.py @@ -19,6 +19,7 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.guid +import ifcopenshell.util.element def update_group_products( @@ -60,11 +61,17 @@ def update_group_products( } ) else: - # assumes 1:1 cardinality, will need to be updated to reflect IFC4 changes - # where the cardinality is 0:? - vulevukusej - rel = settings["group"].IsGroupedBy[0] - existing_sub_groups = [g for g in rel.RelatedObjects if g.is_a("IfcGroup")] + rels = settings["group"].IsGroupedBy + objects = set(settings["products"]) + for rel in rels: + objects.update([g for g in rel.RelatedObjects if g.is_a("IfcGroup")]) + to_purge = rels[1:] - rel.RelatedObjects = settings["products"] - for g in existing_sub_groups: - rel.RelatedObjects.add(g) + for rel in to_purge: + history = rel.OwnerHistory + file.remove(rel) + if history: + ifcopenshell.util.element.remove_deep2(file, history) + + rels[0].RelatedObjects = list(objects) + return rels[0] diff --git a/src/ifcopenshell-python/test/api/group/test_update_group_products.py b/src/ifcopenshell-python/test/api/group/test_update_group_products.py new file mode 100644 index 0000000000..bd08bab0a7 --- /dev/null +++ b/src/ifcopenshell-python/test/api/group/test_update_group_products.py @@ -0,0 +1,54 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2022 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api +import ifcopenshell.util.element + + +class TestUpdateGroupProductsIFC2X3(test.bootstrap.IFC2X3): + def test_update_group_without_products(self): + elements = [ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") for i in range(4)] + group = ifcopenshell.api.run("group.add_group", self.file) + ifcopenshell.api.run("group.update_group_products", self.file, products=elements, group=group) + assert set(ifcopenshell.util.element.get_grouped_by(group)) == set(elements) + + def test_update_group_products(self): + elements = [ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") for i in range(4)] + group = ifcopenshell.api.run("group.add_group", self.file) + ifcopenshell.api.run("group.assign_group", self.file, products=elements[:2], group=group) + ifcopenshell.api.run("group.update_group_products", self.file, products=elements[2:], group=group) + assert set(ifcopenshell.util.element.get_grouped_by(group)) == set(elements[2:]) + assert ifcopenshell.util.element.get_groups(elements[0]) == [] + assert ifcopenshell.util.element.get_groups(elements[1]) == [] + + +class TestUpdateGroupProductsIFC4(test.bootstrap.IFC4, TestUpdateGroupProductsIFC2X3): + def test_update_group_products(self): + # in ifc4 IfcGroup can have multiple rels + elements = [ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") for i in range(4)] + group = ifcopenshell.api.run("group.add_group", self.file) + + self.file.create_entity("IfcRelAssignsToGroup", RelatingGroup=group, RelatedObjects=elements[:1]) + self.file.create_entity("IfcRelAssignsToGroup", RelatingGroup=group, RelatedObjects=elements[1:2]) + + ifcopenshell.api.run("group.update_group_products", self.file, products=elements[2:], group=group) + assert len(self.file.by_type("IfcRelAssignsToGroup")) == 1 + assert set(ifcopenshell.util.element.get_grouped_by(group)) == set(elements[2:]) + assert ifcopenshell.util.element.get_groups(elements[0]) == [] + assert ifcopenshell.util.element.get_groups(elements[1]) == [] From e1250f21775e52b9604374276050499ae23cd79b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 16 May 2024 16:00:38 +0500 Subject: [PATCH 186/429] fix saving debug info to clipboard #4675 now we just rely on blender to make it crossplatform --- src/blenderbim/blenderbim/__init__.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/blenderbim/blenderbim/__init__.py b/src/blenderbim/blenderbim/__init__.py index e54b2d04ac..3a31cbdf26 100644 --- a/src/blenderbim/blenderbim/__init__.py +++ b/src/blenderbim/blenderbim/__init__.py @@ -149,14 +149,7 @@ if sys.modules.get("bpy", None): def execute(self, context): info = format_debug_info(get_debug_info()) - - if platform.system() == "Windows": - command = "echo | set /p nul=" + info - elif platform.system() == "Darwin": # for MacOS - command = 'printf "' + info.replace("\n", "\\n").replace('"', "") + '" | pbcopy' - else: # Linux - command = 'printf "' + info.replace("\n", "\\n").replace('"', "") + '" | xclip -selection clipboard' - subprocess.run(command, shell=True, check=True) + context.window_manager.clipboard = info return {"FINISHED"} class HiddenPanel: From 8d4b5d83e1652dc99c4d79937d78ed9489a57f2a Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 16 May 2024 16:13:22 +0500 Subject: [PATCH 187/429] same as e1250f217 --- src/blenderbim/blenderbim/bim/module/debug/operator.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/debug/operator.py b/src/blenderbim/blenderbim/bim/module/debug/operator.py index 412d08fd43..8a53d6de83 100644 --- a/src/blenderbim/blenderbim/bim/module/debug/operator.py +++ b/src/blenderbim/blenderbim/bim/module/debug/operator.py @@ -60,13 +60,7 @@ class CopyDebugInformation(bpy.types.Operator): print(text) print("-" * 80) - if platform.system() == "Windows": - command = "echo | set /p nul=" + text - elif platform.system() == "Darwin": # for MacOS - command = 'printf "' + text.replace("\n", "\\n").replace('"', "") + '" | pbcopy' - else: # Linux - command = 'printf "' + text.replace("\n", "\\n").replace('"', "") + '" | xclip -selection clipboard' - subprocess.run(command, shell=True, check=True) + context.window_manager.clipboard = text return {"FINISHED"} From 38844032313a571bd34762cfcb32d376e7ed7376 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 16 May 2024 16:27:41 +0500 Subject: [PATCH 188/429] typing --- src/blenderbim/blenderbim/bim/import_ifc.py | 20 ++++++------ .../blenderbim/bim/module/misc/operator.py | 14 ++++++-- src/blenderbim/blenderbim/core/geometry.py | 32 ++++++++++++------- src/blenderbim/blenderbim/core/root.py | 32 ++++++++++++------- src/blenderbim/blenderbim/core/spatial.py | 2 +- src/blenderbim/blenderbim/tool/geometry.py | 15 ++++++--- src/blenderbim/blenderbim/tool/misc.py | 4 ++- src/blenderbim/blenderbim/tool/project.py | 1 + src/blenderbim/blenderbim/tool/root.py | 11 +++++-- .../ifcopenshell/util/element.py | 4 +-- 10 files changed, 89 insertions(+), 46 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 81f20c809e..f2e5532feb 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -26,6 +26,7 @@ import bmesh import logging import mathutils import numpy as np +import numpy.typing as npt import multiprocessing import ifcopenshell import ifcopenshell.geom @@ -303,22 +304,22 @@ class IfcImporter: self.update_progress(100) bpy.context.window_manager.progress_end() - def is_element_far_away(self, element): + def is_element_far_away(self, element: ifcopenshell.entity_instance) -> bool: try: placement = ifcopenshell.util.placement.get_local_placement(element.ObjectPlacement) point = placement[:, 3][0:3] return self.is_point_far_away(point, is_meters=False) except: - pass + return False - def is_point_far_away(self, point, is_meters=True): + def is_point_far_away( + self, point: Union[ifcopenshell.entity_instance, npt.NDArray[np.float64]], is_meters: bool = True + ) -> bool: # Locations greater than 1km are not considered "small sites" according to the georeferencing guide # Users can configure this if they have to handle larger sites but beware of surveying precision limit = self.ifc_import_settings.distance_limit limit = limit if is_meters else (limit / self.unit_scale) - coords = point - if hasattr(point, "Coordinates"): - coords = point.Coordinates + coords = getattr(point, "Coordinates", point) return abs(coords[0]) > limit or abs(coords[1]) > limit or abs(coords[2]) > limit def process_context_filter(self): @@ -683,7 +684,7 @@ class IfcImporter: props.blender_orthogonal_height = str(offset_point[2]) props.has_blender_offset = True - def get_offset_point(self): + def get_offset_point(self) -> Union[npt.NDArray[np.float64], None]: elements_checked = 0 # If more than these elements aren't far away, the file probably isn't absolutely positioned element_checking_threshold = 10 @@ -718,7 +719,7 @@ class IfcImporter: if self.is_point_far_away(point, is_meters=False): return point - def does_element_likely_have_geometry_far_away(self, element): + def does_element_likely_have_geometry_far_away(self, element: ifcopenshell.entity_instance) -> bool: for representation in element.Representation.Representations: items = [] for item in representation.Items: @@ -735,13 +736,14 @@ class IfcImporter: if subelement.is_a("IfcCartesianPoint"): if len(subelement.Coordinates) == 3 and self.is_point_far_away(subelement, is_meters=False): return True + return False def apply_blender_offset_to_matrix_world(self, obj: bpy.types.Object, matrix: np.ndarray) -> mathutils.Matrix: props = bpy.context.scene.BIMGeoreferenceProperties if props.has_blender_offset: if obj.data and obj.data.get("has_cartesian_point_offset", None): obj.BIMObjectProperties.blender_offset_type = "CARTESIAN_POINT" - elif self.is_point_far_away((matrix[0, 3], matrix[1, 3], matrix[2, 3])): + elif self.is_point_far_away((matrix[:3, 3])): obj.BIMObjectProperties.blender_offset_type = "OBJECT_PLACEMENT" matrix = ifcopenshell.util.geolocation.global2local( matrix, diff --git a/src/blenderbim/blenderbim/bim/module/misc/operator.py b/src/blenderbim/blenderbim/bim/module/misc/operator.py index 6806c3635a..ed2e714d32 100644 --- a/src/blenderbim/blenderbim/bim/module/misc/operator.py +++ b/src/blenderbim/blenderbim/bim/module/misc/operator.py @@ -23,6 +23,7 @@ import blenderbim.bim.handler import blenderbim.tool as tool import blenderbim.core.misc as core import blenderbim.core.geometry as core_geometry +import blenderbim.core.root from blenderbim.bim.ifc import IfcStore from mathutils import Vector, Matrix, Euler @@ -144,6 +145,7 @@ class SplitAlongEdge(bpy.types.Operator, Operator): cutter = context.active_object objs = [o for o in context.selected_objects if o != cutter] + objs_to_cut = [] # Splitting only works on meshes for obj in objs: # You cannot split meshes if the representation is mapped. @@ -153,7 +155,13 @@ class SplitAlongEdge(bpy.types.Operator, Operator): if relating_type and tool.Root.does_type_have_representations(relating_type): bpy.ops.bim.unassign_type(related_object=obj.name) + # refresh representation representation = tool.Geometry.get_active_representation(obj) + + # skip empty objects that might get in the way + if not representation: + continue + core_geometry.switch_representation( tool.Ifc, tool.Geometry, @@ -168,11 +176,13 @@ class SplitAlongEdge(bpy.types.Operator, Operator): if not tool.Geometry.is_meshlike(representation): bpy.ops.bim.update_representation(obj=obj.name, ifc_representation_class="IfcTessellatedFaceSet") - new_objs = tool.Misc.split_objects_with_cutter(objs, cutter) + objs_to_cut.append(obj) + + new_objs = tool.Misc.split_objects_with_cutter(objs_to_cut, cutter) for obj in new_objs: blenderbim.core.root.copy_class(tool.Ifc, tool.Collector, tool.Geometry, tool.Root, obj=obj) bpy.ops.bim.update_representation(obj=obj.name) - for obj in objs: + for obj in objs_to_cut: bpy.ops.bim.update_representation(obj=obj.name) representation = tool.Geometry.get_active_representation(obj) diff --git a/src/blenderbim/blenderbim/core/geometry.py b/src/blenderbim/blenderbim/core/geometry.py index 7e68829c2a..e2b27cc35e 100644 --- a/src/blenderbim/blenderbim/core/geometry.py +++ b/src/blenderbim/blenderbim/core/geometry.py @@ -18,10 +18,11 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional -import blenderbim.core.tool as tool if TYPE_CHECKING: import bpy + import ifcopenshell + import blenderbim.tool as tool def edit_object_placement( @@ -37,8 +38,15 @@ def edit_object_placement( def add_representation( - ifc, geometry, style, surveyor, obj=None, context=None, ifc_representation_class=None, profile_set_usage=None -): + ifc: tool.Ifc, + geometry: tool.Geometry, + style: tool.Style, + surveyor: tool.Surveyor, + obj: bpy.types.Object, + context: ifcopenshell.entity_instance, + ifc_representation_class: Optional[str] = None, + profile_set_usage: Optional[ifcopenshell.entity_instance] = None, +) -> ifcopenshell.entity_instance: element = ifc.get_entity(obj) if not element: return @@ -89,15 +97,15 @@ def add_representation( def switch_representation( - ifc, - geometry, - obj=None, - representation=None, - should_reload=True, - is_global=True, - should_sync_changes_first=False, - apply_openings=True, -): + ifc: tool.Ifc, + geometry: tool.Geometry, + obj: bpy.types.Object, + representation: ifcopenshell.entity_instance, + should_reload: bool = True, + is_global: bool = True, + should_sync_changes_first: bool = False, + apply_openings: bool = True, +) -> None: """Function can switch to representation that wasn't yet assigned to that object. See #2766. `should_sync_changes_first` - sync ifc representation with current state of `obj.data`; diff --git a/src/blenderbim/blenderbim/core/root.py b/src/blenderbim/blenderbim/core/root.py index 3f36c39adb..e7f6bbb96c 100644 --- a/src/blenderbim/blenderbim/core/root.py +++ b/src/blenderbim/blenderbim/core/root.py @@ -16,8 +16,18 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from __future__ import annotations +from typing import TYPE_CHECKING, Optional -def copy_class(ifc, collector, geometry, root, obj=None): +if TYPE_CHECKING: + import bpy + import ifcopenshell + import blenderbim.tool as tool + + +def copy_class( + ifc: tool.Ifc, collector: tool.Collector, geometry: tool.Geometry, root: tool.Root, obj: bpy.types.Object +) -> ifcopenshell.entity_instance: element = ifc.get_entity(obj) if not element: return @@ -48,16 +58,16 @@ def copy_class(ifc, collector, geometry, root, obj=None): def assign_class( - ifc, - collector, - root, - obj=None, - ifc_class=None, - predefined_type=None, - should_add_representation=True, - context=None, - ifc_representation_class=None, -): + ifc: tool.Ifc, + collector: tool.Collector, + root: tool.Root, + obj: bpy.types.Object, + ifc_class: str, + context: ifcopenshell.entity_instance, + predefined_type: Optional[str] = None, + should_add_representation: bool = True, + ifc_representation_class: Optional[str] = None, +) -> ifcopenshell.entity_instance: if ifc.get_entity(obj): return diff --git a/src/blenderbim/blenderbim/core/spatial.py b/src/blenderbim/blenderbim/core/spatial.py index 139eeef46a..8a45ff8225 100644 --- a/src/blenderbim/blenderbim/core/spatial.py +++ b/src/blenderbim/blenderbim/core/spatial.py @@ -18,11 +18,11 @@ from __future__ import annotations from typing import TYPE_CHECKING, Optional, Union -import blenderbim.core.tool as tool if TYPE_CHECKING: import bpy import ifcopenshell + import blenderbim.tool as tool def reference_structure( diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index ba2896839b..77c8c7eefb 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -26,6 +26,7 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.guid import ifcopenshell.util.element +import ifcopenshell.util.representation import ifcopenshell.util.system import blenderbim.core.tool import blenderbim.core.drawing @@ -319,7 +320,7 @@ class Geometry(blenderbim.core.tool.Geometry): return new_mesh @classmethod - def get_active_representation(cls, obj): + def get_active_representation(cls, obj: bpy.types.Object) -> Union[ifcopenshell.entity_instance, None]: """< IfcShapeRepresentation or None""" if obj.data and hasattr(obj.data, "BIMMeshProperties") and obj.data.BIMMeshProperties.ifc_definition_id: return tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) @@ -459,7 +460,9 @@ class Geometry(blenderbim.core.tool.Geometry): return f"{representation.ContextOfItems.id()}/{representation.id()}" @classmethod - def get_styles(cls, obj, only_assigned_to_faces=False): + def get_styles( + cls, obj: bpy.types.Object, only_assigned_to_faces: bool = False + ) -> list[Union[ifcopenshell.entity_instance, None]]: styles = [tool.Style.get_style(s.material) for s in obj.material_slots if s.material] if not only_assigned_to_faces: return styles @@ -572,11 +575,11 @@ class Geometry(blenderbim.core.tool.Geometry): return not all([tool.Cad.is_x(o, 1.0) for o in obj.scale]) or obj in IfcStore.edited_objs @classmethod - def is_mapped_representation(cls, representation): + def is_mapped_representation(cls, representation: ifcopenshell.entity_instance) -> bool: return representation.RepresentationType == "MappedRepresentation" @classmethod - def is_meshlike(cls, representation): + def is_meshlike(cls, representation: ifcopenshell.entity_instance) -> bool: if ifcopenshell.util.representation.resolve_representation(representation).RepresentationType in ( "AdvancedBrep", "Annotation2D", @@ -656,7 +659,9 @@ class Geometry(blenderbim.core.tool.Geometry): bpy.data.objects.remove(obj) @classmethod - def resolve_mapped_representation(cls, representation): + def resolve_mapped_representation( + cls, representation: ifcopenshell.entity_instance + ) -> ifcopenshell.entity_instance: if representation.RepresentationType == "MappedRepresentation": return cls.resolve_mapped_representation(representation.Items[0].MappingSource.MappedRepresentation) return representation diff --git a/src/blenderbim/blenderbim/tool/misc.py b/src/blenderbim/blenderbim/tool/misc.py index 293e877a09..68e263eaaf 100644 --- a/src/blenderbim/blenderbim/tool/misc.py +++ b/src/blenderbim/blenderbim/tool/misc.py @@ -97,7 +97,9 @@ class Misc(blenderbim.core.tool.Misc): IfcStore.edited_objs.add(obj) @classmethod - def split_objects_with_cutter(cls, objs, cutter): + def split_objects_with_cutter( + cls, objs: list[bpy.types.Object], cutter: bpy.types.Object + ) -> list[bpy.types.Object]: cutter_mesh = cutter.data bm = bmesh.new() diff --git a/src/blenderbim/blenderbim/tool/project.py b/src/blenderbim/blenderbim/tool/project.py index a73ae431a8..9c8cd7aaaa 100644 --- a/src/blenderbim/blenderbim/tool/project.py +++ b/src/blenderbim/blenderbim/tool/project.py @@ -21,6 +21,7 @@ import bpy import ifcopenshell import ifcopenshell.util.unit import blenderbim.core.tool +import blenderbim.core.root import blenderbim.bim.schema import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore diff --git a/src/blenderbim/blenderbim/tool/root.py b/src/blenderbim/blenderbim/tool/root.py index 8a9273eb10..e83c470bbd 100644 --- a/src/blenderbim/blenderbim/tool/root.py +++ b/src/blenderbim/blenderbim/tool/root.py @@ -29,6 +29,7 @@ import blenderbim.core.style import blenderbim.tool as tool from mathutils import Vector from blenderbim.bim.module.model.opening import FilledOpeningGenerator +from typing import Union, Optional class Root(blenderbim.core.tool.Root): @@ -129,7 +130,7 @@ class Root(blenderbim.core.tool.Root): return ifcopenshell.util.representation.get_representation(element, context=context.ContextType) @classmethod - def get_element_type(cls, element): + def get_element_type(cls, element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: return ifcopenshell.util.element.get_type(element) @classmethod @@ -282,8 +283,12 @@ class Root(blenderbim.core.tool.Root): @classmethod def run_geometry_add_representation( - cls, obj=None, context=None, ifc_representation_class=None, profile_set_usage=None - ): + cls, + obj: bpy.types.Object, + context: ifcopenshell.entity_instance, + ifc_representation_class: Optional[str] = None, + profile_set_usage: Optional[ifcopenshell.entity_instance] = None, + ) -> ifcopenshell.entity_instance: return blenderbim.core.geometry.add_representation( tool.Ifc, tool.Geometry, diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 60ac89044c..c192e037e9 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -446,13 +446,13 @@ def get_predefined_type(element: ifcopenshell.entity_instance) -> str: return predefined_type -def get_type(element: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: +def get_type(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: """Retrieves the construction type element of an element occurrence :param element: The element occurrence :type: ifcopenshell.entity_instance :return: The related type element - :rtype: ifcopenshell.entity_instance + :rtype: Union[ifcopenshell.entity_instance, None] Example: From d001180082c96c697caf90b70bacd75274f873db Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 16 May 2024 17:20:00 +0500 Subject: [PATCH 189/429] remove unused code --- src/blenderbim/blenderbim/bim/module/model/profile.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/profile.py b/src/blenderbim/blenderbim/bim/module/model/profile.py index c7b0af7b78..cabffba831 100644 --- a/src/blenderbim/blenderbim/bim/module/model/profile.py +++ b/src/blenderbim/blenderbim/bim/module/model/profile.py @@ -931,13 +931,11 @@ class PatchNonParametricMepSegment(bpy.types.Operator, tool.Ifc.Operator): return context.active_object def _execute(self, context): - styles = tool.Geometry.get_styles(context.active_object) blenderbim.core.material.patch_non_parametric_mep_segment( tool.Ifc, tool.Material, tool.Profile, obj=context.active_object ) bpy.ops.bim.enable_editing_extrusion_axis() bpy.ops.bim.edit_extrusion_axis() - styles = tool.Geometry.get_styles(context.active_object) class EnableEditingExtrusionAxis(bpy.types.Operator, tool.Ifc.Operator): From eaa80ad08a6ceb77f933a37a31eeffcf83200246 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 16 May 2024 17:27:03 +0500 Subject: [PATCH 190/429] fix issue getting styles if object had empty mat slots Occurred only with only_assigned_to_faces = True A bit related to #4675 Error was styles = [style for style, usage in zip(styles, usage_count, strict=True) if usage > 0] ValueError: zip() argument 2 is longer than argument 1 --- src/blenderbim/blenderbim/tool/geometry.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 77c8c7eefb..3133115c62 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -470,8 +470,15 @@ class Geometry(blenderbim.core.tool.Geometry): usage_count = [0] * len(obj.material_slots) if not usage_count: # if there are no materials, polygons will still use index 0 return [] + for poly in obj.data.polygons: usage_count[poly.material_index] += 1 + + # remove usages for empty material slots + for i, slot in reversed(list(enumerate(obj.material_slots))): + if not slot.material: + del usage_count[i] + styles = [style for style, usage in zip(styles, usage_count, strict=True) if usage > 0] return styles From 6995cafe63f3e38c18ade4fedabea4f0741c191e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 16 May 2024 17:33:27 +0500 Subject: [PATCH 191/429] bim.split_along_edge fixes #4675 1) description to emphasize that active object will be the one that's cutting 2) skip non-ifc elements, previously they failed to process with error `AttributeError: 'NoneType' object has no attribute 'RepresentationType'`. Also skip objects without representations. 3) add an info message at the end Here's a short gif in case if anyone doesn't about that feature: https://imgur.com/a/338w7jx --- .../blenderbim/bim/module/misc/operator.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/misc/operator.py b/src/blenderbim/blenderbim/bim/module/misc/operator.py index ed2e714d32..aed020dcc9 100644 --- a/src/blenderbim/blenderbim/bim/module/misc/operator.py +++ b/src/blenderbim/blenderbim/bim/module/misc/operator.py @@ -135,6 +135,10 @@ class ResizeToStorey(bpy.types.Operator, Operator): class SplitAlongEdge(bpy.types.Operator, Operator): bl_idname = "bim.split_along_edge" bl_label = "Split Along Edge" + bl_description = ( + "Active object is considered to be a cutting object." + "Will unassign element from a type if type has a representation." + ) bl_options = {"REGISTER", "UNDO"} @classmethod @@ -150,10 +154,12 @@ class SplitAlongEdge(bpy.types.Operator, Operator): for obj in objs: # You cannot split meshes if the representation is mapped. element = tool.Ifc.get_entity(obj) - if element: - relating_type = tool.Root.get_element_type(element) - if relating_type and tool.Root.does_type_have_representations(relating_type): - bpy.ops.bim.unassign_type(related_object=obj.name) + if not element: + continue + + relating_type = tool.Root.get_element_type(element) + if relating_type and tool.Root.does_type_have_representations(relating_type): + bpy.ops.bim.unassign_type(related_object=obj.name) # refresh representation representation = tool.Geometry.get_active_representation(obj) @@ -197,6 +203,8 @@ class SplitAlongEdge(bpy.types.Operator, Operator): apply_openings=True, ) + self.report({"INFO"}, f"Splitting finished, {len(new_objs)} new objects created.") + class GetConnectedSystemElements(bpy.types.Operator, Operator): bl_idname = "bim.get_connected_system_elements" From 9969de58cb3ad433ce0227a22d688ab4f8652429 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 16 May 2024 17:42:36 +0500 Subject: [PATCH 192/429] add a console toggle to error message section --- src/blenderbim/blenderbim/__init__.py | 2 +- src/blenderbim/blenderbim/bim/ui.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/__init__.py b/src/blenderbim/blenderbim/__init__.py index 3a31cbdf26..de00a88d72 100644 --- a/src/blenderbim/blenderbim/__init__.py +++ b/src/blenderbim/blenderbim/__init__.py @@ -122,7 +122,7 @@ if sys.modules.get("bpy", None): def draw(self, context): layout = self.layout layout.label(text="BlenderBIM could not load.", icon="ERROR") - layout.label(text="View the console for full logs.", icon="CONSOLE") + layout.operator("wm.console_toggle", text="View the console for full logs.", icon="CONSOLE") box = layout.box() info = get_debug_info() py = ".".join(info["python_version"].split(".")[0:2]) diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 017304a123..a2647ffbd1 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -410,7 +410,7 @@ class BIM_PT_tabs(Panel): row = box.row(align=True) row.label(text="BlenderBIM experienced an error :(", icon="ERROR") row.operator("bim.close_error", text="", icon="CANCEL") - box.label(text="View the console for full logs.", icon="CONSOLE") + box.operator("wm.console_toggle", text="View the console for full logs.", icon="CONSOLE") box.operator("bim.copy_debug_information", text="Copy Error Message To Clipboard") op = box.operator("bim.open_uri", text="How Can I Fix This?") op.uri = "https://docs.blenderbim.org/users/troubleshooting.html" From a66ee06e3d7df324a1a6bef714504ba6f078319a Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 11:00:38 +0500 Subject: [PATCH 193/429] dev environment - add bcf --- src/blenderbim/docs/devs/installation.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/blenderbim/docs/devs/installation.rst b/src/blenderbim/docs/devs/installation.rst index bda42056bc..31200d4fb2 100644 --- a/src/blenderbim/docs/devs/installation.rst +++ b/src/blenderbim/docs/devs/installation.rst @@ -105,6 +105,7 @@ For Linux or Mac: $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifccsv.py $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifcdiff.py $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/bsdd.py + $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/bcf $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifc4d $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifc5d $ rm -r $BLENDER_ADDON_PATH/libs/site/packages/ifccityjson @@ -117,6 +118,7 @@ For Linux or Mac: $ ln -s $PWD/src/ifccsv/ifccsv.py $BLENDER_ADDON_PATH/libs/site/packages/ifccsv.py $ ln -s $PWD/src/ifcdiff/ifcdiff.py $BLENDER_ADDON_PATH/libs/site/packages/ifcdiff.py $ ln -s $PWD/src/bsdd/bsdd.py $BLENDER_ADDON_PATH/libs/site/packages/bsdd.py + $ ln -s $PWD/src/bcf/src/bcf $BLENDER_ADDON_PATH/libs/site/packages/bcf $ ln -s $PWD/src/ifc4d/ifc4d $BLENDER_ADDON_PATH/libs/site/packages/ifc4d $ ln -s $PWD/src/ifc5d/ifc5d $BLENDER_ADDON_PATH/libs/site/packages/ifc5d $ ln -s $PWD/src/ifccityjson/ifccityjson $BLENDER_ADDON_PATH/libs/site/packages/ifccityjson @@ -172,6 +174,7 @@ Before running it follow the instructions descibed after `rem` tags. del "%blenderbim%\libs\site\packages\ifccsv.py" del "%blenderbim%\libs\site\packages\ifcdiff.py" del "%blenderbim%\libs\site\packages\bsdd.py" + rd /S /Q "%blenderbim%\libs\site\packages\bcf" rd /S /Q "%blenderbim%\libs\site\packages\ifc4d" rd /S /Q "%blenderbim%\libs\site\packages\ifc5d" rd /S /Q "%blenderbim%\libs\site\packages\ifccityjson" @@ -184,6 +187,7 @@ Before running it follow the instructions descibed after `rem` tags. mklink "%blenderbim%\libs\site\packages\ifccsv.py" "%cd%\src\ifccsv\ifccsv.py" mklink "%blenderbim%\libs\site\packages\ifcdiff.py" "%cd%\src\ifcdiff\ifcdiff.py" mklink "%blenderbim%\libs\site\packages\bsdd.py" "%cd%\src\bsdd\bsdd.py" + mklink /D "%blenderbim%\libs\site\packages\bcf" "%cd%\src\bcf\src\bcf" mklink /D "%blenderbim%\libs\site\packages\ifc4d" "%cd%\src\ifc4d\ifc4d" mklink /D "%blenderbim%\libs\site\packages\ifc5d" "%cd%\src\ifc5d\ifc5d" mklink /D "%blenderbim%\libs\site\packages\ifccityjson" "%cd%\src\ifccityjson\ifccityjson" From 87c9bbe2a7660fac8dc6ff59df6f7b57bef99752 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 11:46:53 +0500 Subject: [PATCH 194/429] Fix bcf due xsdata update #4680 After https://github.com/tefra/xsdata/commit/93a8ca0548d1f7badb628ad9fd0327672abe140b `parser.register_namespace("xs", "http://www.w3.org/2001/XMLSchema")` started failing with `TypeError: PushParser.register_namespace() missing 1 required positional argument: 'uri'` since xsdata added a new argument `ns_map` (previously it was always using `parse.ns_map` under the hood, now it allows to provide some external dictionary). We just restore the original behaviour with internal `ns_map` by providing it explicitly. Specified xsdata version after that change in pyproject.toml. Also `serialize()` is now using `parser.ns_map` as a fallback value (otherwise why we do `parser.register_namespace` if we never used the `parser.ns_map`?) --- src/bcf/pyproject.toml | 2 +- src/bcf/src/bcf/xml_parser.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bcf/pyproject.toml b/src/bcf/pyproject.toml index 4d7f1b401b..e126abe165 100644 --- a/src/bcf/pyproject.toml +++ b/src/bcf/pyproject.toml @@ -13,7 +13,7 @@ readme = "README.md" requires-python = ">=3.8" keywords = ["IFC", "BCF", "BIM"] dependencies = [ - "xsdata", + "xsdata>=24.4", "numpy", "ifcopenshell", ] diff --git a/src/bcf/src/bcf/xml_parser.py b/src/bcf/src/bcf/xml_parser.py index 9f3878f769..ed13f747ce 100644 --- a/src/bcf/src/bcf/xml_parser.py +++ b/src/bcf/src/bcf/xml_parser.py @@ -10,7 +10,7 @@ from xsdata.formats.dataclass.serializers.config import SerializerConfig def build_xml_parser(context: Optional[XmlContext] = None) -> XmlParser: """Return a parser for an XML file.""" parser = XmlParser(context=context or XmlContext()) - parser.register_namespace("xs", "http://www.w3.org/2001/XMLSchema") + parser.register_namespace(ns_map=parser.ns_map, prefix="xs", uri="http://www.w3.org/2001/XMLSchema") return parser @@ -68,7 +68,7 @@ class XmlParserSerializer: """ return self.parser.from_bytes(xml, clazz) - def serialize(self, obj: T, ns_map: Optional[dict[str, str]] = None) -> str: + def serialize(self, obj: T, ns_map: Optional[dict[Optional[str], str]] = None) -> str: """ Serialize an object to XML. @@ -79,5 +79,5 @@ class XmlParserSerializer: Returns: The XML as string. """ - ns_map = ns_map or {"xs": "http://www.w3.org/2001/XMLSchema"} + ns_map = ns_map or self.parser.ns_map or {"xs": "http://www.w3.org/2001/XMLSchema"} return self.serializer.render(obj, ns_map) From da4ce3773f53b86967c093b460bd75f049e6b425 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 11:57:46 +0500 Subject: [PATCH 195/429] bcf - fix xsdata warning about deprecated argument in SerializerConfig `pretty_print` was deprecated in 24.2 (https://github.com/tefra/xsdata/commit/2b01dbf6cf586e7d64e93ec7045dc17d2585e0de) and replaced with `indent` --- src/bcf/src/bcf/xml_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bcf/src/bcf/xml_parser.py b/src/bcf/src/bcf/xml_parser.py index ed13f747ce..bdab51099e 100644 --- a/src/bcf/src/bcf/xml_parser.py +++ b/src/bcf/src/bcf/xml_parser.py @@ -17,7 +17,7 @@ def build_xml_parser(context: Optional[XmlContext] = None) -> XmlParser: def build_serializer(context: Optional[XmlContext] = None) -> XmlSerializer: """Return a serializer for an XML file.""" return XmlSerializer( - config=SerializerConfig(pretty_print=True), + config=SerializerConfig(indent=" "), context=context or XmlContext(), ) From 8662e20c58a824f1ba6d8a6d7928b4284e41766f Mon Sep 17 00:00:00 2001 From: Hilko <65367721+hilko-o@users.noreply.github.com> Date: Fri, 17 May 2024 10:20:26 +0200 Subject: [PATCH 196/429] remove unused include #4620 --- src/ifcgeom_schema_agnostic/IfcGeomTree.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ifcgeom_schema_agnostic/IfcGeomTree.h b/src/ifcgeom_schema_agnostic/IfcGeomTree.h index 47c141011d..edfda02825 100644 --- a/src/ifcgeom_schema_agnostic/IfcGeomTree.h +++ b/src/ifcgeom_schema_agnostic/IfcGeomTree.h @@ -59,7 +59,6 @@ #include #include #include -#include #include "clash_utils.h" #ifdef WITH_HDF5 From 42be4eb06473500ff2f40eed33e0870308406b8f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 15:19:22 +0500 Subject: [PATCH 197/429] typing --- src/bcf/src/bcf/xml_parser.py | 6 +++-- src/blenderbim/blenderbim/bim/import_ifc.py | 4 +++- .../blenderbim/bim/module/pset/prop.py | 1 + .../bim/module/structural/operator.py | 1 + src/blenderbim/blenderbim/tool/geometry.py | 5 ++-- src/blenderbim/test/tool/test_georeference.py | 1 + .../ifcopenshell/api/context/add_context.py | 6 ++--- .../api/geometry/add_representation.py | 5 +++- .../ifcopenshell/util/attribute.py | 7 +++++- .../ifcopenshell/util/selector.py | 9 +++---- .../recipes/ResetAbsoluteCoordinates.py | 24 +++++++++++++++++-- src/ifcsverchok/ifcstore.py | 2 ++ src/ifcsverchok/nodes/ifc/create_project.py | 1 + src/ifcsverchok/nodes/ifc/sverchok_to_ifc.py | 1 + 14 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/bcf/src/bcf/xml_parser.py b/src/bcf/src/bcf/xml_parser.py index bdab51099e..b3b51367e0 100644 --- a/src/bcf/src/bcf/xml_parser.py +++ b/src/bcf/src/bcf/xml_parser.py @@ -36,8 +36,9 @@ class AbstractXmlParserSerializer(Protocol): xml: The XML file as bytes. clazz: The class to parse to. """ + ... - def serialize(self, obj: T, ns_map: Optional[dict[str, str]] = None) -> str: + def serialize(self, obj: object, ns_map: Optional[dict[str, str]] = None) -> str: """ Serialize an object to XML. @@ -48,6 +49,7 @@ class AbstractXmlParserSerializer(Protocol): Returns: The XML as string. """ + ... class XmlParserSerializer: @@ -68,7 +70,7 @@ class XmlParserSerializer: """ return self.parser.from_bytes(xml, clazz) - def serialize(self, obj: T, ns_map: Optional[dict[Optional[str], str]] = None) -> str: + def serialize(self, obj: object, ns_map: Optional[dict[Optional[str], str]] = None) -> str: """ Serialize an object to XML. diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index f2e5532feb..5e427aae3e 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -756,7 +756,9 @@ class IfcImporter: return mathutils.Matrix(matrix.tolist()) - def find_decomposed_ifc_class(self, element, ifc_class): + def find_decomposed_ifc_class( + self, element: ifcopenshell.entity_instance, ifc_class: str + ) -> Union[ifcopenshell.entity_instance, None]: if element.is_a(ifc_class): return element rel_aggregates = element.IsDecomposedBy diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index 05b70a79d9..d88884d7df 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -19,6 +19,7 @@ import bpy import blenderbim.bim.schema import ifcopenshell +import ifcopenshell.util.attribute import ifcopenshell.util.element import blenderbim.tool as tool from blenderbim.bim.prop import Attribute, StrProperty diff --git a/src/blenderbim/blenderbim/bim/module/structural/operator.py b/src/blenderbim/blenderbim/bim/module/structural/operator.py index 8415771d2b..7cf14baa45 100644 --- a/src/blenderbim/blenderbim/bim/module/structural/operator.py +++ b/src/blenderbim/blenderbim/bim/module/structural/operator.py @@ -20,6 +20,7 @@ import bpy import json import ifcopenshell import ifcopenshell.api +import ifcopenshell.util.attribute import blenderbim.bim.helper import blenderbim.bim.handler import blenderbim.core.structural as core diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 3133115c62..2d81ba415a 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -24,6 +24,7 @@ import logging import numpy as np import ifcopenshell import ifcopenshell.api +import ifcopenshell.geom import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.representation @@ -570,11 +571,11 @@ class Geometry(blenderbim.core.tool.Geometry): new.value = element[i] @classmethod - def is_body_representation(cls, representation): + def is_body_representation(cls, representation: ifcopenshell.entity_instance) -> bool: return representation.ContextOfItems.ContextIdentifier == "Body" @classmethod - def is_box_representation(cls, representation): + def is_box_representation(cls, representation: ifcopenshell.entity_instance) -> bool: return representation.ContextOfItems.ContextIdentifier == "Box" @classmethod diff --git a/src/blenderbim/test/tool/test_georeference.py b/src/blenderbim/test/tool/test_georeference.py index 177d9aeb6b..9ce320e327 100644 --- a/src/blenderbim/test/tool/test_georeference.py +++ b/src/blenderbim/test/tool/test_georeference.py @@ -19,6 +19,7 @@ import bpy import math import ifcopenshell +import ifcopenshell.api import blenderbim.core.tool import blenderbim.tool as tool from mathutils import Vector diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py b/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py index 38c79d20f2..95b38a0f5e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/add_context.py @@ -17,12 +17,12 @@ # along with IfcOpenShell. If not, see . import ifcopenshell -from typing import Optional +from typing import Optional, Literal def add_context( file: ifcopenshell.file, - context_type: str, + context_type: Optional[Literal["Model", "Plan"]] = None, context_identifier: Optional[str] = None, target_view: Optional[str] = None, parent: Optional[ifcopenshell.entity_instance] = None, @@ -96,7 +96,7 @@ def add_context( :param context_type: The type of the context, must be one of "Model" or "Plan" only. - :type context_type: str + :type context_type: str, optional :param context_identifier: The identifier of the context, chosen from one of the common identifiers above or consult the IFC documentation (under the IfcShapeRepresentation page) for more details. Optional diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index 9693e46340..149c443881 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -21,7 +21,7 @@ import math import bmesh import ifcopenshell.util.unit from mathutils import Vector, Matrix -from typing import Union, Optional, Literal +from typing import Union, Optional, Literal, Any Z_AXIS = Vector((0, 0, 1)) @@ -93,6 +93,9 @@ def add_representation( class Usecase: + file: ifcopenshell.file + settings: dict[str, Any] + def execute(self): self.is_manifold = None if ( diff --git a/src/ifcopenshell-python/ifcopenshell/util/attribute.py b/src/ifcopenshell-python/ifcopenshell/util/attribute.py index b52fea7e3f..2fa47589c1 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/attribute.py +++ b/src/ifcopenshell-python/ifcopenshell/util/attribute.py @@ -16,8 +16,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper +from typing import Union -def get_primitive_type(attribute_or_data_type): + +def get_primitive_type( + attribute_or_data_type: Union[ifcopenshell_wrapper.attribute, ifcopenshell_wrapper.parameter_type] +) -> Union[str, tuple[str, list[str]]]: if hasattr(attribute_or_data_type, "type_of_attribute"): data_type = str(attribute_or_data_type.type_of_attribute()) else: diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 582879f9d3..7f41ce1001 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -21,6 +21,7 @@ import lark import numpy as np import ifcopenshell.api import ifcopenshell.util +import ifcopenshell.util.attribute import ifcopenshell.util.fm import ifcopenshell.util.unit import ifcopenshell.util.element @@ -30,7 +31,7 @@ import ifcopenshell.util.classification import ifcopenshell.util.schema import ifcopenshell.util.shape from decimal import Decimal -from typing import Optional, Any, Union +from typing import Optional, Any, Union, Iterable filter_elements_grammar = lark.Lark( @@ -326,10 +327,10 @@ def filter_elements( def set_element_value( ifc_file: ifcopenshell.file, - element: ifcopenshell.entity_instance, + element: Union[ifcopenshell.entity_instance, Iterable[ifcopenshell.entity_instance], None], query: Union[str, list[str]], - value: Optional[str], -) -> Union[ifcopenshell.entity_instance, None]: + value: Any, +) -> None: if isinstance(query, (list, tuple)): keys = query else: diff --git a/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py b/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py index daeff23af8..283c8f71e0 100644 --- a/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py +++ b/src/ifcpatch/ifcpatch/recipes/ResetAbsoluteCoordinates.py @@ -16,9 +16,29 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcPatch. If not, see . +import logging +import numpy as np +import numpy.typing as npt +import ifcopenshell +from typing import Literal, Optional, Union + class Patcher: - def __init__(self, src, file, logger, mode="geometry", a=None, b=None, c=None, d=None): + def __init__( + self, + src: str, + file: ifcopenshell.file, + logger: logging.Logger, + mode: Literal[ + "geometry", + "placement", + "both", + ] = "geometry", + a: Optional[float] = None, + b: Optional[float] = None, + c: Optional[float] = None, + d: Optional[float] = None, + ): """Reset any large coordinates to smaller coordinates based on a threshold If you find large coordinates in your model, the large coordinates may @@ -151,7 +171,7 @@ class Patcher: point.Coordinates[2] + offset_point[2], ) - def is_point_far_away(self, point): + def is_point_far_away(self, point: Union[ifcopenshell.entity_instance, npt.NDArray[np.float64]]) -> bool: if hasattr(point, "Coordinates"): return ( abs(point.Coordinates[0]) > self.threshold diff --git a/src/ifcsverchok/ifcstore.py b/src/ifcsverchok/ifcstore.py index d812994b04..8e6a5b98ff 100644 --- a/src/ifcsverchok/ifcstore.py +++ b/src/ifcsverchok/ifcstore.py @@ -18,6 +18,8 @@ import bpy import ifcopenshell +import ifcopenshell.api +import ifcopenshell.util.representation from ifcopenshell import template diff --git a/src/ifcsverchok/nodes/ifc/create_project.py b/src/ifcsverchok/nodes/ifc/create_project.py index e2b9bf3750..3f8b323e51 100644 --- a/src/ifcsverchok/nodes/ifc/create_project.py +++ b/src/ifcsverchok/nodes/ifc/create_project.py @@ -18,6 +18,7 @@ import bpy import ifcopenshell +import ifcopenshell.api import ifcsverchok.helper from sverchok.node_tree import SverchCustomTreeNode diff --git a/src/ifcsverchok/nodes/ifc/sverchok_to_ifc.py b/src/ifcsverchok/nodes/ifc/sverchok_to_ifc.py index bbebc7f51b..3cc528984b 100644 --- a/src/ifcsverchok/nodes/ifc/sverchok_to_ifc.py +++ b/src/ifcsverchok/nodes/ifc/sverchok_to_ifc.py @@ -21,6 +21,7 @@ import bpy import ifcopenshell import ifcsverchok.helper import ifcopenshell.api +import ifcopenshell.util.representation from ifcsverchok.ifcstore import SvIfcStore import blenderbim.tool as tool import blenderbim.core.geometry as core From ea592775e4ba217e75b87787ad05922ee15ca63f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 13:57:44 +0500 Subject: [PATCH 198/429] fix set_element_value setting bool attributes with "False" str value --- src/ifcopenshell-python/ifcopenshell/util/selector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 7f41ce1001..d20b36a417 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -419,7 +419,7 @@ def set_element_value( if value in ("True", "true", "TRUE", "Yes", "1"): value = True elif value in ("False", "false", "FALSE", "No", "0"): - value = True + value = False else: value = bool(value) return setattr(element, key, value) From 9f7d7101195fdb28034e26f682f052ff0553d5eb Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 14:14:29 +0500 Subject: [PATCH 199/429] fix set_element_value bug #4495 --- src/ifcopenshell-python/ifcopenshell/util/selector.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index d20b36a417..04b8e4a5f3 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -471,9 +471,8 @@ def set_element_value( except IndexError: return else: - results = [] for v in element: - cls.set_element_value(ifc_file, v, keys[i + 1 :], value) + set_element_value(ifc_file, v, keys[i:], value) return From 25c1a14e648dc354361160d5931f05ccbce45fcb Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 15:25:39 +0500 Subject: [PATCH 200/429] set_element_value - pass attr value to the next part of the query #4495 E.g. previously set_element_value with query "material.item.Material.Name" would fail with error "Material property is expecting an IFC entity and not a string". But now it will detect that "Material" property is not a last key in the query and will pass `.Material` value forward and try to set it's `.Name` attribute with value. The main goal is to make sure get_element_value and set_element_value would have a same result for same queries. --- .../ifcopenshell/util/selector.py | 14 ++++++++++++-- src/ifcopenshell-python/test/util/test_selector.py | 7 +++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 04b8e4a5f3..2983f9239d 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -397,8 +397,14 @@ def set_element_value( if key == "Name" and element.is_a("IfcMaterialLayerSet"): key = "LayerSetName" # This oddity in the IFC spec is annoying so we account for it. - if isinstance(key, str) and hasattr(element, key): - if getattr(element, key) != value: + if isinstance(key, str) and ((current_value := getattr(element, key, ...)) is not ...): + # check if key is not last + if len(keys) != i + 1: + element = current_value + continue + + if current_value != value: + # check if key is not last try: # Try our luck return setattr(element, key, value) @@ -422,6 +428,10 @@ def set_element_value( value = False else: value = bool(value) + elif data_type == "entity": + value = ifc_file.by_guid(value) + if current_value == value: + return return setattr(element, key, value) else: # Try to extract pset diff --git a/src/ifcopenshell-python/test/util/test_selector.py b/src/ifcopenshell-python/test/util/test_selector.py index 78dbc7e946..37a103d313 100644 --- a/src/ifcopenshell-python/test/util/test_selector.py +++ b/src/ifcopenshell-python/test/util/test_selector.py @@ -311,6 +311,13 @@ class TestSetElementValue(test.bootstrap.IFC4): subject.set_element_value(self.file, element, "Name", 123) assert element.Name == "123" + def test_set_attributes_attribute(self): + material = self.file.create_entity("IfcMaterial") + layer = self.file.create_entity("IfcMaterialLayer") + layer.Material = material + subject.set_element_value(self.file, layer, "Material.Name", "Foo") + assert material.Name == "Foo" + class TestSelector(test.bootstrap.IFC4): def test_selecting_from_specified_elements(self): From 39f550529bb7a0ccfad50f178cb7e24152cbaae6 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 16:06:03 +0500 Subject: [PATCH 201/429] experimental - set_element_value to throw exception for invalid queries --- .../ifcopenshell/util/selector.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 2983f9239d..ea2cc5d8e2 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -325,12 +325,16 @@ def filter_elements( return transformer.get_results() +class SetElementValueException(Exception): ... + + def set_element_value( ifc_file: ifcopenshell.file, element: Union[ifcopenshell.entity_instance, Iterable[ifcopenshell.entity_instance], None], query: Union[str, list[str]], value: Any, ) -> None: + original_element = element if isinstance(query, (list, tuple)): keys = query else: @@ -393,6 +397,7 @@ def set_element_value( ifcopenshell.api.run( "geometry.edit_object_placement", ifc_file, product=element, matrix=matrix, is_si=False ) + return elif isinstance(element, ifcopenshell.entity_instance): if key == "Name" and element.is_a("IfcMaterialLayerSet"): key = "LayerSetName" # This oddity in the IFC spec is annoying so we account for it. @@ -403,7 +408,9 @@ def set_element_value( element = current_value continue - if current_value != value: + if current_value == value: + return + else: # check if key is not last try: # Try our luck @@ -485,6 +492,9 @@ def set_element_value( set_element_value(ifc_file, v, keys[i:], value) return + raise SetElementValueException( + f"Failed to set value for element '{original_element}' with query '{query}' (invalid or unsupported query)." + ) class FacetTransformer(lark.Transformer): def __init__(self, ifc_file: ifcopenshell.file, elements: Optional[set[ifcopenshell.entity_instance]] = None): From a8f0c90d472f2d6e4dfe2bd602090972f8542573 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 16:15:12 +0500 Subject: [PATCH 202/429] set_element_value - fix issues with classification, similar to 52ae759 --- src/ifcopenshell-python/ifcopenshell/util/selector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index ea2cc5d8e2..f66896bd53 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -481,7 +481,7 @@ def set_element_value( except: pass return - elif isinstance(element, (list, tuple)): # If we use regex + elif isinstance(element, (list, tuple, set)): # If we use regex if key.isnumeric(): try: element = element[int(key)] From fe68e16ca35d12b758dbeb72f8ffa9a434e31e1f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 17:03:22 +0500 Subject: [PATCH 203/429] bim.update_representation - error if add_representation didn't worked --- src/blenderbim/blenderbim/bim/module/geometry/operator.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index d23552506f..2bbdf948b8 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -400,7 +400,11 @@ class UpdateRepresentation(bpy.types.Operator, Operator): representation_data["profile_set_usage"] = tool.Geometry.get_profile_set_usage(product) representation_data["text_literal"] = tool.Geometry.get_text_literal(old_representation) + # TODO: replace with core.add_representation? new_representation = ifcopenshell.api.run("geometry.add_representation", self.file, **representation_data) + if new_representation is None: + self.report({"ERROR"}, "Error creating representation for Blender object.") + return {"CANCELLED"} if tool.Geometry.is_body_representation(new_representation): [ From 341cdd4ef78de51a60d5c5d48dc5394be0909bc2 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 17:40:13 +0500 Subject: [PATCH 204/429] fix error updating curve representations after 3fa573e #4685 #4682 --- .../ifcopenshell/api/geometry/add_representation.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index 149c443881..6dd006f47e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -504,11 +504,10 @@ class Usecase: geom_data = self.settings["geometry"] if isinstance(geom_data, bpy.types.Mesh): - if not self.is_mesh_curve_consecutive(geom_data): - return - if self.file.schema == "IFC2X3": - return self.create_curves_from_mesh_ifc2x3(should_exclude_faces=should_exclude_faces, is_2d=is_2d) - return self.create_curves_from_mesh(should_exclude_faces=should_exclude_faces, is_2d=is_2d) + if self.is_mesh_curve_consecutive(geom_data): + if self.file.schema == "IFC2X3": + return self.create_curves_from_mesh_ifc2x3(should_exclude_faces=should_exclude_faces, is_2d=is_2d) + return self.create_curves_from_mesh(should_exclude_faces=should_exclude_faces, is_2d=is_2d) import blenderbim.tool as tool From 183028570ef06d2e4d967c1a54365d3ec8510ea1 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Sat, 18 May 2024 01:49:56 +0500 Subject: [PATCH 205/429] bump xsdata in blenderbim after 87c9bbe2a #4640 --- src/blenderbim/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/Makefile b/src/blenderbim/Makefile index 27f089a0bc..a885272e60 100644 --- a/src/blenderbim/Makefile +++ b/src/blenderbim/Makefile @@ -286,9 +286,9 @@ endif # Required by bcf mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/ad/c7/17c9d16320d8e2cfdb27d2fd298b5e8f7a3f211025b0c1bc7a39a85bd690/xsdata-22.11.tar.gz + cd dist/working && wget https://files.pythonhosted.org/packages/b4/ef/35d8118f903510f9e028f8a6a4edb615fa69e28a30d955593425a88e587a/xsdata-24.5.tar.gz cd dist/working && tar -xzvf xsdata* - cp -r dist/working/xsdata-22.11/xsdata dist/blenderbim/libs/site/packages/ + cp -r dist/working/xsdata-24.5/xsdata dist/blenderbim/libs/site/packages/ rm -rf dist/working # Required by bcf From cb255a18b93962f35a5b2cfbf4776e0986a516d4 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Sat, 18 May 2024 11:24:10 +0500 Subject: [PATCH 206/429] fix error editing pset templates when you just opened ifc file It was failing with an error below if you'd try to edit any property since `primary_measure_type()` returned `[]` because it was executed before `pset_templates()` and `IfcStore.pset_template_file` wasn't yet set. ```python Error: Python: Traceback (most recent call last): File "\blenderbim\bim\module\pset_template\operator.py", line 146, in execute props.active_prop_template.primary_measure_type = template.PrimaryMeasureType ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: bpy_struct: item.attr = val: enum "IfcLabel" not found in () ``` --- .../blenderbim/bim/module/pset_template/data.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset_template/data.py b/src/blenderbim/blenderbim/bim/module/pset_template/data.py index a3f6d07162..96c17cc712 100644 --- a/src/blenderbim/blenderbim/bim/module/pset_template/data.py +++ b/src/blenderbim/blenderbim/bim/module/pset_template/data.py @@ -36,10 +36,14 @@ class PsetTemplatesData: @classmethod def load(cls): cls.is_loaded = True + cls.data["pset_template_files"] = cls.pset_template_files() + + # after pset_template_files + cls.data["pset_templates"] = cls.pset_templates() + + # after pset_template_files because it loads IfcStore.pset_template_file cls.data["primary_measure_type"] = cls.primary_measure_type() cls.data["property_template_type"] = cls.property_template_type() - cls.data["pset_template_files"] = cls.pset_template_files() - cls.data["pset_templates"] = cls.pset_templates() cls.data["pset_template"] = cls.pset_template() cls.data["prop_templates"] = cls.prop_templates() From 932817877c82c8fe70176d52ec24d6beab75eb8a Mon Sep 17 00:00:00 2001 From: Bruno Postle Date: Sun, 19 May 2024 13:29:26 +0100 Subject: [PATCH 207/429] Fix CPack source tarball generation This was broken, now a IfcOpenShell-0.7.0.tar.gz file can be created like so: mkdir build cd build cmake ../cmake/ -DEXTRA_VERSION= make package_source --- cmake/CMakeLists.txt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 8f7451afa2..ebca9496ed 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -36,7 +36,9 @@ if(NOT CMAKE_BUILD_TYPE) endif() # use extra version to make pre-release using eg semver -set(EXTRA_VERSION "-alpha.3") +if(NOT DEFINED EXTRA_VERSION) + set(EXTRA_VERSION "-alpha.3") +endif() option(MINIMAL_BUILD "The build is to make a minimal version of IFC converter from OCCT into IFC." OFF) option(WASM_BUILD "Build a WebAssembly binary." OFF) @@ -1147,9 +1149,10 @@ endif() # Packaging list(APPEND CPACK_SOURCE_IGNORE_FILES - .git - .gitignore + "/\\\\.git" + "/build/" ) +set(CPACK_SOURCE_INSTALLED_DIRECTORIES "${CMAKE_SOURCE_DIR}/..;/") set(CPACK_PACKAGE_NAME "${PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${EXTRA_VERSION}") set(CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}${EXTRA_VERSION}") SET(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${EXTRA_VERSION}-${CMAKE_SYSTEM_NAME}") From 3bdc969efbd3f9492cfe890abf44aeba4089073a Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 19 May 2024 23:36:26 +1000 Subject: [PATCH 208/429] Fix #4690. User can now configure the font used to render viewport text. --- .../bim/module/drawing/decoration.py | 12 ++++++--- .../blenderbim/bim/module/drawing/prop.py | 5 ++-- src/blenderbim/blenderbim/bim/ui.py | 26 +++++++++---------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/decoration.py b/src/blenderbim/blenderbim/bim/module/drawing/decoration.py index 663b060db9..f4da0e15fb 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/decoration.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/decoration.py @@ -159,9 +159,7 @@ class BaseDecorator: objecttype = "NOTDEFINED" def __init__(self): - self.font_id = blf.load( - os.path.join(bpy.context.scene.BIMProperties.data_dir, "fonts", "OpenGost Type B TT.ttf") - ) + self.font_id = 0 # 0 is the default font # POLYLINE_UNIFORM_COLOR is good for smoothed lines since `bgl.enable(GL_LINE_SMOOTH)` is deprecated self.line_shader = gpu.shader.from_builtin("POLYLINE_UNIFORM_COLOR") @@ -404,7 +402,6 @@ class BaseDecorator: line_no += 1 if multiline_to_bottom else -1 return - # 0 is the default font, but we're fancier than that font_id = self.font_id color = context.preferences.addons["blenderbim"].preferences.decorations_colour @@ -2014,6 +2011,13 @@ class DecorationsHandler: for object_type in ("SLOPE_ANGLE", "SLOPE_FRACTION", "SLOPE_PERCENT"): self.decorators[object_type] = self.decorators["FALL"] self.decorators["MULTI_SYMBOL"] = self.decorators["SYMBOL"] + if drawing_font := bpy.context.scene.DocProperties.drawing_font: + drawing_font_path = os.path.join(bpy.context.scene.BIMProperties.data_dir, "fonts", drawing_font) + if os.path.exists(drawing_font_path): + font_id = blf.load(drawing_font_path) + for decorator in self.decorators.values(): + decorator.font_id = font_id + def get_objects_and_decorators(self, collection): # TODO: do it in data instead of the handler for performance? diff --git a/src/blenderbim/blenderbim/bim/module/drawing/prop.py b/src/blenderbim/blenderbim/bim/module/drawing/prop.py index 7773d41930..db0806ae16 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/prop.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/prop.py @@ -315,9 +315,7 @@ class RasterStyleProperty(enum.Enum): SPACE_SHADING = "space.shading" -RASTER_STYLE_PROPERTIES_EXCLUDE = ( - "scene.render.filepath", -) +RASTER_STYLE_PROPERTIES_EXCLUDE = ("scene.render.filepath",) class DocProperties(PropertyGroup): @@ -371,6 +369,7 @@ class DocProperties(PropertyGroup): default=os.path.join("drawings", "assets", "shading_styles.json"), name="Default Shading Styles" ) shadingstyle_default: StringProperty(default="Blender Default", name="Default Shading Style") + drawing_font: StringProperty(default="OpenGost Type B TT.ttf", name="Drawing Font") class BIMCameraProperties(PropertyGroup): diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index a2647ffbd1..b4907bc58f 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -290,8 +290,6 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): row = layout.row() row.prop(self, "spatial_elements_unselectable") - - row = layout.row() row.prop(context.scene.BIMProjectProperties, "should_disable_undo_on_save") row = layout.row() @@ -320,28 +318,30 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): row.prop(context.scene.BIMProperties, "data_dir") row.operator("bim.select_data_dir", icon="FILE_FOLDER", text="") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.BIMProperties, "pset_dir") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.DocProperties, "sheets_dir") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.DocProperties, "layouts_dir") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.DocProperties, "titleblocks_dir") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.DocProperties, "drawings_dir") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.DocProperties, "stylesheet_path") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.DocProperties, "markers_path") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.DocProperties, "symbols_path") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.DocProperties, "patterns_path") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.DocProperties, "shadingstyles_path") - row = self.layout.row(align=True) + row = self.layout.row() row.prop(context.scene.DocProperties, "shadingstyle_default") + row = self.layout.row() + row.prop(context.scene.DocProperties, "drawing_font") # Scene panel groups From f666053b63023b113e81ea9ba5d20676e94f771c Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 19 May 2024 23:50:57 +1000 Subject: [PATCH 209/429] Use pip instead of hardcoding bcf packages during build. See #4640. --- src/blenderbim/Makefile | 35 ++++++----------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/src/blenderbim/Makefile b/src/blenderbim/Makefile index a885272e60..19d698c75a 100644 --- a/src/blenderbim/Makefile +++ b/src/blenderbim/Makefile @@ -277,34 +277,6 @@ endif cp -r dist/working/pyparsing-2.4.5/pyparsing.py dist/blenderbim/libs/site/packages/ rm -rf dist/working - # Required by bcf - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/5b/ef/f97c3e1a7efa00e989a793fe15297214fc95ad7d9e3810586bd08ce9f0f3/xmlschema-2.0.2.tar.gz - cd dist/working && tar -xzvf xmlschema* - cp -r dist/working/xmlschema-2.0.2/xmlschema dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Required by bcf - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/b4/ef/35d8118f903510f9e028f8a6a4edb615fa69e28a30d955593425a88e587a/xsdata-24.5.tar.gz - cd dist/working && tar -xzvf xsdata* - cp -r dist/working/xsdata-24.5/xsdata dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Required by bcf - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/11/bc/5afb61dd5d863e5cf77cd952445c50c17e65953405986f19e97e4389692a/elementpath-3.0.2.tar.gz - cd dist/working && tar -xzvf elementpath* - cp -r dist/working/elementpath-3.0.2/elementpath dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Required by bcf - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/21/9f/b251f7f8a76dec1d6651be194dfba8fb8d7781d10ab3987190de8391d08e/six-1.14.0.tar.gz - cd dist/working && tar -xzvf six* - cp -r dist/working/six-1.14.0/six.py dist/blenderbim/libs/site/packages/ - rm -rf dist/working - # Required by IFCCSV and ifcopenshell.util.selector mkdir dist/working cd dist/working && wget https://files.pythonhosted.org/packages/18/4d/8d522136c37d9e1ea74062b41b8d5e1318ebf45063ae46ce72ed60af223b/lark-parser-0.8.5.tar.gz @@ -366,7 +338,12 @@ endif # Provides Brickschema functionality cd dist/working && . env/bin/activate && $(PIP) install "brickschema[persistence]==0.7.6a2" --target=./site-packages # Required for SVG to DXF conversion - cd dist/working && . env/bin/activate && $(PIP) install "ezdxf" --target=./site-packages + cd dist/working && . env/bin/activate && $(PIP) install ezdxf --target=./site-packages + # Required by bcf + cd dist/working && . env/bin/activate && $(PIP) install xsdata --target=./site-packages + cd dist/working && . env/bin/activate && $(PIP) install xmlschema --target=./site-packages + cd dist/working && . env/bin/activate && $(PIP) install elementpath --target=./site-packages + cd dist/working && . env/bin/activate && $(PIP) install six --target=./site-packages cp -r dist/working/site-packages/* dist/blenderbim/libs/site/packages/ rm -rf dist/working From 2d0b3562030c09de27d4d6aeeae8b9673e3db0e4 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 20 May 2024 12:00:59 +1000 Subject: [PATCH 210/429] See #4690. User can now configure font and font-scaling in schedules. --- .../blenderbim/bim/data/assets/schedule.css | 45 ++++++++++++++++ .../bim/module/drawing/scheduler.py | 52 ++++++++++++------- 2 files changed, 78 insertions(+), 19 deletions(-) create mode 100644 src/blenderbim/blenderbim/bim/data/assets/schedule.css diff --git a/src/blenderbim/blenderbim/bim/data/assets/schedule.css b/src/blenderbim/blenderbim/bim/data/assets/schedule.css new file mode 100644 index 0000000000..151d7d4f78 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/data/assets/schedule.css @@ -0,0 +1,45 @@ +/* + * BlenderBIM Add-on - OpenBIM Blender Add-on + * Copyright (C) 2020, 2021 Dion Moult + * + * This file is part of BlenderBIM Add-on. + * + * BlenderBIM Add-on is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * BlenderBIM Add-on is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY, without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with BlenderBIM Add-on. If not, see . + */ + +/** + * You may copy this `schedule.css` template alongside your input schedule + * document with the same filename. For example if you have a schedule called + * `door_types.ods`, you can create a `door_types.css` in the same folder to + * style that schedule. + */ + +/** + * If you specify a font size in CSS, such as text { font-size: 5; }, all fonts + * will be overriden to match that size. + * + * If your CSS, ODS, XLSX does not specify a font size, the variables below + * will specify the default font size. + * + * If your ODS, XLSX does specify a font size, they will scale linearly based + * on the variables below. + */ + +:root { + --font-size-pt: 12; + --font-size-px: 4.13; + --font-width: 0.45; +} + +text, tspan { /* 2.5mm */ fill: black; stroke: none; font-family: 'OpenGost Type B TT', 'DejaVu Sans Condensed', 'Liberation Sans', 'Arial Narrow', 'Arial'; } diff --git a/src/blenderbim/blenderbim/bim/module/drawing/scheduler.py b/src/blenderbim/blenderbim/bim/module/drawing/scheduler.py index 0bdad578e0..72da3bbfa7 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/scheduler.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/scheduler.py @@ -16,22 +16,21 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . -from blenderbim.bim.module.drawing.svgwriter import SvgWriter +import os +import re +import bpy +import string import svgwrite import openpyxl +from blenderbim.bim.module.drawing.svgwriter import SvgWriter from odf.opendocument import load as load_ods from odf.table import Table, TableRow, TableColumn, TableCell from odf.text import P from odf.style import Style from textwrap import wrap from pathlib import Path -import string -FONT_SIZE = 4.13 -FONT_WIDTH = lambda size: size * 0.45 -FONT_SIZE_PT = 12 -FONT_FAMILY = "OpenGost Type B TT" DEBUG = False @@ -63,11 +62,29 @@ class Scheduler: ) self.padding = 1 self.margin = 1 + + self.parse_css(infile) if infile.endswith("ods"): self.schedule_ods(infile, outfile) elif infile.endswith("xlsx"): self.schedule_xlsx(infile, outfile) + def parse_css(self, infile): + stylesheet_path = os.path.splitext(infile)[0] + ".css" + if not os.path.exists(stylesheet_path): + stylesheet_path = os.path.join(bpy.context.scene.BIMProperties.data_dir, "assets", "schedule.css") + with open(stylesheet_path, "r") as stylesheet: + css = stylesheet.read() + + matches = re.search("--font-size-pt:\s*([0-9.]+);", css) + self.font_size_pt = float(matches.groups()[0]) if matches else 12 # Default to 12pt + matches = re.search("--font-size-px:\s*([0-9.]+);", css) + self.font_size_px = float(matches.groups()[0]) if matches else 4.13 # Magic number 4.13px ~= 12pt + matches = re.search("--font-width:\s*([0-9.]+);", css) + self.font_width = float(matches.groups()[0]) if matches else 0.45 # A magic number for OpenGost + + self.svg.defs.add(self.svg.style(css)) + def schedule_xlsx(self, infile, outfile): workbook = openpyxl.open(infile, data_only=True) sheet = workbook.active @@ -144,8 +161,8 @@ class Scheduler: x += unmerged_width continue - font_size = cell.font.size or 11 # 11pt default - font_size = font_size / FONT_SIZE_PT * FONT_SIZE # Magic? + font_size = cell.font.size or self.font_size_pt # 12pt default + font_size = font_size / self.font_size_pt * self.font_size_px # Magic? text_position = [0.0, 0.0] if cell.alignment.horizontal == "left": @@ -424,9 +441,9 @@ class Scheduler: italic_text = final_cell_style.get("font-style", None) == "italic" # NOTE: very naive since we're scaling text proportionally font_size = ( - float(final_cell_style.get("font-size", f"{FONT_SIZE_PT}pt")[:-2]) - / FONT_SIZE_PT - * FONT_SIZE + float(final_cell_style.get("font-size", f"{self.font_size_pt}pt")[:-2]) + / self.font_size_pt + * self.font_size_px ) if p_tags: @@ -523,10 +540,7 @@ class Scheduler: """ 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, - "font-family": FONT_FAMILY, - } + text_params = {"font-size": font_size} if bold: text_params["font-weight"] = "bold" if italic: @@ -546,13 +560,13 @@ class Scheduler: text_tag = self.svg.text("", **(text_params | {"font-size": "0"} | box_alignment_params)) - # TODO: should be done in less naive way - # without using magic number for FONT_WIDTH - # currently it might not work for all fonts and font sizes + # TODO: Should be done without using magic number for self.font_width if wrap_text: wrapped_lines = [] for line in text_lines: - wrapped_line = wrap(line, width=int(cell_width // FONT_WIDTH(font_size)), break_long_words=False) + wrapped_line = wrap( + line, width=int(cell_width // (font_size * self.font_width)), break_long_words=False + ) wrapped_lines.extend(wrapped_line) else: wrapped_lines = text_lines From a07d3b96697cf9d960e8d10b2d4571eead28b606 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 20 May 2024 14:12:03 +1000 Subject: [PATCH 211/429] Fix #4633. Only update the text value of the object, not try to be clever with types and occurrences. Previously, we were clever in detecting types and occurrences because if you edited a type, you wanted all occurrences to be updated. Now, we no longer need to be clever because like any other UI element, the annotations shown in the active view are updated after every IFC operation. --- src/blenderbim/blenderbim/tool/drawing.py | 34 ++++------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 0d38dc2fe7..a223186670 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -935,34 +935,12 @@ class Drawing(blenderbim.core.tool.Drawing): @classmethod def update_text_value(cls, obj): - element = tool.Ifc.get_entity(obj) - if element.is_a("IfcTypeProduct"): - objs = [obj] - for occurrence in ifcopenshell.util.element.get_types(element): - obj = tool.Ifc.get_object(occurrence) - if obj: - objs.append(obj) - else: - objs = [] - element_type = ifcopenshell.util.element.get_type(element) - if element_type and element_type.RepresentationMaps: - obj = tool.Ifc.get_object(element_type) - if obj: - objs.append(obj) - for occurrence in ifcopenshell.util.element.get_types(element_type): - obj = tool.Ifc.get_object(occurrence) - if obj: - objs.append(obj) - else: - objs = [obj] - - for obj in objs: - props = obj.BIMTextProperties - literals = cls.get_text_literal(obj, return_list=True) - cls.import_text_attributes(obj) - for i, literal in enumerate(literals): - product = cls.get_assigned_product(tool.Ifc.get_entity(obj)) or tool.Ifc.get_entity(obj) - props.literals[i].value = cls.replace_text_literal_variables(literal.Literal, product) + props = obj.BIMTextProperties + literals = cls.get_text_literal(obj, return_list=True) + cls.import_text_attributes(obj) + for i, literal in enumerate(literals): + product = cls.get_assigned_product(tool.Ifc.get_entity(obj)) or tool.Ifc.get_entity(obj) + props.literals[i].value = cls.replace_text_literal_variables(literal.Literal, product) @classmethod def update_text_size_pset(cls, obj): From 16285e0625a683d2fd610dcac6d0217c308c2a98 Mon Sep 17 00:00:00 2001 From: E Shattow Date: Sat, 18 May 2024 19:55:55 -0700 Subject: [PATCH 212/429] Update installation.rst refering to System not Import-Export Blender BIM addon is listed by Blender 4.1 as `System: BlenderBIM` --- src/blenderbim/docs/users/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/docs/users/installation.rst b/src/blenderbim/docs/users/installation.rst index bbcd8fe7c8..fecbe5d0c4 100644 --- a/src/blenderbim/docs/users/installation.rst +++ b/src/blenderbim/docs/users/installation.rst @@ -42,7 +42,7 @@ Installation You do not need to unzip the add-on file. You should install it as a zipped file. - You should now see **Import-Export: BlenderBIM** available in your add-ons list. Enable the add-on by pressing the checkbox. + You should now see **System: BlenderBIM** available in your add-ons list. Enable the add-on by pressing the checkbox. .. image:: images/install-blenderbim-3.png From c4157673f5c3dd812a985859c0ec2ba085a32b15 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 20 May 2024 16:04:18 +1000 Subject: [PATCH 213/429] Fix #4696. Null properties are now purged by default to prevent cruft build up. Add support for purging empty enum props. --- .../ifcopenshell/api/pset/edit_pset.py | 10 +++++++--- .../test/api/pset/test_edit_pset.py | 17 ++++++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py index f8c0974b0d..2fe9c22c0e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py @@ -27,7 +27,7 @@ def edit_pset( name: Optional[str] = None, properties: Optional[dict[str, Any]] = None, pset_template: Optional[ifcopenshell.entity_instance] = None, - should_purge: bool = False, + should_purge: bool = True, ) -> None: """Edits a property set and its properties @@ -77,9 +77,10 @@ def edit_pset( be used to determine data types. If no user-defined template is provided, the built-in buildingSMART templates will be loaded. :type pset_template: ifcopenshell.entity_instance, optional - :param should_purge: If left as False, properties set to None will be + :param should_purge: If set as False, properties set to None will be left as None but not removed. If set to true, properties set to None - will actually be removed. + will actually be removed. The default of true is the same behaviour as + :func:`ifcopenshell.api.pset.edit_qto`. :type should_purge: bool, optional :return: None :rtype: None @@ -241,6 +242,9 @@ class Usecase: if isinstance(value, (tuple, list)): sel_vals = [] + if not value: + if self._try_purge(prop): + return for val in value: primary_measure_type = prop.EnumerationReference.EnumerationValues[ 0 diff --git a/src/ifcopenshell-python/test/api/pset/test_edit_pset.py b/src/ifcopenshell-python/test/api/pset/test_edit_pset.py index 7912771759..5c065495ab 100644 --- a/src/ifcopenshell-python/test/api/pset/test_edit_pset.py +++ b/src/ifcopenshell-python/test/api/pset/test_edit_pset.py @@ -59,7 +59,9 @@ class TestEditPset(test.bootstrap.IFC4): pset=pset, properties={"Reference": "foo", "Status": ["NEW"], "Combustible": True, "ThermalTransmittance": 42}, ) - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Reference": "bar", "Status": []}) + ifcopenshell.api.run( + "pset.edit_pset", self.file, pset=pset, properties={"Reference": "bar", "Status": []}, should_purge=False + ) pset = element.IsDefinedBy[0].RelatingPropertyDefinition assert pset.HasProperties[0].Name == "Reference" @@ -88,8 +90,7 @@ class TestEditPset(test.bootstrap.IFC4): def test_adding_a_property_if_it_is_none(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Pset_WallCommon") - # should_purge is false by default - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Reference": None}) + ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Reference": None}, should_purge=False) pset = element.IsDefinedBy[0].RelatingPropertyDefinition assert len(pset.HasProperties) == 1 @@ -108,6 +109,16 @@ class TestEditPset(test.bootstrap.IFC4): pset = element.IsDefinedBy[0].RelatingPropertyDefinition assert len(pset.HasProperties) == 0 + def test_removing_a_none_enumeration_property_if_specified(self): + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Pset_WallCommon") + ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Status": ["NEW"]}) + assert pset.HasProperties[0].Name == "Status" + assert pset.HasProperties[0].EnumerationValues[0].wrappedValue == "NEW" + ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Status": []}, should_purge=True) + pset = element.IsDefinedBy[0].RelatingPropertyDefinition + assert len(pset.HasProperties) == 0 + def test_editing_a_pset_name(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="foo") From 7bf8c0bbfb022ba4e38a456216a648dfd41be98b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 20 May 2024 16:32:42 +1000 Subject: [PATCH 214/429] Fix #4686. Automatically derive correct download URI if add-on fails to install. --- src/blenderbim/blenderbim/__init__.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/__init__.py b/src/blenderbim/blenderbim/__init__.py index de00a88d72..6499fa3961 100644 --- a/src/blenderbim/blenderbim/__init__.py +++ b/src/blenderbim/blenderbim/__init__.py @@ -120,11 +120,15 @@ if sys.modules.get("bpy", None): bl_context = "scene" def draw(self, context): + info = get_debug_info() + layout = self.layout layout.label(text="BlenderBIM could not load.", icon="ERROR") - layout.operator("wm.console_toggle", text="View the console for full logs.", icon="CONSOLE") + if info["os"] == "Windows": + layout.operator("wm.console_toggle", text="View the console for full logs.", icon="CONSOLE") + else: + layout.label(text="View the console for full logs.", icon="CONSOLE") box = layout.box() - info = get_debug_info() py = ".".join(info["python_version"].split(".")[0:2]) b3d = ".".join(info["blender_version"].split(".")[0:2]) box.label(text=f"Blender {b3d} {info['os']} {info['machine']}", icon="BLENDER") @@ -133,6 +137,21 @@ if sys.modules.get("bpy", None): op = layout.operator("bim.open_uri", text="How Can I Fix This?") op.uri = "https://docs.blenderbim.org/users/troubleshooting.html#installation-issues" + layout.label(text="Try Reinstalling:", icon="IMPORT") + op = layout.operator("bim.open_uri", text="Re-download Add-on") + bbim_date = info["blenderbim_version"].split(".")[-1] + py_tag = py.replace(".", "") + if "Linux" in info["os"]: + os = "linux" + elif "Darwin" in info["os"]: + if "arm64" in info["machine"]: + os = "macosm1" + else: + os = "macos" + else: + os = "win" + op.uri = f"https://github.com/IfcOpenShell/IfcOpenShell/releases/download/blenderbim-{bbim_date}/blenderbim-{bbim_date}-py{py_tag}-{os}.zip" + class OpenUri(bpy.types.Operator): bl_idname = "bim.open_uri" bl_label = "Open URI" From e7f4c6c9ccaead143bc0dae8cf37e94d8f928508 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 20 May 2024 12:34:56 +0500 Subject: [PATCH 215/429] update error UI similar to 7bf8c0bbf --- src/blenderbim/blenderbim/bim/ui.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index b4907bc58f..a20a44f85c 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -19,6 +19,7 @@ import os import bpy import addon_utils +import platform from pathlib import Path from bpy.types import Panel from bpy.props import StringProperty, IntProperty, BoolProperty @@ -410,7 +411,10 @@ class BIM_PT_tabs(Panel): row = box.row(align=True) row.label(text="BlenderBIM experienced an error :(", icon="ERROR") row.operator("bim.close_error", text="", icon="CANCEL") - box.operator("wm.console_toggle", text="View the console for full logs.", icon="CONSOLE") + if platform.system() == "Windows": + box.operator("wm.console_toggle", text="View the console for full logs.", icon="CONSOLE") + else: + box.label(text="View the console for full logs.", icon="CONSOLE") box.operator("bim.copy_debug_information", text="Copy Error Message To Clipboard") op = box.operator("bim.open_uri", text="How Can I Fix This?") op.uri = "https://docs.blenderbim.org/users/troubleshooting.html" From 4e462a3cf77ee6422295c95e22dde3af218fc701 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 20 May 2024 12:47:09 +0500 Subject: [PATCH 216/429] use .alert in fatal loading error UI to draw more attention (3320acc) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://i.imgur.com/5ZukO0b.png we probably will need to use 1 method for both error UIs at some point 😅 --- src/blenderbim/blenderbim/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/blenderbim/blenderbim/__init__.py b/src/blenderbim/blenderbim/__init__.py index 6499fa3961..cd4381b948 100644 --- a/src/blenderbim/blenderbim/__init__.py +++ b/src/blenderbim/blenderbim/__init__.py @@ -123,6 +123,7 @@ if sys.modules.get("bpy", None): info = get_debug_info() layout = self.layout + layout.alert = True layout.label(text="BlenderBIM could not load.", icon="ERROR") if info["os"] == "Windows": layout.operator("wm.console_toggle", text="View the console for full logs.", icon="CONSOLE") From 7c6c01e6b9f77e422394df91202a87323766f8cf Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 20 May 2024 13:17:17 +0500 Subject: [PATCH 217/429] fix python 3.10 loading issue after bb8e84e The error is below. It was failing because Callable was checking if `ifcopenshell.entity_instance` is a callable and at runtime actually it's not, it's a module. In python 3.11 they've removed that check and therefore it's not throwing an error. Enabling forward annotations fixes it for python 3.10. Not sure if there is a need to ensure `ifcopenshell.entity_instance` should be recgonized by python as a class at runtime rather than a module since we need it just for type checking and type checking seems to be clever enough to prioritize module classes over submodules. File "C:\Users\user_name\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\blenderbim\bim\__init__.py", line 25, in from . import handler, ui, prop, operator, helper File "C:\Users\user_name\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\blenderbim\bim\handler.py", line 23, in import ifcopenshell.api.owner.settings File "C:\Users\user_name\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\blenderbim\libs\site\packages\ifcopenshell\__init__.py", line 85, in from .file import file File "C:\Users\user_name\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\blenderbim\libs\site\packages\ifcopenshell\file.py", line 179, in class file: File "C:\Users\user_name\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\blenderbim\libs\site\packages\ifcopenshell\file.py", line 382, in file def __getattr__(self, attr) -> Union[Any, Callable[..., ifcopenshell.entity_instance]]: File "C:\Program Files\Blender Foundation\Blender 4.0\4.0\python\lib\typing.py", line 1206, in __getitem__ return self.__getitem_inner__(params) File "C:\Program Files\Blender Foundation\Blender 4.0\4.0\python\lib\typing.py", line 312, in inner return func(*args, **kwds) File "C:\Program Files\Blender Foundation\Blender 4.0\4.0\python\lib\typing.py", line 1212, in __getitem_inner__ result = _type_check(result, msg) File "C:\Program Files\Blender Foundation\Blender 4.0\4.0\python\lib\typing.py", line 176, in _type_check raise TypeError(f"{msg} Got {arg!r:.100}.") TypeError: Callable[args, result]: result must be a type. Got . - +from __future__ import annotations import os import re import numbers From cacb38a2513674932fc0fc93ddce5fd53d705b98 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 20 May 2024 14:47:57 +0500 Subject: [PATCH 218/429] maintain "bim." as operators bl_idname prefix for BlenderBIM 1) removed unused operator import_ifc.bim 2) marked export_ifc.bim as deprecated --- .../blenderbim/bim/module/cost/operator.py | 2 +- .../blenderbim/bim/module/cost/ui.py | 2 +- .../blenderbim/bim/module/project/__init__.py | 4 ++-- .../blenderbim/bim/module/project/operator.py | 22 ++++++++++++------- .../blenderbim/bim/module/project/ui.py | 4 ++-- .../bim/module/resource/operator.py | 2 +- .../blenderbim/bim/module/resource/ui.py | 2 +- .../bim/module/sequence/operator.py | 14 ++++++------ src/blenderbim/test/bim/test_feature.py | 2 +- 9 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/operator.py b/src/blenderbim/blenderbim/bim/module/cost/operator.py index ce64211be3..2efdca18f4 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cost/operator.py @@ -509,7 +509,7 @@ class SelectCostScheduleProducts(bpy.types.Operator): class ImportCostScheduleCsv(bpy.types.Operator, ImportHelper, tool.Ifc.Operator): - bl_idname = "import_cost_schedule_csv.bim" + bl_idname = "bim.import_cost_schedule_csv" bl_label = "Import Cost Schedule CSV" bl_options = {"REGISTER", "UNDO"} filename_ext = ".csv" diff --git a/src/blenderbim/blenderbim/bim/module/cost/ui.py b/src/blenderbim/blenderbim/bim/module/cost/ui.py index e50e8e3921..a5f4d973a9 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/ui.py +++ b/src/blenderbim/blenderbim/bim/module/cost/ui.py @@ -53,7 +53,7 @@ class BIM_PT_cost_schedules(Panel): row.label(text="No Cost Schedules found.", icon="TEXT") row.operator("bim.add_cost_schedule", icon="ADD", text="") - row.operator("import_cost_schedule_csv.bim",icon="IMPORT",text="") + row.operator("bim.import_cost_schedule_csv",icon="IMPORT",text="") for schedule in CostSchedulesData.data["schedules"]: self.draw_cost_schedule_ui(schedule) diff --git a/src/blenderbim/blenderbim/bim/module/project/__init__.py b/src/blenderbim/blenderbim/bim/module/project/__init__.py index ec1008cd33..439ba4d2dc 100644 --- a/src/blenderbim/blenderbim/bim/module/project/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/project/__init__.py @@ -36,8 +36,8 @@ classes = ( operator.EnableCulling, operator.EnableEditingHeader, operator.ExportIFC, + operator.ExportIFCDeprecated, operator.FlipClippingPlane, - operator.ImportIFC, operator.LinkIfc, operator.LoadLink, operator.LoadLinkedProject, @@ -97,7 +97,7 @@ def register(): addon_keymaps.append((km, kmi)) km = wm.keyconfigs.addon.keymaps.new(name="Window", space_type="EMPTY") - kmi = km.keymap_items.new("export_ifc.bim", "S", "PRESS", ctrl=True) + kmi = km.keymap_items.new("bim.export_ifc", "S", "PRESS", ctrl=True) kmi.properties.should_save_as = False addon_keymaps.append((km, kmi)) diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index ede1645996..7dbbce8cfa 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -1106,8 +1106,8 @@ class ToggleLinkVisibility(bpy.types.Operator): ] -class ExportIFC(bpy.types.Operator): - bl_idname = "export_ifc.bim" +class ExportIFCBase: + bl_idname = "bim.export_ifc" bl_label = "Save IFC" bl_options = {"REGISTER", "UNDO"} filename_ext = ".ifc" @@ -1224,14 +1224,20 @@ class ExportIFC(bpy.types.Operator): return "Save the IFC file. Will save both .IFC/.BLEND files if synced together" -class ImportIFC(bpy.types.Operator): - bl_idname = "import_ifc.bim" - bl_label = "Import IFC" - bl_options = {"REGISTER", "UNDO"} +class ExportIFC(ExportIFCBase, bpy.types.Operator): + bl_idname = "bim.export_ifc" + + +# TODO: remove as deprecated, better wait couple releases since +# this operator is used for saving IFC files in user scripts. +class ExportIFCDeprecated(ExportIFCBase, bpy.types.Operator): + bl_idname = "export_ifc.bim" def execute(self, context): - bpy.ops.bim.load_project("INVOKE_DEFAULT") - return {"FINISHED"} + msg = f"'{ExportIFCDeprecated.bl_idname}' operator name is deprecated, use '{ExportIFC.bl_idname}'." + self.report({"WARNING"}, msg) + print(msg) + return super().execute(context) class LoadLinkedProject(bpy.types.Operator): diff --git a/src/blenderbim/blenderbim/bim/module/project/ui.py b/src/blenderbim/blenderbim/bim/module/project/ui.py index e961bf7499..6e8468fe1f 100644 --- a/src/blenderbim/blenderbim/bim/module/project/ui.py +++ b/src/blenderbim/blenderbim/bim/module/project/ui.py @@ -68,9 +68,9 @@ def file_menu(self, context): op = self.layout.operator("bim.load_project", text="Open IFC Project", icon="FILEBROWSER") op.should_start_fresh_session = True self.layout.separator() - op = self.layout.operator("export_ifc.bim", icon="FILE_TICK", text="Save IFC Project") + op = self.layout.operator("bim.export_ifc", icon="FILE_TICK", text="Save IFC Project") op.should_save_as = False - op = self.layout.operator("export_ifc.bim", text="Save IFC Project As...") + op = self.layout.operator("bim.export_ifc", text="Save IFC Project As...") op.should_save_as = True self.layout.separator() self.layout.operator("bim.revert_project") diff --git a/src/blenderbim/blenderbim/bim/module/resource/operator.py b/src/blenderbim/blenderbim/bim/module/resource/operator.py index 9d64cdb0dd..08f65c2e2e 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/operator.py +++ b/src/blenderbim/blenderbim/bim/module/resource/operator.py @@ -328,7 +328,7 @@ class EditResourceQuantity(bpy.types.Operator, tool.Ifc.Operator): class ImportResources(bpy.types.Operator, tool.Ifc.Operator, ImportHelper): - bl_idname = "import_resources.bim" + bl_idname = "bim.import_resources" bl_label = "Import Resources" bl_options = {"REGISTER", "UNDO"} filename_ext = ".csv" diff --git a/src/blenderbim/blenderbim/bim/module/resource/ui.py b/src/blenderbim/blenderbim/bim/module/resource/ui.py index 29cb56aa07..df44c2088a 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/ui.py +++ b/src/blenderbim/blenderbim/bim/module/resource/ui.py @@ -51,7 +51,7 @@ class BIM_PT_resources(Panel): row.operator("bim.disable_resource_editing_ui", text="", icon="CANCEL") else: row.operator("bim.load_resources", text="", icon="GREASEPENCIL") - row.operator("import_resources.bim", text="", icon="IMPORT") + row.operator("bim.import_resources", text="", icon="IMPORT") if not self.props.is_editing: return diff --git a/src/blenderbim/blenderbim/bim/module/sequence/operator.py b/src/blenderbim/blenderbim/bim/module/sequence/operator.py index d285a49d33..c79503eab1 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/operator.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/operator.py @@ -628,7 +628,7 @@ class DisableEditingWorkCalendar(bpy.types.Operator): class ImportCSV(bpy.types.Operator, tool.Ifc.Operator, ImportHelper): - bl_idname = "import_csv.bim" + bl_idname = "bim.import_csv" bl_label = "Import CSV" bl_options = {"REGISTER", "UNDO"} filename_ext = ".csv" @@ -653,7 +653,7 @@ class ImportCSV(bpy.types.Operator, tool.Ifc.Operator, ImportHelper): class ImportP6(bpy.types.Operator, ImportHelper): - bl_idname = "import_p6.bim" + bl_idname = "bim.import_p6" bl_label = "Import P6" bl_options = {"REGISTER", "UNDO"} filename_ext = ".xml" @@ -679,7 +679,7 @@ class ImportP6(bpy.types.Operator, ImportHelper): class ImportP6XER(bpy.types.Operator, ImportHelper): - bl_idname = "import_p6xer.bim" + bl_idname = "bim.import_p6xer" bl_label = "Import P6 XER" bl_options = {"REGISTER", "UNDO"} filename_ext = ".xer" @@ -705,7 +705,7 @@ class ImportP6XER(bpy.types.Operator, ImportHelper): class ImportPP(bpy.types.Operator, ImportHelper): - bl_idname = "import_pp.bim" + bl_idname = "bim.import_pp" bl_label = "Import Powerproject .pp" bl_options = {"REGISTER", "UNDO"} filename_ext = ".pp" @@ -731,7 +731,7 @@ class ImportPP(bpy.types.Operator, ImportHelper): class ImportMSP(bpy.types.Operator, ImportHelper): - bl_idname = "import_msp.bim" + bl_idname = "bim.import_msp" bl_label = "Import MSP" bl_options = {"REGISTER", "UNDO"} filename_ext = ".xml" @@ -757,7 +757,7 @@ class ImportMSP(bpy.types.Operator, ImportHelper): class ExportMSP(bpy.types.Operator, ImportHelper): - bl_idname = "export_msp.bim" + bl_idname = "bim.export_msp" bl_label = "Export MSP" bl_options = {"REGISTER", "UNDO"} filename_ext = ".xml" @@ -787,7 +787,7 @@ class ExportMSP(bpy.types.Operator, ImportHelper): class ExportP6(bpy.types.Operator, ImportHelper): - bl_idname = "export_p6.bim" + bl_idname = "bim.export_p6" bl_label = "Export P6" bl_options = {"REGISTER", "UNDO"} filename_ext = ".xml" diff --git a/src/blenderbim/test/bim/test_feature.py b/src/blenderbim/test/bim/test_feature.py index 07b178ddc0..037c831200 100644 --- a/src/blenderbim/test/bim/test_feature.py +++ b/src/blenderbim/test/bim/test_feature.py @@ -960,7 +960,7 @@ def run_test_code(): def saving_sample_test_files(and_open_in_blender=None): filepath = f"{variables['cwd']}/test/files/temp/sample_test_file" blend_filepath = f"{filepath}.blend" - bpy.ops.export_ifc.bim(filepath=f"{filepath}.ifc", should_save_as=True) + bpy.ops.bim.export_ifc(filepath=f"{filepath}.ifc", should_save_as=True) bpy.ops.wm.save_as_mainfile(filepath=f"{filepath}.blend") From f84adf67cd125ff157ee0602d3b7810ae6379d2d Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 20 May 2024 14:49:06 +0500 Subject: [PATCH 219/429] typing --- src/blenderbim/blenderbim/core/cost.py | 143 +++++++++++++++---------- src/blenderbim/blenderbim/tool/cost.py | 6 +- src/ifc5d/ifc5d/csv2ifc.py | 36 ++++--- 3 files changed, 110 insertions(+), 75 deletions(-) diff --git a/src/blenderbim/blenderbim/core/cost.py b/src/blenderbim/blenderbim/core/cost.py index ec8cc3e7e1..e703844b23 100644 --- a/src/blenderbim/blenderbim/core/cost.py +++ b/src/blenderbim/blenderbim/core/cost.py @@ -1,88 +1,115 @@ -def add_cost_schedule(ifc, name, predefined_type): +# BlenderBIM Add-on - OpenBIM Blender Add-on +# Copyright (C) 2021 Dion Moult +# +# This file is part of BlenderBIM Add-on. +# +# BlenderBIM Add-on is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# BlenderBIM Add-on is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with BlenderBIM Add-on. If not, see . + +from __future__ import annotations +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + import bpy + import ifcopenshell + import blenderbim.tool as tool + + +def add_cost_schedule(ifc: tool.Ifc, name, predefined_type): ifc.run("cost.add_cost_schedule", name=name, predefined_type=predefined_type) -def edit_cost_schedule(ifc, cost, cost_schedule): +def edit_cost_schedule(ifc: tool.Ifc, cost: tool.Cost, cost_schedule: ifcopenshell.entity_instance): attributes = cost.get_cost_schedule_attributes() ifc.run("cost.edit_cost_schedule", cost_schedule=cost_schedule, attributes=attributes) cost.disable_editing_cost_schedule() -def disable_editing_cost_schedule(cost): +def disable_editing_cost_schedule(cost: tool.Cost): cost.disable_editing_cost_schedule() -def remove_cost_schedule(ifc, cost_schedule): +def remove_cost_schedule(ifc: tool.Ifc, cost_schedule: ifcopenshell.entity_instance): ifc.run("cost.remove_cost_schedule", cost_schedule=cost_schedule) -def enable_editing_cost_schedule_attributes(cost, cost_schedule): +def enable_editing_cost_schedule_attributes(cost: tool.Cost, cost_schedule: ifcopenshell.entity_instance): cost.load_cost_schedule_attributes(cost_schedule) cost.enable_editing_cost_schedule_attributes(cost_schedule) -def enable_editing_cost_items(cost, cost_schedule): +def enable_editing_cost_items(cost: tool.Cost, cost_schedule: ifcopenshell.entity_instance): cost.enable_editing_cost_items(cost_schedule) cost.load_cost_schedule_tree() cost.play_sound() -def add_summary_cost_item(ifc, cost, cost_schedule): +def add_summary_cost_item(ifc: tool.Ifc, cost: tool.Cost, cost_schedule: ifcopenshell.entity_instance): ifc.run("cost.add_cost_item", cost_schedule=cost_schedule) cost.load_cost_schedule_tree() # cost.play_sound() -def add_cost_item(ifc, cost, cost_item): +def add_cost_item(ifc: tool.Ifc, cost: tool.Cost, cost_item: ifcopenshell.entity_instance): ifc.run("cost.add_cost_item", cost_item=cost_item) cost.load_cost_schedule_tree() # cost.enable_editing_cost_schedule_attributes(cost_schedule) -def expand_cost_item(cost, cost_item): +def expand_cost_item(cost: tool.Cost, cost_item: ifcopenshell.entity_instance): cost.expand_cost_item(cost_item) cost.load_cost_schedule_tree() -def expand_cost_items(cost): +def expand_cost_items(cost: tool.Cost): cost.expand_cost_items() cost.load_cost_schedule_tree() -def contract_cost_item(cost, cost_item): +def contract_cost_item(cost: tool.Cost, cost_item: ifcopenshell.entity_instance): cost.contract_cost_item(cost_item) cost.load_cost_schedule_tree() -def contract_cost_items(cost): +def contract_cost_items(cost: tool.Cost): cost.contract_cost_items() cost.load_cost_schedule_tree() -def remove_cost_item(ifc, cost, cost_item_id): +def remove_cost_item(ifc: tool.Ifc, cost: tool.Cost, cost_item_id: int): cost_item = ifc.get().by_id(cost_item_id) ifc.run("cost.remove_cost_item", cost_item=cost_item) cost.clean_up_cost_item_tree(cost_item_id) cost.load_cost_schedule_tree() -def enable_editing_cost_item_attributes(cost, cost_item): +def enable_editing_cost_item_attributes(cost: tool.Cost, cost_item: ifcopenshell.entity_instance): cost.enable_editing_cost_item_attributes(cost_item) cost.load_cost_item_attributes(cost_item) -def disable_editing_cost_item(cost): +def disable_editing_cost_item(cost: tool.Cost): cost.disable_editing_cost_item() -def edit_cost_item(ifc, cost): +def edit_cost_item(ifc: tool.Ifc, cost: tool.Cost): attributes = cost.get_cost_item_attributes() ifc.run("cost.edit_cost_item", cost_item=cost.get_active_cost_item(), attributes=attributes) cost.disable_editing_cost_item() cost.load_cost_schedule_tree() -def assign_cost_item_type(ifc, cost, spatial, cost_item, prop_name): +def assign_cost_item_type(ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item, prop_name): product_types = spatial.get_selected_product_types() [ ifc.run("control.assign_control", relating_control=cost_item, related_object=product_type) @@ -91,7 +118,7 @@ def assign_cost_item_type(ifc, cost, spatial, cost_item, prop_name): cost.load_cost_item_types(cost_item) -def unassign_cost_item_type(ifc, cost, spatial, cost_item, product_types): +def unassign_cost_item_type(ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item, product_types): if not product_types: product_types = spatial.get_selected_product_types() [ @@ -101,83 +128,83 @@ def unassign_cost_item_type(ifc, cost, spatial, cost_item, product_types): cost.load_cost_item_types(cost_item) -def load_cost_item_types(cost): +def load_cost_item_types(cost: tool.Cost): cost_item = cost.get_active_cost_item() cost.load_cost_item_types(cost_item) -def assign_cost_item_quantity(ifc, cost, cost_item, related_object_type, prop_name): +def assign_cost_item_quantity(ifc: tool.Ifc, cost: tool.Cost, cost_item, related_object_type, prop_name): products = cost.get_products(related_object_type) if products: ifc.run("cost.assign_cost_item_quantity", cost_item=cost_item, products=products, prop_name=prop_name) cost.load_cost_item_quantity_assignments(cost_item, related_object_type=related_object_type) -def load_cost_item_quantities(cost): +def load_cost_item_quantities(cost: tool.Cost): cost.load_cost_item_quantities() -def load_cost_item_element_quantities(cost): +def load_cost_item_element_quantities(cost: tool.Cost): cost_item = cost.get_highlighted_cost_item() cost.load_cost_item_quantity_assignments(cost_item, related_object_type="PRODUCT") -def load_cost_item_task_quantities(cost): +def load_cost_item_task_quantities(cost: tool.Cost): cost_item = cost.get_highlighted_cost_item() cost.load_cost_item_quantity_assignments(cost_item, related_object_type="PROCESS") -def load_cost_item_resource_quantities(cost): +def load_cost_item_resource_quantities(cost: tool.Cost): cost_item = cost.get_highlighted_cost_item() cost.load_cost_item_quantity_assignments(cost_item, related_object_type="RESOURCE") -def assign_cost_value(ifc, cost_item, cost_rate): +def assign_cost_value(ifc: tool.Ifc, cost_item, cost_rate): ifc.run("cost.assign_cost_value", cost_item=cost_item, cost_rate=cost_rate) -def load_schedule_of_rates(cost, schedule_of_rates): +def load_schedule_of_rates(cost: tool.Cost, schedule_of_rates): cost.load_schedule_of_rates_tree(schedule_of_rates) -def unassign_cost_item_quantity(ifc, cost, cost_item, products): +def unassign_cost_item_quantity(ifc: tool.Ifc, cost: tool.Cost, cost_item, products): ifc.run("cost.unassign_cost_item_quantity", cost_item=cost_item, products=products) cost.load_cost_item_quantities() -def enable_editing_cost_item_quantities(cost, cost_item): +def enable_editing_cost_item_quantities(cost: tool.Cost, cost_item: ifcopenshell.entity_instance): cost.enable_editing_cost_item_quantities(cost_item) -def enable_editing_cost_item_values(cost, cost_item): +def enable_editing_cost_item_values(cost: tool.Cost, cost_item: ifcopenshell.entity_instance): cost.enable_editing_cost_item_values(cost_item) -def add_cost_item_quantity(ifc, cost_item, ifc_class): +def add_cost_item_quantity(ifc: tool.Ifc, cost_item, ifc_class): ifc.run("cost.add_cost_item_quantity", cost_item=cost_item, ifc_class=ifc_class) -def remove_cost_item_quantity(ifc, cost_item, physical_quantity): +def remove_cost_item_quantity(ifc: tool.Ifc, cost_item, physical_quantity): ifc.run("cost.remove_cost_item_quantity", cost_item=cost_item, physical_quantity=physical_quantity) -def enable_editing_cost_item_quantity(cost, physical_quantity): +def enable_editing_cost_item_quantity(cost: tool.Cost, physical_quantity): cost.load_cost_item_quantity_attributes(physical_quantity) cost.enable_editing_cost_item_quantity(physical_quantity) -def disable_editing_cost_item_quantity(cost): +def disable_editing_cost_item_quantity(cost: tool.Cost): cost.disable_editing_cost_item_quantity() -def edit_cost_item_quantity(ifc, cost, physical_quantity): +def edit_cost_item_quantity(ifc: tool.Ifc, cost: tool.Cost, physical_quantity): attributes = cost.get_cost_item_quantity_attributes() ifc.run("cost.edit_cost_item_quantity", physical_quantity=physical_quantity, attributes=attributes) cost.disable_editing_cost_item_quantity() cost.load_cost_item_quantities() -def add_cost_value(ifc, cost, parent, cost_type, cost_category): +def add_cost_value(ifc: tool.Ifc, cost: tool.Cost, parent, cost_type, cost_category): value = ifc.run("cost.add_cost_value", parent=parent) ifc.run( "cost.edit_cost_value", @@ -186,82 +213,82 @@ def add_cost_value(ifc, cost, parent, cost_type, cost_category): ) -def remove_cost_value(ifc, parent, cost_value): +def remove_cost_value(ifc: tool.Ifc, parent, cost_value): ifc.run("cost.remove_cost_value", parent=parent, cost_value=cost_value) -def enable_editing_cost_item_value(cost, cost_value): +def enable_editing_cost_item_value(cost: tool.Cost, cost_value): cost.load_cost_item_value_attributes(cost_value) cost.enable_editing_cost_item_value(cost_value) -def disable_editing_cost_item_value(cost): +def disable_editing_cost_item_value(cost: tool.Cost): cost.disable_editing_cost_item_value() -def enable_editing_cost_item_value_formula(cost, cost_value): +def enable_editing_cost_item_value_formula(cost: tool.Cost, cost_value): cost.load_cost_item_value_formula_attributes(cost_value) cost.enable_editing_cost_item_value_formula(cost_value) -def edit_cost_item_value_formula(ifc, cost, cost_value): +def edit_cost_item_value_formula(ifc: tool.Ifc, cost: tool.Cost, cost_value): formula = cost.get_cost_item_value_formula() ifc.run("cost.edit_cost_value_formula", cost_value=cost_value, formula=formula) cost.disable_editing_cost_item_value() -def edit_cost_value(ifc, cost, cost_value): +def edit_cost_value(ifc: tool.Ifc, cost: tool.Cost, cost_value): attributes = cost.get_cost_value_attributes() ifc.run("cost.edit_cost_value", cost_value=cost_value, attributes=attributes) cost.disable_editing_cost_item_value() # cost.load_cost_item_values(cost.get_highlighted_cost_item()) -def copy_cost_item_values(ifc, cost, source, destination): +def copy_cost_item_values(ifc: tool.Ifc, cost: tool.Cost, source, destination): ifc.run("cost.copy_cost_item_values", source=source, destination=destination) -def select_cost_item_products(cost, spatial, cost_item): +def select_cost_item_products(cost: tool.Cost, spatial: tool.Spatial, cost_item: ifcopenshell.entity_instance): is_deep = cost.show_nested_cost_item_elements() products = cost.get_cost_item_products(cost_item, is_deep) spatial.select_products(products) -def select_cost_schedule_products(cost, spatial, cost_schedule): +def select_cost_schedule_products(cost: tool.Cost, spatial: tool.Spatial, cost_schedule: ifcopenshell.entity_instance): products = cost.get_cost_schedule_products(cost_schedule) spatial.select_products(products) -def import_cost_schedule_csv(cost, file_path, is_schedule_of_rates): +def import_cost_schedule_csv(cost: tool.Cost, file_path, is_schedule_of_rates): cost.import_cost_schedule_csv(file_path, is_schedule_of_rates) -def add_cost_column(cost, name): +def add_cost_column(cost: tool.Cost, name): cost.add_cost_column(name) -def remove_cost_column(cost, name): +def remove_cost_column(cost: tool.Cost, name): cost.remove_cost_column(name) -def expand_cost_item_rate(cost, cost_item): +def expand_cost_item_rate(cost: tool.Cost, cost_item: ifcopenshell.entity_instance): cost.expand_cost_item_rate(cost_item) -def contract_cost_item_rate(cost, cost_item): +def contract_cost_item_rate(cost: tool.Cost, cost_item: ifcopenshell.entity_instance): cost.contract_cost_item_rate(cost_item) -def calculate_cost_item_resource_value(ifc, cost_item): +def calculate_cost_item_resource_value(ifc: tool.Ifc, cost_item: ifcopenshell.entity_instance): ifc.run("cost.calculate_cost_item_resource_value", cost_item=cost_item) -def export_cost_schedules(cost, filepath, format, cost_schedule=None): +def export_cost_schedules(cost: tool.Cost, filepath, format, cost_schedule=None): cost.play_sound() return cost.export_cost_schedules(filepath, format, cost_schedule) -def clear_cost_item_assignments(ifc, cost, cost_item, related_object_type): +def clear_cost_item_assignments(ifc: tool.Ifc, cost: tool.Cost, cost_item, related_object_type): products = cost.get_cost_item_assignments(cost_item, filter_by_type=related_object_type) if products: ifc.run("cost.unassign_cost_item_quantity", cost_item=cost_item, products=products) @@ -269,7 +296,7 @@ def clear_cost_item_assignments(ifc, cost, cost_item, related_object_type): cost.load_cost_schedule_tree() -def select_unassigned_products(ifc, cost, spatial): +def select_unassigned_products(ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial): spatial.deselect_objects() products = ifc.get().by_type("IfcElement") cost_schedule = cost.get_active_cost_schedule() @@ -277,11 +304,11 @@ def select_unassigned_products(ifc, cost, spatial): spatial.select_products(selection) -def load_product_cost_items(cost, product): +def load_product_cost_items(cost: tool.Cost, product): cost.load_product_cost_items(product) -def highlight_product_cost_item(spatial, cost, cost_item): +def highlight_product_cost_item(spatial: tool.Spatial, cost: tool.Cost, cost_item: ifcopenshell.entity_instance): cost_schedule = cost.get_cost_schedule(cost_item) is_cost_schedule_active = cost.is_cost_schedule_active(cost_schedule) if is_cost_schedule_active: @@ -290,7 +317,7 @@ def highlight_product_cost_item(spatial, cost, cost_item): return "Cost schedule is not active" -def change_parent_cost_item(ifc, cost, new_parent): +def change_parent_cost_item(ifc: tool.Ifc, cost: tool.Cost, new_parent): cost_item = cost.get_active_cost_item() if cost_item and cost.is_root_cost_item(cost_item): return "Cannot change root cost item" @@ -300,7 +327,7 @@ def change_parent_cost_item(ifc, cost, new_parent): cost.load_cost_schedule_tree() -def copy_cost_item(ifc, cost): +def copy_cost_item(ifc: tool.Ifc, cost: tool.Cost): cost_item = cost.get_highlighted_cost_item() if cost_item: cost_item = ifc.run("cost.copy_cost_item", cost_item=cost_item) @@ -308,7 +335,7 @@ def copy_cost_item(ifc, cost): cost.load_cost_schedule_tree() -def add_currency(ifc, cost): +def add_currency(ifc: tool.Ifc, cost: tool.Cost): unit = ifc.run("unit.add_monetary_unit") attributes = cost.get_currency_attributes() ifc.run("unit.edit_monetary_unit", unit=unit, attributes=attributes) diff --git a/src/blenderbim/blenderbim/tool/cost.py b/src/blenderbim/blenderbim/tool/cost.py index f51d157862..01a392e727 100644 --- a/src/blenderbim/blenderbim/tool/cost.py +++ b/src/blenderbim/blenderbim/tool/cost.py @@ -36,7 +36,7 @@ class Cost(blenderbim.core.tool.Cost): blenderbim.bim.helper.import_attributes2(cost_schedule, props.cost_schedule_attributes, callback=special_import) @classmethod - def enable_editing_cost_items(cls, cost_schedule): + def enable_editing_cost_items(cls, cost_schedule: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMCostProperties props.active_cost_schedule_id = cost_schedule.id() props.is_editing = "COST_ITEMS" @@ -473,7 +473,9 @@ class Cost(blenderbim.core.tool.Cost): cls.load_schedule_of_rates_tree(schedule_of_rates=tool.Ifc.get().by_id(int(props.schedule_of_rates))) @classmethod - def create_new_cost_item_li(cls, props_collection, cost_item, level_index, type="cost_rate"): + def create_new_cost_item_li( + cls, props_collection, cost_item: ifcopenshell.entity_instance, level_index: int, type: str = "cost_rate" + ) -> None: new = props_collection.add() new.ifc_definition_id = cost_item.id() new.name = cost_item.Name or "Unnamed" diff --git a/src/ifc5d/ifc5d/csv2ifc.py b/src/ifc5d/ifc5d/csv2ifc.py index 1e708d1e8f..776f40d4a6 100644 --- a/src/ifc5d/ifc5d/csv2ifc.py +++ b/src/ifc5d/ifc5d/csv2ifc.py @@ -23,22 +23,25 @@ import ifcopenshell.util.unit import ifcopenshell.util.selector import ifcopenshell.util.element import locale +from typing import Any, Optional + +CostItem = dict[str, Any] class Csv2Ifc: def __init__(self): - self.csv = None - self.file = None - self.cost_items = [] - self.cost_schedule = None - self.is_schedule_of_rates = False - self.units = {} + self.csv: str = None + self.file: ifcopenshell.file = None + self.cost_items: list[CostItem] = [] + self.cost_schedule: ifcopenshell.entity_instance = None + self.is_schedule_of_rates: bool = False + self.units: dict[str, ifcopenshell.entity_instance] = {} - def execute(self): + def execute(self) -> None: self.parse_csv() self.create_ifc() - def parse_csv(self): + def parse_csv(self) -> None: self.parents = {} self.headers = {} locale.setlocale(locale.LC_ALL, "") # set the system locale @@ -64,7 +67,7 @@ class Csv2Ifc: self.parents[hierarchy_key - 1]["children"].append(cost_data) self.parents[hierarchy_key] = cost_data - def get_row_cost_data(self, row): + def get_row_cost_data(self, row: list[str]) -> CostItem: name = row[self.headers["Name"]] identification = row[self.headers["Identification"]] if "Identification" in self.headers else None quantity = row[self.headers["Quantity"]] @@ -99,7 +102,7 @@ class Csv2Ifc: "children": [], } - def create_ifc(self): + def create_ifc(self) -> None: if not self.file: self.create_boilerplate_ifc() if not self.cost_schedule: @@ -108,11 +111,13 @@ class Csv2Ifc: self.cost_schedule.PredefinedType = "SCHEDULEOFRATES" self.create_cost_items(self.cost_items) - def create_cost_items(self, cost_items, parent=None): + def create_cost_items( + self, cost_items: list[CostItem], parent: Optional[ifcopenshell.entity_instance] = None + ) -> None: for cost_item in cost_items: self.create_cost_item(cost_item, parent) - def create_cost_item(self, cost_item, parent): + def create_cost_item(self, cost_item: CostItem, parent: Optional[ifcopenshell.entity_instance] = None) -> None: if parent is None: cost_item["ifc"] = ifcopenshell.api.run("cost.add_cost_item", self.file, cost_schedule=self.cost_schedule) else: @@ -161,6 +166,7 @@ class Csv2Ifc: quantity = ifcopenshell.api.run( "cost.add_cost_item_quantity", self.file, cost_item=cost_item["ifc"], ifc_class=quantity_class ) + # 3 IfcPhysicalSimpleQuantity Value quantity[3] = cost_item["Quantity"] if cost_item["assignments"]["Query"]: @@ -184,7 +190,7 @@ class Csv2Ifc: self.create_cost_items(cost_item["children"], cost_item["ifc"]) - def create_unit(self, symbol): + def create_unit(self, symbol) -> ifcopenshell.entity_instance: unit = self.units.get(symbol, None) if unit: return unit @@ -194,12 +200,12 @@ class Csv2Ifc: self.units[symbol] = unit return unit - def create_boilerplate_ifc(self): + def create_boilerplate_ifc(self) -> None: self.file = ifcopenshell.file(schema="IFC4") ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") -def has_property(self, product, property_name): +def has_property(self, product, property_name) -> bool: if not property_name: return True qtos = ifcopenshell.util.element.get_psets(product, qtos_only=True) From fb884991978b094f1223930e4443de0c27215df0 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 20 May 2024 15:09:56 +0500 Subject: [PATCH 220/429] ifc5d - check for mandatory fields in csv header --- src/ifc5d/ifc5d/csv2ifc.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/ifc5d/ifc5d/csv2ifc.py b/src/ifc5d/ifc5d/csv2ifc.py index 776f40d4a6..8483d34dd4 100644 --- a/src/ifc5d/ifc5d/csv2ifc.py +++ b/src/ifc5d/ifc5d/csv2ifc.py @@ -50,6 +50,7 @@ class Csv2Ifc: for row in reader: if not row[0]: continue + # parse header if row[0] == "Hierarchy": self.has_categories = True for i, col in enumerate(row): @@ -58,6 +59,17 @@ class Csv2Ifc: if col == "Value": self.has_categories = False self.headers[col] = i + + # validate header + mandatory_fields = {"Name", "Quantity", "Unit"} + if not self.is_schedule_of_rates: + mandatory_fields.update({"Property", "Query"}) + available_fields = set(self.headers.keys()) + if not mandatory_fields.issubset(available_fields): + raise Exception( + f"Missing mandatory fields in CSV header: {', '.join(mandatory_fields-available_fields)}" + ) + continue cost_data = self.get_row_cost_data(row) hierarchy_key = int(row[0]) From 678dbaa66aa81aa8947f6f9110dd458bc4d60228 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 20 May 2024 16:24:35 +0500 Subject: [PATCH 221/429] nest api to maintain order of related objects #4698 order of objects in .RelatedObjects is important (e.g. for cost items, it's the order of their appearance), so we should maintain it and cannot use sets for .RelatedObjects --- .../ifcopenshell/api/nest/assign_object.py | 16 ++++++++++------ .../ifcopenshell/api/nest/unassign_object.py | 12 ++++++------ .../test/api/nest/test_assign_object.py | 17 +++++++++++++++++ .../test/api/nest/test_unassign_object.py | 16 ++++++++++++++++ 4 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py index b49adc72a5..227163f467 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py @@ -104,20 +104,20 @@ def assign_object( return ifc2x3 = file.schema == "IFC2X3" + related_objects_set = set(related_objects) - related_objects = set(settings["related_objects"]) - relating_object = settings["relating_object"] if ifc2x3: is_nested_by = next((i for i in relating_object.IsDecomposedBy if i.is_a("IfcRelNests")), None) else: is_nested_by = next((i for i in relating_object.IsNestedBy), None) + # NOTE: maintain .RelatedObjects order as it has meaning in IFC previous_nests_rels: set[ifcopenshell.entity_instance] = set() objects_without_nests: list[ifcopenshell.entity_instance] = [] objects_with_nests: list[ifcopenshell.entity_instance] = [] # check if there is anything to change - for object in related_objects: + for object in related_objects_set: if ifc2x3: object_rel = next((i for i in object.Decomposes if i.is_a("IfcRelNests")), None) else: @@ -143,7 +143,7 @@ def assign_object( # unassign elements from previous nests for nests in previous_nests_rels: - cur_related_objects = set(nests.RelatedObjects) - related_objects + cur_related_objects = [o for o in nests.RelatedObjects if o not in related_objects_set] if cur_related_objects: nests.RelatedObjects = list(cur_related_objects) ifcopenshell.api.run("owner.update_owner_history", file, **{"element": nests}) @@ -155,7 +155,11 @@ def assign_object( # assign elements to a new nesting if is_nested_by: - is_nested_by.RelatedObjects = list(set(is_nested_by.RelatedObjects) | related_objects) + cur_related_objects = list(is_nested_by.RelatedObjects) + cur_related_objects_set = set(cur_related_objects) + is_nested_by.RelatedObjects = cur_related_objects + [ + o for o in related_objects if o not in cur_related_objects_set + ] ifcopenshell.api.run("owner.update_owner_history", file, **{"element": is_nested_by}) else: is_nested_by = file.create_entity( @@ -163,7 +167,7 @@ def assign_object( **{ "GlobalId": ifcopenshell.guid.new(), "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", file), - "RelatedObjects": list(related_objects), + "RelatedObjects": related_objects, "RelatingObject": relating_object, } ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py b/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py index 42e35777ad..bfd5549ad2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/unassign_object.py @@ -49,23 +49,23 @@ def unassign_object(file: ifcopenshell.file, related_objects: list[ifcopenshell. # nothing is returned, relationship is removed ifcopenshell.api.run("nest.unassign_object", model, related_objects=[subtask2]) """ - settings = {"related_objects": related_objects} - related_objects = set(settings["related_objects"]) + # NOTE: maintain .RelatedObjects order as it has meaning in IFC + related_objects_set = set(related_objects) ifc2x3 = file.schema == "IFC2X3" if ifc2x3: rels = set( rel - for object in related_objects + for object in related_objects_set if (rel := next((rel for rel in object.Decomposes if rel.is_a("IfcRelNests")), None)) ) else: rels = set(rel for object in related_objects if (rel := next((rel for rel in object.Nests), None))) for rel in rels: - related_objects = set(rel.RelatedObjects) - related_objects - if related_objects: - rel.RelatedObjects = list(related_objects) + cur_related_objects = [o for o in rel.RelatedObjects if o not in related_objects_set] + if cur_related_objects: + rel.RelatedObjects = cur_related_objects ifcopenshell.api.run("owner.update_owner_history", file, **{"element": rel}) else: history = rel.OwnerHistory diff --git a/src/ifcopenshell-python/test/api/nest/test_assign_object.py b/src/ifcopenshell-python/test/api/nest/test_assign_object.py index 25d4259627..181ff09fd7 100644 --- a/src/ifcopenshell-python/test/api/nest/test_assign_object.py +++ b/src/ifcopenshell-python/test/api/nest/test_assign_object.py @@ -66,6 +66,23 @@ class TestAssignObject(test.bootstrap.IFC4): with pytest.raises(RuntimeError): self.file.by_id(rel_id) + def test_maintain_assignment_order_in_related_objects(self): + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcTask") + subelements = [ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcTask") for _ in range(5)] + for i in range(5): + ifcopenshell.api.run( + "nest.assign_object", self.file, related_objects=subelements[: i + 1], relating_object=element + ) + rel = self.file.by_type("IfcRelNests")[0] + assert rel.RelatedObjects == tuple(subelements[: i + 1]) + + # maintain the order in the affected relationships too + element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcTask") + ifcopenshell.api.run( + "nest.assign_object", self.file, related_objects=subelements[2:3], relating_object=element2 + ) + assert rel.RelatedObjects == tuple(subelements[:2] + subelements[3:]) + class TestAssignObjectIFC2X3(test.bootstrap.IFC2X3, TestAssignObject): pass diff --git a/src/ifcopenshell-python/test/api/nest/test_unassign_object.py b/src/ifcopenshell-python/test/api/nest/test_unassign_object.py index 479ab0bcce..a23c452adf 100644 --- a/src/ifcopenshell-python/test/api/nest/test_unassign_object.py +++ b/src/ifcopenshell-python/test/api/nest/test_unassign_object.py @@ -50,5 +50,21 @@ class TestUnassignObject(test.bootstrap.IFC4): ifcopenshell.api.run("nest.unassign_object", self.file, related_objects=[subelement]) assert len(self.file.by_type("IfcRelNests")) == 0 + def test_maintain_assignment_order_in_related_objects(self): + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcTask") + subelements = [ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcTask") for _ in range(5)] + rel = self.file.create_entity("IfcRelNests", RelatingObject=element, RelatedObjects=subelements) + + original_order = subelements.copy() + # unassign elements in some random order + # skip 1 element to make sure rel won't get removed + removed_elements = set() + for i in (0, 3, 2, 4): + subelement = subelements[i] + ifcopenshell.api.run("nest.unassign_object", self.file, related_objects=[subelement]) + removed_elements.add(subelement) + assert rel.RelatedObjects == tuple([o for o in original_order if o not in removed_elements]) + + class TestUnassignObjectIFC2X3(test.bootstrap.IFC2X3, TestUnassignObject): pass From 9122f006c7056d802f5a0230427dcfba51b15fe0 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 20 May 2024 23:21:13 +1000 Subject: [PATCH 222/429] Deprecate material attributes panel in favour of new material manager. --- .../bim/module/attribute/__init__.py | 3 -- .../blenderbim/bim/module/attribute/data.py | 26 ------------- .../bim/module/attribute/operator.py | 20 ++-------- .../blenderbim/bim/module/attribute/ui.py | 39 ++----------------- src/blenderbim/blenderbim/core/material.py | 1 + src/blenderbim/blenderbim/core/tool.py | 5 ++- src/blenderbim/blenderbim/tool/material.py | 13 +++++++ 7 files changed, 25 insertions(+), 82 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/attribute/__init__.py b/src/blenderbim/blenderbim/bim/module/attribute/__init__.py index 33dc7a9304..cfe35505b5 100644 --- a/src/blenderbim/blenderbim/bim/module/attribute/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/attribute/__init__.py @@ -27,15 +27,12 @@ classes = ( operator.CopyAttributeToSelection, prop.BIMAttributeProperties, ui.BIM_PT_object_attributes, - ui.BIM_PT_material_attributes, ) def register(): bpy.types.Object.BIMAttributeProperties = bpy.props.PointerProperty(type=prop.BIMAttributeProperties) - bpy.types.Material.BIMAttributeProperties = bpy.props.PointerProperty(type=prop.BIMAttributeProperties) def unregister(): del bpy.types.Object.BIMAttributeProperties - del bpy.types.Material.BIMAttributeProperties diff --git a/src/blenderbim/blenderbim/bim/module/attribute/data.py b/src/blenderbim/blenderbim/bim/module/attribute/data.py index c3f3dc814d..955a4f8927 100644 --- a/src/blenderbim/blenderbim/bim/module/attribute/data.py +++ b/src/blenderbim/blenderbim/bim/module/attribute/data.py @@ -23,7 +23,6 @@ import blenderbim.tool as tool def refresh(): AttributesData.is_loaded = False - MaterialAttributesData.is_loaded = False class AttributesData: @@ -51,28 +50,3 @@ class AttributesData: key = "STEP ID" results.append({"name": key, "value": str(value)}) return results - - -class MaterialAttributesData: - data = {} - is_loaded = False - - @classmethod - def load(cls): - cls.data = {"ifc_definition_id": cls.ifc_definition_id(), "attributes": cls.attributes()} - cls.is_loaded = True - - @classmethod - def ifc_definition_id(cls): - return bpy.context.active_object.active_material.BIMObjectProperties.ifc_definition_id - - @classmethod - def attributes(cls): - results = [] - element = tool.Ifc.get_entity(bpy.context.active_object.active_material) - data = element.get_info() - for key, value in data.items(): - if value is None or isinstance(value, ifcopenshell.entity_instance) or key in ["id", "type"]: - continue - results.append({"name": key, "value": str(value)}) - return results diff --git a/src/blenderbim/blenderbim/bim/module/attribute/operator.py b/src/blenderbim/blenderbim/bim/module/attribute/operator.py index 21a81526ce..613cd72f80 100644 --- a/src/blenderbim/blenderbim/bim/module/attribute/operator.py +++ b/src/blenderbim/blenderbim/bim/module/attribute/operator.py @@ -40,14 +40,10 @@ class EnableEditingAttributes(bpy.types.Operator): bl_label = "Enable Editing Attributes" bl_options = {"REGISTER", "UNDO"} obj: bpy.props.StringProperty() - obj_type: bpy.props.StringProperty() def execute(self, context): self.file = IfcStore.get_file() - if self.obj_type == "Object": - obj = bpy.data.objects.get(self.obj) - elif self.obj_type == "Material": - obj = bpy.data.materials.get(self.obj) + obj = bpy.data.objects.get(self.obj) props = obj.BIMAttributeProperties props.attributes.clear() @@ -85,13 +81,9 @@ class DisableEditingAttributes(bpy.types.Operator): bl_label = "Disable Editing Attributes" bl_options = {"REGISTER", "UNDO"} obj: bpy.props.StringProperty() - obj_type: bpy.props.StringProperty() def execute(self, context): - if self.obj_type == "Object": - obj = bpy.data.objects.get(self.obj) - elif self.obj_type == "Material": - obj = bpy.data.materials.get(self.obj) + obj = bpy.data.objects.get(self.obj) props = obj.BIMAttributeProperties props.is_editing_attributes = False return {"FINISHED"} @@ -102,14 +94,10 @@ class EditAttributes(bpy.types.Operator, Operator): bl_label = "Edit Attributes" bl_options = {"REGISTER", "UNDO"} obj: bpy.props.StringProperty() - obj_type: bpy.props.StringProperty() def _execute(self, context): self.file = IfcStore.get_file() - if self.obj_type == "Object": - obj = bpy.data.objects.get(self.obj) - elif self.obj_type == "Material": - obj = bpy.data.materials.get(self.obj) + obj = bpy.data.objects.get(self.obj) props = obj.BIMAttributeProperties product = tool.Ifc.get_entity(obj) @@ -126,7 +114,7 @@ class EditAttributes(bpy.types.Operator, Operator): attributes = blenderbim.bim.helper.export_attributes(props.attributes, callback=callback) ifcopenshell.api.run("attribute.edit_attributes", self.file, product=product, attributes=attributes) - bpy.ops.bim.disable_editing_attributes(obj=obj.name, obj_type=self.obj_type) + bpy.ops.bim.disable_editing_attributes(obj=obj.name) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/attribute/ui.py b/src/blenderbim/blenderbim/bim/module/attribute/ui.py index 7ffd360c19..e1948dcc2b 100644 --- a/src/blenderbim/blenderbim/bim/module/attribute/ui.py +++ b/src/blenderbim/blenderbim/bim/module/attribute/ui.py @@ -19,28 +19,25 @@ import blenderbim.bim.helper from bpy.types import Panel from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.attribute.data import AttributesData, MaterialAttributesData +from blenderbim.bim.module.attribute.data import AttributesData -def draw_ui(context, layout, obj_type, attributes): - obj = context.active_object if obj_type == "Object" else context.active_object.active_material +def draw_ui(context, layout, attributes): + obj = context.active_object oprops = obj.BIMObjectProperties props = obj.BIMAttributeProperties if props.is_editing_attributes: row = layout.row(align=True) op = row.operator("bim.edit_attributes", icon="CHECKMARK", text="Save Attributes") - op.obj_type = obj_type op.obj = obj.name op = row.operator("bim.disable_editing_attributes", icon="CANCEL", text="") - op.obj_type = obj_type op.obj = obj.name blenderbim.bim.helper.draw_attributes(props.attributes, layout, copy_operator="bim.copy_attribute_to_selection") else: row = layout.row() op = row.operator("bim.enable_editing_attributes", icon="GREASEPENCIL", text="Edit") - op.obj_type = obj_type op.obj = obj.name for attribute in attributes: @@ -72,32 +69,4 @@ class BIM_PT_object_attributes(Panel): def draw(self, context): if not AttributesData.is_loaded: AttributesData.load() - draw_ui(context, self.layout, "Object", AttributesData.data["attributes"]) - - -class BIM_PT_material_attributes(Panel): - bl_label = "Material Attributes" - bl_idname = "BIM_PT_material_attributes" - bl_space_type = "PROPERTIES" - bl_region_type = "WINDOW" - bl_context = "material" - - @classmethod - def poll(cls, context): - if not IfcStore.get_file(): - return False - try: - return bool(context.active_object.active_material.BIMObjectProperties.ifc_definition_id) - except: - return False - - def draw(self, context): - if not MaterialAttributesData.is_loaded: - MaterialAttributesData.load() - elif ( - context.active_object.active_material.BIMObjectProperties.ifc_definition_id - != MaterialAttributesData.data["ifc_definition_id"] - ): - MaterialAttributesData.load() - - draw_ui(context, self.layout, "Material", MaterialAttributesData.data["attributes"]) + draw_ui(context, self.layout, AttributesData.data["attributes"]) diff --git a/src/blenderbim/blenderbim/core/material.py b/src/blenderbim/blenderbim/core/material.py index da265b2a7c..87a3ae9e0a 100644 --- a/src/blenderbim/blenderbim/core/material.py +++ b/src/blenderbim/blenderbim/core/material.py @@ -85,6 +85,7 @@ def enable_editing_material(material_tool, material): def edit_material(ifc, material_tool, material): attributes = material_tool.get_material_attributes() ifc.run("material.edit_material", material=material, attributes=attributes) + material_tool.sync_blender_material_name(material) material_tool.disable_editing_material() material_type = material_tool.get_active_material_type() material_tool.import_material_definitions(material_type) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 186ca93001..ec5a7550c3 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -487,12 +487,12 @@ class Material: def disable_editing_materials(cls): pass def enable_editing_material(cls, material): pass def enable_editing_materials(cls): pass - def get_active_material_type(cls): pass def get_active_material(cls): pass + def get_active_material_type(cls): pass def get_active_object_material(cls, obj): pass def get_elements_by_material(cls, material): pass - def get_material_attributes(cls): pass def get_material(cls, element, should_inherit): pass + def get_material_attributes(cls): pass def get_name(cls, obj): pass def get_type(cls, element): pass def has_material_profile(cls, element): pass @@ -503,6 +503,7 @@ class Material: def is_material_used_in_sets(cls, material): pass def load_material_attributes(cls, material): pass def replace_material_with_material_profile(cls, element): pass + def sync_blender_material_name(cls, material): pass @interface diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index e49b6a3d61..03a7cf940d 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -242,3 +242,16 @@ class Material(blenderbim.core.tool.Material): meshes_to_objects[mesh] = obj for obj in meshes_to_objects.values(): tool.Geometry.reload_representation(obj) + + @classmethod + def sync_blender_material_name(cls, material): + name = material.Name or "Unnamed" + obj = tool.Ifc.get_object(material) + if obj: + obj.name = name + style = tool.Style.get_style(obj) + if style: + style.Name = name + obj = tool.Ifc.get_object(style) + if obj: + obj.name = name From 1b74a9966772f6f1d5b03aa1273075f33f3c7746 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 21 May 2024 11:49:48 +0500 Subject: [PATCH 223/429] use delete_ifc_object removing a type It was acting a bit different - e.g. leaving mesh representation from type on occurrences leaving to lots of errors. Though there is still #3931 --- src/blenderbim/blenderbim/bim/module/type/operator.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/type/operator.py b/src/blenderbim/blenderbim/bim/module/type/operator.py index 820c197eb9..f88bc712f4 100644 --- a/src/blenderbim/blenderbim/bim/module/type/operator.py +++ b/src/blenderbim/blenderbim/bim/module/type/operator.py @@ -512,10 +512,7 @@ class RemoveType(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): element = tool.Ifc.get().by_id(self.element) obj = tool.Ifc.get_object(element) - ifcopenshell.api.run("root.remove_product", tool.Ifc.get(), product=element) - if obj: - tool.Ifc.unlink(obj=obj) - bpy.data.objects.remove(obj) + tool.Geometry.delete_ifc_object(obj) class RenameType(bpy.types.Operator, tool.Ifc.Operator): From 221dd9a7a27e8cf3a0e35aea723afc329e625256 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 21 May 2024 11:50:05 +0500 Subject: [PATCH 224/429] typing --- .../blenderbim/bim/module/cost/data.py | 4 + .../blenderbim/bim/module/model/opening.py | 18 ++- .../bim/module/pset_template/data.py | 1 + src/blenderbim/blenderbim/core/cost.py | 24 ++-- src/blenderbim/blenderbim/core/drawing.py | 106 ++++++++++++------ src/blenderbim/blenderbim/tool/blender.py | 2 +- src/blenderbim/blenderbim/tool/cost.py | 4 +- src/blenderbim/blenderbim/tool/drawing.py | 58 +++++----- src/blenderbim/blenderbim/tool/geometry.py | 2 +- src/blenderbim/blenderbim/tool/model.py | 3 +- src/blenderbim/blenderbim/tool/spatial.py | 5 +- .../ifcopenshell/util/cost.py | 28 +++-- 12 files changed, 164 insertions(+), 91 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/data.py b/src/blenderbim/blenderbim/bim/module/cost/data.py index b1a7d6f365..61bf88ddc3 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/data.py +++ b/src/blenderbim/blenderbim/bim/module/cost/data.py @@ -19,10 +19,13 @@ import bpy import ifcopenshell import ifcopenshell.util.cost +import ifcopenshell.util.date import ifcopenshell.util.element +import ifcopenshell.util.unit import blenderbim.tool as tool import blenderbim.bim.schema from ifcopenshell.util.doc import get_entity_doc, get_predefined_type_doc +from typing import Any def refresh(): @@ -34,6 +37,7 @@ def refresh(): class CostSchedulesData: data = {} is_loaded = False + _cost_values: dict[int, dict[str, Any]] @classmethod def load(cls): diff --git a/src/blenderbim/blenderbim/bim/module/model/opening.py b/src/blenderbim/blenderbim/bim/module/model/opening.py index 1d55fb305d..5a7e517d71 100644 --- a/src/blenderbim/blenderbim/bim/module/model/opening.py +++ b/src/blenderbim/blenderbim/bim/module/model/opening.py @@ -44,6 +44,7 @@ from bpy.types import SpaceView3D from bpy.props import FloatProperty from bpy_extras.object_utils import AddObjectHelper, object_data_add from gpu_extras.batch import batch_for_shader +from typing import Union, Optional, Any class AddFilledOpening(bpy.types.Operator, tool.Ifc.Operator): @@ -59,7 +60,12 @@ class AddFilledOpening(bpy.types.Operator, tool.Ifc.Operator): class FilledOpeningGenerator: - def generate(self, filling_obj, voided_obj, target=None): + def generate( + self, + filling_obj: Union[bpy.types.Object, None], + voided_obj: Union[bpy.types.Object, None], + target: Optional[Vector] = None, + ) -> None: props = bpy.context.scene.BIMModelProperties unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) @@ -187,7 +193,7 @@ class FilledOpeningGenerator: should_sync_changes_first=False, ) - def regenerate_from_type(self, usecase_path, ifc_file, settings): + def regenerate_from_type(self, usecase_path: str, ifc_file: ifcopenshell.file, settings: dict[str, Any]) -> None: relating_type = settings["relating_type"] for related_object in settings["related_objects"]: @@ -252,7 +258,9 @@ class FilledOpeningGenerator: should_sync_changes_first=False, ) - def generate_opening_from_filling(self, filling, filling_obj): + def generate_opening_from_filling( + self, filling: ifcopenshell.entity_instance, filling_obj: bpy.types.Object + ) -> ifcopenshell.entity_instance: # Since openings are reused later, we give a default thickness of 1.2m # which should cover the majority of curved, or super thick walls. thickness = 1.2 @@ -346,7 +354,9 @@ class FilledOpeningGenerator: return True return False - def get_existing_opening_occurrence_if_any(self, filling): + def get_existing_opening_occurrence_if_any( + self, filling: ifcopenshell.entity_instance + ) -> Union[ifcopenshell.entity_instance, None]: filling_type = ifcopenshell.util.element.get_type(filling) if filling_type: filling_occurrences = ifcopenshell.util.element.get_types(filling_type) diff --git a/src/blenderbim/blenderbim/bim/module/pset_template/data.py b/src/blenderbim/blenderbim/bim/module/pset_template/data.py index 96c17cc712..77b6685a36 100644 --- a/src/blenderbim/blenderbim/bim/module/pset_template/data.py +++ b/src/blenderbim/blenderbim/bim/module/pset_template/data.py @@ -21,6 +21,7 @@ import bpy import pathlib import ifcopenshell import ifcopenshell.util.attribute +import ifcopenshell.util.doc import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore diff --git a/src/blenderbim/blenderbim/core/cost.py b/src/blenderbim/blenderbim/core/cost.py index e703844b23..f23cb60a49 100644 --- a/src/blenderbim/blenderbim/core/cost.py +++ b/src/blenderbim/blenderbim/core/cost.py @@ -109,7 +109,9 @@ def edit_cost_item(ifc: tool.Ifc, cost: tool.Cost): cost.load_cost_schedule_tree() -def assign_cost_item_type(ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item, prop_name): +def assign_cost_item_type( + ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item: ifcopenshell.entity_instance, prop_name +): product_types = spatial.get_selected_product_types() [ ifc.run("control.assign_control", relating_control=cost_item, related_object=product_type) @@ -118,7 +120,9 @@ def assign_cost_item_type(ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost.load_cost_item_types(cost_item) -def unassign_cost_item_type(ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item, product_types): +def unassign_cost_item_type( + ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item: ifcopenshell.entity_instance, product_types +): if not product_types: product_types = spatial.get_selected_product_types() [ @@ -133,7 +137,9 @@ def load_cost_item_types(cost: tool.Cost): cost.load_cost_item_types(cost_item) -def assign_cost_item_quantity(ifc: tool.Ifc, cost: tool.Cost, cost_item, related_object_type, prop_name): +def assign_cost_item_quantity( + ifc: tool.Ifc, cost: tool.Cost, cost_item: ifcopenshell.entity_instance, related_object_type, prop_name +): products = cost.get_products(related_object_type) if products: ifc.run("cost.assign_cost_item_quantity", cost_item=cost_item, products=products, prop_name=prop_name) @@ -159,7 +165,7 @@ def load_cost_item_resource_quantities(cost: tool.Cost): cost.load_cost_item_quantity_assignments(cost_item, related_object_type="RESOURCE") -def assign_cost_value(ifc: tool.Ifc, cost_item, cost_rate): +def assign_cost_value(ifc: tool.Ifc, cost_item: ifcopenshell.entity_instance, cost_rate): ifc.run("cost.assign_cost_value", cost_item=cost_item, cost_rate=cost_rate) @@ -167,7 +173,7 @@ def load_schedule_of_rates(cost: tool.Cost, schedule_of_rates): cost.load_schedule_of_rates_tree(schedule_of_rates) -def unassign_cost_item_quantity(ifc: tool.Ifc, cost: tool.Cost, cost_item, products): +def unassign_cost_item_quantity(ifc: tool.Ifc, cost: tool.Cost, cost_item: ifcopenshell.entity_instance, products): ifc.run("cost.unassign_cost_item_quantity", cost_item=cost_item, products=products) cost.load_cost_item_quantities() @@ -180,11 +186,11 @@ def enable_editing_cost_item_values(cost: tool.Cost, cost_item: ifcopenshell.ent cost.enable_editing_cost_item_values(cost_item) -def add_cost_item_quantity(ifc: tool.Ifc, cost_item, ifc_class): +def add_cost_item_quantity(ifc: tool.Ifc, cost_item: ifcopenshell.entity_instance, ifc_class): ifc.run("cost.add_cost_item_quantity", cost_item=cost_item, ifc_class=ifc_class) -def remove_cost_item_quantity(ifc: tool.Ifc, cost_item, physical_quantity): +def remove_cost_item_quantity(ifc: tool.Ifc, cost_item: ifcopenshell.entity_instance, physical_quantity): ifc.run("cost.remove_cost_item_quantity", cost_item=cost_item, physical_quantity=physical_quantity) @@ -288,7 +294,9 @@ def export_cost_schedules(cost: tool.Cost, filepath, format, cost_schedule=None) return cost.export_cost_schedules(filepath, format, cost_schedule) -def clear_cost_item_assignments(ifc: tool.Ifc, cost: tool.Cost, cost_item, related_object_type): +def clear_cost_item_assignments( + ifc: tool.Ifc, cost: tool.Cost, cost_item: ifcopenshell.entity_instance, related_object_type +): products = cost.get_cost_item_assignments(cost_item, filter_by_type=related_object_type) if products: ifc.run("cost.unassign_cost_item_quantity", cost_item=cost_item, products=products) diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index f52fc2e1c5..582a80551b 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -16,36 +16,44 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from __future__ import annotations from pathlib import Path -import ifcopenshell +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + import bpy + import ifcopenshell + import blenderbim.tool as tool -def enable_editing_text(drawing, obj=None): +def enable_editing_text(drawing: tool.Drawing, obj: bpy.types.Object) -> None: drawing.enable_editing_text(obj) drawing.import_text_attributes(obj) -def disable_editing_text(drawing, obj=None): +def disable_editing_text(drawing: tool.Drawing, obj: bpy.types.Object) -> None: drawing.disable_editing_text(obj) -def edit_text(drawing, obj=None): +def edit_text(drawing: tool.Drawing, obj: bpy.types.Object) -> None: drawing.synchronise_ifc_and_text_attributes(obj) drawing.update_text_size_pset(obj) drawing.update_text_value(obj) drawing.disable_editing_text(obj) -def enable_editing_assigned_product(drawing, obj=None): +def enable_editing_assigned_product(drawing: tool.Drawing, obj: bpy.types.Object) -> None: drawing.enable_editing_assigned_product(obj) drawing.import_assigned_product(obj) -def disable_editing_assigned_product(drawing, obj=None): +def disable_editing_assigned_product(drawing: tool.Drawing, obj: bpy.types.Object) -> None: drawing.disable_editing_assigned_product(obj) -def edit_assigned_product(ifc, drawing, obj=None, product=None): +def edit_assigned_product( + ifc: tool.Ifc, drawing: tool.Drawing, obj: bpy.types.Object, product: Optional[ifcopenshell.entity_instance] = None +) -> None: element = ifc.get_entity(obj) existing_product = drawing.get_assigned_product(element) if existing_product != product: @@ -58,16 +66,16 @@ def edit_assigned_product(ifc, drawing, obj=None, product=None): drawing.disable_editing_assigned_product(obj) -def load_sheets(drawing): +def load_sheets(drawing: tool.Drawing) -> None: drawing.import_sheets() drawing.enable_editing_sheets() -def disable_editing_sheets(drawing): +def disable_editing_sheets(drawing: tool.Drawing) -> None: drawing.disable_editing_sheets() -def add_sheet(ifc, drawing, titleblock: ifcopenshell.entity_instance): +def add_sheet(ifc: tool.Ifc, drawing, titleblock: ifcopenshell.entity_instance) -> None: sheet = ifc.run("document.add_information") layout = ifc.run("document.add_reference", information=sheet) titleblock_reference = ifc.run("document.add_reference", information=sheet) @@ -93,7 +101,7 @@ def add_sheet(ifc, drawing, titleblock: ifcopenshell.entity_instance): drawing.import_sheets() -def regenerate_sheet(drawing, sheet=None): +def regenerate_sheet(drawing: tool.Drawing, sheet: ifcopenshell.entity_instance) -> None: titleblock_uri = drawing.get_document_uri(sheet, "TITLEBLOCK") drawing.create_svg_sheet(sheet, drawing.sanitise_filename(Path(titleblock_uri).stem)) try: @@ -104,11 +112,11 @@ def regenerate_sheet(drawing, sheet=None): drawing.delete_file(path_layout) -def open_sheet(drawing, sheet=None): +def open_sheet(drawing: tool.Drawing, sheet: ifcopenshell.entity_instance) -> None: drawing.open_layout_svg(drawing.get_document_uri(sheet, "LAYOUT")) -def remove_sheet(ifc, drawing, sheet=None): +def remove_sheet(ifc: tool.Ifc, drawing: tool.Drawing, sheet: ifcopenshell.entity_instance) -> None: for reference in drawing.get_document_references(sheet): if drawing.get_reference_description(reference) in ("LAYOUT", "SHEET", "REVISION", "RASTER"): uri = ifc.resolve_uri(drawing.get_document_uri(reference)) @@ -118,7 +126,7 @@ def remove_sheet(ifc, drawing, sheet=None): drawing.import_sheets() -def rename_sheet(ifc, drawing, sheet: ifcopenshell.entity_instance, identification: str, name: str) -> None: +def rename_sheet(ifc: tool.Ifc, drawing, sheet: ifcopenshell.entity_instance, identification: str, name: str) -> None: if ifc.get_schema() == "IFC2X3": attributes = {"DocumentId": identification, "Name": name} else: @@ -144,30 +152,32 @@ def rename_sheet(ifc, drawing, sheet: ifcopenshell.entity_instance, identificati drawing.move_file(old_location, ifc.resolve_uri(new_location)) -def rename_reference(ifc, drawing, reference=None, identification=None): +def rename_reference( + ifc: tool.Ifc, drawing: tool.Drawing, reference: ifcopenshell.entity_instance, identification: str +) -> None: attributes = drawing.generate_reference_attributes(reference, Identification=identification) ifc.run("document.edit_reference", reference=reference, attributes=attributes) -def load_schedules(drawing): +def load_schedules(drawing: tool.Drawing) -> None: drawing.import_documents("SCHEDULE") drawing.enable_editing_schedules() -def load_references(drawing): +def load_references(drawing: tool.Drawing) -> None: drawing.import_documents("REFERENCE") drawing.enable_editing_references() -def disable_editing_schedules(drawing): +def disable_editing_schedules(drawing: tool.Drawing) -> None: drawing.disable_editing_schedules() -def disable_editing_references(drawing): +def disable_editing_references(drawing: tool.Drawing) -> None: drawing.disable_editing_references() -def add_document(ifc, drawing, document_type, uri=None): +def add_document(ifc: tool.Ifc, drawing: tool.Drawing, document_type: tool.Drawing.DOCUMENT_TYPE, uri: str) -> None: document = ifc.run("document.add_information") reference = ifc.run("document.add_reference", information=document) name = drawing.get_path_filename(uri) @@ -180,34 +190,43 @@ def add_document(ifc, drawing, document_type, uri=None): drawing.import_documents(document_type) -def remove_document(ifc, drawing, document_type, document=None): +def remove_document( + ifc: tool.Ifc, + drawing: tool.Drawing, + document_type: tool.Drawing.DOCUMENT_TYPE, + document: ifcopenshell.entity_instance, +) -> None: ifc.run("document.remove_information", information=document) drawing.import_documents(document_type) -def open_schedule(drawing, schedule=None): +def open_schedule(drawing: tool.Drawing, schedule: ifcopenshell.entity_instance) -> None: drawing.open_spreadsheet(drawing.get_document_uri(schedule)) -def open_reference(drawing, reference=None): +def open_reference(drawing: tool.Drawing, reference: ifcopenshell.entity_instance) -> None: drawing.open_svg(drawing.get_document_uri(reference)) -def update_document_name(ifc, drawing, document=None, name=None): +def update_document_name( + ifc: tool.Ifc, drawing: tool.Drawing, document: ifcopenshell.entity_instance, name=None +) -> None: if drawing.get_name(document) != name: ifc.run("document.edit_information", information=document, attributes={"Name": name}) -def load_drawings(drawing): +def load_drawings(drawing: tool.Drawing) -> None: drawing.import_drawings() drawing.enable_editing_drawings() -def disable_editing_drawings(drawing): +def disable_editing_drawings(drawing: tool.Drawing) -> None: drawing.disable_editing_drawings() -def add_drawing(ifc, collector, drawing, target_view=None, location_hint=None): +def add_drawing( + ifc: tool.Ifc, collector: tool.Collector, drawing: tool.Drawing, target_view=None, location_hint=None +) -> None: drawing_name = drawing.ensure_unique_drawing_name(drawing.generate_drawing_name(target_view, location_hint)) drawing_matrix = drawing.generate_drawing_matrix(target_view, location_hint) camera = drawing.create_camera(drawing_name, drawing_matrix, location_hint) @@ -265,7 +284,12 @@ def add_drawing(ifc, collector, drawing, target_view=None, location_hint=None): drawing.import_drawings() -def duplicate_drawing(ifc, drawing_tool, drawing=None, should_duplicate_annotations=False): +def duplicate_drawing( + ifc: tool.Ifc, + drawing_tool: tool.Drawing, + drawing: ifcopenshell.entity_instance, + should_duplicate_annotations: bool = False, +) -> ifcopenshell.entity_instance: drawing_name = drawing_tool.ensure_unique_drawing_name(drawing_tool.get_name(drawing)) new_drawing = ifc.run("root.copy_class", product=drawing) drawing_tool.copy_representation(drawing, new_drawing) @@ -302,7 +326,7 @@ def duplicate_drawing(ifc, drawing_tool, drawing=None, should_duplicate_annotati return new_drawing -def remove_drawing(ifc, drawing_tool, drawing=None): +def remove_drawing(ifc: tool.Ifc, drawing_tool: tool.Drawing, drawing: ifcopenshell.entity_instance) -> None: if drawing_tool.is_active_drawing(drawing): drawing_tool.run_drawing_activate_model() @@ -330,7 +354,9 @@ def remove_drawing(ifc, drawing_tool, drawing=None): drawing_tool.import_drawings() -def update_drawing_name(ifc, drawing_tool, drawing=None, name=None): +def update_drawing_name( + ifc: tool.Ifc, drawing_tool: tool.Drawing, drawing: ifcopenshell.entity_instance, name=None +) -> None: if drawing_tool.get_name(drawing) != name: ifc.run("attribute.edit_attributes", product=drawing, attributes={"Name": name}) group = drawing_tool.get_drawing_group(drawing) @@ -364,7 +390,13 @@ def update_drawing_name(ifc, drawing_tool, drawing=None, name=None): drawing_tool.import_sheets() -def add_annotation(ifc, collector, drawing_tool, drawing=None, object_type=None): +def add_annotation( + ifc: tool.Ifc, + collector: tool.Collector, + drawing_tool: tool.Drawing, + drawing: ifcopenshell.entity_instance, + object_type: str, +) -> None: target_view = drawing_tool.get_drawing_target_view(drawing) context = drawing_tool.get_annotation_context(target_view, object_type) if not context: @@ -387,12 +419,14 @@ def add_annotation(ifc, collector, drawing_tool, drawing=None, object_type=None) drawing_tool.enable_editing(obj) -def build_schedule(drawing, schedule=None): +def build_schedule(drawing: tool.Drawing, schedule: ifcopenshell.entity_instance) -> None: drawing.create_svg_schedule(schedule) drawing.open_svg(drawing.get_path_with_ext(drawing.get_document_uri(schedule), "svg")) -def sync_references(ifc, collector, drawing_tool, drawing=None): +def sync_references( + ifc: tool.Ifc, collector: tool.Collector, drawing_tool: tool.Drawing, drawing: ifcopenshell.entity_instance +) -> None: if not drawing_tool.has_annotation(drawing): return @@ -437,11 +471,13 @@ def sync_references(ifc, collector, drawing_tool, drawing=None): drawing_tool.sync_object_representation(reference_obj) -def select_assigned_product(drawing, context): +def select_assigned_product(drawing: tool.Drawing, context: bpy.types.Context) -> None: drawing.select_assigned_product(context) -def activate_drawing_view(ifc, blender, drawing_tool, drawing): +def activate_drawing_view( + ifc: tool.Ifc, blender: tool.Blender, drawing_tool: tool.Drawing, drawing: ifcopenshell.entity_instance +) -> None: camera = ifc.get_object(drawing) if not camera: camera = drawing_tool.import_drawing(drawing) diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index d5055bf9bf..64fa9bf40f 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -468,7 +468,7 @@ class Blender(blenderbim.core.tool.Blender): active_object.select_set(True) @classmethod - def enum_property_has_valid_index(cls, props, prop_name: str, enum_items: tuple) -> bool: + def enum_property_has_valid_index(cls, props: bpy.types.PropertyGroup, prop_name: str, enum_items: tuple) -> bool: """method created for readibility and to avoid console warnings like `pyrna_enum_to_py: current value '17' matches no enum in 'BIMModelProperties', '', 'relating_type_id'` """ diff --git a/src/blenderbim/blenderbim/tool/cost.py b/src/blenderbim/blenderbim/tool/cost.py index 01a392e727..2ce904b018 100644 --- a/src/blenderbim/blenderbim/tool/cost.py +++ b/src/blenderbim/blenderbim/tool/cost.py @@ -1,11 +1,13 @@ import os import bpy +import blenderbim.core.tool import blenderbim.tool as tool import ifcopenshell.util.date import ifcopenshell.util.cost import ifcopenshell.util.unit import blenderbim.bim.helper import json +from typing import Optional class Cost(blenderbim.core.tool.Cost): @@ -163,7 +165,7 @@ class Cost(blenderbim.core.tool.Cost): return @classmethod - def load_cost_item_types(cls, cost_item=None): + def load_cost_item_types(cls, cost_item: Optional[ifcopenshell.entity_instance] = None) -> None: if not cost_item: cost_item = cls.get_highlighted_cost_item() if not cost_item: diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index a223186670..d2a8f96aca 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -51,11 +51,14 @@ from blenderbim.bim.module.drawing.prop import get_diagram_scales, BOX_ALIGNMENT from lxml import etree from mathutils import Vector, Matrix from fractions import Fraction -from typing import Optional, Union, Iterable, Any +from typing import Optional, Union, Iterable, Any, Literal from pathlib import Path class Drawing(blenderbim.core.tool.Drawing): + ANNOTATION_DATA_TYPE = Literal["empty", "curve", "mesh"] + DOCUMENT_TYPE = Literal["SCHEDULE", "REFERENCE"] + @classmethod def canonicalise_class_name(cls, name): return re.sub("[^0-9a-zA-Z]+", "", name) @@ -68,11 +71,11 @@ class Drawing(blenderbim.core.tool.Drawing): ) @classmethod - def get_annotation_data_type(cls, object_type): + def get_annotation_data_type(cls, object_type: str) -> ANNOTATION_DATA_TYPE: return ANNOTATION_TYPES_DATA[object_type][3] @classmethod - def create_annotation_object(cls, drawing, object_type): + def create_annotation_object(cls, drawing: ifcopenshell.entity_instance, object_type: str) -> bpy.types.Object: data_type = cls.get_annotation_data_type(object_type) obj = annotation.Annotator.get_annotation_obj(drawing, object_type, data_type) if object_type == "FILL_AREA": @@ -298,15 +301,15 @@ class Drawing(blenderbim.core.tool.Drawing): bpy.context.scene.DocProperties.is_editing_sheets = False @classmethod - def disable_editing_text(cls, obj): + def disable_editing_text(cls, obj: bpy.types.Object) -> None: obj.BIMTextProperties.is_editing = False @classmethod - def disable_editing_assigned_product(cls, obj): + def disable_editing_assigned_product(cls, obj: bpy.types.Object) -> None: obj.BIMAssignedProductProperties.is_editing_product = False @classmethod - def enable_editing(cls, obj): + def enable_editing(cls, obj: bpy.types.Object) -> None: bpy.ops.object.select_all(action="DESELECT") bpy.context.view_layer.objects.active = obj obj.select_set(True) @@ -330,11 +333,11 @@ class Drawing(blenderbim.core.tool.Drawing): bpy.context.scene.DocProperties.is_editing_sheets = True @classmethod - def enable_editing_text(cls, obj): + def enable_editing_text(cls, obj: bpy.types.Object) -> None: obj.BIMTextProperties.is_editing = True @classmethod - def enable_editing_assigned_product(cls, obj): + def enable_editing_assigned_product(cls, obj: bpy.types.Object) -> None: obj.BIMAssignedProductProperties.is_editing_product = True @classmethod @@ -428,7 +431,7 @@ class Drawing(blenderbim.core.tool.Drawing): return location @classmethod - def get_path_filename(cls, path): + def get_path_filename(cls, path: str) -> str: return os.path.splitext(os.path.basename(path))[0] @classmethod @@ -483,7 +486,7 @@ class Drawing(blenderbim.core.tool.Drawing): return "" @classmethod - def get_name(cls, element): + def get_name(cls, element: ifcopenshell.entity_instance) -> Union[str, None]: return element.Name @classmethod @@ -563,7 +566,7 @@ class Drawing(blenderbim.core.tool.Drawing): ifcopenshell.util.element.remove_deep2(ifc_file, literal) @classmethod - def synchronise_ifc_and_text_attributes(cls, obj): + def synchronise_ifc_and_text_attributes(cls, obj: bpy.types.Object) -> None: literals = cls.get_text_literal(obj, return_list=True) literals_attributes = cls.export_text_literal_attributes(obj) defined_ifc_ids = [l.ifc_definition_id for l in obj.BIMTextProperties.literals] @@ -784,7 +787,7 @@ class Drawing(blenderbim.core.tool.Drawing): new.ifc_definition_id = drawing.id() # Last, to prevent unnecessary prop callbacks @classmethod - def import_documents(cls, document_type): + def import_documents(cls, document_type: DOCUMENT_TYPE) -> None: dprops = bpy.context.scene.DocProperties if document_type == "SCHEDULE": documents_collection = dprops.schedules @@ -845,7 +848,7 @@ class Drawing(blenderbim.core.tool.Drawing): return next(s for s in props.sheets[: props.active_sheet_index + 1][::-1] if s.is_sheet) @classmethod - def import_text_attributes(cls, obj): + def import_text_attributes(cls, obj: bpy.types.Object) -> None: props = obj.BIMTextProperties props.literals.clear() @@ -863,7 +866,7 @@ class Drawing(blenderbim.core.tool.Drawing): props.font_size = str(text_data["FontSize"]) @classmethod - def import_assigned_product(cls, obj): + def import_assigned_product(cls, obj: bpy.types.Object) -> None: element = tool.Ifc.get_entity(obj) product = cls.get_assigned_product(element) if product: @@ -934,7 +937,7 @@ class Drawing(blenderbim.core.tool.Drawing): bpy.context.scene.DocProperties.should_draw_decorations = True @classmethod - def update_text_value(cls, obj): + def update_text_value(cls, obj: bpy.types.Object) -> None: props = obj.BIMTextProperties literals = cls.get_text_literal(obj, return_list=True) cls.import_text_attributes(obj) @@ -943,7 +946,7 @@ class Drawing(blenderbim.core.tool.Drawing): props.literals[i].value = cls.replace_text_literal_variables(literal.Literal, product) @classmethod - def update_text_size_pset(cls, obj): + def update_text_size_pset(cls, obj: bpy.types.Object) -> None: """updates pset `EPset_Annotation.Classes` value based on current font size from `obj.BIMTextProperties.font_size` """ @@ -1522,7 +1525,7 @@ class Drawing(blenderbim.core.tool.Drawing): tool.Geometry.record_object_position(obj) @classmethod - def get_document_references(cls, document): + def get_document_references(cls, document: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: if tool.Ifc.get_schema() == "IFC2X3": return document.DocumentReferences or [] return document.HasDocumentReferences or [] @@ -1553,7 +1556,9 @@ class Drawing(blenderbim.core.tool.Drawing): return reference.Description @classmethod - def generate_reference_attributes(cls, reference: ifcopenshell.entity_instance, **attributes: Any) -> dict[str, Any]: + def generate_reference_attributes( + cls, reference: ifcopenshell.entity_instance, **attributes: Any + ) -> dict[str, Any]: """will automatically convert attributes below for IFC2X3 compatibility: - Identification -> ItemReference @@ -1635,23 +1640,22 @@ class Drawing(blenderbim.core.tool.Drawing): base_elements = set(ifc_file.by_type("IfcElement") + ifc_file.by_type("IfcSpatialElement")) elements = {e for e in (elements & base_elements) if e.is_a() != "IfcSpace"} - updated_set = set() for i in elements: # exclude annotations to avoid including annotations from other drawings - if not i.is_a("IfcAnnotation"): + if not i.is_a("IfcAnnotation"): updated_set.add(i) - #add aggregate too, if element is host by one + # add aggregate too, if element is host by one if i.Decomposes: aggregate = i.Decomposes[0].RelatingObject - #remove IfcProject for class iterator. See https://github.com/IfcOpenShell/IfcOpenShell/issues/4361#issuecomment-2081223615 - if not aggregate.is_a("IfcProject"): + # remove IfcProject for class iterator. See https://github.com/IfcOpenShell/IfcOpenShell/issues/4361#issuecomment-2081223615 + if not aggregate.is_a("IfcProject"): updated_set.add(aggregate) - # After the iteration is complete, update elements with updated set + # After the iteration is complete, update elements with updated set elements.update(updated_set) - + # add annotations from the current drawing annotations = tool.Drawing.get_group_elements(tool.Drawing.get_drawing_group(drawing)) elements.update(annotations) @@ -1694,7 +1698,7 @@ class Drawing(blenderbim.core.tool.Drawing): return reference.ReferencedDocument @classmethod - def select_assigned_product(cls, context): + def select_assigned_product(cls, context: bpy.types.Context) -> None: obj = context.active_object element = tool.Ifc.get_entity(obj) product = cls.get_assigned_product(element) @@ -1713,7 +1717,7 @@ class Drawing(blenderbim.core.tool.Drawing): return True if (camera and camera.data.type == "ORTHO") else False @classmethod - def is_active_drawing(cls, drawing): + def is_active_drawing(cls, drawing: ifcopenshell.entity_instance) -> bool: return drawing.id() == bpy.context.scene.DocProperties.active_drawing_id @classmethod diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 2d81ba415a..8031433e21 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -90,7 +90,7 @@ class Geometry(blenderbim.core.tool.Geometry): bpy.data.meshes.remove(data) @classmethod - def delete_ifc_object(cls, obj): + def delete_ifc_object(cls, obj: bpy.types.Object) -> None: element = tool.Ifc.get_entity(obj) if not element: return diff --git a/src/blenderbim/blenderbim/tool/model.py b/src/blenderbim/blenderbim/tool/model.py index 4025d37d39..d0c63912d4 100644 --- a/src/blenderbim/blenderbim/tool/model.py +++ b/src/blenderbim/blenderbim/tool/model.py @@ -23,6 +23,7 @@ import collections import collections.abc import numpy as np import ifcopenshell +import ifcopenshell.util.element import ifcopenshell.util.unit import ifcopenshell.util.placement import ifcopenshell.util.representation @@ -468,7 +469,7 @@ class Model(blenderbim.core.tool.Model): has_deleted_opening = True @classmethod - def get_material_layer_parameters(cls, element): + def get_material_layer_parameters(cls, element: ifcopenshell.entity_instance) -> dict[str, Any]: unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) layer_set_direction = "AXIS2" offset = 0.0 diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index 68c1d8c0e8..101d17e454 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -31,6 +31,7 @@ import json from math import pi from mathutils import Vector, Matrix from shapely import Polygon, MultiPolygon +from typing import Generator class Spatial(blenderbim.core.tool.Spatial): @@ -187,14 +188,14 @@ class Spatial(blenderbim.core.tool.Spatial): ] @classmethod - def get_selected_products(cls): + def get_selected_products(cls) -> Generator[ifcopenshell.entity_instance, None, None]: for obj in bpy.context.selected_objects: entity = tool.Ifc.get_entity(obj) if entity and entity.is_a("IfcProduct"): yield entity @classmethod - def get_selected_product_types(cls): + def get_selected_product_types(cls) -> Generator[ifcopenshell.entity_instance, None, None]: for obj in bpy.context.selected_objects: entity = tool.Ifc.get_entity(obj) if entity and entity.is_a("IfcTypeProduct"): diff --git a/src/ifcopenshell-python/ifcopenshell/util/cost.py b/src/ifcopenshell-python/ifcopenshell/util/cost.py index 4d15ee8f33..44852b6e9c 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/cost.py +++ b/src/ifcopenshell-python/ifcopenshell/util/cost.py @@ -17,13 +17,15 @@ # along with IfcOpenShell. If not, see . import lark +import ifcopenshell +from typing import Optional, Union arithmetic_operator_symbols = {"ADD": "+", "DIVIDE": "/", "MULTIPLY": "*", "SUBTRACT": "-"} symbol_arithmetic_operators = {"+": "ADD", "/": "DIVIDE", "*": "MULTIPLY", "-": "SUBTRACT"} -def get_primitive_applied_value(applied_value): +def get_primitive_applied_value(applied_value: Union[ifcopenshell.entity_instance, float, None]) -> float: if not applied_value: return 0.0 elif isinstance(applied_value, float): @@ -32,17 +34,21 @@ def get_primitive_applied_value(applied_value): return applied_value.wrappedValue elif applied_value.is_a("IfcMeasureWithUnit"): return applied_value.ValueComponent - assert False, "Applied value {applied_value} not implemented" + assert False, f"Applied value {applied_value} not implemented" -def get_total_quantity(root_element): +def get_total_quantity(root_element: ifcopenshell.entity_instance) -> Union[float, None]: + # 3 IfcPhysicalQuantity Value if root_element.is_a("IfcCostItem"): return sum([q[3] for q in root_element.CostQuantities or []]) or None elif root_element.is_a("IfcConstructionResource"): - return root_element.BaseQuantity[3] if root_element.BaseQuantity else 1.0 + quantity = root_element.BaseQuantity + return quantity[3] if quantity else 1.0 -def calculate_applied_value(root_element, cost_value, category_filter=None): +def calculate_applied_value( + root_element: ifcopenshell.entity_instance, cost_value: ifcopenshell.entity_instance, category_filter=None +) -> float: if cost_value.ArithmeticOperator and cost_value.Components: component_values = [] for component in cost_value.Components: @@ -75,11 +81,11 @@ def calculate_applied_value(root_element, cost_value, category_filter=None): return sum_child_root_elements(root_element, category_filter=cost_value.Category) else: return get_primitive_applied_value(cost_value.AppliedValue) - return 0 + return 0.0 -def sum_child_root_elements(root_element, category_filter=None): - result = 0 +def sum_child_root_elements(root_element: ifcopenshell.entity_instance, category_filter: Optional[str] = None) -> float: + result = 0.0 for rel in root_element.IsNestedBy: for child_root_element in rel.RelatedObjects: if root_element.is_a("IfcCostItem"): @@ -99,14 +105,14 @@ def sum_child_root_elements(root_element, category_filter=None): return result -def serialise_cost_value(cost_value): +def serialise_cost_value(cost_value: ifcopenshell.entity_instance) -> str: result = _serialise_cost_value(cost_value) if result and result[0] == "(" and result[-1] == ")": return result[1:-1] return result -def _serialise_cost_value(cost_value): +def _serialise_cost_value(cost_value: ifcopenshell.entity_instance) -> str: value = "" if cost_value.ArithmeticOperator and cost_value.Components: operator = arithmetic_operator_symbols[cost_value.ArithmeticOperator] @@ -133,7 +139,7 @@ def _serialise_cost_value(cost_value): return value -def serialise_applied_value(applied_value): +def serialise_applied_value(applied_value: ifcopenshell.entity_instance) -> str: if applied_value.is_a("IfcMonetaryMeasure"): return str(applied_value.wrappedValue) return "?" From 7622504d68c0a660380acfc3b58d6ce7f15598d1 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 21 May 2024 13:55:38 +0500 Subject: [PATCH 225/429] avoid even more invalid enum warnings... warnings like `pyrna_enum_to_py: current value '17' matches no enum in 'BIMModelProperties', '', 'relating_type_id'` --- src/blenderbim/blenderbim/bim/module/model/data.py | 4 +++- src/blenderbim/blenderbim/tool/blender.py | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/data.py b/src/blenderbim/blenderbim/bim/module/model/data.py index b1b8e3cab7..3f3ca4a4bb 100644 --- a/src/blenderbim/blenderbim/bim/module/model/data.py +++ b/src/blenderbim/blenderbim/bim/module/model/data.py @@ -53,7 +53,7 @@ class AuthoringData: cls.data["ifc_element_type"] = cls.ifc_element_type cls.data["ifc_classes"] = cls.ifc_classes() cls.data["relating_type_id"] = cls.relating_type_id() # only after .ifc_classes() - cls.data["predefined_type"] = cls.predefined_type() + cls.data["predefined_type"] = cls.predefined_type() # only after .relating_type_id() cls.data["type_class"] = cls.type_class() # only after .type_class() @@ -251,6 +251,8 @@ class AuthoringData: @classmethod def predefined_type(cls): + if not tool.Blender.enum_property_has_valid_index(cls.props, "relating_type_id", cls.data["relating_type_id"]): + return relating_type_id = cls.props.relating_type_id if not relating_type_id: return diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 64fa9bf40f..af06cb5898 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -472,11 +472,16 @@ class Blender(blenderbim.core.tool.Blender): """method created for readibility and to avoid console warnings like `pyrna_enum_to_py: current value '17' matches no enum in 'BIMModelProperties', '', 'relating_type_id'` """ + items_amount = len(enum_items) + # If enum has no items it seems to always produce a warning. + # E.g. if you try to get it's value directly: `BIMModelProperties.relating_type_id`. + if items_amount == 0: + return False current_value_index = props.get(prop_name, None) # assuming the default value is fine if current_value_index is None: return True - return current_value_index < len(enum_items) + return current_value_index < items_amount @classmethod def append_data_block(cls, filepath: str, data_block_type: str, name: str, link=False, relative=False) -> dict: From 2db9bd9c39ca41d106f3fbfee851e004d4cc4c80 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 21 May 2024 14:17:23 +0500 Subject: [PATCH 226/429] fix errors adding occurrences from type manager #4702 Errors occurred if occurrence type wasn't matching current tool's type. E.g. if you would add an IfcRoofType being in a Slab Tool. --- src/blenderbim/blenderbim/bim/module/model/product.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/product.py b/src/blenderbim/blenderbim/bim/module/model/product.py index a862d2b79b..82b39fddbb 100644 --- a/src/blenderbim/blenderbim/bim/module/model/product.py +++ b/src/blenderbim/blenderbim/bim/module/model/product.py @@ -138,7 +138,10 @@ class AddConstrTypeInstance(bpy.types.Operator): if not relating_type_id: return {"FINISHED"} - if self.from_invoke: + # Check relating_type_id enum_items since it's possible + # that we're adding e.g. IfcRoofType being in a Slab Tool + # and roof type id won't be present in the relating_type_id enum. + if self.from_invoke and str(self.relating_type_id) in AuthoringData.data["relating_type_id"]: props.relating_type_id = str(self.relating_type_id) relating_type = tool.Ifc.get().by_id(int(relating_type_id)) From d064ef1237d4e7c1676ae08deed5d1cd9a3019e2 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 21 May 2024 15:39:49 +0500 Subject: [PATCH 227/429] black format --- src/ifcopenshell-python/ifcopenshell/util/cost.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/cost.py b/src/ifcopenshell-python/ifcopenshell/util/cost.py index 44852b6e9c..90b140f0c1 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/cost.py +++ b/src/ifcopenshell-python/ifcopenshell/util/cost.py @@ -158,6 +158,7 @@ def unserialise_cost_value(formula, cost_value): map_element_to_result(cost_value, result) return result + def get_cost_items_for_product(product): """ Returns a list of cost items related to the given product. @@ -174,6 +175,7 @@ def get_cost_items_for_product(product): cost_items.append(assignment.RelatingControl) return cost_items + def get_root_cost_items(cost_schedule): return [ related_object @@ -182,22 +184,26 @@ def get_root_cost_items(cost_schedule): if related_object.is_a("IfcCostItem") ] + def get_all_nested_cost_items(cost_item): for cost_item in get_nested_cost_items(cost_item): yield cost_item yield from get_all_nested_cost_items(cost_item) + def get_nested_cost_items(cost_item, is_deep=False): if is_deep: return list(get_all_nested_cost_items(cost_item)) else: return [obj for rel in cost_item.IsNestedBy for obj in rel.RelatedObjects] + def get_schedule_cost_items(cost_schedule): for cost_item in get_root_cost_items(cost_schedule): yield cost_item yield from get_all_nested_cost_items(cost_item) + def get_cost_assignments_by_type(cost_item, filter_by_type=None): if filter_by_type is not None: if filter_by_type == "PRODUCT": @@ -213,15 +219,18 @@ def get_cost_assignments_by_type(cost_item, filter_by_type=None): if not filter_by_type or related_object.is_a(filter_by_type) ] + def get_cost_item_assignments(cost_item, filter_by_type=None, is_deep=False): if not is_deep: return get_cost_assignments_by_type(cost_item, filter_by_type) else: return [ - product for nested_cost_item in get_all_nested_cost_items(cost_item) + product + for nested_cost_item in get_all_nested_cost_items(cost_item) for product in get_cost_assignments_by_type(nested_cost_item, filter_by_type) ] + class CostValueUnserialiser: def parse(self, formula): l = lark.Lark( From ce6ce1b97570d8c78fe989fe18e57c6834697157 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 21 May 2024 17:54:01 +0500 Subject: [PATCH 228/429] bim.assign_cost_item_type name change --- src/blenderbim/blenderbim/bim/module/cost/operator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/operator.py b/src/blenderbim/blenderbim/bim/module/cost/operator.py index 2efdca18f4..6aae74d68c 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cost/operator.py @@ -223,7 +223,7 @@ class EditCostItem(bpy.types.Operator, tool.Ifc.Operator): class AssignCostItemType(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.assign_cost_item_type" - bl_label = "Assign Cost Item Type Product" + bl_label = "Assign Cost Item To Product Types" bl_options = {"REGISTER", "UNDO"} cost_item: bpy.props.IntProperty() prop_name: bpy.props.StringProperty() From 9aacafd575bdb050d12f036d721239975d9663fa Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 21 May 2024 16:27:56 +0500 Subject: [PATCH 229/429] fix bug with cost schedules confusing 0 quantity with no quantities a bit related to #4704 1) fixed util.cost.get_total_quantity 2) fixed similar issue in cost.data that calculates the final value that user will see in UI 3) changed UI, "-" is shown when there are no quantities and "0" is when quantities are there but they just equal to zero. Before - https://i.imgur.com/EO53DhM.png After - https://i.imgur.com/H6rK4sP.png fyi @myoualid --- src/blenderbim/blenderbim/bim/module/cost/data.py | 2 +- src/blenderbim/blenderbim/bim/module/cost/ui.py | 2 +- src/ifcopenshell-python/ifcopenshell/util/cost.py | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/data.py b/src/blenderbim/blenderbim/bim/module/cost/data.py index 61bf88ddc3..dfc937c2a0 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/data.py +++ b/src/blenderbim/blenderbim/bim/module/cost/data.py @@ -140,7 +140,7 @@ class CostSchedulesData: data["UnitBasisUnitSymbol"] = "U" if cost_value.Category == "*": is_sum = True - cost_quantity = data["TotalCostQuantity"] or 1 + cost_quantity = 1 if data["TotalCostQuantity"] is None else data["TotalCostQuantity"] if has_unit_basis: data["TotalCost"] = data["TotalAppliedValue"] * cost_quantity / data["UnitBasisValueComponent"] else: diff --git a/src/blenderbim/blenderbim/bim/module/cost/ui.py b/src/blenderbim/blenderbim/bim/module/cost/ui.py index a5f4d973a9..7e77b016e1 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/ui.py +++ b/src/blenderbim/blenderbim/bim/module/cost/ui.py @@ -634,7 +634,7 @@ class BIM_UL_cost_items_trait: layout.label(text=cost_item["UnitBasisUnitSymbol"]) def draw_total_quantity_column(self, layout, cost_item): - if cost_item["TotalCostQuantity"]: + if cost_item["TotalCostQuantity"] is not None: label = "{0:.2f}".format(cost_item["TotalCostQuantity"]) + f" {cost_item['UnitSymbol'] or '-'}" layout.label(text=label) else: diff --git a/src/ifcopenshell-python/ifcopenshell/util/cost.py b/src/ifcopenshell-python/ifcopenshell/util/cost.py index 90b140f0c1..910fb9f38d 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/cost.py +++ b/src/ifcopenshell-python/ifcopenshell/util/cost.py @@ -40,7 +40,12 @@ def get_primitive_applied_value(applied_value: Union[ifcopenshell.entity_instanc def get_total_quantity(root_element: ifcopenshell.entity_instance) -> Union[float, None]: # 3 IfcPhysicalQuantity Value if root_element.is_a("IfcCostItem"): - return sum([q[3] for q in root_element.CostQuantities or []]) or None + # Different output for no quantities and zero quantites + # as they have different meaning in IFC. + quantities = root_element.CostQuantities + if not quantities: + return None + return sum([q[3] for q in quantities]) elif root_element.is_a("IfcConstructionResource"): quantity = root_element.BaseQuantity return quantity[3] if quantity else 1.0 From 295d0a677ef37ad918d34a29f8d8024d15d31752 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 21 May 2024 16:48:58 +0500 Subject: [PATCH 230/429] cost schedule - prohibit adding multiple quantity types on 1 cost item All IfcCostItem.CostQuantities supposed to use only 1 type of quantity, so they can be added up. Changed UI to reflect that requirement - dropdown for selecting quantity type is now only visible if cost item has no quantities, otherwise it just reuses already used quantity type. See https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcCostItem.htm Before - https://i.imgur.com/gFlwHEk.png After - https://i.imgur.com/pk3wXfe.png --- src/blenderbim/blenderbim/bim/helper.py | 8 ++- .../blenderbim/bim/module/cost/data.py | 1 + .../blenderbim/bim/module/cost/ui.py | 20 +++++-- src/blenderbim/blenderbim/tool/cost.py | 53 ++++++++++++------- .../ifcopenshell/util/cost.py | 31 +++++++---- 5 files changed, 77 insertions(+), 36 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/helper.py b/src/blenderbim/blenderbim/bim/helper.py index a1bb904f74..9c60b469ab 100644 --- a/src/blenderbim/blenderbim/bim/helper.py +++ b/src/blenderbim/blenderbim/bim/helper.py @@ -29,7 +29,7 @@ from mathutils import geometry from mathutils import Vector import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore -from typing import Optional, Callable, Any +from typing import Optional, Callable, Any, Union def draw_attributes(props, layout, copy_operator=None, popup_active_attribute=None): @@ -91,7 +91,11 @@ def import_attributes(ifc_class, props, data, callback=None): # A more elegant attribute importer signature, intended to supersede import_attributes -def import_attributes2(element, props, callback=None): +def import_attributes2( + element: Union[str, ifcopenshell.entity_instance], + props: bpy.types.PropertyGroup, + callback: Optional[Callable] = None, +) -> None: if isinstance(element, str): attributes = tool.Ifc.schema().declaration_by_name(element).as_entity().all_attributes() info = {a.name(): None for a in attributes} diff --git a/src/blenderbim/blenderbim/bim/module/cost/data.py b/src/blenderbim/blenderbim/bim/module/cost/data.py index dfc937c2a0..f320b71531 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/data.py +++ b/src/blenderbim/blenderbim/bim/module/cost/data.py @@ -159,6 +159,7 @@ class CostSchedulesData: data["UnitSymbol"] = "-" if cost_item.CostQuantities: quantity = cost_item.CostQuantities[0] + data["QuantityType"] = quantity.is_a() unit = ifcopenshell.util.unit.get_property_unit(quantity, tool.Ifc.get()) if unit: data["UnitSymbol"] = ifcopenshell.util.unit.get_unit_symbol(unit) diff --git a/src/blenderbim/blenderbim/bim/module/cost/ui.py b/src/blenderbim/blenderbim/bim/module/cost/ui.py index 7e77b016e1..42eb5d578a 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/ui.py +++ b/src/blenderbim/blenderbim/bim/module/cost/ui.py @@ -21,6 +21,7 @@ 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 +from typing import Any class BIM_PT_cost_schedules(Panel): @@ -178,24 +179,33 @@ class BIM_PT_cost_schedules(Panel): "active_cost_item_index", ) if self.props.active_cost_item_id: + cost_item = CostSchedulesData.data["cost_items"][ifc_definition_id] if self.props.cost_item_editing_type == "ATTRIBUTES": self.draw_editable_cost_item_attributes_ui() elif self.props.cost_item_editing_type == "QUANTITIES": - self.draw_editable_cost_item_quantities_ui() + self.draw_editable_cost_item_quantities_ui(cost_item) elif self.props.cost_item_editing_type == "VALUES": self.draw_editable_cost_item_values_ui() def draw_editable_cost_item_attributes_ui(self): blenderbim.bim.helper.draw_attributes(self.props.cost_item_attributes, self.layout) - def draw_editable_cost_item_quantities_ui(self): + def draw_editable_cost_item_quantities_ui(self, cost_item: dict[str, Any]): + quantities = CostSchedulesData.data["cost_quantities"] row = self.layout.row(align=True) - row.prop(self.props, "quantity_types", text="") + # In IFC, all quantities of IfcCostTime should have 1 type. + if quantities: + quantity_class = cost_item["QuantityType"] + row.label(text=quantity_class) + else: + row.prop(self.props, "quantity_types", text="") + quantity_class = self.props.quantity_types + op = row.operator("bim.add_cost_item_quantity", text="", icon="ADD") op.cost_item = self.props.active_cost_item_id - op.ifc_class = self.props.quantity_types + op.ifc_class = quantity_class - for quantity in CostSchedulesData.data["cost_quantities"]: + for quantity in quantities: row = self.layout.row(align=True) row.label(text=quantity["name"]) row.label(text=quantity["value"]) diff --git a/src/blenderbim/blenderbim/tool/cost.py b/src/blenderbim/blenderbim/tool/cost.py index 2ce904b018..aa4bb8264c 100644 --- a/src/blenderbim/blenderbim/tool/cost.py +++ b/src/blenderbim/blenderbim/tool/cost.py @@ -7,7 +7,7 @@ import ifcopenshell.util.cost import ifcopenshell.util.unit import blenderbim.bim.helper import json -from typing import Optional +from typing import Optional, Any, Generator class Cost(blenderbim.core.tool.Cost): @@ -261,7 +261,7 @@ class Cost(blenderbim.core.tool.Cost): blenderbim.bim.helper.import_attributes2(physical_quantity, props.quantity_attributes) @classmethod - def enable_editing_cost_item_values(cls, cost_item=None): + def enable_editing_cost_item_values(cls, cost_item: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMCostProperties props.active_cost_item_id = cost_item.id() props.cost_item_editing_type = "VALUES" @@ -289,7 +289,7 @@ class Cost(blenderbim.core.tool.Cost): return attributes @classmethod - def load_cost_item_value_attributes(cls, cost_value=None): + def load_cost_item_value_attributes(cls, cost_value: ifcopenshell.entity_instance) -> None: def import_attributes(name, prop, data, cost_value, is_rates, props_collection): if name == "AppliedValue": # TODO: for now, only support simple IfcValues (which are effectively IfcMonetaryMeasure) @@ -336,36 +336,38 @@ class Cost(blenderbim.core.tool.Cost): blenderbim.bim.helper.import_attributes2(cost_value, props.cost_value_attributes, callback=callback) @classmethod - def calculate_applied_value(cls, cost_item, cost_value): + def calculate_applied_value( + cls, cost_item: ifcopenshell.entity_instance, cost_value: ifcopenshell.entity_instance + ) -> float: return ifcopenshell.util.cost.calculate_applied_value(cost_item, cost_value) @classmethod - def is_active_schedule_of_rates(cls): + def is_active_schedule_of_rates(cls) -> bool: return ( tool.Ifc.get().by_id(bpy.context.scene.BIMCostProperties.active_cost_schedule_id).PredefinedType == "SCHEDULEOFRATES" ) @classmethod - def enable_editing_cost_item_value(cls, cost_value=None): + def enable_editing_cost_item_value(cls, cost_value: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMCostProperties props.active_cost_value_id = cost_value.id() props.cost_value_editing_type = "ATTRIBUTES" @classmethod - def disable_editing_cost_item_value(cls): + def disable_editing_cost_item_value(cls) -> None: props = bpy.context.scene.BIMCostProperties props.active_cost_value_id = 0 props.cost_value_editing_type = "" @classmethod - def load_cost_item_value_formula_attributes(cls, cost_value=None): + def load_cost_item_value_formula_attributes(cls, cost_value: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMCostProperties props.cost_value_attributes.clear() bpy.context.scene.BIMCostProperties.cost_value_formula = ifcopenshell.util.cost.serialise_cost_value(cost_value) @classmethod - def enable_editing_cost_item_value_formula(cls, cost_value=None): + def enable_editing_cost_item_value_formula(cls, cost_value: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMCostProperties props.active_cost_value_id = cost_value.id() props.cost_value_editing_type = "FORMULA" @@ -375,7 +377,7 @@ class Cost(blenderbim.core.tool.Cost): return bpy.context.scene.BIMCostProperties.cost_value_formula @classmethod - def get_cost_value_attributes(cls): + def get_cost_value_attributes(cls) -> dict[str, Any]: def export_attributes(attributes, prop): if prop.name == "UnitBasisValue": if prop.is_null: @@ -394,13 +396,18 @@ class Cost(blenderbim.core.tool.Cost): return blenderbim.bim.helper.export_attributes(props.cost_value_attributes, callback) @classmethod - def get_cost_value_unit_component(cls): + def get_cost_value_unit_component(cls) -> ifcopenshell.entity_instance: return tool.Ifc.get().by_id( int(bpy.context.scene.BIMCostProperties.cost_value_attributes.get("UnitBasisUnit").enum_value) ) @classmethod - def get_cost_item_assignments(cls, cost_item, filter_by_type=None, is_deep=False): + def get_cost_item_assignments( + cls, + cost_item: ifcopenshell.entity_instance, + filter_by_type: Optional[ifcopenshell.util.cost.FILTER_BY_TYPE] = None, + is_deep: bool = False, + ) -> list[ifcopenshell.entity_instance]: return ifcopenshell.util.cost.get_cost_item_assignments( cost_item, filter_by_type=filter_by_type, is_deep=is_deep ) @@ -410,30 +417,40 @@ class Cost(blenderbim.core.tool.Cost): return bpy.context.scene.BIMCostProperties.show_nested_elements @classmethod - def get_cost_item_products(cls, cost_item, is_deep=False): + def get_cost_item_products( + cls, cost_item: ifcopenshell.entity_instance, is_deep: bool = False + ) -> list[ifcopenshell.entity_instance]: return cls.get_cost_item_assignments(cost_item, filter_by_type="PRODUCT", is_deep=is_deep) @classmethod - def get_cost_item_resources(cls, cost_item, is_deep=False): + def get_cost_item_resources( + cls, cost_item: ifcopenshell.entity_instance, is_deep: bool = False + ) -> list[ifcopenshell.entity_instance]: return cls.get_cost_item_assignments(cost_item, filter_by_type="RESOURCE", is_deep=is_deep) @classmethod - def get_cost_item_processes(cls, cost_item, is_deep=False): + def get_cost_item_processes( + cls, cost_item: ifcopenshell.entity_instance, is_deep: bool = False + ) -> list[ifcopenshell.entity_instance]: return cls.get_cost_item_assignments(cost_item, filter_by_type="PROCESS", is_deep=is_deep) @classmethod - def get_schedule_cost_items(cls, cost_schedule): + def get_schedule_cost_items( + cls, cost_schedule: ifcopenshell.entity_instance + ) -> Generator[ifcopenshell.entity_instance, None, None]: return ifcopenshell.util.cost.get_schedule_cost_items(cost_schedule) @classmethod - def get_cost_schedule_products(cls, cost_schedule): + def get_cost_schedule_products( + cls, cost_schedule: ifcopenshell.entity_instance + ) -> list[ifcopenshell.entity_instance]: products = [] for cost_item in ifcopenshell.util.cost.get_schedule_cost_items(cost_schedule): products.extend(cls.get_cost_item_products(cost_item)) return products @classmethod - def import_cost_schedule_csv(cls, file_path=None, is_schedule_of_rates=False): + def import_cost_schedule_csv(cls, file_path: Optional[str] = None, is_schedule_of_rates: bool = False) -> None: if not file_path: return from ifc5d.csv2ifc import Csv2Ifc diff --git a/src/ifcopenshell-python/ifcopenshell/util/cost.py b/src/ifcopenshell-python/ifcopenshell/util/cost.py index 910fb9f38d..d383dd66a3 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/cost.py +++ b/src/ifcopenshell-python/ifcopenshell/util/cost.py @@ -18,11 +18,12 @@ import lark import ifcopenshell -from typing import Optional, Union +from typing import Optional, Union, Literal, Generator, Any arithmetic_operator_symbols = {"ADD": "+", "DIVIDE": "/", "MULTIPLY": "*", "SUBTRACT": "-"} symbol_arithmetic_operators = {"+": "ADD", "/": "DIVIDE", "*": "MULTIPLY", "-": "SUBTRACT"} +FILTER_BY_TYPE = Literal["PRODUCT", "RESOURCE", "PROCESS"] def get_primitive_applied_value(applied_value: Union[ifcopenshell.entity_instance, float, None]) -> float: @@ -150,11 +151,11 @@ def serialise_applied_value(applied_value: ifcopenshell.entity_instance) -> str: return "?" -def unserialise_cost_value(formula, cost_value): +def unserialise_cost_value(formula: str, cost_value: ifcopenshell.entity_instance) -> dict[str, Any]: unserialiser = CostValueUnserialiser() result = unserialiser.parse(formula) - def map_element_to_result(element, result): + def map_element_to_result(element: ifcopenshell.entity_instance, result: dict): result["ifc"] = element for i, component in enumerate(result.get("Components", [])): if element.Components and i < len(element.Components): @@ -164,7 +165,7 @@ def unserialise_cost_value(formula, cost_value): return result -def get_cost_items_for_product(product): +def get_cost_items_for_product(product: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: """ Returns a list of cost items related to the given product. @@ -181,7 +182,7 @@ def get_cost_items_for_product(product): return cost_items -def get_root_cost_items(cost_schedule): +def get_root_cost_items(cost_schedule: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return [ related_object for rel in cost_schedule.Controls or [] @@ -190,26 +191,32 @@ def get_root_cost_items(cost_schedule): ] -def get_all_nested_cost_items(cost_item): +def get_all_nested_cost_items( + cost_item: ifcopenshell.entity_instance, +) -> Generator[ifcopenshell.entity_instance, None, None]: for cost_item in get_nested_cost_items(cost_item): yield cost_item yield from get_all_nested_cost_items(cost_item) -def get_nested_cost_items(cost_item, is_deep=False): +def get_nested_cost_items(cost_item: ifcopenshell.entity_instance, is_deep=False) -> list[ifcopenshell.entity_instance]: if is_deep: return list(get_all_nested_cost_items(cost_item)) else: return [obj for rel in cost_item.IsNestedBy for obj in rel.RelatedObjects] -def get_schedule_cost_items(cost_schedule): +def get_schedule_cost_items( + cost_schedule: ifcopenshell.entity_instance, +) -> Generator[ifcopenshell.entity_instance, None, None]: for cost_item in get_root_cost_items(cost_schedule): yield cost_item yield from get_all_nested_cost_items(cost_item) -def get_cost_assignments_by_type(cost_item, filter_by_type=None): +def get_cost_assignments_by_type( + cost_item: ifcopenshell.entity_instance, filter_by_type: Optional[FILTER_BY_TYPE] = None +) -> list[ifcopenshell.entity_instance]: if filter_by_type is not None: if filter_by_type == "PRODUCT": filter_by_type = "IfcElement" @@ -225,7 +232,9 @@ def get_cost_assignments_by_type(cost_item, filter_by_type=None): ] -def get_cost_item_assignments(cost_item, filter_by_type=None, is_deep=False): +def get_cost_item_assignments( + cost_item: ifcopenshell.entity_instance, filter_by_type: Optional[FILTER_BY_TYPE] = None, is_deep: bool = False +) -> list[ifcopenshell.entity_instance]: if not is_deep: return get_cost_assignments_by_type(cost_item, filter_by_type) else: @@ -237,7 +246,7 @@ def get_cost_item_assignments(cost_item, filter_by_type=None, is_deep=False): class CostValueUnserialiser: - def parse(self, formula): + def parse(self, formula: str): l = lark.Lark( """start: formula formula: operand (operator operand)* From 9b562669d200494dcb2ffce8546135151ccc3fd4 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 21 May 2024 17:19:33 +0500 Subject: [PATCH 231/429] fix root.create_entity skipping setting up defaults on ifc4x3 --- .../ifcopenshell/api/root/create_entity.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py index c1ab6c77e1..c11f0d4d67 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/create_entity.py @@ -105,7 +105,7 @@ class Usecase: element.ObjectType = self.settings["predefined_type"] if self.file.schema == "IFC2X3": self.handle_2x3_defaults(element) - elif self.file.schema == "IFC4": + else: self.handle_4_defaults(element) return element @@ -131,7 +131,7 @@ class Usecase: if hasattr(element, "PredefinedType") and not element.PredefinedType: element.PredefinedType = "NOTDEFINED" - if element.is_a("IfcDoorStyle") or element.is_a("IfcWindowStyle"): + if element.file.schema == "IFC4" and (element.is_a("IfcDoorStyle") or element.is_a("IfcWindowStyle")): element.OperationType = "NOTDEFINED" element.ConstructionType = "NOTDEFINED" element.ParameterTakesPrecedence = False From 4fb34c081655349a301f45a56bce277a36e2f5b3 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 21 May 2024 17:54:51 +0500 Subject: [PATCH 232/429] base autogenerated opening thickness on wall thickness #4710 --- .../blenderbim/bim/module/model/opening.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/opening.py b/src/blenderbim/blenderbim/bim/module/model/opening.py index 5a7e517d71..666c3262a2 100644 --- a/src/blenderbim/blenderbim/bim/module/model/opening.py +++ b/src/blenderbim/blenderbim/bim/module/model/opening.py @@ -68,6 +68,7 @@ class FilledOpeningGenerator: ) -> None: props = bpy.context.scene.BIMModelProperties unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + opening_thickness_si = None filling = tool.Ifc.get_entity(filling_obj) element = tool.Ifc.get_entity(voided_obj) @@ -98,6 +99,7 @@ class FilledOpeningGenerator: # In this prototype, we assume openings are only added to axis-based elements layers = tool.Model.get_material_layer_parameters(element) if layers["layer_set_direction"] == "AXIS2": + opening_thickness_si = layers["thickness"] * 2 axis = tool.Model.get_wall_axis(voided_obj, layers=layers)["base"] new_matrix = voided_obj.matrix_world.copy() point_on_axis = tool.Cad.point_on_edge(target, axis) @@ -151,7 +153,9 @@ class FilledOpeningGenerator: "geometry.assign_representation", tool.Ifc.get(), product=opening, representation=mapped_representation ) else: - representation = self.generate_opening_from_filling(filling, filling_obj) + representation = self.generate_opening_from_filling( + filling, filling_obj, opening_thickness_si=opening_thickness_si + ) opening = ifcopenshell.api.run( "root.create_entity", tool.Ifc.get(), ifc_class="IfcOpeningElement", predefined_type="OPENING" ) @@ -259,11 +263,14 @@ class FilledOpeningGenerator: ) def generate_opening_from_filling( - self, filling: ifcopenshell.entity_instance, filling_obj: bpy.types.Object + self, + filling: ifcopenshell.entity_instance, + filling_obj: bpy.types.Object, + opening_thickness_si: Optional[float] = None, ) -> ifcopenshell.entity_instance: # Since openings are reused later, we give a default thickness of 1.2m # which should cover the majority of curved, or super thick walls. - thickness = 1.2 + thickness = 1.2 if opening_thickness_si is None else opening_thickness_si unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) shape_builder = ifcopenshell.util.shape_builder.ShapeBuilder(tool.Ifc.get()) From aeb1e4bf49e751440bd147a03007aaaf42f76c69 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 21 May 2024 23:06:08 +1000 Subject: [PATCH 233/429] See #4696. Allow editing of properties that do not comply with the pset template definition. Strictly speaking, the only properties that should exist in a pset should be those in a pset template. However, there are situations where this is not the case, such as when the pset template has since been modified, or if there is invalid data coming from other software, or migrating between schemas. In this case, we should still load the property, and give the user the option to edit it (or null it). --- .../blenderbim/bim/module/pset/operator.py | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index c699a63d52..44f72a8f50 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -61,15 +61,16 @@ def get_pset_props(context, obj, obj_type): elif obj_type == "Group": return context.scene.GroupPsetProperties + class TogglePsetExpansion(bpy.types.Operator, Operator): bl_idname = "bim.toggle_pset_expansion" bl_label = "Toggle Pset Expansion" pset_id: bpy.props.IntProperty() def _execute(self, context): - blenderbim.bim.module.pset.data.is_expanded[ - self.pset_id - ] = not blenderbim.bim.module.pset.data.is_expanded.setdefault(self.pset_id, True) + blenderbim.bim.module.pset.data.is_expanded[self.pset_id] = ( + not blenderbim.bim.module.pset.data.is_expanded.setdefault(self.pset_id, True) + ) class EnablePsetEditing(bpy.types.Operator): @@ -99,8 +100,7 @@ class EnablePsetEditing(bpy.types.Operator): if pset_template: self.load_from_pset_template(pset_template, pset) - else: - self.load_from_pset_data(pset) + self.load_from_pset_data(pset) self.props.active_pset_id = self.pset_id return {"FINISHED"} @@ -141,10 +141,14 @@ class EnablePsetEditing(bpy.types.Operator): metadata.data_type = self.get_data_type(prop_template) special_type = "" - if prop_template.PrimaryMeasureType in ( - "IfcPositiveLengthMeasure", - "IfcLengthMeasure", - ) or prop_template.TemplateType == "Q_LENGTH": + if ( + prop_template.PrimaryMeasureType + in ( + "IfcPositiveLengthMeasure", + "IfcLengthMeasure", + ) + or prop_template.TemplateType == "Q_LENGTH" + ): special_type = "LENGTH" elif prop_template.PrimaryMeasureType == "IfcAreaMeasure" or prop_template.TemplateType == "Q_AREA": special_type = "AREA" @@ -196,6 +200,9 @@ class EnablePsetEditing(bpy.types.Operator): new.is_selected = enum in selected_enum_items def load_from_pset_data(self, pset): + if pset is None: + return + props = [] if pset.is_a("IfcElementQuantity"): props = pset.Quantities @@ -205,6 +212,8 @@ class EnablePsetEditing(bpy.types.Operator): props = pset.Properties for prop in props: + if self.props.properties.get(prop.Name): + continue # This property has already been added from a template if prop.is_a("IfcPropertyEnumeratedValue"): simple_prop = self.props.properties.add() simple_prop.name = prop.Name From 4027f28c85e5a2226084c03193cc60a7aaafdb01 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Tue, 21 May 2024 10:30:38 -0500 Subject: [PATCH 234/429] Can bim.select_similar from the pset or attribute panels (#4611) --- src/blenderbim/blenderbim/bim/module/attribute/ui.py | 5 ++++- src/blenderbim/blenderbim/bim/module/pset/ui.py | 4 +++- src/blenderbim/blenderbim/bim/module/search/operator.py | 6 ++++-- src/blenderbim/blenderbim/bim/module/search/ui.py | 3 ++- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/attribute/ui.py b/src/blenderbim/blenderbim/bim/module/attribute/ui.py index e1948dcc2b..0680d5f654 100644 --- a/src/blenderbim/blenderbim/bim/module/attribute/ui.py +++ b/src/blenderbim/blenderbim/bim/module/attribute/ui.py @@ -43,7 +43,10 @@ def draw_ui(context, layout, attributes): for attribute in attributes: row = layout.row(align=True) row.label(text=attribute["name"]) - row.label(text=attribute["value"]) + # row.label(text=attribute["value"]) + op = row.operator("bim.select_similar", text=attribute["value"], icon="NONE", emboss=False) + op.key = attribute['name'] + # TODO: reimplement, see #1222 # if "IfcSite/" in context.active_object.name or "IfcBuilding/" in context.active_object.name: diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index 8a715e4718..cb895399ac 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -143,7 +143,9 @@ def draw_psetqto_ui(context, pset_id, pset, props, layout, obj_type, allow_remov row = box.row(align=True) row.scale_y = 0.8 row.label(text=prop["Name"]) - row.label(text=str(prop["NominalValue"])) + op = row.operator("bim.select_similar", text=str(prop["NominalValue"]), icon="NONE", emboss=False) + op.key = pset['Name'] + if not has_props_displayed: row = box.row() row.scale_y = 0.8 diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index c2bc7dba21..c7eb753fef 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -635,12 +635,14 @@ class SelectSimilar(Operator, tool.Ifc.Operator): bl_label = "Select Similar" bl_options = {"REGISTER", "UNDO"} + key: bpy.props.StringProperty() + def _execute(self, context): props = context.scene.BIMSearchProperties obj = context.active_object element = tool.Ifc.get_entity(obj) - key = props.element_key - if props.element_key == "PredefinedType": + key = self.key + if key == "PredefinedType": key = "predefined_type" value = ifcopenshell.util.selector.get_element_value(element, key) for obj in context.visible_objects: diff --git a/src/blenderbim/blenderbim/bim/module/search/ui.py b/src/blenderbim/blenderbim/bim/module/search/ui.py index 8117bc9f52..d4ab0d6c99 100644 --- a/src/blenderbim/blenderbim/bim/module/search/ui.py +++ b/src/blenderbim/blenderbim/bim/module/search/ui.py @@ -113,7 +113,8 @@ class BIM_PT_select_similar(Panel): if SelectSimilarData.data["element_key"]: row = self.layout.row(align=True) row.prop(props, "element_key", text="") - row.operator("bim.select_similar", text="", icon="RESTRICT_SELECT_OFF") + op = row.operator("bim.select_similar", text="", icon="RESTRICT_SELECT_OFF") + op.key = props.element_key else: row = self.layout.row() row.label(text=f"No Active Element") From 69c197c1a4f047791befbae11e890be64026b7e7 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 22 May 2024 08:12:25 +1000 Subject: [PATCH 235/429] get_psets utility now defaults to merging duplicate psets instead of overriding This behaviour is more comprehensive for broken data and now consistent for types and materials. --- src/ifcopenshell-python/ifcopenshell/util/element.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index c192e037e9..f0df9b16f5 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -157,13 +157,13 @@ def get_psets( continue if qtos_only and not definition.is_a("IfcElementQuantity"): continue - psets[definition.Name] = get_property_definition(definition, verbose=verbose) + psets.setdefault(definition.Name, {}).update(get_property_definition(definition, verbose=verbose)) # NOTE: doesn't account for IFC2X3 missing HasProperties elif element.is_a("IfcMaterialDefinition") or element.is_a("IfcProfileDef"): for definition in getattr(element, "HasProperties", None) or []: if qtos_only: continue - psets[definition.Name] = get_property_definition(definition, verbose=verbose) + psets.setdefault(definition.Name, {}).update(get_property_definition(definition, verbose=verbose)) elif (is_defined_by := getattr(element, "IsDefinedBy", None)) is not None: # other IfcObjectDefinition if should_inherit: From 5a82d7a9d44c888b58077dba7530daef9e3903b8 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 22 May 2024 20:52:43 +1000 Subject: [PATCH 236/429] Refactor enabling pset editing operator into core/tool --- .../blenderbim/bim/module/pset/operator.py | 187 +----------------- src/blenderbim/blenderbim/core/pset.py | 16 ++ src/blenderbim/blenderbim/core/tool.py | 9 + src/blenderbim/blenderbim/tool/pset.py | 165 +++++++++++++++- 4 files changed, 195 insertions(+), 182 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index 44f72a8f50..0d4037b9f3 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -31,7 +31,6 @@ import blenderbim.core.qto as QtoCore import blenderbim.bim.module.pset.data from blenderbim.bim.ifc import IfcStore from blenderbim.bim.module.pset.qto_calculator import QtoCalculator -from blenderbim.bim.module.pset.calc_quantity_function_mapper import mapper class Operator: @@ -41,27 +40,6 @@ class Operator: return {"FINISHED"} -def get_pset_props(context, obj, obj_type): - if obj_type == "Object": - return bpy.data.objects.get(obj).PsetProperties - elif obj_type == "Material": - return bpy.data.materials.get(obj).PsetProperties - elif obj_type == "MaterialSet": - return bpy.data.objects.get(obj).MaterialSetPsetProperties - elif obj_type == "MaterialSetItem": - return bpy.data.objects.get(obj).MaterialSetItemPsetProperties - elif obj_type == "Task": - return context.scene.TaskPsetProperties - elif obj_type == "Resource": - return context.scene.ResourcePsetProperties - elif obj_type == "Profile": - return context.scene.ProfilePsetProperties - elif obj_type == "WorkSchedule": - return context.scene.WorkSchedulePsetProperties - elif obj_type == "Group": - return context.scene.GroupPsetProperties - - class TogglePsetExpansion(bpy.types.Operator, Operator): bl_idname = "bim.toggle_pset_expansion" bl_label = "Toggle Pset Expansion" @@ -84,168 +62,15 @@ class EnablePsetEditing(bpy.types.Operator): obj_type: bpy.props.StringProperty() def execute(self, context): - self.props = get_pset_props(context, self.obj, self.obj_type) - self.props.properties.clear() - if self.pset_id: pset = tool.Ifc.get().by_id(self.pset_id) - self.props.active_pset_name = pset.Name - self.props.active_pset_type = "" - pset_template = blenderbim.bim.schema.ifc.psetqto.get_by_name(pset.Name) + self.pset_name = pset.Name else: pset = None - self.props.active_pset_name = self.pset_name - self.props.active_pset_type = self.pset_type - pset_template = blenderbim.bim.schema.ifc.psetqto.get_by_name(self.pset_name) - if pset_template: - self.load_from_pset_template(pset_template, pset) - self.load_from_pset_data(pset) - - self.props.active_pset_id = self.pset_id + core.enable_pset_editing(tool.Pset, pset, self.pset_name, self.pset_type, self.obj, self.obj_type) return {"FINISHED"} - def load_from_pset_template(self, pset_template, pset): - if pset: - data = ifcopenshell.util.element.get_property_definition(pset) - del data["id"] - else: - data = {} - for prop_template in pset_template.HasPropertyTemplates: - if not prop_template.is_a("IfcSimplePropertyTemplate"): - continue # Other types not yet supported - if prop_template.TemplateType == "P_SINGLEVALUE": - self.load_single_value(pset_template, prop_template, data) - elif prop_template.TemplateType.startswith("Q_"): - self.load_single_value(pset_template, prop_template, data) - elif prop_template.TemplateType == "P_ENUMERATEDVALUE": - self.load_enumerated_value(prop_template, data) - else: - # NOTE: currently unsupported types: - # - P_BOUNDEDVALUE - # - P_LISTVALUE - # - P_REFERENCEVALUE - # - P_TABLEVALUE - pass - - def load_single_value(self, pset_template, prop_template, data): - prop = self.props.properties.add() - prop.name = prop_template.Name - prop.value_type = "IfcPropertySingleValue" - metadata = prop.metadata - metadata.name = prop_template.Name - metadata.is_null = data.get(prop_template.Name, None) is None - metadata.is_optional = True - metadata.is_uri = prop_template.PrimaryMeasureType == "IfcURIReference" - metadata.has_calculator = bool(mapper.get(pset_template.Name, {}).get(prop_template.Name, None)) - metadata.data_type = self.get_data_type(prop_template) - - special_type = "" - if ( - prop_template.PrimaryMeasureType - in ( - "IfcPositiveLengthMeasure", - "IfcLengthMeasure", - ) - or prop_template.TemplateType == "Q_LENGTH" - ): - special_type = "LENGTH" - elif prop_template.PrimaryMeasureType == "IfcAreaMeasure" or prop_template.TemplateType == "Q_AREA": - special_type = "AREA" - elif prop_template.PrimaryMeasureType == "IfcVolumeMeasure" or prop_template.TemplateType == "Q_VOLUME": - special_type = "VOLUME" - metadata.special_type = special_type - - if metadata.data_type == "string": - metadata.string_value = "" if metadata.is_null else str(data[prop_template.Name]) - elif metadata.data_type == "integer": - metadata.int_value = 0 if metadata.is_null else int(data[prop_template.Name]) - elif metadata.data_type == "float": - metadata.float_value = 0.0 if metadata.is_null else float(data[prop_template.Name]) - elif metadata.data_type == "boolean": - metadata.bool_value = False if metadata.is_null else bool(data[prop_template.Name]) - - metadata.ifc_class = pset_template.Name - blenderbim.bim.helper.add_attribute_description(metadata, prop_template) - - def get_data_type(self, prop_template): - if prop_template.TemplateType in ["Q_LENGTH", "Q_AREA", "Q_VOLUME", "Q_WEIGHT", "Q_TIME"]: - return "float" - elif prop_template.TemplateType == "Q_COUNT": - return "integer" - return ifcopenshell.util.attribute.get_primitive_type( - IfcStore.get_schema().declaration_by_name(prop_template.PrimaryMeasureType or "IfcLabel") - ) - - def load_enumerated_value(self, prop_template, data): - enum_items = [v.wrappedValue for v in prop_template.Enumerators.EnumerationValues] - selected_enum_items = data.get(prop_template.Name, []) or [] - - prop = self.props.properties.add() - prop.name = prop_template.Name - prop.value_type = "IfcPropertyEnumeratedValue" - metadata = prop.metadata - metadata.name = prop_template.Name - metadata.is_null = data.get(prop_template.Name, None) is None - metadata.is_optional = True - metadata.is_uri = prop_template.PrimaryMeasureType == "IfcURIReference" - - # Cute hack to abuse the metadata to find the Blender data_type - metadata.set_value(enum_items[0]) - data_type = metadata.get_value_name() - - for enum in enum_items: - new = prop.enumerated_value.enumerated_values.add() - setattr(new, data_type, enum) - new.is_selected = enum in selected_enum_items - - def load_from_pset_data(self, pset): - if pset is None: - return - - props = [] - if pset.is_a("IfcElementQuantity"): - props = pset.Quantities - elif pset.is_a("IfcPropertySet"): - props = pset.HasProperties - elif pset.is_a("IfcMaterialProperties") or pset.is_a("IfcProfileProperties"): - props = pset.Properties - - for prop in props: - if self.props.properties.get(prop.Name): - continue # This property has already been added from a template - if prop.is_a("IfcPropertyEnumeratedValue"): - simple_prop = self.props.properties.add() - simple_prop.name = prop.Name - simple_prop.value_type = "IfcPropertyEnumeratedValue" - metadata = simple_prop.metadata - metadata.name = prop.Name - metadata.is_null = len(simple_prop.enumerated_value.enumerated_values) == 0 - metadata.is_optional = True - metadata.set_value(prop.EnumerationReference.EnumerationValues[0].wrappedValue) - - enum_items = [v.wrappedValue for v in prop.EnumerationReference.EnumerationValues] - selected_enum_items = [v.wrappedValue for v in prop.EnumerationValues] - data_type = metadata.get_value_name(display_only=True) - - for enum in enum_items: - new = simple_prop.enumerated_value.enumerated_values.add() - setattr(new, data_type, enum) - new.is_selected = enum in selected_enum_items - else: - if prop.is_a("IfcPropertySingleValue"): - value = prop.NominalValue.wrappedValue if prop.NominalValue else None - elif prop.is_a("IfcPhysicalSimpleQuantity"): - value = prop[3] - new_prop = self.props.properties.add() - new_prop.name = prop.Name - metadata = new_prop.metadata - metadata.set_value(value) - metadata.name = prop.Name - metadata.is_null = value is None - metadata.is_optional = True - metadata.set_value(metadata.get_value_default() if metadata.is_null else value) - class DisablePsetEditing(bpy.types.Operator, Operator): bl_idname = "bim.disable_pset_editing" @@ -255,7 +80,7 @@ class DisablePsetEditing(bpy.types.Operator, Operator): obj_type: bpy.props.StringProperty() def _execute(self, context): - props = get_pset_props(context, self.obj, self.obj_type) + props = tool.Pset.get_pset_props(self.obj, self.obj_type) if props.active_pset_id: pset = tool.Ifc.get().by_id(props.active_pset_id) ifc_definition_id = tool.Blender.get_obj_ifc_definition_id(self.obj, self.obj_type, context) @@ -279,7 +104,7 @@ class EditPset(bpy.types.Operator, Operator): def _execute(self, context): self.file = IfcStore.get_file() - props = get_pset_props(context, self.obj, self.obj_type) + props = tool.Pset.get_pset_props(self.obj, self.obj_type) ifc_definition_id = tool.Blender.get_obj_ifc_definition_id(self.obj, self.obj_type, context) element = tool.Ifc.get().by_id(ifc_definition_id) properties = {} @@ -350,7 +175,7 @@ class RemovePset(bpy.types.Operator, Operator): objects = [self.obj] pset_name = tool.Ifc.get().by_id(self.pset_id).Name for obj in objects: - props = get_pset_props(context, obj, self.obj_type) + props = tool.Pset.get_pset_props(obj, self.obj_type) ifc_definition_id = tool.Blender.get_obj_ifc_definition_id(obj, self.obj_type, context) element = tool.Ifc.get().by_id(ifc_definition_id) pset = ifcopenshell.util.element.get_psets(element, should_inherit=False).get(pset_name, None) @@ -381,7 +206,7 @@ class AddQto(bpy.types.Operator, Operator): def _execute(self, context): self.file = IfcStore.get_file() - props = get_pset_props(context, self.obj, self.obj_type) + props = tool.Pset.get_pset_props(self.obj, self.obj_type) ifc_definition_id = tool.Blender.get_obj_ifc_definition_id(self.obj, self.obj_type, context) element = tool.Ifc.get().by_id(ifc_definition_id) bpy.ops.bim.enable_pset_editing( diff --git a/src/blenderbim/blenderbim/core/pset.py b/src/blenderbim/blenderbim/core/pset.py index e394256e67..cd58736cf2 100644 --- a/src/blenderbim/blenderbim/core/pset.py +++ b/src/blenderbim/blenderbim/core/pset.py @@ -42,3 +42,19 @@ def add_pset(ifc, pset, blender, obj_name, obj_type): if not pset.is_pset_applicable(element, pset_name): continue pset.enable_pset_editing(pset_id=0, pset_name=pset_name, pset_type="PSET", obj=obj_name, obj_type=obj_type) + + +def enable_pset_editing(pset_tool, pset, pset_name, pset_type, obj_name, obj_type): + props = pset_tool.get_pset_props(obj_name, obj_type) + pset_tool.clear_blender_pset_properties(props) + + pset_template = pset_tool.get_pset_template(pset_name) + + if pset_template: + pset_tool.import_pset_from_template(pset_template, pset, props) + + if pset: + pset_tool.import_pset_from_existing(pset, props) + pset_tool.set_active_pset(props, pset) + else: + pset_tool.enable_proposed_pset(props, pset_name, pset_type) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index ec5a7550c3..35607cd90e 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -618,9 +618,18 @@ class Profile: @interface class Pset: + def clear_blender_pset_properties(cls, props): pass + def enable_proposed_pset(cls, props, pset_name, pset_type): pass def get_element_pset(cls, element, pset_name): pass + def get_prop_template_primitive_type(cls, prop_template): pass def get_pset_name(cls, obj, obj_type): pass + def get_pset_template(cls, name): pass + def import_enumerated_value_from_template(cls, prop_template, data, props): pass + def import_pset_from_existing(cls, pset, props): pass + def import_pset_from_template(cls, pset_template, pset, props): pass + def import_single_value_from_template(cls, pset_template, prop_template, data, props): pass def is_pset_applicable(cls,element, pset_name): pass + def set_active_pset(cls, props, pset): pass @interface diff --git a/src/blenderbim/blenderbim/tool/pset.py b/src/blenderbim/blenderbim/tool/pset.py index 0b4db9e9cb..783931786f 100644 --- a/src/blenderbim/blenderbim/tool/pset.py +++ b/src/blenderbim/blenderbim/tool/pset.py @@ -23,6 +23,7 @@ import blenderbim.core.tool import blenderbim.tool as tool import blenderbim.bim.schema from typing import Union +from blenderbim.bim.module.pset.calc_quantity_function_mapper import mapper class Pset(blenderbim.core.tool.Pset): @@ -82,5 +83,167 @@ class Pset(blenderbim.core.tool.Pset): def enable_pset_editing(cls, pset_id=None, pset_name=None, pset_type=None, obj=None, obj_type=None): # TODO REFACTOR ONCE toll/CORE functions are available bpy.ops.bim.enable_pset_editing( - pset_id=0, pset_name=tool.Pset.get_pset_name(obj, obj_type), pset_type="PSET", obj=obj, obj_type=obj_type + pset_id=0, pset_name=cls.get_pset_name(obj, obj_type), pset_type="PSET", obj=obj, obj_type=obj_type ) + + @classmethod + def import_pset_from_existing(cls, pset, props): + pset_props = [] + if pset.is_a("IfcElementQuantity"): + pset_props = pset.Quantities + elif pset.is_a("IfcPropertySet"): + pset_props = pset.HasProperties + elif pset.is_a("IfcMaterialProperties") or pset.is_a("IfcProfileProperties"): + pset_props = pset.Properties + + for prop in pset_props: + if props.properties.get(prop.Name): + continue # This property has already been added from a template + if prop.is_a("IfcPropertyEnumeratedValue"): + simple_prop = props.properties.add() + simple_prop.name = prop.Name + simple_prop.value_type = "IfcPropertyEnumeratedValue" + metadata = simple_prop.metadata + metadata.name = prop.Name + metadata.is_null = len(simple_prop.enumerated_value.enumerated_values) == 0 + metadata.is_optional = True + metadata.set_value(prop.EnumerationReference.EnumerationValues[0].wrappedValue) + + enum_items = [v.wrappedValue for v in prop.EnumerationReference.EnumerationValues] + selected_enum_items = [v.wrappedValue for v in prop.EnumerationValues] + data_type = metadata.get_value_name(display_only=True) + + for enum in enum_items: + new = simple_prop.enumerated_value.enumerated_values.add() + setattr(new, data_type, enum) + new.is_selected = enum in selected_enum_items + else: + if prop.is_a("IfcPropertySingleValue"): + value = prop.NominalValue.wrappedValue if prop.NominalValue else None + elif prop.is_a("IfcPhysicalSimpleQuantity"): + value = prop[3] + new_prop = props.properties.add() + new_prop.name = prop.Name + metadata = new_prop.metadata + metadata.set_value(value) + metadata.name = prop.Name + metadata.is_null = value is None + metadata.is_optional = True + metadata.set_value(metadata.get_value_default() if metadata.is_null else value) + + @classmethod + def get_prop_template_primitive_type(cls, prop_template): + if prop_template.TemplateType in ["Q_LENGTH", "Q_AREA", "Q_VOLUME", "Q_WEIGHT", "Q_TIME"]: + return "float" + elif prop_template.TemplateType == "Q_COUNT": + return "integer" + return ifcopenshell.util.attribute.get_primitive_type( + tool.Ifc.schema().declaration_by_name(prop_template.PrimaryMeasureType or "IfcLabel") + ) + + @classmethod + def import_enumerated_value_from_template(cls, prop_template, data, props): + enum_items = [v.wrappedValue for v in prop_template.Enumerators.EnumerationValues] + selected_enum_items = data.get(prop_template.Name, []) or [] + + prop = props.properties.add() + prop.name = prop_template.Name + prop.value_type = "IfcPropertyEnumeratedValue" + metadata = prop.metadata + metadata.name = prop_template.Name + metadata.is_null = data.get(prop_template.Name, None) is None + metadata.is_optional = True + metadata.is_uri = prop_template.PrimaryMeasureType == "IfcURIReference" + + # Cute hack to abuse the metadata to find the Blender data_type + metadata.set_value(enum_items[0]) + data_type = metadata.get_value_name() + + for enum in enum_items: + new = prop.enumerated_value.enumerated_values.add() + setattr(new, data_type, enum) + new.is_selected = enum in selected_enum_items + + @classmethod + def import_single_value_from_template(cls, pset_template, prop_template, data, props): + prop = props.properties.add() + prop.name = prop_template.Name + prop.value_type = "IfcPropertySingleValue" + metadata = prop.metadata + metadata.name = prop_template.Name + metadata.is_null = data.get(prop_template.Name, None) is None + metadata.is_optional = True + metadata.is_uri = prop_template.PrimaryMeasureType == "IfcURIReference" + metadata.has_calculator = bool(mapper.get(pset_template.Name, {}).get(prop_template.Name, None)) + metadata.data_type = cls.get_prop_template_primitive_type(prop_template) + + special_type = "" + if ( + prop_template.PrimaryMeasureType + in ( + "IfcPositiveLengthMeasure", + "IfcLengthMeasure", + ) + or prop_template.TemplateType == "Q_LENGTH" + ): + special_type = "LENGTH" + elif prop_template.PrimaryMeasureType == "IfcAreaMeasure" or prop_template.TemplateType == "Q_AREA": + special_type = "AREA" + elif prop_template.PrimaryMeasureType == "IfcVolumeMeasure" or prop_template.TemplateType == "Q_VOLUME": + special_type = "VOLUME" + metadata.special_type = special_type + + if metadata.data_type == "string": + metadata.string_value = "" if metadata.is_null else str(data[prop_template.Name]) + elif metadata.data_type == "integer": + metadata.int_value = 0 if metadata.is_null else int(data[prop_template.Name]) + elif metadata.data_type == "float": + metadata.float_value = 0.0 if metadata.is_null else float(data[prop_template.Name]) + elif metadata.data_type == "boolean": + metadata.bool_value = False if metadata.is_null else bool(data[prop_template.Name]) + + metadata.ifc_class = pset_template.Name + blenderbim.bim.helper.add_attribute_description(metadata, prop_template) + + @classmethod + def import_pset_from_template(cls, pset_template, pset, props): + if pset: + data = ifcopenshell.util.element.get_property_definition(pset) + del data["id"] + else: + data = {} + for prop_template in pset_template.HasPropertyTemplates: + if not prop_template.is_a("IfcSimplePropertyTemplate"): + continue # Other types not yet supported + if prop_template.TemplateType == "P_SINGLEVALUE": + cls.import_single_value_from_template(pset_template, prop_template, data, props) + elif prop_template.TemplateType.startswith("Q_"): + cls.import_single_value_from_template(pset_template, prop_template, data, props) + elif prop_template.TemplateType == "P_ENUMERATEDVALUE": + cls.import_enumerated_value_from_template(prop_template, data, props) + else: + # NOTE: currently unsupported types: + # - P_BOUNDEDVALUE + # - P_LISTVALUE + # - P_REFERENCEVALUE + # - P_TABLEVALUE + pass + + @classmethod + def clear_blender_pset_properties(cls, props): + props.properties.clear() + + @classmethod + def set_active_pset(cls, props, pset): + props.active_pset_id = pset.id() + props.active_pset_name = pset.Name + + @classmethod + def enable_proposed_pset(cls, props, pset_name, pset_type): + props.active_pset_id = 0 + props.active_pset_name = pset_name + props.active_pset_type = pset_type + + @classmethod + def get_pset_template(cls, name): + return blenderbim.bim.schema.ifc.psetqto.get_by_name(name) From 53d02446bfc7392f066a0b9284f01286f0e8ced5 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Wed, 22 May 2024 13:13:18 +0200 Subject: [PATCH 237/429] Update ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a1f37a1f9..f8b1468f1b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,7 +46,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install xmlschema xsdata numpy lxml pytest isodate lark networkx tabulate python-dateutil + pip install xmlschema xsdata numpy lxml pytest isodate lark networkx tabulate python-dateutil shapely pip install src/bcf --no-deps pip install https://github.com/Andrej730/aud/archive/refs/heads/master-reduced-size.zip From 382e028b903be0fb9588e601343e10b93ea620ef Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 22 May 2024 13:40:22 +0500 Subject: [PATCH 238/429] csv to cost schedule - support more cases of 0 quantity #4704 Before - https://i.imgur.com/CYwSGxY.png After - https://i.imgur.com/Wbe6Ij6.png I'll attach example .csv and .ifc in #4704 What changed: 1) If query was provided but it didn't found any elements, then it will still autoassign quantity = 0 instead of cost item end up without quantities at all (which has a different meaning in ifc). Works both with Property provided and without it. 2) If provided quantity = 0, it will now load as quantity = 0 instead of not creating any quantities at all. 3) You can provide both Query and Quantity and they all will be added to the cost item. E.g. if Quantity = 15, Query = "IfcWall", Property="Prop" and there are 3 walls in the model each having Prop = 25 then final quantity will be 15+25*3=90. Previously Quantity would take the priority and the result would be just = 15. Though this is still doesn't work with counting quantities due behaviour in cost.assign_cost_item_quantity. E.g. if Quantity = 7, Query = "IfcWall", Property="" (to make sure it will just count them) and there are 3 walls in the model then final quantity will be not 7+3=10 but just = 3, as query will take the priority here. --- src/ifc5d/ifc5d/csv2ifc.py | 28 +++++++++++++------ .../api/cost/assign_cost_item_quantity.py | 4 +++ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/ifc5d/ifc5d/csv2ifc.py b/src/ifc5d/ifc5d/csv2ifc.py index 8483d34dd4..3bdaa0d93c 100644 --- a/src/ifc5d/ifc5d/csv2ifc.py +++ b/src/ifc5d/ifc5d/csv2ifc.py @@ -173,24 +173,30 @@ class Csv2Ifc: cost_value.UnitBasis = self.file.createIfcMeasureWithUnit(value_component, unit_component) - if not self.is_schedule_of_rates and cost_item["Quantity"]: - quantity_class = ifcopenshell.util.unit.get_symbol_quantity_class(cost_item["Unit"]) + quantity = None + quantity_class = ifcopenshell.util.unit.get_symbol_quantity_class(cost_item["Unit"]) + if not cost_item["assignments"]["PropertyName"] or cost_item["assignments"]["PropertyName"].upper() == "COUNT": + prop_name = "" + else: + prop_name = cost_item["assignments"]["PropertyName"] + + if not self.is_schedule_of_rates and cost_item["Quantity"] is not None: quantity = ifcopenshell.api.run( "cost.add_cost_item_quantity", self.file, cost_item=cost_item["ifc"], ifc_class=quantity_class ) # 3 IfcPhysicalSimpleQuantity Value quantity[3] = cost_item["Quantity"] + if prop_name: + quantity.Name = prop_name if cost_item["assignments"]["Query"]: - if ( - not cost_item["assignments"]["PropertyName"] - or cost_item["assignments"]["PropertyName"].upper() == "COUNT" - ): - prop_name = "" - else: - prop_name = cost_item["assignments"]["PropertyName"] results = ifcopenshell.util.selector.filter_elements(self.file, cost_item["assignments"]["Query"]) results = [r for r in results if has_property(self.file, r, prop_name)] + # NOTE: currently we do not support count quantities that have + # both defined quantity in .csv "Quantity" column + # and some query in "Query" column. + # If query is provided it will override the defined value + # due current behaviour in cost.assign_cost_item_quantity. if results: ifcopenshell.api.run( "cost.assign_cost_item_quantity", @@ -199,6 +205,10 @@ class Csv2Ifc: products=results, prop_name=prop_name, ) + elif not quantity: + quantity = ifcopenshell.api.run( + "cost.add_cost_item_quantity", self.file, cost_item=cost_item["ifc"], ifc_class=quantity_class + ) self.create_cost_items(cost_item["children"], cost_item["ifc"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py index bf5b412a21..ae0643acae 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py @@ -44,6 +44,10 @@ def assign_cost_item_quantity( cost item and the product, so it is not necessary to use ifcopenshell.api.control.assign_control. + If cost item has just 1 quantity and it's IfcQuantityCount, API will + assume that quantity is used for counting controlled objects + and it will recalculate the quantity value at the end of the API call. + :param cost_item: The IfcCostItem to assign parametric quantities to :type cost_item: ifcopenshell.entity_instance :param products: The IfcObjects to assign parametric quantities to From f460676e54e861afd678ca94a79042fbfdeaa56b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 22 May 2024 17:37:32 +0500 Subject: [PATCH 239/429] fix calculating cost summary #4704 (was confusing 0 qty and no qty) similar to 295d0a677 --- src/ifcopenshell-python/ifcopenshell/util/cost.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/cost.py b/src/ifcopenshell-python/ifcopenshell/util/cost.py index d383dd66a3..d9ce6f874f 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/cost.py +++ b/src/ifcopenshell-python/ifcopenshell/util/cost.py @@ -102,7 +102,8 @@ def sum_child_root_elements(root_element: ifcopenshell.entity_instance, category if category_filter and child_cost_value.Category != category_filter: continue child_applied_value = calculate_applied_value(child_root_element, child_cost_value) - child_quantity = get_total_quantity(child_root_element) or 1.0 + child_quantity = get_total_quantity(child_root_element) + child_quantity = 1.0 if child_quantity is None else child_quantity if child_cost_value.UnitBasis: value_component = child_cost_value.UnitBasis.ValueComponent.wrappedValue result += child_quantity / value_component * child_applied_value From f2eb08a066d623c390c78a7a946d52be1e7c878f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 22 May 2024 11:05:42 +0500 Subject: [PATCH 240/429] typing --- src/blenderbim/blenderbim/core/cost.py | 2 +- src/blenderbim/blenderbim/tool/cost.py | 4 +-- src/ifc5d/ifc5d/csv2ifc.py | 4 +-- src/ifc5d/ifc5d/ifc5Dspreadsheet.py | 22 ++++++++++++--- .../api/cost/add_cost_item_quantity.py | 5 +++- .../api/cost/assign_cost_item_quantity.py | 15 +++++++---- .../ifcopenshell/util/unit.py | 27 ++++++++++++++++--- 7 files changed, 61 insertions(+), 18 deletions(-) diff --git a/src/blenderbim/blenderbim/core/cost.py b/src/blenderbim/blenderbim/core/cost.py index f23cb60a49..0859ed59b1 100644 --- a/src/blenderbim/blenderbim/core/cost.py +++ b/src/blenderbim/blenderbim/core/cost.py @@ -289,7 +289,7 @@ def calculate_cost_item_resource_value(ifc: tool.Ifc, cost_item: ifcopenshell.en ifc.run("cost.calculate_cost_item_resource_value", cost_item=cost_item) -def export_cost_schedules(cost: tool.Cost, filepath, format, cost_schedule=None): +def export_cost_schedules(cost: tool.Cost, filepath: str, format: str, cost_schedule=None): cost.play_sound() return cost.export_cost_schedules(filepath, format, cost_schedule) diff --git a/src/blenderbim/blenderbim/tool/cost.py b/src/blenderbim/blenderbim/tool/cost.py index aa4bb8264c..5d4698a24f 100644 --- a/src/blenderbim/blenderbim/tool/cost.py +++ b/src/blenderbim/blenderbim/tool/cost.py @@ -529,7 +529,7 @@ class Cost(blenderbim.core.tool.Cost): props.is_cost_update_enabled = True @classmethod - def export_cost_schedules(cls, filepath, format=None, cost_schedule=None): + def export_cost_schedules(cls, filepath: str, format: str, cost_schedule=None): import subprocess import os import sys @@ -642,7 +642,7 @@ class Cost(blenderbim.core.tool.Cost): return bool(cost_items) @classmethod - def load_product_cost_items(cls, product): + def load_product_cost_items(cls, product: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMCostProperties props.is_cost_update_enabled = False props.product_cost_items.clear() diff --git a/src/ifc5d/ifc5d/csv2ifc.py b/src/ifc5d/ifc5d/csv2ifc.py index 3bdaa0d93c..218a257d48 100644 --- a/src/ifc5d/ifc5d/csv2ifc.py +++ b/src/ifc5d/ifc5d/csv2ifc.py @@ -212,7 +212,7 @@ class Csv2Ifc: self.create_cost_items(cost_item["children"], cost_item["ifc"]) - def create_unit(self, symbol) -> ifcopenshell.entity_instance: + def create_unit(self, symbol: str) -> ifcopenshell.entity_instance: unit = self.units.get(symbol, None) if unit: return unit @@ -227,7 +227,7 @@ class Csv2Ifc: ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") -def has_property(self, product, property_name) -> bool: +def has_property(self, product: ifcopenshell.entity_instance, property_name: str) -> bool: if not property_name: return True qtos = ifcopenshell.util.element.get_psets(product, qtos_only=True) diff --git a/src/ifc5d/ifc5d/ifc5Dspreadsheet.py b/src/ifc5d/ifc5d/ifc5Dspreadsheet.py index 8e2b739cbb..826f610817 100644 --- a/src/ifc5d/ifc5d/ifc5Dspreadsheet.py +++ b/src/ifc5d/ifc5d/ifc5Dspreadsheet.py @@ -26,13 +26,18 @@ import ifcopenshell import ifcopenshell.util.element import ifcopenshell.util.cost import ifcopenshell.util.date +from typing import Union, Optional class IfcDataGetter: @staticmethod - def get_schedules(file, filter_by_schedule=None): + def get_schedules( + file: ifcopenshell.file, filter_by_schedule: Optional[ifcopenshell.entity_instance] = None + ) -> list[ifcopenshell.entity_instance]: return [ - schedule for schedule in file.by_type("IfcCostSchedule") if not filter_by_schedule or schedule == filter_by_schedule + schedule + for schedule in file.by_type("IfcCostSchedule") + if not filter_by_schedule or schedule == filter_by_schedule ] @staticmethod @@ -195,7 +200,18 @@ class IfcDataGetter: class Ifc5Dwriter: - def __init__(self, file=None, output=None, cost_schedule=None): + file: ifcopenshell.file + + def __init__( + self, + file: Union[str, ifcopenshell.file], + output: str, + cost_schedule: Optional[ifcopenshell.entity_instance] = None, + ): + """ + Args: + cost_schedule: exported cost schedule. If not provided, will export all available schedules. + """ self.output = output if isinstance(file, str): self.file = ifcopenshell.open(file) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py index 61ba86f6b2..fd1d793300 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py @@ -17,10 +17,13 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api +import ifcopenshell.util.unit def add_cost_item_quantity( - file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance, ifc_class: str = "IfcQuantityCount" + file: ifcopenshell.file, + cost_item: ifcopenshell.entity_instance, + ifc_class: ifcopenshell.util.unit.QUANTITY_CLASS = "IfcQuantityCount", ) -> ifcopenshell.entity_instance: """Adds a new quantity associated with a cost item diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py index ae0643acae..d9ef5c61f6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/assign_cost_item_quantity.py @@ -17,14 +17,14 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.api -from typing import Optional +from typing import Any def assign_cost_item_quantity( file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance, products: list[ifcopenshell.entity_instance], - prop_name: Optional[str] = "", + prop_name: str = "", ) -> None: """Adds a cost item quantity that is parametrically connected to a product @@ -96,6 +96,9 @@ def assign_cost_item_quantity( class Usecase: + file: ifcopenshell.file + settings: dict[str, Any] + def execute(self): if self.settings["prop_name"]: self.quantities = set(self.settings["cost_item"].CostQuantities or []) @@ -113,7 +116,9 @@ class Usecase: else: self.update_cost_item_count() - def assign_cost_control(self, related_object, cost_item): + def assign_cost_control( + self, related_object: ifcopenshell.entity_instance, cost_item: ifcopenshell.entity_instance + ) -> ifcopenshell.entity_instance: return ifcopenshell.api.run( "control.assign_control", self.file, @@ -121,12 +126,12 @@ class Usecase: relating_control=cost_item, ) - def add_quantity_from_related_object(self, element): + def add_quantity_from_related_object(self, element: ifcopenshell.entity_instance) -> None: for relationship in element.IsDefinedBy: if relationship.is_a("IfcRelDefinesByProperties"): self.add_quantity_from_qto(relationship.RelatingPropertyDefinition) - def add_quantity_from_qto(self, qto): + def add_quantity_from_qto(self, qto: ifcopenshell.entity_instance) -> None: if not qto.is_a("IfcElementQuantity"): return for prop in qto.Quantities: diff --git a/src/ifcopenshell-python/ifcopenshell/util/unit.py b/src/ifcopenshell-python/ifcopenshell/util/unit.py index fdbee952a4..55eda62d82 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/unit.py +++ b/src/ifcopenshell-python/ifcopenshell/util/unit.py @@ -337,6 +337,25 @@ unit_symbols = { "fahrenheit": "°F", } +QUANTITY_CLASS = Literal[ + "IfcQuantityCount", + "IfcQuantityNumber", + "IfcQuantityLength", + "IfcQuantityArea", + "IfcQuantityVolume", + "IfcQuantityWeight", + "IfcQuantityTime", + "IfcQuantityCount", +] + +MEASURE_CLASS = Literal[ + "IfcNumericMeasure", + "IfcLengthMeasure", + "IfcAreaMeasure", + "IfcVolumeMeasure", + "IfcMassMeasure", +] + def get_prefix(text): if text: @@ -468,14 +487,14 @@ def get_property_unit( return units[0] -def get_unit_measure_class(unit_type: str) -> str: +def get_unit_measure_class(unit_type: str) -> MEASURE_CLASS: if unit_type == "USERDEFINED": # See https://github.com/buildingSMART/IFC4.3.x-development/issues/71 return "IfcNumericMeasure" return "Ifc" + unit_type[0:-4].lower().capitalize() + "Measure" -def get_measure_unit_type(measure_class: str) -> str: +def get_measure_unit_type(measure_class: MEASURE_CLASS) -> str: if measure_class == "IfcNumericMeasure": # See https://github.com/buildingSMART/IFC4.3.x-development/issues/71 return "USERDEFINED" @@ -484,7 +503,7 @@ def get_measure_unit_type(measure_class: str) -> str: return measure_class.upper() + "UNIT" -def get_symbol_measure_class(symbol: Optional[str] = None) -> str: +def get_symbol_measure_class(symbol: Optional[str] = None) -> MEASURE_CLASS: # Dumb, but everybody gets it, unlike regex golf if not symbol: return "IfcNumericMeasure" @@ -502,7 +521,7 @@ def get_symbol_measure_class(symbol: Optional[str] = None) -> str: return "IfcNumericMeasure" -def get_symbol_quantity_class(symbol: Optional[str] = None) -> str: +def get_symbol_quantity_class(symbol: Optional[str] = None) -> QUANTITY_CLASS: # Dumb, but everybody gets it, unlike regex golf if not symbol: return "IfcQuantityCount" From 1aaccba80368b9907f748172cc69e3a56d6adb85 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 22 May 2024 18:44:12 +0500 Subject: [PATCH 241/429] simpler way to check if enum property is valid MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Well, it's simpler to use but not really simpler in implementation 😅 Thanks to @Gorgious56 for helping out Hopefully, it's a farewell to those annoying warnings see https://blenderartists.org/t/best-way-to-handle-dynamic-enum-items-without-pyrna-enum-to-py-current-value-matches-no-enum --- .../blenderbim/bim/module/model/data.py | 11 +++--- .../blenderbim/bim/module/model/prop.py | 2 +- src/blenderbim/blenderbim/tool/blender.py | 37 +++++++++++++++---- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/data.py b/src/blenderbim/blenderbim/bim/module/model/data.py index 3f3ca4a4bb..7f39a44552 100644 --- a/src/blenderbim/blenderbim/bim/module/model/data.py +++ b/src/blenderbim/blenderbim/bim/module/model/data.py @@ -121,9 +121,10 @@ class AuthoringData: def type_thumbnail(cls): if not cls.data["relating_type_id"]: return 0 - if not tool.Blender.enum_property_has_valid_index(cls.props, "relating_type_id", cls.data["relating_type_id"]): + relating_type_id = tool.Blender.get_enum_safe(cls.props, "relating_type_id") + if relating_type_id is None: return 0 - element = tool.Ifc.get().by_id(int(cls.props.relating_type_id)) + element = tool.Ifc.get().by_id(int(relating_type_id)) return cls.type_thumbnails.get(element.id(), None) or 0 @classmethod @@ -251,10 +252,8 @@ class AuthoringData: @classmethod def predefined_type(cls): - if not tool.Blender.enum_property_has_valid_index(cls.props, "relating_type_id", cls.data["relating_type_id"]): - return - relating_type_id = cls.props.relating_type_id - if not relating_type_id: + relating_type_id = tool.Blender.get_enum_safe(cls.props, "relating_type_id") + if relating_type_id is None: return relating_type = tool.Ifc.get().by_id(int(relating_type_id)) if not hasattr(relating_type, "PredefinedType"): diff --git a/src/blenderbim/blenderbim/bim/module/model/prop.py b/src/blenderbim/blenderbim/bim/module/model/prop.py index 81f763068f..3b55cc945b 100644 --- a/src/blenderbim/blenderbim/bim/module/model/prop.py +++ b/src/blenderbim/blenderbim/bim/module/model/prop.py @@ -60,7 +60,7 @@ def update_ifc_class(self, context): bpy.ops.bim.load_type_thumbnails(ifc_class=self.ifc_class) AuthoringData.data["relating_type_id"] = AuthoringData.relating_type_id() AuthoringData.data["type_thumbnail"] = AuthoringData.type_thumbnail() - if not tool.Blender.enum_property_has_valid_index(self, "relating_type_id", AuthoringData.data["relating_type_id"]): + if tool.Blender.get_enum_safe(self, "relating_type_id") is None: self["relating_type_id"] = 0 diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index af06cb5898..9a102c5399 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -468,20 +468,41 @@ class Blender(blenderbim.core.tool.Blender): active_object.select_set(True) @classmethod - def enum_property_has_valid_index(cls, props: bpy.types.PropertyGroup, prop_name: str, enum_items: tuple) -> bool: + def get_enum_safe(cls, props: bpy.types.PropertyGroup, prop_name: str) -> Union[str, None]: """method created for readibility and to avoid console warnings like `pyrna_enum_to_py: current value '17' matches no enum in 'BIMModelProperties', '', 'relating_type_id'` """ - items_amount = len(enum_items) + # Yes, accessing items through annotations is a bit hacky + # but it's the only way to get the dynamic enum items + # besides providing them to get_enum_safe explicitly. + prop_keywords = props.__annotations__[prop_name].keywords + items = prop_keywords.get("items") + if items is None: + return None + if not isinstance(items, (list, tuple)): + # items are retrieved through a callback, not a static list / tuple : + items = items(props, bpy.context) + + items_amount = len(items) # If enum has no items it seems to always produce a warning. # E.g. if you try to get it's value directly: `BIMModelProperties.relating_type_id`. if items_amount == 0: - return False - current_value_index = props.get(prop_name, None) - # assuming the default value is fine - if current_value_index is None: - return True - return current_value_index < items_amount + return None + + index = props.get(prop_name) + # If value was never changed (still default), we can just retrieve it from the enum. + if index is None: + default_value = prop_keywords.get("default") + if isinstance(default_value, int): + index = default_value + else: + # If default value is a string then it's a static enum + # and we can just return it. + return default_value + # Ensure index is valid. + if items_amount > index >= 0: + return items[index][0] + return None @classmethod def append_data_block(cls, filepath: str, data_block_type: str, name: str, link=False, relative=False) -> dict: From 85c6b6c4dac196075ea12ebfa3833f506dcc17a9 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Wed, 22 May 2024 15:58:34 +0200 Subject: [PATCH 242/429] Update ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f8b1468f1b..54b0835a99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -90,7 +90,7 @@ jobs: -DPYTHON_INCLUDE_DIR:PATH=${{ env.pythonLocation }}/include/python3.11 \ -DPYTHON_LIBRARY:FILEPATH=${{ env.pythonLocation }}/lib/libpython3.11.so \ -DCOLLADA_SUPPORT=Off \ - "-DSCHEMA_VERSIONS=2x3;4;4x3_add1" \ + "-DSCHEMA_VERSIONS=2x3;4;4x3_add2" \ -DGLTF_SUPPORT=On \ -DJSON_INCLUDE_DIR=/usr/include \ -DCGAL_INCLUDE_DIR=/usr/include \ From f772a53dd5b04b696522798f635b7a4eaf64356e Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Wed, 22 May 2024 17:29:15 +0200 Subject: [PATCH 243/429] Update ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54b0835a99..5a61f09f78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -90,7 +90,7 @@ jobs: -DPYTHON_INCLUDE_DIR:PATH=${{ env.pythonLocation }}/include/python3.11 \ -DPYTHON_LIBRARY:FILEPATH=${{ env.pythonLocation }}/lib/libpython3.11.so \ -DCOLLADA_SUPPORT=Off \ - "-DSCHEMA_VERSIONS=2x3;4;4x3_add2" \ + "-DSCHEMA_VERSIONS=2x3;4;4x3;4x3_add1;4x3_add2" \ -DGLTF_SUPPORT=On \ -DJSON_INCLUDE_DIR=/usr/include \ -DCGAL_INCLUDE_DIR=/usr/include \ From e9b9113df894ace0764f036c13802b6c8ff21968 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 22 May 2024 20:12:43 +0500 Subject: [PATCH 244/429] small fix for 1aaccba80 --- src/blenderbim/blenderbim/tool/blender.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 9a102c5399..067158ec31 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -492,7 +492,7 @@ class Blender(blenderbim.core.tool.Blender): index = props.get(prop_name) # If value was never changed (still default), we can just retrieve it from the enum. if index is None: - default_value = prop_keywords.get("default") + default_value = prop_keywords.get("default", 0) if isinstance(default_value, int): index = default_value else: From 87c184ef8a31a9e68ff4a9703f21f90c585bcf4a Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 23 May 2024 13:28:45 +1000 Subject: [PATCH 245/429] Easily add custom psets and props without needing to create a template first This is not best practice but is useful for quick and dirty properties. --- .../blenderbim/bim/module/pset/__init__.py | 1 + .../blenderbim/bim/module/pset/data.py | 4 +- .../blenderbim/bim/module/pset/operator.py | 14 ++++++ .../blenderbim/bim/module/pset/prop.py | 11 +++++ .../blenderbim/bim/module/pset/ui.py | 11 +++++ src/blenderbim/blenderbim/core/pset.py | 15 +++++-- src/blenderbim/blenderbim/core/tool.py | 6 ++- src/blenderbim/blenderbim/tool/pset.py | 45 +++++++++++++++++-- 8 files changed, 97 insertions(+), 10 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py index fd0bdcda57..905ed3a1d1 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/pset/__init__.py @@ -20,6 +20,7 @@ import bpy from . import ui, prop, operator classes = ( + operator.AddProposedProp, operator.AddPset, operator.AddQto, operator.CopyPropertyToSelection, diff --git a/src/blenderbim/blenderbim/bim/module/pset/data.py b/src/blenderbim/blenderbim/bim/module/pset/data.py index 0c3093f3a5..34c2759e45 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/data.py +++ b/src/blenderbim/blenderbim/bim/module/pset/data.py @@ -101,7 +101,9 @@ class ObjectPsetsData(Data): ) psetnames = cls.format_pset_enum(psets) assigned_names = ifcopenshell.util.element.get_psets(element, psets_only=True, should_inherit=False).keys() - return [p for p in psetnames if p[0] not in assigned_names] + return [("BBIM_CUSTOM_PSET", "Custom Pset", "Create a property set without using a template."), None] + [ + p for p in psetnames if p[0] not in assigned_names + ] @classmethod def qto_name(cls): diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index 0d4037b9f3..30f1ccbe67 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -468,3 +468,17 @@ class BIM_OT_bulk_remove_psets(bpy.types.Operator): self.report({"INFO"}, "Finished applying changes") return {"FINISHED"} + + +class AddProposedProp(bpy.types.Operator): + bl_idname = "bim.add_proposed_prop" + bl_label = "Add Proposed Prop" + bl_options = {"REGISTER", "UNDO"} + obj: bpy.props.StringProperty() + obj_type: bpy.props.StringProperty() + prop_name: bpy.props.StringProperty() + prop_value: bpy.props.StringProperty() + + def execute(self, context): + core.add_proposed_prop(tool.Pset, self.obj, self.obj_type, self.prop_name, self.prop_value) + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index d88884d7df..c22642057c 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -199,15 +199,19 @@ class IfcProperty(PropertyGroup): class PsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") + active_pset_has_template: BoolProperty(name="Active Pset Has Template") active_pset_name: StringProperty(name="Pset Name") active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) pset_name: EnumProperty(items=get_pset_name, name="Pset Name") qto_name: EnumProperty(items=get_qto_name, name="Qto Name") + prop_name: StringProperty(name="Property Name", default="MyProperty") + prop_value: StringProperty(name="Property Value", default="Some Value") class MaterialPsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") + active_pset_has_template: BoolProperty(name="Active Pset Has Template") active_pset_name: StringProperty(name="Pset Name") active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) @@ -216,6 +220,7 @@ class MaterialPsetProperties(PropertyGroup): class MaterialSetPsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") + active_pset_has_template: BoolProperty(name="Active Pset Has Template") active_pset_name: StringProperty(name="Pset Name") active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) @@ -224,6 +229,7 @@ class MaterialSetPsetProperties(PropertyGroup): class MaterialSetItemPsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") + active_pset_has_template: BoolProperty(name="Active Pset Has Template") active_pset_name: StringProperty(name="Pset Name") active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) @@ -232,6 +238,7 @@ class MaterialSetItemPsetProperties(PropertyGroup): class TaskPsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") + active_pset_has_template: BoolProperty(name="Active Pset Has Template") active_pset_name: StringProperty(name="Pset Name") active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) @@ -240,6 +247,7 @@ class TaskPsetProperties(PropertyGroup): class ResourcePsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") + active_pset_has_template: BoolProperty(name="Active Pset Has Template") active_pset_name: StringProperty(name="Pset Name") active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) @@ -249,6 +257,7 @@ class ResourcePsetProperties(PropertyGroup): class GroupPsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") + active_pset_has_template: BoolProperty(name="Active Pset Has Template") active_pset_name: StringProperty(name="Pset Name") active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) @@ -257,6 +266,7 @@ class GroupPsetProperties(PropertyGroup): class ProfilePsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") + active_pset_has_template: BoolProperty(name="Active Pset Has Template") active_pset_name: StringProperty(name="Pset Name") active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) @@ -265,6 +275,7 @@ class ProfilePsetProperties(PropertyGroup): class WorkSchedulePsetProperties(PropertyGroup): active_pset_id: IntProperty(name="Active Pset ID") + active_pset_has_template: BoolProperty(name="Active Pset Has Template") active_pset_name: StringProperty(name="Pset Name") active_pset_type: StringProperty(name="Active Pset Type") properties: CollectionProperty(name="Properties", type=IfcProperty) diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index cb895399ac..16536c5940 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -101,6 +101,7 @@ def draw_psetqto_ui(context, pset_id, pset, props, layout, obj_type, allow_remov if props.active_pset_id == pset_id: row.prop(props, "active_pset_name", icon="COPY_ID", text="") op = row.operator("bim.edit_pset", icon="CHECKMARK", text="") + op.pset_id = pset_id op.obj = obj_name op.obj_type = obj_type op = row.operator("bim.disable_pset_editing", icon="CANCEL", text="") @@ -132,6 +133,16 @@ def draw_psetqto_ui(context, pset_id, pset, props, layout, obj_type, allow_remov if props.active_pset_id == pset_id: for prop in props.properties: draw_psetqto_editable_ui(box, props, prop) + + if not props.active_pset_has_template: + row = box.row(align=True) + row.prop(props, "prop_name", text="") + row.prop(props, "prop_value", text="") + op = row.operator("bim.add_proposed_prop", text="", icon="ADD") + op.obj = obj_name + op.obj_type = obj_type + op.prop_name = props.prop_name + op.prop_value = props.prop_value else: has_props_displayed = False for prop in pset["Properties"]: diff --git a/src/blenderbim/blenderbim/core/pset.py b/src/blenderbim/blenderbim/core/pset.py index cd58736cf2..270eb9993e 100644 --- a/src/blenderbim/blenderbim/core/pset.py +++ b/src/blenderbim/blenderbim/core/pset.py @@ -37,9 +37,10 @@ def add_pset(ifc, pset, blender, obj_name, obj_type): else: elements = [ifc.get().by_id(blender.get_obj_ifc_definition_id(obj_name, obj_type))] for element in elements: + print('checking', element, pset_name) if not element: continue - if not pset.is_pset_applicable(element, pset_name): + if pset_name and not pset.is_pset_applicable(element, pset_name): continue pset.enable_pset_editing(pset_id=0, pset_name=pset_name, pset_type="PSET", obj=obj_name, obj_type=obj_type) @@ -52,9 +53,17 @@ def enable_pset_editing(pset_tool, pset, pset_name, pset_type, obj_name, obj_typ if pset_template: pset_tool.import_pset_from_template(pset_template, pset, props) + has_template = True + else: + has_template = False if pset: pset_tool.import_pset_from_existing(pset, props) - pset_tool.set_active_pset(props, pset) + pset_tool.set_active_pset(props, pset, has_template) else: - pset_tool.enable_proposed_pset(props, pset_name, pset_type) + pset_tool.enable_proposed_pset(props, pset_name, pset_type, has_template) + + +def add_proposed_prop(pset, obj_name, obj_type, name, value): + props = pset.get_pset_props(obj_name, obj_type) + pset.add_proposed_property(name, pset.cast_string_to_primitive(value), props) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 35607cd90e..ae8ce81919 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -618,8 +618,10 @@ class Profile: @interface class Pset: + def add_proposed_property(cls, name, value, props): pass + def cast_string_to_primitive(cls, value: str): pass def clear_blender_pset_properties(cls, props): pass - def enable_proposed_pset(cls, props, pset_name, pset_type): pass + def enable_proposed_pset(cls, props, pset_name, pset_type, has_template): pass def get_element_pset(cls, element, pset_name): pass def get_prop_template_primitive_type(cls, prop_template): pass def get_pset_name(cls, obj, obj_type): pass @@ -629,7 +631,7 @@ class Pset: def import_pset_from_template(cls, pset_template, pset, props): pass def import_single_value_from_template(cls, pset_template, prop_template, data, props): pass def is_pset_applicable(cls,element, pset_name): pass - def set_active_pset(cls, props, pset): pass + def set_active_pset(cls, props, pset, has_template): pass @interface diff --git a/src/blenderbim/blenderbim/tool/pset.py b/src/blenderbim/blenderbim/tool/pset.py index 783931786f..31493ded61 100644 --- a/src/blenderbim/blenderbim/tool/pset.py +++ b/src/blenderbim/blenderbim/tool/pset.py @@ -59,7 +59,9 @@ class Pset(blenderbim.core.tool.Pset): @classmethod def get_pset_name(cls, obj, obj_type): pset = cls.get_pset_props(obj, obj_type) - return pset.pset_name + if (name := pset.pset_name) == "BBIM_CUSTOM_PSET": + return "" + return name @classmethod def is_pset_applicable(cls, element: ifcopenshell.entity_instance, pset_name: str) -> bool: @@ -234,16 +236,51 @@ class Pset(blenderbim.core.tool.Pset): props.properties.clear() @classmethod - def set_active_pset(cls, props, pset): + def set_active_pset(cls, props, pset, has_template): props.active_pset_id = pset.id() props.active_pset_name = pset.Name + props.active_pset_has_template = has_template @classmethod - def enable_proposed_pset(cls, props, pset_name, pset_type): + def enable_proposed_pset(cls, props, pset_name, pset_type, has_template): props.active_pset_id = 0 - props.active_pset_name = pset_name + props.active_pset_name = pset_name or "My_Pset" props.active_pset_type = pset_type + props.active_pset_has_template = has_template @classmethod def get_pset_template(cls, name): return blenderbim.bim.schema.ifc.psetqto.get_by_name(name) + + @classmethod + def add_proposed_property(cls, name, value, props): + if props.properties.get(name): + return + prop = props.properties.add() + prop.name = name + metadata = prop.metadata + metadata.set_value(value) + metadata.name = name + metadata.is_null = value is None + metadata.is_optional = True + metadata.set_value(metadata.get_value_default() if metadata.is_null else value) + + @classmethod + def cast_string_to_primitive(cls, value: str): + value = value.strip() + if value.lower() == "true": + return True + elif value.lower() == "false": + return False + elif value.lower() == "null" or value == "": + return None + try: + value = int(value) + return value + except: + try: + value = float(value) + return value + except: + return value + return value From edfd446833e39d58ccc2e295786fb090d47d11d2 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 23 May 2024 15:17:08 +1000 Subject: [PATCH 246/429] Allow custom qtos without a template --- .../blenderbim/bim/module/pset/__init__.py | 24 ++-- .../blenderbim/bim/module/pset/data.py | 4 +- .../blenderbim/bim/module/pset/operator.py | 8 +- .../blenderbim/bim/module/pset/prop.py | 112 ++++++------------ src/blenderbim/blenderbim/core/pset.py | 3 +- src/blenderbim/blenderbim/core/tool.py | 2 +- src/blenderbim/blenderbim/tool/pset.py | 9 +- 7 files changed, 59 insertions(+), 103 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py index 905ed3a1d1..1d4ca05324 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/pset/__init__.py @@ -40,14 +40,6 @@ classes = ( prop.IfcPropertyEnumeratedValue, prop.IfcProperty, prop.PsetProperties, - prop.MaterialPsetProperties, - prop.MaterialSetPsetProperties, - prop.MaterialSetItemPsetProperties, - prop.TaskPsetProperties, - prop.ResourcePsetProperties, - prop.GroupPsetProperties, - prop.ProfilePsetProperties, - prop.WorkSchedulePsetProperties, prop.RenameProperties, prop.AddEditProperties, prop.DeletePsets, @@ -72,14 +64,14 @@ classes = ( def register(): bpy.types.Object.PsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) - bpy.types.Object.MaterialSetPsetProperties = bpy.props.PointerProperty(type=prop.MaterialSetPsetProperties) - bpy.types.Object.MaterialSetItemPsetProperties = bpy.props.PointerProperty(type=prop.MaterialSetItemPsetProperties) - bpy.types.Material.PsetProperties = bpy.props.PointerProperty(type=prop.MaterialPsetProperties) - bpy.types.Scene.TaskPsetProperties = bpy.props.PointerProperty(type=prop.TaskPsetProperties) - bpy.types.Scene.ResourcePsetProperties = bpy.props.PointerProperty(type=prop.ResourcePsetProperties) - bpy.types.Scene.GroupPsetProperties = bpy.props.PointerProperty(type=prop.GroupPsetProperties) - bpy.types.Scene.ProfilePsetProperties = bpy.props.PointerProperty(type=prop.ProfilePsetProperties) - bpy.types.Scene.WorkSchedulePsetProperties = bpy.props.PointerProperty(type=prop.WorkSchedulePsetProperties) + bpy.types.Object.MaterialSetPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Object.MaterialSetItemPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Material.PsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.TaskPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.ResourcePsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.GroupPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.ProfilePsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.WorkSchedulePsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) bpy.types.Scene.RenameProperties = bpy.props.CollectionProperty(type=prop.RenameProperties) bpy.types.Scene.AddEditProperties = bpy.props.CollectionProperty(type=prop.AddEditProperties) bpy.types.Scene.DeletePsets = bpy.props.CollectionProperty(type=prop.DeletePsets) diff --git a/src/blenderbim/blenderbim/bim/module/pset/data.py b/src/blenderbim/blenderbim/bim/module/pset/data.py index 34c2759e45..0c3093f3a5 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/data.py +++ b/src/blenderbim/blenderbim/bim/module/pset/data.py @@ -101,9 +101,7 @@ class ObjectPsetsData(Data): ) psetnames = cls.format_pset_enum(psets) assigned_names = ifcopenshell.util.element.get_psets(element, psets_only=True, should_inherit=False).keys() - return [("BBIM_CUSTOM_PSET", "Custom Pset", "Create a property set without using a template."), None] + [ - p for p in psetnames if p[0] not in assigned_names - ] + return [p for p in psetnames if p[0] not in assigned_names] @classmethod def qto_name(cls): diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index 30f1ccbe67..bef8466d62 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -144,6 +144,8 @@ class EditPset(bpy.types.Operator, Operator): for key, value in properties.items(): if isinstance(value, float): properties[key] = round(value, 4) + elif not isinstance(value, int): + properties[key] = 0 ifcopenshell.api.run( "pset.edit_qto", self.file, @@ -206,11 +208,9 @@ class AddQto(bpy.types.Operator, Operator): def _execute(self, context): self.file = IfcStore.get_file() - props = tool.Pset.get_pset_props(self.obj, self.obj_type) - ifc_definition_id = tool.Blender.get_obj_ifc_definition_id(self.obj, self.obj_type, context) - element = tool.Ifc.get().by_id(ifc_definition_id) + qto_name = tool.Pset.get_pset_name(self.obj, self.obj_type, pset_type="QTO") bpy.ops.bim.enable_pset_editing( - pset_id=0, pset_name=props.qto_name, pset_type="QTO", obj=self.obj, obj_type=self.obj_type + pset_id=0, pset_name=qto_name, pset_type="QTO", obj=self.obj, obj_type=self.obj_type ) diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index c22642057c..36c3f11362 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -59,6 +59,30 @@ def blender_formatted_enum_from_psets(psets): def get_pset_name(self, context): + pset_type = repr(self) + prop_type = pset_type.split(".")[-1] + results = [] + if "bpy.data.objects" in pset_type: + if prop_type == "PsetProperties": + results = get_object_pset_name(self, context) + elif prop_type == "MaterialSetPsetProperties": + results = get_material_set_pset_names(self, context) + elif prop_type == "MaterialSetItemPsetProperties": + results = get_material_set_item_pset_names(self, context) + elif "bpy.data.materials" in pset_type: + results = get_material_pset_names(self, context) + elif prop_type == "ResourcePsetProperties": + results = get_resource_pset_names(self, context) + elif prop_type == "GroupPsetProperties": + results = get_group_pset_names(self, context) + elif prop_type == "ProfilePsetProperties": + results = get_profile_pset_names(self, context) + elif prop_type == "WorkSchedulePsetProperties": + results = get_work_schedule_pset_names(self, context) + return [("BBIM_CUSTOM", "Custom Pset", "Create a property set without using a template."), None] + results + + +def get_object_pset_name(self, context): if not ObjectPsetsData.is_loaded: ObjectPsetsData.load() return ObjectPsetsData.data["pset_name"] @@ -168,6 +192,21 @@ def get_work_schedule_pset_names(self, context): def get_qto_name(self, context): + pset_type = repr(self) + prop_type = pset_type.split(".")[-1] + if "bpy.data.objects" in pset_type: + if prop_type == "PsetProperties": + results = get_object_qto_name(self, context) + elif prop_type == "TaskPsetProperties": + results = get_task_qto_names(self, context) + elif prop_type == "ResourcePsetProperties": + results = get_resource_qto_names(self, context) + elif prop_type == "GroupPsetProperties": + results = get_group_qto_names(self, context) + return [("BBIM_CUSTOM", "Custom Qto", "Create a quantity set without using a template."), None] + results + + +def get_object_qto_name(self, context): if not ObjectPsetsData.is_loaded: ObjectPsetsData.load() return ObjectPsetsData.data["qto_name"] @@ -209,79 +248,6 @@ class PsetProperties(PropertyGroup): prop_value: StringProperty(name="Property Value", default="Some Value") -class MaterialPsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_material_pset_names, name="Pset Name") - - -class MaterialSetPsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_material_set_pset_names, name="Pset Name") - - -class MaterialSetItemPsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_material_set_item_pset_names, name="Pset Name") - - -class TaskPsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - qto_name: EnumProperty(items=get_task_qto_names, name="Qto Name") - - -class ResourcePsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_resource_pset_names, name="Pset Name") - qto_name: EnumProperty(items=get_resource_qto_names, name="Qto Name") - - -class GroupPsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_group_pset_names, name="Pset Name") - qto_name: EnumProperty(items=get_group_qto_names, name="Qto Name") - -class ProfilePsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_profile_pset_names, name="Pset Name") - - -class WorkSchedulePsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_work_schedule_pset_names, name="Pset Name") - - class RenameProperties(PropertyGroup): pset_name: StringProperty(name="Pset") existing_property_name: StringProperty(name="Existing Property Name") diff --git a/src/blenderbim/blenderbim/core/pset.py b/src/blenderbim/blenderbim/core/pset.py index 270eb9993e..c21b59ccf5 100644 --- a/src/blenderbim/blenderbim/core/pset.py +++ b/src/blenderbim/blenderbim/core/pset.py @@ -31,13 +31,12 @@ def copy_property_to_selection(ifc, pset, is_pset=True, obj=None, pset_name=None def add_pset(ifc, pset, blender, obj_name, obj_type): - pset_name = pset.get_pset_name(obj_name, obj_type) + pset_name = pset.get_pset_name(obj_name, obj_type, pset_type="PSET") if obj_type == "Object": elements = [ifc.get_entity(obj) for obj in blender.get_selected_objects()] else: elements = [ifc.get().by_id(blender.get_obj_ifc_definition_id(obj_name, obj_type))] for element in elements: - print('checking', element, pset_name) if not element: continue if pset_name and not pset.is_pset_applicable(element, pset_name): diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index ae8ce81919..d2a226567f 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -624,7 +624,7 @@ class Pset: def enable_proposed_pset(cls, props, pset_name, pset_type, has_template): pass def get_element_pset(cls, element, pset_name): pass def get_prop_template_primitive_type(cls, prop_template): pass - def get_pset_name(cls, obj, obj_type): pass + def get_pset_name(cls, obj, obj_type, pset_type): pass def get_pset_template(cls, name): pass def import_enumerated_value_from_template(cls, prop_template, data, props): pass def import_pset_from_existing(cls, pset, props): pass diff --git a/src/blenderbim/blenderbim/tool/pset.py b/src/blenderbim/blenderbim/tool/pset.py index 31493ded61..110938fb9d 100644 --- a/src/blenderbim/blenderbim/tool/pset.py +++ b/src/blenderbim/blenderbim/tool/pset.py @@ -57,9 +57,10 @@ class Pset(blenderbim.core.tool.Pset): return bpy.context.scene.GroupPsetProperties @classmethod - def get_pset_name(cls, obj, obj_type): - pset = cls.get_pset_props(obj, obj_type) - if (name := pset.pset_name) == "BBIM_CUSTOM_PSET": + def get_pset_name(cls, obj, obj_type, pset_type="PSET"): + props = cls.get_pset_props(obj, obj_type) + name = props.pset_name if pset_type == "PSET" else props.qto_name + if name == "BBIM_CUSTOM": return "" return name @@ -244,7 +245,7 @@ class Pset(blenderbim.core.tool.Pset): @classmethod def enable_proposed_pset(cls, props, pset_name, pset_type, has_template): props.active_pset_id = 0 - props.active_pset_name = pset_name or "My_Pset" + props.active_pset_name = pset_name or "My_Data" props.active_pset_type = pset_type props.active_pset_has_template = has_template From 993ce46fcc93c815cdb63a266cf7b8d143168a08 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 12:10:47 +0500 Subject: [PATCH 247/429] improve ux for assigning cost item to product types 1) also consider active object as selected when assigning / unassigning cost item to product types. Typically types are hidden and if you select some type in outliner it will become active but still not selected. Now it will be possible to add this active object without unhiding the entire Types collection. 2) info messages to make UI more responsive --- .../blenderbim/bim/module/cost/operator.py | 18 ++++++++---- src/blenderbim/blenderbim/core/cost.py | 28 ++++++++++++++----- src/blenderbim/blenderbim/tool/spatial.py | 2 +- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/operator.py b/src/blenderbim/blenderbim/bim/module/cost/operator.py index 6aae74d68c..3a1a96f76f 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cost/operator.py @@ -224,35 +224,39 @@ class EditCostItem(bpy.types.Operator, tool.Ifc.Operator): class AssignCostItemType(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.assign_cost_item_type" bl_label = "Assign Cost Item To Product Types" + bl_description = "Assign cost item to currently selected or active product types" bl_options = {"REGISTER", "UNDO"} cost_item: bpy.props.IntProperty() prop_name: bpy.props.StringProperty() def _execute(self, context): - core.assign_cost_item_type( + product_types = core.assign_cost_item_type( tool.Ifc, tool.Cost, tool.Spatial, cost_item=tool.Ifc.get().by_id(self.cost_item), prop_name=self.prop_name, # TODO: REVIEW PROP_NAME USABILITY ) + self.report({"INFO"}, f"Cost item was assigned to {len(product_types)} product types.") class UnassignCostItemType(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.unassign_cost_item_type" bl_label = "Unassign Cost Item Type" + bl_description = "Unassign cost item from currently selected or active product types" bl_options = {"REGISTER", "UNDO"} cost_item: bpy.props.IntProperty() related_object: bpy.props.IntProperty() def _execute(self, context): - core.unassign_cost_item_type( + product_types = core.unassign_cost_item_type( tool.Ifc, tool.Cost, tool.Spatial, cost_item=tool.Ifc.get().by_id(self.cost_item), - product_types=[tool.Ifc.get().by_id(self.related_object)] if self.related_object else [], + product_types=[tool.Ifc.get().by_id(self.related_object)] if self.related_object else None, ) + self.report({"INFO"}, f"Cost item was unassigned from {len(product_types)} product types.") return {"FINISHED"} @@ -287,9 +291,11 @@ class UnassignCostItemQuantity(bpy.types.Operator, tool.Ifc.Operator): tool.Ifc, tool.Cost, cost_item=tool.Ifc.get().by_id(self.cost_item), - products=[tool.Ifc.get().by_id(self.related_object)] - if self.related_object - else tool.Spatial.get_selected_products(), + products=( + [tool.Ifc.get().by_id(self.related_object)] + if self.related_object + else tool.Spatial.get_selected_products() + ), ) diff --git a/src/blenderbim/blenderbim/core/cost.py b/src/blenderbim/blenderbim/core/cost.py index 0859ed59b1..9d4c4048f1 100644 --- a/src/blenderbim/blenderbim/core/cost.py +++ b/src/blenderbim/blenderbim/core/cost.py @@ -17,7 +17,7 @@ # along with BlenderBIM Add-on. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, Optional, Union if TYPE_CHECKING: import bpy @@ -111,25 +111,39 @@ def edit_cost_item(ifc: tool.Ifc, cost: tool.Cost): def assign_cost_item_type( ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item: ifcopenshell.entity_instance, prop_name -): - product_types = spatial.get_selected_product_types() - [ +) -> list[ifcopenshell.entity_instance]: + """ + Returns: + List of found product types. + """ + product_types = list(spatial.get_selected_product_types()) + rels = [ ifc.run("control.assign_control", relating_control=cost_item, related_object=product_type) for product_type in product_types ] cost.load_cost_item_types(cost_item) + return product_types def unassign_cost_item_type( - ifc: tool.Ifc, cost: tool.Cost, spatial: tool.Spatial, cost_item: ifcopenshell.entity_instance, product_types -): + ifc: tool.Ifc, + cost: tool.Cost, + spatial: tool.Spatial, + cost_item: ifcopenshell.entity_instance, + product_types: Optional[list[ifcopenshell.entity_instance]] = None, +) -> list[ifcopenshell.entity_instance]: + """ + Returns: + List of found product types. + """ if not product_types: - product_types = spatial.get_selected_product_types() + product_types = list(spatial.get_selected_product_types()) [ ifc.run("control.unassign_control", relating_control=cost_item, related_object=product_type) for product_type in product_types ] cost.load_cost_item_types(cost_item) + return product_types def load_cost_item_types(cost: tool.Cost): diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index 101d17e454..057b0eabf1 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -196,7 +196,7 @@ class Spatial(blenderbim.core.tool.Spatial): @classmethod def get_selected_product_types(cls) -> Generator[ifcopenshell.entity_instance, None, None]: - for obj in bpy.context.selected_objects: + for obj in tool.Blender.get_selected_objects(): entity = tool.Ifc.get_entity(obj) if entity and entity.is_a("IfcTypeProduct"): yield entity From a8729933af961aab448b2342ed5dea2d5eac2e80 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 23 May 2024 20:15:01 +1000 Subject: [PATCH 248/429] Optimise remove_deep, which can make removing lots of elements 100x faster in scripts. --- src/ifcopenshell-python/ifcopenshell/file.py | 8 ++++++++ src/ifcopenshell-python/ifcopenshell/util/element.py | 9 ++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index 66894bc2a1..cf8e5491a2 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -505,6 +505,11 @@ class file: ) -> list[ifcopenshell.entity_instance]: """Return a list of entities that reference this entity + Warning: this is a slow function, especially when there is a large + number of inverses (such as for a shared owner history). If you are + only interested in the total number of inverses (typically 0, 1, or N), + consider using :func:`get_total_inverses`. + :param inst: The entity instance to get inverse relationships :type inst: ifcopenshell.entity_instance :param allow_duplicate: Returns a `list` when True, `set` when False @@ -530,6 +535,9 @@ class file: def get_total_inverses(self, inst: ifcopenshell.entity_instance) -> int: """Returns the number of entities that reference this entity + This is equivalent to `len(model.get_inverse(element))`, but + significantly faster. + :param inst: The entity instance to get inverse relationships :type inst: ifcopenshell.entity_instance :returns: The total number of references diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index f0df9b16f5..3e7864d90d 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -1315,6 +1315,8 @@ def remove_deep2( :type element: ifcopenshell.entity_instance """ # ifc_file.batch() + if ifc_file.get_total_inverses(element): + return to_delete = set() subgraph = list(ifc_file.traverse(element, breadth_first=True)) subgraph.extend(also_consider) @@ -1325,7 +1327,12 @@ def remove_deep2( if ( subelement.id() and subelement not in do_not_delete - and len(set(ifc_file.get_inverse(subelement)) - subgraph_set) == 0 + and ( + # 0 or 1 inverses means it only exists in this subgraph + ifc_file.get_total_inverses(subelement) < 2 + # Alternatively, let's ensure all inverses are within the subgrpah + or len(set(ifc_file.get_inverse(subelement)) - subgraph_set) == 0 + ) ): to_delete.add(subelement) subelement_queue.extend(ifc_file.traverse(subelement, max_levels=1)[1:]) From 0336dbabf7d0558166743cb6145abe8bedddde25 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 23 May 2024 20:41:15 +1000 Subject: [PATCH 249/429] Fix #4722. Things like type elements are not allowed to have openings applied to them. --- src/blenderbim/blenderbim/bim/module/void/operator.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/void/operator.py b/src/blenderbim/blenderbim/bim/module/void/operator.py index 627f5cd980..6257af9278 100644 --- a/src/blenderbim/blenderbim/bim/module/void/operator.py +++ b/src/blenderbim/blenderbim/bim/module/void/operator.py @@ -77,6 +77,10 @@ class AddOpening(bpy.types.Operator, tool.Ifc.Operator): self.report({"INFO"}, "You can't add an opening to another opening.") continue + if not hasattr(element1, "HasOpenings"): + self.report({"INFO"}, f"An {element1.is_a()} is not allowed to have an opening.") + continue + if tool.Ifc.is_moved(obj1): blenderbim.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj1) From 3c429626354eb8793f5f54869d10418d907c12ac Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 23 May 2024 21:40:19 +1000 Subject: [PATCH 250/429] Fix #4716. Fix bug where IfcTester fails to verify negative numbers. --- src/ifctester/ifctester/facet.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/ifctester/ifctester/facet.py b/src/ifctester/ifctester/facet.py index c5fa773ac1..bd4d0c51e5 100644 --- a/src/ifctester/ifctester/facet.py +++ b/src/ifctester/ifctester/facet.py @@ -48,6 +48,16 @@ def cast_to_value(from_value, to_value): pass +# See bug 4716. +def is_x(value, cast_value): + if cast_value >= 0: + if value < cast_value * (1.0 - 1e-6) or value > cast_value * (1.0 + 1e-6): + return False + elif value > cast_value * (1.0 - 1e-6) or value < cast_value * (1.0 + 1e-6): + return False + return True + + @lru_cache def get_pset(element, pset): return ifcopenshell.util.element.get_pset(element, pset) @@ -332,7 +342,7 @@ class Attribute(Facet): elif isinstance(self.value, str): cast_value = cast_to_value(self.value, value) if isinstance(value, float) and isinstance(cast_value, float): - if value < cast_value * (1.0 - 1e-6) or value > cast_value * (1.0 + 1e-6): + if not is_x(value, cast_value): is_pass = False reason = {"type": "VALUE", "actual": value} break @@ -858,7 +868,7 @@ class Property(Facet): # "42" = 42 cast_value = cast_to_value(self.value, value) if isinstance(value, float) and isinstance(cast_value, float): - if value < cast_value * (1.0 - 1e-6) or value > cast_value * (1.0 + 1e-6): + if not is_x(value, cast_value): is_pass = False reason = {"type": "VALUE", "actual": value} break From 02cae9c7c2f3f0b2939b77f3a3461e1bf817c7a2 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 23 May 2024 22:54:19 +1000 Subject: [PATCH 251/429] Continue to revise optimisation of remove_deep to fix failing tests after a8729933 --- .../ifcopenshell/util/element.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 3e7864d90d..76366c2f0e 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -1315,8 +1315,19 @@ def remove_deep2( :type element: ifcopenshell.entity_instance """ # ifc_file.batch() - if ifc_file.get_total_inverses(element): + also_considered_inverses = 0 + + def increment_considered_inverses(_): + nonlocal also_considered_inverses + also_considered_inverses += 1 + + for considered_element in also_consider: + for attribute in considered_element: + considered_element.walk(lambda x: x == element, increment_considered_inverses, attribute) + + if ifc_file.get_total_inverses(element) > 0 + also_considered_inverses: return + to_delete = set() subgraph = list(ifc_file.traverse(element, breadth_first=True)) subgraph.extend(also_consider) @@ -1328,7 +1339,7 @@ def remove_deep2( subelement.id() and subelement not in do_not_delete and ( - # 0 or 1 inverses means it only exists in this subgraph + # 0 or 1 inverses guarantees that the subelement only exists in this subgraph ifc_file.get_total_inverses(subelement) < 2 # Alternatively, let's ensure all inverses are within the subgrpah or len(set(ifc_file.get_inverse(subelement)) - subgraph_set) == 0 From c405ff1adf75df7f00f5703cc1be29f361f9d1cb Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 23 May 2024 23:08:53 +1000 Subject: [PATCH 252/429] Fix unassign_representation to not incorrectly use remove_deep without first removing known inverses. In theory, it would be possible for the representation map to be used elsewhere, then file.remove(representation_map) would cause problems. --- .../api/geometry/unassign_representation.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py index 435ea5207c..8473934821 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/unassign_representation.py @@ -47,17 +47,25 @@ class Usecase: product.Representation.Representations = representations def unassign_type_representation(self): + + matching_representation_map = None + representation_maps = self.settings["product"].RepresentationMaps or [] + for representation_map in self.settings["product"].RepresentationMaps or []: if representation_map.MappedRepresentation == self.settings["representation"]: - self.unassign_products_using_mapped_representation(representation_map) - self.remove_representation_map_only(representation_map) + matching_representation_map = representation_map break - self.settings["product"].RepresentationMaps = self.settings["product"].RepresentationMaps or None + + if matching_representation_map: + self.unassign_products_using_mapped_representation(matching_representation_map) + self.settings["product"].RepresentationMaps = [ + rm for rm in self.settings["product"].RepresentationMaps if rm != matching_representation_map + ] or None + self.remove_representation_map_only(matching_representation_map) def remove_representation_map_only(self, representation_map): representation_map.MappedRepresentation = self.file.createIfcShapeRepresentation() ifcopenshell.util.element.remove_deep2(self.file, representation_map) - self.file.remove(representation_map) def unassign_products_using_mapped_representation(self, representation_map): mapped_representations = [] From 96088c1d08ffa07794d20fb8c83845ef75e2cef6 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 12:35:37 +0500 Subject: [PATCH 253/429] fix ui error in 40e4949 bim.add_manual_classification_reference operator doesn't have a "type" property, only "obj_type" --- src/blenderbim/blenderbim/bim/module/classification/ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/classification/ui.py b/src/blenderbim/blenderbim/bim/module/classification/ui.py index 3a95966a68..3423545462 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/ui.py +++ b/src/blenderbim/blenderbim/bim/module/classification/ui.py @@ -155,7 +155,7 @@ class ReferenceUI: blenderbim.bim.helper.draw_attributes(self.props.reference_attributes, self.layout) row = self.layout.row(align=True) op = row.operator("bim.add_manual_classification_reference", text="Save", icon="CHECKMARK") - op.type = self.data.data["object_type"] + op.obj_type = self.data.data["object_type"] row.operator("bim.disable_adding_manual_classification_reference", text="", icon="CANCEL") else: row = self.layout.row() From 4d9f47b3a796b9b588815829b5c3b78932363b25 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 15:05:31 +0500 Subject: [PATCH 254/429] make it more clear that bim.export_cost_schedules is expecting a folder 1) add folder filter 2) remove filepath property - that way only directories will be selectable in the file dialog. --- src/blenderbim/blenderbim/bim/module/cost/operator.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/operator.py b/src/blenderbim/blenderbim/bim/module/cost/operator.py index 3a1a96f76f..a5e9b88e2f 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cost/operator.py @@ -663,12 +663,16 @@ class ExportCostSchedules(bpy.types.Operator): bl_description = "Export a cost schedule to a CSV, XSLX OR ODS file" cost_schedule: bpy.props.IntProperty() format: bpy.props.EnumProperty("Format", items=(("CSV", "CSV", ""), ("XLSX", "XLSX", ""), ("ODS", "ODS", ""))) - filepath: bpy.props.StringProperty(subtype="FILE_PATH") + directory: bpy.props.StringProperty(subtype="FILE_PATH") + filter_folder: bpy.props.BoolProperty( + name="Filter Folders", + default=True, + ) 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 + tool.Cost, filepath=self.directory, format=self.format, cost_schedule=cost_schedule ) if isinstance(r, str): self.report({"ERROR"}, r) @@ -682,6 +686,7 @@ class ExportCostSchedules(bpy.types.Operator): def draw(self, context): self.layout.label(text="Choose a format") self.layout.prop(self, "format") + self.layout.label(text="Select a directory.") class ClearCostItemAssignments(bpy.types.Operator, tool.Ifc.Operator): From 073e471305eb62a7e9dc634ce6f99f51d707712f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 12:02:37 +0500 Subject: [PATCH 255/429] typing --- .../blenderbim/bim/module/csv/operator.py | 1 + .../blenderbim/bim/module/resource/data.py | 3 +- src/blenderbim/blenderbim/core/resource.py | 111 ++++++++++++------ src/blenderbim/blenderbim/tool/cost.py | 4 +- src/blenderbim/blenderbim/tool/resource.py | 95 +++++++-------- src/ifccsv/ifccsv.py | 18 ++- .../api/cost/edit_cost_value_formula.py | 1 + .../ifcopenshell/util/resource.py | 68 ++++++----- 8 files changed, 188 insertions(+), 113 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/csv/operator.py b/src/blenderbim/blenderbim/bim/module/csv/operator.py index b62d9b93a1..47c5c28cfa 100644 --- a/src/blenderbim/blenderbim/bim/module/csv/operator.py +++ b/src/blenderbim/blenderbim/bim/module/csv/operator.py @@ -23,6 +23,7 @@ import ifccsv import logging import tempfile import ifcopenshell +import ifcopenshell.util.selector import blenderbim.tool as tool import blenderbim.bim.module.drawing.scheduler as scheduler from blenderbim.bim.ifc import IfcStore diff --git a/src/blenderbim/blenderbim/bim/module/resource/data.py b/src/blenderbim/blenderbim/bim/module/resource/data.py index e70b29fb7a..47292fa3ab 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/data.py +++ b/src/blenderbim/blenderbim/bim/module/resource/data.py @@ -19,6 +19,7 @@ import bpy import blenderbim.tool as tool import ifcopenshell +import ifcopenshell.util.resource def refresh(): @@ -139,7 +140,7 @@ class ResourceData: return results @classmethod - def active_resource_ids(cls): + def active_resource_ids(cls) -> list[int]: obj = bpy.context.active_object element = tool.Ifc.get_entity(obj) if not element: diff --git a/src/blenderbim/blenderbim/core/resource.py b/src/blenderbim/blenderbim/core/resource.py index 63524cd03c..cf703df41b 100644 --- a/src/blenderbim/blenderbim/core/resource.py +++ b/src/blenderbim/blenderbim/core/resource.py @@ -18,42 +18,57 @@ # ############################################################################ # +from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Union, Iterable -def load_resources(resource): +if TYPE_CHECKING: + import bpy + import ifcopenshell + import blenderbim.tool as tool + + +def load_resources(resource: tool.Resource) -> None: resource.load_resources() -def add_resource(tool_ifc, resource_tool, ifc_class, parent_resource=None): +def add_resource( + tool_ifc: tool.Ifc, + resource_tool: tool.Resource, + ifc_class, + parent_resource: Optional[ifcopenshell.entity_instance] = None, +) -> None: tool_ifc.run("resource.add_resource", ifc_class=ifc_class, parent_resource=parent_resource) resource_tool.load_resources() -def disable_editing_resource(resource_tool): +def disable_editing_resource(resource_tool: tool.Resource) -> None: resource_tool.disable_editing_resource() -def disable_resource_editing_ui(resource_tool): +def disable_resource_editing_ui(resource_tool: tool.Resource) -> None: resource_tool.disable_resource_editing_ui() -def enable_editing_resource(resource_tool, resource): +def enable_editing_resource(resource_tool: tool.Resource, resource) -> None: resource_tool.enable_editing_resource(resource) resource_tool.load_resource_attributes(resource) -def edit_resource(ifc, resource_tool, resource): +def edit_resource(ifc: tool.Ifc, resource_tool: tool.Resource, resource: ifcopenshell.entity_instance) -> None: attributes = resource_tool.get_resource_attributes() ifc.run("resource.edit_resource", resource=resource, attributes=attributes) resource_tool.load_resource_properties() resource_tool.disable_editing_resource() -def remove_resource(ifc, resource_tool, resource=None): +def remove_resource(ifc: tool.Ifc, resource_tool: tool.Resource, resource: ifcopenshell.entity_instance) -> None: ifc.run("resource.remove_resource", resource=resource) resource_tool.load_resources() -def enable_editing_resource_time(ifc_tool, resource_tool, resource): +def enable_editing_resource_time( + ifc_tool, resource_tool: tool.Resource, resource: ifcopenshell.entity_instance +) -> None: resource_time = resource_tool.get_resource_time(resource) if resource_time is None: resource_time = ifc_tool.run("resource.add_resource_time", resource=resource) @@ -61,17 +76,21 @@ def enable_editing_resource_time(ifc_tool, resource_tool, resource): resource_tool.load_resource_time_attributes(resource_time) -def edit_resource_time(ifc, resource_tool, resource_time): +def edit_resource_time( + ifc: tool.Ifc, resource_tool: tool.Resource, resource_time: ifcopenshell.entity_instance +) -> None: attributes = resource_tool.get_resource_time_attributes() ifc.run("resource.edit_resource_time", resource_time=resource_time, attributes=attributes) resource_tool.disable_editing_resource() -def disable_editing_resource_time(resource_tool): +def disable_editing_resource_time(resource_tool: tool.Resource) -> None: resource_tool.disable_editing_resource() -def calculate_resource_work(ifc, resource_tool, resource): +def calculate_resource_work( + ifc: tool.Ifc, resource_tool: tool.Resource, resource: ifcopenshell.entity_instance +) -> None: if resource_tool.get_task_assignments(resource): ifc.run("resource.calculate_resource_work", resource=resource) else: @@ -81,92 +100,112 @@ def calculate_resource_work(ifc, resource_tool, resource): resource_tool.load_resources() -def enable_editing_resource_costs(resource_tool, resource): +def enable_editing_resource_costs(resource_tool: tool.Resource, resource: ifcopenshell.entity_instance) -> None: resource_tool.enable_editing_resource_costs(resource) resource_tool.disable_editing_resource_cost_value() -def disable_editing_resource_cost_value(resource_tool): +def disable_editing_resource_cost_value(resource_tool: tool.Resource) -> None: resource_tool.disable_editing_resource_cost_value() -def enable_editing_resource_cost_value(resource_tool, cost_value): +def enable_editing_resource_cost_value(resource_tool: tool.Resource, cost_value: ifcopenshell.entity_instance) -> None: resource_tool.enable_editing_cost_value_attributes(cost_value) resource_tool.load_cost_value_attributes(cost_value) -def enable_editing_resource_cost_value_formula(resource_tool, cost_value): +def enable_editing_resource_cost_value_formula( + resource_tool: tool.Resource, cost_value: ifcopenshell.entity_instance +) -> None: resource_tool.enable_editing_resource_cost_value_formula(cost_value) -def edit_resource_cost_value_formula(ifc, resource_tool, cost_value): +def edit_resource_cost_value_formula( + ifc: tool.Ifc, resource_tool: tool.Resource, cost_value: ifcopenshell.entity_instance +) -> None: formula = resource_tool.get_resource_cost_value_formula() ifc.run("cost.edit_cost_value_formula", cost_value=cost_value, formula=formula) resource_tool.disable_editing_resource_cost_value() -def edit_resource_cost_value(ifc, resource_tool, cost_value): +def edit_resource_cost_value( + ifc: tool.Ifc, resource_tool: tool.Resource, cost_value: ifcopenshell.entity_instance +) -> None: attributes = resource_tool.get_resource_cost_value_attributes() ifc.run("cost.edit_cost_value", cost_value=cost_value, attributes=attributes) resource_tool.disable_editing_resource_cost_value() -def enable_editing_resource_base_quantity(resource_tool, resource): +def enable_editing_resource_base_quantity(resource_tool: tool.Resource, resource: ifcopenshell.entity_instance) -> None: resource_tool.enable_editing_resource_base_quantity(resource) -def add_resource_quantity(ifc, ifc_class, resource): +def add_resource_quantity(ifc: tool.Ifc, ifc_class: str, resource: ifcopenshell.entity_instance) -> None: ifc.run("resource.add_resource_quantity", resource=resource, ifc_class=ifc_class) -def remove_resource_quantity(ifc, resource): +def remove_resource_quantity(ifc: tool.Ifc, resource: ifcopenshell.entity_instance) -> None: ifc.run("resource.remove_resource_quantity", resource=resource) -def enable_editing_resource_quantity(resource_tool, resource_quantity=None): +def enable_editing_resource_quantity( + resource_tool: tool.Resource, resource_quantity: ifcopenshell.entity_instance +) -> None: resource_tool.enable_editing_resource_quantity(resource_quantity) -def disable_editing_resource_quantity(resource_tool): +def disable_editing_resource_quantity(resource_tool: tool.Resource) -> None: resource_tool.disable_editing_resource_quantity() -def edit_resource_quantity(resource_tool, ifc, physical_quantity=None): +def edit_resource_quantity( + resource_tool: tool.Resource, ifc: tool.Ifc, physical_quantity: ifcopenshell.entity_instance +) -> None: attributes = resource_tool.get_resource_quantity_attributes() ifc.run("resource.edit_resource_quantity", physical_quantity=physical_quantity, attributes=attributes) resource_tool.disable_editing_resource_quantity() -def import_resources(resource_tool, file_path): +def import_resources(resource_tool: tool.Resource, file_path: str) -> None: resource_tool.import_resources(file_path) resource_tool.load_resources() -def expand_resource(resource_tool, resource): +def expand_resource(resource_tool: tool.Resource, resource: ifcopenshell.entity_instance) -> None: resource_tool.expand_resource(resource) resource_tool.load_resources() -def contract_resource(resource_tool, resource): +def contract_resource(resource_tool: tool.Resource, resource: ifcopenshell.entity_instance) -> None: resource_tool.contract_resource(resource) resource_tool.load_resources() -def assign_resource(ifc, spatial, resource=None, products=None): +def assign_resource( + ifc: tool.Ifc, + spatial: tool.Spatial, + resource: ifcopenshell.entity_instance, + products: Optional[Iterable[ifcopenshell.entity_instance]] = None, +) -> None: if not products: products = spatial.get_selected_products() for product in products: rel = ifc.run("resource.assign_resource", relating_resource=resource, related_object=product) -def unassign_resource(ifc, spatial, resource=None, products=None): +def unassign_resource( + ifc: tool.Ifc, + spatial: tool.Spatial, + resource: ifcopenshell.entity_instance, + products: Optional[Iterable[ifcopenshell.entity_instance]] = None, +) -> None: if not products: products = spatial.get_selected_products() for product in products: ifc.run("resource.unassign_resource", relating_resource=resource, related_object=product) -def edit_productivity_pset(ifc, resource_tool): +def edit_productivity_pset(ifc: tool.Ifc, resource_tool: tool.Resource) -> None: resource = resource_tool.get_highlighted_resource() if resource is None: return @@ -178,7 +217,9 @@ def edit_productivity_pset(ifc, resource_tool): ifc.run("pset.edit_pset", pset=pset, properties=resource_tool.get_productivity_attributes()) -def add_usage_constraint(ifc, resource_tool, resource=None, reference_path=None): +def add_usage_constraint( + ifc: tool.Ifc, resource_tool: tool.Resource, resource: ifcopenshell.entity_instance, reference_path: str +) -> None: metric = resource_tool.has_metric_constraint(resource, "Usage") if metric: return print("Must remove existing metric first") @@ -198,7 +239,9 @@ def add_usage_constraint(ifc, resource_tool, resource=None, reference_path=None) ifc.run("constraint.assign_constraint", products=[resource], constraint=objective) -def remove_usage_constraint(ifc, resource_tool, resource, reference_path): +def remove_usage_constraint( + ifc: tool.Ifc, resource_tool: tool.Resource, resource: ifcopenshell.entity_instance, reference_path: str +) -> None: constraints = resource_tool.get_constraints(resource) for constraint in constraints: metrics = resource_tool.get_metrics(constraint) @@ -210,10 +253,12 @@ def remove_usage_constraint(ifc, resource_tool, resource, reference_path): ifc.run("constraint.remove_constraint", constraint=constraint) -def go_to_resource(resource_tool, resource): +def go_to_resource(resource_tool: tool.Resource, resource: ifcopenshell.entity_instance) -> None: resource_tool.go_to_resource(resource) -def calculate_resource_usage(ifc, resource_tool, resource): +def calculate_resource_usage( + ifc: tool.Resource, resource_tool: tool.Resource, resource: ifcopenshell.entity_instance +) -> None: ifc.run("resource.calculate_resource_usage", resource=resource) resource_tool.load_resources() diff --git a/src/blenderbim/blenderbim/tool/cost.py b/src/blenderbim/blenderbim/tool/cost.py index 5d4698a24f..72acd26cd2 100644 --- a/src/blenderbim/blenderbim/tool/cost.py +++ b/src/blenderbim/blenderbim/tool/cost.py @@ -7,7 +7,7 @@ import ifcopenshell.util.cost import ifcopenshell.util.unit import blenderbim.bim.helper import json -from typing import Optional, Any, Generator +from typing import Optional, Any, Generator, Union class Cost(blenderbim.core.tool.Cost): @@ -149,7 +149,7 @@ class Cost(blenderbim.core.tool.Cost): return blenderbim.bim.helper.export_attributes(props.cost_item_attributes) @classmethod - def get_active_cost_item(cls): + def get_active_cost_item(cls) -> Union[ifcopenshell.entity_instance, None]: props = bpy.context.scene.BIMCostProperties if not props.active_cost_item_id: return None diff --git a/src/blenderbim/blenderbim/tool/resource.py b/src/blenderbim/blenderbim/tool/resource.py index 99293fcbc9..b73dac91c7 100644 --- a/src/blenderbim/blenderbim/tool/resource.py +++ b/src/blenderbim/blenderbim/tool/resource.py @@ -33,10 +33,12 @@ import ifcopenshell.util.cost import ifcopenshell.util.resource import blenderbim.bim.schema import ifcopenshell.util.constraint +from typing import Any, Union + class Resource(blenderbim.core.tool.Resource): @classmethod - def load_resources(cls): + def load_resources(cls) -> None: def create_new_resource_li(resource, level_index): new = bpy.context.scene.BIMResourceTreeProperties.resources.add() new.ifc_definition_id = resource.id() @@ -66,42 +68,44 @@ class Resource(blenderbim.core.tool.Resource): props.is_editing = True @classmethod - def load_resource_properties(cls): + def load_resource_properties(cls) -> None: props = bpy.context.scene.BIMResourceProperties tprops = bpy.context.scene.BIMResourceTreeProperties props.is_resource_update_enabled = False for item in tprops.resources: resource = tool.Ifc.get().by_id(item.ifc_definition_id) item.name = resource.Name if resource.Name else "Unnamed" - item.schedule_usage = resource.Usage.ScheduleUsage if (resource.Usage and resource.Usage.ScheduleUsage) else 0 + item.schedule_usage = ( + resource.Usage.ScheduleUsage if (resource.Usage and resource.Usage.ScheduleUsage) else 0 + ) props.is_resource_update_enabled = True @classmethod - def disable_editing_resource(cls): + def disable_editing_resource(cls) -> None: bpy.context.scene.BIMResourceProperties.active_resource_id = 0 bpy.context.scene.BIMResourceProperties.active_resource_time_id = 0 @classmethod - def disable_resource_editing_ui(cls): + def disable_resource_editing_ui(cls) -> None: bpy.context.scene.BIMResourceProperties.is_editing = False @classmethod - def load_resource_attributes(cls, resource): + def load_resource_attributes(cls, resource: ifcopenshell.entity_instance) -> None: blenderbim.bim.helper.import_attributes2(resource, bpy.context.scene.BIMResourceProperties.resource_attributes) @classmethod - def enable_editing_resource(cls, resource): + def enable_editing_resource(cls, resource: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMResourceProperties props.active_resource_id = resource.id() props.resource_attributes.clear() props.editing_resource_type = "ATTRIBUTES" @classmethod - def get_resource_attributes(cls): + def get_resource_attributes(cls) -> dict[str, Any]: return blenderbim.bim.helper.export_attributes(bpy.context.scene.BIMResourceProperties.resource_attributes) @classmethod - def enable_editing_resource_time(cls, resource): + def enable_editing_resource_time(cls, resource: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMResourceProperties props.resource_time_attributes.clear() props.active_resource_time_id = resource.Usage.id() @@ -109,11 +113,11 @@ class Resource(blenderbim.core.tool.Resource): props.editing_resource_type = "USAGE" @classmethod - def get_resource_time(cls, resource): - return resource.Usage if resource.Usage else None + def get_resource_time(cls, resource: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: + return resource.Usage or None @classmethod - def load_resource_time_attributes(cls, resource_time): + def load_resource_time_attributes(cls, resource_time: ifcopenshell.entity_instance) -> None: def callback(name, prop, data): if prop.data_type == "string": if isinstance(data[name], datetime): @@ -128,7 +132,7 @@ class Resource(blenderbim.core.tool.Resource): ) @classmethod - def get_resource_time_attributes(cls): + def get_resource_time_attributes(cls) -> dict[str, Any]: def callback(attributes, prop): if "Start" in prop.name or "Finish" in prop.name or prop.name == "StatusTime": if prop.is_null: @@ -147,20 +151,19 @@ class Resource(blenderbim.core.tool.Resource): return blenderbim.bim.helper.export_attributes(props.resource_time_attributes, callback) @classmethod - def enable_editing_resource_costs(cls, resource): + def enable_editing_resource_costs(cls, resource: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMResourceProperties props.active_resource_id = resource.id() props.editing_resource_type = "COSTS" - resource @classmethod - def disable_editing_resource_cost_value(cls): + def disable_editing_resource_cost_value(cls) -> None: props = bpy.context.scene.BIMResourceProperties props.active_cost_value_id = 0 props.cost_value_editing_type = "" @classmethod - def enable_editing_resource_cost_value_formula(cls, cost_value): + def enable_editing_resource_cost_value_formula(cls, cost_value: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMResourceProperties props.cost_value_attributes.clear() props.active_cost_value_id = cost_value.id() @@ -168,7 +171,7 @@ class Resource(blenderbim.core.tool.Resource): props.cost_value_formula = ifcopenshell.util.cost.serialise_cost_value(cost_value) if cost_value else "" @classmethod - def load_cost_value_attributes(cls, cost_value): + def load_cost_value_attributes(cls, cost_value: ifcopenshell.entity_instance): def callback(name, prop, data): if name == "AppliedValue": # TODO: for now, only support simple IfcValues (which are effectively IfcMonetaryMeasure) @@ -221,7 +224,7 @@ class Resource(blenderbim.core.tool.Resource): blenderbim.bim.helper.import_attributes2(cost_value, props.cost_value_attributes, callback) @classmethod - def enable_editing_cost_value_attributes(cls, cost_value): + def enable_editing_cost_value_attributes(cls, cost_value: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMResourceProperties props.cost_value_attributes.clear() props.active_cost_value_id = cost_value.id() @@ -232,7 +235,7 @@ class Resource(blenderbim.core.tool.Resource): return bpy.context.scene.BIMResourceProperties.cost_value_formula @classmethod - def get_resource_cost_value_attributes(cls): + def get_resource_cost_value_attributes(cls) -> dict[str, Any]: def callback(attributes, prop): if prop.name == "UnitBasisValue": if prop.is_null: @@ -257,28 +260,28 @@ class Resource(blenderbim.core.tool.Resource): ) @classmethod - def enable_editing_resource_base_quantity(cls, resource): + def enable_editing_resource_base_quantity(cls, resource: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMResourceProperties props.active_resource_id = resource.id() props.editing_resource_type = "QUANTITY" @classmethod - def enable_editing_resource_quantity(cls, resource_quantity): + def enable_editing_resource_quantity(cls, resource_quantity: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMResourceProperties props.quantity_attributes.clear() props.is_editing_quantity = True blenderbim.bim.helper.import_attributes2(resource_quantity, props.quantity_attributes) @classmethod - def disable_editing_resource_quantity(cls): + def disable_editing_resource_quantity(cls) -> None: bpy.context.scene.BIMResourceProperties.is_editing_quantity = False @classmethod - def get_resource_quantity_attributes(cls): + def get_resource_quantity_attributes(cls) -> dict[str, Any]: return blenderbim.bim.helper.export_attributes(bpy.context.scene.BIMResourceProperties.quantity_attributes) @classmethod - def expand_resource(cls, resource): + def expand_resource(cls, resource: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMResourceProperties contracted_resources = json.loads(props.contracted_resources) if not resource.id() in contracted_resources: @@ -287,14 +290,14 @@ class Resource(blenderbim.core.tool.Resource): props.contracted_resources = json.dumps(contracted_resources) @classmethod - def contract_resource(cls, resource): + def contract_resource(cls, resource: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMResourceProperties contracted_resources = json.loads(props.contracted_resources) contracted_resources.append(resource.id()) props.contracted_resources = json.dumps(contracted_resources) @classmethod - def import_resources(cls, file_path): + def import_resources(cls, file_path: str) -> None: from ifc4d.csv2ifc import Csv2Ifc start = time.time() @@ -305,7 +308,7 @@ class Resource(blenderbim.core.tool.Resource): print("Importing Resources CSV finished in {:.2f} seconds".format(time.time() - start)) @classmethod - def get_highlighted_resource(cls): + def get_highlighted_resource(cls) -> Union[ifcopenshell.entity_instance, None]: resources = len(bpy.context.scene.BIMResourceTreeProperties.resources) if resources and resources > bpy.context.scene.BIMResourceProperties.active_resource_index: return tool.Ifc.get().by_id( @@ -315,7 +318,7 @@ class Resource(blenderbim.core.tool.Resource): ) @classmethod - def clear_productivity_data(cls, props): + def clear_productivity_data(cls, props: bpy.types.PropertyGroup) -> None: for duration_prop in props.quantity_consumed or []: if duration_prop.name == "BaseQuantityConsumed": duration_prop.years = 0 @@ -328,7 +331,7 @@ class Resource(blenderbim.core.tool.Resource): props.quantity_produced_name = "" @classmethod - def load_productivity_data(cls): + def load_productivity_data(cls) -> None: duration_props = None for collection_prop in bpy.context.scene.BIMResourceProductivity.quantity_consumed: duration_props = collection_prop if collection_prop.name == "BaseQuantityConsumed" else None @@ -358,7 +361,7 @@ class Resource(blenderbim.core.tool.Resource): duration_props.seconds = durations_attributes["seconds"] @classmethod - def get_productivity_attributes(cls): + def get_productivity_attributes(cls) -> dict[str, Any]: props = bpy.context.scene.BIMResourceProductivity productivity = {} if props.quantity_consumed: @@ -370,7 +373,9 @@ class Resource(blenderbim.core.tool.Resource): return productivity @classmethod - def get_productivity(cls, resource, should_inherit=False): + def get_productivity( + cls, resource: ifcopenshell.entity_instance, should_inherit: bool = False + ) -> ifcopenshell.util.resource.PRODUCTIVITY_PSET_DATA: return ifcopenshell.util.resource.get_productivity(resource, should_inherit=should_inherit) @classmethod @@ -380,29 +385,29 @@ class Resource(blenderbim.core.tool.Resource): return return tool.Ifc.run( "pset.edit_pset", - pset= tool.Ifc.get().by_id(productivity["id"]), + pset=tool.Ifc.get().by_id(productivity["id"]), properties=attributes, ) @classmethod - def get_constraints(cls, resource): + def get_constraints(cls, resource: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return ifcopenshell.util.constraint.get_constraints(product=resource) @classmethod - def get_metrics(cls, constraint): + def get_metrics(cls, constraint: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return ifcopenshell.util.constraint.get_metrics(constraint) @classmethod - def get_metric_reference(cls, metric, is_deep=True): + def get_metric_reference(cls, metric: ifcopenshell.entity_instance, is_deep: bool = True): return ifcopenshell.util.constraint.get_metric_reference(metric, is_deep=is_deep) @classmethod - def has_metric_constraint(cls, resource, attribute): + def has_metric_constraint(cls, resource: ifcopenshell.entity_instance, attribute): metrics = ifcopenshell.util.constraint.get_metric_constraints(resource, attribute) return True if metrics else False @classmethod - def run_edit_resource_time(cls, resource, attributes): + def run_edit_resource_time(cls, resource: ifcopenshell.entity_instance, attributes: dict[str, Any]) -> None: if not resource.Usage: tool.Ifc.run( "resource.add_resource_time", @@ -411,7 +416,7 @@ class Resource(blenderbim.core.tool.Resource): tool.Ifc.run("resource.edit_resource_time", resource_time=resource.Usage, attributes=attributes) @classmethod - def go_to_resource(cls, resource): + def go_to_resource(cls, resource: ifcopenshell.entity_instance) -> None: def get_ancestors_ids(resource): ids = [] for rel in resource.Nests or []: @@ -427,24 +432,22 @@ class Resource(blenderbim.core.tool.Resource): bpy.context.scene.BIMResourceProperties.contracted_resources = json.dumps(contracted_resources) cls.load_resources() - resource_props = bpy.context.scene.BIMResourceTreeProperties expanded_resources = [item.ifc_definition_id for item in resource_props.resources] bpy.context.scene.BIMResourceProperties.active_resource_index = expanded_resources.index(resource.id()) - @classmethod - def run_calculate_resource_usage(cls, resource): + def run_calculate_resource_usage(cls, resource: ifcopenshell.entity_instance) -> None: tool.Ifc.run("resource.calculate_resource_usage", resource=resource) @classmethod - def get_task_assignments(cls, resource): + def get_task_assignments(cls, resource: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: return ifcopenshell.util.resource.get_task_assignments(resource) @classmethod - def get_nested_resources(cls, resource): + def get_nested_resources(cls, resource: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return ifcopenshell.util.resource.get_nested_resources(resource) @classmethod - def is_attribute_locked(cls, resource, attribute): - return ifcopenshell.util.constraint.is_attribute_locked(resource, attribute) \ No newline at end of file + def is_attribute_locked(cls, resource: ifcopenshell.entity_instance, attribute) -> bool: + return ifcopenshell.util.constraint.is_attribute_locked(resource, attribute) diff --git a/src/ifccsv/ifccsv.py b/src/ifccsv/ifccsv.py index f89f152a1e..aabeb51c80 100755 --- a/src/ifccsv/ifccsv.py +++ b/src/ifccsv/ifccsv.py @@ -29,7 +29,7 @@ import ifcopenshell.util.selector import ifcopenshell.util.element import ifcopenshell.util.schema from statistics import mean -from typing import Optional, Union +from typing import Optional, Union, Literal try: from odf.namespaces import OFFICENS @@ -53,6 +53,14 @@ except: pass # No Pandas support +FILE_FORMAT = Literal[ + "csv", + "ods", + "xlsx", + "pd", +] + + class IfcCsv: def __init__(self): self.headers = [] @@ -66,7 +74,7 @@ class IfcCsv: attributes, headers=None, output=None, - format=None, + format: FILE_FORMAT = None, should_preserve_existing: bool = False, include_global_id: bool = True, delimiter: str = ",", @@ -392,7 +400,11 @@ class IfcCsv: bool_true: str = "YES", bool_false: str = "NO", ) -> None: - ext = table.split(".")[-1].lower() + """ + Args: + table: filepath to the table. + """ + ext: FILE_FORMAT = table.split(".")[-1].lower() if ext == "csv": self.import_csv(ifc_file, table, attributes, delimiter, null, empty, bool_true, bool_false) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py index a9af7572b6..1c0b59a79c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/edit_cost_value_formula.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.api import ifcopenshell.util.cost import ifcopenshell.util.unit import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/util/resource.py b/src/ifcopenshell-python/ifcopenshell/util/resource.py index 59473bb2ca..bfc1aabed6 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/resource.py +++ b/src/ifcopenshell-python/ifcopenshell/util/resource.py @@ -16,18 +16,24 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import ifcopenshell.util.cost import ifcopenshell.util.element import ifcopenshell.util.date +from typing import Union, Any -def get_productivity(resource, should_inherit=True): +PRODUCTIVITY_PSET_DATA = Union[dict[str, Any], None] + + +def get_productivity(resource: ifcopenshell.entity_instance, should_inherit: bool = True) -> PRODUCTIVITY_PSET_DATA: productivity = ifcopenshell.util.element.get_psets(resource).get("EPset_Productivity", None) if should_inherit and not productivity: - #Note: This is not part of the Schema - but it makes sense to inherit from parent + # Note: This is not part of the Schema - but it makes sense to inherit from parent productivity = get_parent_productivity(resource) return productivity -def get_parent_productivity(resource): + +def get_parent_productivity(resource: ifcopenshell.entity_instance) -> PRODUCTIVITY_PSET_DATA: if not resource.Nests: return else: @@ -36,34 +42,34 @@ def get_parent_productivity(resource): return productivity -def get_unit_consumed(productivity): +def get_unit_consumed(productivity: PRODUCTIVITY_PSET_DATA) -> Union[Any, None]: duration = productivity.get("BaseQuantityConsumed", None) if not duration: return return ifcopenshell.util.date.ifc2datetime(duration) -def get_quantity_produced(productivity): +def get_quantity_produced(productivity: PRODUCTIVITY_PSET_DATA) -> float: if not productivity: - return 0 - return productivity.get("BaseQuantityProducedValue", 0) + return 0.0 + return productivity.get("BaseQuantityProducedValue", 0.0) -def get_quantity_produced_name(productivity): +def get_quantity_produced_name(productivity: PRODUCTIVITY_PSET_DATA): if not productivity: return "" return productivity.get("BaseQuantityProducedName", "") -def get_total_quantity_produced(resource, quantity_name_in_process): - def get_product_quantity(product, quantity_name): +def get_total_quantity_produced(resource: ifcopenshell.entity_instance, quantity_name_in_process: str) -> float: + def get_product_quantity(product: ifcopenshell.entity_instance, quantity_name: str): psets = ifcopenshell.util.element.get_psets(product) for pset in psets.values(): for name, value in pset.items(): if name == quantity_name: return float(value) - total = 0 + total = 0.0 products = get_parametric_resource_products(resource) if quantity_name_in_process == "Count": total = len(products) @@ -73,7 +79,7 @@ def get_total_quantity_produced(resource, quantity_name_in_process): return total -def get_parametric_resource_products(resource): +def get_parametric_resource_products(resource: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: products = [] for rel in resource.HasAssignments or []: if not rel.is_a("IfcRelAssignsToProcess"): @@ -84,14 +90,15 @@ def get_parametric_resource_products(resource): products.append(rel2.RelatingProduct) return products -def get_task_assignments(resource): + +def get_task_assignments(resource: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: for rel in resource.HasAssignments or []: if not rel.is_a("IfcRelAssignsToProcess"): continue return rel.RelatingProcess -def get_resource_required_work(resource): +def get_resource_required_work(resource: ifcopenshell.entity_instance) -> Union[str, None]: productivity = get_productivity(resource) if productivity: quantity_produced = get_quantity_produced(productivity) @@ -114,33 +121,38 @@ def get_resource_required_work(resource): return iso_string -def get_nested_resources(resource): +def get_nested_resources(resource: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return [object for rel in resource.IsNestedBy or [] for object in rel.RelatedObjects] -def get_cost(resource): +def get_cost(resource: ifcopenshell.entity_instance) -> tuple[float, Union[str, None]]: base_costs = getattr(resource, "BaseCosts", []) - costs = [ - ifcopenshell.util.cost.calculate_applied_value(resource, cost_value) - for cost_value in base_costs - ] if base_costs else [] + costs = ( + [ifcopenshell.util.cost.calculate_applied_value(resource, cost_value) for cost_value in base_costs] + if base_costs + else [] + ) cost = sum(costs) - unit_basis = next( - (cost_value.UnitBasis for cost_value in base_costs if cost_value.UnitBasis), - None - ) if base_costs else None - unit = unit_basis.UnitComponent.Name if unit_basis and unit_basis.UnitComponent.is_a("IfcConversionBasedUnit") else None + unit_basis = ( + next((cost_value.UnitBasis for cost_value in base_costs if cost_value.UnitBasis), None) if base_costs else None + ) + unit = ( + unit_basis.UnitComponent.Name + if unit_basis and unit_basis.UnitComponent.is_a("IfcConversionBasedUnit") + else None + ) return cost, unit -def get_quantity(resource): - total = 0 + +def get_quantity(resource: ifcopenshell.entity_instance) -> float: if resource.BaseQuantity: return resource.BaseQuantity[3] if resource.Usage and resource.Usage.ScheduleWork: duration = ifcopenshell.util.date.ifc2datetime(resource.Usage.ScheduleWork) return duration.total_seconds() / 3600 -def get_parent_cost(resource): + +def get_parent_cost(resource: ifcopenshell.entity_instance) -> Union[None, tuple[float, Union[str, None]]]: if not resource.Nests: return else: From b4f0a346c10dc1b9922fe93669d0a9ba9850daf6 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 15:13:04 +0500 Subject: [PATCH 256/429] fix couple broken properties definitions There was no errors but Blender seems to ignore the provided name if it was provided as a positional argument instead of a keyword argument. --- src/blenderbim/blenderbim/bim/module/cost/operator.py | 2 +- src/blenderbim/blenderbim/bim/module/pset_template/prop.py | 2 +- src/blenderbim/blenderbim/bim/module/style/prop.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/operator.py b/src/blenderbim/blenderbim/bim/module/cost/operator.py index a5e9b88e2f..ad9b756d29 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cost/operator.py @@ -662,7 +662,7 @@ class ExportCostSchedules(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} bl_description = "Export a cost schedule to a CSV, XSLX OR ODS file" cost_schedule: bpy.props.IntProperty() - format: bpy.props.EnumProperty("Format", items=(("CSV", "CSV", ""), ("XLSX", "XLSX", ""), ("ODS", "ODS", ""))) + format: bpy.props.EnumProperty(name="Format", items=(("CSV", "CSV", ""), ("XLSX", "XLSX", ""), ("ODS", "ODS", ""))) directory: bpy.props.StringProperty(subtype="FILE_PATH") filter_folder: bpy.props.BoolProperty( name="Filter Folders", diff --git a/src/blenderbim/blenderbim/bim/module/pset_template/prop.py b/src/blenderbim/blenderbim/bim/module/pset_template/prop.py index 9d94b28c8e..165144efd8 100644 --- a/src/blenderbim/blenderbim/bim/module/pset_template/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset_template/prop.py @@ -190,4 +190,4 @@ class BIMPsetTemplateProperties(PropertyGroup): active_prop_template_id: IntProperty(name="Active Prop Template Id") active_pset_template: PointerProperty(type=PsetTemplate) active_prop_template: PointerProperty(type=PropTemplate) - new_template_filename: StringProperty("New TemplateFileName") + new_template_filename: StringProperty(name="New TemplateFileName") diff --git a/src/blenderbim/blenderbim/bim/module/style/prop.py b/src/blenderbim/blenderbim/bim/module/style/prop.py index af06b57615..fb1bac5c40 100644 --- a/src/blenderbim/blenderbim/bim/module/style/prop.py +++ b/src/blenderbim/blenderbim/bim/module/style/prop.py @@ -122,7 +122,7 @@ class ColourRgb(PropertyGroup): name: StringProperty() color_value: FloatVectorProperty(size=3, subtype="COLOR", default=(1, 1, 1)) # not exposed in the UI, here just to preserve the data - color_name: StringProperty("Color Name") + color_name: StringProperty(name="Color Name") # to fit blender.bim.helper.export_attributes def get_value(self): From e4aa97091e0a6ddb531b88f6dc88629e50d87e19 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 15:33:49 +0500 Subject: [PATCH 257/429] fix bug removing cost schedule columns it was using _execute though it's not an ifc operator --- src/blenderbim/blenderbim/bim/module/cost/operator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/operator.py b/src/blenderbim/blenderbim/bim/module/cost/operator.py index ad9b756d29..70ee62f399 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cost/operator.py @@ -544,7 +544,7 @@ class RemoveCostColumn(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} name: bpy.props.StringProperty() - def _execute(self, context): + def execute(self, context): core.remove_cost_column(tool.Cost, self.name) return {"FINISHED"} From e5a316e509821e2a1fb554288094890149972552 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 15:51:34 +0500 Subject: [PATCH 258/429] fix api calls error handling by accident replaced in f2696d5 TypeError with NotImplementedError --- src/ifcopenshell-python/ifcopenshell/api/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py index d3d0b2f475..4849d8eeff 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py @@ -342,7 +342,7 @@ def wrap_usecase(usecase_path, usecase): try: result = usecase(*args, **settings) - except NotImplementedError as e: + except TypeError as e: if not e.args[0].startswith(f"{usecase.__name__}()"): # signature errors typically start with function name # e.g. "TypeError: edit_library() got an unexpected keyword argument 'test'" From 291bffca9563c2355988db194855896d7212ea63 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 16:01:47 +0500 Subject: [PATCH 259/429] add tooltip for cost schedule columns example - https://i.imgur.com/Uh8D7Vg.png --- src/blenderbim/blenderbim/bim/module/cost/prop.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/prop.py b/src/blenderbim/blenderbim/bim/module/cost/prop.py index f0ea31fd8c..370b58d9b7 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/prop.py +++ b/src/blenderbim/blenderbim/bim/module/cost/prop.py @@ -210,7 +210,11 @@ class BIMCostProperties(PropertyGroup): cost_value_attributes: CollectionProperty(name="Cost Value Attributes", type=Attribute) cost_value_formula: StringProperty(name="Cost Value Formula") cost_column: StringProperty(name="Cost Column") - should_show_column_ui: BoolProperty(name="Should Show Column UI", default=False) + should_show_column_ui: BoolProperty( + name="Should Show Column UI", + description="Display UI for adding cost schedule columns, column names represent a category for cost item values", + default=False, + ) should_show_currency_ui: BoolProperty(name="Should Show Currency UI", default=False) columns: CollectionProperty(name="Columns", type=StrProperty) active_column_index: IntProperty(name="Active Column Index") From c70745826a440ada242f39b01ea2c18387dfd737 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 16:25:38 +0500 Subject: [PATCH 260/429] rename bim.export_ifc to bim.save_project (similar to bim.load_project) note that old name "export_ifc.bim" is still available (cacb38a25) though deprecated --- src/blenderbim/blenderbim/bim/module/project/__init__.py | 2 +- src/blenderbim/blenderbim/bim/module/project/operator.py | 4 ++-- src/blenderbim/blenderbim/bim/module/project/ui.py | 4 ++-- src/blenderbim/test/bim/test_feature.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/project/__init__.py b/src/blenderbim/blenderbim/bim/module/project/__init__.py index 439ba4d2dc..e0e8b02d0e 100644 --- a/src/blenderbim/blenderbim/bim/module/project/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/project/__init__.py @@ -97,7 +97,7 @@ def register(): addon_keymaps.append((km, kmi)) km = wm.keyconfigs.addon.keymaps.new(name="Window", space_type="EMPTY") - kmi = km.keymap_items.new("bim.export_ifc", "S", "PRESS", ctrl=True) + kmi = km.keymap_items.new("bim.save_project", "S", "PRESS", ctrl=True) kmi.properties.should_save_as = False addon_keymaps.append((km, kmi)) diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 7dbbce8cfa..94bec7dabf 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -1107,7 +1107,7 @@ class ToggleLinkVisibility(bpy.types.Operator): class ExportIFCBase: - bl_idname = "bim.export_ifc" + bl_idname = "bim.save_project" bl_label = "Save IFC" bl_options = {"REGISTER", "UNDO"} filename_ext = ".ifc" @@ -1225,7 +1225,7 @@ class ExportIFCBase: class ExportIFC(ExportIFCBase, bpy.types.Operator): - bl_idname = "bim.export_ifc" + pass # TODO: remove as deprecated, better wait couple releases since diff --git a/src/blenderbim/blenderbim/bim/module/project/ui.py b/src/blenderbim/blenderbim/bim/module/project/ui.py index 6e8468fe1f..752f2d6eab 100644 --- a/src/blenderbim/blenderbim/bim/module/project/ui.py +++ b/src/blenderbim/blenderbim/bim/module/project/ui.py @@ -68,9 +68,9 @@ def file_menu(self, context): op = self.layout.operator("bim.load_project", text="Open IFC Project", icon="FILEBROWSER") op.should_start_fresh_session = True self.layout.separator() - op = self.layout.operator("bim.export_ifc", icon="FILE_TICK", text="Save IFC Project") + op = self.layout.operator("bim.save_project", icon="FILE_TICK", text="Save IFC Project") op.should_save_as = False - op = self.layout.operator("bim.export_ifc", text="Save IFC Project As...") + op = self.layout.operator("bim.save_project", text="Save IFC Project As...") op.should_save_as = True self.layout.separator() self.layout.operator("bim.revert_project") diff --git a/src/blenderbim/test/bim/test_feature.py b/src/blenderbim/test/bim/test_feature.py index 037c831200..129a4c599b 100644 --- a/src/blenderbim/test/bim/test_feature.py +++ b/src/blenderbim/test/bim/test_feature.py @@ -960,7 +960,7 @@ def run_test_code(): def saving_sample_test_files(and_open_in_blender=None): filepath = f"{variables['cwd']}/test/files/temp/sample_test_file" blend_filepath = f"{filepath}.blend" - bpy.ops.bim.export_ifc(filepath=f"{filepath}.ifc", should_save_as=True) + bpy.ops.bim.save_project(filepath=f"{filepath}.ifc", should_save_as=True) bpy.ops.wm.save_as_mainfile(filepath=f"{filepath}.blend") From 7f2c7eb467350f22907d1d7155a87a606a12071e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 16:42:19 +0500 Subject: [PATCH 261/429] python 3.9 compatibility --- src/ifcopenshell-python/ifcopenshell/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py index ea695fed78..310eb4bb37 100644 --- a/src/ifcopenshell-python/ifcopenshell/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/__init__.py @@ -254,7 +254,7 @@ def schema_by_name( return ifcopenshell_wrapper.schema_by_name(schema) -def guess_format(path: Path) -> Union[str | None]: +def guess_format(path: Path) -> Union[str, None]: """Guesses the IFC format using file extension IFCs may be serialised as different formats. The most common is a ``.ifc`` From 1a4e4678d092519e53a9227e5833140af3a3df2b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 18:31:51 +0500 Subject: [PATCH 262/429] assign/unassign resource operators tooltips also removed couple unused properties --- src/blenderbim/blenderbim/bim/module/resource/data.py | 1 - src/blenderbim/blenderbim/bim/module/resource/operator.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/resource/data.py b/src/blenderbim/blenderbim/bim/module/resource/data.py index 47292fa3ab..d21154c33f 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/data.py +++ b/src/blenderbim/blenderbim/bim/module/resource/data.py @@ -29,7 +29,6 @@ def refresh(): class ResourceData: data = {} is_loaded = False - cost_values = {} @classmethod def load(cls): diff --git a/src/blenderbim/blenderbim/bim/module/resource/operator.py b/src/blenderbim/blenderbim/bim/module/resource/operator.py index 08f65c2e2e..9024d82077 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/operator.py +++ b/src/blenderbim/blenderbim/bim/module/resource/operator.py @@ -128,9 +128,9 @@ class ContractResource(bpy.types.Operator): class AssignResource(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.assign_resource" bl_label = "Assign Resource" + bl_description = "Assign resource to the selected objects" bl_options = {"REGISTER", "UNDO"} resource: bpy.props.IntProperty() - related_object: bpy.props.StringProperty() def _execute(self, context): core.assign_resource(tool.Ifc, tool.Spatial, resource=tool.Ifc.get().by_id(self.resource)) @@ -139,9 +139,9 @@ class AssignResource(bpy.types.Operator, tool.Ifc.Operator): class UnassignResource(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.unassign_resource" bl_label = "Unassign Resource" + bl_description = "Unassign resource from the selected objects" bl_options = {"REGISTER", "UNDO"} resource: bpy.props.IntProperty() - related_object: bpy.props.StringProperty() def _execute(self, context): core.unassign_resource(tool.Ifc, tool.Spatial, resource=tool.Ifc.get().by_id(self.resource)) From fa87092fe0878fd69cb78891820aea2ab4ea9935 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 12:04:53 +0500 Subject: [PATCH 263/429] Keep 1.2m minimum opening thickness instead of using wall thickness That way there will be a workaround if the wall is 0.6m+ meters thick but won't have an issue when you first added a window to a thin wall and it's opening later won't work for the thicker walls. Mentioned in #4710 --- src/blenderbim/blenderbim/bim/module/model/opening.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/opening.py b/src/blenderbim/blenderbim/bim/module/model/opening.py index 666c3262a2..ff797a261e 100644 --- a/src/blenderbim/blenderbim/bim/module/model/opening.py +++ b/src/blenderbim/blenderbim/bim/module/model/opening.py @@ -68,7 +68,7 @@ class FilledOpeningGenerator: ) -> None: props = bpy.context.scene.BIMModelProperties unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) - opening_thickness_si = None + opening_thickness_si = 0.0 filling = tool.Ifc.get_entity(filling_obj) element = tool.Ifc.get_entity(voided_obj) @@ -266,11 +266,11 @@ class FilledOpeningGenerator: self, filling: ifcopenshell.entity_instance, filling_obj: bpy.types.Object, - opening_thickness_si: Optional[float] = None, + opening_thickness_si: float = 0.0, ) -> ifcopenshell.entity_instance: # Since openings are reused later, we give a default thickness of 1.2m # which should cover the majority of curved, or super thick walls. - thickness = 1.2 if opening_thickness_si is None else opening_thickness_si + thickness = max(1.2, opening_thickness_si) unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) shape_builder = ifcopenshell.util.shape_builder.ShapeBuilder(tool.Ifc.get()) From 6d887d593e2bf7fc48e5f3de2c7274b509eab144 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 15:18:57 +0500 Subject: [PATCH 264/429] fix issues running core tests after 37c008487 --- src/blenderbim/blenderbim/__init__.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/__init__.py b/src/blenderbim/blenderbim/__init__.py index cd4381b948..ae13046dd7 100644 --- a/src/blenderbim/blenderbim/__init__.py +++ b/src/blenderbim/blenderbim/__init__.py @@ -18,7 +18,15 @@ import os import sys -import bpy + +# Ensure we don't try to import bpy or blenderbim.bim +# to support running core tests. +# We assume if bpy was never loaded in current python session +# then we're not in Blender. It's still possible to use +# bpy in core and core tests for annotations using TYPE_CHECKING. +IN_BLENDER = sys.modules.get("bpy", None) +if IN_BLENDER: + import bpy import platform import traceback import subprocess @@ -78,7 +86,7 @@ def format_debug_info(info: dict): return text.strip() -if sys.modules.get("bpy", None): +if IN_BLENDER: # Process *.pth in /libs/site/packages to setup globally importable modules # This is 3 levels deep as required by the static RPATH of ../../ from dependencies taken from Anaconda # site.addsitedir(os.path.join(os.path.dirname(os.path.realpath(__file__)), "libs", "site", "packages")) From df15a3712707a30f5639a4973f5b06f5103822db Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 14:23:10 +0500 Subject: [PATCH 265/429] fix core.root.assign_class error after 3884403 #4719 --- src/blenderbim/blenderbim/core/project.py | 2 +- src/blenderbim/blenderbim/core/root.py | 7 ++++++- src/blenderbim/blenderbim/core/system.py | 2 +- src/blenderbim/test/core/test_project.py | 12 +++++++++--- src/blenderbim/test/core/test_system.py | 4 +++- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/blenderbim/blenderbim/core/project.py b/src/blenderbim/blenderbim/core/project.py index ee021cd4a6..ff7aaf6208 100644 --- a/src/blenderbim/blenderbim/core/project.py +++ b/src/blenderbim/blenderbim/core/project.py @@ -34,7 +34,7 @@ def create_project(ifc, project, schema=None, template=None): building = project.create_empty("My Building") storey = project.create_empty("My Storey") - project.run_root_assign_class(obj=project_obj, ifc_class="IfcProject") + project.run_root_assign_class(obj=project_obj, ifc_class="IfcProject", should_add_representation=False) project.run_unit_assign_scene_units() model = project.run_context_add_context(context_type="Model", context_identifier="", target_view="", parent=0) diff --git a/src/blenderbim/blenderbim/core/root.py b/src/blenderbim/blenderbim/core/root.py index e7f6bbb96c..8941ea4b0e 100644 --- a/src/blenderbim/blenderbim/core/root.py +++ b/src/blenderbim/blenderbim/core/root.py @@ -63,11 +63,15 @@ def assign_class( root: tool.Root, obj: bpy.types.Object, ifc_class: str, - context: ifcopenshell.entity_instance, + context: Optional[ifcopenshell.entity_instance] = None, predefined_type: Optional[str] = None, should_add_representation: bool = True, ifc_representation_class: Optional[str] = None, ) -> ifcopenshell.entity_instance: + """ + Args: + context: is not optional if `should_add_representation` is True + """ if ifc.get_entity(obj): return @@ -77,6 +81,7 @@ def assign_class( ifc.link(element, obj) if should_add_representation: + assert context, "Context is required for adding a representation" root.run_geometry_add_representation( obj=obj, context=context, ifc_representation_class=ifc_representation_class, profile_set_usage=None ) diff --git a/src/blenderbim/blenderbim/core/system.py b/src/blenderbim/blenderbim/core/system.py index 8015825f1b..074e64b861 100644 --- a/src/blenderbim/blenderbim/core/system.py +++ b/src/blenderbim/blenderbim/core/system.py @@ -94,7 +94,7 @@ def hide_ports(ifc, system, element=None): def add_port(ifc, system, element=None): system.load_ports(element, system.get_ports(element)) obj = system.create_empty_at_cursor_with_element_orientation(element) - port = system.run_root_assign_class(obj=obj, ifc_class="IfcDistributionPort") + port = system.run_root_assign_class(obj=obj, ifc_class="IfcDistributionPort", should_add_representation=False) ifc.run("system.assign_port", element=element, port=port) diff --git a/src/blenderbim/test/core/test_project.py b/src/blenderbim/test/core/test_project.py index 29ff452424..dd94569d00 100644 --- a/src/blenderbim/test/core/test_project.py +++ b/src/blenderbim/test/core/test_project.py @@ -76,7 +76,9 @@ class TestCreateProject: project.create_empty("My Site").should_be_called().will_return("site") project.create_empty("My Building").should_be_called().will_return("building") project.create_empty("My Storey").should_be_called().will_return("storey") - project.run_root_assign_class(obj="project", ifc_class="IfcProject").should_be_called() + project.run_root_assign_class( + obj="project", ifc_class="IfcProject", should_add_representation=False + ).should_be_called() project.run_unit_assign_scene_units().should_be_called() self.check_contexts(project) @@ -108,7 +110,9 @@ class TestCreateProject: project.create_empty("My Site").should_be_called().will_return("site") project.create_empty("My Building").should_be_called().will_return("building") project.create_empty("My Storey").should_be_called().will_return("storey") - project.run_root_assign_class(obj="project", ifc_class="IfcProject").should_be_called() + project.run_root_assign_class( + obj="project", ifc_class="IfcProject", should_add_representation=False + ).should_be_called() project.run_unit_assign_scene_units().should_be_called() self.check_contexts(project) @@ -149,7 +153,9 @@ class TestCreateProject: project.create_empty("My Site").should_be_called().will_return("site") project.create_empty("My Building").should_be_called().will_return("building") project.create_empty("My Storey").should_be_called().will_return("storey") - project.run_root_assign_class(obj="project", ifc_class="IfcProject").should_be_called() + project.run_root_assign_class( + obj="project", ifc_class="IfcProject", should_add_representation=False + ).should_be_called() project.run_unit_assign_scene_units().should_be_called() self.check_contexts(project) diff --git a/src/blenderbim/test/core/test_system.py b/src/blenderbim/test/core/test_system.py index 51c4dc9bae..2d44796538 100644 --- a/src/blenderbim/test/core/test_system.py +++ b/src/blenderbim/test/core/test_system.py @@ -146,7 +146,9 @@ class TestAddPort: system.get_ports("element").should_be_called().will_return(["port"]) system.load_ports("element", ["port"]).should_be_called() system.create_empty_at_cursor_with_element_orientation("element").should_be_called().will_return("obj") - system.run_root_assign_class(obj="obj", ifc_class="IfcDistributionPort").should_be_called().will_return("port") + system.run_root_assign_class( + obj="obj", ifc_class="IfcDistributionPort", should_add_representation=False + ).should_be_called().will_return("port") ifc.run("system.assign_port", element="element", port="port").should_be_called() subject.add_port(ifc, system, element="element") From ac8040008a27a11698702ab2b79c9b9ed2897f2f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 16:11:27 +0500 Subject: [PATCH 266/429] small refactor --- .../blenderbim/bim/module/model/opening.py | 51 ++++++++----------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/opening.py b/src/blenderbim/blenderbim/bim/module/model/opening.py index ff797a261e..e1bd9cf1b7 100644 --- a/src/blenderbim/blenderbim/bim/module/model/opening.py +++ b/src/blenderbim/blenderbim/bim/module/model/opening.py @@ -130,46 +130,37 @@ class FilledOpeningGenerator: existing_opening_occurrence = self.get_existing_opening_occurrence_if_any(filling) - if existing_opening_occurrence: - opening = ifcopenshell.api.run( - "root.create_entity", - tool.Ifc.get(), - ifc_class="IfcOpeningElement", - predefined_type="OPENING", - name="Opening", - ) - ifcopenshell.api.run( - "geometry.edit_object_placement", tool.Ifc.get(), product=opening, matrix=filling_obj.matrix_world - ) + opening = ifcopenshell.api.run( + "root.create_entity", + tool.Ifc.get(), + ifc_class="IfcOpeningElement", + predefined_type="OPENING", + name="Opening", + ) + ifcopenshell.api.run( + "geometry.edit_object_placement", + tool.Ifc.get(), + product=opening, + matrix=np.array(filling_obj.matrix_world), + is_si=True, + ) + if existing_opening_occurrence: representation = ifcopenshell.util.representation.get_representation( existing_opening_occurrence, "Model", "Body", "MODEL_VIEW" ) representation = ifcopenshell.util.representation.resolve_representation(representation) - mapped_representation = ifcopenshell.api.run( - "geometry.map_representation", tool.Ifc.get(), representation=representation - ) - ifcopenshell.api.run( - "geometry.assign_representation", tool.Ifc.get(), product=opening, representation=mapped_representation - ) else: representation = self.generate_opening_from_filling( filling, filling_obj, opening_thickness_si=opening_thickness_si ) - opening = ifcopenshell.api.run( - "root.create_entity", tool.Ifc.get(), ifc_class="IfcOpeningElement", predefined_type="OPENING" - ) - matrix = np.array(filling_obj.matrix_world) - ifcopenshell.api.run( - "geometry.edit_object_placement", tool.Ifc.get(), product=opening, matrix=matrix, is_si=True - ) - mapped_representation = ifcopenshell.api.run( - "geometry.map_representation", tool.Ifc.get(), representation=representation - ) - ifcopenshell.api.run( - "geometry.assign_representation", tool.Ifc.get(), product=opening, representation=mapped_representation - ) + mapped_representation = ifcopenshell.api.run( + "geometry.map_representation", tool.Ifc.get(), representation=representation + ) + ifcopenshell.api.run( + "geometry.assign_representation", tool.Ifc.get(), product=opening, representation=mapped_representation + ) ifcopenshell.api.run("void.add_opening", tool.Ifc.get(), opening=opening, element=element) ifcopenshell.api.run("void.add_filling", tool.Ifc.get(), opening=opening, element=filling) From cf635986a681a3ea8993e3120d3e59cb9200cea0 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 16:40:44 +0500 Subject: [PATCH 267/429] same openings generator for non-/parametric doors/windows #4710 --- .../blenderbim/bim/module/model/door.py | 2 +- .../blenderbim/bim/module/model/window.py | 31 +++++++------------ 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/door.py b/src/blenderbim/blenderbim/bim/module/model/door.py index 1bda53682b..11e3e2d38b 100644 --- a/src/blenderbim/blenderbim/bim/module/model/door.py +++ b/src/blenderbim/blenderbim/bim/module/model/door.py @@ -159,7 +159,7 @@ def update_door_modifier_representation(context, obj): 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) + update_simple_openings(element) # TODO: move it out to tools diff --git a/src/blenderbim/blenderbim/bim/module/model/window.py b/src/blenderbim/blenderbim/bim/module/model/window.py index f2d7a17c4d..4af6ff2c85 100644 --- a/src/blenderbim/blenderbim/bim/module/model/window.py +++ b/src/blenderbim/blenderbim/bim/module/model/window.py @@ -29,12 +29,13 @@ from ifcopenshell.api.geometry.add_window_representation import DEFAULT_PANEL_SC from ifcopenshell.util.shape_builder import V from bmesh.types import BMVert from mathutils import Vector +from blenderbim.bim.module.model.opening import FilledOpeningGenerator # TODO: move to some utils helpers/tool module -def update_simple_openings(element, opening_width, opening_height): +def update_simple_openings(element: ifcopenshell.entity_instance) -> None: ifc_file = tool.Ifc.get() - fillings = tool.Ifc.get_all_element_occurrences(element) + fillings = {e: tool.Ifc.get_object(e) for e in tool.Ifc.get_all_element_occurrences(element)} voided_objs = set() has_replaced_opening_representation = False @@ -46,10 +47,10 @@ def update_simple_openings(element, opening_width, opening_height): voided_obj = tool.Ifc.get_object(opening.VoidsElements[0].RelatingBuildingElement) voided_objs.add(voided_obj) - # we assume that the same element type (e.g. window) - # will be used only for voiding objects of the same thickness (by y-dimension) - # (e.g. all walls window's attached to will share the same thickness) - # If that's not the case it will some linings will be too thick or too thin + # We assume all occurrences of the same element type (e.g. a window) + # will use openings of the same thickness. + # Generator we use by default will create a really thick opening representation + # to make sure it will fit for walls with different thickness. if has_replaced_opening_representation: continue @@ -59,20 +60,10 @@ def update_simple_openings(element, opening_width, opening_height): "geometry.unassign_representation", ifc_file, product=opening, representation=old_representation ) - thickness = voided_obj.dimensions[1] + 0.1 + 0.1 - unit_scale = ifcopenshell.util.unit.calculate_unit_scale(ifc_file) - shape_builder = ifcopenshell.util.shape_builder.ShapeBuilder(ifc_file) - context = ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW") - - extrusion = shape_builder.extrude( - shape_builder.rectangle(size=Vector([opening_width, 0.0, opening_height]).xz), - magnitude=thickness / unit_scale, - position=Vector([0.0, -0.1 / unit_scale, 0.0]), - **shape_builder.extrude_kwargs("Y") + new_representation = FilledOpeningGenerator().generate_opening_from_filling( + filling, fillings[filling], voided_obj.dimensions[1] ) - new_representation = shape_builder.get_representation(context, extrusion) - for inverse in ifc_file.get_inverse(old_representation): ifcopenshell.util.element.replace_attribute(inverse, old_representation, new_representation) @@ -82,7 +73,7 @@ def update_simple_openings(element, opening_width, opening_height): tool.Model.reload_body_representation(voided_objs) if fillings: - with bpy.context.temp_override(selected_objects=[tool.Ifc.get_object(f) for f in fillings]): + with bpy.context.temp_override(selected_objects=list(fillings.values())): bpy.ops.bim.recalculate_fill() @@ -175,7 +166,7 @@ def update_window_modifier_representation(context, obj): 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) + update_simple_openings(element) def create_bm_window_frame(bm, size: Vector, thickness: list, position: Vector = V(0, 0, 0).freeze()): From 64ea455c0154c5d36017c20f1819186e30745329 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 16:45:00 +0500 Subject: [PATCH 268/429] move update_simple_openings to tool.Model --- .../blenderbim/bim/module/model/door.py | 5 +- .../blenderbim/bim/module/model/window.py | 48 +------------------ src/blenderbim/blenderbim/tool/model.py | 47 ++++++++++++++++++ 3 files changed, 51 insertions(+), 49 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/door.py b/src/blenderbim/blenderbim/bim/module/model/door.py index 11e3e2d38b..13cf277a11 100644 --- a/src/blenderbim/blenderbim/bim/module/model/door.py +++ b/src/blenderbim/blenderbim/bim/module/model/door.py @@ -26,7 +26,8 @@ from ifcopenshell.util.shape_builder import V import blenderbim import blenderbim.tool as tool import blenderbim.core.geometry as core -from blenderbim.bim.module.model.window import create_bm_window, create_bm_box, update_simple_openings +import blenderbim.core.root +from blenderbim.bim.module.model.window import create_bm_window, create_bm_box from mathutils import Vector, Matrix from pprint import pprint @@ -159,7 +160,7 @@ def update_door_modifier_representation(context, obj): occurrence.OverallWidth = props.overall_width / si_conversion occurrence.OverallHeight = props.overall_height / si_conversion - update_simple_openings(element) + tool.Model.update_simple_openings(element) # TODO: move it out to tools diff --git a/src/blenderbim/blenderbim/bim/module/model/window.py b/src/blenderbim/blenderbim/bim/module/model/window.py index 4af6ff2c85..1c6c7d973c 100644 --- a/src/blenderbim/blenderbim/bim/module/model/window.py +++ b/src/blenderbim/blenderbim/bim/module/model/window.py @@ -29,52 +29,6 @@ from ifcopenshell.api.geometry.add_window_representation import DEFAULT_PANEL_SC from ifcopenshell.util.shape_builder import V from bmesh.types import BMVert from mathutils import Vector -from blenderbim.bim.module.model.opening import FilledOpeningGenerator - - -# TODO: move to some utils helpers/tool module -def update_simple_openings(element: ifcopenshell.entity_instance) -> None: - ifc_file = tool.Ifc.get() - fillings = {e: tool.Ifc.get_object(e) for e in tool.Ifc.get_all_element_occurrences(element)} - - voided_objs = set() - has_replaced_opening_representation = False - for filling in fillings: - if not filling.FillsVoids: - continue - - opening = filling.FillsVoids[0].RelatingOpeningElement - voided_obj = tool.Ifc.get_object(opening.VoidsElements[0].RelatingBuildingElement) - voided_objs.add(voided_obj) - - # We assume all occurrences of the same element type (e.g. a window) - # will use openings of the same thickness. - # Generator we use by default will create a really thick opening representation - # to make sure it will fit for walls with different thickness. - if has_replaced_opening_representation: - continue - - old_representation = ifcopenshell.util.representation.get_representation(opening, "Model", "Body", "MODEL_VIEW") - old_representation = tool.Geometry.resolve_mapped_representation(old_representation) - ifcopenshell.api.run( - "geometry.unassign_representation", ifc_file, product=opening, representation=old_representation - ) - - new_representation = FilledOpeningGenerator().generate_opening_from_filling( - filling, fillings[filling], voided_obj.dimensions[1] - ) - - for inverse in ifc_file.get_inverse(old_representation): - ifcopenshell.util.element.replace_attribute(inverse, old_representation, new_representation) - - ifcopenshell.api.run("geometry.remove_representation", ifc_file, representation=old_representation) - - has_replaced_opening_representation = True - - tool.Model.reload_body_representation(voided_objs) - if fillings: - with bpy.context.temp_override(selected_objects=list(fillings.values())): - bpy.ops.bim.recalculate_fill() def update_window_modifier_representation(context, obj): @@ -166,7 +120,7 @@ def update_window_modifier_representation(context, obj): occurrence.OverallWidth = props.overall_width / si_conversion occurrence.OverallHeight = props.overall_height / si_conversion - update_simple_openings(element) + tool.Model.update_simple_openings(element) def create_bm_window_frame(bm, size: Vector, thickness: list, position: Vector = V(0, 0, 0).freeze()): diff --git a/src/blenderbim/blenderbim/tool/model.py b/src/blenderbim/blenderbim/tool/model.py index d0c63912d4..cc0f5febff 100644 --- a/src/blenderbim/blenderbim/tool/model.py +++ b/src/blenderbim/blenderbim/tool/model.py @@ -37,6 +37,7 @@ from functools import partial from blenderbim.bim import import_ifc from blenderbim.bim.module.geometry.helper import Helper from blenderbim.bim.module.model.data import AuthoringData, RailingData, RoofData, WindowData, DoorData +from blenderbim.bim.module.model.opening import FilledOpeningGenerator from ifcopenshell.util.shape_builder import V, ShapeBuilder from typing import Optional, Union, TypeVar, Any @@ -1204,3 +1205,49 @@ class Model(blenderbim.core.tool.Model): vertices = (v.to_3d().xzy for v in vertices) return (vertices, edges, faces) + + @classmethod + def update_simple_openings(cls, element: ifcopenshell.entity_instance) -> None: + ifc_file = tool.Ifc.get() + fillings = {e: tool.Ifc.get_object(e) for e in tool.Ifc.get_all_element_occurrences(element)} + + voided_objs = set() + has_replaced_opening_representation = False + for filling in fillings: + if not filling.FillsVoids: + continue + + opening = filling.FillsVoids[0].RelatingOpeningElement + voided_obj = tool.Ifc.get_object(opening.VoidsElements[0].RelatingBuildingElement) + voided_objs.add(voided_obj) + + # We assume all occurrences of the same element type (e.g. a window) + # will use openings of the same thickness. + # Generator we use by default will create a really thick opening representation + # to make sure it will fit for walls with different thickness. + if has_replaced_opening_representation: + continue + + old_representation = ifcopenshell.util.representation.get_representation( + opening, "Model", "Body", "MODEL_VIEW" + ) + old_representation = tool.Geometry.resolve_mapped_representation(old_representation) + ifcopenshell.api.run( + "geometry.unassign_representation", ifc_file, product=opening, representation=old_representation + ) + + new_representation = FilledOpeningGenerator().generate_opening_from_filling( + filling, fillings[filling], voided_obj.dimensions[1] + ) + + for inverse in ifc_file.get_inverse(old_representation): + ifcopenshell.util.element.replace_attribute(inverse, old_representation, new_representation) + + ifcopenshell.api.run("geometry.remove_representation", ifc_file, representation=old_representation) + + has_replaced_opening_representation = True + + tool.Model.reload_body_representation(voided_objs) + if fillings: + with bpy.context.temp_override(selected_objects=list(fillings.values())): + bpy.ops.bim.recalculate_fill() From fffd7360cbccc84fa670ba56ab4872da0157f90e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 16:50:41 +0500 Subject: [PATCH 269/429] fix for d4ccadb forgot to add it to global namespace --- .../ifcopenshell/api/geometry/add_representation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index 6dd006f47e..b08fa050f3 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -71,6 +71,8 @@ def add_representation( if "Helper" not in globals(): from blenderbim.bim.module.geometry.helper import Helper + globals()["Helper"] = Helper + usecase = Usecase() # TODO: This usecase currently depends on Blender's data model usecase.file = file From f576aadee1f75179348e72c55549a25c584b5f2f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 23 May 2024 12:02:37 +0500 Subject: [PATCH 270/429] typing --- .../blenderbim/bim/module/model/door.py | 7 +- .../blenderbim/bim/module/model/profile.py | 1 - .../blenderbim/bim/module/model/railing.py | 4 + .../blenderbim/bim/module/model/roof.py | 4 + .../blenderbim/bim/module/model/slab.py | 1 - .../blenderbim/bim/module/model/stair.py | 6 +- .../blenderbim/bim/module/model/wall.py | 1 - .../blenderbim/bim/module/model/window.py | 5 + .../blenderbim/bim/module/type/operator.py | 2 +- .../blenderbim/bim/module/void/operator.py | 1 + src/blenderbim/blenderbim/core/project.py | 10 +- src/blenderbim/blenderbim/core/sequence.py | 254 +++++++++++------- src/blenderbim/blenderbim/tool/cost.py | 15 +- src/blenderbim/blenderbim/tool/model.py | 5 +- src/blenderbim/blenderbim/tool/project.py | 22 +- src/blenderbim/blenderbim/tool/sequence.py | 191 +++++++------ src/blenderbim/blenderbim/tool/spatial.py | 2 +- src/blenderbim/blenderbim/tool/system.py | 3 + src/blenderbim/test/tool/test_qto.py | 2 + .../api/geometry/add_representation.py | 5 +- .../api/geometry/map_representation.py | 8 +- .../api/sequence/remove_work_plan.py | 1 + .../ifcopenshell/util/sequence.py | 6 +- 23 files changed, 343 insertions(+), 213 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/door.py b/src/blenderbim/blenderbim/bim/module/model/door.py index 13cf277a11..c7f4ca32f4 100644 --- a/src/blenderbim/blenderbim/bim/module/model/door.py +++ b/src/blenderbim/blenderbim/bim/module/model/door.py @@ -22,21 +22,24 @@ import bmesh from bmesh.types import BMVert, BMFace import ifcopenshell +import ifcopenshell.api +import ifcopenshell.util.element +import ifcopenshell.util.representation from ifcopenshell.util.shape_builder import V import blenderbim import blenderbim.tool as tool +import blenderbim.core.geometry import blenderbim.core.geometry as core import blenderbim.core.root from blenderbim.bim.module.model.window import create_bm_window, create_bm_box from mathutils import Vector, Matrix -from pprint import pprint import json import collections -def update_door_modifier_representation(context, obj): +def update_door_modifier_representation(context: bpy.types.Context, obj: bpy.types.Object) -> None: props = obj.BIMDoorProperties element = tool.Ifc.get_entity(obj) ifc_file = tool.Ifc.get() diff --git a/src/blenderbim/blenderbim/bim/module/model/profile.py b/src/blenderbim/blenderbim/bim/module/model/profile.py index cabffba831..a23749d051 100644 --- a/src/blenderbim/blenderbim/bim/module/model/profile.py +++ b/src/blenderbim/blenderbim/bim/module/model/profile.py @@ -94,7 +94,6 @@ class DumbProfileGenerator: obj=obj, ifc_class=ifc_class, should_add_representation=False, - context=self.body_context, ) ifcopenshell.api.run("type.assign_type", self.file, related_objects=[element], relating_type=self.relating_type) diff --git a/src/blenderbim/blenderbim/bim/module/model/railing.py b/src/blenderbim/blenderbim/bim/module/model/railing.py index 9887e8eb71..f3d20b5031 100644 --- a/src/blenderbim/blenderbim/bim/module/model/railing.py +++ b/src/blenderbim/blenderbim/bim/module/model/railing.py @@ -20,8 +20,12 @@ import bpy import bmesh import ifcopenshell +import ifcopenshell.api +import ifcopenshell.util.representation +import ifcopenshell.util.unit from ifcopenshell.util.shape_builder import V import blenderbim +import blenderbim.core.root import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore from blenderbim.bim.module.model.door import bm_sort_out_geom diff --git a/src/blenderbim/blenderbim/bim/module/model/roof.py b/src/blenderbim/blenderbim/bim/module/model/roof.py index 9e7344b75b..e33e819c0c 100644 --- a/src/blenderbim/blenderbim/bim/module/model/roof.py +++ b/src/blenderbim/blenderbim/bim/module/model/roof.py @@ -20,7 +20,11 @@ import bpy import bmesh import ifcopenshell +import ifcopenshell.api +import ifcopenshell.util.representation +import ifcopenshell.util.unit import blenderbim +import blenderbim.core.root import blenderbim.tool as tool from blenderbim.bim.helper import convert_property_group_from_si from blenderbim.bim.module.model.door import bm_sort_out_geom diff --git a/src/blenderbim/blenderbim/bim/module/model/slab.py b/src/blenderbim/blenderbim/bim/module/model/slab.py index ec23ca101f..cb0263e0f3 100644 --- a/src/blenderbim/blenderbim/bim/module/model/slab.py +++ b/src/blenderbim/blenderbim/bim/module/model/slab.py @@ -176,7 +176,6 @@ class DumbSlabGenerator: obj=obj, ifc_class=ifc_class, should_add_representation=False, - context=self.body_context, ) ifcopenshell.api.run("type.assign_type", self.file, related_objects=[element], relating_type=self.relating_type) diff --git a/src/blenderbim/blenderbim/bim/module/model/stair.py b/src/blenderbim/blenderbim/bim/module/model/stair.py index af34428d44..c58685db53 100644 --- a/src/blenderbim/blenderbim/bim/module/model/stair.py +++ b/src/blenderbim/blenderbim/bim/module/model/stair.py @@ -20,7 +20,11 @@ import bpy import json import bmesh import ifcopenshell +import ifcopenshell.api +import ifcopenshell.util.representation +import ifcopenshell.util.unit import blenderbim +import blenderbim.core.root import blenderbim.tool as tool from mathutils import Vector from bmesh.types import BMVert @@ -217,7 +221,6 @@ class BIM_OT_add_clever_stair(bpy.types.Operator, tool.Ifc.Operator): collection = context.view_layer.active_layer_collection.collection collection.objects.link(obj) - body_context = ifcopenshell.util.representation.get_context(ifc_file, "Model", "Body", "MODEL_VIEW") element = blenderbim.core.root.assign_class( tool.Ifc, tool.Collector, @@ -225,7 +228,6 @@ class BIM_OT_add_clever_stair(bpy.types.Operator, tool.Ifc.Operator): obj=obj, ifc_class="IfcStairFlight", should_add_representation=False, - context=body_context, ) if tool.Ifc.get_schema() != "IFC2X3": element.PredefinedType = "STRAIGHT" diff --git a/src/blenderbim/blenderbim/bim/module/model/wall.py b/src/blenderbim/blenderbim/bim/module/model/wall.py index 78e8b4c579..d16b81fd1e 100644 --- a/src/blenderbim/blenderbim/bim/module/model/wall.py +++ b/src/blenderbim/blenderbim/bim/module/model/wall.py @@ -607,7 +607,6 @@ class DumbWallGenerator: obj=obj, ifc_class=ifc_class, should_add_representation=False, - context=self.body_context, ) ifcopenshell.api.run("type.assign_type", self.file, related_objects=[element], relating_type=self.relating_type) if self.axis_context: diff --git a/src/blenderbim/blenderbim/bim/module/model/window.py b/src/blenderbim/blenderbim/bim/module/model/window.py index 1c6c7d973c..64a5658435 100644 --- a/src/blenderbim/blenderbim/bim/module/model/window.py +++ b/src/blenderbim/blenderbim/bim/module/model/window.py @@ -26,6 +26,11 @@ import blenderbim.tool as tool import blenderbim.core.root import blenderbim.core.geometry from ifcopenshell.api.geometry.add_window_representation import DEFAULT_PANEL_SCHEMAS +import ifcopenshell.api +import ifcopenshell.util.element +import ifcopenshell.util.representation +import ifcopenshell.util.shape_builder +import ifcopenshell.util.unit from ifcopenshell.util.shape_builder import V from bmesh.types import BMVert from mathutils import Vector diff --git a/src/blenderbim/blenderbim/bim/module/type/operator.py b/src/blenderbim/blenderbim/bim/module/type/operator.py index f88bc712f4..7842c67155 100644 --- a/src/blenderbim/blenderbim/bim/module/type/operator.py +++ b/src/blenderbim/blenderbim/bim/module/type/operator.py @@ -22,6 +22,7 @@ import ifcopenshell.util.element import ifcopenshell.util.schema import ifcopenshell.util.representation import ifcopenshell.util.type +import ifcopenshell.util.unit import ifcopenshell.api import blenderbim.tool as tool import blenderbim.core.geometry @@ -454,7 +455,6 @@ class AddType(bpy.types.Operator, tool.Ifc.Operator): predefined_type=predefined_type, ifc_class="IfcStairFlightType", should_add_representation=False, - context=body, ) tool.Blender.select_and_activate_single_object(context, obj) bpy.ops.bim.add_stair() diff --git a/src/blenderbim/blenderbim/bim/module/void/operator.py b/src/blenderbim/blenderbim/bim/module/void/operator.py index 6257af9278..af631ace63 100644 --- a/src/blenderbim/blenderbim/bim/module/void/operator.py +++ b/src/blenderbim/blenderbim/bim/module/void/operator.py @@ -21,6 +21,7 @@ import ifcopenshell.api import ifcopenshell.util.representation import blenderbim.tool as tool import blenderbim.core.geometry +import blenderbim.core.root from blenderbim.bim.ifc import IfcStore from blenderbim.bim.module.model.opening import FilledOpeningGenerator diff --git a/src/blenderbim/blenderbim/core/project.py b/src/blenderbim/blenderbim/core/project.py index ff7aaf6208..6780843592 100644 --- a/src/blenderbim/blenderbim/core/project.py +++ b/src/blenderbim/blenderbim/core/project.py @@ -16,8 +16,16 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from __future__ import annotations +from typing import TYPE_CHECKING, Optional -def create_project(ifc, project, schema=None, template=None): +if TYPE_CHECKING: + import bpy + import ifcopenshell + import blenderbim.tool as tool + + +def create_project(ifc: tool.Ifc, project: tool.Project, schema: str, template: Optional[str] = None) -> None: if ifc.get(): return diff --git a/src/blenderbim/blenderbim/core/sequence.py b/src/blenderbim/blenderbim/core/sequence.py index 9f0b5ab903..e6d2a1eebf 100644 --- a/src/blenderbim/blenderbim/core/sequence.py +++ b/src/blenderbim/blenderbim/core/sequence.py @@ -16,103 +16,115 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Union -def add_work_plan(ifc): +if TYPE_CHECKING: + import bpy + import ifcopenshell + import blenderbim.tool as tool + + +def add_work_plan(ifc: tool.Ifc) -> ifcopenshell.entity_instance: return ifc.run("sequence.add_work_plan") -def remove_work_plan(ifc, work_plan=None): +def remove_work_plan(ifc: tool.Ifc, work_plan: ifcopenshell.entity_instance) -> None: ifc.run("sequence.remove_work_plan", work_plan=work_plan) -def enable_editing_work_plan(sequence, work_plan=None): +def enable_editing_work_plan(sequence: tool.Sequence, work_plan: ifcopenshell.entity_instance) -> None: sequence.load_work_plan_attributes(work_plan) sequence.enable_editing_work_plan(work_plan) -def disable_editing_work_plan(sequence): +def disable_editing_work_plan(sequence: tool.Sequence) -> None: sequence.disable_editing_work_plan() -def edit_work_plan(ifc, sequence, work_plan=None): +def edit_work_plan(ifc: tool.Ifc, sequence: tool.Sequence, work_plan: ifcopenshell.entity_instance) -> None: attributes = sequence.get_work_plan_attributes() ifc.run("sequence.edit_work_plan", work_plan=work_plan, attributes=attributes) sequence.disable_editing_work_plan() -def edit_work_schedule(ifc, sequence, work_schedule=None): +def edit_work_schedule(ifc: tool.Ifc, sequence: tool.Sequence, work_schedule: ifcopenshell.entity_instance) -> None: attributes = sequence.get_work_schedule_attributes() ifc.run("sequence.edit_work_schedule", work_schedule=work_schedule, attributes=attributes) sequence.disable_editing_work_schedule() -def enable_editing_work_plan_schedules(sequence, work_plan=None): +def enable_editing_work_plan_schedules( + sequence: tool.Sequence, work_plan: Optional[ifcopenshell.entity_instance] = None +) -> None: sequence.enable_editing_work_plan_schedules(work_plan) -def add_work_schedule(ifc, sequence, name=None): +def add_work_schedule(ifc: tool.Ifc, sequence: tool.Sequence, name: str) -> ifcopenshell.entity_instance: predefined_type, object_type = sequence.get_user_predefined_type() return ifc.run("sequence.add_work_schedule", name=name, predefined_type=predefined_type, object_type=object_type) -def remove_work_schedule(ifc, work_schedule=None): +def remove_work_schedule(ifc: tool.Ifc, work_schedule: ifcopenshell.entity_instance) -> None: ifc.run("sequence.remove_work_schedule", work_schedule=work_schedule) -def assign_work_schedule(ifc, work_plan=None, work_schedule=None): +def assign_work_schedule( + ifc: tool.Ifc, work_plan: ifcopenshell.entity_instance, work_schedule: ifcopenshell.entity_instance +) -> Union[ifcopenshell.entity_instance, None]: if work_schedule: return ifc.run("aggregate.assign_object", relating_object=work_plan, products=[work_schedule]) -def unassign_work_schedule(ifc, work_schedule=None): +def unassign_work_schedule(ifc: tool.Ifc, work_schedule: ifcopenshell.entity_instance) -> None: ifc.run("aggregate.unassign_object", products=[work_schedule]) -def enable_editing_work_schedule(sequence, work_schedule=None): +def enable_editing_work_schedule(sequence: tool.Sequence, work_schedule: ifcopenshell.entity_instance) -> None: sequence.load_work_schedule_attributes(work_schedule) sequence.enable_editing_work_schedule(work_schedule) -def enable_editing_work_schedule_tasks(sequence, work_schedule=None): +def enable_editing_work_schedule_tasks(sequence: tool.Sequence, work_schedule: ifcopenshell.entity_instance) -> None: sequence.enable_editing_work_schedule_tasks(work_schedule) sequence.load_task_tree(work_schedule) sequence.load_task_properties() -def load_task_tree(sequence, work_schedule): +def load_task_tree(sequence: tool.Sequence, work_schedule) -> None: sequence.load_task_tree(work_schedule) sequence.load_task_properties() -def expand_task(sequence, task=None): +def expand_task(sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: sequence.expand_task(task) work_schedule = sequence.get_active_work_schedule() sequence.load_task_tree(work_schedule) sequence.load_task_properties() -def expand_all_tasks(sequence): +def expand_all_tasks(sequence: tool.Sequence) -> None: sequence.expand_all_tasks() work_schedule = sequence.get_active_work_schedule() sequence.load_task_tree(work_schedule) sequence.load_task_properties() -def contract_task(sequence, task=None): +def contract_task(sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: sequence.contract_task(task) work_schedule = sequence.get_active_work_schedule() sequence.load_task_tree(work_schedule) sequence.load_task_properties() -def contract_all_tasks(sequence): +def contract_all_tasks(sequence: tool.Sequence) -> None: sequence.contract_all_tasks() work_schedule = sequence.get_active_work_schedule() sequence.load_task_tree(work_schedule) sequence.load_task_properties() -def remove_task(ifc, sequence, task=None): +def remove_task(ifc: tool.Ifc, sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: ifc.run("sequence.remove_task", task=task) work_schedule = sequence.get_active_work_schedule() sequence.load_task_tree(work_schedule) @@ -120,44 +132,46 @@ def remove_task(ifc, sequence, task=None): sequence.disable_selecting_deleted_task() -def load_task_properties(sequence): +def load_task_properties(sequence: tool.Sequence) -> None: sequence.load_task_properties() -def disable_editing_work_schedule(sequence): +def disable_editing_work_schedule(sequence: tool.Sequence) -> None: sequence.disable_editing_work_schedule() -def add_summary_task(ifc, sequence, work_schedule=None): +def add_summary_task(ifc: tool.Ifc, sequence: tool.Sequence, work_schedule: ifcopenshell.entity_instance) -> None: ifc.run("sequence.add_task", work_schedule=work_schedule) sequence.load_task_tree(work_schedule) sequence.load_task_properties() -def add_task(ifc, sequence, parent_task=None): +def add_task( + ifc: tool.Ifc, sequence: tool.Sequence, parent_task: Optional[ifcopenshell.entity_instance] = None +) -> None: ifc.run("sequence.add_task", parent_task=parent_task) work_schedule = sequence.get_active_work_schedule() sequence.load_task_tree(work_schedule) sequence.load_task_properties() -def enable_editing_task(sequence, task=None): +def enable_editing_task(sequence, task=None) -> None: sequence.enable_editing_task(task) -def enable_editing_task_attributes(sequence, task=None): +def enable_editing_task_attributes(sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: sequence.load_task_attributes(task) sequence.enable_editing_task_attributes(task) -def edit_task(ifc, sequence, task=None): +def edit_task(ifc: tool.Ifc, sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: attributes = sequence.get_task_attributes() ifc.run("sequence.edit_task", task=task, attributes=attributes) sequence.load_task_properties(task=task) sequence.disable_editing_task() -def copy_task_attribute(ifc, sequence, attribute_name=None): +def copy_task_attribute(ifc: tool.Ifc, sequence: tool.Sequence, attribute_name: str) -> None: for task in sequence.get_checked_tasks(): ifc.run( "sequence.edit_task", @@ -167,18 +181,18 @@ def copy_task_attribute(ifc, sequence, attribute_name=None): sequence.load_task_properties(task) -def duplicate_task(ifc, sequence, task=None): +def duplicate_task(ifc: tool.Ifc, sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: ifc.run("sequence.duplicate_task", task=task) work_schedule = sequence.get_active_work_schedule() sequence.load_task_tree(work_schedule) sequence.load_task_properties() -def disable_editing_task(sequence): +def disable_editing_task(sequence: tool.Sequence) -> None: sequence.disable_editing_task() -def enable_editing_task_time(ifc, sequence, task=None): +def enable_editing_task_time(ifc: tool.Ifc, sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: task_time = sequence.get_task_time(task) if task_time is None: task_time = ifc.run("sequence.add_task_time", task=task) @@ -186,7 +200,7 @@ def enable_editing_task_time(ifc, sequence, task=None): sequence.enable_editing_task_time(task) -def edit_task_time(ifc, sequence, resource, task_time=None): +def edit_task_time(ifc: tool.Ifc, sequence: tool.Sequence, resource, task_time: ifcopenshell.entity_instance) -> None: attributes = sequence.get_task_time_attributes() # TODO: nasty loop goes on when calendar props are messed up ifc.run("sequence.edit_task_time", task_time=task_time, attributes=attributes) @@ -196,59 +210,83 @@ def edit_task_time(ifc, sequence, resource, task_time=None): resource.load_resource_properties() -def assign_predecessor(ifc, sequence, task=None): +def assign_predecessor(ifc: tool.Ifc, sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: predecessor_task = sequence.get_highlighted_task() ifc.run("sequence.assign_sequence", relating_process=task, related_process=predecessor_task) sequence.load_task_properties() -def unassign_predecessor(ifc, sequence, task=None): +def unassign_predecessor(ifc: tool.Ifc, sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: predecessor_task = sequence.get_highlighted_task() ifc.run("sequence.unassign_sequence", relating_process=task, related_process=predecessor_task) sequence.load_task_properties() -def assign_successor(ifc, sequence, task=None): +def assign_successor(ifc: tool.Ifc, sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: successor_task = sequence.get_highlighted_task() ifc.run("sequence.assign_sequence", relating_process=successor_task, related_process=task) sequence.load_task_properties() -def unassign_successor(ifc, sequence, task=None): +def unassign_successor(ifc: tool.Ifc, sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: successor_task = sequence.get_highlighted_task() ifc.run("sequence.unassign_sequence", relating_process=successor_task, related_process=task) sequence.load_task_properties() -def assign_products(ifc, sequence, spatial, task=None, products=None): +def assign_products( + ifc: tool.Ifc, + sequence: tool.Sequence, + spatial: tool.Spatial, + task: ifcopenshell.entity_instance, + products: Optional[list[ifcopenshell.entity_instance]] = None, +) -> None: for product in products or spatial.get_selected_products() or []: ifc.run("sequence.assign_product", relating_product=product, related_object=task) outputs = sequence.get_task_outputs(task) sequence.load_task_outputs(outputs) -def unassign_products(ifc, sequence, spatial, task=None, products=None): +def unassign_products( + ifc: tool.Ifc, + sequence: tool.Sequence, + spatial: tool.Spatial, + task: ifcopenshell.entity_instance, + products: Optional[list[ifcopenshell.entity_instance]] = None, +) -> None: for product in products or spatial.get_selected_products() or []: ifc.run("sequence.unassign_product", relating_product=product, related_object=task) outputs = sequence.get_task_outputs(task) sequence.load_task_outputs(outputs) -def assign_input_products(ifc, sequence, spatial, task=None, products=None): +def assign_input_products( + ifc: tool.Ifc, + sequence: tool.Sequence, + spatial: tool.Spatial, + task: ifcopenshell.entity_instance, + products: Optional[list[ifcopenshell.entity_instance]] = None, +) -> None: for product in products or spatial.get_selected_products() or []: ifc.run("sequence.assign_process", relating_process=task, related_object=product) inputs = sequence.get_task_inputs(task) sequence.load_task_inputs(inputs) -def unassign_input_products(ifc, sequence, spatial, task=None, products=None): +def unassign_input_products( + ifc: tool.Ifc, + sequence: tool.Sequence, + spatial: tool.Spatial, + task: ifcopenshell.entity_instance, + products: Optional[list[ifcopenshell.entity_instance]] = None, +) -> None: for product in products or spatial.get_selected_products() or []: ifc.run("sequence.unassign_process", relating_process=task, related_object=product) inputs = sequence.get_task_inputs(task) sequence.load_task_inputs(inputs) -def assign_resource(ifc, sequence, resource_tool, task=None): +def assign_resource(ifc: tool.Ifc, sequence: tool.Sequence, resource_tool, task: ifcopenshell.entity_instance) -> None: resource = resource_tool.get_highlighted_resource() sub_resource = ifc.run( "resource.add_resource", @@ -261,59 +299,67 @@ def assign_resource(ifc, sequence, resource_tool, task=None): resource_tool.load_resources() -def unassign_resource(ifc, sequence, resource_tool, task=None, resource=None): +def unassign_resource( + ifc: tool.Ifc, + sequence: tool.Sequence, + resource_tool, + task: ifcopenshell.entity_instance, + resource: ifcopenshell.entity_instance, +) -> None: ifc.run("sequence.unassign_process", relating_process=task, related_object=resource) ifc.run("resource.remove_resource", resource=resource) sequence.load_task_resources(task) resource_tool.load_resources() -def remove_work_calendar(ifc, work_calendar=None): +def remove_work_calendar(ifc: tool.Ifc, work_calendar: ifcopenshell.entity_instance) -> None: ifc.run("sequence.remove_work_calendar", work_calendar=work_calendar) -def add_work_calendar(ifc): +def add_work_calendar(ifc: tool.Ifc) -> ifcopenshell.entity_instance: return ifc.run("sequence.add_work_calendar") -def edit_work_calendar(ifc, sequence, work_calendar=None): +def edit_work_calendar(ifc: tool.Ifc, sequence: tool.Sequence, work_calendar: ifcopenshell.entity_instance) -> None: attributes = sequence.get_work_calendar_attributes() ifc.run("sequence.edit_work_calendar", work_calendar=work_calendar, attributes=attributes) sequence.disable_editing_work_calendar() sequence.load_task_properties() -def enable_editing_work_calendar(sequence, work_calendar=None): +def enable_editing_work_calendar(sequence: tool.Sequence, work_calendar: ifcopenshell.entity_instance) -> None: sequence.load_work_calendar_attributes(work_calendar) sequence.enable_editing_work_calendar(work_calendar) -def disable_editing_work_calendar(sequence): +def disable_editing_work_calendar(sequence: tool.Sequence) -> None: sequence.disable_editing_work_calendar() -def enable_editing_work_calendar_times(sequence, work_calendar=None): +def enable_editing_work_calendar_times(sequence: tool.Sequence, work_calendar: ifcopenshell.entity_instance) -> None: sequence.enable_editing_work_calendar_times(work_calendar) -def add_work_time(ifc, work_calendar=None, time_type=None): +def add_work_time( + ifc: tool.Ifc, work_calendar: ifcopenshell.entity_instance, time_type: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: return ifc.run("sequence.add_work_time", work_calendar=work_calendar, time_type=time_type) -def enable_editing_work_time(sequence, work_time=None): +def enable_editing_work_time(sequence: tool.Sequence, work_time: ifcopenshell.entity_instance) -> None: sequence.load_work_time_attributes(work_time) sequence.enable_editing_work_time(work_time) -def disable_editing_work_time(sequence): +def disable_editing_work_time(sequence: tool.Sequence) -> None: sequence.disable_editing_work_time() -def remove_work_time(ifc, work_time=None): +def remove_work_time(ifc: tool.Ifc, work_time=None) -> None: ifc.run("sequence.remove_work_time", work_time=work_time) -def edit_work_time(ifc, sequence): +def edit_work_time(ifc: tool.Ifc, sequence: tool.Sequence) -> None: work_time = sequence.get_active_work_time() ifc.run("sequence.edit_work_time", work_time=work_time, attributes=sequence.get_work_time_attributes()) recurrence_pattern = work_time.RecurrencePattern @@ -326,100 +372,118 @@ def edit_work_time(ifc, sequence): sequence.disable_editing_work_time() -def assign_recurrence_pattern(ifc, work_time=None, recurrence_type=None): +def assign_recurrence_pattern( + ifc: tool.Ifc, work_time: ifcopenshell.entity_instance, recurrence_type: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: return ifc.run("sequence.assign_recurrence_pattern", parent=work_time, recurrence_type=recurrence_type) -def unassign_recurrence_pattern(ifc, recurrence_pattern=None): +def unassign_recurrence_pattern(ifc: tool.Ifc, recurrence_pattern: ifcopenshell.entity_instance) -> None: ifc.run("sequence.unassign_recurrence_pattern", recurrence_pattern=recurrence_pattern) -def add_time_period(ifc, sequence, recurrence_pattern=None): +def add_time_period(ifc: tool.Ifc, sequence: tool.Sequence, recurrence_pattern: ifcopenshell.entity_instance) -> None: start_time, end_time = sequence.get_recurrence_pattern_times() ifc.run("sequence.add_time_period", recurrence_pattern=recurrence_pattern, start_time=start_time, end_time=end_time) sequence.reset_time_period() -def remove_time_period(ifc, time_period=None): +def remove_time_period(ifc: tool.Ifc, time_period: ifcopenshell.entity_instance) -> None: ifc.run("sequence.remove_time_period", time_period=time_period) -def enable_editing_task_calendar(sequence, task=None): +def enable_editing_task_calendar(sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: sequence.enable_editing_task_calendar(task) -def edit_task_calendar(ifc, sequence, task=None, work_calendar=None): +def edit_task_calendar( + ifc: tool.Ifc, + sequence: tool.Sequence, + task: ifcopenshell.entity_instance, + work_calendar: ifcopenshell.entity_instance, +) -> None: ifc.run("control.assign_control", relating_control=work_calendar, related_object=task) ifc.run("sequence.cascade_schedule", task=task) sequence.load_task_properties() -def remove_task_calendar(ifc, sequence, task=None, work_calendar=None): +def remove_task_calendar( + ifc: tool.Ifc, + sequence: tool.Sequence, + task: ifcopenshell.entity_instance, + work_calendar: ifcopenshell.entity_instance, +) -> None: ifc.run("control.unassign_control", relating_control=work_calendar, related_object=task) ifc.run("sequence.cascade_schedule", task=task) sequence.load_task_properties() -def enable_editing_task_sequence(sequence): +def enable_editing_task_sequence(sequence: tool.Sequence) -> None: sequence.enable_editing_task_sequence() sequence.load_task_properties() -def disable_editing_task_time(sequence): +def disable_editing_task_time(sequence: tool.Sequence) -> None: sequence.disable_editing_task_time() -def enable_editing_sequence_attributes(sequence, rel_sequence=None): +def enable_editing_sequence_attributes(sequence: tool.Sequence, rel_sequence: ifcopenshell.entity_instance) -> None: sequence.enable_editing_rel_sequence_attributes(rel_sequence) sequence.load_rel_sequence_attributes(rel_sequence) -def enable_editing_sequence_lag_time(sequence, rel_sequence=None, lag_time=None): +def enable_editing_sequence_lag_time( + sequence: tool.Sequence, rel_sequence: ifcopenshell.entity_instance, lag_time: ifcopenshell.entity_instance +) -> None: sequence.load_lag_time_attributes(lag_time) sequence.enable_editing_sequence_lag_time(rel_sequence) -def unassign_lag_time(ifc, sequence, rel_sequence=None): +def unassign_lag_time(ifc: tool.Ifc, sequence: tool.Sequence, rel_sequence: ifcopenshell.entity_instance) -> None: ifc.run("sequence.unassign_lag_time", rel_sequence=rel_sequence) sequence.load_task_properties() -def assign_lag_time(ifc, rel_sequence=None): +def assign_lag_time(ifc: tool.Ifc, rel_sequence: ifcopenshell.entity_instance) -> None: ifc.run("sequence.assign_lag_time", rel_sequence=rel_sequence, lag_value="P1D") -def edit_sequence_attributes(ifc, sequence, rel_sequence=None): +def edit_sequence_attributes( + ifc: tool.Ifc, sequence: tool.Sequence, rel_sequence: ifcopenshell.entity_instance +) -> None: attributes = sequence.get_rel_sequence_attributes() ifc.run("sequence.edit_sequence", rel_sequence=rel_sequence, attributes=attributes) sequence.disable_editing_rel_sequence() sequence.load_task_properties() -def edit_sequence_lag_time(ifc, sequence, lag_time=None): +def edit_sequence_lag_time(ifc: tool.Ifc, sequence: tool.Sequence, lag_time: ifcopenshell.entity_instance) -> None: attributes = sequence.get_lag_time_attributes() ifc.run("sequence.edit_lag_time", lag_time=lag_time, attributes=attributes) sequence.disable_editing_rel_sequence() sequence.load_task_properties() -def disable_editing_rel_sequence(sequence): +def disable_editing_rel_sequence(sequence: tool.Sequence) -> None: sequence.disable_editing_rel_sequence() -def select_task_outputs(sequence, spatial, task=None): +def select_task_outputs(sequence: tool.Sequence, spatial: tool.Spatial, task: ifcopenshell.entity_instance) -> None: spatial.select_products(products=sequence.get_task_outputs(task)) -def select_task_inputs(sequence, spatial, task=None): +def select_task_inputs(sequence: tool.Sequence, spatial: tool.Spatial, task: ifcopenshell.entity_instance) -> None: spatial.select_products(products=sequence.get_task_inputs(task)) -def select_work_schedule_products(sequence, spatial, work_schedule=None): +def select_work_schedule_products( + sequence: tool.Sequence, spatial: tool.Spatial, work_schedule: ifcopenshell.entity_instance +) -> None: products = sequence.get_work_schedule_products(work_schedule) spatial.select_products(products) -def select_unassigned_work_schedule_products(ifc, sequence, spatial): +def select_unassigned_work_schedule_products(ifc: tool.Ifc, sequence: tool.Sequence, spatial: tool.Spatial) -> None: spatial.deselect_objects() products = ifc.get().by_type("IfcElement") work_schedule = sequence.get_active_work_schedule() @@ -428,11 +492,11 @@ def select_unassigned_work_schedule_products(ifc, sequence, spatial): spatial.select_products(selection) -def recalculate_schedule(ifc, work_schedule=None): +def recalculate_schedule(ifc: tool.Ifc, work_schedule: ifcopenshell.entity_instance) -> None: ifc.run("sequence.recalculate_schedule", work_schedule=work_schedule) -def add_task_column(sequence, column_type=None, name=None, data_type=None): +def add_task_column(sequence: tool.Sequence, column_type: str, name: str, data_type: str) -> None: sequence.add_task_column(column_type, name, data_type) work_schedule = sequence.get_active_work_schedule() if work_schedule: @@ -440,11 +504,11 @@ def add_task_column(sequence, column_type=None, name=None, data_type=None): sequence.load_task_properties() -def remove_task_column(sequence, name=None): +def remove_task_column(sequence: tool.Sequence, name: str) -> None: sequence.remove_task_column(name) -def set_task_sort_column(sequence, column=None): +def set_task_sort_column(sequence: tool.Sequence, column: str) -> None: sequence.set_task_sort_column(column) work_schedule = sequence.get_active_work_schedule() if work_schedule: @@ -452,7 +516,7 @@ def set_task_sort_column(sequence, column=None): sequence.load_task_properties() -def calculate_task_duration(ifc, sequence, task=None): +def calculate_task_duration(ifc: tool.Ifc, sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: ifc.run("sequence.calculate_task_duration", task=task) work_schedule = sequence.get_active_work_schedule() if work_schedule: @@ -460,11 +524,11 @@ def calculate_task_duration(ifc, sequence, task=None): sequence.load_task_properties() -def load_animation_color_scheme(sequence, scheme): +def load_animation_color_scheme(sequence: tool.Sequence, scheme: Union[ifcopenshell.entity_instance, None]) -> None: sequence.load_animation_color_scheme(scheme) -def go_to_task(sequence, task=None): +def go_to_task(sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> Union[None, str]: work_schedule = sequence.get_work_schedule(task) is_work_schedule_active = sequence.is_work_schedule_active(work_schedule) if is_work_schedule_active: @@ -473,7 +537,7 @@ def go_to_task(sequence, task=None): return "Work schedule is not active" -def highlight_product_related_task(sequence, spatial, product_type=None): +def highlight_product_related_task(sequence: tool.Sequence, spatial: tool.Spatial, product_type=None) -> None: products = spatial.get_selected_products() if products: if product_type == "Output": @@ -487,26 +551,26 @@ def highlight_product_related_task(sequence, spatial, product_type=None): sequence.go_to_task(task) -def guess_date_range(sequence, work_schedule=None): +def guess_date_range(sequence: tool.Sequence, work_schedule: ifcopenshell.entity_instance) -> None: start, finish = sequence.guess_date_range(work_schedule) sequence.update_visualisation_date(start, finish) -def setup_default_task_columns(sequence): +def setup_default_task_columns(sequence: tool.Sequence) -> None: sequence.setup_default_task_columns() -def add_task_bars(sequence): +def add_task_bars(sequence: tool.Sequence) -> None: tasks = sequence.get_animation_bar_tasks() if tasks: sequence.create_bars(tasks) -def load_default_animation_color_scheme(sequence): +def load_default_animation_color_scheme(sequence: tool.Sequence) -> None: sequence.load_default_animation_color_scheme() -def visualise_work_schedule_date_range(sequence, work_schedule=None): +def visualise_work_schedule_date_range(sequence: tool.Sequence, work_schedule: ifcopenshell.entity_instance) -> None: sequence.clear_objects_animation(include_blender_objects=False) settings = sequence.get_animation_settings() if settings: @@ -520,7 +584,7 @@ def visualise_work_schedule_date_range(sequence, work_schedule=None): sequence.set_object_shading() -def visualise_work_schedule_date(sequence, work_schedule=None): +def visualise_work_schedule_date(sequence: tool.Sequence, work_schedule: ifcopenshell.entity_instance) -> None: sequence.clear_objects_animation(include_blender_objects=False) start_date = sequence.get_start_date() product_states = sequence.process_construction_state(work_schedule, start_date) @@ -528,12 +592,12 @@ def visualise_work_schedule_date(sequence, work_schedule=None): sequence.set_object_shading() -def generate_gantt_chart(sequence, work_schedule): +def generate_gantt_chart(sequence: tool.Sequence, work_schedule: ifcopenshell.entity_instance) -> None: json = sequence.create_tasks_json(work_schedule) sequence.generate_gantt_browser_chart(json, work_schedule) -def load_product_related_tasks(sequence, product=None): +def load_product_related_tasks(sequence: tool.Sequence, product: ifcopenshell.entity_instance) -> Union[None, str]: filter_by_schedule = sequence.is_filter_by_active_schedule() if filter_by_schedule: work_schedule = sequence.get_active_work_schedule() @@ -546,7 +610,9 @@ def load_product_related_tasks(sequence, product=None): sequence.load_product_related_tasks(task_inputs, task_ouputs) -def reorder_task_nesting(ifc, sequence, task, new_index): +def reorder_task_nesting( + ifc: tool.Ifc, sequence: tool.Sequence, task: ifcopenshell.entity_instance, new_index: int +) -> Union[None, str]: is_sorting_enabled = sequence.is_sorting_enabled() is_sort_reversed = sequence.is_sort_reversed() if is_sorting_enabled or is_sort_reversed: @@ -558,17 +624,19 @@ def reorder_task_nesting(ifc, sequence, task, new_index): sequence.load_task_properties() -def create_baseline(ifc, sequence, work_schedule, name): +def create_baseline( + ifc: tool.Ifc, sequence: tool.Sequence, work_schedule: ifcopenshell.entity_instance, name: Optional[str] = None +) -> None: ifc.run("sequence.create_baseline", work_schedule=work_schedule, name=name) -def clear_previous_animation(sequence): +def clear_previous_animation(sequence: tool.Sequence) -> None: sequence.clear_objects_animation(include_blender_objects=False) -def add_animation_camera(sequence): +def add_animation_camera(sequence: tool.Sequence) -> None: sequence.add_animation_camera() -def save_animation_color_scheme(sequence, name): +def save_animation_color_scheme(sequence: tool.Sequence, name: str) -> None: sequence.save_animation_color_scheme(name) diff --git a/src/blenderbim/blenderbim/tool/cost.py b/src/blenderbim/blenderbim/tool/cost.py index 72acd26cd2..527eadf7dc 100644 --- a/src/blenderbim/blenderbim/tool/cost.py +++ b/src/blenderbim/blenderbim/tool/cost.py @@ -2,6 +2,7 @@ import os import bpy import blenderbim.core.tool import blenderbim.tool as tool +import ifcopenshell.util.element import ifcopenshell.util.date import ifcopenshell.util.cost import ifcopenshell.util.unit @@ -188,7 +189,7 @@ class Cost(blenderbim.core.tool.Cost): new.name = related_object.Name or "Unnamed" @classmethod - def load_cost_item_quantity_assignments(cls, cost_item, related_object_type): + def load_cost_item_quantity_assignments(cls, cost_item: ifcopenshell.entity_instance, related_object_type): def create_list_items(collection, cost_item, is_deep): products = cls.get_cost_item_assignments(cost_item, filter_by_type=related_object_type, is_deep=False) for product in products: @@ -217,12 +218,16 @@ class Cost(blenderbim.core.tool.Cost): create_list_items(props.cost_item_resources, cost_item, is_deep) @classmethod - def calculate_parametric_quantity(cls, cost_item=None, product=None): + def calculate_parametric_quantity( + cls, cost_item: ifcopenshell.entity_instance, product: ifcopenshell.entity_instance + ) -> tuple[float, Union[str, None]]: quantities, unit = cls.get_assigned_quantities(cost_item, product) return sum(quantity[3] for quantity in quantities), unit @classmethod - def get_assigned_quantities(cls, cost_item, product): + def get_assigned_quantities( + cls, cost_item: ifcopenshell.entity_instance, product: ifcopenshell.entity_instance + ) -> tuple[list[ifcopenshell.entity_instance], Union[str, None]]: selected_quantitites = [] unit = "" for quantities in ifcopenshell.util.element.get_psets(product, qtos_only=True).values(): @@ -465,13 +470,13 @@ class Cost(blenderbim.core.tool.Cost): print("Import finished in {:.2f} seconds".format(time.time() - start)) @classmethod - def add_cost_column(cls, name): + def add_cost_column(cls, name: str) -> None: props = bpy.context.scene.BIMCostProperties new = props.columns.add() new.name = name @classmethod - def remove_cost_column(cls, name): + def remove_cost_column(cls, name: str) -> None: props = bpy.context.scene.BIMCostProperties props.columns.remove(props.columns.find(name)) diff --git a/src/blenderbim/blenderbim/tool/model.py b/src/blenderbim/blenderbim/tool/model.py index cc0f5febff..77b02b9581 100644 --- a/src/blenderbim/blenderbim/tool/model.py +++ b/src/blenderbim/blenderbim/tool/model.py @@ -27,6 +27,7 @@ import ifcopenshell.util.element import ifcopenshell.util.unit import ifcopenshell.util.placement import ifcopenshell.util.representation +import blenderbim.core.geometry import blenderbim.core.tool import blenderbim.tool as tool import blenderbim.core.geometry as geometry @@ -39,7 +40,7 @@ from blenderbim.bim.module.geometry.helper import Helper from blenderbim.bim.module.model.data import AuthoringData, RailingData, RoofData, WindowData, DoorData from blenderbim.bim.module.model.opening import FilledOpeningGenerator from ifcopenshell.util.shape_builder import V, ShapeBuilder -from typing import Optional, Union, TypeVar, Any +from typing import Optional, Union, TypeVar, Any, Iterable T = TypeVar("T") @@ -904,7 +905,7 @@ class Model(blenderbim.core.tool.Model): return Matrix(placement) @classmethod - def reload_body_representation(cls, obj_or_objects): + def reload_body_representation(cls, obj_or_objects: Union[bpy.types.Object, Iterable[bpy.types.Object]]) -> None: """Update body representation including all decomposed objects""" if isinstance(obj_or_objects, collections.abc.Iterable): objects = set(obj_or_objects) diff --git a/src/blenderbim/blenderbim/tool/project.py b/src/blenderbim/blenderbim/tool/project.py index 9c8cd7aaaa..d55dcd4f79 100644 --- a/src/blenderbim/blenderbim/tool/project.py +++ b/src/blenderbim/blenderbim/tool/project.py @@ -19,18 +19,24 @@ import os import bpy import ifcopenshell +import ifcopenshell.util.representation import ifcopenshell.util.unit +import blenderbim.core.aggregate +import blenderbim.core.context import blenderbim.core.tool import blenderbim.core.root +import blenderbim.core.unit +import blenderbim.core.owner import blenderbim.bim.schema import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore from pathlib import Path +from typing import Optional class Project(blenderbim.core.tool.Project): @classmethod - def append_all_types_from_template(cls, template): + def append_all_types_from_template(cls, template: str) -> None: # TODO refactor filepath = os.path.join(bpy.context.scene.BIMProperties.data_dir, "templates", "projects", template) bpy.ops.bim.select_library_file(filepath=filepath) @@ -96,13 +102,13 @@ class Project(blenderbim.core.tool.Project): @classmethod def run_root_assign_class( cls, - obj=None, - ifc_class=None, - predefined_type=None, - should_add_representation=True, - context=None, - ifc_representation_class=None, - ): + obj: bpy.types.Object, + ifc_class: str, + predefined_type: Optional[str] = None, + should_add_representation: bool = True, + context: Optional[ifcopenshell.entity_instance] = None, + ifc_representation_class: Optional[str] = None, + ) -> ifcopenshell.entity_instance: return blenderbim.core.root.assign_class( tool.Ifc, tool.Collector, diff --git a/src/blenderbim/blenderbim/tool/sequence.py b/src/blenderbim/blenderbim/tool/sequence.py index 618a678f78..2f571effb4 100644 --- a/src/blenderbim/blenderbim/tool/sequence.py +++ b/src/blenderbim/blenderbim/tool/sequence.py @@ -36,11 +36,12 @@ import blenderbim.bim.helper import blenderbim.bim.module.sequence.helper as helper from dateutil import parser from datetime import datetime +from typing import Optional, Any, Union class Sequence(blenderbim.core.tool.Sequence): @classmethod - def get_work_plan_attributes(cls): + def get_work_plan_attributes(cls) -> dict[str, Any]: def callback(attributes, prop): if "Date" in prop.name or "Time" in prop.name: if prop.is_null: @@ -59,7 +60,7 @@ class Sequence(blenderbim.core.tool.Sequence): return blenderbim.bim.helper.export_attributes(props.work_plan_attributes, callback) @classmethod - def load_work_plan_attributes(cls, work_plan): + def load_work_plan_attributes(cls, work_plan: ifcopenshell.entity_instance) -> None: def callback(name, prop, data): if name in ["CreationDate", "StartTime", "FinishTime"]: prop.string_value = "" if prop.is_null else data[name] @@ -70,23 +71,23 @@ class Sequence(blenderbim.core.tool.Sequence): blenderbim.bim.helper.import_attributes2(work_plan, props.work_plan_attributes, callback) @classmethod - def enable_editing_work_plan(cls, work_plan): + def enable_editing_work_plan(cls, work_plan: Union[ifcopenshell.entity_instance, None]) -> None: if work_plan: bpy.context.scene.BIMWorkPlanProperties.active_work_plan_id = work_plan.id() bpy.context.scene.BIMWorkPlanProperties.editing_type = "ATTRIBUTES" @classmethod - def disable_editing_work_plan(cls): + def disable_editing_work_plan(cls) -> None: bpy.context.scene.BIMWorkPlanProperties.active_work_plan_id = 0 @classmethod - def enable_editing_work_plan_schedules(cls, work_plan): + def enable_editing_work_plan_schedules(cls, work_plan: Union[ifcopenshell.entity_instance, None]) -> None: if work_plan: bpy.context.scene.BIMWorkPlanProperties.active_work_plan_id = work_plan.id() bpy.context.scene.BIMWorkPlanProperties.editing_type = "SCHEDULES" @classmethod - def get_work_schedule_attributes(cls): + def get_work_schedule_attributes(cls) -> dict[str, Any]: def callback(attributes, prop): if "Date" in prop.name or "Time" in prop.name: if prop.is_null: @@ -105,7 +106,7 @@ class Sequence(blenderbim.core.tool.Sequence): return blenderbim.bim.helper.export_attributes(props.work_schedule_attributes, callback) @classmethod - def load_work_schedule_attributes(cls, work_schedule): + def load_work_schedule_attributes(cls, work_schedule: ifcopenshell.entity_instance) -> None: def callback(name, prop, data): if name in ["CreationDate", "StartTime", "FinishTime"]: prop.string_value = "" if prop.is_null else data[name] @@ -116,23 +117,23 @@ class Sequence(blenderbim.core.tool.Sequence): blenderbim.bim.helper.import_attributes2(work_schedule, props.work_schedule_attributes, callback) @classmethod - def enable_editing_work_schedule(cls, work_schedule): + def enable_editing_work_schedule(cls, work_schedule: ifcopenshell.entity_instance) -> None: bpy.context.scene.BIMWorkScheduleProperties.active_work_schedule_id = work_schedule.id() bpy.context.scene.BIMWorkScheduleProperties.editing_type = "WORK_SCHEDULE" @classmethod - def disable_editing_work_schedule(cls): + def disable_editing_work_schedule(cls) -> None: bpy.context.scene.BIMWorkScheduleProperties.active_work_schedule_id = 0 @classmethod - def enable_editing_work_schedule_tasks(cls, work_schedule): + def enable_editing_work_schedule_tasks(cls, work_schedule: Union[ifcopenshell.entity_instance, None]) -> None: if work_schedule: props = bpy.context.scene.BIMWorkScheduleProperties props.active_work_schedule_id = work_schedule.id() props.editing_type = "TASKS" @classmethod - def load_task_tree(cls, work_schedule): + def load_task_tree(cls, work_schedule: ifcopenshell.entity_instance) -> None: bpy.context.scene.BIMTaskTreeProperties.tasks.clear() props = bpy.context.scene.BIMWorkScheduleProperties cls.contracted_tasks = json.loads(props.contracted_tasks) @@ -142,7 +143,7 @@ class Sequence(blenderbim.core.tool.Sequence): cls.create_new_task_li(related_object_id, 0) @classmethod - def get_sorted_tasks_ids(cls, tasks): + def get_sorted_tasks_ids(cls, tasks: list[ifcopenshell.entity_instance]) -> list[int]: def get_sort_key(task): # Sorting only applies to actual tasks, not the WBS # for rel in task.IsNestedBy: @@ -170,7 +171,7 @@ class Sequence(blenderbim.core.tool.Sequence): return related_object_ids @classmethod - def create_new_task_li(cls, related_object_id, level_index): + def create_new_task_li(cls, related_object_id: int, level_index: int) -> None: task = tool.Ifc.get().by_id(related_object_id) new = bpy.context.scene.BIMTaskTreeProperties.tasks.add() new.ifc_definition_id = related_object_id @@ -182,8 +183,9 @@ class Sequence(blenderbim.core.tool.Sequence): for related_object_id in cls.get_sorted_tasks_ids(ifcopenshell.util.sequence.get_nested_tasks(task)): cls.create_new_task_li(related_object_id, level_index + 1) + # TODO: task argument is never used? @classmethod - def load_task_properties(cls, task=None): + def load_task_properties(cls, task: Optional[ifcopenshell.entity_instance] = None) -> None: props = bpy.context.scene.BIMWorkScheduleProperties task_props = bpy.context.scene.BIMTaskTreeProperties tasks_with_visual_bar = cls.get_task_bar_list() @@ -248,24 +250,24 @@ class Sequence(blenderbim.core.tool.Sequence): props.is_task_update_enabled = True @classmethod - def get_active_work_schedule(cls): + def get_active_work_schedule(cls) -> Union[ifcopenshell.entity_instance, None]: if not bpy.context.scene.BIMWorkScheduleProperties.active_work_schedule_id: return None return tool.Ifc.get().by_id(bpy.context.scene.BIMWorkScheduleProperties.active_work_schedule_id) @classmethod - def expand_task(cls, task): + def expand_task(cls, task: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkScheduleProperties contracted_tasks = json.loads(props.contracted_tasks) contracted_tasks.remove(task.id()) props.contracted_tasks = json.dumps(contracted_tasks) @classmethod - def expand_all_tasks(cls): + def expand_all_tasks(cls) -> None: bpy.context.scene.BIMWorkScheduleProperties.contracted_tasks = json.dumps([]) @classmethod - def contract_all_tasks(cls): + def contract_all_tasks(cls) -> None: props = bpy.context.scene.BIMWorkScheduleProperties contracted_tasks = json.loads(props.contracted_tasks) for task_item in bpy.context.scene.BIMTaskTreeProperties.tasks: @@ -274,18 +276,18 @@ class Sequence(blenderbim.core.tool.Sequence): props.contracted_tasks = json.dumps(contracted_tasks) @classmethod - def contract_task(cls, task): + def contract_task(cls, task: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkScheduleProperties contracted_tasks = json.loads(props.contracted_tasks) contracted_tasks.append(task.id()) props.contracted_tasks = json.dumps(contracted_tasks) @classmethod - def disable_work_schedule(cls): + def disable_work_schedule(cls) -> None: bpy.context.scene.BIMWorkScheduleProperties.active_work_schedule_id = 0 @classmethod - def disable_selecting_deleted_task(cls): + def disable_selecting_deleted_task(cls) -> None: props = bpy.context.scene.BIMWorkScheduleProperties if props.active_task_id not in [ task.ifc_definition_id for task in bpy.context.scene.BIMTaskTreeProperties.tasks @@ -294,7 +296,7 @@ class Sequence(blenderbim.core.tool.Sequence): bpy.context.scene.BIMWorkScheduleProperties.active_task_time_id = 0 @classmethod - def get_checked_tasks(cls): + def get_checked_tasks(cls) -> list[ifcopenshell.entity_instance]: return [ tool.Ifc.get().by_id(task.ifc_definition_id) for task in bpy.context.scene.BIMTaskTreeProperties.tasks @@ -302,39 +304,39 @@ class Sequence(blenderbim.core.tool.Sequence): ] or [] @classmethod - def get_task_attribute_value(cls, attribute_name): + def get_task_attribute_value(cls, attribute_name: str) -> Any: return bpy.context.scene.BIMWorkScheduleProperties.task_attributes.get(attribute_name).get_value() @classmethod - def get_active_task(cls): + def get_active_task(cls) -> ifcopenshell.entity_instance: return tool.Ifc.get().by_id(bpy.context.scene.BIMWorkScheduleProperties.active_task_id) @classmethod - def get_active_work_time(cls): + def get_active_work_time(cls) -> ifcopenshell.entity_instance: return tool.Ifc.get().by_id(bpy.context.scene.BIMWorkCalendarProperties.active_work_time_id) @classmethod - def get_task_time(cls, task): - return task.TaskTime if task.TaskTime else None + def get_task_time(cls, task: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: + return task.TaskTime or None @classmethod - def load_task_attributes(cls, task): + def load_task_attributes(cls, task: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.task_attributes.clear() blenderbim.bim.helper.import_attributes2(task, props.task_attributes) @classmethod - def enable_editing_task_attributes(cls, task): + def enable_editing_task_attributes(cls, task: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.active_task_id = task.id() props.editing_task_type = "ATTRIBUTES" @classmethod - def get_task_attributes(cls): + def get_task_attributes(cls) -> dict[str, Any]: return blenderbim.bim.helper.export_attributes(bpy.context.scene.BIMWorkScheduleProperties.task_attributes) @classmethod - def load_task_time_attributes(cls, task_time): + def load_task_time_attributes(cls, task_time: ifcopenshell.entity_instance) -> None: def callback(name, prop, data): if prop and prop.data_type == "string": duration_props = bpy.context.scene.BIMWorkScheduleProperties.durations_attributes.add() @@ -358,20 +360,20 @@ class Sequence(blenderbim.core.tool.Sequence): blenderbim.bim.helper.import_attributes2(task_time, props.task_time_attributes, callback) @classmethod - def enable_editing_task_time(cls, task): + def enable_editing_task_time(cls, task: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.active_task_id = task.id() props.active_task_time_id = task.TaskTime.id() props.editing_task_type = "TASKTIME" @classmethod - def disable_editing_task(cls): + def disable_editing_task(cls) -> None: bpy.context.scene.BIMWorkScheduleProperties.active_task_id = 0 bpy.context.scene.BIMWorkScheduleProperties.active_task_time_id = 0 bpy.context.scene.BIMWorkScheduleProperties.editing_task_type = "" @classmethod - def get_task_time_attributes(cls): + def get_task_time_attributes(cls) -> dict[str, Any]: def callback(attributes, prop): if "Start" in prop.name or "Finish" in prop.name or prop.name == "StatusTime": if prop.is_null: @@ -400,7 +402,7 @@ class Sequence(blenderbim.core.tool.Sequence): return blenderbim.bim.helper.export_attributes(props.task_time_attributes, callback) @classmethod - def load_task_resources(cls, task): + def load_task_resources(cls, task: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkScheduleProperties rprops = bpy.context.scene.BIMResourceProperties props.task_resources.clear() @@ -413,36 +415,38 @@ class Sequence(blenderbim.core.tool.Sequence): rprops.is_resource_update_enabled = True @classmethod - def get_task_inputs(cls, task): + def get_task_inputs(cls, task: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: is_deep = bpy.context.scene.BIMWorkScheduleProperties.show_nested_inputs return ifcopenshell.util.sequence.get_task_inputs(task, is_deep) @classmethod - def get_task_outputs(cls, task): + def get_task_outputs(cls, task: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: is_deep = bpy.context.scene.BIMWorkScheduleProperties.show_nested_outputs return ifcopenshell.util.sequence.get_task_outputs(task, is_deep) @classmethod - def are_entities_same_class(cls, entities): + def are_entities_same_class(cls, entities: list[ifcopenshell.entity_instance]) -> bool: if not entities: return False if len(entities) == 1: return True - first = entities[0] + first_class = entities[0].is_a() for entity in entities: - if entity.is_a() != first.is_a(): + if entity.is_a() != first_class: return False return True @classmethod - def get_task_resources(cls, task): + def get_task_resources( + cls, task: Union[ifcopenshell.entity_instance, None] + ) -> Union[list[ifcopenshell.entity_instance], None]: if not task: return is_deep = bpy.context.scene.BIMWorkScheduleProperties.show_nested_resources return ifcopenshell.util.sequence.get_task_resources(task, is_deep) @classmethod - def load_task_inputs(cls, inputs): + def load_task_inputs(cls, inputs: list[ifcopenshell.entity_instance]) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.task_inputs.clear() for input in inputs: @@ -451,7 +455,7 @@ class Sequence(blenderbim.core.tool.Sequence): new.name = input.Name or "Unnamed" @classmethod - def load_task_outputs(cls, outputs): + def load_task_outputs(cls, outputs: list[ifcopenshell.entity_instance]) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.task_outputs.clear() if outputs: @@ -461,7 +465,7 @@ class Sequence(blenderbim.core.tool.Sequence): new.name = output.Name or "Unnamed" @classmethod - def get_highlighted_task(cls): + def get_highlighted_task(cls) -> Union[ifcopenshell.entity_instance, None]: tasks = bpy.context.scene.BIMTaskTreeProperties.tasks if len(tasks) and len(tasks) > bpy.context.scene.BIMWorkScheduleProperties.active_task_index: return tool.Ifc.get().by_id( @@ -469,11 +473,11 @@ class Sequence(blenderbim.core.tool.Sequence): ) @classmethod - def get_direct_nested_tasks(cls, task): + def get_direct_nested_tasks(cls, task: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return ifcopenshell.util.sequence.get_nested_tasks(task) @classmethod - def get_direct_task_outputs(cls, task): + def get_direct_task_outputs(cls, task: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return ifcopenshell.util.sequence.get_direct_task_outputs(task) @classmethod @@ -482,34 +486,34 @@ class Sequence(blenderbim.core.tool.Sequence): return ifcopenshell.util.sequence.get_task_outputs(task, is_deep) @classmethod - def enable_editing_work_calendar_times(cls, work_calendar): + def enable_editing_work_calendar_times(cls, work_calendar: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkCalendarProperties props.active_work_calendar_id = work_calendar.id() props.editing_type = "WORKTIMES" @classmethod - def load_work_calendar_attributes(cls, work_calendar): + def load_work_calendar_attributes(cls, work_calendar: ifcopenshell.entity_instance) -> dict[str, Any]: props = bpy.context.scene.BIMWorkCalendarProperties props.work_calendar_attributes.clear() return blenderbim.bim.helper.import_attributes2(work_calendar, props.work_calendar_attributes) @classmethod - def enable_editing_work_calendar(cls, work_calendar): + def enable_editing_work_calendar(cls, work_calendar: ifcopenshell.entity_instance) -> None: bpy.context.scene.BIMWorkCalendarProperties.active_work_calendar_id = work_calendar.id() bpy.context.scene.BIMWorkCalendarProperties.editing_type = "ATTRIBUTES" @classmethod - def disable_editing_work_calendar(cls): + def disable_editing_work_calendar(cls) -> None: bpy.context.scene.BIMWorkCalendarProperties.active_work_calendar_id = 0 @classmethod - def get_work_calendar_attributes(cls): + def get_work_calendar_attributes(cls) -> dict[str, Any]: return blenderbim.bim.helper.export_attributes( bpy.context.scene.BIMWorkCalendarProperties.work_calendar_attributes ) @classmethod - def load_work_time_attributes(cls, work_time): + def load_work_time_attributes(cls, work_time: ifcopenshell.entity_instance) -> None: def callback(name, prop, data): if name in ["Start", "Finish"]: prop.string_value = "" if prop.is_null else data[name] @@ -521,7 +525,7 @@ class Sequence(blenderbim.core.tool.Sequence): blenderbim.bim.helper.import_attributes2(work_time, props.work_time_attributes, callback) @classmethod - def enable_editing_work_time(cls, work_time): + def enable_editing_work_time(cls, work_time: ifcopenshell.entity_instance) -> None: def initialise_recurrence_components(props): if len(props.day_components) == 0: for i in range(0, 31): @@ -568,7 +572,7 @@ class Sequence(blenderbim.core.tool.Sequence): props.editing_type = "WORKTIMES" @classmethod - def get_work_time_attributes(cls): + def get_work_time_attributes(cls) -> dict[str, Any]: def callback(attributes, prop): if "Start" in prop.name or "Finish" in prop.name: if prop.is_null: @@ -608,11 +612,11 @@ class Sequence(blenderbim.core.tool.Sequence): return attributes @classmethod - def disable_editing_work_time(cls): + def disable_editing_work_time(cls) -> None: bpy.context.scene.BIMWorkCalendarProperties.active_work_time_id = 0 @classmethod - def get_recurrence_pattern_times(cls): + def get_recurrence_pattern_times(cls) -> Union[tuple[datetime, datetime], None]: props = bpy.context.scene.BIMWorkCalendarProperties try: start_time = parser.parse(props.start_time) @@ -622,40 +626,40 @@ class Sequence(blenderbim.core.tool.Sequence): return # improve UI / refactor to add user hints @classmethod - def reset_time_period(cls): + def reset_time_period(cls) -> None: bpy.context.scene.BIMWorkCalendarProperties.start_time = "" bpy.context.scene.BIMWorkCalendarProperties.end_time = "" @classmethod - def enable_editing_task_calendar(cls, task): + def enable_editing_task_calendar(cls, task: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.active_task_id = task.id() props.editing_task_type = "CALENDAR" @classmethod - def enable_editing_task_sequence(cls): + def enable_editing_task_sequence(cls) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.editing_task_type = "SEQUENCE" @classmethod - def disable_editing_task_time(cls): + def disable_editing_task_time(cls) -> None: bpy.context.scene.BIMWorkScheduleProperties.active_task_id = 0 bpy.context.scene.BIMWorkScheduleProperties.active_task_time_id = 0 @classmethod - def load_rel_sequence_attributes(cls, rel_sequence): + def load_rel_sequence_attributes(cls, rel_sequence: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.sequence_attributes.clear() blenderbim.bim.helper.import_attributes2(rel_sequence, props.sequence_attributes) @classmethod - def enable_editing_rel_sequence_attributes(cls, rel_sequence): + def enable_editing_rel_sequence_attributes(cls, rel_sequence: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.active_sequence_id = rel_sequence.id() props.editing_sequence_type = "ATTRIBUTES" @classmethod - def load_lag_time_attributes(cls, lag_time): + def load_lag_time_attributes(cls, lag_time: ifcopenshell.entity_instance) -> None: def callback(name, prop, data): if name == "LagValue": prop = bpy.context.scene.BIMWorkScheduleProperties.lag_time_attributes.add() @@ -673,21 +677,21 @@ class Sequence(blenderbim.core.tool.Sequence): blenderbim.bim.helper.import_attributes2(lag_time, props.lag_time_attributes, callback) @classmethod - def enable_editing_sequence_lag_time(cls, rel_sequence): + def enable_editing_sequence_lag_time(cls, rel_sequence: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.active_sequence_id = rel_sequence.id() props.editing_sequence_type = "LAG_TIME" @classmethod - def get_rel_sequence_attributes(cls): + def get_rel_sequence_attributes(cls) -> dict[str, Any]: return blenderbim.bim.helper.export_attributes(bpy.context.scene.BIMWorkScheduleProperties.sequence_attributes) @classmethod - def disable_editing_rel_sequence(cls): + def disable_editing_rel_sequence(cls) -> None: bpy.context.scene.BIMWorkScheduleProperties.active_sequence_id = 0 @classmethod - def get_lag_time_attributes(cls): + def get_lag_time_attributes(cls) -> dict[str, Any]: return blenderbim.bim.helper.export_attributes(bpy.context.scene.BIMWorkScheduleProperties.lag_time_attributes) @classmethod @@ -698,14 +702,14 @@ class Sequence(blenderbim.core.tool.Sequence): obj.select_set(True) if obj else None @classmethod - def add_task_column(cls, column_type, name, data_type): + def add_task_column(cls, column_type: str, name: str, data_type: str): props = bpy.context.scene.BIMWorkScheduleProperties new = props.columns.add() new.name = f"{column_type}.{name}" new.data_type = data_type @classmethod - def setup_default_task_columns(cls): + def setup_default_task_columns(cls) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.columns.clear() default_columns = ["ScheduleStart", "ScheduleFinish", "ScheduleDuration"] @@ -715,14 +719,14 @@ class Sequence(blenderbim.core.tool.Sequence): new.data_type = "string" @classmethod - def remove_task_column(cls, name): + def remove_task_column(cls, name: str) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.columns.remove(props.columns.find(name)) if props.sort_column == name: props.sort_column = "" @classmethod - def set_task_sort_column(cls, column): + def set_task_sort_column(cls, column: str) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.sort_column = column @@ -743,7 +747,7 @@ class Sequence(blenderbim.core.tool.Sequence): return related_tasks @classmethod - def get_work_schedule(cls, task): + def get_work_schedule(cls, task: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: for rel in task.HasAssignments or []: if rel.is_a("IfcRelAssignsToControl") and rel.RelatingControl.is_a("IfcWorkSchedule"): return rel.RelatingControl @@ -779,8 +783,9 @@ class Sequence(blenderbim.core.tool.Sequence): expanded_tasks = [item.ifc_definition_id for item in task_props.tasks] bpy.context.scene.BIMWorkScheduleProperties.active_task_index = expanded_tasks.index(task.id()) or 0 + # TODO: proper typing @classmethod - def guess_date_range(cls, work_schedule): + def guess_date_range(cls, work_schedule: ifcopenshell.entity_instance) -> tuple[Any, Any]: return ifcopenshell.util.sequence.guess_date_range(work_schedule) @classmethod @@ -792,7 +797,7 @@ class Sequence(blenderbim.core.tool.Sequence): props.visualisation_finish = ifcopenshell.util.date.canonicalise_time(finish_date) @classmethod - def get_animation_bar_tasks(cls): + def get_animation_bar_tasks(cls) -> list[ifcopenshell.entity_instance]: return [tool.Ifc.get().by_id(task_id) for task_id in cls.get_task_bar_list()] @classmethod @@ -1076,19 +1081,19 @@ class Sequence(blenderbim.core.tool.Sequence): predefined_type_item.color = data["Color"] @classmethod - def get_start_date(cls): + def get_start_date(cls) -> Union[datetime, None]: start = parser.parse(bpy.context.scene.BIMWorkScheduleProperties.visualisation_start, dayfirst=True, fuzzy=True) - return start if start else None + return start or None @classmethod - def get_finish_date(cls): + def get_finish_date(cls) -> Union[datetime, None]: finish = parser.parse( bpy.context.scene.BIMWorkScheduleProperties.visualisation_finish, dayfirst=True, fuzzy=True ) - return finish if finish else None + return finish or None @classmethod - def process_construction_state(cls, work_schedule, date): + def process_construction_state(cls, work_schedule: ifcopenshell.entity_instance, date: datetime) -> dict[str, Any]: cls.to_build = set() cls.in_construction = set() cls.completed = set() @@ -1109,7 +1114,7 @@ class Sequence(blenderbim.core.tool.Sequence): } @classmethod - def process_task_status(cls, task, date): + def process_task_status(cls, task: ifcopenshell.entity_instance, date: datetime) -> None: for rel in task.IsNestedBy or []: [cls.process_task_status(related_object, date) for related_object in rel.RelatedObjects] start = ifcopenshell.util.sequence.derive_date(task, "ScheduleStart", is_earliest=True) @@ -1234,7 +1239,7 @@ class Sequence(blenderbim.core.tool.Sequence): } @classmethod - def get_animation_product_frames(cls, work_schedule, settings): + def get_animation_product_frames(cls, work_schedule: ifcopenshell.entity_instance, settings: dict[str, Any]): def preprocess_task(task): for subtask in ifcopenshell.util.sequence.get_nested_tasks(task): preprocess_task(subtask) @@ -1445,7 +1450,7 @@ class Sequence(blenderbim.core.tool.Sequence): append_handler(animate_text_handler) @classmethod - def create_tasks_json(cls, work_schedule=None): + def create_tasks_json(cls, work_schedule: ifcopenshell.entity_instance) -> list[dict[str, Any]]: sequence_type_map = { None: "FS", "START_START": "SS", @@ -1535,7 +1540,9 @@ class Sequence(blenderbim.core.tool.Sequence): cls.create_new_task_json(nested_task, json, type_map, baseline_schedule) @classmethod - def generate_gantt_browser_chart(cls, task_json, work_schedule): + def generate_gantt_browser_chart( + cls, task_json: list[dict[str, Any]], work_schedule: ifcopenshell.entity_instance + ) -> None: with open(os.path.join(bpy.context.scene.BIMProperties.data_dir, "gantt", "index.html"), "w") as f: with open(os.path.join(bpy.context.scene.BIMProperties.data_dir, "gantt", "index.mustache"), "r") as t: task_b64 = base64.b64encode(bytes(json.dumps(task_json), "utf-8")).decode("utf-8") @@ -1545,15 +1552,19 @@ class Sequence(blenderbim.core.tool.Sequence): webbrowser.open("file://" + os.path.join(bpy.context.scene.BIMProperties.data_dir, "gantt", "index.html")) @classmethod - def is_filter_by_active_schedule(cls): + def is_filter_by_active_schedule(cls) -> bool: return bpy.context.scene.BIMWorkScheduleProperties.filter_by_active_schedule @classmethod - def get_tasks_for_product(cls, product, work_schedule=None): + def get_tasks_for_product( + cls, product: ifcopenshell.entity_instance, work_schedule: Optional[ifcopenshell.entity_instance] = None + ) -> tuple[list[ifcopenshell.entity_instance], list[ifcopenshell.entity_instance]]: return ifcopenshell.util.sequence.get_tasks_for_product(product, work_schedule) @classmethod - def load_product_related_tasks(cls, task_inputs, task_ouputs): + def load_product_related_tasks( + cls, task_inputs: list[ifcopenshell.entity_instance], task_ouputs: list[ifcopenshell.entity_instance] + ) -> None: props = bpy.context.scene.BIMWorkScheduleProperties props.product_input_tasks.clear() props.product_output_tasks.clear() @@ -1567,7 +1578,9 @@ class Sequence(blenderbim.core.tool.Sequence): new.ifc_definition_id = task.id() @classmethod - def get_work_schedule_products(cls, work_schedule): + def get_work_schedule_products( + cls, work_schedule: ifcopenshell.entity_instance + ) -> list[ifcopenshell.entity_instance]: products = [] for task in ifcopenshell.util.sequence.get_root_tasks(work_schedule): products.extend(ifcopenshell.util.sequence.get_task_inputs(task, is_deep=True)) @@ -1615,7 +1628,7 @@ class Sequence(blenderbim.core.tool.Sequence): bpy.ops.view3d.camera_to_view_selected() @classmethod - def save_animation_color_scheme(cls, name): + def save_animation_color_scheme(cls, name: str) -> ifcopenshell.entity_instance: props = bpy.context.scene.BIMAnimationProperties colour_scheme = { "Inputs": {cs.name: cs.color[0:3] for cs in props.task_input_colors}, @@ -1634,7 +1647,7 @@ class Sequence(blenderbim.core.tool.Sequence): return group[0] @classmethod - def load_animation_color_scheme(cls, scheme): + def load_animation_color_scheme(cls, scheme: Optional[ifcopenshell.entity_instance]) -> None: if not scheme: return data = json.loads(scheme.Description) diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index 057b0eabf1..bd1ecb634b 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -148,7 +148,7 @@ class Spatial(blenderbim.core.tool.Spatial): target_obj.matrix_world = relative_to_obj.matrix_world @ matrix @classmethod - def select_products(cls, products, unhide=False): + def select_products(cls, products: list[ifcopenshell.entity_instance], unhide: bool = False) -> None: bpy.ops.object.select_all(action="DESELECT") for product in products: obj = tool.Ifc.get_object(product) diff --git a/src/blenderbim/blenderbim/tool/system.py b/src/blenderbim/blenderbim/tool/system.py index cb0753d60f..11a683030b 100644 --- a/src/blenderbim/blenderbim/tool/system.py +++ b/src/blenderbim/blenderbim/tool/system.py @@ -19,6 +19,9 @@ import bpy import ifcopenshell.util.element import ifcopenshell.util.system +import blenderbim.bim.helper +import blenderbim.core.geometry +import blenderbim.core.root import blenderbim.core.tool import blenderbim.tool as tool from blenderbim.bim import import_ifc diff --git a/src/blenderbim/test/tool/test_qto.py b/src/blenderbim/test/tool/test_qto.py index 1e13207c0c..e00f74618d 100644 --- a/src/blenderbim/test/tool/test_qto.py +++ b/src/blenderbim/test/tool/test_qto.py @@ -18,8 +18,10 @@ import bpy import ifcopenshell +import ifcopenshell.api import test.bim.bootstrap import blenderbim.core.tool +import blenderbim.core.root import blenderbim.tool as tool from blenderbim.tool.qto import Qto as subject from blenderbim.bim.module.pset.qto_calculator import QtoCalculator diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index b08fa050f3..5529197ffd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -21,7 +21,10 @@ import math import bmesh import ifcopenshell.util.unit from mathutils import Vector, Matrix -from typing import Union, Optional, Literal, Any +from typing import Union, Optional, Literal, Any, TYPE_CHECKING + +if TYPE_CHECKING: + from blenderbim.bim.module.geometry.helper import Helper Z_AXIS = Vector((0, 0, 1)) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py index 597463a3e5..b559a66d5f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/map_representation.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +from typing import Any def map_representation( @@ -29,7 +30,10 @@ def map_representation( class Usecase: - def execute(self): + file: ifcopenshell.file + settings: dict[str, Any] + + def execute(self) -> ifcopenshell.entity_instance: mapping_source = self.get_mapping_source() zero = self.file.createIfcCartesianPoint((0.0, 0.0, 0.0)) @@ -49,7 +53,7 @@ class Usecase: } ) - def get_mapping_source(self): + def get_mapping_source(self) -> ifcopenshell.entity_instance: for inverse in self.file.get_inverse(self.settings["representation"]): if inverse.is_a("IfcRepresentationMap"): return inverse diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py index 05ec24adff..b34d6bc6eb 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell +import ifcopenshell.api import ifcopenshell.util.element diff --git a/src/ifcopenshell-python/ifcopenshell/util/sequence.py b/src/ifcopenshell-python/ifcopenshell/util/sequence.py index 04bb4ad555..fc661fc07f 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/sequence.py +++ b/src/ifcopenshell-python/ifcopenshell/util/sequence.py @@ -351,7 +351,7 @@ def get_direct_task_outputs(task: ifcopenshell.entity_instance) -> list[ifcopens ] -def get_task_outputs(task: ifcopenshell.entity_instance, is_deep=False): +def get_task_outputs(task: ifcopenshell.entity_instance, is_deep: bool = False) -> list[ifcopenshell.entity_instance]: if not is_deep: return get_direct_task_outputs(task) else: @@ -362,7 +362,7 @@ def get_task_outputs(task: ifcopenshell.entity_instance, is_deep=False): ] -def get_task_inputs(task: ifcopenshell.entity_instance, is_deep=False): +def get_task_inputs(task: ifcopenshell.entity_instance, is_deep: bool = False) -> list[ifcopenshell.entity_instance]: if not is_deep: return [ object @@ -385,7 +385,7 @@ def get_task_inputs(task: ifcopenshell.entity_instance, is_deep=False): ] -def get_task_resources(task: ifcopenshell.entity_instance, is_deep=False): +def get_task_resources(task: ifcopenshell.entity_instance, is_deep: bool = False) -> list[ifcopenshell.entity_instance]: if not is_deep: return [ object From ec28d3d0aff6ebec270e4a7608ad64cf9ebbb7fa Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 17:03:30 +0500 Subject: [PATCH 271/429] black format --- src/blenderbim/blenderbim/tool/sequence.py | 24 ++++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/sequence.py b/src/blenderbim/blenderbim/tool/sequence.py index 2f571effb4..8d36a975d4 100644 --- a/src/blenderbim/blenderbim/tool/sequence.py +++ b/src/blenderbim/blenderbim/tool/sequence.py @@ -835,12 +835,16 @@ class Sequence(blenderbim.core.tool.Sequence): def create_task_bar_data(tasks, vertical_increment, collection): props = bpy.context.scene.BIMWorkScheduleProperties settings = { - "viz_start": parser.parse(props.visualisation_start, dayfirst=True, fuzzy=True) - if props.visualisation_start - else None, - "viz_finish": parser.parse(props.visualisation_finish, dayfirst=True, fuzzy=True) - if props.visualisation_finish - else None, + "viz_start": ( + parser.parse(props.visualisation_start, dayfirst=True, fuzzy=True) + if props.visualisation_start + else None + ), + "viz_finish": ( + parser.parse(props.visualisation_finish, dayfirst=True, fuzzy=True) + if props.visualisation_finish + else None + ), "start_frame": bpy.context.scene.frame_start, "end_frame": bpy.context.scene.frame_end, } @@ -1518,9 +1522,11 @@ class Sequence(blenderbim.core.tool.Sequence): "pParent": task.Nests[0].RelatingObject.id() if task.Nests else 0, "pOpen": 1, "pCost": 1, - "ifcduration": str(ifcopenshell.util.date.ifc2datetime(task_time.ScheduleDuration)) - if (task_time and task_time.ScheduleDuration) - else "", + "ifcduration": ( + str(ifcopenshell.util.date.ifc2datetime(task_time.ScheduleDuration)) + if (task_time and task_time.ScheduleDuration) + else "" + ), "resourceUsage": resources_usage, } if task_time and task_time.IsCritical: From 6a8b59f2cf3385377b71b8344f6d76319c51409b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 17:37:33 +0500 Subject: [PATCH 272/429] remove unused code 1) core.enable_editing_task was outdated, tool.enable_editing_task doesn't exist 2) tool.get_task_outputs was duplicated --- src/blenderbim/blenderbim/core/sequence.py | 4 ---- src/blenderbim/blenderbim/tool/sequence.py | 5 ----- 2 files changed, 9 deletions(-) diff --git a/src/blenderbim/blenderbim/core/sequence.py b/src/blenderbim/blenderbim/core/sequence.py index e6d2a1eebf..510caa8a04 100644 --- a/src/blenderbim/blenderbim/core/sequence.py +++ b/src/blenderbim/blenderbim/core/sequence.py @@ -155,10 +155,6 @@ def add_task( sequence.load_task_properties() -def enable_editing_task(sequence, task=None) -> None: - sequence.enable_editing_task(task) - - def enable_editing_task_attributes(sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> None: sequence.load_task_attributes(task) sequence.enable_editing_task_attributes(task) diff --git a/src/blenderbim/blenderbim/tool/sequence.py b/src/blenderbim/blenderbim/tool/sequence.py index 8d36a975d4..8cd078710c 100644 --- a/src/blenderbim/blenderbim/tool/sequence.py +++ b/src/blenderbim/blenderbim/tool/sequence.py @@ -480,11 +480,6 @@ class Sequence(blenderbim.core.tool.Sequence): def get_direct_task_outputs(cls, task: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return ifcopenshell.util.sequence.get_direct_task_outputs(task) - @classmethod - def get_task_outputs(cls, task): - is_deep = bpy.context.scene.BIMWorkScheduleProperties.show_nested_outputs - return ifcopenshell.util.sequence.get_task_outputs(task, is_deep) - @classmethod def enable_editing_work_calendar_times(cls, work_calendar: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMWorkCalendarProperties From 59a19a1a7015922b698c59bd7c799e43abbf366f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 18:53:22 +0500 Subject: [PATCH 273/429] disable adding cost schedule columns with an empty name example - https://i.imgur.com/5lGdI2X.png --- src/blenderbim/blenderbim/bim/module/cost/operator.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/cost/operator.py b/src/blenderbim/blenderbim/bim/module/cost/operator.py index 70ee62f399..df1e52523d 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cost/operator.py @@ -533,6 +533,13 @@ class AddCostColumn(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} name: bpy.props.StringProperty() + @classmethod + def poll(cls, context): + if not context.scene.BIMCostProperties.cost_column: + cls.poll_message_set("Cost column name is empty") + return False + return True + def execute(self, context): core.add_cost_column(tool.Cost, self.name) return {"FINISHED"} From 7a44f9e8a709a0be92ed235906677fd472c06223 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 24 May 2024 18:54:23 +0500 Subject: [PATCH 274/429] different columns for different cost schedules #4724 though columns are still stored in .blend file and not in .ifc Example - https://imgur.com/a/N6epGZ4 --- .../blenderbim/bim/module/cost/__init__.py | 1 + .../blenderbim/bim/module/cost/operator.py | 2 +- .../blenderbim/bim/module/cost/prop.py | 7 ++- src/blenderbim/blenderbim/core/cost.py | 4 +- src/blenderbim/blenderbim/tool/cost.py | 50 +++++++++++++++++++ 5 files changed, 61 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/__init__.py b/src/blenderbim/blenderbim/bim/module/cost/__init__.py index d279ad317c..1d8e59c6fe 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/cost/__init__.py @@ -82,6 +82,7 @@ classes = ( prop.CostItem, prop.CostItemQuantity, prop.CostItemType, + prop.ScheduleColumn, prop.BIMCostProperties, ui.BIM_PT_cost_schedules, ui.BIM_PT_cost_item_quantities, diff --git a/src/blenderbim/blenderbim/bim/module/cost/operator.py b/src/blenderbim/blenderbim/bim/module/cost/operator.py index df1e52523d..3b384cf60c 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/operator.py +++ b/src/blenderbim/blenderbim/bim/module/cost/operator.py @@ -73,7 +73,7 @@ class RemoveCostSchedule(bpy.types.Operator, tool.Ifc.Operator): cost_schedule: bpy.props.IntProperty() def _execute(self, context): - core.remove_cost_schedule(tool.Ifc, cost_schedule=tool.Ifc.get().by_id(self.cost_schedule)) + core.remove_cost_schedule(tool.Ifc, tool.Cost, cost_schedule=tool.Ifc.get().by_id(self.cost_schedule)) class EnableEditingCostSchedule(bpy.types.Operator): diff --git a/src/blenderbim/blenderbim/bim/module/cost/prop.py b/src/blenderbim/blenderbim/bim/module/cost/prop.py index 370b58d9b7..d35cad5446 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/prop.py +++ b/src/blenderbim/blenderbim/bim/module/cost/prop.py @@ -175,6 +175,10 @@ def update_active_cost_item_resources(self, context): bpy.ops.bim.load_cost_item_resource_quantities() +class ScheduleColumn(PropertyGroup): + schedule_id: IntProperty() + + class BIMCostProperties(PropertyGroup): cost_schedule_predefined_types: EnumProperty( items=get_schedule_predefined_types, name="Predefined Type", default=None @@ -216,7 +220,8 @@ class BIMCostProperties(PropertyGroup): default=False, ) should_show_currency_ui: BoolProperty(name="Should Show Currency UI", default=False) - columns: CollectionProperty(name="Columns", type=StrProperty) + columns: CollectionProperty(name="Active Schedule Columns", type=StrProperty) + columns_storage: CollectionProperty(name="Columns", type=ScheduleColumn) active_column_index: IntProperty(name="Active Column Index") cost_item_products: CollectionProperty(name="Cost Item Products", type=CostItemQuantity) active_cost_item_product_index: IntProperty(name="Active Cost Item Product Index") diff --git a/src/blenderbim/blenderbim/core/cost.py b/src/blenderbim/blenderbim/core/cost.py index 9d4c4048f1..f95f70a3b8 100644 --- a/src/blenderbim/blenderbim/core/cost.py +++ b/src/blenderbim/blenderbim/core/cost.py @@ -39,8 +39,9 @@ def disable_editing_cost_schedule(cost: tool.Cost): cost.disable_editing_cost_schedule() -def remove_cost_schedule(ifc: tool.Ifc, cost_schedule: ifcopenshell.entity_instance): +def remove_cost_schedule(ifc: tool.Ifc, cost: tool.Cost, cost_schedule: ifcopenshell.entity_instance) -> None: ifc.run("cost.remove_cost_schedule", cost_schedule=cost_schedule) + cost.remove_stored_schedule_columns(cost_schedule) def enable_editing_cost_schedule_attributes(cost: tool.Cost, cost_schedule: ifcopenshell.entity_instance): @@ -50,6 +51,7 @@ def enable_editing_cost_schedule_attributes(cost: tool.Cost, cost_schedule: ifco def enable_editing_cost_items(cost: tool.Cost, cost_schedule: ifcopenshell.entity_instance): cost.enable_editing_cost_items(cost_schedule) + cost.load_active_schedule_columns() cost.load_cost_schedule_tree() cost.play_sound() diff --git a/src/blenderbim/blenderbim/tool/cost.py b/src/blenderbim/blenderbim/tool/cost.py index 527eadf7dc..9fb849e5c2 100644 --- a/src/blenderbim/blenderbim/tool/cost.py +++ b/src/blenderbim/blenderbim/tool/cost.py @@ -19,9 +19,59 @@ class Cost(blenderbim.core.tool.Cost): @classmethod def disable_editing_cost_schedule(cls): + cls.store_active_schedule_columns() bpy.context.scene.BIMCostProperties.active_cost_schedule_id = 0 cls.disable_editing_cost_item() + @classmethod + def load_active_schedule_columns(cls) -> None: + props = bpy.context.scene.BIMCostProperties + active_columns = props.columns + storage = props.columns_storage + active_cost_schedule_id = cls.get_active_cost_schedule().id() + + # store column names to keep the original order + cols_to_add = [] + + # collection property only support removal by index + for storage_col_i, storage_col in reversed(list(enumerate(storage[:]))): + if storage_col.schedule_id != active_cost_schedule_id: + continue + cols_to_add.insert(0, storage_col.name) + # We don't store active schedule columns in storage + # so it will be easy to edit them. + storage.remove(storage_col_i) + + for col_name in cols_to_add: + col = active_columns.add() + col.name = col_name + + @classmethod + def store_active_schedule_columns(cls) -> None: + props = bpy.context.scene.BIMCostProperties + active_columns = props.columns + storage = props.columns_storage + active_cost_schedule_id = cls.get_active_cost_schedule().id() + + for col in active_columns: + storage_col = storage.add() + storage_col.name = col.name + storage_col.schedule_id = active_cost_schedule_id + + props.columns.clear() + + @classmethod + def remove_stored_schedule_columns(cls, cost_schedule: ifcopenshell.entity_instance) -> None: + props = bpy.context.scene.BIMCostProperties + storage = props.columns_storage + active_cost_schedule_id = cost_schedule.id() + + # collection property only support removal by index + for storage_col_i, storage_col in reversed(list(enumerate(storage[:]))): + if storage_col.schedule_id != active_cost_schedule_id: + continue + storage.remove(storage_col_i) + @classmethod def enable_editing_cost_schedule_attributes(cls, cost_schedule): bpy.context.scene.BIMCostProperties.active_cost_schedule_id = cost_schedule.id() From 2f071bd809d925a1eaf49ee102e6b039227d423b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 25 May 2024 14:11:41 +1000 Subject: [PATCH 275/429] Material total now shows the total of the select material class, not all material classes This is more meaningful. Often the presence of sets will inflate the number artificially. --- .../blenderbim/bim/module/material/data.py | 28 +++++-------------- .../blenderbim/bim/module/material/prop.py | 6 +++- .../blenderbim/bim/module/material/ui.py | 2 +- 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/data.py b/src/blenderbim/blenderbim/bim/module/material/data.py index 69015b1390..ee2aba7826 100644 --- a/src/blenderbim/blenderbim/bim/module/material/data.py +++ b/src/blenderbim/blenderbim/bim/module/material/data.py @@ -36,31 +36,17 @@ class MaterialsData: @classmethod def load(cls): - cls.data = { - "total_materials": cls.total_materials(), - "material_types": cls.material_types(), - "profiles": cls.profiles(), - "styles": cls.styles(), - "contexts": cls.contexts(), - "active_styles": cls.active_styles(), - } cls.is_loaded = True + cls.data["material_types"] = cls.material_types() + cls.data["total_materials"] = cls.total_materials() + cls.data["profiles"] = cls.profiles() + cls.data["styles"] = cls.styles() + cls.data["contexts"] = cls.contexts() + cls.data["active_styles"] = cls.active_styles() @classmethod def total_materials(cls): - if tool.Ifc.get_schema() == "IFC2X3": - return ( - len(tool.Ifc.get().by_type("IfcMaterial")) - + len(tool.Ifc.get().by_type("IfcMaterialLayerSet")) - + len(tool.Ifc.get().by_type("IfcMaterialList")) - ) - return ( - len(tool.Ifc.get().by_type("IfcMaterial")) - + len(tool.Ifc.get().by_type("IfcMaterialConstituentSet")) - + len(tool.Ifc.get().by_type("IfcMaterialLayerSet")) - + len(tool.Ifc.get().by_type("IfcMaterialProfileSet")) - + len(tool.Ifc.get().by_type("IfcMaterialList")) - ) + return len(tool.Ifc.get().by_type(bpy.context.scene.BIMMaterialProperties.material_type)) @classmethod def material_types(cls): diff --git a/src/blenderbim/blenderbim/bim/module/material/prop.py b/src/blenderbim/blenderbim/bim/module/material/prop.py index f414a8138e..9374ac67cf 100644 --- a/src/blenderbim/blenderbim/bim/module/material/prop.py +++ b/src/blenderbim/blenderbim/bim/module/material/prop.py @@ -97,6 +97,10 @@ def get_material_types(self, context): return MaterialsData.data["material_types"] +def update_material_type(self, context): + MaterialsData.data["total_materials"] = MaterialsData.total_materials() + + def get_profiles(self, context): if not MaterialsData.is_loaded: MaterialsData.load() @@ -126,7 +130,7 @@ class Material(PropertyGroup): class BIMMaterialProperties(PropertyGroup): is_editing: BoolProperty(name="Is Editing", default=False) - material_type: EnumProperty(items=get_material_types, name="Material Type") + material_type: EnumProperty(items=get_material_types, update=update_material_type, name="Material Type") materials: CollectionProperty(name="Materials", type=Material) active_material_index: IntProperty(name="Active Material Index") profiles: EnumProperty(items=get_profiles, name="Profiles") diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index c5ee393d8b..958c778cc4 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -45,7 +45,7 @@ class BIM_PT_materials(Panel): self.props = context.scene.BIMMaterialProperties row = self.layout.row(align=True) - row.label(text="{} Materials".format(MaterialsData.data["total_materials"]), icon="NODE_MATERIAL") + row.label(text=f"{MaterialsData.data['total_materials']} Materials", icon="NODE_MATERIAL") if self.props.is_editing: row.operator("bim.disable_editing_materials", text="", icon="CANCEL") else: From d85f9af7909d1cf2e8947e30471d2c55d1458fd7 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 25 May 2024 14:42:45 +1000 Subject: [PATCH 276/429] The API can now copy material sets too --- .../api/material/copy_material.py | 87 ++++++++++++------- .../test/api/material/test_copy_material.py | 71 ++++++++++++++- 2 files changed, 125 insertions(+), 33 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py index 5655fa97da..6e51a5f14b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py @@ -21,12 +21,15 @@ import ifcopenshell.util.element def copy_material(file: ifcopenshell.file, material: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: - """Copies a material + """Copies a material or material set All material psets and styles are copied. The copied material is not associated to any elements. - :param material: The IfcMaterial to copy + If a material set is copied, the set items are also copied. However the + underlying materials (and profiles) used within the set items are reused. + + :param material: The IfcMaterialDefinition to copy :type material: ifcopenshell.entity_instance :return: The new copy of the material :rtype: ifcopenshell.entity_instance @@ -40,34 +43,54 @@ def copy_material(file: ifcopenshell.file, material: ifcopenshell.entity_instanc # Let's duplicate the concrete material concrete_copy = ifcopenshell.api.run("material.copy_material", model, material=concrete) """ - settings = {"material": material} - - if settings["material"].is_a("IfcMaterial"): - new = ifcopenshell.util.element.copy(file, settings["material"]) - for inverse in file.get_inverse(settings["material"]): - if inverse.is_a("IfcMaterialProperties"): - # Properties must not be shared between objects for convenience of authoring - inverse = ifcopenshell.util.element.copy(file, inverse) - inverse.Material = new - - props_attribute = "Properties" - if file.schema == "IFC2X3": - if not inverse.is_a("IfcExtendedMaterialProperties"): - continue - props_attribute = "ExtendedProperties" - - props = getattr(inverse, props_attribute) - if not props: - continue - - copied_props = [] - for pset in props: - copied_props.append(ifcopenshell.util.element.copy_deep(file, pset)) - setattr(inverse, props_attribute, copied_props) - - elif inverse.is_a("IfcMaterialDefinitionRepresentation"): - inverse = ifcopenshell.util.element.copy_deep( - file, inverse, exclude=["IfcRepresentationContext", "IfcMaterial"] - ) - inverse.RepresentedMaterial = new + if material.is_a("IfcMaterial"): + return _copy_material_with_inverses(file, material) + elif material.is_a("IfcMaterialConstituentSet"): + new = _copy_material_with_inverses(file, material) + new.MaterialConstituents = [copy_material(file, i) for i in material.MaterialConstituents] return new + elif material.is_a("IfcMaterialConstituent"): + return _copy_material_with_inverses(file, material) + elif material.is_a("IfcMaterialLayerSet"): + new = _copy_material_with_inverses(file, material) + new.MaterialLayers = [copy_material(file, i) for i in material.MaterialLayers] + return new + elif material.is_a("IfcMaterialLayer"): + return _copy_material_with_inverses(file, material) + elif material.is_a("IfcMaterialProfileSet"): + new = _copy_material_with_inverses(file, material) + new.MaterialProfiles = [copy_material(file, i) for i in material.MaterialProfiles] + return new + elif material.is_a("IfcMaterialProfile"): + return _copy_material_with_inverses(file, material) + + +def _copy_material_with_inverses(file, material): + new = ifcopenshell.util.element.copy(file, material) + for inverse in file.get_inverse(material): + if inverse.is_a("IfcMaterialProperties"): + # Properties must not be shared between objects for convenience of authoring + inverse = ifcopenshell.util.element.copy(file, inverse) + inverse.Material = new + + props_attribute = "Properties" + if file.schema == "IFC2X3": + if not inverse.is_a("IfcExtendedMaterialProperties"): + continue + props_attribute = "ExtendedProperties" + + props = getattr(inverse, props_attribute) + if not props: + continue + + copied_props = [] + for pset in props: + copied_props.append(ifcopenshell.util.element.copy_deep(file, pset)) + setattr(inverse, props_attribute, copied_props) + + elif inverse.is_a("IfcMaterialDefinitionRepresentation"): + inverse = ifcopenshell.util.element.copy_deep( + file, inverse, exclude=["IfcRepresentationContext", "IfcMaterial"] + ) + inverse.RepresentedMaterial = new + return new diff --git a/src/ifcopenshell-python/test/api/material/test_copy_material.py b/src/ifcopenshell-python/test/api/material/test_copy_material.py index 623814c266..dd53621dcd 100644 --- a/src/ifcopenshell-python/test/api/material/test_copy_material.py +++ b/src/ifcopenshell-python/test/api/material/test_copy_material.py @@ -72,5 +72,74 @@ class TestCopyMaterial(test.bootstrap.IFC4): assert new.HasRepresentation[0].Representations[0] != material.HasRepresentation[0].Representations[0] assert new.HasRepresentation[0].Representations[0].ContextOfItems == context + def test_copy_a_material_constituent_set(self): + material = ifcopenshell.api.run("material.add_material", self.file, name="CON01") + material_set = ifcopenshell.api.run( + "material.add_material_set", self.file, name="Foo", set_type="IfcMaterialConstituentSet" + ) + item = ifcopenshell.api.run( + "material.add_constituent", self.file, constituent_set=material_set, material=material + ) + + new = ifcopenshell.api.run("material.copy_material", self.file, material=material_set) + assert new != material_set + assert new.Name == "Foo" + assert new.MaterialConstituents[0] != item + assert new.MaterialConstituents[0].Material == material + assert len(self.file.by_type("IfcMaterialConstituentSet")) == 2 + assert len(self.file.by_type("IfcMaterialConstituent")) == 2 + assert len(self.file.by_type("IfcMaterial")) == 1 + + def test_copy_a_material_layer_set(self): + material = ifcopenshell.api.run("material.add_material", self.file, name="CON01") + material_set = ifcopenshell.api.run( + "material.add_material_set", self.file, name="Foo", set_type="IfcMaterialLayerSet" + ) + item = ifcopenshell.api.run("material.add_layer", self.file, layer_set=material_set, material=material) + + new = ifcopenshell.api.run("material.copy_material", self.file, material=material_set) + assert new != material_set + assert new.LayerSetName == "Foo" + assert new.MaterialLayers[0] != item + assert new.MaterialLayers[0].Material == material + assert len(self.file.by_type("IfcMaterialLayerSet")) == 2 + assert len(self.file.by_type("IfcMaterialLayer")) == 2 + assert len(self.file.by_type("IfcMaterial")) == 1 + + def test_copy_a_material_profile_set(self): + material = ifcopenshell.api.run("material.add_material", self.file, name="CON01") + profile = self.file.create_entity( + "IfcIShapeProfileDef", + ProfileName="HEA100", + ProfileType="AREA", + OverallWidth=100, + OverallDepth=96, + WebThickness=5, + FlangeThickness=8, + FilletRadius=12, + ) + material_set = ifcopenshell.api.run( + "material.add_material_set", self.file, name="Foo", set_type="IfcMaterialProfileSet" + ) + item = ifcopenshell.api.run( + "material.add_profile", self.file, profile_set=material_set, material=material, profile=profile + ) + + new = ifcopenshell.api.run("material.copy_material", self.file, material=material_set) + assert new != material_set + assert new.Name == "Foo" + assert new.MaterialProfiles[0] != item + assert new.MaterialProfiles[0].Material == material + assert new.MaterialProfiles[0].Profile == profile + assert len(self.file.by_type("IfcMaterialProfileSet")) == 2 + assert len(self.file.by_type("IfcMaterialProfile")) == 2 + assert len(self.file.by_type("IfcMaterial")) == 1 + assert len(self.file.by_type("IfcProfileDef")) == 1 + + class TestCopyMaterialIFC2X3(test.bootstrap.IFC2X3, TestCopyMaterial): - pass + def test_copy_a_material_constituent_set(self): + return + + def test_copy_a_material_profile_set(self): + return From 16c5fd56ca99d6f47f6b25e7918e2e72df77f9fb Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 25 May 2024 15:13:36 +1000 Subject: [PATCH 277/429] You can now copy a material list --- .../ifcopenshell/api/material/copy_material.py | 2 ++ .../test/api/material/test_copy_material.py | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py index 6e51a5f14b..535f4f5b44 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py @@ -63,6 +63,8 @@ def copy_material(file: ifcopenshell.file, material: ifcopenshell.entity_instanc return new elif material.is_a("IfcMaterialProfile"): return _copy_material_with_inverses(file, material) + elif material.is_a("IfcMaterialList"): + return _copy_material_with_inverses(file, material) def _copy_material_with_inverses(file, material): diff --git a/src/ifcopenshell-python/test/api/material/test_copy_material.py b/src/ifcopenshell-python/test/api/material/test_copy_material.py index dd53621dcd..e9c2d599d4 100644 --- a/src/ifcopenshell-python/test/api/material/test_copy_material.py +++ b/src/ifcopenshell-python/test/api/material/test_copy_material.py @@ -136,6 +136,17 @@ class TestCopyMaterial(test.bootstrap.IFC4): assert len(self.file.by_type("IfcMaterial")) == 1 assert len(self.file.by_type("IfcProfileDef")) == 1 + def test_copy_a_material_list(self): + material = ifcopenshell.api.run("material.add_material", self.file, name="CON01") + material_set = ifcopenshell.api.run("material.add_material_set", self.file, set_type="IfcMaterialList") + ifcopenshell.api.run("material.add_list_item", self.file, material_list=material_set, material=material) + + new = ifcopenshell.api.run("material.copy_material", self.file, material=material_set) + assert new != material_set + assert new.Materials[0] == material + assert len(self.file.by_type("IfcMaterialList")) == 2 + assert len(self.file.by_type("IfcMaterial")) == 1 + class TestCopyMaterialIFC2X3(test.bootstrap.IFC2X3, TestCopyMaterial): def test_copy_a_material_constituent_set(self): From fd62ba63a56059f5c670ff42f78b7e752f530d58 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 25 May 2024 15:14:07 +1000 Subject: [PATCH 278/429] Do not copy presentation styles when copying a material Ideally, presentation styles are reused. For example, 5 types of concrete can all use the same presentation --- .../ifcopenshell/api/material/copy_material.py | 5 ++++- .../test/api/material/test_copy_material.py | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py index 535f4f5b44..2bb91a4ba7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py @@ -29,6 +29,9 @@ def copy_material(file: ifcopenshell.file, material: ifcopenshell.entity_instanc If a material set is copied, the set items are also copied. However the underlying materials (and profiles) used within the set items are reused. + If a material is associated with a presentation style, that presentation + style is reused. + :param material: The IfcMaterialDefinition to copy :type material: ifcopenshell.entity_instance :return: The new copy of the material @@ -92,7 +95,7 @@ def _copy_material_with_inverses(file, material): elif inverse.is_a("IfcMaterialDefinitionRepresentation"): inverse = ifcopenshell.util.element.copy_deep( - file, inverse, exclude=["IfcRepresentationContext", "IfcMaterial"] + file, inverse, exclude=["IfcRepresentationContext", "IfcMaterial", "IfcPresentationStyle"] ) inverse.RepresentedMaterial = new return new diff --git a/src/ifcopenshell-python/test/api/material/test_copy_material.py b/src/ifcopenshell-python/test/api/material/test_copy_material.py index e9c2d599d4..3f88d6732d 100644 --- a/src/ifcopenshell-python/test/api/material/test_copy_material.py +++ b/src/ifcopenshell-python/test/api/material/test_copy_material.py @@ -67,6 +67,7 @@ class TestCopyMaterial(test.bootstrap.IFC4): ifcopenshell.api.run("style.assign_material_style", self.file, material=material, style=style, context=context) new = ifcopenshell.api.run("material.copy_material", self.file, material=material) assert new.Name == "CON01" + assert len(self.file.by_type("IfcPresentationStyle")) == 1 assert len(self.file.by_type("IfcMaterialDefinitionRepresentation")) == 2 assert new.HasRepresentation[0] != material.HasRepresentation[0] assert new.HasRepresentation[0].Representations[0] != material.HasRepresentation[0].Representations[0] From b087aa09d948d5d202242afc8bcf7fe39f78e8f5 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 25 May 2024 15:15:12 +1000 Subject: [PATCH 279/429] Deprecate old material panel in the material tab and reimplement material duplication in the material manager The material duplication now 1) actually creates a new blender material 2) uses the API to duplicate. One less panel outside our scene tab. --- .../bim/module/material/__init__.py | 2 - .../bim/module/material/operator.py | 47 ++++++------------- .../blenderbim/bim/module/material/ui.py | 25 +--------- 3 files changed, 17 insertions(+), 57 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/__init__.py b/src/blenderbim/blenderbim/bim/module/material/__init__.py index 037befdbfd..ab63c8043e 100644 --- a/src/blenderbim/blenderbim/bim/module/material/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/material/__init__.py @@ -30,7 +30,6 @@ classes = ( operator.AssignMaterial, operator.AssignParameterizedProfile, operator.ContractMaterialCategory, - operator.CopyMaterial, operator.DisableEditingAssignedMaterial, operator.DisableEditingMaterial, operator.DisableEditingMaterialSetItem, @@ -64,7 +63,6 @@ classes = ( prop.BIMMaterialProperties, prop.BIMObjectMaterialProperties, ui.BIM_PT_materials, - ui.BIM_PT_material, ui.BIM_PT_object_material, ui.BIM_UL_materials, ) diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index b132332e5d..b4f4487bba 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -141,8 +141,19 @@ class DuplicateMaterial(bpy.types.Operator, tool.Ifc.Operator): material: bpy.props.IntProperty(name="Material ID") def _execute(self, context): - ifc_file = tool.Ifc.get() - tool.Material.duplicate_material(ifc_file.by_id(self.material)) + material = tool.Ifc.get().by_id(self.material) + new = tool.Ifc.run("material.copy_material", material=material) + + blender_material = tool.Ifc.get_object(material) + new_blender = blender_material.copy() + new_blender.use_fake_user = True + tool.Ifc.link(new, new_blender) + + if not new.is_a("IfcMaterialList"): + name = new[0] + " Copy" + new[0] = name + new_blender.name = name + material_prop_purge() bpy.ops.bim.load_materials() @@ -185,9 +196,10 @@ class UnlinkMaterial(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.unlink_material" bl_label = "Unlink Material" bl_options = {"REGISTER", "UNDO"} + material: bpy.props.IntProperty(name="Material ID") def _execute(self, context): - core.unlink_material(tool.Ifc, obj=context.active_object.active_material) + core.unlink_material(tool.Ifc, obj=tool.Ifc.get_object(tool.Ifc.get().by_id(self.material))) class AssignMaterial(bpy.types.Operator, tool.Ifc.Operator): @@ -679,35 +691,6 @@ class EditMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.bim.disable_editing_material_set_item(obj=obj.name) -class CopyMaterial(bpy.types.Operator, tool.Ifc.Operator): - bl_idname = "bim.copy_material" - bl_label = "Copy Material" - bl_options = {"REGISTER", "UNDO"} - - def _execute(self, context): - blender_material = context.active_object.active_material - material = tool.Ifc.get_entity(blender_material) - - if tool.Ifc.has_changed_shading(blender_material): - blenderbim.core.style.update_style_colours(tool.Ifc, tool.Style, obj=blender_material) - - copied_material = ifcopenshell.api.run("material.copy_material", tool.Ifc.get(), material=material) - copied_blender_material = blender_material.copy() - copied_style = self.get_style(copied_material) - tool.Ifc.link(copied_material, copied_blender_material) - if copied_style: - tool.Ifc.link(copied_style, copied_blender_material) - context.active_object.active_material = copied_blender_material - - def get_style(self, material): - for material_representation in material.HasRepresentation: - for representation in material_representation.Representations: - for item in representation.Items: - for style in item.Styles: - if style.is_a("IfcSurfaceStyle"): - return style - - class ExpandMaterialCategory(bpy.types.Operator): bl_idname = "bim.expand_material_category" bl_label = "Expand Material Category" diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index 958c778cc4..3b74e7f8de 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -69,6 +69,8 @@ class BIM_PT_materials(Panel): op.material = material.ifc_definition_id op = row.operator("bim.enable_editing_material_style", text="", icon="SHADING_RENDERED") op.material = material.ifc_definition_id + op = row.operator("bim.unlink_material", icon="UNLINKED", text="") + op.material = material.ifc_definition_id row.operator("bim.remove_material", text="", icon="X").material = material.ifc_definition_id self.draw_editing_ui() @@ -114,29 +116,6 @@ class BIM_PT_materials(Panel): row.operator("bim.disable_editing_material", text="", icon="CANCEL") -class BIM_PT_material(Panel): - bl_label = "Material" - bl_idname = "BIM_PT_material" - bl_space_type = "PROPERTIES" - bl_region_type = "WINDOW" - bl_context = "material" - - @classmethod - def poll(cls, context): - return IfcStore.get_file() and context.active_object and context.active_object.active_material - - def draw(self, context): - row = self.layout.row(align=True) - material_id = context.active_object.active_material.BIMObjectProperties.ifc_definition_id - if bool(material_id): - row.operator("bim.remove_material", icon="X", text="Remove IFC Material").material = material_id - row.operator("bim.copy_material", icon="DUPLICATE", text="") - row.operator("bim.unlink_material", icon="UNLINKED", text="") - else: - op = row.operator("bim.add_material", icon="ADD", text="Create IFC Material") - op.obj = context.active_object.active_material.name - - class BIM_PT_object_material(Panel): bl_label = "Object Material" bl_idname = "BIM_PT_object_material" From d2198568b2bae1cd1b5904aeabd8d996d6de6c98 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 25 May 2024 23:30:18 +1000 Subject: [PATCH 280/429] Deprecate old style panel in the material tab and port over "unlink" operator. All the functionality is now possible with the style manager and prevents the user needing to know how Blender materials work or wrangle nodes themselves and magically have to comply with the glTF spec. --- .../blenderbim/bim/module/style/__init__.py | 2 - .../blenderbim/bim/module/style/data.py | 28 ------ .../blenderbim/bim/module/style/operator.py | 5 +- .../blenderbim/bim/module/style/ui.py | 89 ++----------------- src/blenderbim/blenderbim/core/style.py | 5 +- src/blenderbim/blenderbim/tool/material.py | 15 ++-- 6 files changed, 25 insertions(+), 119 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/style/__init__.py b/src/blenderbim/blenderbim/bim/module/style/__init__.py index becd598f33..fb1ece3cb0 100644 --- a/src/blenderbim/blenderbim/bim/module/style/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/style/__init__.py @@ -50,8 +50,6 @@ classes = ( prop.BIMStylesProperties, prop.BIMStyleProperties, ui.BIM_PT_styles, - ui.BIM_PT_style, - ui.BIM_PT_style_attributes, ui.BIM_UL_styles, ) diff --git a/src/blenderbim/blenderbim/bim/module/style/data.py b/src/blenderbim/blenderbim/bim/module/style/data.py index 0863e9623a..9a6cab4819 100644 --- a/src/blenderbim/blenderbim/bim/module/style/data.py +++ b/src/blenderbim/blenderbim/bim/module/style/data.py @@ -24,7 +24,6 @@ from ifcopenshell.util.doc import get_entity_doc def refresh(): StylesData.is_loaded = False - StyleAttributesData.is_loaded = False class StylesData: @@ -68,30 +67,3 @@ class StylesData: @classmethod def total_styles(cls): return len(tool.Ifc.get().by_type("IfcPresentationStyle")) - - -class StyleAttributesData: - data = {} - is_loaded = False - - @classmethod - def load(cls): - cls.data = { - "ifc_style_id": cls.ifc_style_id(), - "attributes": cls.attributes(), - } - cls.is_loaded = True - - @classmethod - def ifc_style_id(cls): - return bpy.context.active_object.active_material.BIMMaterialProperties.ifc_style_id - - @classmethod - def attributes(cls): - style = tool.Ifc.get().by_id(bpy.context.active_object.active_material.BIMMaterialProperties.ifc_style_id) - results = [] - for name, value in style.get_info().items(): - if name in ["id", "type", "Styles"]: - continue - results.append({"name": name, "value": str(value)}) - return results diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index e59e60da74..e8b0479f9c 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -28,6 +28,7 @@ from pathlib import Path from mathutils import Vector +# TODO: is this still relevant or can it be deleted? class UpdateStyleColours(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.update_style_colours" bl_label = "Save Current Shading Style" @@ -53,6 +54,7 @@ class UpdateStyleColours(bpy.types.Operator, tool.Ifc.Operator): self.report({"INFO"}, "Check the system console to see saved style properties") +# TODO: is this still relevant or can it be deleted? class UpdateStyleTextures(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.update_style_textures" bl_label = "Update Style Textures" @@ -93,9 +95,10 @@ class UnlinkStyle(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.unlink_style" bl_label = "Unlink Style" bl_options = {"REGISTER", "UNDO"} + style: bpy.props.IntProperty(default=0) def _execute(self, context): - core.unlink_style(tool.Ifc, tool.Style, obj=context.active_object.active_material) + core.unlink_style(tool.Ifc, style=tool.Ifc.get().by_id(self.style)) class EnableEditingStyle(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/blenderbim/blenderbim/bim/module/style/ui.py b/src/blenderbim/blenderbim/bim/module/style/ui.py index 5c1bdf06a9..571696b187 100644 --- a/src/blenderbim/blenderbim/bim/module/style/ui.py +++ b/src/blenderbim/blenderbim/bim/module/style/ui.py @@ -21,7 +21,7 @@ import blenderbim.bim.helper import blenderbim.tool as tool from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.style.data import StylesData, StyleAttributesData +from blenderbim.bim.module.style.data import StylesData from bl_ui.properties_material import MaterialButtonsPanel @@ -62,11 +62,11 @@ class BIM_PT_styles(Panel): row.operator("bim.enable_adding_presentation_style", text="", icon="ADD") if active_style: style = self.props.styles[self.props.active_style_index] - material_name = StylesData.data["styles_to_blender_material_names"][self.props.active_style_index] - material = bpy.data.materials[material_name] row.operator("bim.duplicate_style", text="", icon="DUPLICATE").style = style.ifc_definition_id row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF").style = style.ifc_definition_id + op = row.operator("bim.unlink_style", text="", icon="UNLINKED") + op.style = style.ifc_definition_id op = row.operator("bim.enable_editing_style", text="", icon="GREASEPENCIL") op.style = style.ifc_definition_id row.operator("bim.remove_style", text="", icon="X").style = style.ifc_definition_id @@ -93,9 +93,12 @@ class BIM_PT_styles(Panel): # style ui tools if active_style: row = self.layout.row(align=True) - row.prop(material.BIMStyleProperties, "active_style_type", icon="SHADING_RENDERED", text="") - op = row.operator("bim.update_current_style", icon="FILE_REFRESH", text="") - op.style_id = style.ifc_definition_id + material_name = StylesData.data["styles_to_blender_material_names"][self.props.active_style_index] + if material_name: # The user may have unlinked the style, so the material may not exist + material = bpy.data.materials[material_name] + row.prop(material.BIMStyleProperties, "active_style_type", icon="SHADING_RENDERED", text="") + op = row.operator("bim.update_current_style", icon="FILE_REFRESH", text="") + op.style_id = style.ifc_definition_id if self.props.style_type == "IfcSurfaceStyle": self.layout.label(text="Surface Style Element:") @@ -259,80 +262,6 @@ class BIM_PT_styles(Panel): row.operator("bim.disable_editing_style", text="", icon="CANCEL") -class BIM_PT_style(MaterialButtonsPanel, Panel): - bl_label = "Style" - bl_idname = "BIM_PT_style" - bl_space_type = "PROPERTIES" - bl_region_type = "WINDOW" - bl_context = "material" - - @classmethod - def poll(cls, context): - return ( - IfcStore.get_file() - and context.active_object is not None - and context.active_object.active_material is not None - ) - - def draw(self, context): - mat = context.material - props = mat.BIMMaterialProperties - row = self.layout.row(align=True) - if not props.ifc_style_id: - row.operator("bim.add_style", icon="ADD") - return - row = self.layout.row(align=True) - row.operator("bim.update_style_colours", icon="GREASEPENCIL") - row.operator("bim.update_style_textures", icon="TEXTURE", text="") - row.operator("bim.unlink_style", icon="UNLINKED", text="") - row.operator("bim.remove_style", icon="X", text="").style = props.ifc_style_id - - -class BIM_PT_style_attributes(Panel): - bl_label = "Style Attributes" - bl_idname = "BIM_PT_style_attributes" - bl_space_type = "PROPERTIES" - bl_region_type = "WINDOW" - bl_context = "material" - bl_parent_id = "BIM_PT_style" - - @classmethod - def poll(cls, context): - if not IfcStore.get_file(): - return False - try: - return bool(context.active_object.active_material.BIMMaterialProperties.ifc_style_id) - except: - return False - - def draw(self, context): - if not StyleAttributesData.is_loaded: - StyleAttributesData.load() - elif ( - context.active_object.active_material.BIMMaterialProperties.ifc_style_id - != StyleAttributesData.data["ifc_style_id"] - ): - StyleAttributesData.load() - - obj = context.active_object.active_material - mprops = obj.BIMMaterialProperties - props = obj.BIMStyleProperties - if props.is_editing: - row = self.layout.row(align=True) - row.operator("bim.edit_style", icon="CHECKMARK") - row.operator("bim.disable_editing_style", icon="CANCEL", text="") - blenderbim.bim.helper.draw_attributes(props.attributes, self.layout) - else: - row = self.layout.row(align=True) - row.label(text="STEP ID") - row.label(text=str(mprops.ifc_style_id)) - - for attribute in StyleAttributesData.data["attributes"]: - row = self.layout.row(align=True) - row.label(text=attribute["name"]) - row.label(text=attribute["value"]) - - class BIM_UL_styles(UIList): def draw_item(self, context, layout, data, item, icon, active_data, active_propname): if item: diff --git a/src/blenderbim/blenderbim/core/style.py b/src/blenderbim/blenderbim/core/style.py index c700207894..13576cb80f 100644 --- a/src/blenderbim/blenderbim/core/style.py +++ b/src/blenderbim/blenderbim/core/style.py @@ -111,8 +111,9 @@ def update_style_textures(ifc, style, obj=None, representation=None): ifc.run("style.remove_surface_style", style=texture_style) -def unlink_style(ifc, style, obj=None): - ifc.unlink(obj=obj, element=style.get_style(obj)) +def unlink_style(ifc, style=None): + obj = ifc.get_object(style) + ifc.unlink(obj=obj, element=style) def enable_editing_style(style, obj=None): diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index 03a7cf940d..5c76fa6197 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -38,12 +38,6 @@ class Material(blenderbim.core.tool.Material): def disable_editing_materials(cls): bpy.context.scene.BIMMaterialProperties.is_editing = False - @classmethod - def duplicate_material(cls, material: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: - new_material = ifcopenshell.util.element.copy_deep(tool.Ifc.get(), material) - new_material.Name = material.Name + "_copy" - return new_material - @classmethod def enable_editing_materials(cls): bpy.context.scene.BIMMaterialProperties.is_editing = True @@ -255,3 +249,12 @@ class Material(blenderbim.core.tool.Material): obj = tool.Ifc.get_object(style) if obj: obj.name = name + + @classmethod + def get_style(cls, material): + for material_representation in material.HasRepresentation: + for representation in material_representation.Representations: + for item in representation.Items: + for style in item.Styles: + if style.is_a("IfcSurfaceStyle"): + return style From 58a7ef62d781a8e1ed31d61115de2d027bf191e0 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sat, 25 May 2024 09:49:15 -0500 Subject: [PATCH 281/429] fix #4729: add a description and category when creating a new material --- .../blenderbim/bim/module/material/operator.py | 8 +++++++- src/blenderbim/blenderbim/core/material.py | 4 ++-- .../ifcopenshell/api/material/add_material.py | 15 +++++++++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index b4f4487bba..4578562b7e 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -120,6 +120,8 @@ class AddMaterial(bpy.types.Operator, tool.Ifc.Operator): bl_options = {"REGISTER", "UNDO"} obj: bpy.props.StringProperty(name="Material Name") name: bpy.props.StringProperty(default="Default") + category: bpy.props.StringProperty(default="") + description: bpy.props.StringProperty(default="") def invoke(self, context, event): return context.window_manager.invoke_props_dialog(self) @@ -127,10 +129,14 @@ class AddMaterial(bpy.types.Operator, tool.Ifc.Operator): def draw(self, context): row = self.layout row.prop(self, "name", text="Name") + row = self.layout + row.prop(self, "description", text="Description") + row = self.layout + row.prop(self, "category", text="Category") def _execute(self, context): obj = bpy.data.materials.get(self.obj) if self.obj else None - core.add_material(tool.Ifc, tool.Material, tool.Style, obj=obj, name=self.name) + core.add_material(tool.Ifc, tool.Material, tool.Style, obj=obj, name=self.name, category=self.category, description=self.description) material_prop_purge() diff --git a/src/blenderbim/blenderbim/core/material.py b/src/blenderbim/blenderbim/core/material.py index 87a3ae9e0a..bd3eb87748 100644 --- a/src/blenderbim/blenderbim/core/material.py +++ b/src/blenderbim/blenderbim/core/material.py @@ -21,10 +21,10 @@ def unlink_material(ifc, obj=None): ifc.unlink(obj=obj) -def add_material(ifc, material, style, obj=None, name=None): +def add_material(ifc, material, style, obj=None, name=None, category=None, description=None): if not obj: obj = material.add_default_material_object(name) - ifc_material = ifc.run("material.add_material", name=material.get_name(obj)) + ifc_material = ifc.run("material.add_material", name=material.get_name(obj), category=category, description=description) ifc.link(ifc_material, obj) ifc_style = style.get_style(obj) if ifc_style: diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py index f8cd351e03..ad05948a03 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/add_material.py @@ -20,7 +20,7 @@ from typing import Optional def add_material( - file: ifcopenshell.file, name: Optional[str] = None, category: Optional[str] = None + file: ifcopenshell.file, name: Optional[str] = None, category: Optional[str] = None, description: Optional[str] = None ) -> ifcopenshell.entity_instance: """Adds a new material @@ -50,11 +50,16 @@ def add_material( Note that categories are not available in IFC2X3. This shortcoming is one of the big reasons projects should upgrade to IFC4. + Additionally, a material's description provides more information beyond + its name or category. + :param name: The name of the material, typically tagged in a finishes drawing or schedule. :type name: str, optional :param category: The category of the material. :type category: str, optional + :param description: A description of the material. + :type description: str, optional :return: The newly created IfcMaterial :rtype: ifcopenshell.entity_instance @@ -63,8 +68,8 @@ def add_material( .. code:: python # Let's create two materials with their respective categories - concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete") - steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel") + concrete = ifcopenshell.api.run("material.add_material", model, name="CON01", category="concrete", description="Garage Slab") + steel = ifcopenshell.api.run("material.add_material", model, name="ST01", category="steel", description="Corten Steel") # Let's imagine an urban concrete bench which is purely made out of concrete concrete_bench = ifcopenshell.api.run("root.create_entity", model, ifc_class="IfcFurnitureType") @@ -73,9 +78,11 @@ def add_material( # "Style" has been specified. ifcopenshell.api.run("material.assign_material", model, products=[concrete_bench], material=concrete) """ - settings = {"name": name or "Unnamed", "category": category} + settings = {"name": name or "Unnamed", "category": category, "description": description } material = file.create_entity("IfcMaterial", **{"Name": settings["name"] or "Unnamed"}) if settings["category"]: material.Category = settings["category"] + if settings["description"]: + material.Description = settings["description"] return material From dac9bfe3d42c252b12719647b4bcab2f0c760d9c Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sat, 25 May 2024 10:37:52 -0500 Subject: [PATCH 282/429] Add backticks to copied error message --- src/blenderbim/blenderbim/bim/module/debug/operator.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/debug/operator.py b/src/blenderbim/blenderbim/bim/module/debug/operator.py index 8a53d6de83..badec38b69 100644 --- a/src/blenderbim/blenderbim/bim/module/debug/operator.py +++ b/src/blenderbim/blenderbim/bim/module/debug/operator.py @@ -40,7 +40,7 @@ from blenderbim.bim.ifc import IfcStore class CopyDebugInformation(bpy.types.Operator): bl_idname = "bim.copy_debug_information" bl_label = "Copy Debug Information" - bl_description = "Copies debugging information to your clipboard for use in bugreports" + bl_description = "Copies debugging information to your clipboard for use in bug reports" def execute(self, context): info = get_debug_info() @@ -56,11 +56,13 @@ class CopyDebugInformation(bpy.types.Operator): text = format_debug_info(info) + text_with_backticks = f"```\n{text}\n```" + print("-" * 80) - print(text) + print(text_with_backticks) print("-" * 80) - context.window_manager.clipboard = text + context.window_manager.clipboard = text_with_backticks return {"FINISHED"} From 80d31b4e1ad9d0afd4215476fe4712c0059c19b0 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 26 May 2024 09:59:01 +1000 Subject: [PATCH 283/429] Move material psets to material manager. --- .../blenderbim/bim/module/pset/__init__.py | 6 ++- .../blenderbim/bim/module/pset/data.py | 9 +++- .../blenderbim/bim/module/pset/prop.py | 2 +- .../blenderbim/bim/module/pset/ui.py | 42 ++++++++----------- src/blenderbim/blenderbim/tool/blender.py | 4 +- src/blenderbim/blenderbim/tool/pset.py | 2 +- 6 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py index 1d4ca05324..a2c24a02e5 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/pset/__init__.py @@ -64,9 +64,9 @@ classes = ( def register(): bpy.types.Object.PsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.MaterialPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) bpy.types.Object.MaterialSetPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) bpy.types.Object.MaterialSetItemPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) - bpy.types.Material.PsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) bpy.types.Scene.TaskPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) bpy.types.Scene.ResourcePsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) bpy.types.Scene.GroupPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) @@ -79,7 +79,9 @@ def register(): def unregister(): del bpy.types.Object.PsetProperties - del bpy.types.Material.PsetProperties + del bpy.types.Object.MaterialPsetProperties + del bpy.types.Object.MaterialSetPsetProperties + del bpy.types.Object.MaterialSetItemPsetProperties del bpy.types.Scene.TaskPsetProperties del bpy.types.Scene.ResourcePsetProperties del bpy.types.Scene.GroupPsetProperties diff --git a/src/blenderbim/blenderbim/bim/module/pset/data.py b/src/blenderbim/blenderbim/bim/module/pset/data.py index 0c3093f3a5..dee548eeea 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/data.py +++ b/src/blenderbim/blenderbim/bim/module/pset/data.py @@ -157,9 +157,14 @@ class MaterialPsetsData(Data): @classmethod def load(cls): + ifc_definition_id = None + props = bpy.context.scene.BIMMaterialProperties + if props.materials and props.active_material_index < len(props.materials): + ifc_definition_id = props.materials[props.active_material_index].ifc_definition_id + cls.data = { - "ifc_definition_id": bpy.context.active_object.active_material.BIMObjectProperties.ifc_definition_id, - "psets": cls.psetqtos(tool.Ifc.get_entity(bpy.context.active_object.active_material)), + "ifc_definition_id": ifc_definition_id, + "psets": cls.psetqtos(tool.Ifc.get().by_id(ifc_definition_id)), } cls.is_loaded = True diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index 36c3f11362..c1814dec1f 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -69,7 +69,7 @@ def get_pset_name(self, context): results = get_material_set_pset_names(self, context) elif prop_type == "MaterialSetItemPsetProperties": results = get_material_set_item_pset_names(self, context) - elif "bpy.data.materials" in pset_type: + elif prop_type == "MaterialPsetProperties": results = get_material_pset_names(self, context) elif prop_type == "ResourcePsetProperties": results = get_resource_pset_names(self, context) diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index 16536c5940..ea5f881f17 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -79,13 +79,7 @@ def draw_enumerated_property(prop, layout, copy_operator=None): def get_active_pset_obj_name(context, obj_type): - if obj_type == "Object": - return context.active_object.name - elif obj_type == "Material": - return context.active_object.active_material.name - elif obj_type == "MaterialSet": - return context.active_object.name - elif obj_type == "MaterialSetItem": + if obj_type in ("Object", "Material", "MaterialSet", "MaterialSetItem"): return context.active_object.name return "" @@ -286,36 +280,36 @@ class BIM_PT_material_psets(Panel): bl_idname = "BIM_PT_material_psets" bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" - bl_context = "material" + bl_context = "scene" + bl_parent_id = "BIM_PT_materials" @classmethod def poll(cls, context): - if not context.active_object: - return False - if not context.active_object.active_material: - return False - props = context.active_object.active_material.BIMObjectProperties - if not props.ifc_definition_id: - return False - file = IfcStore.get_file() - if not file or file.schema == "IFC2X3": + ifc_file = tool.Ifc.get() + if not ifc_file or ifc_file.schema == "IFC2X3": return False # We don't support material psets in IFC2X3 because they suck - return True + props = context.scene.BIMMaterialProperties + if props.materials and props.active_material_index < len(props.materials): + material = props.materials[props.active_material_index] + if material.ifc_definition_id: + return True + return False def draw(self, context): + props = context.scene.BIMMaterialProperties + if props.materials and props.active_material_index < len(props.materials): + ifc_definition_id = props.materials[props.active_material_index].ifc_definition_id + if not MaterialPsetsData.is_loaded: MaterialPsetsData.load() - elif ( - context.active_object.active_material.BIMObjectProperties.ifc_definition_id - != MaterialPsetsData.data["ifc_definition_id"] - ): + elif ifc_definition_id != MaterialPsetsData.data["ifc_definition_id"]: MaterialPsetsData.load() - props = context.active_object.active_material.PsetProperties + props = context.scene.MaterialPsetProperties row = self.layout.row(align=True) prop_with_search(row, props, "pset_name", text="") op = row.operator("bim.add_pset", icon="ADD", text="") - op.obj = context.active_object.active_material.name + op.obj = context.active_object.name op.obj_type = "Material" if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET": diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 067158ec31..85780e38c3 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -144,7 +144,9 @@ class Blender(blenderbim.core.tool.Blender): if obj_type == "Object": return bpy.data.objects.get(obj).BIMObjectProperties.ifc_definition_id elif obj_type == "Material": - return bpy.data.materials.get(obj).BIMObjectProperties.ifc_definition_id + return context.scene.BIMMaterialProperties.materials[ + context.scene.BIMMaterialProperties.active_material_index + ].ifc_definition_id elif obj_type == "MaterialSet": return ifcopenshell.util.element.get_material( tool.Ifc.get_entity(bpy.data.objects.get(obj)), should_skip_usage=True diff --git a/src/blenderbim/blenderbim/tool/pset.py b/src/blenderbim/blenderbim/tool/pset.py index 110938fb9d..15ae5f3c11 100644 --- a/src/blenderbim/blenderbim/tool/pset.py +++ b/src/blenderbim/blenderbim/tool/pset.py @@ -40,7 +40,7 @@ class Pset(blenderbim.core.tool.Pset): if obj_type == "Object": return bpy.data.objects.get(obj).PsetProperties elif obj_type == "Material": - return bpy.data.materials.get(obj).PsetProperties + return bpy.context.scene.MaterialPsetProperties elif obj_type == "MaterialSet": return bpy.data.objects.get(obj).MaterialSetPsetProperties elif obj_type == "MaterialSetItem": From b9b0e81d250e59b7cf9e356214c042e3685782a5 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 26 May 2024 10:04:17 +1000 Subject: [PATCH 284/429] Move object materials panels further up and profile panel down Object materials panel is much more important and shouldn't be below the material manager. --- src/blenderbim/blenderbim/bim/__init__.py | 3 ++- .../blenderbim/bim/module/material/ui.py | 3 ++- src/blenderbim/blenderbim/bim/ui.py | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 20979d5360..37033001f2 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -154,9 +154,10 @@ classes = [ ui.BIM_PT_tab_representations, ui.BIM_PT_tab_geometric_relationships, ui.BIM_PT_tab_parametric_geometry, - ui.BIM_PT_tab_profiles, + ui.BIM_PT_tab_object_materials, ui.BIM_PT_tab_materials, ui.BIM_PT_tab_styles, + ui.BIM_PT_tab_profiles, # Drawings and documents ui.BIM_PT_tab_sheets, ui.BIM_PT_tab_drawings, diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index 3b74e7f8de..e9f369b65c 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -122,7 +122,8 @@ class BIM_PT_object_material(Panel): bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" bl_context = "scene" - bl_parent_id = "BIM_PT_tab_materials" + bl_parent_id = "BIM_PT_tab_object_materials" + bl_options = {"HIDE_HEADER"} @classmethod def poll(cls, context): diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index a20a44f85c..e00a1d449c 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -741,6 +741,21 @@ class BIM_PT_tab_parametric_geometry(Panel): pass +class BIM_PT_tab_object_materials(Panel): + bl_label = "Object Materials" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + bl_order = 1 + + @classmethod + def poll(cls, context): + return tool.Blender.is_tab(context, "GEOMETRY") and tool.Ifc.get() + + def draw(self, context): + pass + + class BIM_PT_tab_materials(Panel): bl_label = "Materials" bl_space_type = "PROPERTIES" From 9a59b8cdae6211f5ae5bb4a0a16a764869cc79f3 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 26 May 2024 11:23:08 +1000 Subject: [PATCH 285/429] Material psets now include category-specific psets and docstrings Previously it was not possible to get concrete / steel material psets. Yikes! --- .../blenderbim/bim/module/pset/data.py | 35 ++++++++++++++----- .../blenderbim/bim/module/pset/prop.py | 11 +++--- .../ifcopenshell/util/pset.py | 3 +- .../test/util/test_pset.py | 6 ++++ 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/data.py b/src/blenderbim/blenderbim/bim/module/pset/data.py index dee548eeea..92d0cf112c 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/data.py +++ b/src/blenderbim/blenderbim/bim/module/pset/data.py @@ -61,6 +61,15 @@ class Data: ) return sorted(results, key=lambda v: v["Name"]) + @classmethod + def format_pset_enum(cls, psets): + enum_items = [] + version = tool.Ifc.get_schema() + for pset in psets: + doc = ifcopenshell.util.doc.get_property_set_doc(version, pset.Name) or {} + enum_items.append((pset.Name, pset.Name, doc.get("description", ""))) + return enum_items + class ObjectPsetsData(Data): data = {} @@ -114,15 +123,6 @@ class ObjectPsetsData(Data): ) return cls.format_pset_enum(qtos) - @classmethod - def format_pset_enum(cls, psets): - enum_items = [] - version = tool.Ifc.get_schema() - for pset in psets: - doc = ifcopenshell.util.doc.get_property_set_doc(version, pset.Name) or {} - enum_items.append((pset.Name, pset.Name, doc.get("description", ""))) - return enum_items - class ObjectQtosData(Data): data = {} @@ -165,9 +165,26 @@ class MaterialPsetsData(Data): cls.data = { "ifc_definition_id": ifc_definition_id, "psets": cls.psetqtos(tool.Ifc.get().by_id(ifc_definition_id)), + "pset_name": cls.pset_name(), } cls.is_loaded = True + @classmethod + def pset_name(cls): + props = bpy.context.scene.BIMMaterialProperties + if props.materials and props.active_material_index < len(props.materials): + material = props.materials[props.active_material_index] + if material.ifc_definition_id: + material = tool.Ifc.get().by_id(material.ifc_definition_id) + category = getattr(material, "Category", None) or None + psets = blenderbim.bim.schema.ifc.psetqto.get_applicable("IfcMaterial", category, pset_only=True) + psetnames = cls.format_pset_enum(psets) + assigned_names = ifcopenshell.util.element.get_psets( + material, psets_only=True, should_inherit=False + ).keys() + return [p for p in psetnames if p[0] not in assigned_names] + return [] + class MaterialSetPsetsData(Data): data = {} diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index c1814dec1f..3834f4337e 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -23,7 +23,7 @@ import ifcopenshell.util.attribute import ifcopenshell.util.element import blenderbim.tool as tool from blenderbim.bim.prop import Attribute, StrProperty -from blenderbim.bim.module.pset.data import AddEditCustomPropertiesData, ObjectPsetsData +from blenderbim.bim.module.pset.data import AddEditCustomPropertiesData, ObjectPsetsData, MaterialPsetsData from blenderbim.bim.ifc import IfcStore from bpy.types import PropertyGroup from bpy.props import ( @@ -89,12 +89,9 @@ def get_object_pset_name(self, context): def get_material_pset_names(self, context): - global psetnames - ifc_class = "IfcMaterial" - if ifc_class not in psetnames: - psets = blenderbim.bim.schema.ifc.psetqto.get_applicable(ifc_class, pset_only=True) - psetnames[ifc_class] = blender_formatted_enum_from_psets(psets) - return psetnames[ifc_class] + if not MaterialPsetsData.is_loaded: + MaterialPsetsData.load() + return MaterialPsetsData.data["pset_name"] def get_material_set_pset_names(self, context): diff --git a/src/ifcopenshell-python/ifcopenshell/util/pset.py b/src/ifcopenshell-python/ifcopenshell/util/pset.py index 97db6ff4b2..13a6d0c5f8 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/pset.py +++ b/src/ifcopenshell-python/ifcopenshell/util/pset.py @@ -103,7 +103,8 @@ class PsetQto: matched_type = match.group(3) if matched_type and not predefined_type: continue - elif matched_type and predefined_type != match.group(3): + # Case insensitive to handle things like material categories + elif matched_type and predefined_type.lower() != match.group(3).lower(): continue applicable_class = match.group(1) diff --git a/src/ifcopenshell-python/test/util/test_pset.py b/src/ifcopenshell-python/test/util/test_pset.py index 649967b296..2eb5a3da5c 100644 --- a/src/ifcopenshell-python/test/util/test_pset.py +++ b/src/ifcopenshell-python/test/util/test_pset.py @@ -60,3 +60,9 @@ class TestPsetQto: names = self.pset_qto.get_applicable_names("IfcFurnitureType" ) names2 = self.pset_qto.get_applicable_names("IfcFurnitureType", "CUSTOM") assert names == names2 + + def test_getting_applicables_for_a_material_category(self): + names = self.pset_qto.get_applicable_names("IfcMaterial") + assert "Pset_MaterialConcrete" not in names + names = self.pset_qto.get_applicable_names("IfcMaterial", "concrete") + assert "Pset_MaterialConcrete" in names From 4279b769aa3dc900d5485d3c8302e1756dc32b0f Mon Sep 17 00:00:00 2001 From: "Sigma Dimensions (Yass)" <79010126+myoualid@users.noreply.github.com> Date: Sun, 26 May 2024 03:44:11 +0100 Subject: [PATCH 286/429] fix bcf viewpoint setup --- src/blenderbim/blenderbim/bim/module/bcf/operator.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/bcf/operator.py b/src/blenderbim/blenderbim/bim/module/bcf/operator.py index 990d756e39..dd39130483 100644 --- a/src/blenderbim/blenderbim/bim/module/bcf/operator.py +++ b/src/blenderbim/blenderbim/bim/module/bcf/operator.py @@ -938,7 +938,7 @@ class ActivateBcfViewpoint(bpy.types.Operator): # Operators with context overrides are used because they are # significantly faster than looping through all objects - exception_global_ids = {v.ifc_guid for v in viewpoint.visualization_info.components.visibility.exceptions or []} + exception_global_ids = {v.ifc_guid for v in viewpoint.visualization_info.components.visibility.exceptions.component or []} if viewpoint.visualization_info.components.visibility.default_visibility: old = context.area.type @@ -958,11 +958,13 @@ class ActivateBcfViewpoint(bpy.types.Operator): if objs: old = context.area.type context.area.type = "VIEW_3D" + bpy.ops.object.hide_view_clear() context_override = {} context_override["object"] = context_override["active_object"] = objs[0] context_override["selected_objects"] = context_override["selected_editable_objects"] = objs with context.temp_override(**context_override): bpy.ops.object.hide_view_set(unselected=True) + bpy.data.objects["Viewpoint"].hide_set(False) context.area.type = old if viewpoint.visualization_info.components.view_setup_hints: @@ -1000,6 +1002,7 @@ class ActivateBcfViewpoint(bpy.types.Operator): obj = IfcStore.get_element(global_id) if obj: obj.select_set(True) + obj.hide_set(False) def set_colours(self, viewpoint): global_id_colours = {} From 687bb32e3776fce5c9597eca720fe71f71fc2478 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 26 May 2024 16:33:46 +1000 Subject: [PATCH 287/429] Move material classification into scene tab. No more panels in the material tab! --- .../blenderbim/bim/module/classification/data.py | 16 ++++++++++------ .../blenderbim/bim/module/classification/ui.py | 16 +++++++++------- src/blenderbim/blenderbim/bim/module/pset/ui.py | 2 +- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/classification/data.py b/src/blenderbim/blenderbim/bim/module/classification/data.py index 369b087b13..46c5c3c591 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/data.py +++ b/src/blenderbim/blenderbim/bim/module/classification/data.py @@ -117,12 +117,16 @@ class MaterialClassificationsData(ReferencesData): @classmethod def references(cls): results = [] - element = tool.Ifc.get_entity(bpy.context.active_object.active_material) - if element: - for reference in ifcopenshell.util.classification.get_references(element): - data = reference.get_info() - del data["ReferencedSource"] - results.append(data) + + props = bpy.context.scene.BIMMaterialProperties + if props.materials and props.active_material_index < len(props.materials): + material = props.materials[props.active_material_index] + if material.ifc_definition_id: + element = tool.Ifc.get().by_id(material.ifc_definition_id) + for reference in ifcopenshell.util.classification.get_references(element): + data = reference.get_info() + del data["ReferencedSource"] + results.append(data) return results diff --git a/src/blenderbim/blenderbim/bim/module/classification/ui.py b/src/blenderbim/blenderbim/bim/module/classification/ui.py index 3423545462..2e165c76c1 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/ui.py +++ b/src/blenderbim/blenderbim/bim/module/classification/ui.py @@ -118,7 +118,6 @@ class BIM_PT_classifications(Panel): class ReferenceUI: def draw_ui(self, context): obj = context.active_object - self.oprops = obj.BIMObjectProperties self.sprops = context.scene.BIMClassificationProperties self.bprops = context.scene.BIMBSDDProperties self.props = obj.BIMClassificationReferenceProperties @@ -295,22 +294,25 @@ class BIM_PT_material_classifications(Panel, ReferenceUI): bl_options = {"DEFAULT_CLOSED"} bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" - bl_context = "material" + bl_context = "scene" + bl_parent_id = "BIM_PT_materials" @classmethod def poll(cls, context): if not tool.Ifc.get(): return False - try: - return bool(context.active_object.active_material.BIMObjectProperties.ifc_definition_id) - except: - return False + props = context.scene.BIMMaterialProperties + if props.materials and props.active_material_index < len(props.materials): + material = props.materials[props.active_material_index] + if material.ifc_definition_id: + return True + return False def draw(self, context): if not MaterialClassificationsData.is_loaded: MaterialClassificationsData.load() self.data = MaterialClassificationsData - self.obj = context.active_object.active_material.name + self.obj = "" self.obj_type = "Material" self.draw_ui(context) diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index ea5f881f17..4f63ec8063 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -309,7 +309,7 @@ class BIM_PT_material_psets(Panel): row = self.layout.row(align=True) prop_with_search(row, props, "pset_name", text="") op = row.operator("bim.add_pset", icon="ADD", text="") - op.obj = context.active_object.name + op.obj = "" op.obj_type = "Material" if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET": From 9ec8035a8db5e17dc520bd7bfd98de354b77dc40 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 26 May 2024 17:10:27 +1000 Subject: [PATCH 288/429] Add support for manual classification references for materials --- .../bim/module/classification/__init__.py | 4 +- .../bim/module/classification/data.py | 6 +- .../bim/module/classification/operator.py | 61 ++++++++++--------- .../bim/module/classification/ui.py | 4 +- .../blenderbim/bim/module/pset/__init__.py | 2 +- 5 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/classification/__init__.py b/src/blenderbim/blenderbim/bim/module/classification/__init__.py index 81dbac442b..db84b2b3a4 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/classification/__init__.py @@ -54,11 +54,11 @@ classes = ( def register(): bpy.types.Scene.BIMClassificationProperties = bpy.props.PointerProperty(type=prop.BIMClassificationProperties) - bpy.types.Object.BIMClassificationReferenceProperties = bpy.props.PointerProperty( + bpy.types.Scene.BIMClassificationReferenceProperties = bpy.props.PointerProperty( type=prop.BIMClassificationReferenceProperties ) def unregister(): del bpy.types.Scene.BIMClassificationProperties - del bpy.types.Object.BIMClassificationReferenceProperties + del bpy.types.Scene.BIMClassificationReferenceProperties diff --git a/src/blenderbim/blenderbim/bim/module/classification/data.py b/src/blenderbim/blenderbim/bim/module/classification/data.py index 46c5c3c591..942ae6809d 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/data.py +++ b/src/blenderbim/blenderbim/bim/module/classification/data.py @@ -88,7 +88,7 @@ class ClassificationReferencesData(ReferencesData): cls.data["references"] = cls.references() cls.data["active_classification_library"] = cls.active_classification_library() cls.data["classifications"] = cls.classifications() - cls.data["object_type"] = "OBJECT" + cls.data["object_type"] = "Object" @classmethod def references(cls): @@ -112,7 +112,7 @@ class MaterialClassificationsData(ReferencesData): cls.data["references"] = cls.references() cls.data["active_classification_library"] = cls.active_classification_library() cls.data["classifications"] = cls.classifications() - cls.data["object_type"] = "MATERIAL" + cls.data["object_type"] = "Material" @classmethod def references(cls): @@ -140,7 +140,7 @@ class CostClassificationsData(ReferencesData): cls.data["references"] = cls.references() cls.data["active_classification_library"] = cls.active_classification_library() cls.data["classifications"] = cls.classifications() - cls.data["object_type"] = "COST" + cls.data["object_type"] = "Cost" @classmethod def references(cls): diff --git a/src/blenderbim/blenderbim/bim/module/classification/operator.py b/src/blenderbim/blenderbim/bim/module/classification/operator.py index 7119edae3f..2536e2865b 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/operator.py +++ b/src/blenderbim/blenderbim/bim/module/classification/operator.py @@ -77,26 +77,37 @@ class AddManualClassificationReference(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_manual_classification_reference" bl_label = "Add Manual Classification Reference" bl_options = {"REGISTER", "UNDO"} + obj: bpy.props.StringProperty() obj_type: bpy.props.StringProperty() def _execute(self, context): - obj = context.active_object - props = obj.BIMClassificationReferenceProperties + if self.obj_type == "Object": + if context.selected_objects: + objects = [o.name for o in context.selected_objects] + else: + objects = [context.active_object.name] + else: + objects = [self.obj] + props = context.scene.BIMClassificationReferenceProperties attributes = blenderbim.bim.helper.export_attributes(props.reference_attributes) - product = tool.Ifc.get_entity(obj) - # TODO: refactor and support material and cost item classifications - classification = tool.Ifc.get().by_id(int(props.classifications)) - reference = ifcopenshell.api.run( - "classification.add_reference", - tool.Ifc.get(), - products=[product], - classification=classification, - identification="X", - name="Unnamed", - ) - ifcopenshell.api.run( - "classification.edit_reference", tool.Ifc.get(), reference=reference, attributes=attributes - ) + products = [ + tool.Ifc.get().by_id(ifc_definition_id) + for obj in objects + if (ifc_definition_id := tool.Blender.get_obj_ifc_definition_id(obj, self.obj_type, context)) + ] + if products: + classification = tool.Ifc.get().by_id(int(props.classifications)) + reference = ifcopenshell.api.run( + "classification.add_reference", + tool.Ifc.get(), + products=products, + classification=classification, + identification="X", + name="Unnamed", + ) + ifcopenshell.api.run( + "classification.edit_reference", tool.Ifc.get(), reference=reference, attributes=attributes + ) props.is_adding = False @@ -150,8 +161,7 @@ class EnableAddingManualClassificationReference(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} def execute(self, context): - obj = context.active_object - props = obj.BIMClassificationReferenceProperties + props = context.scene.BIMClassificationReferenceProperties props.is_adding = True props.reference_attributes.clear() blenderbim.bim.helper.import_attributes2("IfcClassificationReference", props.reference_attributes) @@ -164,8 +174,7 @@ class DisableAddingManualClassificationReference(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} def execute(self, context): - obj = context.active_object - props = obj.BIMClassificationReferenceProperties + props = context.scene.BIMClassificationReferenceProperties props.is_adding = False return {"FINISHED"} @@ -257,8 +266,7 @@ class EnableEditingClassificationReference(bpy.types.Operator): obj: bpy.props.StringProperty() def execute(self, context): - obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object - props = obj.BIMClassificationReferenceProperties + props = context.scene.BIMClassificationReferenceProperties props.reference_attributes.clear() blenderbim.bim.helper.import_attributes2(tool.Ifc.get().by_id(self.reference), props.reference_attributes) props.active_reference_id = self.reference @@ -272,8 +280,7 @@ class DisableEditingClassificationReference(bpy.types.Operator): obj: bpy.props.StringProperty() def execute(self, context): - obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object - obj.BIMClassificationReferenceProperties.active_reference_id = 0 + context.scene.BIMClassificationReferenceProperties.active_reference_id = 0 return {"FINISHED"} @@ -326,8 +333,7 @@ class EditClassificationReference(bpy.types.Operator, tool.Ifc.Operator): obj: bpy.props.StringProperty() def _execute(self, context): - obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object - props = obj.BIMClassificationReferenceProperties + props = context.scene.BIMClassificationReferenceProperties attributes = {} for attribute in props.reference_attributes: if attribute.is_null: @@ -368,9 +374,8 @@ class AddClassificationReference(bpy.types.Operator, tool.Ifc.Operator): classification = element break - ifc_file = tool.Ifc.get() products = [ - ifc_file.by_id(ifc_definition_id) + tool.Ifc.get().by_id(ifc_definition_id) for obj in objects if (ifc_definition_id := tool.Blender.get_obj_ifc_definition_id(obj, self.obj_type, context)) ] diff --git a/src/blenderbim/blenderbim/bim/module/classification/ui.py b/src/blenderbim/blenderbim/bim/module/classification/ui.py index 2e165c76c1..cdc2ef3356 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/ui.py +++ b/src/blenderbim/blenderbim/bim/module/classification/ui.py @@ -120,7 +120,7 @@ class ReferenceUI: obj = context.active_object self.sprops = context.scene.BIMClassificationProperties self.bprops = context.scene.BIMBSDDProperties - self.props = obj.BIMClassificationReferenceProperties + self.props = context.scene.BIMClassificationReferenceProperties self.file = IfcStore.get_file() self.draw_add_ui(context) @@ -318,7 +318,7 @@ class BIM_PT_material_classifications(Panel, ReferenceUI): class BIM_PT_cost_classifications(Panel, ReferenceUI): - bl_label = "Cost Classifications" + bl_label = "Cost Item Classifications" bl_idname = "BIM_PT_cost_classifications" bl_options = {"DEFAULT_CLOSED"} bl_space_type = "PROPERTIES" diff --git a/src/blenderbim/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py index a2c24a02e5..0efe58e73b 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/pset/__init__.py @@ -79,7 +79,7 @@ def register(): def unregister(): del bpy.types.Object.PsetProperties - del bpy.types.Object.MaterialPsetProperties + del bpy.types.Scene.MaterialPsetProperties del bpy.types.Object.MaterialSetPsetProperties del bpy.types.Object.MaterialSetItemPsetProperties del bpy.types.Scene.TaskPsetProperties From 763ee9198d90b1fee9cdf85557e9cab99174c6c2 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 26 May 2024 18:29:26 +1000 Subject: [PATCH 289/429] See #3847. Preliminary support for including linked models when generating drawings. --- .../blenderbim/bim/module/drawing/operator.py | 44 ++++++++++++++----- src/blenderbim/blenderbim/tool/drawing.py | 12 +++-- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index d2bf5aca24..bf5256185f 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -529,28 +529,35 @@ class CreateDrawing(bpy.types.Operator): files = {context.scene.BIMProperties.ifc_file: tool.Ifc.get()} + for link in context.scene.BIMProjectProperties.links: + if link.name not in IfcStore.session_files: + IfcStore.session_files[link.name] = ifcopenshell.open(link.name) + files[link.name] = IfcStore.session_files[link.name] + + target_view = ifcopenshell.util.element.get_psets(self.camera_element)["EPset_Drawing"]["TargetView"] + self.setup_serialiser(target_view) + + tree = ifcopenshell.geom.tree() + tree.enable_face_styles(True) + for ifc_path, ifc in files.items(): # Don't use draw.main() just whilst we're prototyping and experimenting # TODO: hash paths are never used ifc_hash = hashlib.md5(ifc_path.encode("utf-8")).hexdigest() ifc_cache_path = os.path.join(context.scene.BIMProperties.data_dir, "cache", f"{ifc_hash}.h5") + self.serialiser.setFile(ifc) + drawing_elements = tool.Drawing.get_drawing_elements(self.camera_element, ifc_file=ifc) + # Get all representation contexts to see what we're dealing with. # Drawings only draw bodies and annotations (and facetation, due to a Revit bug). # A drawing prioritises a target view context first, followed by a model view context as a fallback. # Specifically for PLAN_VIEW and REFLECTED_PLAN_VIEW, any Plan context is also prioritised. - target_view = ifcopenshell.util.element.get_psets(self.camera_element)["EPset_Drawing"]["TargetView"] contexts = self.get_linework_contexts(ifc, target_view) - drawing_elements = tool.Drawing.get_drawing_elements(self.camera_element) - - self.setup_serialiser(ifc, target_view) - tree = ifcopenshell.geom.tree() - tree.enable_face_styles(True) - self.serialize_contexts_elements(ifc, tree, contexts, "body", drawing_elements, target_view) self.serialize_contexts_elements(ifc, tree, contexts, "annotation", drawing_elements, target_view) - if self.camera_element not in drawing_elements: + if tool.Ifc.get() == ifc and self.camera_element not in drawing_elements: with profile("Camera element"): # The camera must always be included, regardless of any include/exclude filters. geom_settings = ifcopenshell.geom.settings(DISABLE_TRIANGULATION=True, STRICT_TOLERANCE=True) @@ -865,13 +872,12 @@ class CreateDrawing(bpy.types.Operator): return svg_path - def setup_serialiser(self, ifc, target_view): + def setup_serialiser(self, target_view): self.svg_settings = ifcopenshell.geom.settings( DISABLE_TRIANGULATION=True, STRICT_TOLERANCE=True, INCLUDE_CURVES=True ) self.svg_buffer = ifcopenshell.geom.serializers.buffer() self.serialiser = ifcopenshell.geom.serializers.svg(self.svg_buffer, self.svg_settings) - self.serialiser.setFile(ifc) self.serialiser.setWithoutStoreys(True) self.serialiser.setPolygonal(True) self.serialiser.setUseHlrPoly(True) @@ -935,6 +941,18 @@ class CreateDrawing(bpy.types.Operator): self.is_manifold_cache[obj.data.name] = True return True + def get_element_by_guid(self, guid): + try: + return tool.Ifc.get().by_guid(guid) + except: + for link in bpy.context.scene.BIMProjectProperties.links: + if link.name not in IfcStore.session_files: + IfcStore.session_files[link.name] = ifcopenshell.open(link.name) + try: + return IfcStore.session_files[link.name].by_guid(guid) + except: + continue + def merge_linework_and_add_metadata(self, root): join_criteria = ifcopenshell.util.element.get_pset(self.camera_element, "EPset_Drawing", "JoinCriteria") if join_criteria: @@ -949,7 +967,7 @@ class CreateDrawing(bpy.types.Operator): ifc = tool.Ifc.get() for el in root.findall(".//{http://www.w3.org/2000/svg}g[@{http://www.ifcopenshell.org/ns}guid]"): - element = ifc.by_guid(el.get("{http://www.ifcopenshell.org/ns}guid")) + element = self.get_element_by_guid(el.get("{http://www.ifcopenshell.org/ns}guid")) if "projection" in el.get("class", "").split(): classes = self.get_svg_classes(element) @@ -962,6 +980,10 @@ class CreateDrawing(bpy.types.Operator): el.set("class", " ".join(classes)) obj = tool.Ifc.get_object(element) + + if not obj: # This is a linked model object. For now, do nothing. + continue + if not self.is_manifold(obj): continue diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index d2a8f96aca..01d2c2c51c 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -1625,11 +1625,17 @@ class Drawing(blenderbim.core.tool.Drawing): return ifcopenshell.util.element.get_psets(drawing).get("EPset_Drawing", {}).get("HasAnnotation", False) @classmethod - def get_drawing_elements(cls, drawing: ifcopenshell.entity_instance) -> set[ifcopenshell.entity_instance]: + def get_drawing_elements( + cls, drawing: ifcopenshell.entity_instance, ifc_file: Optional[ifcopenshell.file] = None + ) -> set[ifcopenshell.entity_instance]: """returns a set of elements that are included in the drawing""" - ifc_file = tool.Ifc.get() + if ifc_file is None: + ifc_file = tool.Ifc.get() + elements = cls.get_elements_in_camera_view(tool.Ifc.get_object(drawing), bpy.data.objects) + else: + # This can probably be smarter + elements = set(ifc_file.by_type("IfcElement")) pset = ifcopenshell.util.element.get_psets(drawing).get("EPset_Drawing", {}) - elements = cls.get_elements_in_camera_view(tool.Ifc.get_object(drawing), bpy.data.objects) include = pset.get("Include", None) if include: elements = ifcopenshell.util.selector.filter_elements(ifc_file, include) From a19b7614fac321dab211fd50440334f6453551e9 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 26 May 2024 20:12:12 +1000 Subject: [PATCH 290/429] Fix #4737. Bug where loading profiles with a non-mesh selected would lead to trouble. --- src/blenderbim/blenderbim/bim/module/profile/operator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/profile/operator.py b/src/blenderbim/blenderbim/bim/module/profile/operator.py index 6886d6e77c..4e9bee48a4 100644 --- a/src/blenderbim/blenderbim/bim/module/profile/operator.py +++ b/src/blenderbim/blenderbim/bim/module/profile/operator.py @@ -175,7 +175,7 @@ class EnableEditingArbitraryProfile(bpy.types.Operator, tool.Ifc.Operator): def disable_editing_arbitrary_profile(context): obj = context.active_object - if obj and obj.data and obj.data.BIMMeshProperties.subshape_type == "PROFILE": + if obj and obj.type == "MESH" and obj.data and obj.data.BIMMeshProperties.subshape_type == "PROFILE": ProfileDecorator.uninstall() bpy.ops.object.mode_set(mode="OBJECT") profile_mesh = obj.data From 3e313093840f6bcd9799f411dcb27c6f0d622051 Mon Sep 17 00:00:00 2001 From: ppaawweeuu <61344631+ppaawweeuu@users.noreply.github.com> Date: Sun, 26 May 2024 12:14:41 +0200 Subject: [PATCH 291/429] Update selector_syntax.rst - links to regex resources (#4741) * Update selector_syntax.rst add links to regex resources * Update selector_syntax.rst links misspelling change * Update selector_syntax.rst one misspealling more * Update selector_syntax.rst small misspelling in thousands separator location --- .../docs/ifcopenshell-python/selector_syntax.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst index e322ac675c..cdc89f5af7 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst @@ -127,7 +127,7 @@ three ways you can do so: "Quoted string", "``""foo \""bar\"" baz""``", "The value must be in double quotes. The value may contain spaces, symbols, and other characters. If you need to use a double quote, you can escape it with a backslash. This is the safest, most general way to specify a value." "Unquoted string", "``foobarbaz``", "For convenience, if you have a simple value which contains no spaces or special characters, you are free to specify it as an unquoted string." - "Regex string", "``/foo.*baz/``", "You may specify a Python-compatible regex pattern delimited by forward slashes." + "Regex string", "``/foo.*baz/``", "You may specify a Python-compatible regex pattern delimited by forward slashes. You can learn more about regular expressions from `Beginners Regex tutorial `_ and `Online Regex testing website `_." Getting element values ---------------------- @@ -204,7 +204,7 @@ do so: "Quoted string", "``""foo \""bar\"" baz""``", "The value must be in double quotes. The value may contain spaces, symbols, and other characters. If you need to use a double quote, you can escape it with a backslash. This is the safest, most general way to specify a value." "Unquoted string", "``foobarbaz``", "For convenience, if you have a simple value which contains no spaces or special characters, you are free to specify it as an unquoted string." - "Regex string", "``/foo.*baz/``", "You may specify a Python-compatible regex pattern delimited by forward slashes." + "Regex string", "``/foo.*baz/``", "You may specify a Python-compatible regex pattern delimited by forward slashes. You can learn more about regular expressions from `Beginners Regex tutorial `_ and `Online Regex testing website `_." Formatting ---------- @@ -235,6 +235,6 @@ nest formulas, for example ``concat(title("foo"), lower("Bar"))`` will produce "``title({{value}})``", "``title(""foo"")``", "``Foo``", "Titlecases a string." "``concat({{value}}[, {{value2}}]*)``", "``concat(""foo"", ""bar"")``", "``foobar``", "Concatenates two or more strings." "``round({{value}}, {{precision}})``", "``round(3.123, 0.1)``", "``3.1``", "Rounds ``{{value}}`` to the nearest ``{{precision}}``." - "``number({{value}}[, {{decimal_separator}}[, {{thousands_separator}}]])``", "``number(1234.56, "","", ""."")``", "123.4,56", "Formats {{value}} with an optional custom {{decimal_separator}} and {{thousands_separator}}. The default separators are ``.`` and ``,``." + "``number({{value}}[, {{decimal_separator}}[, {{thousands_separator}}]])``", "``number(1234.56, "","", ""."")``", "1.234,56", "Formats {{value}} with an optional custom {{decimal_separator}} and {{thousands_separator}}. The default separators are ``.`` and ``,``." "``metric_length({{value}}, {{precision}}, {{decimals}})``", "``metric_length(3.123, 0.1, 2)``", "``3.10``", "Rounds ``{{value}}`` to the nearest ``{{precision}}`` then displays using a certain amount of decimal places." "``imperial_length({{value}}, {{precision}}, {{input_unit}}, {{output_unit}})``", "``imperial_length(3.22, 4, ""foot"")``", "``3' - 3 3/4""``", "``The {{value}}`` may be specified either as ``foot`` or ``inch`` depending on ``{{input_unit}}``. The ``{{value}}`` is then rounded to the nearest ``1/{{precision}}`` inch then formatted using fractional feet and inches if ``{{output_unit}}`` is set to ``foot`` or just inches if ``{{output_unit}}`` is set to ``inch``." From 37cacfcd06e290734c0e08ea54bffdc4218aa0b4 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 26 May 2024 21:57:08 +1000 Subject: [PATCH 292/429] Fix #4728. Bug where changing class doesn't work with IfcCSV if it didn't need to change anything. --- src/ifcopenshell-python/ifcopenshell/util/selector.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index f66896bd53..7d2c3b5869 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -371,6 +371,7 @@ def set_element_value( elif key == "class": if element.is_a().lower() != value.lower(): return ifcopenshell.util.schema.reassign_class(ifc_file, element, value) + return elif key == "id": return elif key == "classification": From f2ca030fab5884dc7c0ff001088fe13f6bfd5d83 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sun, 26 May 2024 18:27:44 -0500 Subject: [PATCH 293/429] fix #4311: turn off local view when activating drawing --- src/blenderbim/blenderbim/tool/blender.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 85780e38c3..11c784881f 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -49,22 +49,30 @@ class Blender(blenderbim.core.tool.Blender): OBJECT_TYPES_THAT_SUPPORT_EDIT_GPENCIL_MODE = ("GPENCIL",) TYPE_MANAGER_ICON = "LIGHTPROBE_VOLUME" if bpy.app.version >= (4, 1, 0) else "LIGHTPROBE_GRID" + @classmethod def activate_camera(cls, obj: bpy.types.Object) -> None: + + area = tool.Blender.get_view3d_area() is_local_view = area.spaces[0].local_view is not None + if is_local_view: # Turn off local view before activating drawing, and then turn it on again. for a in bpy.context.screen.areas: - if a.type == "VIEW_3D": - override = bpy.context.copy() - override["area"] = a - bpy.ops.view3d.localview(override) - bpy.context.scene.camera = obj - bpy.ops.view3d.localview(override) + if a.type == 'VIEW_3D': + override = {'area': a, 'region': a.regions[-1], 'space': a.spaces[0], 'scene': bpy.context.scene} + with bpy.context.temp_override(**override): + bpy.ops.view3d.localview() + bpy.context.scene.camera = obj + else: bpy.context.scene.camera = obj - area.spaces[0].region_3d.view_perspective = "CAMERA" + + area.spaces[0].region_3d.view_perspective = 'CAMERA' + + + @classmethod def get_area_props(cls, context: bpy.types.Context) -> Any: From 7142f3856cc1ad42315c3a92078b257ece4038f5 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 27 May 2024 09:42:28 +1000 Subject: [PATCH 294/429] Add documentation for some unit utilities --- .../ifcopenshell/util/unit.py | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/unit.py b/src/ifcopenshell-python/ifcopenshell/util/unit.py index 55eda62d82..6666da08c6 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/unit.py +++ b/src/ifcopenshell-python/ifcopenshell/util/unit.py @@ -421,8 +421,8 @@ def get_project_unit(ifc_file: ifcopenshell.file, unit_type: str) -> Union[ifcop :param unit_type: The type of unit, taken from the list of IFC unit types, such as "LENGTHUNIT". :type unit_type: str - :return: The IFC unit entity, or nothing if there is no default project unit - defined. + :return: The IFC unit entity, or nothing if there is no default project + unit defined. :rtype: Union[ifcopenshell.entity_instance, None] """ unit_assignment = get_unit_assignment(ifc_file) @@ -435,6 +435,20 @@ def get_project_unit(ifc_file: ifcopenshell.file, unit_type: str) -> Union[ifcop def get_property_unit( prop: ifcopenshell.entity_instance, ifc_file: ifcopenshell.file ) -> Union[ifcopenshell.entity_instance, None]: + """Gets the unit definition of a property or quantity + + Properties and quantities in psets and qtos can be associated with a unit. + This unit may be defined at the property itself explicitly, or if not + specified, fallback to the project default. + + :param prop: The property instance. You can fetch this via the instance ID + if doing :func:`ifcopenshell.util.element.get_psets` with + ``verbose=True``. + :param ifc_file: The IFC file being used. This is necessary to check + default project units. + :return: The IFC unit entity, or nothing if there is no default project + unit defined. + """ unit = getattr(prop, "Unit", None) if unit: return unit @@ -488,6 +502,16 @@ def get_property_unit( def get_unit_measure_class(unit_type: str) -> MEASURE_CLASS: + """Get the IFC measure class for a unit type. + + IFC has specific classes used to measure different units. An example of an + IFC measure class is ``IfcLengthMeasure``. An example of the correlating + unit type (i.e. the IfcUnitEnum) is ``LENGTHUNIT``. + + The inverse function of this is :func:`get_measure_unit_type` + + :param unit_type: A string chosen from IfcUnitEnum, such as LENGTHUNIT + """ if unit_type == "USERDEFINED": # See https://github.com/buildingSMART/IFC4.3.x-development/issues/71 return "IfcNumericMeasure" @@ -495,6 +519,20 @@ def get_unit_measure_class(unit_type: str) -> MEASURE_CLASS: def get_measure_unit_type(measure_class: MEASURE_CLASS) -> str: + """Get the unit type of an IFC measure class + + IFC has different unit types which can be associated with units (e.g. SI + units, imperial units, derived units, etc). An example of a unit type (i.e. + an IfcUnitEnum) is ``LENGTHUNIT``. An example of the correlating measure + class used to store length data is ``IfcLengthMeasure``. + + The inverse fucntion of this is :func:`get_unit_measure_class` + + :param measure_class: The measure class, such as ``IfcLengthMeasure``. If + you have an ``IfcPropertySingleValue``, you can get this using + ``prop.NominalValue.is_a()``. + :return: The unit type, as an uppercase value of IfcUnitEnum. + """ if measure_class == "IfcNumericMeasure": # See https://github.com/buildingSMART/IFC4.3.x-development/issues/71 return "USERDEFINED" From 70a4af260548202fcae084ebdfaf2218007eda52 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 27 May 2024 11:02:23 +1000 Subject: [PATCH 295/429] Fix #4740. Bug where building element proxies didn't work for the auto calculate all button. --- src/blenderbim/blenderbim/bim/module/qto/operator.py | 8 ++++++-- src/blenderbim/blenderbim/core/qto.py | 2 +- src/blenderbim/blenderbim/tool/qto.py | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/qto/operator.py b/src/blenderbim/blenderbim/bim/module/qto/operator.py index 951b541df2..de3084a898 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/operator.py +++ b/src/blenderbim/blenderbim/bim/module/qto/operator.py @@ -170,6 +170,7 @@ class QuantifyObjects(bpy.types.Operator): ifcopenshell.api.run("pset.edit_qto", self.file, qto=qto, properties={props.prop_name: result}) return {"FINISHED"} + class AssignBaseQto(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.assign_objects_base_qto" bl_label = "Assign IFC Object Quantity Set" @@ -181,9 +182,10 @@ class AssignBaseQto(bpy.types.Operator, tool.Ifc.Operator): return tool.Ifc.get() and context.selected_objects def _execute(self, context): - core.assign_objects_base_qto(tool.Ifc, tool.Qto, selected_objects = context.selected_objects) + core.assign_objects_base_qto(tool.Ifc, tool.Qto, selected_objects=context.selected_objects) return {"FINISHED"} + class CalculateAllQuantities(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.calculate_all_quantities" bl_label = "Calculate All Quantities" @@ -195,5 +197,7 @@ class CalculateAllQuantities(bpy.types.Operator, tool.Ifc.Operator): return tool.Ifc.get() and context.selected_objects def _execute(self, context): - core.calculate_objects_base_quantities(tool.Ifc, tool.Cost, tool.Qto, QtoCalculator(), selected_objects = context.selected_objects) + core.calculate_objects_base_quantities( + tool.Ifc, tool.Cost, tool.Qto, QtoCalculator(), selected_objects=context.selected_objects + ) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/core/qto.py b/src/blenderbim/blenderbim/core/qto.py index 16ae9719dc..52aacf6e3a 100644 --- a/src/blenderbim/blenderbim/core/qto.py +++ b/src/blenderbim/blenderbim/core/qto.py @@ -65,4 +65,4 @@ def calculate_object_base_quantities(ifc, cost, qto, calculator, obj): ) calculated_quantities = qto.get_calculated_object_quantities(calculator, base_quantity_name, obj) ifc.run("pset.edit_qto", qto=base_qto, properties=calculated_quantities) - cost.update_cost_items(product=product) \ No newline at end of file + cost.update_cost_items(product=product) diff --git a/src/blenderbim/blenderbim/tool/qto.py b/src/blenderbim/blenderbim/tool/qto.py index b96b638907..68893fa661 100644 --- a/src/blenderbim/blenderbim/tool/qto.py +++ b/src/blenderbim/blenderbim/tool/qto.py @@ -78,7 +78,8 @@ class Qto(blenderbim.core.tool.Qto): applicable_qto_names = blenderbim.bim.schema.ifc.psetqto.get_applicable_names( product.is_a(), ifcopenshell.util.element.get_predefined_type(product), qto_only=True ) - return next((qto_name for qto_name in applicable_qto_names if "Qto_" in qto_name and "Base" in qto_name), None) + # See https://github.com/buildingSMART/IFC4.3.x-development/issues/851 for anomalies in Qto naming + return next((qto_name for qto_name in applicable_qto_names if "Qto_" in qto_name), None) @classmethod def get_new_calculated_quantity(cls, qto_name: str, quantity_name: str, obj: bpy.types.Object) -> float: From 37b14f2a3d918734001b3b0c295201a819fe368b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 27 May 2024 11:59:25 +1000 Subject: [PATCH 296/429] Document difference between COBie 2.4 and COBie 2.4 Legacy in IfcFM --- src/ifcopenshell-python/docs/ifcfm.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/ifcopenshell-python/docs/ifcfm.rst b/src/ifcopenshell-python/docs/ifcfm.rst index f096ed69e9..25724de177 100644 --- a/src/ifcopenshell-python/docs/ifcfm.rst +++ b/src/ifcopenshell-python/docs/ifcfm.rst @@ -63,3 +63,21 @@ with this data structure that IfcFM supports: installation. As expected, the majority of these are already referenced in named standards. "Vanilla" IFC offers a "specification agnostic" approach towards facility management data collection. + +COBie 2.4 vs COBie 2.4 Legacy +----------------------------- + +In collaboration with leading UK consultancy BuildData Group (formerly Bond +Bryan Digital), and inventor of COBie 2.4 Bill East (Prarie Sky Consulting), an +effort was made to preserve the original IFC mapping, as well as modernise the +mapping with the following goals: + +1. For anyone delivering **COBie 2.4** data using best practices from graphical + BIM software, there must be *no difference* between **COBie 2.4** and + **COBie 2.4 Legacy**. It must not contradict any specifications in the + official NBIMS-US and BS standards. +2. Update compatibility to IFC4X3. +3. Prioritise organisational data instead of personal data with discourage PII. +4. Prioritise bSI standardised property sets over custom ones. +5. Prevent needless repetition of data / fallback defaults that may result in + invalid or unexpected data in obscure edge cases. From bdfd0c4aa73439ccac14813382155514fa3c4ab8 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 27 May 2024 12:24:55 +1000 Subject: [PATCH 297/429] Minor fix to IfcCityJSON and migrate IfcCityJSON docs to sphinx --- src/ifccityjson/README.md | 35 +---------- .../{ifccityjson.py => __main__.py} | 4 +- .../ifccityjson/cityjson2ifc/cityjson2ifc.py | 2 +- src/ifcopenshell-python/docs/ifccityjson.rst | 59 +++++++++++++++++++ 4 files changed, 64 insertions(+), 36 deletions(-) rename src/ifccityjson/ifccityjson/{ifccityjson.py => __main__.py} (97%) diff --git a/src/ifccityjson/README.md b/src/ifccityjson/README.md index 5bca24f4bd..58fb62bf31 100644 --- a/src/ifccityjson/README.md +++ b/src/ifccityjson/README.md @@ -1,35 +1,4 @@ # IFCCityJSON -Converter for CityJSON files and IFC. Currently only supports one-way conversion from CityJSON to IFC. -## Dependencies -- [IfcOpenShell](https://github.com/IfcOpenShell/IfcOpenShell) (also IfcOpenShell api is needed) -- [CJIO](https://github.com/cityjson/cjio) (>=0.8, <1.0) - -## Usage of IFCCityJSON -An extended ifccityjson tutorial can be found on [the OSARCH wiki](https://wiki.osarch.org/index.php?title=Ifccityjson) -Following command will execute a conversion from CityJSON to IFC - - python ifccityjson.py [-i input file] [-o output file] [-n name of identification attribute] - -The example file that could be used is example/3D_BAG_example.json - - python ifccityjson.py -i example/3DBAG_example.json -o example/3DBAG_example.ifc -n identificatie - -## Implemented geometries -- [x] "MultiPoint" -- [x] "MultiLineString" -- [x] "MultiSurface" -- [x] "CompositeSurface" -- [x] "Solid": exterior shell -- [ ] "Solid": interior shell -- [x] "MultiSolid" -- [x] "CompositeSolid" -- [ ] "GeometryInstance" - -## TODO -- [x] CityJSON Attributes as IFC properties in 'CityJSON_attributes' pset -- [x] Implement georeferencing -- [x] Do not use template IFC for new IFC file, but make IFC file from scratch -- [x] Create mapping to IFC for all CityJSON object types & semantic surfaces -- [ ] Implement conversion of all CitYJSON geometries -- [x] Implement conversion of all LODs instead of only the most detailed +IfcCityJSON is a converter for CityJSON files and IFC. It currently only +supports one-way conversion from CityJSON to IFC. diff --git a/src/ifccityjson/ifccityjson/ifccityjson.py b/src/ifccityjson/ifccityjson/__main__.py similarity index 97% rename from src/ifccityjson/ifccityjson/ifccityjson.py rename to src/ifccityjson/ifccityjson/__main__.py index 562c2dc7e0..90361bb894 100644 --- a/src/ifccityjson/ifccityjson/ifccityjson.py +++ b/src/ifccityjson/ifccityjson/__main__.py @@ -18,7 +18,7 @@ import argparse from cjio import cityjson -from cityjson2ifc.cityjson2ifc import Cityjson2ifc +from .cityjson2ifc import Cityjson2ifc def cmdline(): # Example: @@ -51,4 +51,4 @@ def cmdline(): converter.convert(city_model) if __name__ == '__main__': - cmdline() \ No newline at end of file + cmdline() diff --git a/src/ifccityjson/ifccityjson/cityjson2ifc/cityjson2ifc.py b/src/ifccityjson/ifccityjson/cityjson2ifc/cityjson2ifc.py index d1344aa65d..7200ec9d7e 100644 --- a/src/ifccityjson/ifccityjson/cityjson2ifc/cityjson2ifc.py +++ b/src/ifccityjson/ifccityjson/cityjson2ifc/cityjson2ifc.py @@ -146,7 +146,7 @@ class Cityjson2ifc: # Georeferencing self.properties["local_translation"] = None self.properties["local_scale"] = None - if not self.city_model.is_transformed: + if self.city_model.is_transformed: self.properties["local_scale"] = self.city_model.transform["scale"] local_translation = self.city_model.transform["translate"] self.properties["local_translation"] = { diff --git a/src/ifcopenshell-python/docs/ifccityjson.rst b/src/ifcopenshell-python/docs/ifccityjson.rst index df4c7a209b..a5b968aaf5 100644 --- a/src/ifcopenshell-python/docs/ifccityjson.rst +++ b/src/ifcopenshell-python/docs/ifccityjson.rst @@ -3,3 +3,62 @@ IfcCityJSON IfcCityJSON is a converter for CityJSON files and IFC. It currently only supports one-way conversion from CityJSON to IFC. + +Source installation +------------------- + +1. :doc:`Install IfcOpenShell ` +2. `Clone the source code `_. +3. ``cd /path/to/IfcOpenShell/src/ifccityjson`` +4. ``pip install .`` + +Usage +----- + +An extended ifccityjson tutorial can be found on `the OSARCH wiki +`_. Here's the built-in +documentation: + +.. code-block:: console + + $ python -m ifccityjson -h + + usage: __main__.py [-h] -i INPUT [-o OUTPUT] [-n NAME] [--split-lod] [--no-split-lod] [--lod LOD] + + options: + -h, --help show this help message and exit + -i INPUT, --input INPUT + input CityJSON file + -o OUTPUT, --output OUTPUT + output IFC file. Standard is output.ifc + -n NAME, --name NAME Attribute containing the name + --split-lod Split the file in multiple LoDs + --no-split-lod Do not split the file in multiple LoDs + --lod LOD extract LOD value (example: 1.2) + +The example file that could be used is example/3D_BAG_example.json + +.. code-block:: console + + python ifccityjson.py -i example/geometries.json -o output.ifc -n identificatie + +The following geometries are implemented: + +- [x] "MultiPoint" +- [x] "MultiLineString" +- [x] "MultiSurface" +- [x] "CompositeSurface" +- [x] "Solid": exterior shell +- [ ] "Solid": interior shell +- [x] "MultiSolid" +- [x] "CompositeSolid" +- [ ] "GeometryInstance" + +TODO: + +- [x] CityJSON Attributes as IFC properties in 'CityJSON_attributes' pset +- [x] Implement georeferencing +- [x] Do not use template IFC for new IFC file, but make IFC file from scratch +- [x] Create mapping to IFC for all CityJSON object types & semantic surfaces +- [ ] Implement conversion of all CitYJSON geometries +- [x] Implement conversion of all LODs instead of only the most detailed From 39a841fb4ecf757ec1c9849d20dcf94e6feecfe3 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 27 May 2024 13:09:47 +1000 Subject: [PATCH 298/429] Fix #3174. Toggling edit mode no longer pops up annoying "do you want to save" dialog. The default is now everything is saved which should be 90% of the usecase. If you want to discard changes, there is now a button in the top right next to the IFC mode. --- .../bim/module/geometry/__init__.py | 25 ++++++++++--------- .../bim/module/geometry/operator.py | 11 -------- .../blenderbim/bim/module/geometry/ui.py | 2 ++ 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py index 0bf808c2ef..364ea3d83a 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py @@ -22,14 +22,20 @@ from . import ui, prop, operator classes = ( operator.AddRepresentation, operator.CopyRepresentation, + operator.DisableEditingRepresentationItemShapeAspect, + operator.DisableEditingRepresentationItemStyle, operator.DisableEditingRepresentationItems, + operator.DuplicateLinkedAggregateTo3dCursor, + operator.DuplicateMoveLinkedAggregate, + operator.DuplicateMoveLinkedAggregateMacro, operator.EditObjectPlacement, + operator.EditRepresentationItemShapeAspect, + operator.EditRepresentationItemStyle, + operator.EnableEditingRepresentationItemShapeAspect, + operator.EnableEditingRepresentationItemStyle, operator.EnableEditingRepresentationItems, operator.FlipObject, operator.GetRepresentationIfcParameters, - operator.DuplicateMoveLinkedAggregate, - operator.DuplicateMoveLinkedAggregateMacro, - operator.DuplicateLinkedAggregateTo3dCursor, operator.OverrideDelete, operator.OverrideDuplicateMove, operator.OverrideDuplicateMoveLinked, @@ -46,19 +52,13 @@ classes = ( operator.RefreshLinkedAggregate, operator.RemoveConnection, operator.RemoveRepresentation, + operator.RemoveRepresentationItem, + operator.RemoveRepresentationItemFromShapeAspect, operator.SelectConnection, operator.SwitchRepresentation, + operator.UnassignRepresentationItemStyle, operator.UpdateParametricRepresentation, operator.UpdateRepresentation, - operator.RemoveRepresentationItem, - operator.EnableEditingRepresentationItemStyle, - operator.EditRepresentationItemStyle, - operator.DisableEditingRepresentationItemStyle, - operator.UnassignRepresentationItemStyle, - operator.EnableEditingRepresentationItemShapeAspect, - operator.EditRepresentationItemShapeAspect, - operator.DisableEditingRepresentationItemShapeAspect, - operator.RemoveRepresentationItemFromShapeAspect, prop.RepresentationItem, prop.ShapeAspect, prop.BIMObjectGeometryProperties, @@ -120,6 +120,7 @@ def register(): km = wm.keyconfigs.addon.keymaps.new(name="Mesh", space_type="EMPTY") kmi = km.keymap_items.new("bim.override_mode_set_object", "TAB", "PRESS") + kmi.properties.should_save = True addon_keymaps.append((km, kmi)) kmi = km.keymap_items.new("wm.call_menu", "P", "PRESS") kmi.properties.name = ui.BIM_MT_hotkey_separate.bl_idname diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index a4a9ae5abe..a26831bff1 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -1683,20 +1683,11 @@ class OverrideModeSetObject(bpy.types.Operator): apply_openings=True, ) - def draw(self, context): - if self.is_valid: - row = self.layout.row() - row.prop(self, "should_save") - else: - row = self.layout.row() - row.label(text="No Geometry Found: Object will revert to previous state.") - def invoke(self, context, event): return IfcStore.execute_ifc_operator(self, context, is_invoke=True) def _invoke(self, context, event): self.is_valid = True - self.should_save = True bpy.ops.object.mode_set(mode="EDIT", toggle=True) @@ -1758,8 +1749,6 @@ class OverrideModeSetObject(bpy.types.Operator): else: tool.Ifc.finish_edit(obj) - if self.edited_objs: - return context.window_manager.invoke_props_dialog(self) return self.execute(context) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/ui.py b/src/blenderbim/blenderbim/bim/module/geometry/ui.py index b2a52315ec..3896335c2e 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/ui.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/ui.py @@ -34,6 +34,8 @@ from blenderbim.bim.module.layer.data import LayersData def mode_menu(self, context): row = self.layout.row(align=True) + if context.scene.BIMGeometryProperties.mode == "EDIT": + row.operator("bim.override_mode_set_object", icon="CANCEL", text="Discard Changes").should_save = False row.prop(context.scene.BIMGeometryProperties, "mode", text="", icon_value=blenderbim.bim.icons["IFC"].icon_id) From f190ddcd92e06304ab1f91e06f04eae3fc6942c1 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 27 May 2024 17:29:51 +1000 Subject: [PATCH 299/429] Move all N panels back into the scene tabs. No more panels spread around! Qto, 4D tools, 5D tools now in the Costing/Scheduling tab. The misc panel is now in the sandbox. Git history panel is now with the main Git panel. --- src/blenderbim/blenderbim/bim/__init__.py | 1 + src/blenderbim/blenderbim/bim/module/cost/ui.py | 8 +++++--- src/blenderbim/blenderbim/bim/module/ifcgit/ui.py | 8 +++++--- src/blenderbim/blenderbim/bim/module/misc/ui.py | 7 ++++--- src/blenderbim/blenderbim/bim/module/qto/ui.py | 8 +++++--- .../blenderbim/bim/module/sequence/ui.py | 8 +++++--- src/blenderbim/blenderbim/bim/ui.py | 14 ++++++++++++++ 7 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 37033001f2..9db15ef2a0 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -170,6 +170,7 @@ classes = [ ui.BIM_PT_tab_structural, # Construction scheduling ui.BIM_PT_tab_status, + ui.BIM_PT_tab_qto, ui.BIM_PT_tab_resources, ui.BIM_PT_tab_cost, ui.BIM_PT_tab_sequence, diff --git a/src/blenderbim/blenderbim/bim/module/cost/ui.py b/src/blenderbim/blenderbim/bim/module/cost/ui.py index 42eb5d578a..0df9354468 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/ui.py +++ b/src/blenderbim/blenderbim/bim/module/cost/ui.py @@ -755,9 +755,11 @@ class BIM_UL_product_cost_items(UIList): class BIM_PT_Costing_Tools(Panel): bl_label = "5D Tools" bl_idname = "BIM_PT_Costing_Tools" - bl_space_type = "VIEW_3D" - bl_region_type = "UI" - bl_category = "4D/5D Toolkit" + bl_options = {"DEFAULT_CLOSED"} + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + bl_parent_id = "BIM_PT_tab_cost" def draw(self, context): self.props = context.scene.BIMCostProperties diff --git a/src/blenderbim/blenderbim/bim/module/ifcgit/ui.py b/src/blenderbim/blenderbim/bim/module/ifcgit/ui.py index be8af38b00..7d3a886cba 100644 --- a/src/blenderbim/blenderbim/bim/module/ifcgit/ui.py +++ b/src/blenderbim/blenderbim/bim/module/ifcgit/ui.py @@ -247,9 +247,11 @@ class IFCGIT_PT_revision_inspector(bpy.types.Panel): bl_idname = "IFCGIT_PT_revision_inspector" bl_label = "Git History" 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_options = {"DEFAULT_CLOSED"} + bl_parent_id = "IFCGIT_PT_panel" def draw(self, context): diff --git a/src/blenderbim/blenderbim/bim/module/misc/ui.py b/src/blenderbim/blenderbim/bim/module/misc/ui.py index a2c9ebb0ec..df7dd004dc 100644 --- a/src/blenderbim/blenderbim/bim/module/misc/ui.py +++ b/src/blenderbim/blenderbim/bim/module/misc/ui.py @@ -22,10 +22,11 @@ import bpy class BIM_PT_misc_utilities(bpy.types.Panel): bl_idname = "BIM_PT_misc_utilities" bl_label = "Miscellaneous" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "output" bl_options = {"DEFAULT_CLOSED"} - bl_space_type = "VIEW_3D" - bl_region_type = "UI" - bl_category = "BlenderBIM" + bl_parent_id = "BIM_PT_tab_sandbox" def draw(self, context): layout = self.layout diff --git a/src/blenderbim/blenderbim/bim/module/qto/ui.py b/src/blenderbim/blenderbim/bim/module/qto/ui.py index 43e5e0b584..c7a79d1522 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/ui.py +++ b/src/blenderbim/blenderbim/bim/module/qto/ui.py @@ -24,9 +24,11 @@ class BIM_PT_qto_utilities(bpy.types.Panel): bl_idname = "BIM_PT_qto_utilities" bl_label = "Quantity Take-off" 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_qto" + bl_options = {"HIDE_HEADER"} def draw(self, context): if not QtoData.is_loaded: diff --git a/src/blenderbim/blenderbim/bim/module/sequence/ui.py b/src/blenderbim/blenderbim/bim/module/sequence/ui.py index d0e8e15e03..6876030733 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/ui.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/ui.py @@ -1084,9 +1084,11 @@ class BIM_PT_work_calendars(Panel): class BIM_PT_4D_Tools(Panel): bl_label = "4D Tools" bl_idname = "BIM_PT_4D_Tools" - bl_space_type = "VIEW_3D" - bl_region_type = "UI" - bl_category = "4D/5D Toolkit" + bl_options = {"DEFAULT_CLOSED"} + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + bl_parent_id = "BIM_PT_tab_sequence" def draw(self, context): self.props = context.scene.BIMWorkScheduleProperties diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index e00a1d449c..0de6b9cc23 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -535,6 +535,20 @@ class BIM_PT_tab_status(Panel): pass +class BIM_PT_tab_qto(Panel): + bl_label = "Quantity Take-off" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + + @classmethod + def poll(cls, context): + return tool.Blender.is_tab(context, "SCHEDULING") and tool.Ifc.get() + + def draw(self, context): + pass + + class BIM_PT_tab_resources(Panel): bl_label = "Resources" bl_space_type = "PROPERTIES" From fcf07bebfbbe3533dfb3dd1377d92fca4c344b38 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 27 May 2024 17:30:17 +1000 Subject: [PATCH 300/429] Minor doc fix for IfcPatch ConvertLengthUnit Helps indicate how to get the patched model - it's not an inplace patch --- src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py b/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py index 4445f2ddc0..dce1aaa60e 100644 --- a/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py +++ b/src/ifcpatch/ifcpatch/recipes/ConvertLengthUnit.py @@ -46,10 +46,10 @@ class Patcher: .. code:: python # Convert to millimeters - ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "ConvertLengthUnit", "arguments": ["MILLIMETER"]}) + model = ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "ConvertLengthUnit", "arguments": ["MILLIMETER"]}) # Convert to feet - ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "ConvertLengthUnit", "arguments": ["FOOT"]}) + model = ifcpatch.execute({"input": "input.ifc", "file": model, "recipe": "ConvertLengthUnit", "arguments": ["FOOT"]}) """ self.src = src self.file = file From 75e64959990e97b5115d32bdca3105aa04eaac9c Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 27 May 2024 16:16:57 +0500 Subject: [PATCH 301/429] =?UTF-8?q?load=20and=20link=20ifc=20files=20by=20?= =?UTF-8?q?drag'n'drop=20=F0=9F=A5=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Example - https://imgur.com/a/kIiqk3R Now you can drag'n'drop files to Blender and they will get loaded as projects (currently there is no safe check whether current project is saved) or you can hold ALT while drag'n'dropping and link single or multiple IFC files. Actually, it's possible to set it up that way so multiple files won't need ALT modifier (as we can't load multiple projects, only link them) but I've kept ALT modifier for that case too to avoid confusing situations. Blender 4.1+ only as there wasn't bpy.types.FileHandler before. --- .../blenderbim/bim/module/project/__init__.py | 5 +++ .../blenderbim/bim/module/project/operator.py | 43 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/project/__init__.py b/src/blenderbim/blenderbim/bim/module/project/__init__.py index e0e8b02d0e..46d97ccac9 100644 --- a/src/blenderbim/blenderbim/bim/module/project/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/project/__init__.py @@ -76,6 +76,11 @@ classes = ( gizmo.ClippingPlane, ) +if bpy.app.version >= (4, 1, 0): + classes += ( + operator.IFCFileHandlerOperator, + operator.BIM_FH_import_ifc, + ) addon_keymaps = [] diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 94bec7dabf..8f44c76f8f 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -2085,3 +2085,46 @@ class BIM_OT_load_clipping_planes(bpy.types.Operator): obj.location = values["location"] obj.rotation_euler = values["rotation"] return {"FINISHED"} + + +if bpy.app.version >= (4, 1, 0): + + class IFCFileHandlerOperator(bpy.types.Operator): + bl_idname = "bim.load_project_file_handler" + bl_label = "Import .ifc file" + bl_options = {"REGISTER", "UNDO", "INTERNAL"} + + directory: bpy.props.StringProperty(subtype="FILE_PATH", options={"SKIP_SAVE", "HIDDEN"}) + files: bpy.props.CollectionProperty(type=bpy.types.OperatorFileListElement, options={"SKIP_SAVE", "HIDDEN"}) + + def invoke(self, context, event): + # Keeping code in .invoke() as we'll probably add some + # popup windows later. + + # `files` contain only .ifc files. + filepath = Path(self.directory) + # If user is just drag'n'dropping a single file -> load it as a new project, + # if they're holding ALT -> link the file/files to the current project. + if event.alt: + # Passing self.files directly results in TypeError. + serialized_files = [{"name": f.name} for f in self.files] + return bpy.ops.bim.link_ifc(directory=self.directory, files=serialized_files) + else: + if len(self.files) == 1: + return bpy.ops.bim.load_project(filepath=(filepath / self.files[0].name).as_posix()) + else: + self.report( + {"INFO"}, + "To link multiple IFC files hold ALT while drag'n'dropping them.", + ) + return {"FINISHED"} + + class BIM_FH_import_ifc(bpy.types.FileHandler): + bl_label = "IFC File Handler" + bl_import_operator = IFCFileHandlerOperator.bl_idname + bl_file_extensions = ".ifc" + + # FileHandler won't work without poll_drop defined. + @classmethod + def poll_drop(cls, context): + return True From e57076c84f55603bda39229ce9cfaaf1ea81417d Mon Sep 17 00:00:00 2001 From: Dirk Olbrich Date: Mon, 27 May 2024 14:19:02 +0200 Subject: [PATCH 302/429] [BBIM] Add preference option for default startup workspace, remove ambiguous wording (#4749) * [BlenderBIM] change ambiguous wording from preferences * [BlenderBIM] add option for BIM as default workspace * [BlenderBIM] revert variable name change --- src/blenderbim/blenderbim/bim/handler.py | 3 ++- src/blenderbim/blenderbim/bim/ui.py | 13 ++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/handler.py b/src/blenderbim/blenderbim/bim/handler.py index 49cb42cf9b..6855c9ba80 100644 --- a/src/blenderbim/blenderbim/bim/handler.py +++ b/src/blenderbim/blenderbim/bim/handler.py @@ -301,7 +301,8 @@ def load_post(scene): if bpy.context.preferences.addons["blenderbim"].preferences.should_setup_workspace: if "BIM" in bpy.data.workspaces: - bpy.context.window.workspace = bpy.data.workspaces["BIM"] + if bpy.context.preferences.addons["blenderbim"].preferences.activate_workspace: + bpy.context.window.workspace = bpy.data.workspaces["BIM"] else: bpy.ops.workspace.append_activate(idname="BIM", filepath=os.path.join(cwd, "data", "workspace.blend")) diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 0de6b9cc23..664102ac22 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -195,18 +195,19 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): pdf_command: StringProperty(name="PDF Command", description='E.g. [["firefox", "path"]]') spreadsheet_command: StringProperty(name="Spreadsheet Command", description='E.g. [["libreoffice", "path"]]') openlca_port: IntProperty(name="OpenLCA IPC Port", default=8080) - should_hide_empty_props: BoolProperty(name="Should Hide Empty Properties", default=True) - should_setup_workspace: BoolProperty(name="Should Setup Workspace Layout for BIM", default=True) + should_hide_empty_props: BoolProperty(name="Hide Empty Properties", default=True) + should_setup_workspace: BoolProperty(name="Setup Workspace Layout for BIM", default=True) + activate_workspace: BoolProperty(name="Activate BIM Workspace on Startup", default=True) should_setup_toolbar: BoolProperty( name="Always Show Toolbar In 3D Viewport", default=True, description="If disabled, the toolbar will only load when an IFC model is active", ) should_play_chaching_sound: BoolProperty( - name="Should Make A Cha-Ching Sound When Project Costs Updates", default=False + name="Play A Cha-Ching Sound When Project Costs Updates", default=False ) - lock_grids_on_import: BoolProperty(name="Should Lock Grids By Default", default=True) - spatial_elements_unselectable: BoolProperty(name="Should Make Spatial Elements Unselectable By Default", default=True) + lock_grids_on_import: BoolProperty(name="Lock Grids By Default", default=True) + spatial_elements_unselectable: BoolProperty(name="Make Spatial Elements Unselectable By Default", default=True) decorations_colour: bpy.props.FloatVectorProperty( name="Decorations Colour", subtype="COLOR", default=(1, 1, 1, 1), min=0.0, max=1.0, size=4 ) @@ -283,6 +284,8 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): row = layout.row() row.prop(self, "should_setup_workspace") row = layout.row() + row.prop(self, "activate_workspace") + row = layout.row() row.prop(self, "should_setup_toolbar") row = layout.row() row.prop(self, "should_play_chaching_sound") From d9de9671974a925c519f500239a8d9d87d81445c Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 27 May 2024 16:30:14 +0500 Subject: [PATCH 303/429] specify editing_resource_type values for clarity --- src/blenderbim/blenderbim/bim/module/resource/prop.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/resource/prop.py b/src/blenderbim/blenderbim/bim/module/resource/prop.py index 2f7e539eb9..253d53cc6b 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/prop.py +++ b/src/blenderbim/blenderbim/bim/module/resource/prop.py @@ -132,7 +132,15 @@ class BIMResourceProperties(PropertyGroup): is_loaded: BoolProperty(name="Is Editing") active_resource_time_id: IntProperty(name="Active Resource Usage Id") resource_time_attributes: CollectionProperty(name="Resource Usage Attributes", type=Attribute) - editing_resource_type: StringProperty(name="Editing Resource Type") + editing_resource_type: EnumProperty( + name="Editing Resource Type", + items=( + ("ATTRIBUTES", "", ""), + ("USAGE", "", ""), + ("COSTS", "", ""), + ("QUANTITY", "", ""), + ), + ) cost_types: EnumProperty( items=[ ("FIXED", "Fixed", "The cost value is a fixed number"), From ed1202e1f243db3d8685f9cc145ad9833227af1d Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 27 May 2024 17:00:18 +0500 Subject: [PATCH 304/429] limit quantity types for each resource based on IFC documentation documentation - https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcConstructionResource.htm#Table-7.3.3.7.1.3.H e.g. - https://i.imgur.com/PklMyfq.png (previously all quantity types were available for all resources) --- .../blenderbim/bim/module/resource/prop.py | 41 +++++++++++-------- src/blenderbim/blenderbim/tool/resource.py | 1 + 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/resource/prop.py b/src/blenderbim/blenderbim/bim/module/resource/prop.py index 253d53cc6b..8f5f3df6b2 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/prop.py +++ b/src/blenderbim/blenderbim/bim/module/resource/prop.py @@ -37,13 +37,29 @@ from bpy.props import ( CollectionProperty, ) - -quantitytypes_enum = [] +quantitytypes_enum = {} -def purge(): - global quantitytypes_enum - quantitytypes_enum = [] +def setup_quantity_types_enum(): + # https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcConstructionResource.htm#Table-7.3.3.7.1.3.H + resources = { + "IfcCrewResource": ("IfcQuantityTime",), + "IfcLaborResource": ("IfcQuantityTime",), + "IfcSubContractResource": ("IfcQuantityTime",), + "IfcConstructionEquipmentResource": ("IfcQuantityTime",), + "IfcConstructionMaterialResource": ( + "IfcQuantityVolume", + "IfcQuantityArea", + "IfcQuantityLength", + "IfcQuantityWeight", + ), + "IfcConstructionProductResource": ("IfcQuantityCount",), + } + for resource, quantities in resources.items(): + quantitytypes_enum[resource] = [(q, q, "") for q in quantities] + + +setup_quantity_types_enum() def updateResourceName(self, context): @@ -63,15 +79,7 @@ def updateResourceName(self, context): def get_quantity_types(self, context): - global quantitytypes_enum - if len(quantitytypes_enum) == 0 and IfcStore.get_schema(): - quantitytypes_enum.extend( - [ - (t.name(), t.name(), "") - for t in IfcStore.get_schema().declaration_by_name("IfcPhysicalSimpleQuantity").subtypes() - ] - ) - return quantitytypes_enum + return quantitytypes_enum[self.active_resource_class] def update_active_resource_index(self, context): @@ -88,9 +96,7 @@ def updateResourceUsage(self, context): 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.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() @@ -127,6 +133,7 @@ class BIMResourceProperties(PropertyGroup): is_editing: BoolProperty(name="Is Editing") active_resource_index: IntProperty(name="Active Resource Index", update=update_active_resource_index) active_resource_id: IntProperty(name="Active Resource Id") + active_resource_class: StringProperty(name="Active Resource Type") contracted_resources: StringProperty(name="Contracted Resources", default="[]") is_resource_update_enabled: BoolProperty(name="Is Resource Update Enabled", default=True) is_loaded: BoolProperty(name="Is Editing") diff --git a/src/blenderbim/blenderbim/tool/resource.py b/src/blenderbim/blenderbim/tool/resource.py index b73dac91c7..a552303a42 100644 --- a/src/blenderbim/blenderbim/tool/resource.py +++ b/src/blenderbim/blenderbim/tool/resource.py @@ -264,6 +264,7 @@ class Resource(blenderbim.core.tool.Resource): props = bpy.context.scene.BIMResourceProperties props.active_resource_id = resource.id() props.editing_resource_type = "QUANTITY" + props.active_resource_class = resource.is_a() @classmethod def enable_editing_resource_quantity(cls, resource_quantity: ifcopenshell.entity_instance) -> None: From 02fd78df1433cb2dc465838fd5a0f29907c7158d Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 27 May 2024 17:18:44 +0500 Subject: [PATCH 305/429] datetime2ifc to support None values as it was before ebd03e9 #4734 --- .../ifcopenshell/util/date.py | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/date.py b/src/ifcopenshell-python/ifcopenshell/util/date.py index e547e5dbbf..50352544f7 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/date.py +++ b/src/ifcopenshell-python/ifcopenshell/util/date.py @@ -19,7 +19,7 @@ import datetime from re import findall from dateutil import parser -from typing import Literal, Union, Any +from typing import Literal, Union, Any, overload try: import isodate @@ -105,8 +105,11 @@ def readable_ifc_duration(string): return final_string +@overload +def datetime2ifc(dt: None, ifc_type: Any) -> None: ... +@overload def datetime2ifc( - dt: Union[datetime.date, str], + dt: Union[datetime.date, str, None], ifc_type: Literal[ "IfcDuration", "IfcTimeStamp", @@ -116,7 +119,19 @@ def datetime2ifc( "IfcCalendarDate", "IfcLocalTime", ], -) -> Union[int, str, dict[str, Any]]: +) -> Union[int, str, dict[str, Any], None]: ... +def datetime2ifc( + dt: Union[datetime.date, str, None], + ifc_type: Literal[ + "IfcDuration", + "IfcTimeStamp", + "IfcDateTime", + "IfcDate", + "IfcTime", + "IfcCalendarDate", + "IfcLocalTime", + ], +) -> Union[int, str, dict[str, Any], None]: if isinstance(dt, str): if ifc_type == "IfcDuration": return dt @@ -124,6 +139,8 @@ def datetime2ifc( dt = datetime.datetime.fromisoformat(dt) except: dt = datetime.time.fromisoformat(dt) + elif dt is None: + return if ifc_type == "IfcDuration": return isodate.duration_isoformat(dt) @@ -157,7 +174,8 @@ def datetime2ifc( "MinuteComponent": dt.minute, "SecondComponent": dt.second, } - raise TypeError(f"Unsupported ifc_type for conversion from datetime.datetime = {ifc_type}.") + + raise TypeError(f"Unsupported ifc_type for conversion from datetime.datetime = {ifc_type}, value = {dt}") def string_to_date(string): From 54978a986829d14babcf405f09015214d8cc7f58 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 27 May 2024 17:56:01 +0500 Subject: [PATCH 306/429] bim.load_product_related_tasks - show info message when finished to make ui a bit more responsive --- src/blenderbim/blenderbim/bim/module/sequence/operator.py | 6 +++++- src/blenderbim/blenderbim/core/sequence.py | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/sequence/operator.py b/src/blenderbim/blenderbim/bim/module/sequence/operator.py index c79503eab1..337a01c11f 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/operator.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/operator.py @@ -1409,9 +1409,13 @@ class LoadProductTasks(bpy.types.Operator): return True def execute(self, context): - core.load_product_related_tasks( + result = core.load_product_related_tasks( tool.Sequence, product=tool.Ifc.get().by_id(context.active_object.BIMObjectProperties.ifc_definition_id) ) + if isinstance(result, str): + self.report({"INFO"}, result) + else: + self.report({"INFO"}, f"{len(result)} product tasks loaded.") return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/core/sequence.py b/src/blenderbim/blenderbim/core/sequence.py index 510caa8a04..2289ce2951 100644 --- a/src/blenderbim/blenderbim/core/sequence.py +++ b/src/blenderbim/blenderbim/core/sequence.py @@ -593,17 +593,20 @@ def generate_gantt_chart(sequence: tool.Sequence, work_schedule: ifcopenshell.en sequence.generate_gantt_browser_chart(json, work_schedule) -def load_product_related_tasks(sequence: tool.Sequence, product: ifcopenshell.entity_instance) -> Union[None, str]: +def load_product_related_tasks( + sequence: tool.Sequence, product: ifcopenshell.entity_instance +) -> Union[list[ifcopenshell.entity_instance], str]: filter_by_schedule = sequence.is_filter_by_active_schedule() if filter_by_schedule: work_schedule = sequence.get_active_work_schedule() if work_schedule: task_inputs, task_ouputs = sequence.get_tasks_for_product(product, work_schedule) else: - return "No active work schedule" + return "No active work schedule." else: task_inputs, task_ouputs = sequence.get_tasks_for_product(product) sequence.load_product_related_tasks(task_inputs, task_ouputs) + return task_inputs + task_ouputs def reorder_task_nesting( From dd48fbcb0f1a82c1d3e04dabbec2824bdd2f4cec Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 27 May 2024 17:57:27 +0500 Subject: [PATCH 307/429] remove dead code core.sequence.highlight_product_related_task It's deprecated after UI changes in de3dfcd --- src/blenderbim/blenderbim/core/sequence.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/blenderbim/blenderbim/core/sequence.py b/src/blenderbim/blenderbim/core/sequence.py index 2289ce2951..b064f70bc6 100644 --- a/src/blenderbim/blenderbim/core/sequence.py +++ b/src/blenderbim/blenderbim/core/sequence.py @@ -533,20 +533,6 @@ def go_to_task(sequence: tool.Sequence, task: ifcopenshell.entity_instance) -> U return "Work schedule is not active" -def highlight_product_related_task(sequence: tool.Sequence, spatial: tool.Spatial, product_type=None) -> None: - products = spatial.get_selected_products() - if products: - if product_type == "Output": - tasks = sequence.find_related_output_tasks(products[0]) - elif product_type == "Input": - tasks = sequence.find_related_input_tasks(products[0]) - for task in tasks: - work_schedule = sequence.get_work_schedule(task) - is_work_schedule_active = sequence.is_work_schedule_active(work_schedule) - if is_work_schedule_active: - sequence.go_to_task(task) - - def guess_date_range(sequence: tool.Sequence, work_schedule: ifcopenshell.entity_instance) -> None: start, finish = sequence.guess_date_range(work_schedule) sequence.update_visualisation_date(start, finish) From 316934de9771ea76b566b61bb94a30c373045942 Mon Sep 17 00:00:00 2001 From: ppaawweeuu <61344631+ppaawweeuu@users.noreply.github.com> Date: Tue, 28 May 2024 01:43:51 +0200 Subject: [PATCH 308/429] Update selector_syntax.rst - small formating change (#4752) typing --- .../docs/ifcopenshell-python/selector_syntax.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst index cdc89f5af7..5cea364c72 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst @@ -235,6 +235,6 @@ nest formulas, for example ``concat(title("foo"), lower("Bar"))`` will produce "``title({{value}})``", "``title(""foo"")``", "``Foo``", "Titlecases a string." "``concat({{value}}[, {{value2}}]*)``", "``concat(""foo"", ""bar"")``", "``foobar``", "Concatenates two or more strings." "``round({{value}}, {{precision}})``", "``round(3.123, 0.1)``", "``3.1``", "Rounds ``{{value}}`` to the nearest ``{{precision}}``." - "``number({{value}}[, {{decimal_separator}}[, {{thousands_separator}}]])``", "``number(1234.56, "","", ""."")``", "1.234,56", "Formats {{value}} with an optional custom {{decimal_separator}} and {{thousands_separator}}. The default separators are ``.`` and ``,``." + "``number({{value}}[, {{decimal_separator}}[, {{thousands_separator}}]])``", "``number(1234.56, "","", ""."")``", "``1.234,56``", "Formats {{value}} with an optional custom {{decimal_separator}} and {{thousands_separator}}. The default separators are ``.`` and ``,``." "``metric_length({{value}}, {{precision}}, {{decimals}})``", "``metric_length(3.123, 0.1, 2)``", "``3.10``", "Rounds ``{{value}}`` to the nearest ``{{precision}}`` then displays using a certain amount of decimal places." "``imperial_length({{value}}, {{precision}}, {{input_unit}}, {{output_unit}})``", "``imperial_length(3.22, 4, ""foot"")``", "``3' - 3 3/4""``", "``The {{value}}`` may be specified either as ``foot`` or ``inch`` depending on ``{{input_unit}}``. The ``{{value}}`` is then rounded to the nearest ``1/{{precision}}`` inch then formatted using fractional feet and inches if ``{{output_unit}}`` is set to ``foot`` or just inches if ``{{output_unit}}`` is set to ``inch``." From 8403c32e76732fce95f72b6c6187ee173ecde4cb Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 28 May 2024 17:29:34 +1000 Subject: [PATCH 309/429] Adjust selector's behaviour to use the elements argument as a filtering subset This was always the original intention, but never worked as designed. This is so that you don't need to filter the entire file (which can be huge). --- .../ifcopenshell/util/selector.py | 67 ++++++++++++------ .../test/util/test_selector.py | 68 ++++++++++--------- 2 files changed, 80 insertions(+), 55 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 7d2c3b5869..1dcb9a0ba0 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -291,9 +291,10 @@ def filter_elements( :type ifc_file: ifcopenshell.file :param query: Query to execute :type query: str - :param elements: Base set of IFC elements for the query. - If provided, new elements found for the current query will be added to `elements`. - Elements explicitly excluded in the `query` will also be excluded from `elements` + :param elements: Base set of IFC elements for the query. If not provided, + all elements in the IFC are queried. If provided, the query will be + applied to this set of elements, so the result will be a subset of + elements. :type elements: set[ifcopenshell.entity_instance], optional :param edit_in_place: If `True`, mutate the provided `elements` in place. Defaults to `False` :type edit_in_place: bool @@ -497,11 +498,17 @@ def set_element_value( f"Failed to set value for element '{original_element}' with query '{query}' (invalid or unsupported query)." ) + class FacetTransformer(lark.Transformer): def __init__(self, ifc_file: ifcopenshell.file, elements: Optional[set[ifcopenshell.entity_instance]] = None): self.file = ifc_file self.results = [] - self.elements = set() if elements is None else elements + if elements is None: + self.base_elements = None + self.elements = set() + else: + self.base_elements = elements.copy() + self.elements = set() self.container_parents = {} self.container_trees = {} @@ -517,28 +524,44 @@ class FacetTransformer(lark.Transformer): self.elements = set() def instance(self, args): - if args[0].data == "globalid": - try: - self.elements.add(self.file.by_guid(args[0].children[0].value)) - except: - pass + if self.base_elements is None: + if args[0].data == "globalid": + try: + self.elements.add(self.file.by_guid(args[0].children[0].value)) + except: + pass + else: + try: + self.elements.remove(self.file.by_guid(args[1].children[0].value)) + except: + pass else: - try: - self.elements.remove(self.file.by_guid(args[1].children[0].value)) - except: - pass + if args[0].data == "globalid": + self.elements |= { + e for e in self.base_elements if getattr(e, "GlobalId", None) == args[0].children[0].value + } + else: + self.elements -= { + e for e in self.base_elements if getattr(e, "GlobalId", None) == args[1].children[0].value + } def entity(self, args): - if args[0].data == "ifc_class": - try: - self.elements |= set(self.file.by_type(args[0].children[0].value)) - except: - pass + if self.base_elements is None: + if args[0].data == "ifc_class": + try: + self.elements |= set(self.file.by_type(args[0].children[0].value)) + except: + pass + else: + try: + self.elements -= set(self.file.by_type(args[1].children[0].value)) + except: + pass else: - try: - self.elements -= set(self.file.by_type(args[1].children[0].value)) - except: - pass + if args[0].data == "ifc_class": + self.elements |= {e for e in self.base_elements if e.is_a(args[0].children[0].value)} + else: + self.elements -= {e for e in self.base_elements if e.is_a(args[1].children[0].value)} def attribute(self, args): name, comparison, value = args diff --git a/src/ifcopenshell-python/test/util/test_selector.py b/src/ifcopenshell-python/test/util/test_selector.py index 37a103d313..efcc5dfa9c 100644 --- a/src/ifcopenshell-python/test/util/test_selector.py +++ b/src/ifcopenshell-python/test/util/test_selector.py @@ -25,41 +25,41 @@ import ifcopenshell.util.pset import numpy as np -class TestFormat(): +class TestFormat: def test_no_formatting(self): assert subject.format("123") == "123" - assert subject.format('\"123\"') == "123" - assert subject.format('\"foo\"') == "foo" + assert subject.format('"123"') == "123" + assert subject.format('"foo"') == "foo" def test_string_formatting(self): - assert subject.format('upper(\"fOo\")') == "FOO" - assert subject.format('lower(\"fOo\")') == "foo" - assert subject.format('title(\"fOo\")') == "Foo" - assert subject.format('concat(\"fOo\", \"bar\")') == "fOobar" - assert subject.format('upper(concat(\"fOo\", \"bar\"))') == "FOOBAR" - assert subject.format('substr(\"foobar\", 3)') == "bar" - assert subject.format('substr(\"foobar\", 1, 2)') == "o" - assert subject.format('substr(\"foobar\", 1, -1)') == "ooba" + assert subject.format('upper("fOo")') == "FOO" + assert subject.format('lower("fOo")') == "foo" + assert subject.format('title("fOo")') == "Foo" + assert subject.format('concat("fOo", "bar")') == "fOobar" + assert subject.format('upper(concat("fOo", "bar"))') == "FOOBAR" + assert subject.format('substr("foobar", 3)') == "bar" + assert subject.format('substr("foobar", 1, 2)') == "o" + assert subject.format('substr("foobar", 1, -1)') == "ooba" def test_number_formatting(self): assert subject.format("round(123, 5)") == "125" - assert subject.format('round(\"123\", 5)') == "125" - assert subject.format('number(123)') == "123" - assert subject.format('number(1234.56)') == "1,234.56" + assert subject.format('round("123", 5)') == "125" + assert subject.format("number(123)") == "123" + assert subject.format("number(1234.56)") == "1,234.56" assert subject.format('number(123, ".")') == "123" - assert subject.format('number(\"123\", ".")') == "123" + assert subject.format('number("123", ".")') == "123" assert subject.format('number(123.12, ".")') == "123.12" assert subject.format('number(123.12, ",")') == "123,12" assert subject.format('number(1234.12, ",", ".")') == "1.234,12" - assert subject.format('metric_length(123, 5, 2)') == "125.00" - assert subject.format('metric_length(123.123, 0.1, 2)') == "123.10" - assert subject.format('metric_length(\"123\", 5, 2)') == "125.00" - assert subject.format('imperial_length(1, 1)') == "1'" - assert subject.format('imperial_length(3.123, 1)') == "3' - 1\"" - assert subject.format('imperial_length(3.123, 2)') == "3' - 1 1/2\"" - assert subject.format('imperial_length(\"3.123\", 2)') == "3' - 1 1/2\"" - assert subject.format('imperial_length(\"123.123\", 2, \"inch\", \"foot\")') == "10' - 3\"" - assert subject.format('imperial_length(\"123.123\", 2, \"inch\", \"inch\")') == "123\"" + assert subject.format("metric_length(123, 5, 2)") == "125.00" + assert subject.format("metric_length(123.123, 0.1, 2)") == "123.10" + assert subject.format('metric_length("123", 5, 2)') == "125.00" + assert subject.format("imperial_length(1, 1)") == "1'" + assert subject.format("imperial_length(3.123, 1)") == "3' - 1\"" + assert subject.format("imperial_length(3.123, 2)") == "3' - 1 1/2\"" + assert subject.format('imperial_length("3.123", 2)') == "3' - 1 1/2\"" + assert subject.format('imperial_length("123.123", 2, "inch", "foot")') == "10' - 3\"" + assert subject.format('imperial_length("123.123", 2, "inch", "inch")') == '123"' class TestGetElementValue(test.bootstrap.IFC4): @@ -269,17 +269,19 @@ class TestFilterElements(test.bootstrap.IFC4): def test_using_elements_argument(self): wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") slab = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") + door = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcDoor") + elements = {wall, slab} + results = subject.filter_elements(self.file, "IfcWall", {wall, slab}) + assert results != elements + assert results == {wall} + elements = {wall, slab, door} + assert subject.filter_elements(self.file, "IfcWall, IfcSlab", elements) == {wall, slab} - # keep elements unaffected by expression - assert subject.filter_elements(self.file, "IfcWall", {slab}) == {wall, slab} - - # filter out excluded elements - assert subject.filter_elements(self.file, "IfcWall, ! IfcSlab", {slab}) == {wall} - - # edit_in_place to update original set - original_set = set() + def test_editing_in_place(self): + wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + original_set = {wall} new_set = subject.filter_elements(self.file, "IfcWall", original_set, edit_in_place=True) - assert new_set == original_set + assert new_set == original_set == {wall} class TestSetElementValue(test.bootstrap.IFC4): From 54951d210250163fd69860e101956c2eb3c088c3 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 28 May 2024 17:29:52 +1000 Subject: [PATCH 310/429] Add convenience max/min functions for xyz and side_area shape calculations --- .../ifcopenshell/util/shape.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape.py b/src/ifcopenshell-python/ifcopenshell/util/shape.py index 1915c6cde0..8780d63920 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape.py @@ -117,6 +117,28 @@ def get_z(geometry) -> float: return max(z_values) - min(z_values) +def get_max_xyz(geometry) -> float: + """Gets the maximum X, Y, or Z length of the geometry + + :param geometry: Geometry output calculated by IfcOpenShell + :type geometry: geometry + :return: The maximum possible value out of the X, Y, and Z dimension + :rtype: float + """ + return max(get_x(geometry), get_y(geometry), get_z(geometry)) + + +def get_min_xyz(geometry) -> float: + """Gets the minimum X, Y, or Z length of the geometry + + :param geometry: Geometry output calculated by IfcOpenShell + :type geometry: geometry + :return: The minimum possible value out of the X, Y, and Z dimension + :rtype: float + """ + return min(get_x(geometry), get_y(geometry), get_z(geometry)) + + def get_shape_matrix(shape) -> MatrixType: """Formats the transformation matrix of a shape as a 4x4 numpy array @@ -486,6 +508,19 @@ def get_side_area( return get_area_vf(vertices, filtered_faces) +def get_max_side_area(geometry) -> float: + """Returns the maximum X, Y, or Z side area + + See :func:`get_side_area` for how side area is calculated. + + :param geometry: Geometry output calculated by IfcOpenShell + :type geometry: geometry + :return: The maximum surface area from either the X, Y, or Z axis. + :rtype: float + """ + return max(get_side_area(geometry, axis="X"), get_side_area(geometry, axis="Y"), get_side_area(geometry, axis="Z")) + + def get_footprint_area( geometry, axis: AXIS_LITERAL = "Z", From 5159e2daee3d12003de9a5fffcc3ba5f1c2d08b8 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 28 May 2024 17:32:51 +1000 Subject: [PATCH 311/429] Initial attempt at a qto module in Ifc5D This is a more flexible, non-Blender approach to doing QTO which allows: - Doing QTO without Blender - Doing QTO using query filters - Using config files for QTOs - Choosing your calculation engine, either built-in or creating your own --- src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json | 17 +++ src/ifc5d/ifc5d/qto.py | 135 +++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json create mode 100644 src/ifc5d/ifc5d/qto.py diff --git a/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json b/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json new file mode 100644 index 0000000000..f0627c19da --- /dev/null +++ b/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json @@ -0,0 +1,17 @@ +{ + "name": "IFC4 Base Quantities", + "description": "This ruleset quantifies every single possible standardised base quantity in IFC4", + "calculators": { + "IOSTriangulation": { + "IfcWall": { + "Qto_WallBaseQuantities": { + "Length": "net_get_x", + "Width": "net_get_y", + "Height": "net_get_z", + "NetSideArea": "net_get_side_area", + "NetVolume": "net_get_volume" + } + } + } + } +} diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py new file mode 100644 index 0000000000..ff322073a8 --- /dev/null +++ b/src/ifc5d/ifc5d/qto.py @@ -0,0 +1,135 @@ +# Ifc5D - IFC costing utility +# Copyright (C) 2021 Dion Moult +# +# This file is part of Ifc5D. +# +# Ifc5D is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ifc5D is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Ifc5D. If not, see . + +import os +import json +import ifcopenshell +import ifcopenshell.api +import ifcopenshell.api.pset +import ifcopenshell.util.selector +import multiprocessing +from typing import Optional + + +def get_rules(name: str): + cwd = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(cwd, name + ".json"), "r") as f: + return json.load(f) + + +def quantify(ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_instance], rules: dict): + results = {} + for calculator, queries in rules["calculators"].items(): + calculator = calculators[calculator] + for query, qtos in queries.items(): + filtered_elements = ifcopenshell.util.selector.filter_elements(ifc_file, query, elements) + calculator.calculate(ifc_file, filtered_elements, qtos, results) + return results + + +def edit_qtos(ifc_file, results): + for element, qtos in results.items(): + for name, quantities in qtos.items(): + qto = ifcopenshell.util.element.get_pset(element, name, should_inherit=False) + if qto: + qto = ifc_file.by_id(qto["id"]) + else: + qto = ifcopenshell.api.pset.add_qto(ifc_file, element, name) + ifcopenshell.api.pset.edit_qto(ifc_file, qto=qto, properties=quantities) + + +class IOSTriangulation: + @staticmethod + def calculate( + ifc_file: ifcopenshell.file, + elements: set[ifcopenshell.entity_instance], + qtos: dict, + results: Optional[dict] = None, + ): + import ifcopenshell + import ifcopenshell.geom + import ifcopenshell.util.shape + + if results is None: + results = {} + + formula_functions = {} + + gross_settings = ifcopenshell.geom.settings() + gross_settings.set(gross_settings.DISABLE_OPENING_SUBTRACTIONS, True) + net_settings = ifcopenshell.geom.settings() + + gross_qtos = {} + net_qtos = {} + + for name, quantities in qtos.items(): + for quantity, formula in quantities.items(): + if formula.startswith("gross_"): + formula = formula[6:] + gross_qtos.setdefault(name, {})[quantity] = formula + formula_functions[formula] = getattr(ifcopenshell.util.shape, formula) + elif formula.startswith("net_"): + formula = formula[4:] + net_qtos.setdefault(name, {})[quantity] = formula + formula_functions[formula] = getattr(ifcopenshell.util.shape, formula) + + tasks = [] + + if gross_qtos: + tasks.append((IOSTriangulation.create_iterator(ifc_file, gross_settings, elements), gross_qtos)) + + if net_qtos: + tasks.append((IOSTriangulation.create_iterator(ifc_file, net_settings, elements), net_qtos)) + + for iterator, qtos in tasks: + if iterator.initialize(): + while True: + shape = iterator.get() + element = ifc_file.by_id(shape.id) + results.setdefault(element, {}) + for name, quantities in qtos.items(): + results[element].setdefault(name, {}) + for quantity, formula in quantities.items(): + results[element][name][quantity] = formula_functions[formula](shape.geometry) + if not iterator.next(): + break + + return results + + @staticmethod + def create_iterator(ifc_file, settings, elements): + return ifcopenshell.geom.iterator(settings, ifc_file, multiprocessing.cpu_count(), include=elements) + + +class Blender: + @staticmethod + def calculate(ifc_file, elements, qtos): + import blenderbim.tool as tool + + for element in elements: + obj = tool.Ifc.get_object(element) + if not obj: + continue + + for name, quantities in qtos.items(): + for quantity, formula in quantities.items(): + getattr(tool.Qto, formula) + # TODO + + +calculators = {"Blender": Blender, "IOSTriangulation": IOSTriangulation} From 80c4c1399853796a8dfa703efdae176735980a42 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 28 May 2024 17:33:58 +1000 Subject: [PATCH 312/429] Basic prototype of new Ifc5D QTO tool in Blender. --- .../blenderbim/bim/module/qto/__init__.py | 5 ++-- .../blenderbim/bim/module/qto/operator.py | 29 ++++++++++++++++++- src/blenderbim/blenderbim/core/qto.py | 2 +- .../geometry_processing.rst | 1 + 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/qto/__init__.py b/src/blenderbim/blenderbim/bim/module/qto/__init__.py index 87256a846b..7059281f9f 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/qto/__init__.py @@ -20,14 +20,15 @@ import bpy from . import ui, prop, operator classes = ( + operator.AssignBaseQto, + operator.CalculateAllQuantities, operator.CalculateCircleRadius, operator.CalculateEdgeLengths, operator.CalculateFaceAreas, operator.CalculateObjectVolumes, operator.ExecuteQtoMethod, + operator.PerformQuantityTakeOff, operator.QuantifyObjects, - operator.AssignBaseQto, - operator.CalculateAllQuantities, prop.BIMQtoProperties, ui.BIM_PT_qto_utilities, ) diff --git a/src/blenderbim/blenderbim/bim/module/qto/operator.py b/src/blenderbim/blenderbim/bim/module/qto/operator.py index de3084a898..88fa33841c 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/operator.py +++ b/src/blenderbim/blenderbim/bim/module/qto/operator.py @@ -197,7 +197,34 @@ class CalculateAllQuantities(bpy.types.Operator, tool.Ifc.Operator): return tool.Ifc.get() and context.selected_objects def _execute(self, context): - core.calculate_objects_base_quantities( + core.calculate_all_quantities( tool.Ifc, tool.Cost, tool.Qto, QtoCalculator(), selected_objects=context.selected_objects ) return {"FINISHED"} + + +class PerformQuantityTakeOff(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.perform_quantity_take_off" + bl_label = "Perform Quantity Take-off" + bl_options = {"REGISTER", "UNDO"} + bl_description = "Perform a quantity take off based of a QTO rule configuration" + + @classmethod + def poll(cls, context): + return tool.Ifc.get() and context.selected_objects + + def _execute(self, context): + import ifc5d.qto + + elements = set() + for obj in context.selected_objects: + element = tool.Ifc.get_entity(obj) + if element: + elements.add(element) + + rules = ifc5d.qto.get_rules("IFC4QtoBaseQuantities") + + ifc_file = tool.Ifc.get() + results = ifc5d.qto.quantify(ifc_file, elements, rules) + ifc5d.qto.edit_qtos(ifc_file, results) + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/core/qto.py b/src/blenderbim/blenderbim/core/qto.py index 52aacf6e3a..cf5a9c38e3 100644 --- a/src/blenderbim/blenderbim/core/qto.py +++ b/src/blenderbim/blenderbim/core/qto.py @@ -42,7 +42,7 @@ def assign_object_base_qto(ifc, qto, obj): ) -def calculate_objects_base_quantities(ifc, cost, qto, calculator, selected_objects): +def calculate_all_quantities(ifc, cost, qto, calculator, selected_objects): if selected_objects: for obj in selected_objects: calculate_object_base_quantities(ifc, cost, qto, calculator, obj) diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_processing.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_processing.rst index 92512eddc5..18d8f36813 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_processing.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_processing.rst @@ -228,6 +228,7 @@ Here is a simple example in Python: if iterator.initialize(): while True: shape = iterator.get() + element = ifc_file.by_id(shape.id) matrix = shape.transformation.matrix.data faces = shape.geometry.faces edges = shape.geometry.edges From 8817a7e6d52c3ad81d4541365b415b6494ad2a5e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 28 May 2024 11:42:38 +0500 Subject: [PATCH 313/429] qtocalculator to support backported EQto_BodyGeometryValidation --- .../blenderbim/bim/data/pset/EQto_BodyGeometryValidation.ifc | 1 + .../blenderbim/bim/module/pset/calc_quantity_function_mapper.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/data/pset/EQto_BodyGeometryValidation.ifc b/src/blenderbim/blenderbim/bim/data/pset/EQto_BodyGeometryValidation.ifc index 07c7b82603..f830cb907b 100644 --- a/src/blenderbim/blenderbim/bim/data/pset/EQto_BodyGeometryValidation.ifc +++ b/src/blenderbim/blenderbim/bim/data/pset/EQto_BodyGeometryValidation.ifc @@ -5,6 +5,7 @@ FILE_NAME('EQto_BodyGeometryValidation.ifc','2020-01-01T00:00:00',(),(),'EQto_Bo FILE_SCHEMA(('IFC4')); ENDSEC; DATA; +/* This quantity set is Qto_BodyGeometryValidation backport from IFC4X3 to support IFC4. */ #1=IFCPROPERTYSETTEMPLATE('2KS9su6r517uLXTGKwwDdn',$,'EQto_BodyGeometryValidation','Quantities supplied for validating the correct interpretation of the body shape representation at import. In case of multiple representation items, the quantities are summed for each of the items (irrespective of any overlap). Choosing a suitable tolerance value for comparing the supplied numbers to the numbers calculated from the reconstructed geometry is at the discretion of the importing application.',.QTO_OCCURRENCEDRIVEN.,'IfcProduct',(#2,#3,#4,#5,#6,#7)); #2=IFCSIMPLEPROPERTYTEMPLATE('3iCdOOLRjCwQ_HRTB41Xh8',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.\X2\000A000A\X0\Total gross surface area of the element before applying product-level geometric features such as openings and projections.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); #3=IFCSIMPLEPROPERTYTEMPLATE('0juemEqF5889vg7HwR87Fv',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net surface area of the element after applying product-level geometric features such as openings and projections.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); diff --git a/src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py b/src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py index dd7045df7f..e484b97717 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py +++ b/src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py @@ -575,3 +575,5 @@ mapper = { 'OvertimeWork' : None, }, } + +mapper["EQto_BodyGeometryValidation"] = mapper["Qto_BodyGeometryValidation"] From f27dbacd288d7595f75a48ddcd71b8f886bd21e9 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 28 May 2024 12:42:53 +0500 Subject: [PATCH 314/429] prioritize qto base psets over other qto_ qsets after 70a4af2 #4740 1) e.g. in ifc4x3 previously for IfcWall it would prioritize Qto_BodyGeometryValidation over Qto_WallBaseQuantities 2) It would also prioritize general Qto_BodyGeometryValidation over Qto_BuildingElementProxyQuantities. 3) removed "Qto_" check as we do qto_only in get_applicable_names --- src/blenderbim/blenderbim/tool/qto.py | 11 ++++++++++- src/blenderbim/test/tool/test_qto.py | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/qto.py b/src/blenderbim/blenderbim/tool/qto.py index 68893fa661..7132618401 100644 --- a/src/blenderbim/blenderbim/tool/qto.py +++ b/src/blenderbim/blenderbim/tool/qto.py @@ -79,7 +79,16 @@ class Qto(blenderbim.core.tool.Qto): product.is_a(), ifcopenshell.util.element.get_predefined_type(product), qto_only=True ) # See https://github.com/buildingSMART/IFC4.3.x-development/issues/851 for anomalies in Qto naming - return next((qto_name for qto_name in applicable_qto_names if "Qto_" in qto_name), None) + applicable_qto: Union[str, None] = None + for qto_name in applicable_qto_names: + # No need for "Qto_" check since we use qto_only=True. + if "Base" in qto_name: + return qto_name + # Prioritize anomaly named base quantities over Qto_BodyGeometryValidation. + if applicable_qto and "BodyGeometryValidation" not in applicable_qto: + continue + applicable_qto = qto_name + return applicable_qto @classmethod def get_new_calculated_quantity(cls, qto_name: str, quantity_name: str, obj: bpy.types.Object) -> float: diff --git a/src/blenderbim/test/tool/test_qto.py b/src/blenderbim/test/tool/test_qto.py index e00f74618d..93a998e5e7 100644 --- a/src/blenderbim/test/tool/test_qto.py +++ b/src/blenderbim/test/tool/test_qto.py @@ -65,13 +65,26 @@ class TestGetApplicableBaseQuantityName(test.bim.bootstrap.NewFile): wall = ifc.createIfcWall() assert subject.get_applicable_base_quantity_name(wall) == "Qto_WallBaseQuantities" - def test_no_base_quantity(self): + def test_no_quantities(self): ifc = ifcopenshell.file() tool.Ifc.set(ifc) ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcProject") product = ifc.by_type("IfcProject")[0] assert subject.get_applicable_base_quantity_name(product) == None + def test_anomaly_named_quantities(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + product = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcBuildingElementProxy") + # Prioritized over Qto_BodyGeometryValidation. + assert subject.get_applicable_base_quantity_name(product) == "Qto_BuildingElementProxyQuantities" + + def test_prioritize_base_over_other_qto(self): + ifc = ifcopenshell.file(schema="IFC4X3") + tool.Ifc.set(ifc) + product = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcWall") + assert subject.get_applicable_base_quantity_name(product) == "Qto_WallBaseQuantities" + class TestGetRoundedValue(test.bim.bootstrap.NewFile): def test_run(self): From 6035683492f33c7a0103c4cfd9ce9cc7904a59e3 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 28 May 2024 12:05:14 +0500 Subject: [PATCH 315/429] sync get_base_qto after 70a4af2 --- src/blenderbim/blenderbim/tool/qto.py | 23 +++++++++++---- src/blenderbim/test/tool/test_qto.py | 42 ++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/qto.py b/src/blenderbim/blenderbim/tool/qto.py index 7132618401..24e565e757 100644 --- a/src/blenderbim/blenderbim/tool/qto.py +++ b/src/blenderbim/blenderbim/tool/qto.py @@ -79,6 +79,7 @@ class Qto(blenderbim.core.tool.Qto): product.is_a(), ifcopenshell.util.element.get_predefined_type(product), qto_only=True ) # See https://github.com/buildingSMART/IFC4.3.x-development/issues/851 for anomalies in Qto naming + # Should be in sync with cls.get_base_qto. applicable_qto: Union[str, None] = None for qto_name in applicable_qto_names: # No need for "Qto_" check since we use qto_only=True. @@ -181,14 +182,24 @@ class Qto(blenderbim.core.tool.Qto): def get_base_qto(cls, product: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: if not hasattr(product, "IsDefinedBy"): return + # Should be in sync with cls.get_applicable_base_quantity_name. + base_qto_definition = None + base_qto_definition_name: Union[str, None] = None for rel in product.IsDefinedBy or []: - if not ( - rel.is_a("IfcRelDefinesByProperties") - and "Base" in rel.RelatingPropertyDefinition.Name - and "Qto_" in rel.RelatingPropertyDefinition.Name - ): + definition = rel.RelatingPropertyDefinition + if not rel.is_a("IfcRelDefinesByProperties"): continue - return rel.RelatingPropertyDefinition + definition = rel.RelatingPropertyDefinition + definition_name = definition.Name + if "Qto_" not in definition_name: + continue + if "Base" in definition_name: + return definition + if base_qto_definition and "BodyGeometryValidation" not in base_qto_definition_name: + continue + base_qto_definition = definition + base_qto_definition_name = definition_name + return base_qto_definition @classmethod def get_related_cost_item_quantities(cls, product: ifcopenshell.entity_instance) -> list[dict]: diff --git a/src/blenderbim/test/tool/test_qto.py b/src/blenderbim/test/tool/test_qto.py index 93a998e5e7..4713fcea4b 100644 --- a/src/blenderbim/test/tool/test_qto.py +++ b/src/blenderbim/test/tool/test_qto.py @@ -226,7 +226,7 @@ class TestGetBaseQto(test.bim.bootstrap.NewFile): assert subject.get_base_qto(product).id() == pset_qto.get_info()["id"] assert subject.get_base_qto(product).Name == pset_qto.Name - def test_isempty(self): + def test_no_quantities(self): ifc = ifcopenshell.file() tool.Ifc.set(ifc) wall = ifc.createIfcWall() @@ -235,6 +235,46 @@ class TestGetBaseQto(test.bim.bootstrap.NewFile): product = tool.Ifc.get_entity(wall_obj) assert not subject.get_base_qto(product) == True + def test_anomaly_named_quantities(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + product = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcBuildingElementProxy") + tool.Ifc.run( + "pset.add_qto", + product=product, + name="EQto_BodyGeometryValidation", + ) + tool.Ifc.run( + "pset.add_qto", + product=product, + name="Qto_BuildingElementProxyQuantities", + ) + # Prioritized over Qto_BodyGeometryValidation. + base_qto_name = subject.get_base_qto(product).Name + assert base_qto_name == "Qto_BuildingElementProxyQuantities" + # Ensure methods are in sync. + assert base_qto_name == subject.get_applicable_base_quantity_name(product) + + def test_prioritize_base_over_other_qto(self): + ifc = ifcopenshell.file(schema="IFC4X3") + tool.Ifc.set(ifc) + product = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcWall") + tool.Ifc.run( + "pset.add_qto", + product=product, + name="Qto_BodyGeometryValidation", + ) + tool.Ifc.run( + "pset.add_qto", + product=product, + name="Qto_WallBaseQuantities", + ) + # Prioritized over Qto_BodyGeometryValidation. + base_qto_name = subject.get_base_qto(product).Name + assert base_qto_name == "Qto_WallBaseQuantities" + # Ensure methods are in sync. + assert base_qto_name == subject.get_applicable_base_quantity_name(product) + class TestGetRelatedCostItemQuantities(test.bim.bootstrap.NewFile): def test_run(self): From a09cb5dee422a58c713a4078f438eb5223f5469b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 28 May 2024 11:09:05 +0500 Subject: [PATCH 316/429] typing --- .../blenderbim/bim/module/pset/data.py | 1 + .../blenderbim/bim/module/pset/prop.py | 1 + src/blenderbim/blenderbim/core/qto.py | 23 +++++++++++++++---- src/blenderbim/test/tool/test_qto.py | 1 + 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/data.py b/src/blenderbim/blenderbim/bim/module/pset/data.py index 92d0cf112c..6e9d14b0d5 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/data.py +++ b/src/blenderbim/blenderbim/bim/module/pset/data.py @@ -19,6 +19,7 @@ import bpy import ifcopenshell import ifcopenshell.util.doc +import ifcopenshell.util.element import blenderbim.tool as tool import blenderbim.bim.schema diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index 3834f4337e..12ad36d779 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -20,6 +20,7 @@ import bpy import blenderbim.bim.schema import ifcopenshell import ifcopenshell.util.attribute +import ifcopenshell.util.doc import ifcopenshell.util.element import blenderbim.tool as tool from blenderbim.bim.prop import Attribute, StrProperty diff --git a/src/blenderbim/blenderbim/core/qto.py b/src/blenderbim/blenderbim/core/qto.py index cf5a9c38e3..a1fa8ec77d 100644 --- a/src/blenderbim/blenderbim/core/qto.py +++ b/src/blenderbim/blenderbim/core/qto.py @@ -16,19 +16,28 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from __future__ import annotations +from typing import TYPE_CHECKING, Optional -def calculate_circle_radius(qto, obj=None): +if TYPE_CHECKING: + import bpy + import ifcopenshell + import blenderbim.tool as tool + from blenderbim.bim.module.pset.qto_calculator import QtoCalculator + + +def calculate_circle_radius(qto: tool.Qto, obj: bpy.types.Object) -> float: result = qto.get_radius_of_selected_vertices(obj) qto.set_qto_result(result) return result -def assign_objects_base_qto(ifc, qto, selected_objects): +def assign_objects_base_qto(ifc: tool.Ifc, qto: tool.Qto, selected_objects: list[bpy.types.Object]) -> None: for obj in selected_objects: assign_object_base_qto(ifc, qto, obj) -def assign_object_base_qto(ifc, qto, obj): +def assign_object_base_qto(ifc: tool.Ifc, qto: tool.Qto, obj: bpy.types.Object) -> None: product = ifc.get_entity(obj) if not product: return @@ -42,13 +51,17 @@ def assign_object_base_qto(ifc, qto, obj): ) -def calculate_all_quantities(ifc, cost, qto, calculator, selected_objects): +def calculate_all_quantities( + ifc: tool.Ifc, cost: tool.Cost, qto: tool.Qto, calculator: QtoCalculator, selected_objects: list[bpy.types.Object] +) -> None: if selected_objects: for obj in selected_objects: calculate_object_base_quantities(ifc, cost, qto, calculator, obj) -def calculate_object_base_quantities(ifc, cost, qto, calculator, obj): +def calculate_object_base_quantities( + ifc: tool.Ifc, cost: tool.Cost, qto: tool.Qto, calculator: QtoCalculator, obj: bpy.types.Object +) -> None: product = ifc.get_entity(obj) if not product: return diff --git a/src/blenderbim/test/tool/test_qto.py b/src/blenderbim/test/tool/test_qto.py index 4713fcea4b..81f87dad07 100644 --- a/src/blenderbim/test/tool/test_qto.py +++ b/src/blenderbim/test/tool/test_qto.py @@ -19,6 +19,7 @@ import bpy import ifcopenshell import ifcopenshell.api +import ifcopenshell.util.pset import test.bim.bootstrap import blenderbim.core.tool import blenderbim.core.root From eeaa0a5530fd28b9d51e34e443b7dc942d463c8a Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 28 May 2024 15:15:14 +0500 Subject: [PATCH 317/429] Fill IfcPropertySetTemplate.TemplateType in ifc2x3 pset templates --- .../util/generate_pset_templates.py | 46 +- .../ifcopenshell/util/schema/Pset_IFC2X3.ifc | 638 +++++++++--------- 2 files changed, 363 insertions(+), 321 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py b/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py index fd9abdee5b..3a0ac9e681 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py +++ b/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py @@ -18,6 +18,7 @@ RUN_FROM_DEV_REPO = False +import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper import ifcopenshell.api import ifcopenshell.guid import ifcopenshell.util.attribute @@ -100,7 +101,7 @@ class PsetTemplatesGenerator: print("Starting parsing data for IFC2X3...") if not IFC2x3_HTML_ZIP_LOCATION.is_file(): raise Exception( - f'ISO release for IFC2x3 TC1 expected to be in folder "{IFC2x3_HTML_ZIP_LOCATION.resolve()}\\"\n' + f'ISO release for IFC2x3 TC1 expected to be located in "{IFC2x3_HTML_ZIP_LOCATION.resolve()}"\n' "For doc extraction please either setup docs as described above \n" "or change IFC2x3_HTML_LOCATION in the script accordingly.\n" "You can download docs from the url: \n" @@ -176,8 +177,12 @@ class PsetTemplatesGenerator: TemplateType=root_xml.get("templatetype"), Name=pset_name, Description=root_xml.find("Definition").text, - ApplicableEntity=",".join(applicable_entities), + ApplicableEntity=",".join(applicable_entities).strip(), ) + if project_name.startswith("IFC2X3"): + pset.TemplateType = self.get_pset_template_type_ifc2x3(pset) + else: + pset.TemplateType = root_xml.get("templatetype") # NOTE: there is also Applicability tag # but it's seems always empty in ifc4 and ifc4x3 @@ -369,6 +374,43 @@ class PsetTemplatesGenerator: pset_property.PrimaryMeasureType = primary_measure_type + def get_pset_template_type_ifc2x3(self, pset_template: ifcopenshell.entity_instance) -> str: + def declaration_is_a(declaration: ifcopenshell_wrapper.declaration, ifc_class: str) -> bool: + if declaration.name() == ifc_class: + return True + super_type = declaration.supertype() + if not super_type: + return False + return declaration_is_a(super_type, ifc_class) + + name = pset_template.Name + applicability = pset_template.ApplicableEntity + schema = ifcopenshell.schema_by_name("IFC2X3") + + if "PHistory" in name: + return "PSET_PERFORMANCEDRIVEN" + applicable_types = applicability.replace(", ", ",").split(",") + for applicable_type in applicable_types: + if not applicable_type: + continue + parts = applicable_type.split("/") + assert 3 > len(parts) > 0 + if parts[0].isupper(): # IFC2X3 thing + applicable_type = parts[1] + else: + applicable_type = parts[0] + applicable_type = applicable_type.strip() + + declaration = schema.declaration_by_name(applicable_type) + if declaration_is_a(declaration, "IfcTypeObject"): + return "PSET_TYPEDRIVENOVERRIDE" + # ifc4x3+ + elif declaration_is_a(declaration, "IfcProfileDef"): + return "PSET_PROFILEDRIVEN" + elif declaration_is_a(declaration, "IfcMaterialDefinition"): + return "PSET_MATERIALDRIVEN" + return "PSET_OCCURRENCEDRIVEN" + if __name__ == "__main__": templates_generator = PsetTemplatesGenerator() diff --git a/src/ifcopenshell-python/ifcopenshell/util/schema/Pset_IFC2X3.ifc b/src/ifcopenshell-python/ifcopenshell/util/schema/Pset_IFC2X3.ifc index 22201798b9..eefa73e8dc 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/schema/Pset_IFC2X3.ifc +++ b/src/ifcopenshell-python/ifcopenshell/util/schema/Pset_IFC2X3.ifc @@ -1,13 +1,13 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); -FILE_NAME('/dev/null','2023-10-26T15:50:26+05:00',(),(),'IfcOpenShell v0.7.0-f0e03c79d','IfcOpenShell v0.7.0-f0e03c79d','Nobody'); -FILE_SCHEMA(('IFC4X3')); +FILE_NAME('/dev/null','2024-05-28T16:48:38+05:00',(),(),'IfcOpenShell v0.7.0-f7c03db75','IfcOpenShell v0.7.0-f7c03db75','Nobody'); +FILE_SCHEMA(('IFC4X3_ADD2')); ENDSEC; DATA; #1=IFCPROJECT('2F24BjnDX87uPNbhYHS60Q',$,'IFC2X3 Property Set Templates',$,$,$,$,$,$); #2=IFCRELDECLARES('1_xZb6xLzA9hGuDAEtOfga',$,$,$,#1,(#3,#13,#17,#21,#24,#27,#30,#33,#43,#53,#66,#77,#83,#90,#94,#98,#102,#110,#118,#124,#128,#134,#140,#145,#150,#154,#160,#167,#172,#179,#184,#189,#194,#201,#210,#221,#226,#239,#245,#249,#251,#253,#255,#265,#277,#287,#297,#301,#303,#306,#315,#319,#322,#324,#326,#329,#334,#337,#340,#343,#349,#358,#370,#379,#385,#394,#399,#417,#425,#455,#458,#461,#465,#468,#480,#489,#499,#515,#517,#524,#531,#536,#542,#560,#575,#588,#600,#610,#624,#628,#635,#661,#667,#689,#696,#728,#732,#739,#741,#743,#745,#758,#762,#773,#778,#794,#797,#807,#814,#818,#823,#832,#840,#852,#866,#878,#893,#897,#901,#916,#929,#934,#936,#942,#945,#953,#955,#957,#962,#965,#969,#971,#976,#985,#987,#997,#1000,#1012,#1015,#1025,#1028,#1031,#1038,#1048,#1061,#1071,#1074,#1081,#1094,#1098,#1105,#1109,#1113,#1129,#1139,#1149,#1155,#1159,#1161,#1175,#1177,#1186,#1190,#1192,#1196,#1200,#1203,#1205,#1212,#1216,#1227,#1231,#1233,#1235,#1238,#1240,#1242,#1251,#1263,#1275,#1294,#1305,#1315,#1326,#1337,#1349,#1360,#1373,#1382,#1393,#1399,#1416,#1425,#1438,#1454,#1471,#1481,#1492,#1501,#1505,#1510,#1522,#1524,#1531,#1544,#1549,#1555,#1560,#1571,#1574,#1580,#1591,#1597,#1603,#1607,#1620,#1630,#1633,#1641,#1645,#1647,#1663,#1666,#1670,#1677,#1684,#1690,#1698,#1711,#1728,#1732,#1739,#1746,#1751,#1760,#1764,#1770,#1781,#1793,#1805,#1816,#1826,#1847,#1857,#1871,#1875,#1889,#1897,#1901,#1905,#1913,#1915,#1919,#1923,#1925,#1927,#1929,#1933,#1936,#1939,#1943,#1946,#1948,#1961,#1968,#1974,#1980,#1986,#1991,#1996,#2009,#2023,#2031,#2038,#2044,#2049,#2056,#2061,#2068,#2073,#2078,#2085,#2089,#2096,#2103,#2107,#2114,#2116,#2118,#2121,#2126,#2132,#2146,#2148,#2165,#2171,#2176,#2183,#2192,#2196,#2210,#2213,#2216,#2223,#2234,#2251,#2261,#2280,#2287,#2292,#2302,#2307,#2322,#2330,#2352,#2360,#2368)); -#3=IFCPROPERTYSETTEMPLATE('1_nMpQK0jBkRugn3$B21pT',$,'Pset_SpaceProgramCommon','Definition from IAI: Properties common to the definition of all instances of IfcSpaceProgram',$,'IfcSpaceProgram',(#4,#5,#6,#7,#8,#9,#10,#11,#12)); +#3=IFCPROPERTYSETTEMPLATE('1_nMpQK0jBkRugn3$B21pT',$,'Pset_SpaceProgramCommon','Definition from IAI: Properties common to the definition of all instances of IfcSpaceProgram',.PSET_OCCURRENCEDRIVEN.,'IfcSpaceProgram',(#4,#5,#6,#7,#8,#9,#10,#11,#12)); #4=IFCSIMPLEPROPERTYTEMPLATE('0ONbg9f512Qv2_8y0PRr8w',$,'Location','General description of the required location for the space (e.g. "third floor south") ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #5=IFCSIMPLEPROPERTYTEMPLATE('2w0cn_xgnCs996cwkDv8Kv',$,'FunctionRequirement','General description of the functional requirement for the space (in addition to the space name)',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #6=IFCSIMPLEPROPERTYTEMPLATE('3lN6cj339CKRs6VQ91MT6R',$,'SecurityRequirement','General description of the security requirement for the space (in addition to the function requirement)',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -17,27 +17,27 @@ DATA; #10=IFCSIMPLEPROPERTYTEMPLATE('306i$_7IfBy87nmCxX$375',$,'EmployeeType','General description of the employee type that will occupy the space (e.g. manager, programmer, secretary, etc.). The type classification depends on the company based terms for employee types. ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #11=IFCSIMPLEPROPERTYTEMPLATE('1LjmKTwzv6r9Dh5cUr43Fw',$,'OccupancyType','Occupancy type for this object.\X2\000A\X0\It is defined according to the presiding national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #12=IFCSIMPLEPROPERTYTEMPLATE('0wLaO36LT3BRVb$JUFPTpW',$,'OccupancyNumber','Maximum number of occupants for the designed usage of the space.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#13=IFCPROPERTYSETTEMPLATE('1m5X0yFtj6i9uqkhjTo5qW',$,'Pset_ActuatorTypeCommon','Definition from IAI: Actuator type common attributes.',$,'IfcActuatorType',(#14,#16)); +#13=IFCPROPERTYSETTEMPLATE('1m5X0yFtj6i9uqkhjTo5qW',$,'Pset_ActuatorTypeCommon','Definition from IAI: Actuator type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcActuatorType',(#14,#16)); #14=IFCSIMPLEPROPERTYTEMPLATE('1QbIhXYKT6tvvNzxqxJe8o',$,'FailPosition','Specifies the required fail-safe position of the actuator.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#15,$,$,$,.READWRITE.); #15=IFCPROPERTYENUMERATION('PEnum_FailPosition',(IFCLABEL('FailOpen'),IFCLABEL('FailClosed'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #16=IFCSIMPLEPROPERTYTEMPLATE('2BsFhxc6D5Qusx6dAldKbQ',$,'ManualOverride','Identifies whether hand-operated operation is provided as an override (= TRUE) or not (= FALSE). Note that this value should be set to FALSE by default in the case of a Hand Operated Actuator.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#17=IFCPROPERTYSETTEMPLATE('0Z3BgOOPvDaRX2ev9Ak57E',$,'Pset_ActuatorTypeElectricActuator','Definition from IAI: A device that electrically actuates a control element. ',$,'IfcActuatorType',(#18,#19)); +#17=IFCPROPERTYSETTEMPLATE('0Z3BgOOPvDaRX2ev9Ak57E',$,'Pset_ActuatorTypeElectricActuator','Definition from IAI: A device that electrically actuates a control element. ',.PSET_TYPEDRIVENOVERRIDE.,'IfcActuatorType',(#18,#19)); #18=IFCSIMPLEPROPERTYTEMPLATE('1leI9ll3r399Nir4Ds817x',$,'ActuatorInputPower','Maximum input power requirement ',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #19=IFCSIMPLEPROPERTYTEMPLATE('2vJAqjmdTDZQTf6QGQ3SMK',$,'ElectricActuatorType','Enumeration that identifies electric actuator as defined by its operational principle. ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#20,$,$,$,.READWRITE.); #20=IFCPROPERTYENUMERATION('PEnum_ElectricActuatorType',(IFCLABEL('MotorDrive'),IFCLABEL('Magnetic'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#21=IFCPROPERTYSETTEMPLATE('1W7AXk4V5COOVGNTXgVzvK',$,'Pset_ActuatorTypeHydraulicActuator','Definition from IAI: A device that hydraulically actuates a control element. ',$,'IfcActuatorType',(#22,#23)); +#21=IFCPROPERTYSETTEMPLATE('1W7AXk4V5COOVGNTXgVzvK',$,'Pset_ActuatorTypeHydraulicActuator','Definition from IAI: A device that hydraulically actuates a control element. ',.PSET_TYPEDRIVENOVERRIDE.,'IfcActuatorType',(#22,#23)); #22=IFCSIMPLEPROPERTYTEMPLATE('3a$PWWODT5ufsiQYh_h5fG',$,'InputPressure','Maximum design pressure for the actuator.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #23=IFCSIMPLEPROPERTYTEMPLATE('3U1s_nnIP3rOZi53fRqHsV',$,'InputFlowrate','Maximum hydraulic flowrate requirement. ',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#24=IFCPROPERTYSETTEMPLATE('0xiobc92fB$xDzu6Op_mDJ',$,'Pset_ActuatorTypeLinearActuation','Definition from IAI: Characteristics of linear actuation of an actuator\X2\000A\X0\History: Replaces Pset_LinearActuator',$,'IfcActuatorType',(#25,#26)); +#24=IFCPROPERTYSETTEMPLATE('0xiobc92fB$xDzu6Op_mDJ',$,'Pset_ActuatorTypeLinearActuation','Definition from IAI: Characteristics of linear actuation of an actuator\X2\000A\X0\History: Replaces Pset_LinearActuator',.PSET_TYPEDRIVENOVERRIDE.,'IfcActuatorType',(#25,#26)); #25=IFCSIMPLEPROPERTYTEMPLATE('2u_adPuWX72BL5C6gvOElD',$,'Force','Indicates the maximum close-off force for the actuator.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); #26=IFCSIMPLEPROPERTYTEMPLATE('0ZdssDznPEuxkImga6SOYo',$,'Stroke','Indicates the maximum distance the actuator must traverse.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#27=IFCPROPERTYSETTEMPLATE('3nIJzmf9X28fI58wO5rRZr',$,'Pset_ActuatorTypePneumaticActuator','Definition from IAI: A device that pneumatically actuates a control element ',$,'IfcActuatorType',(#28,#29)); +#27=IFCPROPERTYSETTEMPLATE('3nIJzmf9X28fI58wO5rRZr',$,'Pset_ActuatorTypePneumaticActuator','Definition from IAI: A device that pneumatically actuates a control element ',.PSET_TYPEDRIVENOVERRIDE.,'IfcActuatorType',(#28,#29)); #28=IFCSIMPLEPROPERTYTEMPLATE('275QysDR5DNRbR2x1knSBj',$,'InputPressure','Maximum input control air pressure requirement ',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #29=IFCSIMPLEPROPERTYTEMPLATE('1xwhTuOgD04xfCrXg9tmpj',$,'InputFlowrate','Maximum input control air flowrate requirement ',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#30=IFCPROPERTYSETTEMPLATE('0EZZ$tZ49EHOWraUzbWupV',$,'Pset_ActuatorTypeRotationalActuation','Definition from IAI: Characteristics of rotational actuation of an actuator\X2\000A\X0\History: Replaces Pset_RotationalActuator',$,'IfcActuatorType',(#31,#32)); +#30=IFCPROPERTYSETTEMPLATE('0EZZ$tZ49EHOWraUzbWupV',$,'Pset_ActuatorTypeRotationalActuation','Definition from IAI: Characteristics of rotational actuation of an actuator\X2\000A\X0\History: Replaces Pset_RotationalActuator',.PSET_TYPEDRIVENOVERRIDE.,'IfcActuatorType',(#31,#32)); #31=IFCSIMPLEPROPERTYTEMPLATE('3JSj1nE6X88ftq1lJbFgYP',$,'Torque','Indicates the maximum close-off torque for the actuator.',.P_SINGLEVALUE.,'IfcTorqueMeasure',$,$,$,$,$,.READWRITE.); #32=IFCSIMPLEPROPERTYTEMPLATE('1M$etoEIn0DPce84PwKMiZ',$,'RangeAngle','Indicates the maximum rotation the actuator must traverse.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#33=IFCPROPERTYSETTEMPLATE('0UngQYZNv4uOLStgTpPcmI',$,'Pset_AnalogInput','Definition from IAI: Defines the characteristics of an analog input.',$,'IfcDistributionControlElement',(#34,#35,#36,#37,#38,#39,#41)); +#33=IFCPROPERTYSETTEMPLATE('0UngQYZNv4uOLStgTpPcmI',$,'Pset_AnalogInput','Definition from IAI: Defines the characteristics of an analog input.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionControlElement',(#34,#35,#36,#37,#38,#39,#41)); #34=IFCSIMPLEPROPERTYTEMPLATE('3MjbD4ULPDc9G7XEc$JOuP',$,'HighLimit','The high limit value for the analog input.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #35=IFCSIMPLEPROPERTYTEMPLATE('3$ICXcH516vA4iWBzemInL',$,'LowLimit','The low limit value for the analog input.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #36=IFCSIMPLEPROPERTYTEMPLATE('2lB0XHfqTClgMoG_yBM4Jx',$,'Deadband','The deadband value for the analog input.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); @@ -47,7 +47,7 @@ DATA; #40=IFCPROPERTYENUMERATION('PEnum_BACnetEventEnableType',(IFCLABEL('To-OffNormal'),IFCLABEL('To-Fault'),IFCLABEL('To-Normal'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #41=IFCSIMPLEPROPERTYTEMPLATE('3pwpyvcVXCp8SnLthnlVk7',$,'NotifyType','Enumeration that defines the notification type',.P_ENUMERATEDVALUE.,'IfcLabel',$,#42,$,$,$,.READWRITE.); #42=IFCPROPERTYENUMERATION('PEnum_BACnetNotifyType',(IFCLABEL('Alarm'),IFCLABEL('Event'),IFCLABEL('AcknowledgeNotification'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#43=IFCPROPERTYSETTEMPLATE('2WAJ4SoIr31v$j6s0$2T6S',$,'Pset_AnalogOutput','Definition from IAI: Defines the characteristics of an analog output.',$,'IfcDistributionControlElement',(#44,#45,#46,#47,#48,#49,#51)); +#43=IFCPROPERTYSETTEMPLATE('2WAJ4SoIr31v$j6s0$2T6S',$,'Pset_AnalogOutput','Definition from IAI: Defines the characteristics of an analog output.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionControlElement',(#44,#45,#46,#47,#48,#49,#51)); #44=IFCSIMPLEPROPERTYTEMPLATE('3AoDwzuhfCKAfmMqytB$XQ',$,'HighLimit','The high limit value for the analog output.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #45=IFCSIMPLEPROPERTYTEMPLATE('3A2OaJZbz4fOZP4kgGztyJ',$,'LowLimit','The low limit value for the analog output.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #46=IFCSIMPLEPROPERTYTEMPLATE('1t4W0reZr7dOJb$tRLl8o7',$,'Deadband','The deadband value for the analog output.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); @@ -57,7 +57,7 @@ DATA; #50=IFCPROPERTYENUMERATION('PEnum_BACnetEventEnableType',(IFCLABEL('To-OffNormal'),IFCLABEL('To-Fault'),IFCLABEL('To-Normal'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #51=IFCSIMPLEPROPERTYTEMPLATE('1TX7QrGAX9lgDsYRuW4SG8',$,'NotifyType','Enumeration that defines the notification type',.P_ENUMERATEDVALUE.,'IfcLabel',$,#52,$,$,$,.READWRITE.); #52=IFCPROPERTYENUMERATION('PEnum_BACnetNotifyType',(IFCLABEL('Alarm'),IFCLABEL('Event'),IFCLABEL('AcknowledgeNotification'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#53=IFCPROPERTYSETTEMPLATE('3pyL1j5516Qxm$E4XaWbX_',$,'Pset_BinaryInput','Definition from IAI: Defines the characteristics of a binary input.',$,'IfcDistributionControlElement',(#54,#56,#57,#58,#59,#60,#62,#64)); +#53=IFCPROPERTYSETTEMPLATE('3pyL1j5516Qxm$E4XaWbX_',$,'Pset_BinaryInput','Definition from IAI: Defines the characteristics of a binary input.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionControlElement',(#54,#56,#57,#58,#59,#60,#62,#64)); #54=IFCSIMPLEPROPERTYTEMPLATE('3QZZcX$P9DPvs_fKwTZsjX',$,'Polarity','Enumeration defining the polarity',.P_ENUMERATEDVALUE.,'IfcLabel',$,#55,$,$,$,.READWRITE.); #55=IFCPROPERTYENUMERATION('PEnum_PolarityEnum',(IFCLABEL('Normal'),IFCLABEL('Reverse'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #56=IFCSIMPLEPROPERTYTEMPLATE('2IUBQcLn93jRx46tNKYyi$',$,'InactiveText','String value to be displayed in an inactive, off, or idle state',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); @@ -70,7 +70,7 @@ DATA; #63=IFCPROPERTYENUMERATION('PEnum_BACnetEventEnableType',(IFCLABEL('To-OffNormal'),IFCLABEL('To-Fault'),IFCLABEL('To-Normal'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #64=IFCSIMPLEPROPERTYTEMPLATE('01dB2vwcbFhAzEF8GzHjIV',$,'AckedTransitions','Enumeration that defines the type of transition acknowledgement',.P_ENUMERATEDVALUE.,'IfcLabel',$,#65,$,$,$,.READWRITE.); #65=IFCPROPERTYENUMERATION('PEnum_BACnetAckedTransitionsType',(IFCLABEL('To-OffNormal'),IFCLABEL('To-Fault'),IFCLABEL('To-Normal'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#66=IFCPROPERTYSETTEMPLATE('18MlA5mtf8JO01U$VI8WgA',$,'Pset_BinaryOutput','Definition from IAI: Defines the characteristics of a binary output.',$,'IfcDistributionControlElement',(#67,#69,#70,#71,#73,#75)); +#66=IFCPROPERTYSETTEMPLATE('18MlA5mtf8JO01U$VI8WgA',$,'Pset_BinaryOutput','Definition from IAI: Defines the characteristics of a binary output.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionControlElement',(#67,#69,#70,#71,#73,#75)); #67=IFCSIMPLEPROPERTYTEMPLATE('0Ue815MyHD0eYWyNkkt2Qa',$,'Polarity','Enumeration defining the polarity',.P_ENUMERATEDVALUE.,'IfcLabel',$,#68,$,$,$,.READWRITE.); #68=IFCPROPERTYENUMERATION('PEnum_PolarityEnum',(IFCLABEL('Normal'),IFCLABEL('Reverse'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #69=IFCSIMPLEPROPERTYTEMPLATE('3pUjK6rBj1Qw$aY$V1FO9P',$,'InactiveText','String value to be displayed in an inactive, off, or idle state',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); @@ -81,32 +81,32 @@ DATA; #74=IFCPROPERTYENUMERATION('PEnum_BACnetEventEnableType',(IFCLABEL('To-OffNormal'),IFCLABEL('To-Fault'),IFCLABEL('To-Normal'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #75=IFCSIMPLEPROPERTYTEMPLATE('3t9uPVi2b7PPAinZRdXNjC',$,'AckedTransitions','Enumeration that defines the type of transition acknowledgement',.P_ENUMERATEDVALUE.,'IfcLabel',$,#76,$,$,$,.READWRITE.); #76=IFCPROPERTYENUMERATION('PEnum_BACnetAckedTransitionsType',(IFCLABEL('To-OffNormal'),IFCLABEL('To-Fault'),IFCLABEL('To-Normal'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#77=IFCPROPERTYSETTEMPLATE('0_LLwivFv2FQ3rDk72_spo',$,'Pset_ControllerTypeCommon','Definition from IAI: Properties for signal handling for an analog controller taking disparate valued multiple inputs and creating a single valued output.',$,'IfcControllerType',(#78,#80,#81,#82)); +#77=IFCPROPERTYSETTEMPLATE('0_LLwivFv2FQ3rDk72_spo',$,'Pset_ControllerTypeCommon','Definition from IAI: Properties for signal handling for an analog controller taking disparate valued multiple inputs and creating a single valued output.',.PSET_TYPEDRIVENOVERRIDE.,'IfcControllerType',(#78,#80,#81,#82)); #78=IFCSIMPLEPROPERTYTEMPLATE('0k$2r7pBTD3O02Z4LcWKoj',$,'ControlType','The type of signal modification effected',.P_ENUMERATEDVALUE.,'IfcLabel',$,#79,$,$,$,.READWRITE.); #79=IFCPROPERTYENUMERATION('PEnum_ControlType',(IFCLABEL('Hysteresis'),IFCLABEL('Constant'),IFCLABEL('Divide'),IFCLABEL('Integral'),IFCLABEL('Subtract'),IFCLABEL('Report'),IFCLABEL('Absolute'),IFCLABEL('Sum'),IFCLABEL('Average'),IFCLABEL('Maximum'),IFCLABEL('Minimum'),IFCLABEL('Modifier'),IFCLABEL('Product'),IFCLABEL('Split'),IFCLABEL('RunningAverage'),IFCLABEL('Inverse'),IFCLABEL('Binary'),IFCLABEL('LowerLimitControl'),IFCLABEL('LowerLimitControl'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #80=IFCSIMPLEPROPERTYTEMPLATE('2T0cslqaHC18k77V9SA3mN',$,'SignalOffset','Offset constant added to modfied signal',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #81=IFCSIMPLEPROPERTYTEMPLATE('2pc6THSkv96OoKp4z5LkY8',$,'SignalFactor','Factor multiplied onto offset signal',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #82=IFCSIMPLEPROPERTYTEMPLATE('0n_wgtvrT3aet5I_ehY60_',$,'SignalTime','Time factor used for integral and running average controllers',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#83=IFCPROPERTYSETTEMPLATE('0spLvJYz98BwvrS2y23U$w',$,'Pset_ControllerTypeProportional','Definition from IAI: Properties for signal handling for an proportional controller taking a single input and creating a single valued output',$,'IfcControllerType',(#84,#86,#87,#88,#89)); +#83=IFCPROPERTYSETTEMPLATE('0spLvJYz98BwvrS2y23U$w',$,'Pset_ControllerTypeProportional','Definition from IAI: Properties for signal handling for an proportional controller taking a single input and creating a single valued output',.PSET_TYPEDRIVENOVERRIDE.,'IfcControllerType',(#84,#86,#87,#88,#89)); #84=IFCSIMPLEPROPERTYTEMPLATE('1JkdwFWaTBp9dka2XCFVpK',$,'ControlType','The type of signal modification effected',.P_ENUMERATEDVALUE.,'IfcLabel',$,#85,$,$,$,.READWRITE.); #85=IFCPROPERTYENUMERATION('PEnum_ProportionalControlType',(IFCLABEL('Proportional'),IFCLABEL('ProportionalIntegral'),IFCLABEL('ExponentialDelay'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #86=IFCSIMPLEPROPERTYTEMPLATE('1Invva2WHEbRqRUhx4TtHj',$,'SignalFactor1','Factor (Kp)',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #87=IFCSIMPLEPROPERTYTEMPLATE('1R5LT4H4T29e3KDT9Ozi8R',$,'SignalFactor2','Factor (Ki)',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #88=IFCSIMPLEPROPERTYTEMPLATE('0ukB_P5IbAFwHhWaPQdYhi',$,'SignalTime1','Time factor used for exponential increase.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); #89=IFCSIMPLEPROPERTYTEMPLATE('13rj$6han42AIUhoDXJs$g',$,'SignalTime2','Time factor used for exponential decrease.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#90=IFCPROPERTYSETTEMPLATE('2ZnI0mbiT3gRdHH7Y00sPS',$,'Pset_ControllerTypeTwoPosition','Definition from IAI: Properties for signal handling for an analog controller taking disparate valued multiple inputs and creating a single valued binary output.',$,'IfcControllerType',(#91,#93)); +#90=IFCPROPERTYSETTEMPLATE('2ZnI0mbiT3gRdHH7Y00sPS',$,'Pset_ControllerTypeTwoPosition','Definition from IAI: Properties for signal handling for an analog controller taking disparate valued multiple inputs and creating a single valued binary output.',.PSET_TYPEDRIVENOVERRIDE.,'IfcControllerType',(#91,#93)); #91=IFCSIMPLEPROPERTYTEMPLATE('0qqsUMwOTAaf0w5JT10Y1o',$,'ControlType','The type of signal modification effected',.P_ENUMERATEDVALUE.,'IfcLabel',$,#92,$,$,$,.READWRITE.); #92=IFCPROPERTYENUMERATION('PEnum_TwoPositionControlType',(IFCLABEL('Not'),IFCLABEL('And'),IFCLABEL('Or'),IFCLABEL('Xor'),IFCLABEL('LowerLimitSwitch'),IFCLABEL('UpperLimitSwitch'),IFCLABEL('LowerBandSwitch'),IFCLABEL('UpperBandSwitch'),IFCLABEL('Average'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #93=IFCSIMPLEPROPERTYTEMPLATE('2docSZx2X7_9iaQeT2dhCx',$,'BandWidth','Dead band for controller',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#94=IFCPROPERTYSETTEMPLATE('1RaZAby2j3TBpufYkBNmFI',$,'Pset_FlowInstrumentTypePressureGauge','Definition from IAI: A device that reads and displays a pressure value at a point or the pressure difference between two points.',$,'IfcFlowInstrumentType',(#95,#97)); +#94=IFCPROPERTYSETTEMPLATE('1RaZAby2j3TBpufYkBNmFI',$,'Pset_FlowInstrumentTypePressureGauge','Definition from IAI: A device that reads and displays a pressure value at a point or the pressure difference between two points.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrumentType',(#95,#97)); #95=IFCSIMPLEPROPERTYTEMPLATE('3AvY5OVE12zhtHtiT_Zd86',$,'PressureGaugeType','Identifies the means by which pressure is displayed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#96,$,$,$,.READWRITE.); #96=IFCPROPERTYENUMERATION('PEnum_PressureGaugeType',(IFCLABEL('Dial'),IFCLABEL('Digital'),IFCLABEL('Manometer'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #97=IFCSIMPLEPROPERTYTEMPLATE('3ae2YLOJ56exMEFE7prU7I',$,'DisplaySize','The physical size of the display. For a dial pressure gauge it will be the diameter of the dial.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#98=IFCPROPERTYSETTEMPLATE('2$CA9WzjzBAfJ1efUujXV6',$,'Pset_FlowInstrumentTypeThermometer','Definition from IAI: A device that reads and displays a temperature value at a point.',$,'IfcFlowInstrumentType',(#99,#101)); +#98=IFCPROPERTYSETTEMPLATE('2$CA9WzjzBAfJ1efUujXV6',$,'Pset_FlowInstrumentTypeThermometer','Definition from IAI: A device that reads and displays a temperature value at a point.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrumentType',(#99,#101)); #99=IFCSIMPLEPROPERTYTEMPLATE('1gz9Li3095$PooJyC0QVDq',$,'ThermometerType','Identifies the means by which temperature is displayed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#100,$,$,$,.READWRITE.); #100=IFCPROPERTYENUMERATION('PEnum_ThermometerType',(IFCLABEL('Dial'),IFCLABEL('Digital'),IFCLABEL('Stem'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #101=IFCSIMPLEPROPERTYTEMPLATE('3R3E2eLVDAN9Wce97QMwao',$,'DisplaySize','The physical size of the display. In the case of a stem thermometer, this will be the length of the stem. For a dial thermometer, it will be the diameter of the dial.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#102=IFCPROPERTYSETTEMPLATE('1$te7bBXn3vfSuj6gBFCQj',$,'Pset_MultiStateInput','Definition from IAI: Defines the characteristics of a multi-state input.',$,'IfcDistributionControlElement',(#103,#104,#105,#106,#108)); +#102=IFCPROPERTYSETTEMPLATE('1$te7bBXn3vfSuj6gBFCQj',$,'Pset_MultiStateInput','Definition from IAI: Defines the characteristics of a multi-state input.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionControlElement',(#103,#104,#105,#106,#108)); #103=IFCSIMPLEPROPERTYTEMPLATE('2$TNIHey1FFeXg7ak6BxOC',$,'NumberOfStates','Number of states for the multi-state Input.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #104=IFCSIMPLEPROPERTYTEMPLATE('2wnW8QR0D3dQK7HIjv9QJq',$,'StateText','String values to identify the state condition. Upper limit of the list is equal to the NumberOfStates.',.P_LISTVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #105=IFCSIMPLEPROPERTYTEMPLATE('3D0tYWYAb9LgybpzNlNEKo',$,'AlarmValues','Specifies any states the present value must equal before an EventEnable shall occur. Upper limit of the list is equal to the NumberOfStates.',.P_LISTVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); @@ -114,7 +114,7 @@ DATA; #107=IFCPROPERTYENUMERATION('PEnum_BACnetEventEnableType',(IFCLABEL('To-OffNormal'),IFCLABEL('To-Fault'),IFCLABEL('To-Normal'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #108=IFCSIMPLEPROPERTYTEMPLATE('1HPPjK$fDB3B$pNOU4BUv9',$,'NotifyType','Enumeration that defines the notification type',.P_ENUMERATEDVALUE.,'IfcLabel',$,#109,$,$,$,.READWRITE.); #109=IFCPROPERTYENUMERATION('PEnum_BACnetNotifyType',(IFCLABEL('Alarm'),IFCLABEL('Event'),IFCLABEL('AcknowledgeNotification'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#110=IFCPROPERTYSETTEMPLATE('2iHO6efAnAEQktMcvOAkZc',$,'Pset_MultiStateOutput','Definition from IAI: Defines the characteristics of a multi-state output.',$,'IfcDistributionControlElement',(#111,#112,#113,#114,#116)); +#110=IFCPROPERTYSETTEMPLATE('2iHO6efAnAEQktMcvOAkZc',$,'Pset_MultiStateOutput','Definition from IAI: Defines the characteristics of a multi-state output.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionControlElement',(#111,#112,#113,#114,#116)); #111=IFCSIMPLEPROPERTYTEMPLATE('39dlENK31A$On3OGeBaOTj',$,'NumberOfStates','Number of states for the multi-state Input.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #112=IFCSIMPLEPROPERTYTEMPLATE('0P6HxRze16Mg54OOk5FwnX',$,'StateText','String values to identify the state condition. Upper limit of the list is equal to the NumberOfStates.',.P_LISTVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #113=IFCSIMPLEPROPERTYTEMPLATE('2TYViIhSP1whVv06hXVaUr',$,'AlarmValues','Specifies any states the present value must equal before an EventEnable shall occur. Upper limit of the list is equal to the NumberOfStates.',.P_LISTVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); @@ -122,90 +122,90 @@ DATA; #115=IFCPROPERTYENUMERATION('PEnum_BACnetEventEnableType',(IFCLABEL('To-OffNormal'),IFCLABEL('To-Fault'),IFCLABEL('To-Normal'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #116=IFCSIMPLEPROPERTYTEMPLATE('0XdKI1YDf9RfWJqVFz9w6Q',$,'NotifyType','Enumeration that defines the notification type',.P_ENUMERATEDVALUE.,'IfcLabel',$,#117,$,$,$,.READWRITE.); #117=IFCPROPERTYENUMERATION('PEnum_BACnetNotifyType',(IFCLABEL('Alarm'),IFCLABEL('Event'),IFCLABEL('AcknowledgeNotification'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#118=IFCPROPERTYSETTEMPLATE('30fgWnmuP9_8vP0hSufF9y',$,'Pset_SensorTypeCO2Sensor','Definition from IAI: A device that senses or detects carbon dioxide.',$,'IfcSensorType',(#119,#120,#121,#122,#123)); +#118=IFCPROPERTYSETTEMPLATE('30fgWnmuP9_8vP0hSufF9y',$,'Pset_SensorTypeCO2Sensor','Definition from IAI: A device that senses or detects carbon dioxide.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#119,#120,#121,#122,#123)); #119=IFCSIMPLEPROPERTYTEMPLATE('0pfgxjMAP0EOO6UfrLWKSe',$,'CoverageArea','The floor area that is covered by the sensor (typically measured as a circle whose center is at the location of the sensor)',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #120=IFCSIMPLEPROPERTYTEMPLATE('2onD0jlfD7c81lmzvOj82D',$,'WashHandBasinSetPoint','The CO2 value to be sensed.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #121=IFCSIMPLEPROPERTYTEMPLATE('3oL7AFMgf2xA88f709zcgf',$,'CO2SensorRange','The upper and lower bounds for operation of the CO2 sensor.\X2\000A\X0\',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #122=IFCSIMPLEPROPERTYTEMPLATE('03q31JoXT9uuzKS2sDAM1h',$,'AccuracyOfCO2Sensor','The accuracy of the sensor',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #123=IFCSIMPLEPROPERTYTEMPLATE('1b9TrQY4X0WA1TI1h6vqrY',$,'TimeConstant','The time constant of the sensor\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#124=IFCPROPERTYSETTEMPLATE('3Vm86VrSL68AE_DwL410Jc',$,'Pset_SensorTypeFireSensor','Definition from IAI: A device that senses or detects the presence of fire.',$,'IfcSensorType',(#125,#126,#127)); +#124=IFCPROPERTYSETTEMPLATE('3Vm86VrSL68AE_DwL410Jc',$,'Pset_SensorTypeFireSensor','Definition from IAI: A device that senses or detects the presence of fire.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#125,#126,#127)); #125=IFCSIMPLEPROPERTYTEMPLATE('1ni9s7NtD49wly15aMfX_P',$,'FireSensorSetPoint','The temperature value to be sensed to indicate the presence of fire.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #126=IFCSIMPLEPROPERTYTEMPLATE('3u$1gCexrE4PSVGK8HeTUL',$,'AccuracyOfFireSensor','The accuracy of the sensor',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #127=IFCSIMPLEPROPERTYTEMPLATE('0uVA1$swP9jBXSGI8U0tXQ',$,'TimeConstant','The time constant of the sensor\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#128=IFCPROPERTYSETTEMPLATE('1PopZjRBH1bfRLpdlmOqVl',$,'Pset_SensorTypeGasSensor','Definition from IAI: A device that senses or detects gas.',$,'IfcSensorType',(#129,#130,#131,#132,#133)); +#128=IFCPROPERTYSETTEMPLATE('1PopZjRBH1bfRLpdlmOqVl',$,'Pset_SensorTypeGasSensor','Definition from IAI: A device that senses or detects gas.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#129,#130,#131,#132,#133)); #129=IFCSIMPLEPROPERTYTEMPLATE('1RuQ06xJTBe9WP0rj1$Rmg',$,'GasDetected','Identification of the gas that is being detected.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #130=IFCSIMPLEPROPERTYTEMPLATE('0n2NE1Qmn7EB0XGnrIK55X',$,'GasSensorSetPoint','The gas concentration value to be sensed.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #131=IFCSIMPLEPROPERTYTEMPLATE('0KwdoJgMHCJumXdU7lF0fe',$,'GasSensorRange','The upper and lower bounds of gas concentration for operation of the gas sensor.\X2\000A\X0\',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #132=IFCSIMPLEPROPERTYTEMPLATE('0ixPKoT7X44PkvM_w0$wQ8',$,'AccuracyOfGasSensor','The accuracy of the sensor',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #133=IFCSIMPLEPROPERTYTEMPLATE('1rOqyoHmvBvQPZwZx2l2UM',$,'TimeConstant','The time constant of the sensor\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#134=IFCPROPERTYSETTEMPLATE('36yvuTxknDRRnpf9cA2c6M',$,'Pset_SensorTypeHeatSensor','Definition from IAI: A device that senses or detects heat.',$,'IfcSensorType',(#135,#136,#137,#138,#139)); +#134=IFCPROPERTYSETTEMPLATE('36yvuTxknDRRnpf9cA2c6M',$,'Pset_SensorTypeHeatSensor','Definition from IAI: A device that senses or detects heat.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#135,#136,#137,#138,#139)); #135=IFCSIMPLEPROPERTYTEMPLATE('0hCYoG8KbCpu2uYz9IWznU',$,'CoverageArea','The area that is covered by the sensor (typically measured as a circle whose center is at the location of the sensor)',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #136=IFCSIMPLEPROPERTYTEMPLATE('0SRtKRfH1E99M87baNS2vn',$,'HeatSensorSetPoint','The temperature value to be sensed.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #137=IFCSIMPLEPROPERTYTEMPLATE('0_ck90UXX709pYG2sBonyK',$,'HeatSensorRange','The upper and lower bounds for operation of the heat sensor.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #138=IFCSIMPLEPROPERTYTEMPLATE('3XmAxEgbX7KukiqXYUeJyQ',$,'HeatSensorAccuracy','The accuracy of the sensor.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #139=IFCSIMPLEPROPERTYTEMPLATE('1cIPp$IT17CPUDtObTIXam',$,'TimeConstant','The time constant of the sensor.\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#140=IFCPROPERTYSETTEMPLATE('06Cz8$iz5BguPynuW6PzBC',$,'Pset_SensorTypeHumiditySensor','Definition from IAI: A device that senses or detects humidity. ',$,'IfcSensorType',(#141,#142,#143,#144)); +#140=IFCPROPERTYSETTEMPLATE('06Cz8$iz5BguPynuW6PzBC',$,'Pset_SensorTypeHumiditySensor','Definition from IAI: A device that senses or detects humidity. ',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#141,#142,#143,#144)); #141=IFCSIMPLEPROPERTYTEMPLATE('2ZPKyGQlDFLgfmcYC_Xyw1',$,'HumiditySetPoint','The humidity value to be sensed.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #142=IFCSIMPLEPROPERTYTEMPLATE('1CBNPhNnn0pQIIz2L5iJS1',$,'HumiditySensorRange','The upper and lower bounds for operation of the humidity sensor.\X2\000A\X0\',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #143=IFCSIMPLEPROPERTYTEMPLATE('28ctOEneL8xQGOGgovE8m6',$,'AccuracyOfHumiditySensor','The accuracy of the sensor',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #144=IFCSIMPLEPROPERTYTEMPLATE('0EK2oqwU93YwT7iTIGT_Sd',$,'TimeConstant','The time constant of the sensor\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#145=IFCPROPERTYSETTEMPLATE('04iKGSt0r3lfLWkNh9iA6h',$,'Pset_SensorTypeLightSensor','Definition from IAI: A device that senses or detects light.',$,'IfcSensorType',(#146,#147,#148,#149)); +#145=IFCPROPERTYSETTEMPLATE('04iKGSt0r3lfLWkNh9iA6h',$,'Pset_SensorTypeLightSensor','Definition from IAI: A device that senses or detects light.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#146,#147,#148,#149)); #146=IFCSIMPLEPROPERTYTEMPLATE('3cjGsBTQHCVxJiibG_g66x',$,'LightSensorSetPoint','The illuminance value to be sensed.',.P_SINGLEVALUE.,'IfcIlluminanceMeasure',$,$,$,$,$,.READWRITE.); #147=IFCSIMPLEPROPERTYTEMPLATE('1Uumg3uOj4wPbAyJ_vIOph',$,'LightSensorRange','The upper and lower bounds for operation of the light sensor.',.P_BOUNDEDVALUE.,'IfcIlluminanceMeasure',$,$,$,$,$,.READWRITE.); #148=IFCSIMPLEPROPERTYTEMPLATE('25qc1$HfLDVAsKgxMiDzYT',$,'LightSensorAccuracy','The accuracy of the sensor.',.P_SINGLEVALUE.,'IfcIlluminanceMeasure',$,$,$,$,$,.READWRITE.); #149=IFCSIMPLEPROPERTYTEMPLATE('2qh_zUyj1DyfBj4GDAYORv',$,'TimeConstant','The time constant of the sensor.\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#150=IFCPROPERTYSETTEMPLATE('3lWLbc$5bBIOibe5zpOqhE',$,'Pset_SensorTypeMovementSensor','Definition from IAI: A device that senses or detects movement.',$,'IfcSensorType',(#151,#153)); +#150=IFCPROPERTYSETTEMPLATE('3lWLbc$5bBIOibe5zpOqhE',$,'Pset_SensorTypeMovementSensor','Definition from IAI: A device that senses or detects movement.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#151,#153)); #151=IFCSIMPLEPROPERTYTEMPLATE('3UIu5RZTH2hwFa6mlwjOgl',$,'MovementSensingType','Enumeration that identifies the type of movement sensing mechanism.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#152,$,$,$,.READWRITE.); #152=IFCPROPERTYENUMERATION('PEnum_MovementSensingType',(IFCLABEL('PhotoElectricCell'),IFCLABEL('PressurePad'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #153=IFCSIMPLEPROPERTYTEMPLATE('3oy_pAmtb45go9Xk8oWwdj',$,'TimeConstant','The time constant of the sensor\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#154=IFCPROPERTYSETTEMPLATE('3w4wneLxf8YPuC9BH6ZtrJ',$,'Pset_SensorTypePressureSensor','Definition from IAI: A device that senses or detects pressure.',$,'IfcSensorType',(#155,#156,#157,#158,#159)); +#154=IFCPROPERTYSETTEMPLATE('3w4wneLxf8YPuC9BH6ZtrJ',$,'Pset_SensorTypePressureSensor','Definition from IAI: A device that senses or detects pressure.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#155,#156,#157,#158,#159)); #155=IFCSIMPLEPROPERTYTEMPLATE('3bujzrorP8lg1DZHZjLY7R',$,'PressureSensorSetPoint','The pressure value to be sensed.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #156=IFCSIMPLEPROPERTYTEMPLATE('2dM88vXiD2hPccpXRt22nM',$,'PressureSensorRange','The upper and lower bounds of pressure value for operation of the pressure sensor.\X2\000A\X0\',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #157=IFCSIMPLEPROPERTYTEMPLATE('07yMwkr2f4JP3HB6AKwqiE',$,'AccuracyOfPressureSensor','The accuracy of the sensor',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #158=IFCSIMPLEPROPERTYTEMPLATE('3fGfk4HLb9hOrRbw6NGXoy',$,'TimeConstant','The time constant of the sensor\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); #159=IFCSIMPLEPROPERTYTEMPLATE('0fBPgkJRD0kPzCeh5SUC03',$,'IsSwitch','Identifies if the sensor also functions as a switch at the set point (=TRUE) or not (= FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#160=IFCPROPERTYSETTEMPLATE('1SWoVfVrvEJemJbZ30V4yL',$,'Pset_SensorTypeSmokeSensor','Definition from IAI: A device that senses or detects smoke.',$,'IfcSensorType',(#161,#162,#163,#164,#165,#166)); +#160=IFCPROPERTYSETTEMPLATE('1SWoVfVrvEJemJbZ30V4yL',$,'Pset_SensorTypeSmokeSensor','Definition from IAI: A device that senses or detects smoke.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#161,#162,#163,#164,#165,#166)); #161=IFCSIMPLEPROPERTYTEMPLATE('2BRdsW22j1BfkL_0tPhgEj',$,'CoverageArea','The floor area that is covered by the sensor (typically measured as a circle whose center is at the location of the sensor)',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #162=IFCSIMPLEPROPERTYTEMPLATE('3$QuJTi$9C6QaeQLWnLO6U',$,'PressureSensorSetPoint','The smoke concentration value to be sensed.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #163=IFCSIMPLEPROPERTYTEMPLATE('3hmPjJDgj8UB4RH6pyBLj5',$,'SmokeSensorRange','The upper and lower bounds of smoke concentration for operation of the smoke sensor.\X2\000A\X0\',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #164=IFCSIMPLEPROPERTYTEMPLATE('1qG5a2ArX5BfYIlX1ArAnL',$,'AccuracyOfSmokeSensor','The accuracy of the sensor',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #165=IFCSIMPLEPROPERTYTEMPLATE('2ZweK71D57b8PvHbLgUWJk',$,'TimeConstant','The time constant of the sensor\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); #166=IFCSIMPLEPROPERTYTEMPLATE('2qzFvVRk1Dzh43dlrLAzae',$,'HasBuiltInAlarm','Indicates whether the smoke sensor is included as an element within a smoke alarm/sensor unit (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#167=IFCPROPERTYSETTEMPLATE('2gp3SWLkn2TwLs3a0rgDPm',$,'Pset_SensorTypeSoundSensor','Definition from IAI: A device that senses or detects sound.',$,'IfcSensorType',(#168,#169,#170,#171)); +#167=IFCPROPERTYSETTEMPLATE('2gp3SWLkn2TwLs3a0rgDPm',$,'Pset_SensorTypeSoundSensor','Definition from IAI: A device that senses or detects sound.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#168,#169,#170,#171)); #168=IFCSIMPLEPROPERTYTEMPLATE('3SBlqaUqX5M9909a5n9XH3',$,'SoundSensorSetPoint','The sound pressure value to be sensed.',.P_SINGLEVALUE.,'IfcSoundPressureMeasure',$,$,$,$,$,.READWRITE.); #169=IFCSIMPLEPROPERTYTEMPLATE('244ISGnNn9bhYmvQMzifdx',$,'SoundSensorRange','The upper and lower bounds for operation of the sound sensor.',.P_BOUNDEDVALUE.,'IfcSoundPressureMeasure',$,$,$,$,$,.READWRITE.); #170=IFCSIMPLEPROPERTYTEMPLATE('3rDSu$sRbF0ewDnhFB18xH',$,'SoundSensorAccuracy','The accuracy of the sensor.',.P_SINGLEVALUE.,'IfcSoundPressureMeasure',$,$,$,$,$,.READWRITE.); #171=IFCSIMPLEPROPERTYTEMPLATE('1csHGqK$z1PudXMCCrfacU',$,'TimeConstant','The time constant of the sensor.\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#172=IFCPROPERTYSETTEMPLATE('3TDRyAkwf1P87CDhVwXTLo',$,'Pset_SensorTypeTemperatureSensor','Definition from IAI: A device that senses or detects temperature.',$,'IfcSensorType',(#173,#175,#176,#177,#178)); +#172=IFCPROPERTYSETTEMPLATE('3TDRyAkwf1P87CDhVwXTLo',$,'Pset_SensorTypeTemperatureSensor','Definition from IAI: A device that senses or detects temperature.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensorType',(#173,#175,#176,#177,#178)); #173=IFCSIMPLEPROPERTYTEMPLATE('1kSCHo4OT8gAKsOHrBc72X',$,'TemperatureSensorType','Enumeration that Identifies the types of temperature sensor that can be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#174,$,$,$,.READWRITE.); #174=IFCPROPERTYENUMERATION('PEnum_TemperatureSensorType',(IFCLABEL('HighLimit'),IFCLABEL('LowLimit'),IFCLABEL('OutsideTemperature'),IFCLABEL('OperatingTemperature'),IFCLABEL('RoomTemperature'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #175=IFCSIMPLEPROPERTYTEMPLATE('2MgkcdbxX5eBY7$qny442l',$,'TemperatureSensorSetPoint','The temperature value to be sensed.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #176=IFCSIMPLEPROPERTYTEMPLATE('1ckO6s$7nDHf2xeGpO3Wql',$,'TemperatureSensorRange','The upper and lower bounds for operation of the temperature sensor.\X2\000A\X0\May also be termed ''deadband''',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #177=IFCSIMPLEPROPERTYTEMPLATE('31p_IjRuD7Dfsk4d372nVS',$,'AccuracyOfTemperatureSensor','The accuracy of the sensor',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #178=IFCSIMPLEPROPERTYTEMPLATE('2aXSGP0XT7Yu0gb$$l7iWg',$,'TimeConstant','The time constant of the sensor\X2\000A\X0\.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#179=IFCPROPERTYSETTEMPLATE('34jdivCiz4uRK7jCcrDwol',$,'Pset_CableCarrierSegmentTypeCableLadderSegment','Definition from IAI: An open carrier segment on which cables are carried on a ladder structure.\X2\000A\X0\',$,'IfcCableCarrierSegmentType',(#180,#181,#182,#183)); +#179=IFCPROPERTYSETTEMPLATE('34jdivCiz4uRK7jCcrDwol',$,'Pset_CableCarrierSegmentTypeCableLadderSegment','Definition from IAI: An open carrier segment on which cables are carried on a ladder structure.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegmentType',(#180,#181,#182,#183)); #180=IFCSIMPLEPROPERTYTEMPLATE('2FBhNV$hD8SQfKzXfAXzWy',$,'NominalLength','The nominal length of the segment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #181=IFCSIMPLEPROPERTYTEMPLATE('3Jbafl9BT3WPrGqnLyU4J_',$,'NominalWidth','The nominal width of the segment',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #182=IFCSIMPLEPROPERTYTEMPLATE('1XYv6HTHX50BrOcrUT8KvN',$,'NominalHeight','The nominal height of the segment',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #183=IFCSIMPLEPROPERTYTEMPLATE('1sfsP$RRX3P8O0GxQgXe$K',$,'LadderConfiguration','Description of the configuration of the ladder structure used.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#184=IFCPROPERTYSETTEMPLATE('2YtCaT3Y192OzmPF_$qnlF',$,'Pset_CableCarrierSegmentTypeCableTraySegment','Definition from IAI: An (typically) open carrier segment onto which cables are laid.\X2\000A\X0\',$,'IfcCableCarrierSegmentType',(#185,#186,#187,#188)); +#184=IFCPROPERTYSETTEMPLATE('2YtCaT3Y192OzmPF_$qnlF',$,'Pset_CableCarrierSegmentTypeCableTraySegment','Definition from IAI: An (typically) open carrier segment onto which cables are laid.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegmentType',(#185,#186,#187,#188)); #185=IFCSIMPLEPROPERTYTEMPLATE('0GRMbJvFv2787K6kFflckF',$,'NominalLength','The nominal length of the segment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #186=IFCSIMPLEPROPERTYTEMPLATE('0IrIX59q1FFPe2VdrZj3gj',$,'NominalWidth','The nominal width of the segment',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #187=IFCSIMPLEPROPERTYTEMPLATE('130e5JdG9FSPq_RzBHWGns',$,'NominalHeight','The nominal height of the segment',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #188=IFCSIMPLEPROPERTYTEMPLATE('2Mh8Q_QJn6pfLoEDYnbIPw',$,'HasCover','Indication of whether the cable tray has a cover (=TRUE) or not (= FALSE). By default, this value should be set to FALSE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#189=IFCPROPERTYSETTEMPLATE('0$PLjgms90nOW9FTV3shkj',$,'Pset_CableCarrierSegmentTypeCableTrunkingSegment','Definition from IAI: An enclosed carrier segment with one or more compartments into which cables are placed.\X2\000A\X0\',$,'IfcCableCarrierSegmentType',(#190,#191,#192,#193)); +#189=IFCPROPERTYSETTEMPLATE('0$PLjgms90nOW9FTV3shkj',$,'Pset_CableCarrierSegmentTypeCableTrunkingSegment','Definition from IAI: An enclosed carrier segment with one or more compartments into which cables are placed.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegmentType',(#190,#191,#192,#193)); #190=IFCSIMPLEPROPERTYTEMPLATE('2tS5gT$IT5cuzW8_zHw_Qf',$,'NominalLength','The nominal length of the segment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #191=IFCSIMPLEPROPERTYTEMPLATE('167icltdrFUAPk4IxtOXa$',$,'NominalWidth','The nominal width of the segment',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #192=IFCSIMPLEPROPERTYTEMPLATE('3iqwD0eDX0QPxxzokQtLLU',$,'NominalHeight','The nominal height of the segment',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #193=IFCSIMPLEPROPERTYTEMPLATE('2fQFerQe1CIRaCXObuk7io',$,'NumberOfCompartments','The number of separate internal compartments within the trunking',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#194=IFCPROPERTYSETTEMPLATE('1RmcQJ_ML1NuYH2X5$Iml0',$,'Pset_CableCarrierSegmentTypeConduitSegment','Definition from IAI: An enclosed tubular carrier segment through which cables are pulled.\X2\000A\X0\',$,'IfcCableCarrierSegmentType',(#195,#196,#197,#198,#200)); +#194=IFCPROPERTYSETTEMPLATE('1RmcQJ_ML1NuYH2X5$Iml0',$,'Pset_CableCarrierSegmentTypeConduitSegment','Definition from IAI: An enclosed tubular carrier segment through which cables are pulled.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegmentType',(#195,#196,#197,#198,#200)); #195=IFCSIMPLEPROPERTYTEMPLATE('1TVHgitJjAPx$ehwcrRABZ',$,'NominalLength','The nominal length of the segment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #196=IFCSIMPLEPROPERTYTEMPLATE('1LCwgVgLf9DRNL6pNG9Ogw',$,'NominalWidth','The nominal width of the segment',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #197=IFCSIMPLEPROPERTYTEMPLATE('0s9NjpsKT82ugOKZ3EvbBl',$,'NominalHeight','The nominal height of the segment',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #198=IFCSIMPLEPROPERTYTEMPLATE('2n7jW9yLzDxRdT5qIKejnX',$,'ConduitShapeType','The shape of the conduit segment',.P_ENUMERATEDVALUE.,'IfcLabel',$,#199,$,$,$,.READWRITE.); #199=IFCPROPERTYENUMERATION('PEnum_ConduitShapeType',(IFCLABEL('Circular'),IFCLABEL('Oval'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #200=IFCSIMPLEPROPERTYTEMPLATE('0SYxg967PFvOHvC8_tpfMK',$,'IsRigid','Indication of whether the conduit is rigid (= TRUE) or flexible (= FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#201=IFCPROPERTYSETTEMPLATE('3bKiUqdhT7zxIVUw$ENffr',$,'Pset_CableSegmentTypeCableSegment','Definition from IAI: Electrical cable with a specific purpose to lead electric current within a circuit or any other electric construction. Includes all types of electric cables, mainly several electrical segments wrapped together, e.g. cable, tube, busbar. Note that the number of conductors within a cable is determined by an aggregation mechanism that aggregates the conductors within the cable.\X2\000A\X0\',$,'IfcCableSegmentType',(#202,#203,#204,#205,#206,#207,#208,#209)); +#201=IFCPROPERTYSETTEMPLATE('3bKiUqdhT7zxIVUw$ENffr',$,'Pset_CableSegmentTypeCableSegment','Definition from IAI: Electrical cable with a specific purpose to lead electric current within a circuit or any other electric construction. Includes all types of electric cables, mainly several electrical segments wrapped together, e.g. cable, tube, busbar. Note that the number of conductors within a cable is determined by an aggregation mechanism that aggregates the conductors within the cable.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegmentType',(#202,#203,#204,#205,#206,#207,#208,#209)); #202=IFCSIMPLEPROPERTYTEMPLATE('2lt72OHwL2MgiXx29Leuvu',$,'CrossSectionalArea','Cross section area of the cable',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #203=IFCSIMPLEPROPERTYTEMPLATE('1C3Yk9UpPDmAr1umYzZNNq',$,'NominalLength','The nominal length of a cable, busbar or tube.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #204=IFCSIMPLEPROPERTYTEMPLATE('1NoUTAnSXAoPnxuieEzXak',$,'NominalWidthOrDiameter','The nominal width of a cable, busbar or tube or, in the case of a circular cross section, the diameter. Note that this value may be used for larger sized cables whose dimensions are explicitly given.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -214,7 +214,7 @@ DATA; #207=IFCSIMPLEPROPERTYTEMPLATE('3yVWJgDrnFIwH6yJsuPKko',$,'MaxOperatingTemperature','Maximum operating temperature for the cable.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #208=IFCSIMPLEPROPERTYTEMPLATE('24JUq8UY53pBZ8bKXYBojL',$,'CableInsulationMaterial','The material from which the insulation is constructed. Such as PVC, PEX, EPR,...',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #209=IFCSIMPLEPROPERTYTEMPLATE('0l6QQRX$f4lgiipZni8DiL',$,'SheathColor','Colour code on cable, conductor. ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#210=IFCPROPERTYSETTEMPLATE('3fD_OWs0jCJ80jwoKKAm8G',$,'Pset_CableSegmentTypeConductorSegment','Definition from IAI: An electrical conductor is a single linear element with the specific purpose to lead electric current. The core of one lead is normally single wired or multiwired which are intertwined. ',$,'IfcCableSegmentType',(#211,#212,#213,#215,#216,#217,#218,#219,#220)); +#210=IFCPROPERTYSETTEMPLATE('3fD_OWs0jCJ80jwoKKAm8G',$,'Pset_CableSegmentTypeConductorSegment','Definition from IAI: An electrical conductor is a single linear element with the specific purpose to lead electric current. The core of one lead is normally single wired or multiwired which are intertwined. ',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegmentType',(#211,#212,#213,#215,#216,#217,#218,#219,#220)); #211=IFCSIMPLEPROPERTYTEMPLATE('0HN0EtCJ52$ApT5y5fTgLB',$,'CrossSectionalArea','Cross section area of the phase(s) lead(s)',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #212=IFCSIMPLEPROPERTYTEMPLATE('0B9nzunXPC2QUyGPLGav$P',$,'NominalLength','The nominal length of a conductor.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #213=IFCSIMPLEPROPERTYTEMPLATE('0JreAY9gTDmB_NRty3FEUx',$,'ElectricalConductorFunction','Type of function for which the conductor is intended. ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#214,$,$,$,.READWRITE.); @@ -225,12 +225,12 @@ DATA; #218=IFCSIMPLEPROPERTYTEMPLATE('3Kk5Wy5mLA0fb$ovU0vViX',$,'MaximumOperatingTemperature','The maximum temperature at which the sheath retains its integrity.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #219=IFCSIMPLEPROPERTYTEMPLATE('3Uf5QJUhDAP94RzpP4JzBU',$,'IsFireResistant','Indication of whether the sheath is fire resistant (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #220=IFCSIMPLEPROPERTYTEMPLATE('2AO6a9q913wxvX0WPER3jX',$,'SheathColor','Colour code on cable, conductor. ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#221=IFCPROPERTYSETTEMPLATE('3bKK$cZAb3Gup1_9DbRCum',$,'Pset_ElectricalCircuit','Definition from IAI: A circuit supplies electrical devices with voltage and current.\X2\000A\X0\',$,'IfcElectricalCircuit',(#222,#223,#224,#225)); +#221=IFCPROPERTYSETTEMPLATE('3bKK$cZAb3Gup1_9DbRCum',$,'Pset_ElectricalCircuit','Definition from IAI: A circuit supplies electrical devices with voltage and current.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcElectricalCircuit',(#222,#223,#224,#225)); #222=IFCSIMPLEPROPERTYTEMPLATE('1D3RsX0AT9WftFpW2UweCL',$,'Diversity','A factor that is a means of reducing the cable size on the basis that not all the connected load will be drawing current simultaneously.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #223=IFCSIMPLEPROPERTYTEMPLATE('265ST1E7P0UBqNUWu70VFl',$,'NumberOfPhases','Number of phases within this circuit.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #224=IFCSIMPLEPROPERTYTEMPLATE('39Ojj1tQj1X8i4dEcGKvwx',$,'MaximumAllowedVoltageDrop','The maximum voltage drop across the circuit that must not be exceeded.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); #225=IFCSIMPLEPROPERTYTEMPLATE('3ILomOuJr5FvydcCtgNYOz',$,'NetImpedance','The maximum earth loop impedance of a circuit (typically stated as the variable Zs)',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#226=IFCPROPERTYSETTEMPLATE('3d7vaAb2L0q9dy6xI4nDV9',$,'Pset_ElectricalDeviceCommon','Definition from IAI: A means of collecting together all properties that are commonly used by electrical devices.',$,'IfcDistributionElement',(#227,#228,#229,#230,#231,#232,#233,#234,#235,#236,#238)); +#226=IFCPROPERTYSETTEMPLATE('3d7vaAb2L0q9dy6xI4nDV9',$,'Pset_ElectricalDeviceCommon','Definition from IAI: A means of collecting together all properties that are commonly used by electrical devices.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionElement',(#227,#228,#229,#230,#231,#232,#233,#234,#235,#236,#238)); #227=IFCSIMPLEPROPERTYTEMPLATE('2_UZ1a0oLBw8WVrkrvXw9o',$,'NominalCurrent','The maximum allowed current that a device is certified to handle.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); #228=IFCSIMPLEPROPERTYTEMPLATE('2Z4AD_xx56OP9KXD7nUhA5',$,'UsageCurrent','The current that a device is actually handling or is calculated to be handling at a point in time.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); #229=IFCSIMPLEPROPERTYTEMPLATE('1gGPaErDLCEgtTsKrCcURq',$,'NominalVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); @@ -243,23 +243,23 @@ DATA; #236=IFCSIMPLEPROPERTYTEMPLATE('0MbYXaY8P3gfq5GnVyyTQS',$,'InsulationStandardClass','Insulation standard classes provides basic protection information against electric shock. Defines levels of insulation required in terms of constructional requirements (creepage and clearance distances) and electrical requirements (compliance with electric strength tests). Basic insulation is considered to be shorted under single fault conditions. The actual values required depend on the working voltage to which the insulation is subjected, as well as other factors. Also indicates whether the electrical device has a protective earth connection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#237,$,$,$,.READWRITE.); #237=IFCPROPERTYENUMERATION('PEnum_InsulationStandardClass',(IFCLABEL('Class0Appliance'),IFCLABEL('Class0IAppliance'),IFCLABEL('ClassIAppliance'),IFCLABEL('ClassIIAppliance'),IFCLABEL('ClassIIIAppliance'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #238=IFCSIMPLEPROPERTYTEMPLATE('3CGMSudxvBdhumMq1hlEqr',$,'PhaseReference','The phase identification used for the device electrical input. This should be the same phase identifier that is used for the conductor segment providing the electrical service to the device. In general, it is recommended that IEC recommendations for phase identification are used (L1, L2 etc.). However, other phase identifiers may be used such as by color (Red, Blue, Yellow) or by number (1, 2, 3) etc.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#239=IFCPROPERTYSETTEMPLATE('2ADUsGt3fFff_pvajiVUnJ',$,'Pset_ElectricDistributionPointCommon','Definition from IAI: A room or a place or a box where an electrical supply enters and is then further distributed via electrical circuits. A distribution point may be a main distribution point or a sub-main distribution point.\X2\000A\X0\',$,'IfcElectricDistributionPoint',(#240,#241,#242,#243,#244)); +#239=IFCPROPERTYSETTEMPLATE('2ADUsGt3fFff_pvajiVUnJ',$,'Pset_ElectricDistributionPointCommon','Definition from IAI: A room or a place or a box where an electrical supply enters and is then further distributed via electrical circuits. A distribution point may be a main distribution point or a sub-main distribution point.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcElectricDistributionPoint',(#240,#241,#242,#243,#244)); #240=IFCSIMPLEPROPERTYTEMPLATE('2GhmPiBD9CohAXuqjwglSU',$,'IsMain','Identifies if the current instance is a main distribution point or topmost level in an electrical distribution hierarchy (= TRUE) or a sub-main distribution point (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #241=IFCSIMPLEPROPERTYTEMPLATE('2KJzZ7LX9AUfMAc7dpQl4j',$,'NumberOfDoors','Number of doors',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #242=IFCSIMPLEPROPERTYTEMPLATE('0xvc2vZ_D0R8DU96RfCB43',$,'CaseMaterial','Material from which the casing surrounding the distribution point is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #243=IFCSIMPLEPROPERTYTEMPLATE('2lfYf7QB1CdevQFiTNo5Kh',$,'CaseWeight','Weight of case',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); #244=IFCSIMPLEPROPERTYTEMPLATE('1UD8rDWAb6dBfwiASZCl_L',$,'NumberOfOpenings','Maximum number of openings that can fit with the case for normal use. In the openings there must be nipples, so cable may run through.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#245=IFCPROPERTYSETTEMPLATE('3SoVLEWh177Pz2x9hPiy7r',$,'Pset_ElectricGeneratorTypeCommon','Definition from IAI: Defines a particular type of engine that is a machine for converting mechanical energy into electrical energy.',$,'IfcElectricGeneratorType',(#246,#247,#248)); +#245=IFCPROPERTYSETTEMPLATE('3SoVLEWh177Pz2x9hPiy7r',$,'Pset_ElectricGeneratorTypeCommon','Definition from IAI: Defines a particular type of engine that is a machine for converting mechanical energy into electrical energy.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricGeneratorType',(#246,#247,#248)); #246=IFCSIMPLEPROPERTYTEMPLATE('03r77ReYX2x8G_2gF6sWMl',$,'ElectricGeneratorEfficiency','The ratio of output capacity to intake capacity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #247=IFCSIMPLEPROPERTYTEMPLATE('3q9EUmwyD2XwOol5t5_vCa',$,'StartCurrentFactor','IEC. Start current factor defines how large the peek starting current will become on the engine. StartCurrentFactor is multiplied to NominalCurrent and we get the start current. ',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #248=IFCSIMPLEPROPERTYTEMPLATE('0CZSnpRY1EVfaMUw9cMCOd',$,'MaximumPowerOutput','The maximum output power rating of the engine.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#249=IFCPROPERTYSETTEMPLATE('3E3EZw51f5SB$nuTS3KU$j',$,'Pset_ElectricHeaterTypeElectricalCableHeater','Definition from IAI: An electrical device that outputs heat uniformly along its path.',$,'IfcElectricHeaterType',(#250)); +#249=IFCPROPERTYSETTEMPLATE('3E3EZw51f5SB$nuTS3KU$j',$,'Pset_ElectricHeaterTypeElectricalCableHeater','Definition from IAI: An electrical device that outputs heat uniformly along its path.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricHeaterType',(#250)); #250=IFCSIMPLEPROPERTYTEMPLATE('2QEIDm2P5AZf9Rfi8hok0x',$,'HeatOutputPerUnitLength','The amount of heat output per unit length of heat emitter.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#251=IFCPROPERTYSETTEMPLATE('0BxLlFwMD02PCMf07vxSjf',$,'Pset_ElectricHeaterTypeElectricalMatHeater','Definition from IAI: An electrical device that outputs heat uniformly across its surface area.',$,'IfcElectricHeaterType',(#252)); +#251=IFCPROPERTYSETTEMPLATE('0BxLlFwMD02PCMf07vxSjf',$,'Pset_ElectricHeaterTypeElectricalMatHeater','Definition from IAI: An electrical device that outputs heat uniformly across its surface area.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricHeaterType',(#252)); #252=IFCSIMPLEPROPERTYTEMPLATE('1nHMaLWnD2mOcAd3JwUX4B',$,'HeatOutputPerUnitArea','The amount of heat output per unit area of heat emitter.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#253=IFCPROPERTYSETTEMPLATE('2ZnoRkSSv6Dgbi5Uopt_Hp',$,'Pset_ElectricHeaterTypeElectricalPointHeater','Definition from IAI: An electrical device that outputs heat as a total quantity from a point or restricted area that can be considered as a point.',$,'IfcElectricHeaterType',(#254)); +#253=IFCPROPERTYSETTEMPLATE('2ZnoRkSSv6Dgbi5Uopt_Hp',$,'Pset_ElectricHeaterTypeElectricalPointHeater','Definition from IAI: An electrical device that outputs heat as a total quantity from a point or restricted area that can be considered as a point.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricHeaterType',(#254)); #254=IFCSIMPLEPROPERTYTEMPLATE('1lDXkPmqL5dwGqg_ABt9OE',$,'HeatOutput','The total amount of heat output by the heat emitter.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#255=IFCPROPERTYSETTEMPLATE('1Vihwr6LvBMxon$jbbZWRB',$,'Pset_ElectricMotorTypeCommon','Definition from IAI: Defines a particular type of engine that is a machine for converting electrical energy into mechanical energy. Note that in cases where a close coupled or monobloc pump or close coupled fan is being driven by the motor, the motor may itself be considered to be directly part of the pump or fan. In this case , motor information may need to be specified directly at the pump or fan and not througfh separate motor/motor connection entities.',$,'IFCELECTRICALDOMAIN/IfcElectricMotorType,IFCHVACDOMAIN/IfcFanType,IFCHVACDOMAIN/IfcPumpType',(#256,#258,#259,#260,#261,#262,#263,#264)); +#255=IFCPROPERTYSETTEMPLATE('1Vihwr6LvBMxon$jbbZWRB',$,'Pset_ElectricMotorTypeCommon','Definition from IAI: Defines a particular type of engine that is a machine for converting electrical energy into mechanical energy. Note that in cases where a close coupled or monobloc pump or close coupled fan is being driven by the motor, the motor may itself be considered to be directly part of the pump or fan. In this case , motor information may need to be specified directly at the pump or fan and not througfh separate motor/motor connection entities.',.PSET_TYPEDRIVENOVERRIDE.,'IFCELECTRICALDOMAIN/IfcElectricMotorType,IFCHVACDOMAIN/IfcFanType,IFCHVACDOMAIN/IfcPumpType',(#256,#258,#259,#260,#261,#262,#263,#264)); #256=IFCSIMPLEPROPERTYTEMPLATE('05H1_k3_XCr9tt8zOxy8p_',$,'MotorEnclosureType','A list of the available types of motor enclosure from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#257,$,$,$,.READWRITE.); #257=IFCPROPERTYENUMERATION('PEnum_MotorEnclosureType',(IFCLABEL('OpenDripProof'),IFCLABEL('TotallyEnclosedAirOver'),IFCLABEL('TotallyEnclosedFanCooled'),IFCLABEL('TotallyEnclosedNonVentilated'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #258=IFCSIMPLEPROPERTYTEMPLATE('1ChRquYZv23As4q7YhaHRV',$,'IsGuarded','Indication of whether the motor enclosure is guarded (= TRUE) or not (= FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); @@ -269,7 +269,7 @@ DATA; #262=IFCSIMPLEPROPERTYTEMPLATE('3qGQTGWP1AAgN$MQmsIaqt',$,'StartCurrentFactor','IEC. Start current factor defines how large the peak starting current will become on the engine. StartCurrentFactor is multiplied to NominalCurrent and to give the start current. ',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #263=IFCSIMPLEPROPERTYTEMPLATE('1seEjVqjr8T8DY2bRVu87U',$,'LockedRotorCurrent','Input current when a motor armature is energized but not rotating.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); #264=IFCSIMPLEPROPERTYTEMPLATE('3uauaOFc52XxG6ykfZsir0',$,'MaximumPowerOutput','The maximum output power rating of the engine.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#265=IFCPROPERTYSETTEMPLATE('3jXRnIlnvF$f5Uy0xkQEtE',$,'Pset_LampTypeCommon','Definition from IAI: A lamp is a component within a light fixture that is designed to emit light. \X2\000A000A\X0\History: Name changed from Pset_LampEmitterTypeCommon in IFC 2x3.\X2\000A\X0\',$,'IfcLampType',(#266,#267,#268,#269,#271,#273,#274,#275,#276)); +#265=IFCPROPERTYSETTEMPLATE('3jXRnIlnvF$f5Uy0xkQEtE',$,'Pset_LampTypeCommon','Definition from IAI: A lamp is a component within a light fixture that is designed to emit light. \X2\000A000A\X0\History: Name changed from Pset_LampEmitterTypeCommon in IFC 2x3.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcLampType',(#266,#267,#268,#269,#271,#273,#274,#275,#276)); #266=IFCSIMPLEPROPERTYTEMPLATE('09$0ozvVj1_Al1gNPIiwQS',$,'ContributedLuminousFlux','Luminous flux is a photometric measure of radiant flux, i.e. the volume of light emitted from a light source. Luminous flux is measured either for the interior as a whole or for a part of the interior (partial luminous flux for a solid angle). All other photometric parameters are derivatives of luminous flux. Luminous flux is measured in lumens (lm). The luminous flux is given as a nominal value for each lamp.',.P_SINGLEVALUE.,'IfcLuminousFluxMeasure',$,$,$,$,$,.READWRITE.); #267=IFCSIMPLEPROPERTYTEMPLATE('22790BDrD0dwjw8QhzCiGI',$,'LightEmitterNominalPower','Light emitter nominal power.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #268=IFCSIMPLEPROPERTYTEMPLATE('0w1menKXr5pxx2tENnuM17',$,'LampMaintenanceFactor','Non recoverable losses of luminous flux of a lamp due to lamp depreciation; i.e. the decreasing of light output of a luminaire due to aging and dirt. ',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); @@ -281,7 +281,7 @@ DATA; #274=IFCSIMPLEPROPERTYTEMPLATE('1dkJWZg_TBFBpS0Q7OJvIt',$,'Spectrum','The spectrum of radiation describes its composition with regard to wavelength. Light, for example, as the portion of electromagnetic radiation that is visible to the human eye, is radiation with wavelengths in the range of approx. 380 to 780 nm (1 nm = 10 m). The corresponding range of colours varies from violet to indigo, blue, green, yellow, orange, and red. These colours form a continuous spectrum, in which the various spectral sectors merge into each other.',.P_TABLEVALUE.,'IfcNumericMeasure','IfcNumericMeasure',$,$,$,$,.READWRITE.); #275=IFCSIMPLEPROPERTYTEMPLATE('27VmFrDv174QdWa1hOsQ1F',$,'ColorTemperature','The color temperature of any source of radiation is defined as the temperature (in Kelvin) of a black-body or Planckian radiator whose radiation has the same chromaticity as the source of radiation. Often the values are only approximate color temperatures as the black-body radiator cannot emit radiation of every chromaticity value. The color temperatures of the commonest artificial light sources range from less than 3000K (warm white) to 4000K (intermediate) and over 5000K (daylight).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #276=IFCSIMPLEPROPERTYTEMPLATE('1HeNWWpI51e9Vts28coA58',$,'ColorRenderingIndex','The CRI indicates how well a light source renders eight standard colors compared to perfect reference lamp with the same color temperature. The CRI scale ranges from 1 to 100, with 100 representing perfect rendering properties.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#277=IFCPROPERTYSETTEMPLATE('25b9JbQCf4nhLPUmCqBWKQ',$,'Pset_LightFixtureTypeCommon','Definition from IAI: Common data for light fixtures.',$,'IfcLightFixtureType',(#278,#279,#280,#282,#284,#285,#286)); +#277=IFCPROPERTYSETTEMPLATE('25b9JbQCf4nhLPUmCqBWKQ',$,'Pset_LightFixtureTypeCommon','Definition from IAI: Common data for light fixtures.',.PSET_TYPEDRIVENOVERRIDE.,'IfcLightFixtureType',(#278,#279,#280,#282,#284,#285,#286)); #278=IFCSIMPLEPROPERTYTEMPLATE('2amQlpIZT2Cf3BHiegPF8i',$,'NumberOfSources','Number of sources ',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #279=IFCSIMPLEPROPERTYTEMPLATE('2jXdampgzBlAKBfTs7ptZN',$,'TotalWattage','Wattage on whole lightfitting device with all sources intact.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #280=IFCSIMPLEPROPERTYTEMPLATE('3TX9EBPp1CC9nf28qR4IlJ',$,'LightFixtureMountingType','A list of the available types of mounting for light fixtures from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#281,$,$,$,.READWRITE.); @@ -291,7 +291,7 @@ DATA; #284=IFCSIMPLEPROPERTYTEMPLATE('04hOg545z3ROfu_5eJgqin',$,'MaintenanceFactor','Maintenance factor.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #285=IFCSIMPLEPROPERTYTEMPLATE('2JtcR$WkLBqhzFBwsWlUbz',$,'ManufacturersSpecificInformation','Manufacturer specific information.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #286=IFCSIMPLEPROPERTYTEMPLATE('2NM4TRJ09FGPsiyVoYZZ07',$,'ArticleNumber','The article number.',.P_REFERENCEVALUE.,'IfcClassificationReference',$,$,$,$,$,.READWRITE.); -#287=IFCPROPERTYSETTEMPLATE('3q7li8i75EnPITcqS_OIlT',$,'Pset_LightFixtureTypeExitSign','Definition from IAI: Properties that characterize an illuminated exit sign\X2\000A\X0\',$,'IfcLightFixtureType',(#288,#289,#291,#293,#295)); +#287=IFCPROPERTYSETTEMPLATE('3q7li8i75EnPITcqS_OIlT',$,'Pset_LightFixtureTypeExitSign','Definition from IAI: Properties that characterize an illuminated exit sign\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcLightFixtureType',(#288,#289,#291,#293,#295)); #288=IFCSIMPLEPROPERTYTEMPLATE('0grkyGKtf46uXjiku09Sq2',$,'MinimumTextHeight','The minlimum height of this type.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #289=IFCSIMPLEPROPERTYTEMPLATE('3H8pKyBq1DGewXBM4AmHaJ',$,'SelfTestFunction','The type of self test function.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#290,$,$,$,.READWRITE.); #290=IFCPROPERTYENUMERATION('PEnum_SelfTestType',(IFCLABEL('Central'),IFCLABEL('Local'),IFCLABEL('None'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); @@ -301,16 +301,16 @@ DATA; #294=IFCPROPERTYENUMERATION('PEnum_PictogramEscapeDirectionType',(IFCLABEL('RightArrow'),IFCLABEL('LeftArrow'),IFCLABEL('DownArrow'),IFCLABEL('UpArrow'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #295=IFCSIMPLEPROPERTYTEMPLATE('0$nA0BshL7_gRwsnhQ$RDh',$,'Addressablility','The type of addressability.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#296,$,$,$,.READWRITE.); #296=IFCPROPERTYENUMERATION('PEnum_AddressabilityType',(IFCLABEL('Implemented'),IFCLABEL('UpgradeableTo'),IFCLABEL('NotImplemented'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#297=IFCPROPERTYSETTEMPLATE('1F_d4Ilff1p8gGS31YNk$7',$,'Pset_LightFixtureTypeThermal','Definition from IAI: Heat load data for a light fixture.',$,'IfcLightFixtureType',(#298,#299,#300)); +#297=IFCPROPERTYSETTEMPLATE('1F_d4Ilff1p8gGS31YNk$7',$,'Pset_LightFixtureTypeThermal','Definition from IAI: Heat load data for a light fixture.',.PSET_TYPEDRIVENOVERRIDE.,'IfcLightFixtureType',(#298,#299,#300)); #298=IFCSIMPLEPROPERTYTEMPLATE('3J8soIGpP6d9HkkRydlOdu',$,'MaximumPlenumSensibleLoad','Maximum or Peak sensible thermal load contributed to the conditioned space by the light fixture. ',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #299=IFCSIMPLEPROPERTYTEMPLATE('0FS8Hw0FX4lRC15px7GPuX',$,'MaximumSpaceSensibleLoad','Maximum or Peak sensible thermal load contributed to return air plenum by the light fixture.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #300=IFCSIMPLEPROPERTYTEMPLATE('0ibrMdjPD4FQLarUf27AwZ',$,'SensibleLoadToRadiant','Percent of sensible thermal load to radiant heat. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#301=IFCPROPERTYSETTEMPLATE('3wHLFdrED5EOsIhafLzjAl',$,'Pset_OutletTypeCommon','Definition from IAI: Common properties for different outlet types.',$,'IfcOutletType',(#302)); +#301=IFCPROPERTYSETTEMPLATE('3wHLFdrED5EOsIhafLzjAl',$,'Pset_OutletTypeCommon','Definition from IAI: Common properties for different outlet types.',.PSET_TYPEDRIVENOVERRIDE.,'IfcOutletType',(#302)); #302=IFCSIMPLEPROPERTYTEMPLATE('3nr9STHx93OgMBlUhciwz0',$,'IsPluggableOutlet','Indication of whether the outlet accepts a loose plug connection (= TRUE) or whether it is directly connected (= FALSE) or whether the form of connection has not yet been determined (= UNKNOWN)',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); -#303=IFCPROPERTYSETTEMPLATE('1ca9k4lq9DeejJVuEF_nm$',$,'Pset_ProtectiveDeviceTypeCircuitBreaker','Definition from IEC 441-14-20: A circuit breaker is a mechanical switching device capable of making, carrying, and breaking currents under normal circuit conditions and also making, carrying for a specified time and breaking, current under specified abnormal circuit conditions such as those of short circuit.',$,'IfcProtectiveDeviceType',(#304)); +#303=IFCPROPERTYSETTEMPLATE('1ca9k4lq9DeejJVuEF_nm$',$,'Pset_ProtectiveDeviceTypeCircuitBreaker','Definition from IEC 441-14-20: A circuit breaker is a mechanical switching device capable of making, carrying, and breaking currents under normal circuit conditions and also making, carrying for a specified time and breaking, current under specified abnormal circuit conditions such as those of short circuit.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceType',(#304)); #304=IFCSIMPLEPROPERTYTEMPLATE('1S711bnFf0X8hrED9_lm9X',$,'CircuitBreakerType','A list of the available types of circuit breaker from which that required may be selected where:\X2\000A000A\X0\ACB - Air Circuit Breaker;\X2\000A\X0\MCB - Miniature Circuit Breaker (up to 125A);\X2\000A\X0\MCCB - Moulded Case Circuit Breaker (40A - 1600A);\X2\000A\X0\Vacuum - Generally used for high voltage (> 1000V) but may be used for installations close to/up to 1000V.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#305,$,$,$,.READWRITE.); #305=IFCPROPERTYENUMERATION('PEnum_CircuitBreakerType',(IFCLABEL('ACB'),IFCLABEL('MCB'),IFCLABEL('MCCB'),IFCLABEL('Vacuum'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset\X2\000A\X0\')),$); -#306=IFCPROPERTYSETTEMPLATE('2UitNdd7f7lftC8NG$3Z5N',$,'Pset_ProtectiveDeviceTypeCommon','Definition from IAI: Common properties for different protective device types.',$,'IfcProtectiveDeviceType',(#307,#308,#309,#310,#311,#312,#313,#314)); +#306=IFCPROPERTYSETTEMPLATE('2UitNdd7f7lftC8NG$3Z5N',$,'Pset_ProtectiveDeviceTypeCommon','Definition from IAI: Common properties for different protective device types.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceType',(#307,#308,#309,#310,#311,#312,#313,#314)); #307=IFCSIMPLEPROPERTYTEMPLATE('2PKqOsdNr8P8cC57vbUgXL',$,'RatedShortCircuitCurrent','An overcurrent resulting from a fault of negligible impedance between live conductors having a difference in potential under normal operating conditions. (IEC 826-05-08)',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); #308=IFCSIMPLEPROPERTYTEMPLATE('2ujv4hTGL1H8Ro7ZGzyLqP',$,'CutOffCurrent','The maximum instantaneous value of current attained during the breaking operation of a protective device. (IEC 441-17-12)',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); #309=IFCSIMPLEPROPERTYTEMPLATE('07MrT9_6z7YhK3$8EqlLHw',$,'MaximumRatedVoltage','Maximum rated voltage',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); @@ -319,41 +319,41 @@ DATA; #312=IFCSIMPLEPROPERTYTEMPLATE('3ERfRhHwTCIuazKkkUKILS',$,'CharacteristicTripCurve','A curve giving the time, e.g. prearcing time or operating time, as a function of the protective current under stated conditions of operation. ',.P_TABLEVALUE.,' IfcElectricCurrentMeasure','IfcTimeMeasure',$,$,$,'a = b + c',.READWRITE.); #313=IFCSIMPLEPROPERTYTEMPLATE('2rJyb_7wv0BgHqoKi4GtmU',$,'ProtectiveTagType','The breaking capacity value of the device. Note: This may be expressed as a code or a value depending on standard and/or source.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #314=IFCSIMPLEPROPERTYTEMPLATE('3vn22R8hj2Beki3EXkPBBJ',$,'StandardUsed','The electrical standard used as a reference when preparing data for the device.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#315=IFCPROPERTYSETTEMPLATE('3_B9SwzWH6JgjVSpMJEQOX',$,'Pset_ProtectiveDeviceTypeEarthFailureDevice','Definition from IAI: An earth failure device acts to protect people and equipment from the effects of current leakage.',$,'IfcProtectiveDeviceType',(#316,#318)); +#315=IFCPROPERTYSETTEMPLATE('3_B9SwzWH6JgjVSpMJEQOX',$,'Pset_ProtectiveDeviceTypeEarthFailureDevice','Definition from IAI: An earth failure device acts to protect people and equipment from the effects of current leakage.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceType',(#316,#318)); #316=IFCSIMPLEPROPERTYTEMPLATE('0BFCqfYKjC4ezY7hvm_07c',$,'EarthFailureDeviceType','A list of the available types of circuit breaker from which that required may be selected where:\X2\000A000A\X0\Standard - Device that operates without a time delay;\X2\000A\X0\TimeDelayed - Device that operates after a time delay.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#317,$,$,$,.READWRITE.); #317=IFCPROPERTYENUMERATION('PEnum_EarthFailureDeviceType',(IFCLABEL('Standard'),IFCLABEL('TimeDelayed'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset\X2\000A\X0\')),$); #318=IFCSIMPLEPROPERTYTEMPLATE('3ERDGFn6b8oQo74QmbIGvy',$,'Sensitivity','Current leakage to an unwanted leading path during normal operation (IEC 151-14-49)',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#319=IFCPROPERTYSETTEMPLATE('0eIinQfv50zPtQGEAo2K6_',$,'Pset_ProtectiveDeviceTypeFuseDisconnector','Definition from IAI: A device that will electrically open the circuit after a period of prolonged, abnormal current flow.',$,'IfcProtectiveDeviceType',(#320)); +#319=IFCPROPERTYSETTEMPLATE('0eIinQfv50zPtQGEAo2K6_',$,'Pset_ProtectiveDeviceTypeFuseDisconnector','Definition from IAI: A device that will electrically open the circuit after a period of prolonged, abnormal current flow.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceType',(#320)); #320=IFCSIMPLEPROPERTYTEMPLATE('1Maa45POz3cxEWfKphhgXY',$,'FuseDisconnectorType','A list of the available types of fuse disconnector from which that required may be selected where:\X2\000A000A\X0\EngineProtectionDevice - A fuse whose characteristic is specifically designed for the protection of a motor or generator.\X2\000A\X0\FuseSwitchDisconnector - A switch disconnector in which a fuse link or a fuse carrier with fuse link forms the moving contact,\X2\000A\X0\HRC - A standard fuse (High Rupturing Capacity)\X2\000A\X0\OverloadProtectionDevice - A device that disconnects the supply when the operating conditions in an electrically undamaged circuit causes an overcurrent,\X2\000A\X0\SemiconductorFuse - A fuse whose characteristic is specifically designed for the protection of sem-conductor devices.\X2\000A\X0\SwitchDisconnectorFuse - A switch disconnector in which one or more poles have a fuse in series in a composite unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#321,$,$,$,.READWRITE.); #321=IFCPROPERTYENUMERATION('PEnum_FuseDisconnectorType',(IFCLABEL('EngineProtectionDevice'),IFCLABEL('FusedSwitch'),IFCLABEL('HRC'),IFCLABEL('OverloadProtectionDevice'),IFCLABEL('SwitchDisconnectorFuse'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#322=IFCPROPERTYSETTEMPLATE('2ueqqMUnL7RhXPXoarV5Uf',$,'Pset_ProtectiveDeviceTypeResidualCurrentCircuitBreaker','Definition from IAI: A residual current circuit breaker opens, closes or isolates a circuit and has short circuit and overload protection.',$,'IfcProtectiveDeviceType',(#323)); +#322=IFCPROPERTYSETTEMPLATE('2ueqqMUnL7RhXPXoarV5Uf',$,'Pset_ProtectiveDeviceTypeResidualCurrentCircuitBreaker','Definition from IAI: A residual current circuit breaker opens, closes or isolates a circuit and has short circuit and overload protection.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceType',(#323)); #323=IFCSIMPLEPROPERTYTEMPLATE('0G2SGnBfDFDRWY0DZJ29Xq',$,'Sensitivity','Current leakage to an unwanted leading path during normal operation (IEC 151-14-49)',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#324=IFCPROPERTYSETTEMPLATE('1l_Td$ATb2nhsrctZwp4BE',$,'Pset_ProtectiveDeviceTypeResidualCurrentSwitch','Definition from IAI: A residual current switch opens, closes or isolates a circuit and has no short circuit or overload protection.',$,'IfcProtectiveDeviceType',(#325)); +#324=IFCPROPERTYSETTEMPLATE('1l_Td$ATb2nhsrctZwp4BE',$,'Pset_ProtectiveDeviceTypeResidualCurrentSwitch','Definition from IAI: A residual current switch opens, closes or isolates a circuit and has no short circuit or overload protection.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceType',(#325)); #325=IFCSIMPLEPROPERTYTEMPLATE('0JxUNHCEjDVfjWooJbdJFV',$,'Sensitivity','Current leakage to an unwanted leading path during normal operation (IEC 151-14-49)',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#326=IFCPROPERTYSETTEMPLATE('3sbur_nJT1VgXwPcwK7LYr',$,'Pset_ProtectiveDeviceTypeVaristor','Definition from IAI: A high voltage surge protection device.',$,'IfcProtectiveDeviceType',(#327)); +#326=IFCPROPERTYSETTEMPLATE('3sbur_nJT1VgXwPcwK7LYr',$,'Pset_ProtectiveDeviceTypeVaristor','Definition from IAI: A high voltage surge protection device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceType',(#327)); #327=IFCSIMPLEPROPERTYTEMPLATE('3KOyPBpqz9sfjnEx$$gKOn',$,'VaristorType','A list of the available types of varistor from which that required may be selected.\X2\000A000A000A000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#328,$,$,$,.READWRITE.); #328=IFCPROPERTYENUMERATION('PEnum_VaristorType',(IFCLABEL('MetalOxide'),IFCLABEL('ZincOxide'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#329=IFCPROPERTYSETTEMPLATE('1Sg72FMrPFseu5xDTuoMS5',$,'Pset_SwitchingDeviceTypeCommon','Definition from IEC 441-14-01: A switching device is a device designed to make or break the current in one or more electric circuits.',$,'IfcSwitchingDeviceType',(#330,#331,#333)); +#329=IFCPROPERTYSETTEMPLATE('1Sg72FMrPFseu5xDTuoMS5',$,'Pset_SwitchingDeviceTypeCommon','Definition from IEC 441-14-01: A switching device is a device designed to make or break the current in one or more electric circuits.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDeviceType',(#330,#331,#333)); #330=IFCSIMPLEPROPERTYTEMPLATE('3bl7ddXMz8Neee40pg06$j',$,'NumberOfGangs','Number of gangs/buttons on this switch',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #331=IFCSIMPLEPROPERTYTEMPLATE('1epUZEUyP7IwdKwOqb1PTG',$,'SwitchFunction','Indicates types of switches which differs in functionality',.P_ENUMERATEDVALUE.,'IfcLabel',$,#332,$,$,$,.READWRITE.); #332=IFCPROPERTYENUMERATION('PEnum_SwitchFunctionType',(IFCLABEL('OnOffSwitch'),IFCLABEL('IntermediateSwitch'),IFCLABEL('DoubleThrowSwitch'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #333=IFCSIMPLEPROPERTYTEMPLATE('1ptSwPg0TEuPbQWTsbapun',$,'HasLock','Indication of whether a switching device has a key operated lock (=TRUE) or not (= FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#334=IFCPROPERTYSETTEMPLATE('1GD9bkgRPDwwI9TDXhkw1Z',$,'Pset_SwitchingDeviceTypeContactor','Definition from IAI: An electrical device used to control the flow of power in a circuit on or off.',$,'IfcSwitchingDeviceType',(#335)); +#334=IFCPROPERTYSETTEMPLATE('1GD9bkgRPDwwI9TDXhkw1Z',$,'Pset_SwitchingDeviceTypeContactor','Definition from IAI: An electrical device used to control the flow of power in a circuit on or off.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDeviceType',(#335)); #335=IFCSIMPLEPROPERTYTEMPLATE('0qhuufXs9EvubWKijFwAkX',$,'ContactorType','A list of the available types of contactor from which that required may be selected where:\X2\000A000A\X0\CapacitorSwitching - for switching 3 phase single or multi-step capacitor banks\X2\000A\X0\LowCurrent - requires the use of low resistance contacts\X2\000A\X0\MagneticLatching - enables the contactor to remain in the on position when the coil is no longer energized\X2\000A\X0\MechanicalLatching - requires that the contactor is mechanically retained in the on position\X2\000A\X0\Modular - are totally enclosed and self contained\X2\000A\X0\Reversing - has a double set of contactors that are prewired\X2\000A\X0\Standard - is a generic device that controls the flow of power in a circuit on or off\X2\000A000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#336,$,$,$,.READWRITE.); #336=IFCPROPERTYENUMERATION('PEnum_ContactorType',(IFCLABEL('CapacitorSwitching'),IFCLABEL('LowCurrent'),IFCLABEL('MagneticLatching'),IFCLABEL('MechanicalLatching'),IFCLABEL('Modular'),IFCLABEL('Reversing'),IFCLABEL('Standard'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#337=IFCPROPERTYSETTEMPLATE('1M2ReZC8j0Je5qrLmFKO7r',$,'Pset_SwitchingDeviceTypeEmergencyStop','Definition from IEC 826-08-03: An emergency stop device acts to remove as quickly as possible any danger that may have arisen unexpectedly.',$,'IfcSwitchingDeviceType',(#338)); +#337=IFCPROPERTYSETTEMPLATE('1M2ReZC8j0Je5qrLmFKO7r',$,'Pset_SwitchingDeviceTypeEmergencyStop','Definition from IEC 826-08-03: An emergency stop device acts to remove as quickly as possible any danger that may have arisen unexpectedly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDeviceType',(#338)); #338=IFCSIMPLEPROPERTYTEMPLATE('0Iu$BIccDEyACE8KGcjWbv',$,'SwitchOperation','Indicates operation of emergency stop switch.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#339,$,$,$,.READWRITE.); #339=IFCPROPERTYENUMERATION('PEnum_SwitchFunctionType',(IFCLABEL('Mushroom'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#340=IFCPROPERTYSETTEMPLATE('1sr26ToZv9P9AAYzGWL3Oa',$,'Pset_SwitchingDeviceTypeStarter','Definition from IAI: A starter is a switch which in the closed position controls the application of power to an electrical device.',$,'IfcSwitchingDeviceType',(#341)); +#340=IFCPROPERTYSETTEMPLATE('1sr26ToZv9P9AAYzGWL3Oa',$,'Pset_SwitchingDeviceTypeStarter','Definition from IAI: A starter is a switch which in the closed position controls the application of power to an electrical device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDeviceType',(#341)); #341=IFCSIMPLEPROPERTYTEMPLATE('3xnyTS_Ur9U8crFbsKZAEo',$,'StarterType','A list of the available types of starter from which that required may be selected where:\X2\000A000A\X0\AutoTransformer - A starter for an induction motor which uses for starting one or more reduced voltages derived from an auto transformer. (IEC 441-14-45)\X2\000A\X0\Manual - A starter in which the force for closing the main contacts is provided exclusively by manual energy. (IEC 441-14-39)\X2\000A\X0\DirectOnLine - A starter which connects the line voltage across the motor terminals in one step. (IEC 441-14-40)\X2\000A\X0\Frequency - A starter in which the frequency of the power supply is progressively increased until the normal operation frequency is attained.\X2\000A\X0\nStep - A starter in which there are (n-1) intermediate accelerating positions between the off and full on positions. (IEC 441-14-41)\X2\000A\X0\Rheostatic - A starter using one or several resistors for obtaining, during starting, stated motor torque characteristics and for limiting the current. (IEC 441-14-425)\X2\000A\X0\StarDelta - A starter for a 3 phase induction motor such that in the starting position the stator windings are connected in star and in the final running position they are connected in delta. (IEC 441-14-44)\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#342,$,$,$,.READWRITE.); #342=IFCPROPERTYENUMERATION('PEnum_StarterType',(IFCLABEL('AutoTransformer'),IFCLABEL('Manual'),IFCLABEL('DirectOnLine'),IFCLABEL('Frequency'),IFCLABEL('nStep'),IFCLABEL('Rheostatic'),IFCLABEL('StarDelta'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset\X2\000A\X0\')),$); -#343=IFCPROPERTYSETTEMPLATE('2sPgjKFRbDYuX1fN57pGXx',$,'Pset_SwitchingDeviceTypeSwitchDisconnector','Definition from IEC 441-14-12: A switch disconnector is a switch which in the open position satisfies the isolating requirements specified for a disconnector.',$,'IfcSwitchingDeviceType',(#344,#346,#348)); +#343=IFCPROPERTYSETTEMPLATE('2sPgjKFRbDYuX1fN57pGXx',$,'Pset_SwitchingDeviceTypeSwitchDisconnector','Definition from IEC 441-14-12: A switch disconnector is a switch which in the open position satisfies the isolating requirements specified for a disconnector.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDeviceType',(#344,#346,#348)); #344=IFCSIMPLEPROPERTYTEMPLATE('2Wy$D5F4r0X8pcOELXjv0C',$,'SwitchDisconnectorType','A list of the available types of switch disconnector from which that required may be selected where:\X2\000A000A\X0\CenterBreak - A disconnector in which both contacts of each pole are movable and engage at a point substantially midway between their supports. (IEC 441-14-08)\X2\000A\X0\DividedSupport - A disconnector in which the fixed and moving contacts of each pole are not supported by a common base or frame. (IEC 441-14-06)\X2\000A\X0\DoubleBreak - A disconnector that opens a circuit at two points. (IEC 441-14-09)\X2\000A\X0\EarthingSwitch - A disconnector in which the fixed and moving contacts of each pole are not supported by a common base or frame. (IEC 441-14-07)\X2\000A\X0\Isolator - A disconnector which in the open position satisfies isolating requirements. (IEC 441-14-12)',.P_ENUMERATEDVALUE.,'IfcLabel',$,#345,$,$,$,.READWRITE.); #345=IFCPROPERTYENUMERATION('PEnum_SwitchDisconnectorType',(IFCLABEL('CenterBreak'),IFCLABEL('DividedSupport'),IFCLABEL('DoubleBreak'),IFCLABEL('EarthingSwitch'),IFCLABEL('Isolator'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset\X2\000A\X0\')),$); #346=IFCSIMPLEPROPERTYTEMPLATE('3IXh6LzkvBvg1S3zQZyygr',$,'LoadDisconnectionType','A list of the available types of load disconnection from which that required may be selected.\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#347,$,$,$,.READWRITE.); #347=IFCPROPERTYENUMERATION('PEnum_LoadDisconnectionType',(IFCLABEL('OffLoad'),IFCLABEL('OnLoad'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset\X2\000A\X0\')),$); #348=IFCSIMPLEPROPERTYTEMPLATE('3lO8Eww4z0HQ3gS4egfw92',$,'HasVisualIndication','Indicates whether a means of being to visually ascertain whether the contacts are open or closed is fitted (= TRUE) or not (= FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#349=IFCPROPERTYSETTEMPLATE('0YcicMHrv8HR60f0ZBdOm2',$,'Pset_SwitchingDeviceTypeToggleSwitch','Definition from IAI: A toggle switch is a switch that enables or isolates electrical power through a two position on/off action..',$,'IfcSwitchingDeviceType',(#350,#352,#354,#356,#357)); +#349=IFCPROPERTYSETTEMPLATE('0YcicMHrv8HR60f0ZBdOm2',$,'Pset_SwitchingDeviceTypeToggleSwitch','Definition from IAI: A toggle switch is a switch that enables or isolates electrical power through a two position on/off action..',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDeviceType',(#350,#352,#354,#356,#357)); #350=IFCSIMPLEPROPERTYTEMPLATE('3dGCGP9V53D9$GrUx5Tk8w',$,'ToggleSwitchType','A list of the available types of toggle switch from which that required may be selected.\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#351,$,$,$,.READWRITE.); #351=IFCPROPERTYENUMERATION('PEnum_ToggleSwitchType',(IFCLABEL('BreakGlass'),IFCLABEL('Changeover'),IFCLABEL('Dimmer'),IFCLABEL('KeyOperated'),IFCLABEL('ManualPull'),IFCLABEL('PushButton'),IFCLABEL('Pullcord'),IFCLABEL('Rocker'),IFCLABEL('Selector'),IFCLABEL('Twist'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset\X2\000A\X0\')),$); #352=IFCSIMPLEPROPERTYTEMPLATE('3rU8xyQGr2GP8ts9cpw9tv',$,'SwitchUsage','A list of the available usages for toggle switches from which that required may be selected\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#353,$,$,$,.READWRITE.); @@ -362,7 +362,7 @@ DATA; #355=IFCPROPERTYENUMERATION('PEnum_SwitchActivation',(IFCLABEL('Actuator'),IFCLABEL('Foot'),IFCLABEL('Hand'),IFCLABEL('Proximity'),IFCLABEL('Sound'),IFCLABEL('TwoHand'),IFCLABEL('Wire'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #356=IFCSIMPLEPROPERTYTEMPLATE('3X1VoJhGjCwRMZQ20Cfg5X',$,'IsIlluminated','An indication of whether there is an illuminated indicator to show that the switch is on (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #357=IFCSIMPLEPROPERTYTEMPLATE('2NCXsovcv9Kx2KdnyP4UCV',$,'Legend','A text inscribed or applied to the switch as a legend to indicate purpose or function.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#358=IFCPROPERTYSETTEMPLATE('2$EMAeZP95DvyTq0t_HRLu',$,'Pset_TransformerTypeCommon','Definition from IAI: An inductive stationary device that transfers electrical energy from one circuit to another.',$,'IfcTransformerType',(#359,#360,#361,#362,#363,#364,#365,#366,#367,#368)); +#358=IFCPROPERTYSETTEMPLATE('2$EMAeZP95DvyTq0t_HRLu',$,'Pset_TransformerTypeCommon','Definition from IAI: An inductive stationary device that transfers electrical energy from one circuit to another.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTransformerType',(#359,#360,#361,#362,#363,#364,#365,#366,#367,#368)); #359=IFCSIMPLEPROPERTYTEMPLATE('1Ujz6dt3v4uezlVFqG0Ewg',$,'PrimaryVoltage','The voltage that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); #360=IFCSIMPLEPROPERTYTEMPLATE('1kHGwuYKn8jBGAdXKlGvCL',$,'SecondaryVoltage','The voltage that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); #361=IFCSIMPLEPROPERTYTEMPLATE('3lkzxqb2H2_enrA8Eh2yD1',$,'PrimaryCurrent','The current that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); @@ -374,7 +374,7 @@ DATA; #367=IFCSIMPLEPROPERTYTEMPLATE('3UQLn8xL547xh$NBTvktML',$,'MaximumApparentPower','Maximum apparent power/capacity in VA (volt ampere).',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #368=IFCSIMPLEPROPERTYTEMPLATE('2_szONBt1CnvORLQbQ$hzw',$,'SecondaryCurrentType','A list of the secondary current types that can result from transformer output',.P_ENUMERATEDVALUE.,'IfcLabel',$,#369,$,$,$,.READWRITE.); #369=IFCPROPERTYENUMERATION('PEnum_SecondaryCurrentType',(IFCLABEL('AC'),IFCLABEL('DC'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#370=IFCPROPERTYSETTEMPLATE('1O_LAujTz5bhU1aiC5SN5R',$,'Pset_ActionRequest','Definition from IAI: An action request is a request for an action to fulfill a need.\X2\000A\X0\',$,'IfcActionRequest',(#371,#373,#374,#375,#376,#377)); +#370=IFCPROPERTYSETTEMPLATE('1O_LAujTz5bhU1aiC5SN5R',$,'Pset_ActionRequest','Definition from IAI: An action request is a request for an action to fulfill a need.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcActionRequest',(#371,#373,#374,#375,#376,#377)); #371=IFCSIMPLEPROPERTYTEMPLATE('0Iwvv65m95dugm4j32nR9k',$,'RequestSourceType','Identifies the predefined types of sources through which a request can be made.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#372,$,$,$,.READWRITE.); #372=IFCPROPERTYENUMERATION('PEnum_RequestSourceType',(IFCLABEL('Email'),IFCLABEL('Fax'),IFCLABEL('Phone'),IFCLABEL('Post'),IFCLABEL('Verbal'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #373=IFCSIMPLEPROPERTYTEMPLATE('3bjwzwdN59meosCziawQTO',$,'RequestSourceLabel','A specific name or label that further qualifies the identity of a request source. In the event of an email, this may be the email address.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -383,13 +383,13 @@ DATA; #376=IFCSIMPLEPROPERTYTEMPLATE('1LEY0iTX95j8jdz$87wzUI',$,'RequestComments','Comments that may be made on the request.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #377=IFCSIMPLEPROPERTYTEMPLATE('0zmOXLTBH4lfHQQopkdSgz',$,'Status','The status currently assigned to the request where:\X2\000A\X0\Hold = wait to see if further requests are received before deciding on action,\X2\000A\X0\NoAction = no action is required on this request,\X2\000A\X0\Schedule = plan action to take place as part of maintenance or other task planning/scheduling,\X2\000A\X0\Urgent = take action immediately.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#378,$,$,$,.READWRITE.); #378=IFCPROPERTYENUMERATION('PEnum_RequestStatus',(IFCLABEL('Hold'),IFCLABEL('NoAction'),IFCLABEL('Schedule'),IFCLABEL('Urgent'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#379=IFCPROPERTYSETTEMPLATE('05shhalhv6te2L9s5cKo5q',$,'Pset_PackingInstructions','Definition from IAI: Packing instructions are specific instructions relating to the packing that is required for an artefact (instance of IfcProduct) in the event of a move (where the product is related to an instance of IfcMove). \X2\000A\X0\',$,'IfcProduct',(#380,#382,#383,#384)); +#379=IFCPROPERTYSETTEMPLATE('05shhalhv6te2L9s5cKo5q',$,'Pset_PackingInstructions','Definition from IAI: Packing instructions are specific instructions relating to the packing that is required for an artefact (instance of IfcProduct) in the event of a move (where the product is related to an instance of IfcMove). \X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcProduct',(#380,#382,#383,#384)); #380=IFCSIMPLEPROPERTYTEMPLATE('3A96JFBs52QO_WecVvrKus',$,'PackingCareType','Identifies the predefined types of care that may be required when handling the artefact during a move where:\X2\000A000A\X0\Fragile = artefact may be broken during a move through careless handling.\X2\000A\X0\HandleWithCare = artefact may be damaged during a move through careless handling.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#381,$,$,$,.READWRITE.); #381=IFCPROPERTYENUMERATION('PEnum_PackingCareType',(IFCLABEL('Fragile'),IFCLABEL('HandleWithCare'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #382=IFCSIMPLEPROPERTYTEMPLATE('2IglEpsBjCIAW$XbJEqL1v',$,'WrappingMaterial','Special requirements for material used to wrap an artefact.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #383=IFCSIMPLEPROPERTYTEMPLATE('2ooUQPPhH0kfgty11usXBw',$,'ContainerMaterial','Special requirements for material used to contain an artefact.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #384=IFCSIMPLEPROPERTYTEMPLATE('1IED2trrjEpRrP9zFoz9gO',$,'SpecialInstructions','Special instructions for packing.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#385=IFCPROPERTYSETTEMPLATE('1MX2ZbCmj1Lf3r0xbSd9ja',$,'Pset_Permit','Definition from IAI: A permit is a document that allows permission to gain access to an area or carry out work in a situation where security or other access restrictions apply.\X2\000A\X0\',$,'IfcPermit',(#386,#388,#389,#390,#391,#392,#393)); +#385=IFCPROPERTYSETTEMPLATE('1MX2ZbCmj1Lf3r0xbSd9ja',$,'Pset_Permit','Definition from IAI: A permit is a document that allows permission to gain access to an area or carry out work in a situation where security or other access restrictions apply.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcPermit',(#386,#388,#389,#390,#391,#392,#393)); #386=IFCSIMPLEPROPERTYTEMPLATE('0Glpbc7w1B6OC2aGwYNZdv',$,'PermitType','Identifies the predefined types of permits that can be granted where:\X2\000A000A\X0\Access = enables access to an identified area,\X2\000A\X0\Work = enables work to be carried out in an identified area',.P_ENUMERATEDVALUE.,'IfcLabel',$,#387,$,$,$,.READWRITE.); #387=IFCPROPERTYENUMERATION('PEnum_PermitType',(IFCLABEL('Access'),IFCLABEL('Work'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #388=IFCSIMPLEPROPERTYTEMPLATE('06jkUKFZP74xRwC_vTAWK3',$,'EscortRequirement','Indicates whether or not an escort is required to accompany persons carrying out a work order at or to/from the place of work (= TRUE) or not (= FALSE).\X2\000A000A\X0\NOTE - There are many instances where escorting is required, particularly in a facility that has a high security rating. Escorting may require that persons are escorted to and from the place of work. Alternatively, it may involve the escort remaining at the place of work at all times.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); @@ -398,12 +398,12 @@ DATA; #391=IFCSIMPLEPROPERTYTEMPLATE('3n50$oSODCMQXZNqGSXjMH',$,'StartTime','Start time.',.P_REFERENCEVALUE.,'IfcLocalTime',$,$,$,$,$,.READWRITE.); #392=IFCSIMPLEPROPERTYTEMPLATE('1s_Tx6t1HEAvuB3JDkhlXZ',$,'EndTime','End time.',.P_REFERENCEVALUE.,'IfcLocalTime',$,$,$,$,$,.READWRITE.); #393=IFCSIMPLEPROPERTYTEMPLATE('2VnuF5tqf5uAbqnKMj$CKG',$,'SpecialRequirements','Any additional special requirements that need to be included in the permit to work.\X2\000A000A\X0\NOTE - Additional permit requirements may be imposed according to the nature of the facility at which the work is carried out. For instance, in clean areas, special clothing may be required whilst in corrective institutions, it may be necessary to check in and check out tools that will be used for work as a safety precaution.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#394=IFCPROPERTYSETTEMPLATE('1WEwj4Apv9EQiPVNXIGLNL',$,'Pset_AirTerminalBoxPHistory','Definition from IAI: Air terminal box performance history attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#395,#396,#397,#398)); +#394=IFCPROPERTYSETTEMPLATE('1WEwj4Apv9EQiPVNXIGLNL',$,'Pset_AirTerminalBoxPHistory','Definition from IAI: Air terminal box performance history attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#395,#396,#397,#398)); #395=IFCSIMPLEPROPERTYTEMPLATE('1yL993DfnAQwPagKua8MlH',$,'DamperPosition','Control damper position, ranging from 0 to 1.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOSITIVERATIOMEASURE',$,$,$,$,.READWRITE.); #396=IFCSIMPLEPROPERTYTEMPLATE('2CrmT7bGDAiBrEvjF06luR',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #397=IFCSIMPLEPROPERTYTEMPLATE('2nCELZzx16URbtarD0TeoL',$,'Sound','Sound performance.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #398=IFCSIMPLEPROPERTYTEMPLATE('0yIgUc1kf2jxfsoJTbLiPn',$,'AirflowCurve','Air flowrate versus damper position relationship;airflow = f ( valve position).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#399=IFCPROPERTYSETTEMPLATE('0neOXUmunDvQL5ekVWAeT4',$,'Pset_AirTerminalBoxTypeCommon','Definition from IAI: Air terminal box type common attributes.\X2\000A\X0\',$,'IfcAirTerminalBoxType',(#400,#401,#402,#403,#405,#407,#408,#409,#410,#411,#412,#413,#414,#415,#416)); +#399=IFCPROPERTYSETTEMPLATE('0neOXUmunDvQL5ekVWAeT4',$,'Pset_AirTerminalBoxTypeCommon','Definition from IAI: Air terminal box type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcAirTerminalBoxType',(#400,#401,#402,#403,#405,#407,#408,#409,#410,#411,#412,#413,#414,#415,#416)); #400=IFCSIMPLEPROPERTYTEMPLATE('0hQ4lIjnX5xhzpT9q4hCOz',$,'AirflowRateRange','Range of airflow that can be delivered.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #401=IFCSIMPLEPROPERTYTEMPLATE('0LZQ6jqgn4QwYUUyBFEqbc',$,'AirPressureRange','Allowable air static pressure range at the entrance of the air terminal box.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #402=IFCSIMPLEPROPERTYTEMPLATE('1bk1QKjub2iRvkLu0$RZG_',$,'NominalAirFlowRate','Nominal airflow rate.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); @@ -421,7 +421,7 @@ DATA; #414=IFCSIMPLEPROPERTYTEMPLATE('3dGcVHVnbEvxsR5hU1HHnw',$,'OperationTemperatureRange','Allowable operational range of the ambient air temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #415=IFCSIMPLEPROPERTYTEMPLATE('20W1Q6KXj5rPFH3Y8GpUpS',$,'ReturnAirFractionRange','Allowable return air fraction range as a fraction of discharge airflow.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #416=IFCSIMPLEPROPERTYTEMPLATE('3Fm_F3D4bCUh2qrW8j1k9A',$,'Weight','Weight of the air terminal box.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#417=IFCPROPERTYSETTEMPLATE('1kvWLdsFT4CwRdcaxic4U$',$,'Pset_AirTerminalPHistory','Definition from IAI: Air terminal performance history common attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#418,#419,#420,#421,#422,#423,#424)); +#417=IFCPROPERTYSETTEMPLATE('1kvWLdsFT4CwRdcaxic4U$',$,'Pset_AirTerminalPHistory','Definition from IAI: Air terminal performance history common attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#418,#419,#420,#421,#422,#423,#424)); #418=IFCSIMPLEPROPERTYTEMPLATE('32bwFlukLEsOhBnopotvQD',$,'AirFlowRate','Volumetric flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries','VOLUMETRICFLOWRATEUNIT',$,$,$,$,.READWRITE.); #419=IFCSIMPLEPROPERTYTEMPLATE('2Ml7Vxd5P5WBZNtmCGx8Yp',$,'NeckAirVelocity','Air velocity at the neck.',.P_REFERENCEVALUE.,'IfcTimeSeries','LINEARVELOCITYUNIT',$,$,$,$,.READWRITE.); #420=IFCSIMPLEPROPERTYTEMPLATE('1BcMEGdVnC0RCD0ovI4ZYj',$,'SupplyAirTemperatureHeating','Supply air temperature in heating mode ',.P_REFERENCEVALUE.,'IfcTimeSeries','THERMODYNAMICTEMPERATUREUNIT',$,$,$,$,.READWRITE.); @@ -429,7 +429,7 @@ DATA; #422=IFCSIMPLEPROPERTYTEMPLATE('20L0xi0MT6MBXjHcLSpde8',$,'PressureDrop','Drop in total pressure between inlet and outlet at nominal air-flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries','PRESSUREUNIT',$,$,$,$,.READWRITE.); #423=IFCSIMPLEPROPERTYTEMPLATE('1osbY2sLXDrwGY3NKrXPzn',$,'InductionRatio','Induction ratio versus distance from the diffuser and its discharge direction; induction ratio (or entrainment ratio) is the ratio of the volumetric flow rate in the jet to the volumetric flow rate at the air terminal',.P_TABLEVALUE.,'IfcReal','IfcLengthMeasure',$,$,$,$,.READWRITE.); #424=IFCSIMPLEPROPERTYTEMPLATE('0pIhwJQz1Fc8kJgTYf24sK',$,'CenterlineAirVelocity','Centerline air velocity versus distance from the diffuser and temperature differential; a function of distance from diffuser and temperature difference between supply air and room air.',.P_TABLEVALUE.,'IfcLinearVelocityMeasure','IfcLengthMeasure',$,$,$,$,.READWRITE.); -#425=IFCPROPERTYSETTEMPLATE('35M0XAsEr5LBXyApZe$CQo',$,'Pset_AirTerminalTypeCommon','Definition from IAI: Air terminal type common attributes.\X2\000A\X0\SoundLevel attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.\X2\000A\X0\',$,'IfcAirTerminalType',(#426,#428,#430,#431,#432,#434,#435,#436,#437,#439,#440,#442,#444,#445,#446,#447,#449,#450,#451,#452,#453,#454)); +#425=IFCPROPERTYSETTEMPLATE('35M0XAsEr5LBXyApZe$CQo',$,'Pset_AirTerminalTypeCommon','Definition from IAI: Air terminal type common attributes.\X2\000A\X0\SoundLevel attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcAirTerminalType',(#426,#428,#430,#431,#432,#434,#435,#436,#437,#439,#440,#442,#444,#445,#446,#447,#449,#450,#451,#452,#453,#454)); #426=IFCSIMPLEPROPERTYTEMPLATE('2kmgiuyA91BPNTEviFr_S_',$,'Shape','Shape of the air terminal. Slot is typically a long narrow supply device with an aspect ratio generally greater than 10 to 1.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#427,$,$,$,.READWRITE.); #427=IFCPROPERTYENUMERATION('PEnum_AirTerminalShape',(IFCLABEL('ROUND'),IFCLABEL('RECTANGULAR'),IFCLABEL('SQUARE'),IFCLABEL('SLOT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #428=IFCSIMPLEPROPERTYTEMPLATE('37taCakef1f9lsEQK09q7e',$,'FlowPattern','Flow pattern',.P_ENUMERATEDVALUE.,'IfcLabel',$,#429,$,$,$,.READWRITE.); @@ -459,20 +459,20 @@ DATA; #452=IFCSIMPLEPROPERTYTEMPLATE('3UPiijZ0jA4AeMjsy_VsJu',$,'EffectiveArea','Effective discharge area of the air terminal.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #453=IFCSIMPLEPROPERTYTEMPLATE('0oCka8jYzFbBrukVC9fj8N',$,'Weight','Weight of the air terminal.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); #454=IFCSIMPLEPROPERTYTEMPLATE('1Diruv889DSu8yHcA63SnP',$,'AirFlowrateVersusFlowControlElement','Air flowrate versus flow control element position at nominal pressure drop.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPositiveRatioMeasure',$,$,$,$,.READWRITE.); -#455=IFCPROPERTYSETTEMPLATE('0$$cqar_j9I9ton8UkKnvS',$,'Pset_AirTerminalTypeRectangular','Definition from IAI: Rectangular air terminal type attributes.\X2\000A\X0\',$,'IfcAirTerminalType',(#456)); +#455=IFCPROPERTYSETTEMPLATE('0$$cqar_j9I9ton8UkKnvS',$,'Pset_AirTerminalTypeRectangular','Definition from IAI: Rectangular air terminal type attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcAirTerminalType',(#456)); #456=IFCSIMPLEPROPERTYTEMPLATE('2NxElieh18vBB$4xuNxfdZ',$,'FaceType','Identifies how the terminal face of an AirTerminal is constructed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#457,$,$,$,.READWRITE.); #457=IFCPROPERTYENUMERATION('PEnum_AirTerminalFaceType',(IFCLABEL('FOURWAYPATTERN'),IFCLABEL('SINGLEDEFLECTION'),IFCLABEL('DOUBLEDEFLECTION'),IFCLABEL('SIGHTPROOF'),IFCLABEL('EGGCRATE'),IFCLABEL('PERFORATED'),IFCLABEL('LOUVERED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#458=IFCPROPERTYSETTEMPLATE('3d7q0sSm5E_OHjTKhp9F9c',$,'Pset_AirTerminalTypeRound','Definition from IAI: Round air terminal type attributes.\X2\000A\X0\',$,'IfcAirTerminalType',(#459)); +#458=IFCPROPERTYSETTEMPLATE('3d7q0sSm5E_OHjTKhp9F9c',$,'Pset_AirTerminalTypeRound','Definition from IAI: Round air terminal type attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcAirTerminalType',(#459)); #459=IFCSIMPLEPROPERTYTEMPLATE('1p0LoyP3161v$MQJimx8gX',$,'FaceType','Identifies how the terminal face of an AirTerminal is constructed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#460,$,$,$,.READWRITE.); #460=IFCPROPERTYENUMERATION('PEnum_AirTerminalFaceType',(IFCLABEL('FOURWAYPATTERN'),IFCLABEL('SINGLEDEFLECTION'),IFCLABEL('DOUBLEDEFLECTION'),IFCLABEL('SIGHTPROOF'),IFCLABEL('EGGCRATE'),IFCLABEL('PERFORATED'),IFCLABEL('LOUVERED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#461=IFCPROPERTYSETTEMPLATE('180OGKUV5AXxHRfwpu0IGZ',$,'Pset_AirTerminalTypeSlot','Definition from IAI: Slot air terminal type attributes.\X2\000A\X0\',$,'IfcAirTerminalType',(#462,#463,#464)); +#461=IFCPROPERTYSETTEMPLATE('180OGKUV5AXxHRfwpu0IGZ',$,'Pset_AirTerminalTypeSlot','Definition from IAI: Slot air terminal type attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcAirTerminalType',(#462,#463,#464)); #462=IFCSIMPLEPROPERTYTEMPLATE('3v60WYDyP8j9k5I_wH0PCp',$,'SlotWidth','Slot width.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #463=IFCSIMPLEPROPERTYTEMPLATE('21HATXIcj8Uf1Quw7MYoLR',$,'SlotLength','Slot length.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #464=IFCSIMPLEPROPERTYTEMPLATE('1DFhhamD5Ewu0$KcmQMf$7',$,'NumberOfSlots','Number of slots.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#465=IFCPROPERTYSETTEMPLATE('0RW_959IL3d8y$9Y9t7nvO',$,'Pset_AirTerminalTypeSquare','Definition from IAI: Square air terminal type attributes.\X2\000A\X0\',$,'IfcAirTerminalType',(#466)); +#465=IFCPROPERTYSETTEMPLATE('0RW_959IL3d8y$9Y9t7nvO',$,'Pset_AirTerminalTypeSquare','Definition from IAI: Square air terminal type attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcAirTerminalType',(#466)); #466=IFCSIMPLEPROPERTYTEMPLATE('2kZSPrrxX7f9p$71cNUXkB',$,'FaceType','Identifies how the terminal face of an AirTerminal is constructed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#467,$,$,$,.READWRITE.); #467=IFCPROPERTYENUMERATION('PEnum_AirTerminalFaceType',(IFCLABEL('FOURWAYPATTERN'),IFCLABEL('SINGLEDEFLECTION'),IFCLABEL('DOUBLEDEFLECTION'),IFCLABEL('SIGHTPROOF'),IFCLABEL('EGGCRATE'),IFCLABEL('PERFORATED'),IFCLABEL('LOUVERED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#468=IFCPROPERTYSETTEMPLATE('2wKLP3Xr5AP8llrRQ7M918',$,'Pset_AirToAirHeatRecoveryPHist','Definition from IAI: Air to Air Heat Recovery performance history common attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#469,#470,#471,#472,#473,#474,#475,#476,#477,#478,#479)); +#468=IFCPROPERTYSETTEMPLATE('2wKLP3Xr5AP8llrRQ7M918',$,'Pset_AirToAirHeatRecoveryPHist','Definition from IAI: Air to Air Heat Recovery performance history common attributes.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcPerformanceHistory',(#469,#470,#471,#472,#473,#474,#475,#476,#477,#478,#479)); #469=IFCSIMPLEPROPERTYTEMPLATE('3cFsTQcTLEbxFxoa_vrdIO',$,'SensibleEffectiveness','Sensible heat transfer effectiveness, where effectiveness is defined as the ratio of heat transfer to maximum possible heat transfer.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #470=IFCSIMPLEPROPERTYTEMPLATE('1AYcPPAXPC58pqTes3hFeR',$,'TotalEffectiveness','Total heat transfer effectiveness: The ratio of heat transfer to the maximum possible heat transfer.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #471=IFCSIMPLEPROPERTYTEMPLATE('2x6aPK5XDF_v_gKB1HFoLC',$,'TemperatureEffectiveness','Temperature heat transfer effectiveness: The ratio of primary airflow temperature changes to maximum possible temperature changes.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); @@ -484,7 +484,7 @@ DATA; #477=IFCSIMPLEPROPERTYTEMPLATE('2_Vmb9scrDcApdifr0tWTt',$,'SensibleEffectivenessTable','Sensible heat transfer effectiveness curve as a function of the primary and secondary air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #478=IFCSIMPLEPROPERTYTEMPLATE('3tsMfQdo5FjOVEtNi$jPuS',$,'TotalEffectivenessTable','Total heat transfer effectiveness curve as a function of the primary and secondary air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #479=IFCSIMPLEPROPERTYTEMPLATE('1wwCl$mtj5AhUXCAg7R1V6',$,'AirPressureDropCurves','Air pressure drop as function of air flow rate',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#480=IFCPROPERTYSETTEMPLATE('3QHDLtTwv81AHD$fsreUsR',$,'Pset_AirToAirHeatRecoveryTypeCommon','Definition from IAI: Air to Air Heat Recovery type common attributes.\X2\000A\X0\',$,'IfcAirToAirHeatRecoveryType',(#481,#483,#484,#485,#486,#487,#488)); +#480=IFCPROPERTYSETTEMPLATE('3QHDLtTwv81AHD$fsreUsR',$,'Pset_AirToAirHeatRecoveryTypeCommon','Definition from IAI: Air to Air Heat Recovery type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcAirToAirHeatRecoveryType',(#481,#483,#484,#485,#486,#487,#488)); #481=IFCSIMPLEPROPERTYTEMPLATE('33nBbwwcTAoh0OQSGd$fze',$,'HeatTransferTypeEnum','Type of heat transfer between the two air streams.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#482,$,$,$,.READWRITE.); #482=IFCPROPERTYENUMERATION('PEnum_AirToAirHeatTransferHeatTransferType',(IFCLABEL('SENSIBLE'),IFCLABEL('LATENT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #483=IFCSIMPLEPROPERTYTEMPLATE('3N4gcvTS1AZeKoKmD5L8n1',$,'MediaMaterial','The primary media material used for heat transfer.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); @@ -493,7 +493,7 @@ DATA; #486=IFCSIMPLEPROPERTYTEMPLATE('2V_D9lNrDCBB9M9G3Y37d7',$,'PrimaryAirflowRateRange','possible range of primary airflow that can be delivered ',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #487=IFCSIMPLEPROPERTYTEMPLATE('12U2XE0d541wPweiozYwJN',$,'SecondaryAirflowRateRange','possible range of secondary airflow that can be delivered ',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #488=IFCSIMPLEPROPERTYTEMPLATE('1woJMJeHv329qhvlFVXiaX',$,'Weight',$,.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#489=IFCPROPERTYSETTEMPLATE('35cGFdRSXDmhFBwxgb1lVl',$,'Pset_BoilerPHistory','Definition from IAI: Boiler performance history common attributes.\X2\000A\X0\WaterQuality attribute deleted in IFC2x2 Pset Addendum: Use IfcWaterProperties instead. CombustionProductsMaximulLoad and CombustionProductsPartialLoad attributes deleted in IFC2x2 Pset Addendum: Use IfcProductsOfCombustionProperties instead.',$,'IfcPerformanceHistory',(#490,#491,#492,#493,#494,#495,#496,#497,#498)); +#489=IFCPROPERTYSETTEMPLATE('35cGFdRSXDmhFBwxgb1lVl',$,'Pset_BoilerPHistory','Definition from IAI: Boiler performance history common attributes.\X2\000A\X0\WaterQuality attribute deleted in IFC2x2 Pset Addendum: Use IfcWaterProperties instead. CombustionProductsMaximulLoad and CombustionProductsPartialLoad attributes deleted in IFC2x2 Pset Addendum: Use IfcProductsOfCombustionProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#490,#491,#492,#493,#494,#495,#496,#497,#498)); #490=IFCSIMPLEPROPERTYTEMPLATE('0GHTaXfnbECeg6DHEW3Mio',$,'EnergySourceConsumption','Energy consumption.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #491=IFCSIMPLEPROPERTYTEMPLATE('0EMuSbSQH5dPLl4g5fAfJo',$,'OperationalEfficiency','Operational efficiency: boiler output divided by total energy input (electrical and fuel)',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCREAL',$,$,$,$,.READWRITE.); #492=IFCSIMPLEPROPERTYTEMPLATE('2vCygl82zFD8a7eXYAxmi2',$,'CombustionEfficiency','Combustion efficiency under nominal condition',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCREAL',$,$,$,$,.READWRITE.); @@ -503,7 +503,7 @@ DATA; #496=IFCSIMPLEPROPERTYTEMPLATE('2k6MWRdpX4Rfx7YVr0bUwh',$,'Load','Boiler real load',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #497=IFCSIMPLEPROPERTYTEMPLATE('05nnqd4xLA5f0Uq1lYswZ8',$,'PrimaryEnergyConsumption','Boiler primary energy source consumption (i.e., the fuel consumed for changing the thermodynamic state of the fluid).',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #498=IFCSIMPLEPROPERTYTEMPLATE('2CZfqeOyrC78xtCCHwINRP',$,'AuxiliaryEnergyConsumption','Boiler secondary energy source consumption (i.e., the electricity consumed by electrical devices such as fans and pumps).',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); -#499=IFCPROPERTYSETTEMPLATE('04PlLXrMD3Qgjkr1cX5L8S',$,'Pset_BoilerTypeCommon','Definition from IAI: Boiler type common attributes.\X2\000A\X0\SoundLevel attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead. PrimaryEnergySource and AuxiliaryEnergySource attributes deleted in IFC2x2 Pset Addendum: Use IfcEnergyProperties, IfcFuelProperties, etc. instead.',$,'IfcBoilerType',(#500,#501,#503,#504,#505,#506,#507,#508,#509,#510,#511,#512,#513,#514)); +#499=IFCPROPERTYSETTEMPLATE('04PlLXrMD3Qgjkr1cX5L8S',$,'Pset_BoilerTypeCommon','Definition from IAI: Boiler type common attributes.\X2\000A\X0\SoundLevel attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead. PrimaryEnergySource and AuxiliaryEnergySource attributes deleted in IFC2x2 Pset Addendum: Use IfcEnergyProperties, IfcFuelProperties, etc. instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBoilerType',(#500,#501,#503,#504,#505,#506,#507,#508,#509,#510,#511,#512,#513,#514)); #500=IFCSIMPLEPROPERTYTEMPLATE('230rh6_qjFufNzKqMJNMVe',$,'PressureRating','Nominal pressure rating of the boiler as rated by ASME Boiler and Pressure Vessel Code Section IV, Rules for Construction of Heating Boilers, and Section I, Rules for Construction of Power Boilers',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #501=IFCSIMPLEPROPERTYTEMPLATE('1qhGfmRmXEreox1Rp8HDvs',$,'OperatingMode','Identifies the operating mode of the boiler.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#502,$,$,$,.READWRITE.); #502=IFCPROPERTYENUMERATION('PEnum_BoilerOperatingMode',(IFCLABEL('FIXED'),IFCLABEL('TWOSTEP'),IFCLABEL('MODULATING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); @@ -519,34 +519,34 @@ DATA; #512=IFCSIMPLEPROPERTYTEMPLATE('1bUpYJlOPAkBLyRyevYDSp',$,'HeatOutput','Total nominal heat output as listed by the Boiler manufacturer. For water boilers, it is a function of inlet versus outlet temperature. For steam boilers, it is a function of inlet temperature versus steam pressure.',.P_LISTVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #513=IFCSIMPLEPROPERTYTEMPLATE('0XsGVPMR1D$RG_px_REreu',$,'OutletTemperatureRange','Allowable outlet temperature of either the water or the steam.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #514=IFCSIMPLEPROPERTYTEMPLATE('1lFsbDKUP568ZCcaA7fDQQ',$,'NominalEnergyConsumption','Nominal fuel consumption rate required to produce the total boiler heat output.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#515=IFCPROPERTYSETTEMPLATE('0aENstQDTDde3tAM_wjKJg',$,'Pset_BoilerTypeSteam','Definition from IAI: Steam boiler type common attributes.\X2\000A\X0\',$,'IfcBoilerType',(#516)); +#515=IFCPROPERTYSETTEMPLATE('0aENstQDTDde3tAM_wjKJg',$,'Pset_BoilerTypeSteam','Definition from IAI: Steam boiler type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcBoilerType',(#516)); #516=IFCSIMPLEPROPERTYTEMPLATE('3VNVK3JAz6vBGF0z2N27RP',$,'MaximumOutletPressure','Maximum steam outlet pressure.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#517=IFCPROPERTYSETTEMPLATE('2p$YgIeWv12Q5HLaWnyIPj',$,'Pset_ChillerPHistory','Definition from IAI: Chiller performance history attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#518,#519,#520,#521,#522,#523)); +#517=IFCPROPERTYSETTEMPLATE('2p$YgIeWv12Q5HLaWnyIPj',$,'Pset_ChillerPHistory','Definition from IAI: Chiller performance history attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#518,#519,#520,#521,#522,#523)); #518=IFCSIMPLEPROPERTYTEMPLATE('1ISiJDiWrAme7W6X_8zCWy',$,'Capacity','The product of the ideal capacity and the overall volumetric efficiency of the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #519=IFCSIMPLEPROPERTYTEMPLATE('1chkOkVDn0exj$o1g6uqfz',$,'EnergyEfficiencyRatio','Energy efficiency ratio (EER).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #520=IFCSIMPLEPROPERTYTEMPLATE('0lJMB_olf47gK5xDCDe17Y',$,'CoefficientOfPerformance','Coefficient of performance (COP).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #521=IFCSIMPLEPROPERTYTEMPLATE('2_5cJ7KnLD7h3xEJtCi2Vo',$,'CapacityCurve','Chiller cooling capacity is a function of condensing temperature and evaporating temperature, data is in table form, Capacity = f (TempCon, TempEvp), capacity = a1+b1*Tei+c1*Tei^2+d1*Tci+e1*Tci^2+f1*Tei*Tci.',.P_REFERENCEVALUE.,'IfcTimeSeries','IfcReal',$,$,$,$,.READWRITE.); #522=IFCSIMPLEPROPERTYTEMPLATE('2bAf9Q4dX278$UX$88IjFT',$,'CoefficientOfPerformanceCurve','Chiller coefficient of performance (COP) is function of condensing temperature and evaporating temperature, data is in table form, COP= f (TempCon, TempEvp), COP = a2+b2*Tei+c2*Tei^2+d2*Tci+e2*Tci^2+f2*Tei*Tci',.P_REFERENCEVALUE.,'IfcTimeSeries','IfcReal',$,$,$,$,.READWRITE.); #523=IFCSIMPLEPROPERTYTEMPLATE('0up916GpnA6OpDMn7Br$6A',$,'FullLoadRatioCurve','Ratio of actual power to full load power as a quadratic function of part load, at certain condensing and evaporating temperature, FracFullLoadPower = f ( PartLoadRatio).',.P_REFERENCEVALUE.,'IfcTimeSeries','IfcReal',$,$,$,$,.READWRITE.); -#524=IFCPROPERTYSETTEMPLATE('2MaQh6Pf92svRp3_RoSS0S',$,'Pset_ChillerTypeCommon','Definition from IAI: Chiller type common attributes.\X2\000A\X0\',$,'IfcChillerType',(#525,#526,#527,#528,#529,#530)); +#524=IFCPROPERTYSETTEMPLATE('2MaQh6Pf92svRp3_RoSS0S',$,'Pset_ChillerTypeCommon','Definition from IAI: Chiller type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcChillerType',(#525,#526,#527,#528,#529,#530)); #525=IFCSIMPLEPROPERTYTEMPLATE('0qKoaVSxr7Xe5$m3OE8EK0',$,'NominalCapacity','Nominal cooling capacity of chiller at standardized conditions per ARI Standards 550-92, Centrifugal and Rotary Screw Water-Chilling Packages, and ARI Standards 590-92, Positive Displacement Compressor.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #526=IFCSIMPLEPROPERTYTEMPLATE('0fT$9PD057sRKF53a3XkI_',$,'NominalEfficiency','Nominal chiller efficiency under nominal conditions.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #527=IFCSIMPLEPROPERTYTEMPLATE('3HgcArX7XDy9VhpOhNQ0Es',$,'NominalCondensingTemperature','Chiller condensing temperature.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #528=IFCSIMPLEPROPERTYTEMPLATE('3AbuEjE599qxeFl7Hpb$Su',$,'NominalEvaporatingTemperature','Chiller evaporating temperature.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #529=IFCSIMPLEPROPERTYTEMPLATE('3vAldFR0fC2Qz2c2BKDfGB',$,'NominalHeatRejectionRate','Sum of the refrigeration effect and the heat equivalent of the power input to the compressor.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #530=IFCSIMPLEPROPERTYTEMPLATE('33OuPTUKj0Zh$IIC8Vb$E6',$,'NominalPowerConsumption','Nominal total power consumption.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#531=IFCPROPERTYSETTEMPLATE('14BsOhpxrCy9g$UGeYbcgW',$,'Pset_CoilPHistory','Definition from IAI: Coil performance history common attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',$,'IfcPerformanceHistory',(#532,#533,#534,#535)); +#531=IFCPROPERTYSETTEMPLATE('14BsOhpxrCy9g$UGeYbcgW',$,'Pset_CoilPHistory','Definition from IAI: Coil performance history common attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#532,#533,#534,#535)); #532=IFCSIMPLEPROPERTYTEMPLATE('0dR_pF8IP6wQGb69hgBuBo',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #533=IFCSIMPLEPROPERTYTEMPLATE('3P7RSuR$b21RUx4AXX_3la',$,'AirPressureDropCurve','Air pressure drop curve, pressure drop \X2\2013\X0\ flow rate curve, AirPressureDrop = f (AirflowRate).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #534=IFCSIMPLEPROPERTYTEMPLATE('3EyDOxqivBFBkTs2CnLqqj',$,'SoundCurve','Regenerated sound versus air-flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #535=IFCSIMPLEPROPERTYTEMPLATE('2D1G_dep15Q802zoStU_zJ',$,'FaceVelocity','Air velocity through the coil.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCLINEARVELOCITYMEASURE',$,$,$,$,.READWRITE.); -#536=IFCPROPERTYSETTEMPLATE('1Q75P_Tx50LxD1TzK1uDaa',$,'Pset_CoilTypeCommon','Definition from IAI: Coil type common attributes.\X2\000A\X0\',$,'IfcCoilType',(#537,#538,#539,#540,#541)); +#536=IFCPROPERTYSETTEMPLATE('1Q75P_Tx50LxD1TzK1uDaa',$,'Pset_CoilTypeCommon','Definition from IAI: Coil type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcCoilType',(#537,#538,#539,#540,#541)); #537=IFCSIMPLEPROPERTYTEMPLATE('30vCvbRMH3A8GAlsQHurzv',$,'OperationalTemperatureRange','Allowable operational air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #538=IFCSIMPLEPROPERTYTEMPLATE('0mSfumb8zEdeyhgB7NBbU7',$,'AirflowRateRange','Possible range of airflow that can be delivered.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #539=IFCSIMPLEPROPERTYTEMPLATE('2ppvy6YmLF3QPauHyFu3BO',$,'NominalSensibleCapacity','Nominal sensible capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #540=IFCSIMPLEPROPERTYTEMPLATE('3idBba4b9CJhSIHCr$WrT9',$,'NominalLatentCapacity','Nominal latent capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #541=IFCSIMPLEPROPERTYTEMPLATE('1SQDe2BNH2LAksVmyZQGoL',$,'NominalUA','Nominal UA value.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#542=IFCPROPERTYSETTEMPLATE('2a0mSoior1RwD2QsKy5_T0',$,'Pset_CoilTypeHydronic','Definition from IAI: Hydronic coil type attributes.\X2\000A\X0\',$,'IfcCoilType',(#543,#544,#546,#548,#550,#551,#552,#553,#554,#555,#556,#557,#558,#559)); +#542=IFCPROPERTYSETTEMPLATE('2a0mSoior1RwD2QsKy5_T0',$,'Pset_CoilTypeHydronic','Definition from IAI: Hydronic coil type attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcCoilType',(#543,#544,#546,#548,#550,#551,#552,#553,#554,#555,#556,#557,#558,#559)); #543=IFCSIMPLEPROPERTYTEMPLATE('3pCtyfYxH8uPqYAPrPAuJu',$,'FluidPressureRange','Allowable water working pressure range inside the tube',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #544=IFCSIMPLEPROPERTYTEMPLATE('1POv9ZdUX75f95a5iuZbQJ',$,'CoilCoolant','The fluid used for heating or cooling used by the hydronic coil.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#545,$,$,$,.READWRITE.); #545=IFCPROPERTYENUMERATION('PEnum_CoilCoolant',(IFCLABEL('WATER'),IFCLABEL('BRINE'),IFCLABEL('GLYCOL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); @@ -564,7 +564,7 @@ DATA; #557=IFCSIMPLEPROPERTYTEMPLATE('0hUesYp5LD3wxmHHGsyF3g',$,'BypassFactor','Fraction of air that is bypassed by the coil (0-1).',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #558=IFCSIMPLEPROPERTYTEMPLATE('0raJ8lDGr8SPvsGTe5t9kd',$,'SensibleHeatRatio','Air-side sensible heat ratio, or fraction of sensible heat transfer to the total heat transfer.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #559=IFCSIMPLEPROPERTYTEMPLATE('2Iwr9bkR57re9a1_h4X3hE',$,'WetCoilFraction','Fraction of coil surface area that is wet (0-1).',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#560=IFCPROPERTYSETTEMPLATE('24NFwjcmTA3uud4h27Yz4G',$,'Pset_CompressorPHistory','Definition from IAI: Compressor performance history attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#561,#562,#563,#564,#565,#566,#567,#568,#569,#570,#571,#572,#573,#574)); +#560=IFCPROPERTYSETTEMPLATE('24NFwjcmTA3uud4h27Yz4G',$,'Pset_CompressorPHistory','Definition from IAI: Compressor performance history attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#561,#562,#563,#564,#565,#566,#567,#568,#569,#570,#571,#572,#573,#574)); #561=IFCSIMPLEPROPERTYTEMPLATE('0Qy3_E7Xv7U8pSXyObZmG2',$,'CompressorCapacity','The product of the ideal capacity and the overall volumetric efficiency of the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #562=IFCSIMPLEPROPERTYTEMPLATE('3Ksy$Ytor3HRje9KI0dUIa',$,'EnergyEfficiencyRatio','Energy efficiency ratio (EER).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #563=IFCSIMPLEPROPERTYTEMPLATE('0vogKk6db30An17xBGzQIY',$,'CoefficientOfPerformance','Coefficient of performance (COP).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); @@ -579,7 +579,7 @@ DATA; #572=IFCSIMPLEPROPERTYTEMPLATE('0hRsl2p5nA4BywtUnsZuD4',$,'FrictionHeatGain','Friction heat gain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #573=IFCSIMPLEPROPERTYTEMPLATE('0gncbTIg95MxkXqn5LjgIv',$,'CompressorTotalHeatGain','Compressor total heat gain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #574=IFCSIMPLEPROPERTYTEMPLATE('1uxTZg5qr4WeobOzDRjxg$',$,'FullLoadRatioCurve','Ratio of actual power to full load power as a quadratic function of part load, at certain condensing and evaporating temperature, FracFullLoadPower = f ( PartLoadRatio).',.P_LISTVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#575=IFCPROPERTYSETTEMPLATE('1anCtvxXvEGBrJ7XCJ7vUy',$,'Pset_CompressorTypeCommon','Definition from IAI: Compressor type common attributes.\X2\000A\X0\',$,'IfcCompressorType',(#576,#578,#580,#581,#582,#583,#584,#585,#586,#587)); +#575=IFCPROPERTYSETTEMPLATE('1anCtvxXvEGBrJ7XCJ7vUy',$,'Pset_CompressorTypeCommon','Definition from IAI: Compressor type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcCompressorType',(#576,#578,#580,#581,#582,#583,#584,#585,#586,#587)); #576=IFCSIMPLEPROPERTYTEMPLATE('3L4hEQFpnEffhH3LYs4_2L',$,'PowerSource','Type of power driving the compressor',.P_ENUMERATEDVALUE.,'IfcLabel',$,#577,$,$,$,.READWRITE.); #577=IFCPROPERTYENUMERATION('PEnum_CompressorTypePowerSource',(IFCLABEL('MOTORDRIVEN'),IFCLABEL('ENGINEDRIVEN'),IFCLABEL('GASTURBINE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #578=IFCSIMPLEPROPERTYTEMPLATE('3KQ0UuVH9CoAHtPdHOz$Ve',$,'RefrigerantClass','Refrigerant class used by the compressor.\X2\000A\X0\CFC: Chlorofluorocarbons.\X2\000A\X0\HCFC: Hydrochlorofluorocarbons.\X2\000A\X0\HFC: Hydrofluorocarbons.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#579,$,$,$,.READWRITE.); @@ -592,7 +592,7 @@ DATA; #585=IFCSIMPLEPROPERTYTEMPLATE('2ALvHv60H859Q03AIbNdcK',$,'IdealCapacity','Compressor capacity under ideal conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #586=IFCSIMPLEPROPERTYTEMPLATE('0mHwAUYoH4vgrPSBhcFort',$,'IdealShaftPower','Compressor shaft power under ideal conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #587=IFCSIMPLEPROPERTYTEMPLATE('2XRM4Zz1f43Aq1pt4Qt9qC',$,'HasHotGasBypass','Whether or not hot gas bypass is provided for the compressor. TRUE = Yes, FALSE = No.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#588=IFCPROPERTYSETTEMPLATE('1mgzegfcr3kg4H$N1JhZyW',$,'Pset_CondenserPHistory','Definition from IAI: Condenser performance history attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#589,#590,#591,#592,#593,#594,#595,#596,#597,#598,#599)); +#588=IFCPROPERTYSETTEMPLATE('1mgzegfcr3kg4H$N1JhZyW',$,'Pset_CondenserPHistory','Definition from IAI: Condenser performance history attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#589,#590,#591,#592,#593,#594,#595,#596,#597,#598,#599)); #589=IFCSIMPLEPROPERTYTEMPLATE('3nqkpDkWf2JBYftoygznfd',$,'HeatRejectionRate','Sum of the refrigeration effect and the heat equivalent of the power input to the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #590=IFCSIMPLEPROPERTYTEMPLATE('1a$v4pbmnDnxSv4tCEhv9u',$,'ExteriorHeatTransferCoefficient','Exterior heat transfer coefficient associated with exterior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMALTRANSMITTANCEMEASURE',$,$,$,$,.READWRITE.); #591=IFCSIMPLEPROPERTYTEMPLATE('1Oua0Z_cvDrfnSaNnB$ATz',$,'InteriorHeatTransferCoefficient','Interior heat transfer coefficient associated with interior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMALTRANSMITTANCEMEASURE',$,$,$,$,.READWRITE.); @@ -604,7 +604,7 @@ DATA; #597=IFCSIMPLEPROPERTYTEMPLATE('1WG00oE3bCJvgFV9Jg1Fut',$,'CompressorCondenserPressureDrop','Pressure drop between condenser inlet and compressor outlet.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #598=IFCSIMPLEPROPERTYTEMPLATE('2_CkltqcT1rvxDV4qTc6PI',$,'CondenserMeanVoidFraction','Mean void fraction in condenser.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #599=IFCSIMPLEPROPERTYTEMPLATE('1yIRbuzwX5MAEtyjN$8E5t',$,'WaterFoulingResistance','Fouling resistance on water/air side.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#600=IFCPROPERTYSETTEMPLATE('12KmXlq2HDyB725JIgZjry',$,'Pset_CondenserTypeCommon','Definition from IAI: Condenser type common attributes.\X2\000A\X0\',$,'IfcCondenserType',(#601,#603,#604,#605,#606,#607,#608,#609)); +#600=IFCPROPERTYSETTEMPLATE('12KmXlq2HDyB725JIgZjry',$,'Pset_CondenserTypeCommon','Definition from IAI: Condenser type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcCondenserType',(#601,#603,#604,#605,#606,#607,#608,#609)); #601=IFCSIMPLEPROPERTYTEMPLATE('2stHNKe7n6SxIJfnaAtgoy',$,'RefrigerantClass','Refrigerant class used by the condenser.\X2\000A\X0\CFC: Chlorofluorocarbons.\X2\000A\X0\HCFC: Hydrochlorofluorocarbons.\X2\000A\X0\HFC: Hydrofluorocarbons.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#602,$,$,$,.READWRITE.); #602=IFCPROPERTYENUMERATION('PEnum_RefrigerantClass',(IFCLABEL('CFC'),IFCLABEL('HCFC'),IFCLABEL('HFC'),IFCLABEL('HYDROCARBONS'),IFCLABEL('AMMONIA'),IFCLABEL('CO2'),IFCLABEL('H2O'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #603=IFCSIMPLEPROPERTYTEMPLATE('1W9p$nWUH5oe0ods0LAcFq',$,'RefrigerantType','Refrigerant material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); @@ -614,7 +614,7 @@ DATA; #607=IFCSIMPLEPROPERTYTEMPLATE('1WKeNc0kz5FRm6e3KK1H2t',$,'InternalWaterVolume','Internal volume of condenser (water side).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); #608=IFCSIMPLEPROPERTYTEMPLATE('2p03PQWi97IvZqpEFU8LQD',$,'NominalHeatTransferArea','Nominal heat transfer surface area associated with nominal overall heat transfer coefficient.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #609=IFCSIMPLEPROPERTYTEMPLATE('2xAeQ6mtH5ng2D410c167L',$,'NominalHeatTransferCoefficient','Nominal overall heat transfer coefficient associated with nominal heat transfer area.',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#610=IFCPROPERTYSETTEMPLATE('1joRv3VaTExhCv03p96Nvk',$,'Pset_CooledBeamPHistory','Definition from IAI: Common performance history attributes for a cooled beam.\X2\000A\X0\',$,'IfcPerformanceHistory',(#611,#612,#613,#614,#615,#616,#617,#618,#619,#620,#621,#622,#623)); +#610=IFCPROPERTYSETTEMPLATE('1joRv3VaTExhCv03p96Nvk',$,'Pset_CooledBeamPHistory','Definition from IAI: Common performance history attributes for a cooled beam.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#611,#612,#613,#614,#615,#616,#617,#618,#619,#620,#621,#622,#623)); #611=IFCSIMPLEPROPERTYTEMPLATE('2H$flA8rj4yvIxg3x1Lfsd',$,'TotalCoolingCapacity','Total cooling capacity. This includes cooling capacity of beam and cooling capacity of supply air',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #612=IFCSIMPLEPROPERTYTEMPLATE('0RF$q3MbP0CRrZCObcywh$',$,'TotalHeatingCapacity','Total heating capacity. This includes heating capacity of beam and heating capacity of supply air',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #613=IFCSIMPLEPROPERTYTEMPLATE('2QQYHbS4nBvvN8oUV3KrYk',$,'BeamCoolingCapacity','Cooling capacity of beam. This excludes cooling capacity of supply air',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); @@ -628,18 +628,18 @@ DATA; #621=IFCSIMPLEPROPERTYTEMPLATE('2mV08dhrj7$BVptfXb31W2',$,'ReturnWaterTemperatureCooling','Return water temperature in cooling mode',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMODYNAMICTEMPERATUREMEASURE',$,$,$,$,.READWRITE.); #622=IFCSIMPLEPROPERTYTEMPLATE('3dlZ1csTv3mRUM0ohDr8lX',$,'SupplyWaterTemperatureHeating','Supply water temperature in heating mode',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMODYNAMICTEMPERATUREMEASURE',$,$,$,$,.READWRITE.); #623=IFCSIMPLEPROPERTYTEMPLATE('0Mv_mKxaD5fedndr75x0I6',$,'ReturnWaterTemperatureHeating','Return water temperature in heating mode',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMODYNAMICTEMPERATUREMEASURE',$,$,$,$,.READWRITE.); -#624=IFCPROPERTYSETTEMPLATE('1ggYGKGQP55vcmLtKIG64H',$,'Pset_CooledBeamPHistoryActive','Definition from IAI: Performance history attributes for an active cooled beam.\X2\000A\X0\',$,'IfcPerformanceHistory',(#625,#626,#627)); +#624=IFCPROPERTYSETTEMPLATE('1ggYGKGQP55vcmLtKIG64H',$,'Pset_CooledBeamPHistoryActive','Definition from IAI: Performance history attributes for an active cooled beam.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#625,#626,#627)); #625=IFCSIMPLEPROPERTYTEMPLATE('3I29$bAff2RRNsoBhOlT$Z',$,'AirFlowRate','Air flow rate',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #626=IFCSIMPLEPROPERTYTEMPLATE('0rVEeAld903QtOg0UDw1c$',$,'Throw','Distance cooled beam throws the air',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOSITIVELENGTHMEASURE',$,$,$,$,.READWRITE.); #627=IFCSIMPLEPROPERTYTEMPLATE('0ylu8KwZfAmwP8wj7PrXYq',$,'AirPressureDropCurves','Air pressure drop as function of air flow rate',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); -#628=IFCPROPERTYSETTEMPLATE('2klEhr9eP7RwUUw76O8oC0',$,'Pset_CooledBeamTypeActive','Definition from IAI: Active (ventilated) cooled beam common attributes.\X2\000A\X0\',$,'IfcCooledBeamType',(#629,#631,#632,#634)); +#628=IFCPROPERTYSETTEMPLATE('2klEhr9eP7RwUUw76O8oC0',$,'Pset_CooledBeamTypeActive','Definition from IAI: Active (ventilated) cooled beam common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcCooledBeamType',(#629,#631,#632,#634)); #629=IFCSIMPLEPROPERTYTEMPLATE('2ZvIpZT9r3GgEGD70W5qu6',$,'AirFlowConfiguration','Air flow configuration type of cooled beam',.P_ENUMERATEDVALUE.,'IfcLabel',$,#630,$,$,$,.READWRITE.); #630=IFCPROPERTYENUMERATION('PEnum_CooledBeamActiveAirFlowConfigurationType',(IFCLABEL('BIDIRECTIONAL'),IFCLABEL('UNIDIRECTIONALRIGHT'),IFCLABEL('UNIDIRECTIONALLEFT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #631=IFCSIMPLEPROPERTYTEMPLATE('0ZQJRmykDBVQWlMWkhZoKe',$,'AirflowRateRange','Possible range of airflow that can be delivered ',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #632=IFCSIMPLEPROPERTYTEMPLATE('3nymMosOP3_fafSosQUuWf',$,'SupplyAirConnectionType','The manner in which the pipe connection is made to the cooled beam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#633,$,$,$,.READWRITE.); #633=IFCPROPERTYENUMERATION('PEnum_CooledBeamSupplyAirConnectionType',(IFCLABEL('STRAIGHT'),IFCLABEL('RIGHT'),IFCLABEL('LEFT'),IFCLABEL('TOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #634=IFCSIMPLEPROPERTYTEMPLATE('20BJrrFD5BNw1REZEXtjbW',$,'ConnectionSize','Duct connection diameter',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#635=IFCPROPERTYSETTEMPLATE('0i0L$0oXH5mBeEb5BTUFmD',$,'Pset_CooledBeamTypeCommon','Definition from IAI: Cooled beam common attributes.\X2\000A\X0\SoundLevel and SoundAttenuation attributes deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',$,'IfcCooledBeamType',(#636,#637,#639,#640,#641,#642,#643,#644,#645,#646,#647,#648,#649,#650,#651,#652,#654,#656,#657,#658,#659,#660)); +#635=IFCPROPERTYSETTEMPLATE('0i0L$0oXH5mBeEb5BTUFmD',$,'Pset_CooledBeamTypeCommon','Definition from IAI: Cooled beam common attributes.\X2\000A\X0\SoundLevel and SoundAttenuation attributes deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCooledBeamType',(#636,#637,#639,#640,#641,#642,#643,#644,#645,#646,#647,#648,#649,#650,#651,#652,#654,#656,#657,#658,#659,#660)); #636=IFCSIMPLEPROPERTYTEMPLATE('1sDl8PxzT67fxD7jgP3$k$',$,'IsFreeHanging','Is it free hanging type (not mounted in a false ceiling)?',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #637=IFCSIMPLEPROPERTYTEMPLATE('0NeLmWJ4P7zv6$Ls$IeiPR',$,'WaterFlowControlSystemType','Factory fitted waterflow control system',.P_ENUMERATEDVALUE.,'IfcLabel',$,#638,$,$,$,.READWRITE.); #638=IFCPROPERTYENUMERATION('PEnum_CooledBeamWaterFlowControlSystemType',(IFCLABEL('NONE'),IFCLABEL('ONOFFVALVE'),IFCLABEL('2WAYVALVE'),IFCLABEL('3WAYVALVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); @@ -665,13 +665,13 @@ DATA; #658=IFCSIMPLEPROPERTYTEMPLATE('16FZtiDY1AIeLxQ88K8YwC',$,'CoilLength','Length of coil',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #659=IFCSIMPLEPROPERTYTEMPLATE('1XVKX8Jv97Mx98Aso8GH7f',$,'CoilWidth','Width of coil',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #660=IFCSIMPLEPROPERTYTEMPLATE('11m$TelPr83ARTOBuNpjgm',$,'ConnectionSize','Pipe connection diameter',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#661=IFCPROPERTYSETTEMPLATE('1tt4BInx1ERO_o8YAWbaFI',$,'Pset_CoolingTowerPHistory','Definition from IAI: Cooling tower performance history attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#662,#663,#664,#665,#666)); +#661=IFCPROPERTYSETTEMPLATE('1tt4BInx1ERO_o8YAWbaFI',$,'Pset_CoolingTowerPHistory','Definition from IAI: Cooling tower performance history attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#662,#663,#664,#665,#666)); #662=IFCSIMPLEPROPERTYTEMPLATE('0aTtarqCv6F8ECnGiKmTnV',$,'Capacity','Cooling tower capacity in terms of heat transfer rate of the cooling tower between air stream and water stream.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #663=IFCSIMPLEPROPERTYTEMPLATE('2h2znE3uz0ZBGwUg$tLnRY',$,'HeatTransferCoefficient','Heat transfer coefficient-area product.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #664=IFCSIMPLEPROPERTYTEMPLATE('2R$vGhkyH6K98HBdm$5K$2',$,'SumpHeaterPower','Electrical heat power of sump heater.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #665=IFCSIMPLEPROPERTYTEMPLATE('2A_iNPdPrDR9jox6F3zyzD',$,'UACurve','UA value as a function of fan speed at certain water flow rate, UA = f ( fan speed).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #666=IFCSIMPLEPROPERTYTEMPLATE('2ed7CPH4fD7hjnW5MdxkcK',$,'Performance','Water temperature change as a function of wet-bulb temperature, water entering temperature, water flow rate, air flow rate, Tdiff = f ( Twet-bulb, Twater,in, mwater, mair).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#667=IFCPROPERTYSETTEMPLATE('1z6T3fRDH9Cguk23smM8rj',$,'Pset_CoolingTowerTypeCommon','Definition from IAI: Cooling tower type common attributes.\X2\000A\X0\WaterRequirement attribute unit type modified in IFC2x2 Pset Addendum.',$,'IfcCoolingTowerType',(#668,#669,#671,#673,#675,#677,#679,#680,#681,#682,#683,#684,#685,#686,#687,#688)); +#667=IFCPROPERTYSETTEMPLATE('1z6T3fRDH9Cguk23smM8rj',$,'Pset_CoolingTowerTypeCommon','Definition from IAI: Cooling tower type common attributes.\X2\000A\X0\WaterRequirement attribute unit type modified in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCoolingTowerType',(#668,#669,#671,#673,#675,#677,#679,#680,#681,#682,#683,#684,#685,#686,#687,#688)); #668=IFCSIMPLEPROPERTYTEMPLATE('0wAeY4SOrDveyuYsDMHrSL',$,'NominalCapacity','Nominal cooling tower capacity in terms of heat transfer rate of the cooling tower between air stream and water stream at nominal conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #669=IFCSIMPLEPROPERTYTEMPLATE('1GGMohL7bCrx9jpMT6sl1p',$,'CircuitType','OpenCircuit: Exposes water directly to the cooling atmosphere.\X2\000A\X0\CloseCircuit: The fluid is separated from the atmosphere by a heat exchanger.\X2\000A\X0\Wet: The air stream or the heat exchange surface is evaporatively cooled.\X2\000A\X0\Dry: No evaporation into the air stream.\X2\000A\X0\DryWet: A combination of a dry tower and a wet tower.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#670,$,$,$,.READWRITE.); #670=IFCPROPERTYENUMERATION('PEnum_CoolingTowerCircuitType',(IFCLABEL('OPENCIRCUIT'),IFCLABEL('CLOSEDCIRCUITWET'),IFCLABEL('CLOSEDCIRCUITDRY'),IFCLABEL('CLOSEDCIRCUITDRYWET'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); @@ -693,14 +693,14 @@ DATA; #686=IFCSIMPLEPROPERTYTEMPLATE('18g4tEWWPDQeVoKc4pQlna',$,'Weight','Weight of cooling tower.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); #687=IFCSIMPLEPROPERTYTEMPLATE('2kavt4TnLCauUEI80oDYqe',$,'AmbientDesignDryBulbTemperature','Ambient design dry bulb temperature used for selecting the cooling tower. ',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #688=IFCSIMPLEPROPERTYTEMPLATE('2759v34qzCKPbCN1I0ymgd',$,'AmbientDesignWetBulbTemperature','Ambient design wet bulb temperature used for selecting the cooling tower. ',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#689=IFCPROPERTYSETTEMPLATE('3ehN5glkn2TebrAO1w1Rza',$,'Pset_DamperPHistory','Definition from IAI: Damper performance history attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#690,#691,#692,#693,#694,#695)); +#689=IFCPROPERTYSETTEMPLATE('3ehN5glkn2TebrAO1w1Rza',$,'Pset_DamperPHistory','Definition from IAI: Damper performance history attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#690,#691,#692,#693,#694,#695)); #690=IFCSIMPLEPROPERTYTEMPLATE('0Mrsz35pHEQ9ncr1dTBOFW',$,'AirFlowRate','Air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #691=IFCSIMPLEPROPERTYTEMPLATE('0MpBQbls1FjRdlclvBQAe$',$,'Leakage','Air leakage rate.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #692=IFCSIMPLEPROPERTYTEMPLATE('0LgLzdllDFW9zUVP0hG2bu',$,'PressureDrop','Pressure drop.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #693=IFCSIMPLEPROPERTYTEMPLATE('1WDWT204r7kw4Ws3FZKgOd',$,'BladePositionAngle','Blade position angle; angle between the blade and flow direction ( 0 - 90).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #694=IFCSIMPLEPROPERTYTEMPLATE('1BBzaOK$bBbPAV7NSHhgok',$,'DamperPosition','Damper position (0-1); damper position ( 0=closed=90deg position angle, 1=open=0deg position angle.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #695=IFCSIMPLEPROPERTYTEMPLATE('2d7uLvkyzCRP$v2HfHgCm7',$,'PressureLossCoefficient','Pressure loss coefficient.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#696=IFCPROPERTYSETTEMPLATE('3IjwQeOLX9HwzMMiZgYMLz',$,'Pset_DamperTypeCommon','Definition from IAI: Damper type common attributes.\X2\000A\X0\',$,'IfcDamperType',(#697,#699,#701,#702,#703,#704,#706,#708,#710,#711,#712,#713,#714,#715,#716,#717,#718,#719,#720,#721,#722,#723,#724,#725,#726,#727)); +#696=IFCPROPERTYSETTEMPLATE('3IjwQeOLX9HwzMMiZgYMLz',$,'Pset_DamperTypeCommon','Definition from IAI: Damper type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamperType',(#697,#699,#701,#702,#703,#704,#706,#708,#710,#711,#712,#713,#714,#715,#716,#717,#718,#719,#720,#721,#722,#723,#724,#725,#726,#727)); #697=IFCSIMPLEPROPERTYTEMPLATE('18QbGSj95As87hoOKgahNd',$,'Operation','The operational mechanism for the damper operation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#698,$,$,$,.READWRITE.); #698=IFCPROPERTYENUMERATION('PEnum_DamperOperation',(IFCLABEL('AUTOMATIC'),IFCLABEL('MANUAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #699=IFCSIMPLEPROPERTYTEMPLATE('1oCnZwIkn09xNfJ9e5EgAY',$,'Orientation','The intended orientation for the damper as specified by the manufacturer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#700,$,$,$,.READWRITE.); @@ -732,24 +732,24 @@ DATA; #725=IFCSIMPLEPROPERTYTEMPLATE('3Xd8pypB5C7Om6JDbysdAk',$,'FrameMaterial','The material from which the damper frame is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #726=IFCSIMPLEPROPERTYTEMPLATE('2p07K$DQH7jhI8oaLzFVM2',$,'FrameThickness','The thickness of the damper frame material.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #727=IFCSIMPLEPROPERTYTEMPLATE('2vGb$6GtXD0uMbr8ec7jnK',$,'CloseOffRating','Close off rating. ',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#728=IFCPROPERTYSETTEMPLATE('2Yg9e0jJrDTATL1btKJyMA',$,'Pset_DamperTypeControlDamper','Definition from IAI: Control damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeControl to Pset_DamperTypeControlDamper in IFC2x2 Pset Addendum.\X2\000A\X0\',$,'IfcDamperType',(#729,#730)); +#728=IFCPROPERTYSETTEMPLATE('2Yg9e0jJrDTATL1btKJyMA',$,'Pset_DamperTypeControlDamper','Definition from IAI: Control damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeControl to Pset_DamperTypeControlDamper in IFC2x2 Pset Addendum.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamperType',(#729,#730)); #729=IFCSIMPLEPROPERTYTEMPLATE('1I4Ttr0x169B912OdJQVgL',$,'TorqueRange','Torque range: minimum operational torque to maximum allowable torque.',.P_BOUNDEDVALUE.,'IfcTorqueMeasure',$,$,$,$,$,.READWRITE.); #730=IFCSIMPLEPROPERTYTEMPLATE('0tcmpEoIL9zPUCgpIZymzH',$,'ControlDamperOperation','The inherent characteristic of the control damper operation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#731,$,$,$,.READWRITE.); #731=IFCPROPERTYENUMERATION('PEnum_ControlDamperOperation',(IFCLABEL('LINEAR'),IFCLABEL('EXPONENTIAL'),IFCLABEL('IFCPOLYLINE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#732=IFCPROPERTYSETTEMPLATE('3Iir$IGvDFrPi9gdUl6Nub',$,'Pset_DamperTypeFireDamper','Definition from IAI: Fire damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeFire to Pset_DamperTypeFireDamper in IFC2x2 Pset Addendum.',$,'IfcDamperType',(#733,#735,#737,#738)); +#732=IFCPROPERTYSETTEMPLATE('3Iir$IGvDFrPi9gdUl6Nub',$,'Pset_DamperTypeFireDamper','Definition from IAI: Fire damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeFire to Pset_DamperTypeFireDamper in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamperType',(#733,#735,#737,#738)); #733=IFCSIMPLEPROPERTYTEMPLATE('3g_ALQc9jADPgJr99VlouG',$,'ActuationType','Enumeration that identifies the different types of dampers ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#734,$,$,$,.READWRITE.); #734=IFCPROPERTYENUMERATION('PEnum_FireDamperActuationType',(IFCLABEL('GRAVITY'),IFCLABEL('SPRING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #735=IFCSIMPLEPROPERTYTEMPLATE('1g7FXP_J13T9pWzgoIimf$',$,'ClosureRatingEnum','Enumeration that identifies the closure rating for the damper ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#736,$,$,$,.READWRITE.); #736=IFCPROPERTYENUMERATION('PEnum_FireDamperClosureRating',(IFCLABEL('DYNAMIC'),IFCLABEL('STATIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #737=IFCSIMPLEPROPERTYTEMPLATE('2kXDAv6kv5Hh4EXwQVEHRV',$,'FireResistanceRating','Measure of the fire resistance rating in hours (e.g., 1.5 hours, 2 hours, etc.). ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #738=IFCSIMPLEPROPERTYTEMPLATE('1UJ0RKTNf66OvZyVkUklIT',$,'FusibleLinkTemperature','The temperature that the fusible link melts ',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#739=IFCPROPERTYSETTEMPLATE('3Vh0feZDj0rglUPdck26qq',$,'Pset_DamperTypeFireSmokeDamper','Definition from IAI: Combination Fire and Smoke damper type attributes.\X2\000A\X0\New Pset in IFC2x2 Pset Addendum.',$,'IfcDamperType',(#740)); +#739=IFCPROPERTYSETTEMPLATE('3Vh0feZDj0rglUPdck26qq',$,'Pset_DamperTypeFireSmokeDamper','Definition from IAI: Combination Fire and Smoke damper type attributes.\X2\000A\X0\New Pset in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamperType',(#740)); #740=IFCSIMPLEPROPERTYTEMPLATE('2$HK237zbEze49MDa9olCD',$,'ControlType','The type of control used to operate the damper (e.g., Open/Closed Indicator, Resetable Temperature Sensor, Temperature Override, etc.) ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#741=IFCPROPERTYSETTEMPLATE('2t1kjUaCn7mgHNcDJjyAd9',$,'Pset_DamperTypeSmokeDamper','Definition from IAI: Smoke damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeSmoke to Pset_DamperTypeSmokeDamper in IFC2x2 Pset Addendum.',$,'IfcDamperType',(#742)); +#741=IFCPROPERTYSETTEMPLATE('2t1kjUaCn7mgHNcDJjyAd9',$,'Pset_DamperTypeSmokeDamper','Definition from IAI: Smoke damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeSmoke to Pset_DamperTypeSmokeDamper in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamperType',(#742)); #742=IFCSIMPLEPROPERTYTEMPLATE('0ZrMRFYCvBDxZkb5C1U2RF',$,'ControlType','The type of control used to operate the damper (e.g., Open/Closed Indicator, Resetable Temperature Sensor, Temperature Override, etc.) ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#743=IFCPROPERTYSETTEMPLATE('1usmkdsG98PvAhgXg_3ej8',$,'Pset_DuctConnection','Definition from IAI: This property set is used to define the various types of duct connections. It is applied to occurrences of duct segments and fittings.\X2\000A\X0\',$,'IfcDistributionElement',(#744)); +#743=IFCPROPERTYSETTEMPLATE('1usmkdsG98PvAhgXg_3ej8',$,'Pset_DuctConnection','Definition from IAI: This property set is used to define the various types of duct connections. It is applied to occurrences of duct segments and fittings.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionElement',(#744)); #744=IFCSIMPLEPROPERTYTEMPLATE('3lLwXJUyf8aeaPOMvLmpA$',$,'ConnectionType','The connection type between duct segments or fittings and other segments or fittings. If the list contains only one value, then this connection type value applies to all ports. For more than one value in the list, the connection type value applies to the port that corresponds to the list index.The following suggested items should be utilized whenever possible for correlation with port enumerations:\X2\000A\X0\ANGLE: Angle. \X2\000A\X0\BEADEDSLEEVE: Beaded Sleeve. \X2\000A\X0\BRAZED: Brazed. \X2\000A\X0\COMPRESSION: Compression. \X2\000A\X0\CRIMP: Crimp. \X2\000A\X0\DRAWBAND: Drawband. \X2\000A\X0\DRIVESLIP: Drive slip. \X2\000A\X0\FLANGED: Flanged. \X2\000A\X0\OUTSIDESLEEVE: Outside Sleeve. \X2\000A\X0\SLIPON: Slipon. \X2\000A\X0\SOLDERED: Soldered. \X2\000A\X0\SSLIP: S-Slip. \X2\000A\X0\STANDINGSEAM: Standing seam. \X2\000A\X0\SWEDGE: Swedge. \X2\000A\X0\WELDED: Welded. \X2\000A\X0\NONE: No connection type.\X2\000A\X0\NOTDEFINED: Undefined connection type. ',.P_LISTVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#745=IFCPROPERTYSETTEMPLATE('3GClOYahXBdRhgxZo5duM4',$,'Pset_DuctDesignCriteria','Definition from IAI: This property set is used to define the general characteristics of the duct design parameters. This property set is typically attached to an instance of an IfcSystem, however, it may also be attached to individual elements within a duct distribution system where individual design parameters overrule those of the system.\X2\000A\X0\HISTORY: New property set in IFC Release 2.0.\X2\000A\X0\',$,'IfcSystem',(#746,#747,#749,#750,#751,#752,#753,#754,#755,#756,#757)); +#745=IFCPROPERTYSETTEMPLATE('3GClOYahXBdRhgxZo5duM4',$,'Pset_DuctDesignCriteria','Definition from IAI: This property set is used to define the general characteristics of the duct design parameters. This property set is typically attached to an instance of an IfcSystem, however, it may also be attached to individual elements within a duct distribution system where individual design parameters overrule those of the system.\X2\000A\X0\HISTORY: New property set in IFC Release 2.0.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcSystem',(#746,#747,#749,#750,#751,#752,#753,#754,#755,#756,#757)); #746=IFCSIMPLEPROPERTYTEMPLATE('2m1Xi6_jTB5ADfyQMthU2h',$,'DesignName','A name for the design values ',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #747=IFCSIMPLEPROPERTYTEMPLATE('2O8yERf95CGOJdDSEjEWP1',$,'DuctSizingMethod','Enumeration that identifies the methodology to be used to size system components ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#748,$,$,$,.READWRITE.); #748=IFCPROPERTYENUMERATION('PEnum_DuctSizingMethod',(IFCLABEL('CONSTANTFRICTION'),IFCLABEL('CONSTANTPRESSURE'),IFCLABEL('STATICREGAIN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); @@ -762,11 +762,11 @@ DATA; #755=IFCSIMPLEPROPERTYTEMPLATE('3EOLK3O6fADfvKIfpIKGvG',$,'AspectRatio','The default aspect ratio ',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #756=IFCSIMPLEPROPERTYTEMPLATE('2DxYV9CKj86xN0OVIo8UIM',$,'MinimumHeight','The minimum duct height for rectangular, oval or round duct ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #757=IFCSIMPLEPROPERTYTEMPLATE('04$NpAFbb5Jvd1$ss0dLqo',$,'MinimumWidth','The minimum duct width for oval or rectangular duct ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#758=IFCPROPERTYSETTEMPLATE('3h5qdtcyr4rRRxm2dlIB14',$,'Pset_DuctFittingPHistory','Definition from IAI: Duct fitting performance history common attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#759,#760,#761)); +#758=IFCPROPERTYSETTEMPLATE('3h5qdtcyr4rRRxm2dlIB14',$,'Pset_DuctFittingPHistory','Definition from IAI: Duct fitting performance history common attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#759,#760,#761)); #759=IFCSIMPLEPROPERTYTEMPLATE('2Q3oP54vHD_hjS3Ny3EEaR',$,'LossCoefficient','Dimensionless loss coefficient used for calculating fluid resistance representing the ratio of total pressure loss to velocity pressure at a referenced cross-section.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCREAL',$,$,$,$,.READWRITE.); #760=IFCSIMPLEPROPERTYTEMPLATE('2Q$ykuAIzFpOqzalIuZIgM',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #761=IFCSIMPLEPROPERTYTEMPLATE('140tTc98rB8AiWuA6ai5Lh',$,'AirFlowLeakage','Volumetric leakage flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); -#762=IFCPROPERTYSETTEMPLATE('2_nz5MO5592RNFnJ2Odluq',$,'Pset_DuctFittingTypeCommon','Definition from IAI: Duct fitting type common attributes.\X2\000A\X0\',$,'IfcDuctFittingType',(#763,#764,#765,#766,#767,#768,#769,#770,#771,#772)); +#762=IFCPROPERTYSETTEMPLATE('2_nz5MO5592RNFnJ2Odluq',$,'Pset_DuctFittingTypeCommon','Definition from IAI: Duct fitting type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcDuctFittingType',(#763,#764,#765,#766,#767,#768,#769,#770,#771,#772)); #763=IFCSIMPLEPROPERTYTEMPLATE('0_lXlTNaD8v9vRrfIfLbM8',$,'SubType','Subtype of fitting (I.e., 5-gore, pleated, stamped, etc.) ',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #764=IFCSIMPLEPROPERTYTEMPLATE('2gxHo$w6D8avhoLRvYZTko',$,'Material','The duct fitting material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #765=IFCSIMPLEPROPERTYTEMPLATE('0rdIfSjfHEzOOb5zjo2QSa',$,'MaterialThickness','The thickness of the duct fitting material.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -777,12 +777,12 @@ DATA; #770=IFCSIMPLEPROPERTYTEMPLATE('33AgJM$_n7OuL0JW1cUid4',$,'NominalDiameterOrWidth','The nominal diameter or width of the duct fitting. If the list contains only one value, then this nominal diameter or width applies to all ports. For more than value in the list, the nominal diameter or width value applies to the port that corresponds to the list index.',.P_LISTVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #771=IFCSIMPLEPROPERTYTEMPLATE('2QAqAHO$97AuX2h5kW9oqF',$,'NominalHeight','The nominal height of the duct fitting. Refer to NominalDiameterOrWidth for comments about interpretation of multiple items in the list.',.P_LISTVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #772=IFCSIMPLEPROPERTYTEMPLATE('3$MxM6McHCevTX3I4xTf3w',$,'EndStyleTreatment','The end-style treatment of the duct fitting manufactured. If the list contains only one value, then this end-style applies to all ports. For more than one value in the list, the end-style value applies to the port that corresponds to the list index.The following suggested items should be utilized whenever possible for correlation with port enumerations:\X2\000A\X0\ANGLE: Angle. \X2\000A\X0\BEADEDSLEEVE: Beaded Sleeve. \X2\000A\X0\BRAZED: Brazed. \X2\000A\X0\COMPRESSION: Compression. \X2\000A\X0\CRIMP: Crimp. \X2\000A\X0\DRAWBAND: Drawband. \X2\000A\X0\DRIVESLIP: Drive slip. \X2\000A\X0\FLANGED: Flanged. \X2\000A\X0\OUTSIDESLEEVE: Outside Sleeve. \X2\000A\X0\SLIPON: Slipon. \X2\000A\X0\SOLDERED: Soldered. \X2\000A\X0\SSLIP: S-Slip. \X2\000A\X0\STANDINGSEAM: Standing seam. \X2\000A\X0\SWEDGE: Swedge. \X2\000A\X0\WELDED: Welded. \X2\000A\X0\NONE: No end-style treatment has been applied.\X2\000A\X0\NOTDEFINED: Undefined end-style type. ',.P_LISTVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#773=IFCPROPERTYSETTEMPLATE('2uxHmHfTT0uRyKASKx9IAA',$,'Pset_DuctSegmentPHistory','Definition from IAI: Duct segment performance history common attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#774,#775,#776,#777)); +#773=IFCPROPERTYSETTEMPLATE('2uxHmHfTT0uRyKASKx9IAA',$,'Pset_DuctSegmentPHistory','Definition from IAI: Duct segment performance history common attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#774,#775,#776,#777)); #774=IFCSIMPLEPROPERTYTEMPLATE('0gxPnl2gP8mBloouqZckgB',$,'LossCoefficient','Dimensionless loss coefficient used for calculating fluid resistance representing the ratio of total pressure loss to velocity pressure at a referenced cross-section.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCREAL',$,$,$,$,.READWRITE.); #775=IFCSIMPLEPROPERTYTEMPLATE('1HOPale912pf4uYNTqzxjQ',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #776=IFCSIMPLEPROPERTYTEMPLATE('0rrQ8md4zCc96azziajk2s',$,'LeakageCurve','Leakage per unit length curve versus working pressure. If a scalar is expressed then it represents LeakageClass which is flowrate per unit area at a specified pressure rating (e.g., ASHRAE Fundamentals 2001 34.16.).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #777=IFCSIMPLEPROPERTYTEMPLATE('1sVlBObK1DdejFQ0MQpwTs',$,'FluidFlowLeakage','Volumetric leakage flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); -#778=IFCPROPERTYSETTEMPLATE('2pw6OYf4L3jgfw7DiZXYqH',$,'Pset_DuctSegmentTypeCommon','Definition from IAI: Duct segment type common attributes.\X2\000A\X0\',$,'IfcDuctSegmentType',(#779,#781,#782,#783,#784,#785,#786,#787,#788,#789,#790,#791,#792,#793)); +#778=IFCPROPERTYSETTEMPLATE('2pw6OYf4L3jgfw7DiZXYqH',$,'Pset_DuctSegmentTypeCommon','Definition from IAI: Duct segment type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcDuctSegmentType',(#779,#781,#782,#783,#784,#785,#786,#787,#788,#789,#790,#791,#792,#793)); #779=IFCSIMPLEPROPERTYTEMPLATE('3KWFcrPGn6kPyKxnTSa5DW',$,'Shape','Cross sectional shape. Note that this shape is uniform throughout the length of the segment. For nonuniform shapes, a transition fitting should be used instead.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#780,$,$,$,.READWRITE.); #780=IFCPROPERTYENUMERATION('PEnum_DuctSegmentShape',(IFCLABEL('FLATOVAL'),IFCLABEL('RECTANGULAR'),IFCLABEL('ROUND'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #781=IFCSIMPLEPROPERTYTEMPLATE('31ur6qbODD_OryA5GUiVUR',$,'Material','The duct segment material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); @@ -798,10 +798,10 @@ DATA; #791=IFCSIMPLEPROPERTYTEMPLATE('3TOoEb7JXDrgmTgwxTbjPS',$,'EndStyleTreatment','The end-style treatment of the duct segment manufactured. If the list contains only one value, then this end-style applies to all ports. For more than one value in the list, the end-style value applies to the port that corresponds to the list index.The following suggested items should be utilized whenever possible for correlation with port enumerations:\X2\000A\X0\ANGLE: Angle. \X2\000A\X0\BEADEDSLEEVE: Beaded Sleeve. \X2\000A\X0\BRAZED: Brazed. \X2\000A\X0\COMPRESSION: Compression. \X2\000A\X0\CRIMP: Crimp. \X2\000A\X0\DRAWBAND: Drawband. \X2\000A\X0\DRIVESLIP: Drive slip. \X2\000A\X0\FLANGED: Flanged. \X2\000A\X0\OUTSIDESLEEVE: Outside Sleeve. \X2\000A\X0\SLIPON: Slipon. \X2\000A\X0\SOLDERED: Soldered. \X2\000A\X0\SSLIP: S-Slip. \X2\000A\X0\STANDINGSEAM: Standing seam. \X2\000A\X0\SWEDGE: Swedge. \X2\000A\X0\WELDED: Welded. \X2\000A\X0\NONE: No end-style treatment has been applied.\X2\000A\X0\NOTDEFINED: Undefined end-style type. ',.P_LISTVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #792=IFCSIMPLEPROPERTYTEMPLATE('1rp6VdAln2yA8yNMZN2eKo',$,'Reinforcement','The type of reinforcement, if any, used for the duct segment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #793=IFCSIMPLEPROPERTYTEMPLATE('0shVNa2S94WhiBe3F00LU4',$,'ReinforcementSpacing','The spacing between reinforcing elements.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#794=IFCPROPERTYSETTEMPLATE('0ybyLDRMLFmf2m94kJaoBC',$,'Pset_DuctSilencerPHistory','Definition from IAI: Duct silencer performance history common attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#795,#796)); +#794=IFCPROPERTYSETTEMPLATE('0ybyLDRMLFmf2m94kJaoBC',$,'Pset_DuctSilencerPHistory','Definition from IAI: Duct silencer performance history common attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#795,#796)); #795=IFCSIMPLEPROPERTYTEMPLATE('1va32ixvf45OxrRi39d6bY',$,'AirFlowRate','Volumetric air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #796=IFCSIMPLEPROPERTYTEMPLATE('3BpBwWCsXFieduCKHzJFP0',$,'AirPressureDropCurve','Air pressure drop as a function of air flow rate.',.P_LISTVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#797=IFCPROPERTYSETTEMPLATE('2$ob6SuhvE5xUoVcmeAgtL',$,'Pset_DuctSilencerTypeCommon','Definition from IAI: Duct silencer type common attributes.\X2\000A\X0\InsertionLoss and RegeneratedSound attributes deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',$,'IfcDuctSilencerType',(#798,#800,#801,#802,#803,#804,#805,#806)); +#797=IFCPROPERTYSETTEMPLATE('2$ob6SuhvE5xUoVcmeAgtL',$,'Pset_DuctSilencerTypeCommon','Definition from IAI: Duct silencer type common attributes.\X2\000A\X0\InsertionLoss and RegeneratedSound attributes deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDuctSilencerType',(#798,#800,#801,#802,#803,#804,#805,#806)); #798=IFCSIMPLEPROPERTYTEMPLATE('2nhK3QK_T1G9wMFIUya8T2',$,'Shape','Cross sectional shape.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#799,$,$,$,.READWRITE.); #799=IFCPROPERTYENUMERATION('PEnum_DuctSilencerShape',(IFCLABEL('FLATOVAL'),IFCLABEL('RECTANGULAR'),IFCLABEL('ROUND'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #800=IFCSIMPLEPROPERTYTEMPLATE('2RMuZVE$vCdPULeReuFpJR',$,'HydraulicDiameter','Hydraulic diameter',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -811,23 +811,23 @@ DATA; #804=IFCSIMPLEPROPERTYTEMPLATE('3AHUhjmR16CAJ4ALDM_bQU',$,'WorkingPressureRange','Allowable minimum and maximum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #805=IFCSIMPLEPROPERTYTEMPLATE('1OBzoHJTPCSgxCaBKK3O7Y',$,'TemperatureRange','Allowable minimum and maximum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #806=IFCSIMPLEPROPERTYTEMPLATE('2smCqLwSDDu9fTo1nkT0Gl',$,'HasExteriorInsulation','TRUE if the silencer has exterior insulation. FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#807=IFCPROPERTYSETTEMPLATE('1iv991o3z2gQfnTFlEXPZf',$,'Pset_EnergyConsumptionPHistoryElectricity','Definition from IAI: Measured electrical energy consumption properties.',$,'IfcPerformanceHistory',(#808,#809,#810,#811,#812,#813)); +#807=IFCPROPERTYSETTEMPLATE('1iv991o3z2gQfnTFlEXPZf',$,'Pset_EnergyConsumptionPHistoryElectricity','Definition from IAI: Measured electrical energy consumption properties.',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#808,#809,#810,#811,#812,#813)); #808=IFCSIMPLEPROPERTYTEMPLATE('29yes6iK91fuVkrADcacDY',$,'Voltage','Operating voltage.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCELECTRICVOLTAGEMEASURE',$,$,$,$,.READWRITE.); #809=IFCSIMPLEPROPERTYTEMPLATE('3C5oRVIsf4DQsmcyKxDX6v',$,'RealPower','Real power.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #810=IFCSIMPLEPROPERTYTEMPLATE('0bmXisy6v32etjj1mpQ2iZ',$,'ReactivePower','Reactive power.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #811=IFCSIMPLEPROPERTYTEMPLATE('22jzApVPjD2gilzgVyP84c',$,'ApparentPower','Apparent power.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #812=IFCSIMPLEPROPERTYTEMPLATE('0vGaIrAVnDiv6dmhwPIfBY',$,'PowerFactor','Power factor.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCRATIOMEASURE',$,$,$,$,.READWRITE.); #813=IFCSIMPLEPROPERTYTEMPLATE('2gGXNTsK9AHwGEqj849Pt1',$,'Current','Current.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCELECTRICCURRENTMEASURE',$,$,$,$,.READWRITE.); -#814=IFCPROPERTYSETTEMPLATE('18ypnK3LXE6POPO7709FmP',$,'Pset_EnergyConsumptionPHistoryFuel','Definition from IAI: Measured fuel energy consumption properties.',$,'IfcPerformanceHistory',(#815,#816,#817)); +#814=IFCPROPERTYSETTEMPLATE('18ypnK3LXE6POPO7709FmP',$,'Pset_EnergyConsumptionPHistoryFuel','Definition from IAI: Measured fuel energy consumption properties.',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#815,#816,#817)); #815=IFCSIMPLEPROPERTYTEMPLATE('3lCr513_D3pQXOa2Ni35o4',$,'Temperature','The temperature of the fuel.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMODYNAMICTEMPERATUREMEASURE',$,$,$,$,.READWRITE.); #816=IFCSIMPLEPROPERTYTEMPLATE('1mJ4GGfbrBsuHE2A3nb_yE',$,'Pressure','The pressure of the fuel.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #817=IFCSIMPLEPROPERTYTEMPLATE('38IgHkuCrCrPZ9G8giHvGN',$,'Flowrate','The flowrate of the fuel.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCMASSFLOWRATEMEASURE',$,$,$,$,.READWRITE.); -#818=IFCPROPERTYSETTEMPLATE('0F0GR_b411phLmCYBlUv$g',$,'Pset_EnergyConsumptionPHistorySteam','Definition from IAI: Measured steam energy consumption properties.',$,'IfcPerformanceHistory',(#819,#820,#821,#822)); +#818=IFCPROPERTYSETTEMPLATE('0F0GR_b411phLmCYBlUv$g',$,'Pset_EnergyConsumptionPHistorySteam','Definition from IAI: Measured steam energy consumption properties.',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#819,#820,#821,#822)); #819=IFCSIMPLEPROPERTYTEMPLATE('0XKiEHvoj8MApp$Yh7YKkZ',$,'Temperature','Operating steam temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMODYNAMICTEMPERATUREMEASURE',$,$,$,$,.READWRITE.); #820=IFCSIMPLEPROPERTYTEMPLATE('17YbdUXgT8_h68eTXCXWcw',$,'Pressure','Operating steam pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #821=IFCSIMPLEPROPERTYTEMPLATE('3cdTJhIJr3wx$Nl6coGNxD',$,'Flowrate','The mass flowrate of the steam.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCMASSFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #822=IFCSIMPLEPROPERTYTEMPLATE('2gh_y8aDz6yhg6jaMPNsql',$,'Quality','Steam quality.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#823=IFCPROPERTYSETTEMPLATE('1$ZH03UsP6O9OfHFy3ddM1',$,'Pset_EvaporativeCoolerPHistory','Definition from IAI: Evaporative cooler performance history attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#824,#825,#826,#827,#828,#829,#830,#831)); +#823=IFCPROPERTYSETTEMPLATE('1$ZH03UsP6O9OfHFy3ddM1',$,'Pset_EvaporativeCoolerPHistory','Definition from IAI: Evaporative cooler performance history attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#824,#825,#826,#827,#828,#829,#830,#831)); #824=IFCSIMPLEPROPERTYTEMPLATE('1NuFENuIXCjvMjqRkbnraC',$,'WaterSumpTemperature','Water sump temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMODYNAMICTEMPERATUREMEASURE',$,$,$,$,.READWRITE.); #825=IFCSIMPLEPROPERTYTEMPLATE('0bsv63k9z37fO2_skaoC0A',$,'Effectiveness','Ratio of the change in dry bulb temperature of the (primary) air stream to the difference between the entering dry bulb temperature of the (primary) air and the wet-bulb temperature of the (secondary) air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #826=IFCSIMPLEPROPERTYTEMPLATE('3UxhdTfJrBJO08ZLFfSGfd',$,'SensibleHeatTransferRate','Sensible heat transfer rate to primary air flow.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); @@ -836,7 +836,7 @@ DATA; #829=IFCSIMPLEPROPERTYTEMPLATE('0GacG3bDf3hhJLsFYJRXYI',$,'EffectivenessTable','Total heat transfer effectiveness curve as a function of the primary air flow rate.',.P_LISTVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #830=IFCSIMPLEPROPERTYTEMPLATE('3VeCbjJuvBX9fsfUflzcfS',$,'AirPressureDropCurve','Air pressure drop as function of air flow rate.',.P_LISTVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #831=IFCSIMPLEPROPERTYTEMPLATE('09Xu5S9HnBn9tysur4K2TA',$,'WaterPressDropCurve','Water pressure drop as function of water flow rate.',.P_LISTVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#832=IFCPROPERTYSETTEMPLATE('28eM7SW_zEZu4BrDUNSjFC',$,'Pset_EvaporativeCoolerTypeCommon','Definition from IAI: Evaporative cooler type common attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead. WaterRequirement attribute unit type modified in IFC2x2 Pset Addendum.',$,'IfcEvaporativeCoolerType',(#833,#835,#836,#837,#838,#839)); +#832=IFCPROPERTYSETTEMPLATE('28eM7SW_zEZu4BrDUNSjFC',$,'Pset_EvaporativeCoolerTypeCommon','Definition from IAI: Evaporative cooler type common attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead. WaterRequirement attribute unit type modified in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcEvaporativeCoolerType',(#833,#835,#836,#837,#838,#839)); #833=IFCSIMPLEPROPERTYTEMPLATE('0vTYsRd6XDCvEH8o4Bzwbx',$,'FlowArrangement','CounterFlow: Air and water flow enter in different directions.\X2\000A\X0\CrossFlow: Air and water flow are perpendicular.\X2\000A\X0\ParallelFlow: Air and water flow enter in same directions.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#834,$,$,$,.READWRITE.); #834=IFCPROPERTYENUMERATION('PEnum_EvaporativeCoolerFlowArrangement',(IFCLABEL('COUNTERFLOW'),IFCLABEL('CROSSFLOW'),IFCLABEL('PARALLELFLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #835=IFCSIMPLEPROPERTYTEMPLATE('04QsByOxDAtvGbknJNTYi6',$,'HeatExchangeArea','Heat exchange area.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); @@ -844,7 +844,7 @@ DATA; #837=IFCSIMPLEPROPERTYTEMPLATE('3NUoVG1Cj63PrlmxcX$kNt',$,'OperationTemperatureRange','Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #838=IFCSIMPLEPROPERTYTEMPLATE('30dWAlsIjA08asCzgleJsA',$,'Weight','Weight of the evaporative cooler.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); #839=IFCSIMPLEPROPERTYTEMPLATE('06D2ELQALABQ_S3b2psf5K',$,'WaterRequirement','Make-up water requirement.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#840=IFCPROPERTYSETTEMPLATE('0X0m5P9jv86Q5Fo_96PSBM',$,'Pset_EvaporatorPHistory','Definition from IAI: Evaporator performance history attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#841,#842,#843,#844,#845,#846,#847,#848,#849,#850,#851)); +#840=IFCPROPERTYSETTEMPLATE('0X0m5P9jv86Q5Fo_96PSBM',$,'Pset_EvaporatorPHistory','Definition from IAI: Evaporator performance history attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#841,#842,#843,#844,#845,#846,#847,#848,#849,#850,#851)); #841=IFCSIMPLEPROPERTYTEMPLATE('2a1BrZFt96FgMxVy7vKqBT',$,'HeatRejectionRate','Sum of the refrigeration effect and the heat equivalent of the power input to the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); #842=IFCSIMPLEPROPERTYTEMPLATE('3BT1lKatD39OMfXbFfEvMi',$,'ExteriorHeatTransferCoefficient','Exterior heat transfer coefficient associated with exterior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMALTRANSMITTANCEMEASURE',$,$,$,$,.READWRITE.); #843=IFCSIMPLEPROPERTYTEMPLATE('38TLmoeCv8Peb55L9gww1E',$,'InteriorHeatTransferCoefficient','Interior heat transfer coefficient associated with interior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMALTRANSMITTANCEMEASURE',$,$,$,$,.READWRITE.); @@ -856,7 +856,7 @@ DATA; #849=IFCSIMPLEPROPERTYTEMPLATE('0b5e8pg3L6Ovpdumh8cZo2',$,'CompressorEvaporatorPressureDrop','Pressure drop between the evaporator outlet and the compressor inlet.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #850=IFCSIMPLEPROPERTYTEMPLATE('27NzgvzV1D_9PswMbTLSkH',$,'EvaporatorMeanVoidFraction','Mean void fraction in evaporator.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #851=IFCSIMPLEPROPERTYTEMPLATE('3sEXaEP1n7uOUhTtCT6mSI',$,'WaterFoulingResistance','Fouling resistance on water/air side.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#852=IFCPROPERTYSETTEMPLATE('0h98NvNBn2XAz8VstWZofW',$,'Pset_EvaporatorTypeCommon','Definition from IAI: Evaporator type common attributes.\X2\000A\X0\',$,'IfcEvaporatorType',(#853,#855,#857,#859,#860,#861,#862,#863,#864,#865)); +#852=IFCPROPERTYSETTEMPLATE('0h98NvNBn2XAz8VstWZofW',$,'Pset_EvaporatorTypeCommon','Definition from IAI: Evaporator type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcEvaporatorType',(#853,#855,#857,#859,#860,#861,#862,#863,#864,#865)); #853=IFCSIMPLEPROPERTYTEMPLATE('3MES8aF55CHeDbvwOP0ED9',$,'EvaporatorMediumType','ColdLiquid: Evaporator is using liquid type of fluid to exchange heat with refrigerant.\X2\000A\X0\ColdAir: Evaporator is using air to exchange heat with refrigerant.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#854,$,$,$,.READWRITE.); #854=IFCPROPERTYENUMERATION('PEnum_EvaporatorMediumType',(IFCLABEL('COLDLIQUID'),IFCLABEL('COLDAIR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #855=IFCSIMPLEPROPERTYTEMPLATE('3TqU6Vxsr85A17P_tQRxQA',$,'EvaporatorCoolant','The fluid used for the coolant in the evaporator.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#856,$,$,$,.READWRITE.); @@ -870,7 +870,7 @@ DATA; #863=IFCSIMPLEPROPERTYTEMPLATE('3Y4ZDMmeTEIv7IAlY_j$Rg',$,'InternalWaterVolume','Internal volume of evaporator (water side).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); #864=IFCSIMPLEPROPERTYTEMPLATE('1XDZgnmwv48vFQT8KQS8BL',$,'NominalHeatTransferArea','Nominal heat transfer surface area associated with nominal overall heat transfer coefficient.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #865=IFCSIMPLEPROPERTYTEMPLATE('1Ztsbg3CP4MBFkXASYy1BR',$,'NominalHeatTransferCoefficient','Nominal overall heat transfer coefficient associated with nominal heat transfer area.',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#866=IFCPROPERTYSETTEMPLATE('2cztgS8LH569H7wN_nKWqV',$,'Pset_FanPHistory','Definition from IAI: Fan performance history attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',$,'IfcPerformanceHistory',(#867,#868,#869,#870,#871,#872,#873,#874,#875,#876,#877)); +#866=IFCPROPERTYSETTEMPLATE('2cztgS8LH569H7wN_nKWqV',$,'Pset_FanPHistory','Definition from IAI: Fan performance history attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#867,#868,#869,#870,#871,#872,#873,#874,#875,#876,#877)); #867=IFCSIMPLEPROPERTYTEMPLATE('3bVctMulHEZhY0P7sGFqcN',$,'FanRotationSpeed','Fan rotation speed.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCROTATIONALFREQUENCYMEASURE',$,$,$,$,.READWRITE.); #868=IFCSIMPLEPROPERTYTEMPLATE('3yX7tMYAz1nRM0flzpEW5P',$,'WheelTipSpeed','Fan blade tip speed, typically defined as the linear speed of the tip of the fan blade furthest from the shaft. ',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCLINEARVELOCITYMEASURE',$,$,$,$,.READWRITE.); #869=IFCSIMPLEPROPERTYTEMPLATE('2ixi8u5Aj8KgkAmNlTHyne',$,'FanEfficiency','Fan mechanical efficiency.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCREAL',$,$,$,$,.READWRITE.); @@ -882,7 +882,7 @@ DATA; #875=IFCSIMPLEPROPERTYTEMPLATE('2skmSdgt99EPWut4d5bDT_',$,'DischargeVelocity','The speed at which air discharges from the fan through the fan housing discharge opening. ',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCLINEARVELOCITYMEASURE',$,$,$,$,.READWRITE.); #876=IFCSIMPLEPROPERTYTEMPLATE('1aqW0ANY5CHQ1Qzp5DZSPo',$,'DischargePressureLoss','Fan discharge pressure loss associated with the discharge arrangement.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #877=IFCSIMPLEPROPERTYTEMPLATE('1T7S6J7X9AgwGd1KcDFOOM',$,'DrivePowerLoss','Fan drive power losses associated with the type of connection between the motor and the fan wheel.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); -#878=IFCPROPERTYSETTEMPLATE('0PNWL06PbB5BJfvU0irDZk',$,'Pset_FanTypeCommon','Definition from IAI: Fan type common attributes.\X2\000A\X0\',$,'IfcFanType',(#879,#881,#883,#884,#885,#886,#887,#888,#889,#890,#891,#892)); +#878=IFCPROPERTYSETTEMPLATE('0PNWL06PbB5BJfvU0irDZk',$,'Pset_FanTypeCommon','Definition from IAI: Fan type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcFanType',(#879,#881,#883,#884,#885,#886,#887,#888,#889,#890,#891,#892)); #879=IFCSIMPLEPROPERTYTEMPLATE('3oA6i6_tf5$fPts6jlGVVm',$,'MotorDriveType','Motor drive type:\X2\000A\X0\DIRECTDRIVE: Direct drive. \X2\000A\X0\BELTDRIVE: Belt drive. \X2\000A\X0\COUPLING: Coupling. \X2\000A\X0\OTHER: Other type of motor drive. \X2\000A\X0\NOTKNOWN: Unknown motor drive type.\X2\000A\X0\UNSET: Unspecified motor drive type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#880,$,$,$,.READWRITE.); #880=IFCPROPERTYENUMERATION('PEnum_FanMotorConnectionType',(IFCLABEL('DIRECTDRIVE'),IFCLABEL('BELTDRIVE'),IFCLABEL('COUPLING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #881=IFCSIMPLEPROPERTYTEMPLATE('2B1_j0Xg58MwXLEmuE8WBG',$,'CapacityControlType','\X2\000A\X0\InletVane: Control by adjusting inlet vane\X2\000A\X0\VariableSpeedDrive: Control by variable speed drive \X2\000A\X0\BladePitchAngle: Control by adjusting blade pitch angle\X2\000A\X0\TwoSpeed: Control by switch between high and low speed\X2\000A\X0\DischargeDamper: Control by modulating discharge damper',.P_ENUMERATEDVALUE.,'IfcLabel',$,#882,$,$,$,.READWRITE.); @@ -897,15 +897,15 @@ DATA; #890=IFCSIMPLEPROPERTYTEMPLATE('1BEa968pn3rP7UyiaakVBx',$,'NominalRotationSpeed','Nominal fan wheel speed.',.P_SINGLEVALUE.,'IfcRotationalFrequencyMeasure',$,$,$,$,$,.READWRITE.); #891=IFCSIMPLEPROPERTYTEMPLATE('20WsLucOb6dh2i$G$Hd2B_',$,'NominalPowerRate','Nominal fan power rate.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #892=IFCSIMPLEPROPERTYTEMPLATE('0Up6d$iTH2eeur9CP7aWlq',$,'OperationalCriteria','Time of operation at maximum operational ambient air temperature.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#893=IFCPROPERTYSETTEMPLATE('1rh_PpLgvAYx$4QBvDjeJ$',$,'Pset_FanTypeSmokeControl','Definition from IAI: Smoke control attributes of a fan participating as part of a smoke control system.\X2\000A\X0\',$,'IfcFanType',(#894,#895,#896)); +#893=IFCPROPERTYSETTEMPLATE('1rh_PpLgvAYx$4QBvDjeJ$',$,'Pset_FanTypeSmokeControl','Definition from IAI: Smoke control attributes of a fan participating as part of a smoke control system.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcFanType',(#894,#895,#896)); #894=IFCSIMPLEPROPERTYTEMPLATE('2TCwFOHEn26OgRXYjbtdKW',$,'OperationalCriteria','Time of operation at maximum operational ambient air temperature.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); #895=IFCSIMPLEPROPERTYTEMPLATE('1MLZKTJvP3RfuAvHZUaQ3q',$,'MaximumDesignTemperature','Maximum design operational temperature.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #896=IFCSIMPLEPROPERTYTEMPLATE('3S70Aw2wz1DOF$HVWVl2tl',$,'SmokeControlFlowrate','Flowrate of fan while operating as a part of the smoke control system.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#897=IFCPROPERTYSETTEMPLATE('37K8coRvfE$us4Tg4tWDPP',$,'Pset_FilterPHistory','Definition from IAI: Filter performance history attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#898,#899,#900)); +#897=IFCPROPERTYSETTEMPLATE('37K8coRvfE$us4Tg4tWDPP',$,'Pset_FilterPHistory','Definition from IAI: Filter performance history attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#898,#899,#900)); #898=IFCSIMPLEPROPERTYTEMPLATE('04aWORbZ56GRfppdRYgHsv',$,'CountedEfficiency','Filter efficiency based the particle counts concentration before and after filter against particles with certain size distribution.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCREAL',$,$,$,$,.READWRITE.); #899=IFCSIMPLEPROPERTYTEMPLATE('3iGINvzx95O8pphySiI0oD',$,'WeightedEfficiency','Filter efficiency based the particle weight concentration before and after filter against particles with certain size distribution.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCREAL',$,$,$,$,.READWRITE.); #900=IFCSIMPLEPROPERTYTEMPLATE('095m_s5ob4NQZJKjHKFe2O',$,'ParticleMassHolding','Mass of particle holding in the filter.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCMASSMEASURE',$,$,$,$,.READWRITE.); -#901=IFCPROPERTYSETTEMPLATE('2FyznM_Ej8TO527vJ8MMH$',$,'Pset_FilterTypeAirParticleFilter','Definition from IAI: Air particle filter type attributes.\X2\000A\X0\',$,'IfcFilterType',(#902,#904,#905,#906,#908,#909,#910,#911,#912,#913,#914,#915)); +#901=IFCPROPERTYSETTEMPLATE('2FyznM_Ej8TO527vJ8MMH$',$,'Pset_FilterTypeAirParticleFilter','Definition from IAI: Air particle filter type attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcFilterType',(#902,#904,#905,#906,#908,#909,#910,#911,#912,#913,#914,#915)); #902=IFCSIMPLEPROPERTYTEMPLATE('1mBHuoHnv4fBJBPez3EJMu',$,'AirParticleFilterType','A panel dry type extended surface filter is a dry-type air filter with random fiber mats or blankets in the forms of pockets, V-shaped or radial pleats, and include the following:\X2\000A\X0\CoarseFilter: Filter with a efficiency lower than 30% for atmosphere dust-spot.\X2\000A\X0\CoarseMetalScreen: Filter made of metal screen.\X2\000A\X0\CoarseCellFoams: Filter made of cell foams.\X2\000A\X0\CoarseSpunGlass: Filter made of spun glass.\X2\000A\X0\MediumFilter: Filter with an efficiency between 30-98% for atmosphere dust-spot.\X2\000A\X0\MediumElectretFilter: Filter with fine electret synthetic fibers.\X2\000A\X0\MediumNaturalFiberFilter: Filter with natural fibers.\X2\000A\X0\HEPAFilter: High efficiency particulate air filter.\X2\000A\X0\ULPAFilter: Ultra low penetration air filter.\X2\000A\X0\MembraneFilters: Filter made of membrane for certain pore diameters in flat sheet and pleated form.\X2\000A\X0\A renewable media with a moving curtain viscous filter are random-fiber media coated with viscous substance in roll form or curtain where fresh media is fed across the face of the filter and the dirty media is rewound onto a roll at the bottom or to into a reservoir:\X2\000A\X0\RollForm: Viscous filter used in roll form.\X2\000A\X0\AdhesiveReservoir: Viscous filter used in moving curtain form.\X2\000A\X0\A renewable moving curtain dry media filter is a random-fiber dry media of relatively high porosity used in moving-curtain(roll) filters.\X2\000A\X0\An electrical filter uses electrostatic precipitation to remove and collect particulate contaminants.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#903,$,$,$,.READWRITE.); #903=IFCPROPERTYENUMERATION('PEnum_FilterAirParticleFilterType',(IFCLABEL('COARSEMETALSCREEN'),IFCLABEL('COARSECELLFOAMS'),IFCLABEL('COARSESPUNGLASS'),IFCLABEL('MEDIUMELECTRETFILTER'),IFCLABEL('MEDIUMNATURALFIBERFILTER'),IFCLABEL('HEPAFILTER'),IFCLABEL('ULPAFILTER'),IFCLABEL('MEMBRANEFILTERS'),IFCLABEL('RENEWABLEMOVINGCURTIANDRYMEDIAFILTER'),IFCLABEL('ELECTRICALFILTER'),IFCLABEL('ROLLFORM'),IFCLABEL('ADHESIVERESERVOIR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #904=IFCSIMPLEPROPERTYTEMPLATE('1bcZUDXAT5BgiPYlBPAyOP',$,'FrameMaterial','Filter frame material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); @@ -920,7 +920,7 @@ DATA; #913=IFCSIMPLEPROPERTYTEMPLATE('3$fOm_Q293ogGQjU9WuYWl',$,'PressureDropCurve','Under certain dust holding weight, DelPressure = f (fluidflowRate)',.P_TABLEVALUE.,'IfcPressureMeasure','IfcReal',$,$,$,'DelPressure = f (fluidflowRate)',.READWRITE.); #914=IFCSIMPLEPROPERTYTEMPLATE('3w7VL$7Rn42g76LMIzJz4i',$,'CountedEfficiencyCurve','Counted efficiency curve as a function of dust holding weight, efficiency = f (dust holding weight).',.P_TABLEVALUE.,'IfcReal','IfcReal',$,$,$,'efficiency = f (dust holding weight)',.READWRITE.); #915=IFCSIMPLEPROPERTYTEMPLATE('1VMwu2Xej7G9EzW40IPBau',$,'WeightedEfficiencyCurve','Weighted efficiency curve as a function of dust holding weight, efficiency = f (dust holding weight).',.P_TABLEVALUE.,'IfcReal','IfcReal',$,$,$,'efficiency = f (dust holding weight)',.READWRITE.); -#916=IFCPROPERTYSETTEMPLATE('10GeIomfL5P9K3zwaCxicm',$,'Pset_FilterTypeCommon','Definition from IAI: Filter type common attributes.\X2\000A\X0\',$,'IfcFilterType',(#917,#918,#919,#920,#921,#922,#923,#924,#925,#926,#927,#928)); +#916=IFCPROPERTYSETTEMPLATE('10GeIomfL5P9K3zwaCxicm',$,'Pset_FilterTypeCommon','Definition from IAI: Filter type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcFilterType',(#917,#918,#919,#920,#921,#922,#923,#924,#925,#926,#927,#928)); #917=IFCSIMPLEPROPERTYTEMPLATE('3lmm1$fLTFoenWx$xziSxY',$,'MediaMaterial','Filter media material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #918=IFCSIMPLEPROPERTYTEMPLATE('3Ik4aPS9r4LQbu4V3_aZvo',$,'Weight','Weight of filter.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); #919=IFCSIMPLEPROPERTYTEMPLATE('1tibtcWEH2LeW7tsXb$R8y',$,'InitialResistance','Initial new filter fluid resistance (i.e., pressure drop at the maximum air flowrate across the filter when the filter is new per ASHRAE Standard 52.1).',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); @@ -933,23 +933,23 @@ DATA; #926=IFCSIMPLEPROPERTYTEMPLATE('1VM5RB31P20QP_1yanEZbX',$,'NominalFlowrate','Nominal fluid flow rate through the filter.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #927=IFCSIMPLEPROPERTYTEMPLATE('3hF9QSrAT1Hx5nEPtDJhjO',$,'NominalParticleGeometricMeanDiameter','Particle geometric mean diameter associated with nominal efficiency.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #928=IFCSIMPLEPROPERTYTEMPLATE('1o4VnNnAz2xuhVaUmT_8PX',$,'NominalParticleGeometricStandardDeviation','Particle geometric standard deviation associated with nominal efficiency.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#929=IFCPROPERTYSETTEMPLATE('015CR2E4vEpBlZwnVi1XkY',$,'Pset_FlowMeterTypeCommon','Definition from IAI: Common attributes of a flow meter type',$,'IfcFlowMeterType',(#930,#932,#933)); +#929=IFCPROPERTYSETTEMPLATE('015CR2E4vEpBlZwnVi1XkY',$,'Pset_FlowMeterTypeCommon','Definition from IAI: Common attributes of a flow meter type',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeterType',(#930,#932,#933)); #930=IFCSIMPLEPROPERTYTEMPLATE('18zWRvvfn0Y81I5nfYbKPw',$,'ReadOutType','Indication of the form that readout from the meter takes. In the case of a dial read out, this may comprise multiple dials that give a cumulative reading and/or a mechanical odometer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#931,$,$,$,.READWRITE.); #931=IFCPROPERTYENUMERATION('PEnum_MeterReadOutType',(IFCLABEL('DIAL'),IFCLABEL('DIGITAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #932=IFCSIMPLEPROPERTYTEMPLATE('0DavzIX2f5Q8gThwORutqR',$,'RemoteReading','Indicates whether the meter has a connection for remote reading through connection of a communication device (set TRUE) or not (set FALSE). ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #933=IFCSIMPLEPROPERTYTEMPLATE('3p$KF3ThDEJBi3P5kH_aPF',$,'IsMain','Indicates whether the meter is the main meter on the system. If FALSE, it is a submeter. ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#934=IFCPROPERTYSETTEMPLATE('2zW5vNzyH86eZKKplagexN',$,'Pset_FlowMeterTypeEnergyMeter','Definition from IAI: Device that measures, indicates and sometimes records, the energy usage in a system.',$,'IfcFlowMeterType',(#935)); +#934=IFCPROPERTYSETTEMPLATE('2zW5vNzyH86eZKKplagexN',$,'Pset_FlowMeterTypeEnergyMeter','Definition from IAI: Device that measures, indicates and sometimes records, the energy usage in a system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeterType',(#935)); #935=IFCSIMPLEPROPERTYTEMPLATE('1P7YSQXeP1WfVkST7mbas1',$,'ConnectionSize','Defines the size of inlet and outlet pipe connections to the meter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#936=IFCPROPERTYSETTEMPLATE('2HFdL4WR1Flw9UQzdHD8VG',$,'Pset_FlowMeterTypeGasMeter','Definition from IAI: Device that measures, indicates and sometimes records, the volume of gas that passes through it without interrupting the flow.',$,'IfcFlowMeterType',(#937,#939,#940,#941)); +#936=IFCPROPERTYSETTEMPLATE('2HFdL4WR1Flw9UQzdHD8VG',$,'Pset_FlowMeterTypeGasMeter','Definition from IAI: Device that measures, indicates and sometimes records, the volume of gas that passes through it without interrupting the flow.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeterType',(#937,#939,#940,#941)); #937=IFCSIMPLEPROPERTYTEMPLATE('3wWSR_LZv43fGymCMKCScC',$,'GasType','Defines the types of gas that may be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#938,$,$,$,.READWRITE.); #938=IFCPROPERTYENUMERATION('PEnum_GasType',(IFCLABEL('COMMERCIALBUTANE'),IFCLABEL('COMMERCIALPROPANE'),IFCLABEL('LIQUEFIEDPETROLEUMGAS'),IFCLABEL('NATURALGAS'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #939=IFCSIMPLEPROPERTYTEMPLATE('38Ak_e9OvDZhomoQ5M$vCV',$,'ConnectionSize','Defines the size of inlet and outlet pipe connections to the meter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #940=IFCSIMPLEPROPERTYTEMPLATE('2KFp7vrDP9zPlUDILmUcNJ',$,'MaximumFlowRate','Maximum rate of flow which the meter is expected to pass.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #941=IFCSIMPLEPROPERTYTEMPLATE('1vuTRqCtzBPA$3F1lAFhsE',$,'MaximumPressureLoss','Pressure loss expected across the meter under conditions of maximum flow.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#942=IFCPROPERTYSETTEMPLATE('23pWf6Wob7lwupYQLV0Rwc',$,'Pset_FlowMeterTypeOilMeter','Definition from IAI: Device that measures, indicates and sometimes records, the volume of oil that passes through it without interrupting the flow.',$,'IfcFlowMeterType',(#943,#944)); +#942=IFCPROPERTYSETTEMPLATE('23pWf6Wob7lwupYQLV0Rwc',$,'Pset_FlowMeterTypeOilMeter','Definition from IAI: Device that measures, indicates and sometimes records, the volume of oil that passes through it without interrupting the flow.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeterType',(#943,#944)); #943=IFCSIMPLEPROPERTYTEMPLATE('2P_5oyAjD5OhLd2Jl8alBm',$,'ConnectionSize','Defines the size of inlet and outlet pipe connections to the meter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #944=IFCSIMPLEPROPERTYTEMPLATE('0ksdIClwn9Ee2Ya56zOHKJ',$,'MaximumFlowRate','Maximum rate of flow which the meter is expected to pass.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#945=IFCPROPERTYSETTEMPLATE('1tWeB2nTb008UcBcK2_HIY',$,'Pset_FlowMeterTypeWaterMeter','Definition from IAI: Device that measures, indicates and sometimes records, the volume of water that passes through it without interrupting the flow.',$,'IfcFlowMeterType',(#946,#948,#949,#950,#951)); +#945=IFCPROPERTYSETTEMPLATE('1tWeB2nTb008UcBcK2_HIY',$,'Pset_FlowMeterTypeWaterMeter','Definition from IAI: Device that measures, indicates and sometimes records, the volume of water that passes through it without interrupting the flow.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeterType',(#946,#948,#949,#950,#951)); #946=IFCSIMPLEPROPERTYTEMPLATE('0fGLAp2YL1Tgm7EhbYRHQj',$,'Type','Defines the allowed values for selection of the flow meter operation type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#947,$,$,$,.READWRITE.); #947=IFCPROPERTYENUMERATION('PEnum_WaterMeterType',(IFCLABEL('COMPOUND'),IFCLABEL('INFERENTIAL'),IFCLABEL('PISTON'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #948=IFCSIMPLEPROPERTYTEMPLATE('22cUSBOgL1_guHYd0iCdy7',$,'ConnectionSize','Defines the size of inlet and outlet pipe connections to the meter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -957,30 +957,30 @@ DATA; #950=IFCSIMPLEPROPERTYTEMPLATE('3cTxzVAO95Mxm5eNVblcp4',$,'MaximumPressureLoss','Pressure loss expected across the meter under conditions of maximum flow.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #951=IFCSIMPLEPROPERTYTEMPLATE('1z3Bm8T3f1NeoDE0JzO7dS',$,'BackflowPreventerType','Identifies the type of backflow preventer installed to prevent the backflow of contaminated or polluted water from an irrigation/reticulation system to a potable water supply.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#952,$,$,$,.READWRITE.); #952=IFCPROPERTYENUMERATION('PEnum_BackflowPreventerType',(IFCLABEL('NONE'),IFCLABEL('ATMOSPHERICVACUUMBREAKER'),IFCLABEL('ANTISIPHONVALVE'),IFCLABEL('DOUBLECHECKBACKFLOWPREVENTER'),IFCLABEL('PRESSUREVACUUMBREAKER'),IFCLABEL('REDUCEDPRESSUREBACKFLOWPREVENTER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#953=IFCPROPERTYSETTEMPLATE('3HAjT9MUz5d8$$bjZ5ns3o',$,'Pset_GasTerminalPHistory','Definition from IAI: Gas terminal performance history common attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#954)); +#953=IFCPROPERTYSETTEMPLATE('3HAjT9MUz5d8$$bjZ5ns3o',$,'Pset_GasTerminalPHistory','Definition from IAI: Gas terminal performance history common attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#954)); #954=IFCSIMPLEPROPERTYTEMPLATE('0ijA1l2JX3uBiRgcKR5Ack',$,'GasFlowRate','The volumetric flowrate of gas to the gas terminal.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); -#955=IFCPROPERTYSETTEMPLATE('269q55k411FfEuzYUgir02',$,'Pset_GasTerminalTypeCommon','Definition from IAI: Common attributes of gas terminal types. \X2\000A\X0\GasProperties attribute deleted in IFC2x2 Pset Addendum: Use IfcFuelProperties instead.',$,'IfcGasTerminalType',(#956)); +#955=IFCPROPERTYSETTEMPLATE('269q55k411FfEuzYUgir02',$,'Pset_GasTerminalTypeCommon','Definition from IAI: Common attributes of gas terminal types. \X2\000A\X0\GasProperties attribute deleted in IFC2x2 Pset Addendum: Use IfcFuelProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcGasTerminalType',(#956)); #956=IFCSIMPLEPROPERTYTEMPLATE('0hzm8J0Wz0$u9apvNGXotm',$,'GasFlowRateRange','Gas volumetric flowrate within which the gas terminal is designed to operate.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#957=IFCPROPERTYSETTEMPLATE('0jBLiwXor91vqiEnP455Up',$,'Pset_GasTerminalTypeGasAppliance','Definition from IAI: Piece of equipment for occupants use that is connected to a gas installation (definition is a modification from that found in BS6100).',$,'IfcGasTerminalType',(#958,#960)); +#957=IFCPROPERTYSETTEMPLATE('0jBLiwXor91vqiEnP455Up',$,'Pset_GasTerminalTypeGasAppliance','Definition from IAI: Piece of equipment for occupants use that is connected to a gas installation (definition is a modification from that found in BS6100).',.PSET_TYPEDRIVENOVERRIDE.,'IfcGasTerminalType',(#958,#960)); #958=IFCSIMPLEPROPERTYTEMPLATE('37qh4TTxLCSR7Y9KXaHuNn',$,'GasApplianceType','Selection of the type of gas appliance from the enumerated list of types.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#959,$,$,$,.READWRITE.); #959=IFCPROPERTYENUMERATION('PEnum_GasApplianceType',(IFCLABEL('GASFIRE'),IFCLABEL('GASCOOKER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #960=IFCSIMPLEPROPERTYTEMPLATE('14VBexdcj4pO4WUUKHPZ0G',$,'FlueType','Defines the types of flue that may be specified for connection to gas appliances where:\X2\000A000A\X0\BalancedFlue =\X2\0009\X0\Room sealed appliance that has its inlet for combustion air and its outlet for products of combustion in adjacent external positions, disposed so that wind effects are substantially balanced between them.\X2\000A\X0\Flued =\X2\0009\X0\Gas burning appliance designed for connection to a flue system\X2\000A\X0\Flueless =\X2\0009\X0\Gas burning appliance designed for use without connection to a flue system\X2\000A\X0\OpenFlued =\X2\0009\X0\Gas burning appliance designed to be connected to an open flue system, combustion air being drawn from a room or internal space in which the gas burning appliance is installed\X2\000A\X0\RoomSealed =\X2\0009\X0\Gas burning appliance that has its combustion system, including air inlet and products outlet, isolated from a room or internal space in which the gas burning appliance is installed\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#961,$,$,$,.READWRITE.); #961=IFCPROPERTYENUMERATION('PEnum_FlueType',(IFCLABEL('BALANCEDFLUE'),IFCLABEL('FLUED'),IFCLABEL('FLUELESS'),IFCLABEL('OPENFLUED'),IFCLABEL('ROOMSEALED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#962=IFCPROPERTYSETTEMPLATE('06L1R0VVP7VgUkRT0lH4$N',$,'Pset_GasTerminalTypeGasBurner','Definition from IAI: A complete unit on which or in which a flame is maintained through the provision of a gas supply.',$,'IfcGasTerminalType',(#963)); +#962=IFCPROPERTYSETTEMPLATE('06L1R0VVP7VgUkRT0lH4$N',$,'Pset_GasTerminalTypeGasBurner','Definition from IAI: A complete unit on which or in which a flame is maintained through the provision of a gas supply.',.PSET_TYPEDRIVENOVERRIDE.,'IfcGasTerminalType',(#963)); #963=IFCSIMPLEPROPERTYTEMPLATE('0uc6jzJZv7Dh708jkRVBei',$,'GasBurnerType','Selection of the type of gas burner from the enumerated list of types',.P_ENUMERATEDVALUE.,'IfcLabel',$,#964,$,$,$,.READWRITE.); #964=IFCPROPERTYENUMERATION('PEnum_GasBurnerType',(IFCLABEL('FORCEDDRAFT'),IFCLABEL('NATURALDRAFT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#965=IFCPROPERTYSETTEMPLATE('2JQqSB1GvAXRoUTX7mn_G$',$,'Pset_HeatExchangerTypeCommon','Definition from IAI: Heat exchanger type common attributes.\X2\000A\X0\',$,'IfcHeatExchangerType',(#966,#968)); +#965=IFCPROPERTYSETTEMPLATE('2JQqSB1GvAXRoUTX7mn_G$',$,'Pset_HeatExchangerTypeCommon','Definition from IAI: Heat exchanger type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcHeatExchangerType',(#966,#968)); #966=IFCSIMPLEPROPERTYTEMPLATE('1A1euMCDPE0e$IswhSzjAv',$,'Arrangement','Defines the basic flow arrangements for the heat exchanger:\X2\000A\X0\COUNTERFLOW: Counterflow heat exchanger arrangement. \X2\000A\X0\CROSSFLOW: Crossflow heat exchanger arrangement. \X2\000A\X0\PARALLELFLOW: Parallel flow heat exchanger arrangement. \X2\000A\X0\MULTIPASS: Multipass flow heat exchanger arrangement. \X2\000A\X0\OTHER: Other type of heat exchanger flow arrangement not defined above. ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#967,$,$,$,.READWRITE.); #967=IFCPROPERTYENUMERATION('PEnum_HeatExchangerArrangement',(IFCLABEL('COUNTERFLOW'),IFCLABEL('CROSSFLOW'),IFCLABEL('PARALLELFLOW'),IFCLABEL('MULTIPASS'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #968=IFCSIMPLEPROPERTYTEMPLATE('2PGNcUOpLAxBt3PtFl5YRO',$,'ShellMaterial','Material used to construct the shell of the heat exchanger.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#969=IFCPROPERTYSETTEMPLATE('0uBX9uHWvAgu7zYcRRUTJw',$,'Pset_HeatExchangerTypePlate','Definition from IAI: Plate heat exchanger type common attributes.\X2\000A\X0\',$,'IfcHeatExchangerType',(#970)); +#969=IFCPROPERTYSETTEMPLATE('0uBX9uHWvAgu7zYcRRUTJw',$,'Pset_HeatExchangerTypePlate','Definition from IAI: Plate heat exchanger type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcHeatExchangerType',(#970)); #970=IFCSIMPLEPROPERTYTEMPLATE('2eQ5SNKZbDJwaSpxZ39rd3',$,'NumberOfPlates','Number of plates used by the plate heat exchanger.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#971=IFCPROPERTYSETTEMPLATE('0pvilnnIbEEBPmEpFtm2ZK',$,'Pset_HumidifierPHistory','Definition from IAI: Humidifier performance history attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',$,'IfcPerformanceHistory',(#972,#973,#974,#975)); +#971=IFCPROPERTYSETTEMPLATE('0pvilnnIbEEBPmEpFtm2ZK',$,'Pset_HumidifierPHistory','Definition from IAI: Humidifier performance history attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#972,#973,#974,#975)); #972=IFCSIMPLEPROPERTYTEMPLATE('2Jji7ZGTnFoftO06t6d77S',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #973=IFCSIMPLEPROPERTYTEMPLATE('0e7sPmhRfCtwPlIubaKI1S',$,'SaturationEfficiency','Saturation efficiency: Ratio of leaving air absolute humidity to the maximum absolute humidity.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCREAL',$,$,$,$,.READWRITE.); #974=IFCSIMPLEPROPERTYTEMPLATE('0kcgypymf9d9nboNY_hVTo',$,'SaturationEfficiencyCurve','Saturation efficiency as a function of the air flow rate.',.P_TABLEVALUE.,'IfcReal','IfcVolumetricFlowRateMeasure',$,$,$,$,.READWRITE.); #975=IFCSIMPLEPROPERTYTEMPLATE('1KKQhySdrFx9kYMrBV09vC',$,'AirPressureDropCurve','Air pressure drop versus air-flow rate.',.P_TABLEVALUE.,'IfcPressureMeasure','IfcVolumetricFlowRateMeasure',$,$,$,$,.READWRITE.); -#976=IFCPROPERTYSETTEMPLATE('3wEGb7sA9F$voinaXFx1t_',$,'Pset_HumidifierTypeCommon','Definition from IAI: Humidifier type common attributes.\X2\000A\X0\WaterProperties attribute renamed to WaterRequirement and unit type modified in IFC2x2 Pset Addendum.',$,'IfcHumidifierType',(#977,#979,#980,#981,#982,#984)); +#976=IFCPROPERTYSETTEMPLATE('3wEGb7sA9F$voinaXFx1t_',$,'Pset_HumidifierTypeCommon','Definition from IAI: Humidifier type common attributes.\X2\000A\X0\WaterProperties attribute renamed to WaterRequirement and unit type modified in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcHumidifierType',(#977,#979,#980,#981,#982,#984)); #977=IFCSIMPLEPROPERTYTEMPLATE('17FEDqlBX8nwfVs42mQXZF',$,'Application','Humidifier application.\X2\000A\X0\Fixed: Humidifier installed in a ducted flow distribution system.\X2\000A\X0\Portable: Humidifier is not installed in a ducted flow distribution system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#978,$,$,$,.READWRITE.); #978=IFCPROPERTYENUMERATION('PEnum_HumidifierApplication',(IFCLABEL('PORTABLE'),IFCLABEL('FIXED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #979=IFCSIMPLEPROPERTYTEMPLATE('0zf4YNVHDAE9d9RM7eyjy5',$,'Weight','The weight of the humidifier.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); @@ -989,9 +989,9 @@ DATA; #982=IFCSIMPLEPROPERTYTEMPLATE('1$7XWRpsX9WekR71FbjnBE',$,'InternalControl','Internal modulation control.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#983,$,$,$,.READWRITE.); #983=IFCPROPERTYENUMERATION('PEnum_HumidifierInternalControl',(IFCLABEL('ONOFF'),IFCLABEL('STEPPED'),IFCLABEL('MODULATING'),IFCLABEL('NONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #984=IFCSIMPLEPROPERTYTEMPLATE('36S9FmNKfDs9OCblFl0slF',$,'WaterRequirement','Make-up water requirement.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#985=IFCPROPERTYSETTEMPLATE('1XSZmgSgnCCQLLTr5j0qU8',$,'Pset_PipeConnection','Definition from IAI: This property set is used to define the various types of pipe connections. It is applied to occurrences of pipe segments and fittings.\X2\000A\X0\',$,'IfcDistributionElement',(#986)); +#985=IFCPROPERTYSETTEMPLATE('1XSZmgSgnCCQLLTr5j0qU8',$,'Pset_PipeConnection','Definition from IAI: This property set is used to define the various types of pipe connections. It is applied to occurrences of pipe segments and fittings.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionElement',(#986)); #986=IFCSIMPLEPROPERTYTEMPLATE('0gLDSQlCv5iumk0FmKo0QS',$,'ConnectionType','The connection type between pipe segments or fittings and other segments or fittings. If the list contains only one value, then this connection type value applies to all ports. For more than one value in the list, the connection type value applies to the port that corresponds to the list index.The following suggested items should be utilized whenever possible for correlation with port enumerations:\X2\000A\X0\BRAZED: Brazed connection type. \X2\000A\X0\COMPRESSION: Compression connection type. \X2\000A\X0\FLANGED: Flanged connection type including bolts and gasket. \X2\000A\X0\GLANDJOINT: Gland-joint connection type. \X2\000A\X0\FLEXIBLEBOLTEDGLANDJOINT: Flexible bolted gland-joint connection type. \X2\000A\X0\FLEXIBLEBOLTEDGLANDJOINTWITHANODEENDCAP: Flexible bolted gland-joint with anode end-cap connection type. \X2\000A\X0\GROOVED: Grooved connection type. \X2\000A\X0\SOLDERED: Soldered connection type. \X2\000A\X0\SOLDERED_FEMALE: Female-soldered connection type. \X2\000A\X0\SOLDERED_MALE: Male-soldered connection type. \X2\000A\X0\SWEDGE: Swedge connection type. \X2\000A\X0\THREADED: Threaded connection type. \X2\000A\X0\THREADED_FEMALE: Female-threaded connection type. \X2\000A\X0\THREADED_MALE: Male-threaded connection type. \X2\000A\X0\WELDED: Welded connection type. \X2\000A\X0\WELDED_BUTT: Butt-welded connection type. \X2\000A\X0\WELDED_BRANCH: Branch-welded connection type. \X2\000A\X0\WELDED_FLANGE: Flange-welded connection type. \X2\000A\X0\NONE: There is no connection.\X2\000A\X0\NOTDEFINED: Undefined connection type. ',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#987=IFCPROPERTYSETTEMPLATE('0ddUQpBFz3mR5TB72MR5wc',$,'Pset_PipeConnectionFlanged','Definition from IAI: This property set is used to define the specifics of a flanged pipe connection used between occurrences of pipe segments and fittings.\X2\000A\X0\',$,'IfcDistributionElement',(#988,#989,#990,#991,#992,#993,#994,#995,#996)); +#987=IFCPROPERTYSETTEMPLATE('0ddUQpBFz3mR5TB72MR5wc',$,'Pset_PipeConnectionFlanged','Definition from IAI: This property set is used to define the specifics of a flanged pipe connection used between occurrences of pipe segments and fittings.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionElement',(#988,#989,#990,#991,#992,#993,#994,#995,#996)); #988=IFCSIMPLEPROPERTYTEMPLATE('1utD$NjD92JBePEvW$r_04',$,'FlangeTable','Designation of the standard table to which the flange conforms',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #989=IFCSIMPLEPROPERTYTEMPLATE('0khqBP7Nr7R8jNUEKwBzDR',$,'FlangeStandard','Designation of the standard describing the flange table',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #990=IFCSIMPLEPROPERTYTEMPLATE('2yA2PdjwPEufZkhYEEIT4o',$,'BoreSize','The nominal bore of the pipe flange',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1001,10 +1001,10 @@ DATA; #994=IFCSIMPLEPROPERTYTEMPLATE('0a94F1pj9CbxGVueeWlb6S',$,'NumberOfBoltholes','Number of boltholes in the flange',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #995=IFCSIMPLEPROPERTYTEMPLATE('0Un0xP7tv9f8GyHh4WweUh',$,'BoltSize','Size of the bolts securing the flange',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #996=IFCSIMPLEPROPERTYTEMPLATE('1I_03uI8z0XO2ymFGofqO7',$,'BoltholePitch','Diameter of the circle along which the boltholes are placed',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#997=IFCPROPERTYSETTEMPLATE('32X4YPzODAhOG_5eTaShgu',$,'Pset_PipeFittingPHistory','Definition from IAI: Pipe fitting performance history common attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#998,#999)); +#997=IFCPROPERTYSETTEMPLATE('32X4YPzODAhOG_5eTaShgu',$,'Pset_PipeFittingPHistory','Definition from IAI: Pipe fitting performance history common attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#998,#999)); #998=IFCSIMPLEPROPERTYTEMPLATE('2$SZzVQv5BiOaTBtpZQdC8',$,'LossCoefficient','Dimensionless loss coefficient used for calculating fluid resistance representing the ratio of total pressure loss to velocity pressure at a referenced cross-section.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCREAL',$,$,$,$,.READWRITE.); #999=IFCSIMPLEPROPERTYTEMPLATE('0DP2dNhd1EK9XyASoKl3mA',$,'FlowrateLeakage','Leakage flowrate versus pressure difference.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); -#1000=IFCPROPERTYSETTEMPLATE('3nxfT928j8EvEueCcYmFnb',$,'Pset_PipeFittingTypeCommon','Definition from IAI: Pipe fitting type common attributes.\X2\000A\X0\',$,'IfcPipeFittingType',(#1001,#1002,#1003,#1004,#1005,#1006,#1007,#1008,#1009,#1010,#1011)); +#1000=IFCPROPERTYSETTEMPLATE('3nxfT928j8EvEueCcYmFnb',$,'Pset_PipeFittingTypeCommon','Definition from IAI: Pipe fitting type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeFittingType',(#1001,#1002,#1003,#1004,#1005,#1006,#1007,#1008,#1009,#1010,#1011)); #1001=IFCSIMPLEPROPERTYTEMPLATE('348U3DNlv6Se1FNLiandxt',$,'SubType','Subtype of the pipe fitting..The following suggested items should be utilized whenever possible for consistency across applications:\X2\000A\X0\BEND_15DEGREE: Changes the direction of flow through 15 degrees. \X2\000A\X0\BEND_22_5DEGREE: Changes the direction of flow through 22.5 degrees. \X2\000A\X0\BEND_25DEGREE: Changes the direction of flow through 25 degrees. \X2\000A\X0\BEND_30DEGREE: Changes the direction of flow through 30 degrees. \X2\000A\X0\BEND_45DEGREE: Changes the direction of flow through 45 degrees. \X2\000A\X0\BEND_67DEGREE: Changes the direction of flow through 67 degrees. \X2\000A\X0\BEND_76DEGREE: Changes the direction of flow through 76 degrees. \X2\000A\X0\BEND_87_5DEGREE: Changes the direction of flow through 87.5 degrees. \X2\000A\X0\BEND_90DEGREE: Changes the direction of flow through 90 degrees. \X2\000A\X0\BEND_135DEGREE: Changes the direction of flow through 135 degrees. \X2\000A\X0\BEND_180DEGREE: Changes the direction of flow through 180 degrees. \X2\000A\X0\JUNCTION_CROSS_SQUARE: Branch fitting with two opposing branches that are swept in the direction of the main flow. \X2\000A\X0\JUNCTION_CROSS_SWEEP: Branch fitting with two swept opposing branches at right angles to the main flow. \X2\000A\X0\JUNCTION_TEE_SQUARE: Branch fitting in which the branch is at an angle of 90 degrees to the main pipe. \X2\000A\X0\JUNCTION_TEE_SWEEP: Branch fitting in which the branch is curved through 90 degrees to join a main pipe tangentially. \X2\000A\X0\JUNCTION_TEE_TWINBEND: Symmetrical pipe fitting in which two short radius bends curve through 90 degree to form a single pipe. \X2\000A\X0\+I1JUNCTION_TEE_TWINELBOW: Symmetrical pipe fitting in which two elbows curve through 90 degree to form a single pipe. \X2\000A\X0\JUNCTION_TEE_Y: Branch fitting in the shape of a letter Y. \X2\000A\X0\OBSTRUCTION_CAP: Device fixed onto the end of a pipe or pipe fitting to close it. \X2\000A\X0\OBSTRUCTION_PLUG: Device fixed into the end of a pipe or pipe fitting to close it. \X2\000A\X0\OTHER: Other fitting subtype.\X2\000A\X0\NOTDEFINED: The fitting subtype is not defined. ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1002=IFCSIMPLEPROPERTYTEMPLATE('0ZVZdpgiz9zfvYgTbKnrsG',$,'Material','The pipe fitting material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1003=IFCSIMPLEPROPERTYTEMPLATE('0V99Hcp996vPBznlYqwfa_',$,'PressureClass','The test or rated pressure classification of the fitting.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); @@ -1016,10 +1016,10 @@ DATA; #1009=IFCSIMPLEPROPERTYTEMPLATE('09XU658wnB$wc3gV$zR3m6',$,'OuterDiameter','The actual outer diameter of the pipe. Refer to NominalDiameter for comments about interpretation of multiple items in the list.',.P_LISTVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1010=IFCSIMPLEPROPERTYTEMPLATE('0f2v5vA_b9uvV$tm1z6xbF',$,'EndStyleTreatment','The end-style treatment of the pipe fitting as made available from the manufacturer. If the list contains only one value, then this end-style applies to all ports. For more than one value in the list, the end-style value applies to the port that corresponds to the list index.The following suggested items should be utilized whenever possible for correlation with port enumerations:\X2\000A\X0\FLANGED: Flanged. \X2\000A\X0\GROOVED: Grooved. \X2\000A\X0\THREADED: Threaded. \X2\000A\X0\NONE: No end-style has been applied.\X2\000A\X0\NOTDEFINED: Undefined end-style type. ',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1011=IFCSIMPLEPROPERTYTEMPLATE('0LBt3nbLv7f9Ki8GDCWDmO',$,'FittingLossFactor','A factor that determines the pressure loss due to friction through the fitting.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1012=IFCPROPERTYSETTEMPLATE('3__zsiBvbEHBzAj$pHnzMB',$,'Pset_PipeSegmentPHistory','Definition from IAI: Pipe segment performance history common attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#1013,#1014)); +#1012=IFCPROPERTYSETTEMPLATE('3__zsiBvbEHBzAj$pHnzMB',$,'Pset_PipeSegmentPHistory','Definition from IAI: Pipe segment performance history common attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#1013,#1014)); #1013=IFCSIMPLEPROPERTYTEMPLATE('3GImJz3xDBffJcsZA86QdO',$,'LeakageCurve','Leakage per unit length curve versus working pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #1014=IFCSIMPLEPROPERTYTEMPLATE('3FOmbHGY1A2g1DIirHU0UR',$,'FluidFlowLeakage','Volumetric leakage flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); -#1015=IFCPROPERTYSETTEMPLATE('1JxHb0OeH0GvTTDd69ZuFx',$,'Pset_PipeSegmentTypeCommon','Definition from IAI: Pipe segment type common attributes.\X2\000A\X0\',$,'IfcPipeSegmentType',(#1016,#1017,#1018,#1019,#1020,#1021,#1022,#1023,#1024)); +#1015=IFCPROPERTYSETTEMPLATE('1JxHb0OeH0GvTTDd69ZuFx',$,'Pset_PipeSegmentTypeCommon','Definition from IAI: Pipe segment type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeSegmentType',(#1016,#1017,#1018,#1019,#1020,#1021,#1022,#1023,#1024)); #1016=IFCSIMPLEPROPERTYTEMPLATE('3w3vrUQ0f418RdszolI46C',$,'Material','The pipe fitting material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1017=IFCSIMPLEPROPERTYTEMPLATE('0zfd_7KgDAcfCBvkjYOVhu',$,'WorkingPressure','Working pressure.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #1018=IFCSIMPLEPROPERTYTEMPLATE('1WANmgWJjBkxf7eTWncclV',$,'UnitWeight','Weight per unit length.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); @@ -1029,20 +1029,20 @@ DATA; #1022=IFCSIMPLEPROPERTYTEMPLATE('33PPXqElrANQAgvMBd6kze',$,'InnerDiameter','The actual inner diameter of the pipe. Refer to NominalDiameter for comments about interpretation of multiple items in the list.',.P_LISTVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1023=IFCSIMPLEPROPERTYTEMPLATE('16Y7reBt1Ddw2sN9g4V_AH',$,'OuterDiameter','The actual outer diameter of the pipe. Refer to NominalDiameter for comments about interpretation of multiple items in the list.',.P_LISTVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1024=IFCSIMPLEPROPERTYTEMPLATE('1mgEHgGBX40RbTwVFXXKJj',$,'EndStyleTreatment','The end-style treatment of the pipe segment as made available from the manufacturer. If the list contains only one value, then this end-style applies to all ports. For more than one value in the list, the end-style value applies to the port that corresponds to the list index.The following suggested items should be utilized whenever possible for correlation with port enumerations:\X2\000A\X0\FLANGED: Flanged. \X2\000A\X0\GROOVED: Grooved. \X2\000A\X0\THREADED: Threaded. \X2\000A\X0\NONE: No end-style has been applied.\X2\000A\X0\NOTDEFINED: Undefined end-style type. ',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1025=IFCPROPERTYSETTEMPLATE('0Gkjq5Y5H4RgUWSgvOQ5sQ',$,'Pset_PipeSegmentTypeGutter','Definition from IAI: Gutter segment type common attributes.\X2\000A\X0\',$,'IfcPipeSegmentType',(#1026,#1027)); +#1025=IFCPROPERTYSETTEMPLATE('0Gkjq5Y5H4RgUWSgvOQ5sQ',$,'Pset_PipeSegmentTypeGutter','Definition from IAI: Gutter segment type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeSegmentType',(#1026,#1027)); #1026=IFCSIMPLEPROPERTYTEMPLATE('0ebSoh8CL3cwWh5GnySNos',$,'Slope','Angle of the gutter to allow for drainage ',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); #1027=IFCSIMPLEPROPERTYTEMPLATE('0awoB8Suv7nxoZ9mSdNvld',$,'FlowRating','Actual flow capacity for the gutter. Value of 0.00 means this value has not been set. ',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1028=IFCPROPERTYSETTEMPLATE('1BBPKFDznDOfWGrL2v1ott',$,'Pset_ProjectionElementShadingDevicePHistory','Definition from IAI: Shading device performance history attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#1029,#1030)); +#1028=IFCPROPERTYSETTEMPLATE('1BBPKFDznDOfWGrL2v1ott',$,'Pset_ProjectionElementShadingDevicePHistory','Definition from IAI: Shading device performance history attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#1029,#1030)); #1029=IFCSIMPLEPROPERTYTEMPLATE('1CFW1EOHLFrwMrPKZc8b6r',$,'TiltAngle','The angle of tilt defined in the plane perpendicular to the extrusion axis (X-Axis of the local placement). The angle shall be measured from the orientation of the Z-Axis in the local placement.',.P_REFERENCEVALUE.,'IfcTimeSeries','IfcTimeSeriesValue',$,$,$,$,.READWRITE.); #1030=IFCSIMPLEPROPERTYTEMPLATE('3lXdnudsbF6AtsZCeJ33kp',$,'Azimuth','The azimuth of the outward normal for the outward or upward facing surface.',.P_REFERENCEVALUE.,'IfcTimeSeries','IfcTimeSeriesValue',$,$,$,$,.READWRITE.); -#1031=IFCPROPERTYSETTEMPLATE('390BHSeoX08gddhA20S9De',$,'Pset_PumpPHistory','Definition from IAI: Pump performance history attributes.',$,'IfcPerformanceHistory',(#1032,#1033,#1034,#1035,#1036,#1037)); +#1031=IFCPROPERTYSETTEMPLATE('390BHSeoX08gddhA20S9De',$,'Pset_PumpPHistory','Definition from IAI: Pump performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#1032,#1033,#1034,#1035,#1036,#1037)); #1032=IFCSIMPLEPROPERTYTEMPLATE('21Qr8lLtT7LAN4CItXOoUe',$,'MechanicalEfficiency','The pumps operational mechanical efficiency.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #1033=IFCSIMPLEPROPERTYTEMPLATE('0kufNxpAr2hed2lpYXrJ7f',$,'OverallEfficiency','The pump and motor overall operational efficiency.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #1034=IFCSIMPLEPROPERTYTEMPLATE('3ZTLRxTWDByhCZn3l6v30S',$,'PressureRise','The developed pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); #1035=IFCSIMPLEPROPERTYTEMPLATE('0Dnqvia3f3yA5NSZ$dIfC6',$,'RotationSpeed','Pump rotational speed.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCROTATIONALFREQUENCYMEASURE',$,$,$,$,.READWRITE.); #1036=IFCSIMPLEPROPERTYTEMPLATE('3OeUzCSaD7ZQ5HWFwjaXUw',$,'Flowrate','The actual operational fluid flowrate.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #1037=IFCSIMPLEPROPERTYTEMPLATE('0NkaLd0KX3WuO$EE1VQHGp',$,'Power','The actual power consumption of the pump.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOWERMEASURE',$,$,$,$,.READWRITE.); -#1038=IFCPROPERTYSETTEMPLATE('2xbphS04zFCRbDT_6Su1pL',$,'Pset_PumpTypeCommon','Definition from IAI: Common attributes of a pump type.',$,'IfcPumpType',(#1039,#1040,#1041,#1042,#1043,#1044,#1045,#1046,#1047)); +#1038=IFCPROPERTYSETTEMPLATE('2xbphS04zFCRbDT_6Su1pL',$,'Pset_PumpTypeCommon','Definition from IAI: Common attributes of a pump type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPumpType',(#1039,#1040,#1041,#1042,#1043,#1044,#1045,#1046,#1047)); #1039=IFCSIMPLEPROPERTYTEMPLATE('1_TrSIZBDEVvSilL4RRiAc',$,'FlowRateRange','Allowable range of volume of fluid being pumped against the resistance specified.',.P_BOUNDEDVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); #1040=IFCSIMPLEPROPERTYTEMPLATE('0Xt$GfAob6V8praLGRcSdq',$,'FlowResistanceRange','Allowable range of frictional resistance against which the fluid is being pumped',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #1041=IFCSIMPLEPROPERTYTEMPLATE('11Q5W7Hcv7PwjXNbglR43K',$,'ConnectionSize','The connection size of the to and from the pump',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1052,7 +1052,7 @@ DATA; #1045=IFCSIMPLEPROPERTYTEMPLATE('1uLz9lIdb0FuOm6kgVDb3e',$,'TemperatureRange','Allowable operational range of the fluid temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #1046=IFCSIMPLEPROPERTYTEMPLATE('3An4JRNaz7vBsaa4nLkeFI',$,'NetPositiveSuctionHead','Minimum liquid pressure at the pump inlet to prevent cavitation. ',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #1047=IFCSIMPLEPROPERTYTEMPLATE('0lRup9MoP2vAyKmseuifA6',$,'NominalRotationSpeed','Pump rotational speed under nominal conditions.',.P_SINGLEVALUE.,'IfcRotationalFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#1048=IFCPROPERTYSETTEMPLATE('2uR0e0NvL32OXZ__Vos$__',$,'Pset_SpaceHeaterPHistoryCommon','Definition from IAI: Space heater performance history common attributes.\X2\000A\X0\',$,'IfcPerformanceHistory',(#1049,#1050,#1051,#1052,#1053,#1054,#1055,#1056,#1057,#1058,#1059,#1060)); +#1048=IFCPROPERTYSETTEMPLATE('2uR0e0NvL32OXZ__Vos$__',$,'Pset_SpaceHeaterPHistoryCommon','Definition from IAI: Space heater performance history common attributes.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#1049,#1050,#1051,#1052,#1053,#1054,#1055,#1056,#1057,#1058,#1059,#1060)); #1049=IFCSIMPLEPROPERTYTEMPLATE('3AzIoB9cn92R5_46TUz1nY',$,'FractionRadiantHeatTransfer','Fraction of the total heat transfer rate as the radiant heat transfer.',.P_REFERENCEVALUE.,'IfcTimeSeries','IfcReal',$,$,$,$,.READWRITE.); #1050=IFCSIMPLEPROPERTYTEMPLATE('2KDSnj6rb80gZa6eNPcF_f',$,'FractionConvectiveHeatTransfer','Fraction of the total heat transfer rate as the convective heat transfer.',.P_REFERENCEVALUE.,'IfcTimeSeries','IfcReal',$,$,$,$,.READWRITE.); #1051=IFCSIMPLEPROPERTYTEMPLATE('17VLQuhhDDfRcOTZzklwnP',$,'Effectiveness','Ratio of the real heat transfer rate to the maximum possible heat transfer rate.',.P_REFERENCEVALUE.,'IfcTimeSeries','IfcReal',$,$,$,$,.READWRITE.); @@ -1065,7 +1065,7 @@ DATA; #1058=IFCSIMPLEPROPERTYTEMPLATE('3Yr1Ilsnj8ze38fkLMfXJA',$,'AirResistanceCurve','Air resistance curve (w/ fan only); Pressure = f ( flow rate).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #1059=IFCSIMPLEPROPERTYTEMPLATE('0kpbjXTKX7pAIyCXE512U4',$,'Exponent','Characteristic exponent, slope of log(heat output) vs log (surface temperature minus environmental temperature).',.P_REFERENCEVALUE.,'IfcTimeSeries','IfcReal',$,$,$,$,.READWRITE.); #1060=IFCSIMPLEPROPERTYTEMPLATE('2Jzw$nOZb3sw0dYDxR_yOu',$,'HeatOutputRate','Overall heat transfer rate.',.P_REFERENCEVALUE.,'IfcTimeSeries','IfcPowerMeasure',$,$,$,$,.READWRITE.); -#1061=IFCPROPERTYSETTEMPLATE('1fY65MKL9E_8T7I8pRdMad',$,'Pset_SpaceHeaterTypeCommon','Definition from IAI: Space heater type common attributes.\X2\000A\X0\SoundLevel attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',$,'IfcSpaceHeaterType',(#1062,#1064,#1066,#1067,#1068,#1069,#1070)); +#1061=IFCPROPERTYSETTEMPLATE('1fY65MKL9E_8T7I8pRdMad',$,'Pset_SpaceHeaterTypeCommon','Definition from IAI: Space heater type common attributes.\X2\000A\X0\SoundLevel attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpaceHeaterType',(#1062,#1064,#1066,#1067,#1068,#1069,#1070)); #1062=IFCSIMPLEPROPERTYTEMPLATE('3JZoegwsH1avSJL6bx0Iw6',$,'TemperatureClassification','Enumeration defining the temperature classification of the space heater surface temperature.\X2\000A\X0\low temperature - surface temperature is relatively low, usually heated by hot water or electricity.\X2\000A\X0\high temperature - surface temperature is relatively high, usually heated by gas or steam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1063,$,$,$,.READWRITE.); #1063=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterTemperatureClassification',(IFCLABEL('LOWTEMPERATURE'),IFCLABEL('HIGHTEMPERATURE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1064=IFCSIMPLEPROPERTYTEMPLATE('2W3JFV07T8vuEZLnA$msBC',$,'HeatingSource','Enumeration defining the heating source used by the space heater.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1065,$,$,$,.READWRITE.); @@ -1075,17 +1075,17 @@ DATA; #1068=IFCSIMPLEPROPERTYTEMPLATE('1uRifiTyr3XfoP7mibdzib',$,'ThermalMassHeatCapacity','Product of component mass and specific heat',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #1069=IFCSIMPLEPROPERTYTEMPLATE('1u9kQ1InrD3RYQdCOcCCu7',$,'OutputCapacity','Total nominal heat output as listed by the manufacturer.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #1070=IFCSIMPLEPROPERTYTEMPLATE('0yxxgljN5AhO9xnimpkAnJ',$,'ThermalEfficiency','Overall Thermal Efficiency is defined as gross energy output of the heat transfer device divided by the energy input.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1071=IFCPROPERTYSETTEMPLATE('20E2r1$tn4FuqKqSkKvBNu',$,'Pset_SpaceHeaterTypeHydronic','Definition from IAI: Hydronic space heater type common attributes.\X2\000A\X0\WaterProperties attribute deleted in IFC2x2 Pset Addendum: Use IfcWaterProperties instead.',$,'IfcSpaceHeaterType',(#1072,#1073)); +#1071=IFCPROPERTYSETTEMPLATE('20E2r1$tn4FuqKqSkKvBNu',$,'Pset_SpaceHeaterTypeHydronic','Definition from IAI: Hydronic space heater type common attributes.\X2\000A\X0\WaterProperties attribute deleted in IFC2x2 Pset Addendum: Use IfcWaterProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpaceHeaterType',(#1072,#1073)); #1072=IFCSIMPLEPROPERTYTEMPLATE('2ly0s9TBf178VFXqCxBZNX',$,'TubingLength','Water tube length inside the component.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #1073=IFCSIMPLEPROPERTYTEMPLATE('30K80RlhXDqeFagD1uH$ua',$,'WaterContent','Weight of water content within the heater.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1074=IFCPROPERTYSETTEMPLATE('0qXanxBTH25Av$MSHuhope',$,'Pset_SpaceThermalPHistory','Definition from IAI: Thermal and air flow conditions of a space or zone. HISTORY: New property set in IFC 2x2.',$,'IfcPerformanceHistory',(#1075,#1076,#1077,#1078,#1079,#1080)); +#1074=IFCPROPERTYSETTEMPLATE('0qXanxBTH25Av$MSHuhope',$,'Pset_SpaceThermalPHistory','Definition from IAI: Thermal and air flow conditions of a space or zone. HISTORY: New property set in IFC 2x2.',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#1075,#1076,#1077,#1078,#1079,#1080)); #1075=IFCSIMPLEPROPERTYTEMPLATE('2stOi7ZlnF7xMpFjhq3Czc',$,'CoolingAirFlowRate','Cooling air flow rate in the space. ',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #1076=IFCSIMPLEPROPERTYTEMPLATE('2JCJqmNozAa9RN1pioz22q',$,'HeatingAirFlowRate','Heating air flow rate in the space. ',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #1077=IFCSIMPLEPROPERTYTEMPLATE('3LfFIilpX4IAIBqdlK_mW5',$,'VentilationAirFlowRate','Ventilation air flow rate in the space. ',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #1078=IFCSIMPLEPROPERTYTEMPLATE('0lKbLwCmf6SwniabXSCZ_j',$,'ExhaustAirFlowRate','Exhaust air flow rate in the space. ',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMETRICFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #1079=IFCSIMPLEPROPERTYTEMPLATE('0xgx8YYgLD9P0HsozjH2ni',$,'SpaceTemperature','Temperature of the space. ',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCTHERMODYNAMICTEMPERATUREMEASURE',$,$,$,$,.READWRITE.); #1080=IFCSIMPLEPROPERTYTEMPLATE('1fIgi6TdX4xhxvwaeRG6md',$,'SpaceRelativeHumidity','The relative humidity of the space.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPOSITIVERATIOMEASURE',$,$,$,$,.READWRITE.); -#1081=IFCPROPERTYSETTEMPLATE('34xl0ut0T0UeibpTmRD9ll',$,'Pset_TankTypeCommon','Definition from IAI: Common attributes of a tank type.',$,'IfcTankType',(#1082,#1084,#1086,#1087,#1088,#1089,#1090,#1091,#1092,#1093)); +#1081=IFCPROPERTYSETTEMPLATE('34xl0ut0T0UeibpTmRD9ll',$,'Pset_TankTypeCommon','Definition from IAI: Common attributes of a tank type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTankType',(#1082,#1084,#1086,#1087,#1088,#1089,#1090,#1091,#1092,#1093)); #1082=IFCSIMPLEPROPERTYTEMPLATE('1yHQFyNkj4oBq4EUulwy6M',$,'Type','Defines the types of tank that may be specified where: \X2\000A000A\X0\BreakPressure =\X2\0009\X0\ Tank that breaks the hydraulic pressure in a distribution system\X2\000A\X0\Expansion =\X2\0009\X0\ Tank, connected to the primary circuit of a hot water system that accommodates increase in volume of the water when heated\X2\000A\X0\FeedAndExpansion =\X2\0009\X0\ Tank that supplies cold water to a hot water system and also accommodates increase in volume of the water when heated\X2\000A\X0\GasStorage_Butane =\X2\0009\X0\ Main tank to which commercial butane is delivered and from which it is supplied to a gas distribution system.\X2\000A\X0\GasStorage_LPG =\X2\0009\X0\ Main tank to which liquefied petroleum gas is delivered and from which it is supplied to a gas distribution system.\X2\000A\X0\GasStorage_Propane =\X2\0009\X0\ Main tank to which commercial propane is delivered and from which it is supplied to a gas distribution system.\X2\000A\X0\OilService =\X2\0009\X0\ Secondary tank from which oil fuel is fed to a single oil fuel burning appliance\X2\000A\X0\OilStorage =\X2\0009\X0\ Main tank to which oil fuel is delivered and from which it is supplied to an oil fuel burning appliance or oil service tank.\X2\000A\X0\PressureVessel = Tank that stores fluid under pressure.\X2\000A\X0\WaterStorage_General =\X2\0009\X0\ Tank that stores water sufficient to meet general requirements for a designated period of time and supplies it to points of outlet\X2\000A\X0\WaterStorage_Potable =\X2\0009\X0\ Tank that stores water sufficient to meet potable water requirements for a designated period of time and supplies it to points of outlet\X2\000A\X0\WaterStorage_Process =\X2\0009\X0\ Tank that stores water sufficient to meet process and/or production requirements for a designated period of time and supplies it to points of outlet\X2\000A\X0\WaterStorage_CoolingTowerMakeup =\X2\0009\X0\ Tank that stores water sufficient to meet cooling tower make up water requirements for a designated period of time and supplies it to points of outlet\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1083,$,$,$,.READWRITE.); #1083=IFCPROPERTYENUMERATION('PEnum_TankType',(IFCLABEL('BREAKPRESSURE'),IFCLABEL('EXPANSION'),IFCLABEL('FEEDANDEXPANSION'),IFCLABEL('GASSTORAGEBUTANE'),IFCLABEL('GASSTORAGELIQUIFIEDPETROLEUMGAS'),IFCLABEL('GASSTORAGEPROPANE'),IFCLABEL('OILSERVICE'),IFCLABEL('OILSTORAGE'),IFCLABEL('PRESSUREVESSEL'),IFCLABEL('WATERSTORAGEGENERAL'),IFCLABEL('WATERSTORAGEPOTABLE'),IFCLABEL('WATERSTORAGEPROCESS'),IFCLABEL('WATERSTORAGECOOLINGTOWERMAKEUP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1084=IFCSIMPLEPROPERTYTEMPLATE('3siS99iwn3mfn1IIGR6rlE',$,'AccessType','Defines the types of access (or cover) to a tank that may be specified.\X2\000A000A\X0\Note that covers are generally specified for rectangular tanks. For cylindrical tanks, access will normally be via a manhole.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1085,$,$,$,.READWRITE.); @@ -1098,26 +1098,26 @@ DATA; #1091=IFCSIMPLEPROPERTYTEMPLATE('2qaoe8GHj99fgJSyXW_xC1',$,'OperatingWeight','Operating weight of the tank including all of its contents.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); #1092=IFCSIMPLEPROPERTYTEMPLATE('25PBFp4jfAvP7OUH4BDMed',$,'Material','Material from which the tank is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1093=IFCSIMPLEPROPERTYTEMPLATE('0BxGdvIA18HwtCXInKI4wb',$,'MaterialThickness','Thickness of the material from which the tank is constructed',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1094=IFCPROPERTYSETTEMPLATE('20rMKRPenE68wNEhY_xUzX',$,'Pset_TankTypeExpansion','Definition from IAI: Common attributes of an expansion type tank.',$,'IfcTankType',(#1095,#1096,#1097)); +#1094=IFCPROPERTYSETTEMPLATE('20rMKRPenE68wNEhY_xUzX',$,'Pset_TankTypeExpansion','Definition from IAI: Common attributes of an expansion type tank.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTankType',(#1095,#1096,#1097)); #1095=IFCSIMPLEPROPERTYTEMPLATE('3NWnAkdvLBpvJLoFPhFOEM',$,'ChargePressure','Nominal or design operating pressure of the tank. ',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #1096=IFCSIMPLEPROPERTYTEMPLATE('1JxFlxYRXCduh2f6kJY3JU',$,'PressureRegulatorSetting','Pressure that is automatically maintained in the tank. ',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #1097=IFCSIMPLEPROPERTYTEMPLATE('1DcqgEXNH5qggIZMEgYZhv',$,'ReliefValveSetting','Pressure at which the relief valve activates. ',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1098=IFCPROPERTYSETTEMPLATE('2AKdDVlNH2Tv9JvTWNDTKJ',$,'Pset_TankTypePreformed','Definition from IAI: Fixed vessel manufactured as a single unit with one or more compartments for storing a liquid.\X2\000A000A\X0\Pset renamed from Pset_TankTypePreformedTank to Pset_TankTypePreformed in IFC2x2 Pset Addendum.',$,'IfcTankType',(#1099,#1101,#1103,#1104)); +#1098=IFCPROPERTYSETTEMPLATE('2AKdDVlNH2Tv9JvTWNDTKJ',$,'Pset_TankTypePreformed','Definition from IAI: Fixed vessel manufactured as a single unit with one or more compartments for storing a liquid.\X2\000A000A\X0\Pset renamed from Pset_TankTypePreformedTank to Pset_TankTypePreformed in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTankType',(#1099,#1101,#1103,#1104)); #1099=IFCSIMPLEPROPERTYTEMPLATE('2$$3idrb50jA5MSx184gn4',$,'PatternType','Defines the types of pattern (or shape of a tank that may be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1100,$,$,$,.READWRITE.); #1100=IFCPROPERTYENUMERATION('PEnum_TankPatternType',(IFCLABEL('HORIZONTALCYLINDER'),IFCLABEL('VERTICALCYLINDER'),IFCLABEL('RECTANGULAR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1101=IFCSIMPLEPROPERTYTEMPLATE('01YsBiFOHCTf2ehlWg6p1f',$,'EndShapeType','Defines the types of end shapes that can be used for preformed tanks. The convention for reading these enumerated values is that for a vertical cylinder, the first value is the base and the second is the top; for a horizontal cylinder, the order of reading should be left to right. For a speherical tank, the value UNSET should be used.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1102,$,$,$,.READWRITE.); #1102=IFCPROPERTYENUMERATION('PEnum_EndShapeType',(IFCLABEL('CONCAVECONVEX'),IFCLABEL('FLATCONVEX'),IFCLABEL('CONVEXCONVEX'),IFCLABEL('CONCAVEFLAT'),IFCLABEL('FLATFLAT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET\X2\000A\X0\')),$); #1103=IFCSIMPLEPROPERTYTEMPLATE('1ZPdjeDmX5eO4wasWMhFKz',$,'FirstCurvatureRadius','FirstCurvatureRadius should be defined as the base or left side radius of curvature value.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1104=IFCSIMPLEPROPERTYTEMPLATE('0IiaMqMV9BrQZK3TukeEEc',$,'SecondCurvatureRadius','SecondCurvatureRadius should be defined as the top or right side radius of curvature value.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1105=IFCPROPERTYSETTEMPLATE('1uXoy$$x5FCRCpdnPlhWRW',$,'Pset_TankTypePressureVessel','Definition from IAI: Common attributes of a pressure vessel.',$,'IfcTankType',(#1106,#1107,#1108)); +#1105=IFCPROPERTYSETTEMPLATE('1uXoy$$x5FCRCpdnPlhWRW',$,'Pset_TankTypePressureVessel','Definition from IAI: Common attributes of a pressure vessel.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTankType',(#1106,#1107,#1108)); #1106=IFCSIMPLEPROPERTYTEMPLATE('0da6C6QfnFSBdqeqPGWNDi',$,'ChargePressure','Nominal or design operating pressure of the tank. ',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #1107=IFCSIMPLEPROPERTYTEMPLATE('1M3WhFhgP0w9BlL97aeGFp',$,'PressureRegulatorSetting','Pressure that is automatically maintained in the tank. ',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #1108=IFCSIMPLEPROPERTYTEMPLATE('2B8uzdbX1F6fKAyKwJ0YPi',$,'ReliefValveSetting','Pressure at which the relief valve activates. ',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1109=IFCPROPERTYSETTEMPLATE('1TrplXo551nf9YWkVXUbIu',$,'Pset_TankTypeSectional','Definition from IAI: Fixed vessel constructed from sectional parts with one or more compartments for storing a liquid.\X2\000A000A\X0\Note (1): All sectional construction tanks are considered to be rectangular by default.\X2\000A\X0\Note (2): Generally, it is not expected that sectional construction tanks will be used for the purposes of gas storage.\X2\000A000A\X0\Pset renamed from Pset_TankTypeSectionalTank to Pset_TankTypeSectional in IFC2x2 Pset Addendum.',$,'IfcTankType',(#1110,#1111,#1112)); +#1109=IFCPROPERTYSETTEMPLATE('1TrplXo551nf9YWkVXUbIu',$,'Pset_TankTypeSectional','Definition from IAI: Fixed vessel constructed from sectional parts with one or more compartments for storing a liquid.\X2\000A000A\X0\Note (1): All sectional construction tanks are considered to be rectangular by default.\X2\000A\X0\Note (2): Generally, it is not expected that sectional construction tanks will be used for the purposes of gas storage.\X2\000A000A\X0\Pset renamed from Pset_TankTypeSectionalTank to Pset_TankTypeSectional in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTankType',(#1110,#1111,#1112)); #1110=IFCSIMPLEPROPERTYTEMPLATE('1Te5FOGKjFyeYILaii658n',$,'NumberOfSections','Number of sections used in the construction of the tank\X2\000A000A\X0\Note: All sections assumed to be the same size.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #1111=IFCSIMPLEPROPERTYTEMPLATE('02MohtjlzDef4peBknt$Q2',$,'SectionLength','The length of a section used in the construction of the tank',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1112=IFCSIMPLEPROPERTYTEMPLATE('0qzXsyBJrDTfT_fuVgV8oy',$,'SectionWidth','The width of a section used in the construction of the tank.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1113=IFCPROPERTYSETTEMPLATE('22A7wbxHv6ufYxv6E7RBhW',$,'Pset_TubeBundleTypeCommon','Definition from IAI: Tube bundle type common attributes.\X2\000A\X0\',$,'IfcTubeBundleType',(#1114,#1115,#1116,#1117,#1118,#1119,#1120,#1121,#1122,#1123,#1124,#1125,#1126,#1127,#1128)); +#1113=IFCPROPERTYSETTEMPLATE('22A7wbxHv6ufYxv6E7RBhW',$,'Pset_TubeBundleTypeCommon','Definition from IAI: Tube bundle type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcTubeBundleType',(#1114,#1115,#1116,#1117,#1118,#1119,#1120,#1121,#1122,#1123,#1124,#1125,#1126,#1127,#1128)); #1114=IFCSIMPLEPROPERTYTEMPLATE('1ftS6toSv1EfhnrEVFNoJ9',$,'NumberOfRows','Number of tube rows in the tube bundle assembly.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #1115=IFCSIMPLEPROPERTYTEMPLATE('0YI6ziKYvC0QLYqb$RiiEl',$,'StaggeredRowSpacing','Staggered tube row spacing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1116=IFCSIMPLEPROPERTYTEMPLATE('3Z_ranHjH0cBhMTYyBK_I5',$,'InLineRowSpacing','In-line tube row spacing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1133,7 +1133,7 @@ DATA; #1126=IFCSIMPLEPROPERTYTEMPLATE('1A$fyLi_5FaB1$hotwqDK2',$,'VerticalSpacing','Vertical spacing between tubes in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1127=IFCSIMPLEPROPERTYTEMPLATE('2Kyqo_yZX0gOUBmWEz6t8A',$,'Material','Material used for construction of the tubes.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1128=IFCSIMPLEPROPERTYTEMPLATE('288taIhcn16wFJdhB1tK$A',$,'HasTurbulator','TRUE if the tube has a turbulator, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1129=IFCPROPERTYSETTEMPLATE('0MXGb7V1D7lBAaFpLqZGKF',$,'Pset_TubeBundleTypeFinned','Definition from IAI: Finned tube bundle type attributes.\X2\000A\X0\Contains the attributes related to the fins attached to a tube in a finned tube bundle such as is commonly found in coils.\X2\000A\X0\',$,'IfcTubeBundleType',(#1130,#1131,#1132,#1133,#1134,#1135,#1136,#1137,#1138)); +#1129=IFCPROPERTYSETTEMPLATE('0MXGb7V1D7lBAaFpLqZGKF',$,'Pset_TubeBundleTypeFinned','Definition from IAI: Finned tube bundle type attributes.\X2\000A\X0\Contains the attributes related to the fins attached to a tube in a finned tube bundle such as is commonly found in coils.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcTubeBundleType',(#1130,#1131,#1132,#1133,#1134,#1135,#1136,#1137,#1138)); #1130=IFCSIMPLEPROPERTYTEMPLATE('36PSf78OL1W8GxSaDAnICI',$,'Spacing','Distance between fins on a tube in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1131=IFCSIMPLEPROPERTYTEMPLATE('20YINZOCXCOvdxbMYkXQyv',$,'Thickness','Thickness of the fin.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1132=IFCSIMPLEPROPERTYTEMPLATE('2BKlEr1AD7duYGuVDvs1q2',$,'ThermalConductivity','The thermal conductivity of the fin.',.P_SINGLEVALUE.,'IfcThermalConductivityMeasure',$,$,$,$,$,.READWRITE.); @@ -1143,7 +1143,7 @@ DATA; #1136=IFCSIMPLEPROPERTYTEMPLATE('2Z3VQxrlD0BwjGGtLPJZPv',$,'Material','Material used for construction of the fins.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1137=IFCSIMPLEPROPERTYTEMPLATE('3w$n8zOxbAnQxgPLyu$BD0',$,'FinCorrugatedType','Description of a fin corrugated type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1138=IFCSIMPLEPROPERTYTEMPLATE('07i5Xlti15qPrlIxmr9Xfd',$,'HasCoating','TRUE if the fin has a coating, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1139=IFCPROPERTYSETTEMPLATE('3InpMfa6L2Vg5$Wz9yJrlG',$,'Pset_UnitaryEquipmentTypeAirConditioningUnit','Definition from IAI: Air conditioning unit equipment type attributes.\X2\000A\X0\Note that these attributes were formely Pset_PackagedACUnit prior to IFC2x2.\X2\000A\X0\HeatingEnergySource attribute deleted in IFC2x2 Pset Addendum: Use IfcEnergyProperties, IfcFuelProperties, etc. instead.',$,'IfcUnitaryEquipmentType',(#1140,#1141,#1142,#1143,#1144,#1145,#1146,#1147,#1148)); +#1139=IFCPROPERTYSETTEMPLATE('3InpMfa6L2Vg5$Wz9yJrlG',$,'Pset_UnitaryEquipmentTypeAirConditioningUnit','Definition from IAI: Air conditioning unit equipment type attributes.\X2\000A\X0\Note that these attributes were formely Pset_PackagedACUnit prior to IFC2x2.\X2\000A\X0\HeatingEnergySource attribute deleted in IFC2x2 Pset Addendum: Use IfcEnergyProperties, IfcFuelProperties, etc. instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryEquipmentType',(#1140,#1141,#1142,#1143,#1144,#1145,#1146,#1147,#1148)); #1140=IFCSIMPLEPROPERTYTEMPLATE('0J3TZh24j23R7ugFScVZUP',$,'SensibleCoolingCapacity','Sensible cooling capacity of the PackagedACUnit per ARI Standards 210/240, 270, 275, 360, 340 and 365. ',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #1141=IFCSIMPLEPROPERTYTEMPLATE('1Ugu0J8$L9bORcajgpQOjo',$,'LatentCoolingCapacity','Latent cooling capacity of the PackagedACUnit per ARI Standards 210/240, 270, 275, 360, 340 and 365. ',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #1142=IFCSIMPLEPROPERTYTEMPLATE('2MHmBzlV5Fpep7i9sUTz0v',$,'CoolingEfficiency','Coefficient of Performance: Ratio of cooling energy output to energy input under full load operating conditions per ARI Standards 210/240, 270, 275, 360, 340 and 365. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); @@ -1153,19 +1153,19 @@ DATA; #1146=IFCSIMPLEPROPERTYTEMPLATE('2dAZiaBtb5TufdzccDt_AQ',$,'CondenserEnteringTemperature','Temperature of fluid entering condenser per manufacturer''s listing (if available) ',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #1147=IFCSIMPLEPROPERTYTEMPLATE('2m1wMqJ3HEQe1$hUog1qYj',$,'CondenserLeavingTemperature','Termperature of fluid leaving condenser per manufacturer''s listing (if available) ',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #1148=IFCSIMPLEPROPERTYTEMPLATE('07WA3IPXH2LBVBKMKJfcY$',$,'OutsideAirFlowrate','Flow rate of outside air entering the PackagedACUnit per the manufacturer''s listing (if available) ',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1149=IFCPROPERTYSETTEMPLATE('0vsrmzilTEtObiToetppsG',$,'Pset_UnitaryEquipmentTypeAirHandler','Definition from IAI: Air handler unitary equipment type attributes.\X2\000A\X0\Note that these attributes were formerly Pset_AirHandler prior to IFC2x2.\X2\000A\X0\',$,'IfcUnitaryEquipmentType',(#1150,#1152,#1154)); +#1149=IFCPROPERTYSETTEMPLATE('0vsrmzilTEtObiToetppsG',$,'Pset_UnitaryEquipmentTypeAirHandler','Definition from IAI: Air handler unitary equipment type attributes.\X2\000A\X0\Note that these attributes were formerly Pset_AirHandler prior to IFC2x2.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryEquipmentType',(#1150,#1152,#1154)); #1150=IFCSIMPLEPROPERTYTEMPLATE('20jY7fc3fD_xbInDrignAL',$,'AirHandlerConstruction','Enumeration defining how the air handler might be fabricated. ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1151,$,$,$,.READWRITE.); #1151=IFCPROPERTYENUMERATION('PEnum_AirHandlerConstruction',(IFCLABEL('MANUFACTUREDITEM'),IFCLABEL('CONSTRUCTEDONSITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1152=IFCSIMPLEPROPERTYTEMPLATE('2w_M1PTZv9mgVKoXp4qNA6',$,'AirHandlerFanCoilArrangement','Enumeration defining the arrangement of the supply air fan and the cooling coil. ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1153,$,$,$,.READWRITE.); #1153=IFCPROPERTYENUMERATION('PEnum_AirHandlerFanCoilArrangement',(IFCLABEL('BLOWTHROUGH'),IFCLABEL('DRAWTHROUGH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1154=IFCSIMPLEPROPERTYTEMPLATE('2RYnNYiUbC2xRkGwd2S0Xl',$,'DualDeck','Does the AirHandler have a dual deck? TRUE = Yes, FALSE = No. ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1155=IFCPROPERTYSETTEMPLATE('2Q41ym3KHETgxnlfbdg0gH',$,'Pset_ValvePHistory','Definition from IAI: Valve performance history common attributes of a typical 2 port pattern type valve.\X2\000A\X0\',$,'IfcPerformanceHistory',(#1156,#1157,#1158)); +#1155=IFCPROPERTYSETTEMPLATE('2Q41ym3KHETgxnlfbdg0gH',$,'Pset_ValvePHistory','Definition from IAI: Valve performance history common attributes of a typical 2 port pattern type valve.\X2\000A\X0\',.PSET_PERFORMANCEDRIVEN.,'IfcPerformanceHistory',(#1156,#1157,#1158)); #1156=IFCSIMPLEPROPERTYTEMPLATE('1Z03FKM5P9vhYb513ksBqg',$,'PercentageOpen','The ratio between the amount that the valve is open to the full open position of the valve.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCRATIOMEASURE',$,$,$,$,.READWRITE.); #1157=IFCSIMPLEPROPERTYTEMPLATE('35F4bWHsn23uWvpHpXHbQb',$,'MeasuredFlowRate','The rate of flow of a fluid measured across the valve.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCMASSFLOWRATEMEASURE',$,$,$,$,.READWRITE.); #1158=IFCSIMPLEPROPERTYTEMPLATE('0t3w3Twxz6dPBmPKh8x0Ng',$,'MeasuredPressureDrop','The actual pressure drop in the fluid measured across the valve.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCPRESSUREMEASURE',$,$,$,$,.READWRITE.); -#1159=IFCPROPERTYSETTEMPLATE('0z3N6796n4c9KeTc4_4aNI',$,'Pset_ValveTypeAirRelease','Definition from IAI: Valve used to release air from a pipe or fitting. \X2\000A\X0\Note that an air release valve is constrained to have a single port pattern\X2\000A\X0\',$,'IfcValveType',(#1160)); +#1159=IFCPROPERTYSETTEMPLATE('0z3N6796n4c9KeTc4_4aNI',$,'Pset_ValveTypeAirRelease','Definition from IAI: Valve used to release air from a pipe or fitting. \X2\000A\X0\Note that an air release valve is constrained to have a single port pattern\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcValveType',(#1160)); #1160=IFCSIMPLEPROPERTYTEMPLATE('1PFcrCtQn1mxeCikhIE4Lu',$,'IsAutomatic','Indication of whether the valve is automatically operated (TRUE) or manually operated (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1161=IFCPROPERTYSETTEMPLATE('2KWvfyXvXA4O2_cNx1cjwt',$,'Pset_ValveTypeCommon','Definition from IAI: Valve type common attributes.\X2\000A\X0\',$,'IfcValveType',(#1162,#1164,#1166,#1168,#1169,#1170,#1171,#1172,#1173,#1174)); +#1161=IFCPROPERTYSETTEMPLATE('2KWvfyXvXA4O2_cNx1cjwt',$,'Pset_ValveTypeCommon','Definition from IAI: Valve type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcValveType',(#1162,#1164,#1166,#1168,#1169,#1170,#1171,#1172,#1173,#1174)); #1162=IFCSIMPLEPROPERTYTEMPLATE('0Vtv3zCYrCFgMhNZabAV25',$,'ValvePattern','The configuration of the ports of a valve according to either the linear route taken by a fluid flowing through the valve or by the number of ports where:\X2\000A000A\X0\SINGLEPORT = Valve that has a single entry port from the system that it serves, the exit port being to the surrounding environment.\X2\000A\X0\ANGLED_2_PORT = Valve in which the direction of flow is changed through 90 degrees\X2\000A\X0\STRAIGHT_2_PORT = Valve in which the flow is straight through\X2\000A\X0\STRAIGHT_3_PORT = Valve with three separate ports\X2\000A\X0\CROSSOVER_4_PORT = Valve with 4 separate ports\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1163,$,$,$,.READWRITE.); #1163=IFCPROPERTYENUMERATION('PEnum_ValvePattern',(IFCLABEL('SINGLEPORT'),IFCLABEL('ANGLED_2_PORT'),IFCLABEL('STRAIGHT_2_PORT'),IFCLABEL('STRAIGHT_3_PORT'),IFCLABEL('CROSSOVER_4_PORT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1164=IFCSIMPLEPROPERTYTEMPLATE('1Fv8j5r5TDUeEBrXXZIeqI',$,'ValveOperation','The method of valve operation where:\X2\000A000A\X0\DROPWEIGHT = A valve that is closed by the action of a weighted lever being released, the weight normally being prevented from dropping by being held by a wire, the closure normally being made by the action of heat on a fusible link in the wire\X2\000A\X0\FLOAT = A valve that is opened and closed by the action of a float that rises and falls with water level. The float may be a ball attached to a lever or other mechanism\X2\000A\X0\HYDRAULIC = A valve that is opened and closed by hydraulic actuation\X2\000A\X0\LEVER = A valve that is opened and closed by the action of a lever rotating the gate within the valve.\X2\000A\X0\LOCKSHIELD = A valve that requires the use of a special lockshield key for opening and closing, the operating mechanism being protected by a shroud during normal operation.\X2\000A\X0\MOTORIZED = A valve that is opened and closed by the action of an electric motor on an actuator\X2\000A\X0\PNEUMATIC = A valve that is opened and closed by pneumatic actuation\X2\000A\X0\SOLENOID = A valve that is normally held open by a magnetic field in a coil acting on the gate but that is closed immediately if the electrical current generating the magnetic field is removed. \X2\000A\X0\SPRING = A valve that is normally held in position by the pressure of a spring on a plate but that may be caused to open if the pressure of the fluid is sufficient to overcome the spring pressure. \X2\000A\X0\THERMOSTATIC = A valve in which the ports are opened or closed to maintain a required predetermined temperature.\X2\000A\X0\WHEEL = A valve that is opened and closed by the action of a wheel moving the gate within the valve.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1165,$,$,$,.READWRITE.); @@ -1179,9 +1179,9 @@ DATA; #1172=IFCSIMPLEPROPERTYTEMPLATE('0Yd68bKA9FPvT2pTuWWW$U',$,'WorkingPressure','The normally expected maximum working pressure of the valve',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #1173=IFCSIMPLEPROPERTYTEMPLATE('0GxXoeIm18pf53t_LXO5DF',$,'FlowCoefficient','Flow coefficient (the quantity of fluid that passes through a fully open valve at unit pressure drop), typically expressed as the Kv or Cv value for the valve.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #1174=IFCSIMPLEPROPERTYTEMPLATE('11ddS1OQD51gBskJB9K6EL',$,'CloseOffRating','Close off rating.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1175=IFCPROPERTYSETTEMPLATE('1PhhWAmnT5zuFqwSr4Q01n',$,'Pset_ValveTypeDrawOffCock','Definition from BS6100 250 6223: A small diameter valve, used to drain water from a cistern or water filled system.',$,'IfcValveType',(#1176)); +#1175=IFCPROPERTYSETTEMPLATE('1PhhWAmnT5zuFqwSr4Q01n',$,'Pset_ValveTypeDrawOffCock','Definition from BS6100 250 6223: A small diameter valve, used to drain water from a cistern or water filled system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValveType',(#1176)); #1176=IFCSIMPLEPROPERTYTEMPLATE('2sit0jWD9COh_MuX$677iN',$,'HasHoseUnion','Indicates whether the drawoff cock is fitted with a hose union connection (= TRUE) or not (= FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1177=IFCPROPERTYSETTEMPLATE('13ao3jQyn3ABSFZAY$dZFC',$,'Pset_ValveTypeFaucet','Definition from BS6100: A small diameter valve, with a free outlet, from which water is drawn.',$,'IfcValveType',(#1178,#1180,#1182,#1184,#1185)); +#1177=IFCPROPERTYSETTEMPLATE('13ao3jQyn3ABSFZAY$dZFC',$,'Pset_ValveTypeFaucet','Definition from BS6100: A small diameter valve, with a free outlet, from which water is drawn.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValveType',(#1178,#1180,#1182,#1184,#1185)); #1178=IFCSIMPLEPROPERTYTEMPLATE('3gzWLkF8D2JRWG6NtTRWcQ',$,'FaucetType','Defines the range of faucet types that may be specified where:\X2\000A000A\X0\Bib =\X2\0009\X0\ Faucet with a horizontal inlet and a nozzle that discharges downwards.\X2\000A\X0\Globe =\X2\0009\X0\ Faucet fitted through the end of a bath, with a horizontal inlet, a partially spherical body and a vertical nozzle.\X2\000A\X0\Diverter =\X2\0009\X0\Combination faucet assembly with a valve to enable the flow of mixed water to be transferred to a showerhead.\X2\000A\X0\DividedFlowCombination =\X2\0009\X0\ Combination faucet assembly in which hot and cold water are kept separate until emerging from a common nozzle\X2\000A\X0\Pillar =\X2\0009\X0\ Faucet that has a vertical inlet and a nozzle that discharges downwards\X2\000A\X0\SingleOutletCombination =\X2\0009\X0\ Combination faucet assembly in which hot and cold water mix before emerging from a common nozzle\X2\000A\X0\Spray =\X2\0009\X0\ Faucet with a spray outlet\X2\000A\X0\SprayMixing =\X2\0009\X0\ Spray faucet connected to hot and cold water supplies that delivers water at a temperature determined during use.\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1179,$,$,$,.READWRITE.); #1179=IFCPROPERTYENUMERATION('PEnum_FaucetType',(IFCLABEL('BIB'),IFCLABEL('GLOBE'),IFCLABEL('DIVERTER'),IFCLABEL('DIVIDEDFLOWCOMBINATION'),IFCLABEL('PILLAR'),IFCLABEL('SINGLEOUTLETCOMBINATION'),IFCLABEL('SPRAY'),IFCLABEL('SPRAYMIXING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1180=IFCSIMPLEPROPERTYTEMPLATE('1vEyhSzA556QUJIE3ZRI5a',$,'FaucetOperation','Defines the range of ways in which a faucet can be operated that may be specified where:\X2\000A000A\X0\CeramicDisc =\X2\0009\X0\ Quick action faucet with a ceramic seal to open or close the orifice\X2\000A\X0\LeverHandle =\X2\0009\X0\ Quick action faucet that is operated by a lever handle\X2\000A\X0\NonConcussiveSelfClosing =\X2\0009\X0\ Self closing faucet that does not induce surge pressure\X2\000A\X0\QuarterTurn =\X2\0009\X0\ Quick action faucet that can be fully opened or shut by turning the operating mechanism through 90 degrees.\X2\000A\X0\QuickAction =\X2\0009\X0\ Faucet that can be opened or closed fully with a single small movement of the operating mechanism\X2\000A\X0\ScrewDown =\X2\0009\X0\ Faucet in which a plate or disc is moved, by the rotation of a screwed spindle, to close or open the orifice.\X2\000A\X0\SelfClosing =\X2\0009\X0\ Faucet that is opened by pressure of the top of an operating spindle and is closed under the action of a spring or weight when the pressure is released\X2\000A\X0\TimedSelfClosing = \X2\0009\X0\Self closing faucet that discharges for a predetermined period of time\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1181,$,$,$,.READWRITE.); @@ -1190,37 +1190,37 @@ DATA; #1183=IFCPROPERTYENUMERATION('PEnum_FaucetFunction',(IFCLABEL('COLD'),IFCLABEL('HOT'),IFCLABEL('MIXED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1184=IFCSIMPLEPROPERTYTEMPLATE('1P8vzEN$j6nAUX5xU6Mo32',$,'Finish','Description of the finish applied to the faucet',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1185=IFCSIMPLEPROPERTYTEMPLATE('37c80UWA14Cgl0Rpx5ZS$X',$,'FaucetTopDescription','Description of the operating mechanism/top of the faucet',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1186=IFCPROPERTYSETTEMPLATE('0kadfqOEH3JP42roHv9I52',$,'Pset_ValveTypeFlushing','Definition from IAI: Valve that flushes a predetermined quantity of water to cleanse a WC, urinal or slop hopper.\X2\000A\X0\Note that a flushing valve is constrained to have a 2 port pattern.\X2\000A\X0\',$,'IfcValveType',(#1187,#1188,#1189)); +#1186=IFCPROPERTYSETTEMPLATE('0kadfqOEH3JP42roHv9I52',$,'Pset_ValveTypeFlushing','Definition from IAI: Valve that flushes a predetermined quantity of water to cleanse a WC, urinal or slop hopper.\X2\000A\X0\Note that a flushing valve is constrained to have a 2 port pattern.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcValveType',(#1187,#1188,#1189)); #1187=IFCSIMPLEPROPERTYTEMPLATE('2N6khtTw14QwxxDK_Z$LDJ',$,'FlushingRate','The predetermined quantity of water to be flushed',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #1188=IFCSIMPLEPROPERTYTEMPLATE('1GNudZCBrCIBzZpJcqbkt8',$,'HasIntegralShutOffDevice','Indication of whether the flushing valve has an integral shut off device fitted (set TRUE) or not (set FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1189=IFCSIMPLEPROPERTYTEMPLATE('3Vkq7FUVbBsuBSl94EuKO8',$,'IsHighPressure','Indication of whether the flushing valve is suitable for use on a high pressure water main (set TRUE) or not (set FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1190=IFCPROPERTYSETTEMPLATE('1HYd_X0355YQGaUZOkV4dB',$,'Pset_ValveTypeGasTap','Definition from IAI: A small diameter valve, used to discharge gas from a system.',$,'IfcValveType',(#1191)); +#1190=IFCPROPERTYSETTEMPLATE('1HYd_X0355YQGaUZOkV4dB',$,'Pset_ValveTypeGasTap','Definition from IAI: A small diameter valve, used to discharge gas from a system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValveType',(#1191)); #1191=IFCSIMPLEPROPERTYTEMPLATE('0yZOdbhof9RBSblzAkZQ6m',$,'HasHoseUnion','Indicates whether the gas tap is fitted with a hose union connection (= TRUE) or not (= FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1192=IFCPROPERTYSETTEMPLATE('3$zDfbTKz8WxeflwVwC8Ia',$,'Pset_ValveTypeIsolating','Definition from IAI: Valve that is used to isolate system components.\X2\000A\X0\Note that an isolating valve is constrained to have a 2 port pattern.\X2\000A\X0\',$,'IfcValveType',(#1193,#1194)); +#1192=IFCPROPERTYSETTEMPLATE('3$zDfbTKz8WxeflwVwC8Ia',$,'Pset_ValveTypeIsolating','Definition from IAI: Valve that is used to isolate system components.\X2\000A\X0\Note that an isolating valve is constrained to have a 2 port pattern.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcValveType',(#1193,#1194)); #1193=IFCSIMPLEPROPERTYTEMPLATE('1l2uKpIOz1nuOOL$r29eDY',$,'IsNormallyOpen','If TRUE, the valve is normally open. If FALSE is is normally closed. ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1194=IFCSIMPLEPROPERTYTEMPLATE('2Xk9JnQO5AVQ$Pm$DdZGLu',$,'IsolatingPurpose','Defines the purpose for which the isolating valve is used since the way in which the valve is identified as an isolating valve may be in the context of its use. Note that unless there is a contextual name for the isolating valve (as in the case of a Landing Valve on a rising fire main), then the value assigned shoulkd be UNSET',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1195,$,$,$,.READWRITE.); #1195=IFCPROPERTYENUMERATION('PEnum_IsolatingPurpose',(IFCLABEL('LANDING'),IFCLABEL('LANDINGWITHPRESSUREREGULATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1196=IFCPROPERTYSETTEMPLATE('2Am_SHn1H9lvDUCMoBaXlI',$,'Pset_ValveTypeMixing','Definition from IAI: A valve where typically the temperature of the outlet is determined by mixing hot and cold water inlet flows.',$,'IfcValveType',(#1197,#1199)); +#1196=IFCPROPERTYSETTEMPLATE('2Am_SHn1H9lvDUCMoBaXlI',$,'Pset_ValveTypeMixing','Definition from IAI: A valve where typically the temperature of the outlet is determined by mixing hot and cold water inlet flows.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValveType',(#1197,#1199)); #1197=IFCSIMPLEPROPERTYTEMPLATE('0g6xp$04zCCOXyhjcbsUSY',$,'MixerControl','Defines the form of control of the mixing valve.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1198,$,$,$,.READWRITE.); #1198=IFCPROPERTYENUMERATION('PEnum_MixingValveControl',(IFCLABEL('MANUAL'),IFCLABEL('PREDEFINED'),IFCLABEL('THERMOSTATIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1199=IFCSIMPLEPROPERTYTEMPLATE('0wWv7dQGz8iQUu_2IZqVhE',$,'OutletConnectionSize','The size of the pipework connection from the mixing valve.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1200=IFCPROPERTYSETTEMPLATE('2fzHzgAsP709a93BHUuSlL',$,'Pset_ValveTypePressureReducing','Definition from IAI: Valve that reduces the pressure of a fluid immediately downstream of its position in a pipeline to a preselected value or by a predetermined ratio.\X2\000A\X0\Note that a pressure reducing valve is constrained to have a 2 port pattern.\X2\000A\X0\',$,'IfcValveType',(#1201,#1202)); +#1200=IFCPROPERTYSETTEMPLATE('2fzHzgAsP709a93BHUuSlL',$,'Pset_ValveTypePressureReducing','Definition from IAI: Valve that reduces the pressure of a fluid immediately downstream of its position in a pipeline to a preselected value or by a predetermined ratio.\X2\000A\X0\Note that a pressure reducing valve is constrained to have a 2 port pattern.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcValveType',(#1201,#1202)); #1201=IFCSIMPLEPROPERTYTEMPLATE('0CTXCm2Cb0xg0O5pfm99xk',$,'UpstreamPressure','The operating pressure of the fluid upstream of the pressure reducing valve',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #1202=IFCSIMPLEPROPERTYTEMPLATE('1gmL6eTLn5T9jMkevwKvWB',$,'DownstreamPressure','The operating pressure of the fluid downstream of the pressure reducing valve',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1203=IFCPROPERTYSETTEMPLATE('0A$UJlsMHAIxCX5NfBOiBb',$,'Pset_ValveTypePressureRelief','Definition from IAI: Spring or weight loaded valve that automatically discharges to a safe place fluid that has built up to excessive pressure in pipes or fittings.\X2\000A\X0\Note that a pressure relief valve is constrained to have a single port pattern.\X2\000A\X0\',$,'IfcValveType',(#1204)); +#1203=IFCPROPERTYSETTEMPLATE('0A$UJlsMHAIxCX5NfBOiBb',$,'Pset_ValveTypePressureRelief','Definition from IAI: Spring or weight loaded valve that automatically discharges to a safe place fluid that has built up to excessive pressure in pipes or fittings.\X2\000A\X0\Note that a pressure relief valve is constrained to have a single port pattern.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcValveType',(#1204)); #1204=IFCSIMPLEPROPERTYTEMPLATE('3nM_EJKujA5PzJMBZDp$og',$,'ReliefPressure','The pressure at which the spring or weight in the valve is set to discharge fluid',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1205=IFCPROPERTYSETTEMPLATE('23FQLmd8r06gGSfG$_vmYu',$,'Pset_VibrationIsolatorTypeCommon','Definition from IAI: Vibration isolator type common attributes.\X2\000A\X0\',$,'IfcVibrationIsolatorType',(#1206,#1207,#1208,#1209,#1210,#1211)); +#1205=IFCPROPERTYSETTEMPLATE('23FQLmd8r06gGSfG$_vmYu',$,'Pset_VibrationIsolatorTypeCommon','Definition from IAI: Vibration isolator type common attributes.\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcVibrationIsolatorType',(#1206,#1207,#1208,#1209,#1210,#1211)); #1206=IFCSIMPLEPROPERTYTEMPLATE('1sFSa_Pyb4LgANT7kEw0yh',$,'VibrationTransmissibility','The vibration transmissibility percentage.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #1207=IFCSIMPLEPROPERTYTEMPLATE('3$5je__lPCyuImCA24rSFT',$,'IsolatorStaticDeflection','Static deflection of the vibration isolator.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #1208=IFCSIMPLEPROPERTYTEMPLATE('10EjzGdBbD1hs9UyIj_A7E',$,'IsolatorCompressibility','The compressibility of the vibration isolator.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); #1209=IFCSIMPLEPROPERTYTEMPLATE('0Nedk47Lj2eOA58YdZeYQC',$,'Height','Height of the vibration isolator before tha application of load. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1210=IFCSIMPLEPROPERTYTEMPLATE('2CtzO6DvT3bxrLryLvul2o',$,'Material','Material from which the damping element of the vibration isolator is constructed. ',.P_REFERENCEVALUE.,'IfcMaterial ',$,$,$,$,$,.READWRITE.); #1211=IFCSIMPLEPROPERTYTEMPLATE('3I9_dKk7rA_xS3EvouC51X',$,'MaximumSupportedWeight','The maximum weight that can be carried by the vibration isolator. ',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1212=IFCPROPERTYSETTEMPLATE('1MkwvVFNnF3AueJSFnASur',$,'Pset_ActorCommon','Definition from IAI: A property set that enables further classification of actors, including the ability to give a number of actors to be designated as a population, the number being specified as a property to be dealt with as a single value rather than having to aggregate a number of instances of IfcActor.',$,'IfcActor',(#1213,#1214,#1215)); +#1212=IFCPROPERTYSETTEMPLATE('1MkwvVFNnF3AueJSFnASur',$,'Pset_ActorCommon','Definition from IAI: A property set that enables further classification of actors, including the ability to give a number of actors to be designated as a population, the number being specified as a property to be dealt with as a single value rather than having to aggregate a number of instances of IfcActor.',.PSET_OCCURRENCEDRIVEN.,'IfcActor',(#1213,#1214,#1215)); #1213=IFCSIMPLEPROPERTYTEMPLATE('2fO_v3yqb5qgVPd35k1L9X',$,'NumberOfActors','The number of actors that are to be dealt with together in the population.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); #1214=IFCSIMPLEPROPERTYTEMPLATE('2XqS0lhFvBUvGhNBry4aB_',$,'Category','Designation of the category into which the actors in the population belong.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1215=IFCSIMPLEPROPERTYTEMPLATE('0sygUX5Hb3u8IpA51fQLGA',$,'SkillLevel','Skill level exhibited by the actor and which indicates an extent of their capability to perform actions on the artefacts upon which they can act.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1216=IFCPROPERTYSETTEMPLATE('0mTM09ZEDAAQakpM49F3Ay',$,'Pset_ProductRequirements','Definition from IAI: Categorization of the required properties of an entity that are used to determine what the level of the requirement is, to enable its performance/quality to be determined, assessed, or measured, and compared against the requirement, and then to analyze whether the entity is suitable for use within a given context..',$,'IfcProduct',(#1217,#1218,#1219,#1220,#1221,#1222,#1223,#1224,#1225,#1226)); +#1216=IFCPROPERTYSETTEMPLATE('0mTM09ZEDAAQakpM49F3Ay',$,'Pset_ProductRequirements','Definition from IAI: Categorization of the required properties of an entity that are used to determine what the level of the requirement is, to enable its performance/quality to be determined, assessed, or measured, and compared against the requirement, and then to analyze whether the entity is suitable for use within a given context..',.PSET_OCCURRENCEDRIVEN.,'IfcProduct',(#1217,#1218,#1219,#1220,#1221,#1222,#1223,#1224,#1225,#1226)); #1217=IFCSIMPLEPROPERTYTEMPLATE('1XLxQDYln3tgrH9NmyaXkO',$,'Name','Subject matter for which a value is to be reported.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1218=IFCSIMPLEPROPERTYTEMPLATE('2WqP0fZDDDaumoyHbQArh2',$,'Category','A reference to a classification of the degree of aggregation or granularity of topic data such as regional, local etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1219=IFCSIMPLEPROPERTYTEMPLATE('0VhO4RBUL4qRBCXyUZ4kGz',$,'GroupName','Name of grouping of topics.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1231,22 +1231,22 @@ DATA; #1224=IFCSIMPLEPROPERTYTEMPLATE('2ZevLs7FTC49gj3a9sZ4SJ',$,'SupplyEvaluationValue','Value of the subject matter as determined using an agreed scale for what is provided, or capable of being provided.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1225=IFCSIMPLEPROPERTYTEMPLATE('3ElVqfsJT4UfxsUK2mT_l6',$,'GapValue','Difference determined between the topic demand value and the topic supply evaluation value.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1226=IFCSIMPLEPROPERTYTEMPLATE('1DzDp332b5xxCl3E2unabI',$,'GapValueWeighted','Difference determined between the topic demand value and the topic supply evaluation value, weighted for topic demand importance value.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1227=IFCPROPERTYSETTEMPLATE('0haWkl8vz3j8fUZ9aDbGOX',$,'Pset_ProjectCommon','Definition from IAI: Common properties for a building project.',$,'IfcProject',(#1228,#1229,#1230)); +#1227=IFCPROPERTYSETTEMPLATE('0haWkl8vz3j8fUZ9aDbGOX',$,'Pset_ProjectCommon','Definition from IAI: Common properties for a building project.',.PSET_OCCURRENCEDRIVEN.,'IfcProject',(#1228,#1229,#1230)); #1228=IFCSIMPLEPROPERTYTEMPLATE('2_3$o$xX1Atxq26DafII_V',$,'ConstructionMode','The type of construction action the project deals with, e.g. new construction, renovation, refurbishment, etc. ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1229=IFCSIMPLEPROPERTYTEMPLATE('3Eum6BoM1EKv3s4PxJptfx',$,'BuildingPermitId','The building permit identifier for the written authorization required by building authorities before construction on a specific project can begin.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1230=IFCSIMPLEPROPERTYTEMPLATE('2EVo$JLSbE9AihUZqf96zl',$,'GrossAreaPlanned','Total planned area for the project. Used for programming the project',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1231=IFCPROPERTYSETTEMPLATE('2EirlRx7XBEhCbznWEZxij',$,'Pset_DesignPoint','Definition from IAI: A point of connection taken as a reference for hydraulic calculations in sprinkler systems. The point is assigned to an instance of IfcDistributionPort and located according to circumstances as set out by local building codes. For instance, it may be either the last elbow, tee or branch downstream of which a sprinkler array is located (where ranges are directly connected to the distribution pipe without risers or drops) or the point of connection of the riser or drop nearest the installation valves in the sprinkler array (where ranges are connected to the distribution pipe with risers or drops). Other circumstances may be referenced in local codes and the assignment of the design point must be established by a user.\X2\000A\X0\',$,'IfcDistributionPort',(#1232)); +#1231=IFCPROPERTYSETTEMPLATE('2EirlRx7XBEhCbznWEZxij',$,'Pset_DesignPoint','Definition from IAI: A point of connection taken as a reference for hydraulic calculations in sprinkler systems. The point is assigned to an instance of IfcDistributionPort and located according to circumstances as set out by local building codes. For instance, it may be either the last elbow, tee or branch downstream of which a sprinkler array is located (where ranges are directly connected to the distribution pipe without risers or drops) or the point of connection of the riser or drop nearest the installation valves in the sprinkler array (where ranges are connected to the distribution pipe with risers or drops). Other circumstances may be referenced in local codes and the assignment of the design point must be established by a user.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort',(#1232)); #1232=IFCSIMPLEPROPERTYTEMPLATE('039GtPbm1F7u_pRJP9EOuO',$,'IsDesignPoint','Indicates whether an instance of IfcDistributionPort is to act as the design point for sprinkler hydraulic calculation (set TRUE) or not (either set FALSE or assumed to be FALSE where an instance of the property set is not assigned to an instance of IfcDistributionPort). ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1233=IFCPROPERTYSETTEMPLATE('2lFPTE54z9MhLLsV5ogorN',$,'Pset_DrainageCatchment','Definition from IAI: Area of land that drains naturally to a given point (BS6100 modified). Used as a non type driven property set in conjunction with an appropriate instance of IfcSpatialStructureElement that is identified as a catchment using the inherited IfcRoot.Name attribute. Catchments may be nested using IfcRelNests so that subcatchment areas (as component parts of a catchment area) can be identified. A catchment area will be geometrically defined by a closed loop (closed polyline or polyloop)\X2\000A\X0\Note also that the boundary between catchment areas (watershed) is not currently identified.\X2\000A\X0\',$,'IfcSite',(#1234)); +#1233=IFCPROPERTYSETTEMPLATE('2lFPTE54z9MhLLsV5ogorN',$,'Pset_DrainageCatchment','Definition from IAI: Area of land that drains naturally to a given point (BS6100 modified). Used as a non type driven property set in conjunction with an appropriate instance of IfcSpatialStructureElement that is identified as a catchment using the inherited IfcRoot.Name attribute. Catchments may be nested using IfcRelNests so that subcatchment areas (as component parts of a catchment area) can be identified. A catchment area will be geometrically defined by a closed loop (closed polyline or polyloop)\X2\000A\X0\Note also that the boundary between catchment areas (watershed) is not currently identified.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcSite',(#1234)); #1234=IFCSIMPLEPROPERTYTEMPLATE('3aqx2jrKzBlxezluYx1vRR',$,'AreaDrained','The area measure enclosed within the catchment',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1235=IFCPROPERTYSETTEMPLATE('3l3o1nbjn9NgRRr__SRG6i',$,'Pset_DrainageCulvert','Definition from IAI: Covered channel or large pipe that forms a watercourse below ground level, usually under a road or railway (BS6100). Used as a non type driven property set in conjunction with an instance of IfcSystem that is classified as a culvert.\X2\000A\X0\',$,'IfcSystem',(#1236,#1237)); +#1235=IFCPROPERTYSETTEMPLATE('3l3o1nbjn9NgRRr__SRG6i',$,'Pset_DrainageCulvert','Definition from IAI: Covered channel or large pipe that forms a watercourse below ground level, usually under a road or railway (BS6100). Used as a non type driven property set in conjunction with an instance of IfcSystem that is classified as a culvert.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcSystem',(#1236,#1237)); #1236=IFCSIMPLEPROPERTYTEMPLATE('0tzcpEyqjE_Q1cl$sEjMUT',$,'InternalWidth','The internal width of the culvert',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #1237=IFCSIMPLEPROPERTYTEMPLATE('1k$Z6t7Ef0APaDRWQDeyEp',$,'ClearDepth','The clear depth of the culvert',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1238=IFCPROPERTYSETTEMPLATE('0AmMAl4ojEgOZx1BpfYL4o',$,'Pset_DrainageOutfall','Definition from IAI: Structure through which water is discharged into a watercourse or body of water (BS6100). Used as a non type driven property set in conjunction with an instance of IfcProxy that is identified as an outfall using the inherited IfcRoot.Name attribute.\X2\000A\X0\',$,'IfcProxy',(#1239)); +#1238=IFCPROPERTYSETTEMPLATE('0AmMAl4ojEgOZx1BpfYL4o',$,'Pset_DrainageOutfall','Definition from IAI: Structure through which water is discharged into a watercourse or body of water (BS6100). Used as a non type driven property set in conjunction with an instance of IfcProxy that is identified as an outfall using the inherited IfcRoot.Name attribute.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcProxy',(#1239)); #1239=IFCSIMPLEPROPERTYTEMPLATE('2ho9HIlBn1gRv5miefid_9',$,'InvertLevel','The lowest point of the outfall',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1240=IFCPROPERTYSETTEMPLATE('38buQ3TR59FP6AspHbzDBF',$,'Pset_DrainageReserve','Definition from IAI: Area exclusively reserved for the routing of drainage services. Used as a non type driven property set in conjunction with an appropriate instance of IfcSpatialStructureElement that is identified as a drainage reserve using the inherited IfcRoot.Name attribute.\X2\000A\X0\',$,'IfcSite',(#1241)); +#1240=IFCPROPERTYSETTEMPLATE('38buQ3TR59FP6AspHbzDBF',$,'Pset_DrainageReserve','Definition from IAI: Area exclusively reserved for the routing of drainage services. Used as a non type driven property set in conjunction with an appropriate instance of IfcSpatialStructureElement that is identified as a drainage reserve using the inherited IfcRoot.Name attribute.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcSite',(#1241)); #1241=IFCSIMPLEPROPERTYTEMPLATE('2t9RBWqxP3rBFsNtM_7G3T',$,'Width','The width of the drainage reserve',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1242=IFCPROPERTYSETTEMPLATE('1UIRuRLOD24wgUWkhM0MQb',$,'Pset_FireSuppressionTerminalTypeBreechingInlet','Definition from IAI: Symmetrical pipe fitting that unites two or more inlets into a single pipe (BS6100 330 114 adapted).',$,'IfcFireSuppressionTerminalType',(#1243,#1245,#1246,#1247,#1249,#1250)); +#1242=IFCPROPERTYSETTEMPLATE('1UIRuRLOD24wgUWkhM0MQb',$,'Pset_FireSuppressionTerminalTypeBreechingInlet','Definition from IAI: Symmetrical pipe fitting that unites two or more inlets into a single pipe (BS6100 330 114 adapted).',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminalType',(#1243,#1245,#1246,#1247,#1249,#1250)); #1243=IFCSIMPLEPROPERTYTEMPLATE('0choSJxcz0IeZeX6aVHpxN',$,'BreechingInletType','Defines the type of breeching inlet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1244,$,$,$,.READWRITE.); #1244=IFCPROPERTYENUMERATION('PEnum_BreechingInletType',(IFCLABEL('TWOWAY'),IFCLABEL('FOURWAY'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); #1245=IFCSIMPLEPROPERTYTEMPLATE('3IeWXdCFn6mu0TylmeScRq',$,'InletDiameter','The inlet diameter of the breeching inlet.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1255,7 +1255,7 @@ DATA; #1248=IFCPROPERTYENUMERATION('PEnum_BreechingInletCouplingType',(IFCLABEL('INSTANTANEOUS_FEMALE'),IFCLABEL('INSTANTANEOUS_MALE'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); #1249=IFCSIMPLEPROPERTYTEMPLATE('1zTd7jVqz2MOc_GDalf5ST',$,'HasCaps','Does the inlet connection have protective caps.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1250=IFCSIMPLEPROPERTYTEMPLATE('3vhCxNR91ECQESv0D5nrM2',$,'Material','Material from which the object is constructed',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1251=IFCPROPERTYSETTEMPLATE('2bJ$XoP6X5NQ7mUmzSQj3l',$,'Pset_FireSuppressionTerminalTypeFireHydrant','Definition from IAI: Device, fitted to a pipe, through which a temporary supply of water may be provided (BS6100 330 6107)\X2\000A000A\X0\For further details on fire hydrants, see www.firehydrant.org',$,'IfcFireSuppressionTerminalType',(#1252,#1254,#1255,#1256,#1257,#1258,#1259,#1260,#1261,#1262)); +#1251=IFCPROPERTYSETTEMPLATE('2bJ$XoP6X5NQ7mUmzSQj3l',$,'Pset_FireSuppressionTerminalTypeFireHydrant','Definition from IAI: Device, fitted to a pipe, through which a temporary supply of water may be provided (BS6100 330 6107)\X2\000A000A\X0\For further details on fire hydrants, see www.firehydrant.org',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminalType',(#1252,#1254,#1255,#1256,#1257,#1258,#1259,#1260,#1261,#1262)); #1252=IFCSIMPLEPROPERTYTEMPLATE('0suQG1pMPABRbblUMqELgE',$,'FireHydrantType','Defines the range of hydrant types from which the required type can be selected where:\X2\000A000A\X0\DryBarrel =\X2\0009\X0\ A hydrant that has isolating valves fitted below ground and that may be used where the possibility of water freezing is a consideration.\X2\000A\X0\WetBarrel =\X2\0009\X0\ A hydrant that has isolating valves fitted above ground and that may be used where there is no possibility of water freezing.\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1253,$,$,$,.READWRITE.); #1253=IFCPROPERTYENUMERATION('PEnum_FireHydrantType',(IFCLABEL('DryBarrel'),IFCLABEL('WetBarrel'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1254=IFCSIMPLEPROPERTYTEMPLATE('1CXRtXpdz4u9ISjzf6UCq6',$,'PumperConnectionSize','The size of a connection to which a fire hose may be connected that is then linked to a pumping unit.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1267,7 +1267,7 @@ DATA; #1260=IFCSIMPLEPROPERTYTEMPLATE('2fK5hFU8H6pf790b9PA20i',$,'PressureRating','Maximum pressure that the hydrant is manufactured to withstand.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); #1261=IFCSIMPLEPROPERTYTEMPLATE('1jax1hNAL0UeBDZ$bMyDy2',$,'BodyColor','Color of the body of the hydrant.\X2\000A000A\X0\Note: Consult local fire regulations for statutory colors that may be required for hydrant bodies in particular circumstances.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1262=IFCSIMPLEPROPERTYTEMPLATE('3erUIrETH5o9UtSXwt65zg',$,'CapColor','Color of the caps of the hydrant.\X2\000A000A\X0\Note: Consult local fire regulations for statutory colors that may be required for hydrant caps in particular circumstances.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1263=IFCPROPERTYSETTEMPLATE('1Hf_iOZvjAKhSpNATnFVQS',$,'Pset_FireSuppressionTerminalTypeHoseReel','Definition from IAI: A supporting framework on which a hose may be wound (BS6100 155 8201).\X2\000A000A\X0\Note that the service provided by the hose (water/foam) is determined by the context of the system onto which the hose reel is connected.',$,'IfcFireSuppressionTerminalType',(#1264,#1266,#1268,#1269,#1270,#1271,#1273,#1274)); +#1263=IFCPROPERTYSETTEMPLATE('1Hf_iOZvjAKhSpNATnFVQS',$,'Pset_FireSuppressionTerminalTypeHoseReel','Definition from IAI: A supporting framework on which a hose may be wound (BS6100 155 8201).\X2\000A000A\X0\Note that the service provided by the hose (water/foam) is determined by the context of the system onto which the hose reel is connected.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminalType',(#1264,#1266,#1268,#1269,#1270,#1271,#1273,#1274)); #1264=IFCSIMPLEPROPERTYTEMPLATE('3Ybv1fdmbDyQ95AP_Cgnju',$,'HoseReelType','Identifies the predefined types of hose arrangement from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1265,$,$,$,.READWRITE.); #1265=IFCPROPERTYENUMERATION('PEnum_HoseReelType',(IFCLABEL('Rack'),IFCLABEL('Reel'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1266=IFCSIMPLEPROPERTYTEMPLATE('1tqNiFNTTAu91XFhs9jMa3',$,'HoseReelMountingType','Identifies the predefined types of hose reel mounting from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1267,$,$,$,.READWRITE.); @@ -1279,7 +1279,7 @@ DATA; #1272=IFCPROPERTYENUMERATION('PEnum_HoseNozzleType',(IFCLABEL('Fog'),IFCLABEL('StraightStream'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1273=IFCSIMPLEPROPERTYTEMPLATE('1KhFZoVTjEYhZpyonvcRo3',$,'ClassOfService','A classification of usage of the hose reel that may be applied.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1274=IFCSIMPLEPROPERTYTEMPLATE('1gzeeMZ416m9DuoZCfYsjX',$,'ClassificationAuthority','The name of the authority that applies the classification of service to the hose reel (e.g. NFPA/FEMA)',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1275=IFCPROPERTYSETTEMPLATE('0D6KbJVzX1$97TF6u1cWrB',$,'Pset_FireSuppressionTerminalTypeSprinkler','Definition from IAI: Device for sprinkling water from a pipe under pressure over an area (BS6100 100 3432)',$,'IfcFireSuppressionTerminalType',(#1276,#1278,#1280,#1282,#1283,#1284,#1285,#1287,#1288,#1289,#1290,#1291,#1292,#1293)); +#1275=IFCPROPERTYSETTEMPLATE('0D6KbJVzX1$97TF6u1cWrB',$,'Pset_FireSuppressionTerminalTypeSprinkler','Definition from IAI: Device for sprinkling water from a pipe under pressure over an area (BS6100 100 3432)',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminalType',(#1276,#1278,#1280,#1282,#1283,#1284,#1285,#1287,#1288,#1289,#1290,#1291,#1292,#1293)); #1276=IFCSIMPLEPROPERTYTEMPLATE('0w78OMbbr1u8RGZUo4JjlM',$,'SprinklerType','Identifies the predefined types of sprinkler from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1277,$,$,$,.READWRITE.); #1277=IFCPROPERTYENUMERATION('PEnum_SprinklerType',(IFCLABEL('Ceiling'),IFCLABEL('Concealed'),IFCLABEL('Cut-off'),IFCLABEL('Pendant'),IFCLABEL('RecessedPendant'),IFCLABEL('Sidewall'),IFCLABEL('Upright'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1278=IFCSIMPLEPROPERTYTEMPLATE('044LqQeCzCrvXU2tudWjiT',$,'Activation','Identifies the predefined methods of sprinkler activation from which that required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1279,$,$,$,.READWRITE.); @@ -1298,7 +1298,7 @@ DATA; #1291=IFCSIMPLEPROPERTYTEMPLATE('13sJ8aa7D32OkhQPtFMoMe',$,'ConnectionSize','Size of the inlet connection to the sprinkler.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1292=IFCSIMPLEPROPERTYTEMPLATE('2n1NCrnFz2VRkLMjEHyVQd',$,'FrameMaterial','The material used to construct the frame of the sprinkler.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1293=IFCSIMPLEPROPERTYTEMPLATE('3hIcmGldn7tOuWa9m_q50W',$,'DeflectorMaterial','The material used to construct the deflector plate.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1294=IFCPROPERTYSETTEMPLATE('2PkFiiMxDCDvfWDDQJHT1m',$,'Pset_SanitaryTerminalTypeBath','Definition from IAI: Sanitary appliance for immersion of the human body or parts of it (BS6100).',$,'IfcSanitaryTerminalType',(#1295,#1297,#1298,#1299,#1300,#1301,#1302,#1303,#1304)); +#1294=IFCPROPERTYSETTEMPLATE('2PkFiiMxDCDvfWDDQJHT1m',$,'Pset_SanitaryTerminalTypeBath','Definition from IAI: Sanitary appliance for immersion of the human body or parts of it (BS6100).',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminalType',(#1295,#1297,#1298,#1299,#1300,#1301,#1302,#1303,#1304)); #1295=IFCSIMPLEPROPERTYTEMPLATE('2kUM$t$KDC_PpcM1HW_$Hu',$,'BathType','The property enumeration defines the types of bath that may be specified within the property set where:\X2\000A000A\X0\Domestic =\X2\0009\X0\Bath, for one person at a time, into which the whole body can be easily immersed.\X2\000A\X0\DomesticCorner =\X2\0009\X0\Bath, for one person at a time, into which the whole body can be easily immersed and in which the immersion trough is at an angle.\X2\000A\X0\Foot =\X2\0009\X0\Shallow bath for washing the feet.\X2\000A\X0\Jacuzzi =\X2\0009\X0\Whirlpool bath for more than one person\X2\000A\X0\Plunge =\X2\0009\X0\Bath, usually for more than one person at a time, into which the whole body can be easily immersed.\X2\000A\X0\Sitz =\X2\0009\X0\Bath in which a bather sits as in a chair.\X2\000A\X0\Treatment =\X2\0009\X0\Bath used for hydrotherapy purposes.\X2\000A\X0\Whirlpool =\X2\0009\X0\Bath in which an integrated device agitates the water by pumped circulation or induction of water and/or air.\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1296,$,$,$,.READWRITE.); #1296=IFCPROPERTYENUMERATION('PEnum_BathType',(IFCLABEL('Domestic'),IFCLABEL('DomesticCorner'),IFCLABEL('Foot'),IFCLABEL('Jacuzzi'),IFCLABEL('Plunge'),IFCLABEL('Sitz'),IFCLABEL('Treatment'),IFCLABEL('Whirlpool'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset\X2\000A\X0\')),$); #1297=IFCSIMPLEPROPERTYTEMPLATE('12tWalxLDCYvRDTIrj9GWv',$,'NominalLength','Nominal or quoted length of the object. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1309,7 +1309,7 @@ DATA; #1302=IFCSIMPLEPROPERTYTEMPLATE('16$5MVS2D4of3tqgKkW1aW',$,'Color','Principal color of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1303=IFCSIMPLEPROPERTYTEMPLATE('2YC321NL57MwPCCM5ticem',$,'DrainSize','The size of the drain outlet connection from the object. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1304=IFCSIMPLEPROPERTYTEMPLATE('32PiCJ2u92h9DsHwfHfTYM',$,'HasGrabHandles','Indicates whether the bath is fitted with handles that provide assistance to a bather in entering or leaving the bath',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1305=IFCPROPERTYSETTEMPLATE('01eRZYW9XF6gpJRCGFRKsm',$,'Pset_SanitaryTerminalTypeBidet','Definition from IAI: Waste water appliance for washing the excretory organs while sitting astride the bowl (BS6100)',$,'IfcSanitaryTerminalType',(#1306,#1308,#1309,#1310,#1311,#1312,#1313,#1314)); +#1305=IFCPROPERTYSETTEMPLATE('01eRZYW9XF6gpJRCGFRKsm',$,'Pset_SanitaryTerminalTypeBidet','Definition from IAI: Waste water appliance for washing the excretory organs while sitting astride the bowl (BS6100)',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminalType',(#1306,#1308,#1309,#1310,#1311,#1312,#1313,#1314)); #1306=IFCSIMPLEPROPERTYTEMPLATE('24rFxZT_55gB2X_1xPum$B',$,'BidetMounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-\X2\000A000A\X0\BackToWall =\X2\0009\X0\A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal =\X2\0009\X0\A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop =\X2\0009\X0\A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung =\X2\0009\X0\A sanitary terminal cantilevered clear of the floor\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1307,$,$,$,.READWRITE.); #1307=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BackToWall'),IFCLABEL('Pedestal'),IFCLABEL('CounterTop'),IFCLABEL('WallHung'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1308=IFCSIMPLEPROPERTYTEMPLATE('2NXMZimJ12_8Zb3WS7zYaA',$,'NominalLength','Nominal or quoted length of the object. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1319,7 +1319,7 @@ DATA; #1312=IFCSIMPLEPROPERTYTEMPLATE('18rl6s8D91E9TewajBR2zJ',$,'Color','Color selection for this object',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1313=IFCSIMPLEPROPERTYTEMPLATE('3deFtBrPr0Ou9sUM8_vJ_k',$,'SpilloverLevel','The level at which water spills out of the object',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1314=IFCSIMPLEPROPERTYTEMPLATE('3JhRZ22DXCsB5jO6OasOk4',$,'DrainSize','The size of the drain outlet connection from the object ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1315=IFCPROPERTYSETTEMPLATE('1dA9tfohP5u95O2tdnIqor',$,'Pset_SanitaryTerminalTypeCistern','Definition from IAI: A water storage unit attached to a sanitary terminal that is fitted with a device, operated automatically or by the user, that discharges water to cleanse a water closet (toilet) pan, urinal or slop hopper. (BS6100 330 5008)',$,'IfcSanitaryTerminalType',(#1316,#1318,#1319,#1320,#1322,#1323,#1324,#1325)); +#1315=IFCPROPERTYSETTEMPLATE('1dA9tfohP5u95O2tdnIqor',$,'Pset_SanitaryTerminalTypeCistern','Definition from IAI: A water storage unit attached to a sanitary terminal that is fitted with a device, operated automatically or by the user, that discharges water to cleanse a water closet (toilet) pan, urinal or slop hopper. (BS6100 330 5008)',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminalType',(#1316,#1318,#1319,#1320,#1322,#1323,#1324,#1325)); #1316=IFCSIMPLEPROPERTYTEMPLATE('1QdWjOAUT9mAxL09GccIaJ',$,'CisternHeight','Enumeration that identifies the height of the cistern or, if set to ''None'' if the urinal has no cistern and is flushed using mains or high pressure water through a flushing valve.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1317,$,$,$,.READWRITE.); #1317=IFCPROPERTYENUMERATION('PEnum_CisternHeight',(IFCLABEL('HighLevel'),IFCLABEL('LowLevel'),IFCLABEL('None'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1318=IFCSIMPLEPROPERTYTEMPLATE('0XJfuzYVPE_vagUpoBT6yt',$,'CisternCapacity','Volumetric capacity of the cistern',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); @@ -1330,7 +1330,7 @@ DATA; #1323=IFCSIMPLEPROPERTYTEMPLATE('00a35QOADBiOICYFLNi3yy',$,'IsAutomaticFlush','Boolean value that determines if the cistern is flushed automatically either after each use or periodically (TRUE) or whether manual flushing is required (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1324=IFCSIMPLEPROPERTYTEMPLATE('38pexwjf5BROQDOOTfiZwp',$,'CisternMaterial','Material from which the object is constructed',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1325=IFCSIMPLEPROPERTYTEMPLATE('2dvbZWfrP6juZQJ1CWj6OT',$,'CisternColor','Color of the object',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1326=IFCPROPERTYSETTEMPLATE('1zMP5HxFzBvAn3Bsp0m_Jm',$,'Pset_SanitaryTerminalTypeSanitaryFountain','Definition from IAI: A sanitary terminal that provides a low pressure jet of water for a specific purpose (IAI).',$,'IfcSanitaryTerminalType',(#1327,#1329,#1331,#1332,#1333,#1334,#1335,#1336)); +#1326=IFCPROPERTYSETTEMPLATE('1zMP5HxFzBvAn3Bsp0m_Jm',$,'Pset_SanitaryTerminalTypeSanitaryFountain','Definition from IAI: A sanitary terminal that provides a low pressure jet of water for a specific purpose (IAI).',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminalType',(#1327,#1329,#1331,#1332,#1333,#1334,#1335,#1336)); #1327=IFCSIMPLEPROPERTYTEMPLATE('0S8vpVL9nB$8mr$72c0PKP',$,'FountainType','Selection of the type of fountain from the enumerated list of types where:-\X2\000A000A\X0\DrinkingWater =\X2\0009\X0\Sanitary appliance that provides a low pressure jet of drinking water.\X2\000A\X0\Eyewash =\X2\0009\X0\Waste water appliance, usually installed in work places where there is a risk of injury to eyes by solid particles or dangerous liquids, with which the user can wash the eyes without touching them.\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1328,$,$,$,.READWRITE.); #1328=IFCPROPERTYENUMERATION('PEnum_FountainType',(IFCLABEL('DrinkingWater'),IFCLABEL('Eyewash'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1329=IFCSIMPLEPROPERTYTEMPLATE('1Hj$3Pbfn5xBn9MvmynkXU',$,'Mounting','Selection of the form of mounting of the fountain from the enumerated list of mountings where:-\X2\000A000A\X0\BackToWall =\X2\0009\X0\A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal =\X2\0009\X0\A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop =\X2\0009\X0\A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung =\X2\0009\X0\A sanitary terminal cantilevered clear of the floor\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1330,$,$,$,.READWRITE.); @@ -1341,7 +1341,7 @@ DATA; #1334=IFCSIMPLEPROPERTYTEMPLATE('1s3eqgu$vCaA1Y0UBfOgW$',$,'Material','Material from which the object is constructed',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1335=IFCSIMPLEPROPERTYTEMPLATE('2GxdHXN0rD1xRA2pdMZrA_',$,'Color','Color selection for this object',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1336=IFCSIMPLEPROPERTYTEMPLATE('0DK2vwHhrCQOkACr_rIr6H',$,'DrainSize','The size of the drain outlet connection from the object',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1337=IFCPROPERTYSETTEMPLATE('13MEPS1rTFXOGdYu578meb',$,'Pset_SanitaryTerminalTypeShower','Definition from IAI: Installation or waste water appliance that emits a spray of water to wash the human body (BS6100).',$,'IfcSanitaryTerminalType',(#1338,#1340,#1341,#1342,#1343,#1344,#1345,#1346,#1347,#1348)); +#1337=IFCPROPERTYSETTEMPLATE('13MEPS1rTFXOGdYu578meb',$,'Pset_SanitaryTerminalTypeShower','Definition from IAI: Installation or waste water appliance that emits a spray of water to wash the human body (BS6100).',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminalType',(#1338,#1340,#1341,#1342,#1343,#1344,#1345,#1346,#1347,#1348)); #1338=IFCSIMPLEPROPERTYTEMPLATE('1739LMPM9A9eDT43O7xDK5',$,'ShowerType','Selection of the type of shower from the enumerated list of types where:-\X2\000A000A\X0\Drench = \X2\0009\X0\Shower that rapidly gives a thorough soaking in an emergency\X2\000A\X0\Individual =\X2\0009\X0\Shower unit that is typically enclosed and is for the use of one person at a time\X2\000A\X0\Tunnel = \X2\0009\X0\Shower that has a succession of shower heads or spreaders that operate simultaneously along its length\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1339,$,$,$,.READWRITE.); #1339=IFCPROPERTYENUMERATION('PEnum_ShowerType',(IFCLABEL('Drench'),IFCLABEL('Individual'),IFCLABEL('Tunnel'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1340=IFCSIMPLEPROPERTYTEMPLATE('3tza4e395BtR5WS7DRaJ5a',$,'HasTray','Indicates whether the shower has a separate receptacle that catches the water in a shower and directs it to a waste outlet.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); @@ -1353,7 +1353,7 @@ DATA; #1346=IFCSIMPLEPROPERTYTEMPLATE('3sj4G9E6f5luol9YWW1iKY',$,'Color','Color selection for this object',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1347=IFCSIMPLEPROPERTYTEMPLATE('1fJq3087XEHhGKrYQnG32m',$,'ShowerHeadDescription','A description of the shower head(s) that emit the spray of water',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1348=IFCSIMPLEPROPERTYTEMPLATE('2L6GlIq3z3TxrE$4LX6dpa',$,'DrainSize','The size of the drain outlet connection from the object',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1349=IFCPROPERTYSETTEMPLATE('2NrQvkC9fEUvRgBoX8_Fnk',$,'Pset_SanitaryTerminalTypeSink','Definition from IAI: Waste water appliance for receiving, retaining or disposing of domestic, culinary, laboratory or industrial process liquids.',$,'IfcSanitaryTerminalType',(#1350,#1352,#1354,#1355,#1356,#1357,#1358,#1359)); +#1349=IFCPROPERTYSETTEMPLATE('2NrQvkC9fEUvRgBoX8_Fnk',$,'Pset_SanitaryTerminalTypeSink','Definition from IAI: Waste water appliance for receiving, retaining or disposing of domestic, culinary, laboratory or industrial process liquids.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminalType',(#1350,#1352,#1354,#1355,#1356,#1357,#1358,#1359)); #1350=IFCSIMPLEPROPERTYTEMPLATE('0oz9RlizD8uBZgSK2VGFav',$,'SinkType','Selection of the type of sink from the enumerated list of types where:-\X2\000A000A\X0\Belfast = \X2\0009\X0\Deep sink that has a plain edge and a weir overflow\X2\000A\X0\.\X2\000A\X0\Bucket = \X2\0009\X0\Sink at low level, with protected front edge, that facilitates filling and emptying buckets, usually with a hinged grid on which to stand them.\X2\000A\X0\Cleaners =\X2\0009\X0\ Sink, usually fixed at normal height (900mm), with protected front edge.\X2\000A\X0\Combination_Left =\X2\0009\X0\ Sink with integral drainer on left hand side\X2\000A\X0\.\X2\000A\X0\Combination_Right =\X2\0009\X0\ Sink with integral drainer on right hand side\X2\000A\X0\.\X2\000A\X0\Combination_Double = \X2\0009\X0\Sink with integral drainer on both sides\X2\000A\X0\.\X2\000A\X0\Drip =\X2\0009\X0\ Small sink that catches drips or flow from a faucet\X2\000A\X0\.\X2\000A\X0\Laboratory =\X2\0009\X0\ Sink, of acid resisting material, with a top edge shaped to facilitate fixing to the underside of a desktop\X2\000A\X0\.\X2\000A\X0\London =\X2\0009\X0\ Deep sink that has a plain edge and no overflow\X2\000A\X0\.\X2\000A\X0\Plaster = Sink with sediment receiver to prevent waste plaster passing into drains\X2\000A\X0\.\X2\000A\X0\Pot =\X2\0009\X0\ Large metal sink, with a standing waste, for washing cooking utensils\X2\000A\X0\.\X2\000A\X0\Rinsing =\X2\0009\X0\ Metal sink in which water can be heated and culinary utensils and tableware immersed at high temperature that destroys most harmful bacteria and allows subsequent self drying.\X2\000A\X0\.\X2\000A\X0\Shelf =\X2\0009\X0\ Ceramic sink with an integral back shelf through which water fittings are mounted\X2\000A\X0\.\X2\000A\X0\VegetablePreparation =\X2\0009\X0\Large metal sink, with a standing waste, for washing and preparing vegetables\X2\000A\X0\.\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1351,$,$,$,.READWRITE.); #1351=IFCPROPERTYENUMERATION('PEnum_SinkType',(IFCLABEL('Belfast'),IFCLABEL('Bucket'),IFCLABEL('Cleaners'),IFCLABEL('Combination_Left'),IFCLABEL('Combination_Right'),IFCLABEL('Combination_Double'),IFCLABEL('Drip'),IFCLABEL('Laboratory'),IFCLABEL('London'),IFCLABEL('Plaster'),IFCLABEL('Pot'),IFCLABEL('Rinsing'),IFCLABEL('Shelf'),IFCLABEL('VegetablePreparation'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1352=IFCSIMPLEPROPERTYTEMPLATE('3$NRFVWsnE8BSS_71XDYrm',$,'SinkMounting','Selection of the form of mounting of the sink from the enumerated list of mountings where:-\X2\000A000A\X0\BackToWall =\X2\0009\X0\A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal =\X2\0009\X0\A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop =\X2\0009\X0\A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung =\X2\0009\X0\A sanitary terminal cantilevered clear of the floor\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1353,$,$,$,.READWRITE.); @@ -1364,7 +1364,7 @@ DATA; #1357=IFCSIMPLEPROPERTYTEMPLATE('1zZstJFI5FU8Nt1$$HUx6r',$,'Material','Material from which the object is constructed',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1358=IFCSIMPLEPROPERTYTEMPLATE('1VqdDHqFX2ivZJPcWGPKhO',$,'Color','Color selection for this object',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1359=IFCSIMPLEPROPERTYTEMPLATE('18sPWGUhr0VxDpKP0OfgRG',$,'DrainSize','The size of the drain outlet connection from the object',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1360=IFCPROPERTYSETTEMPLATE('11lQak3or0dgMn3d3OTQI$',$,'Pset_SanitaryTerminalTypeToiletPan','Definition from IAI: Soil appliance for the disposal of excrement.',$,'IfcSanitaryTerminalType',(#1361,#1363,#1365,#1367,#1368,#1369,#1370,#1371,#1372)); +#1360=IFCPROPERTYSETTEMPLATE('11lQak3or0dgMn3d3OTQI$',$,'Pset_SanitaryTerminalTypeToiletPan','Definition from IAI: Soil appliance for the disposal of excrement.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminalType',(#1361,#1363,#1365,#1367,#1368,#1369,#1370,#1371,#1372)); #1361=IFCSIMPLEPROPERTYTEMPLATE('13vqcFMG14MxgPZXDle8iK',$,'ToiletType','Enumeration that defines the types of toilet (water closet) arrangements that may be specified where:-\X2\000A000A\X0\BedPanWasher =\X2\0009\X0\Enclosed soil appliance in which bedpans and urinal bottles are emptied and cleansed\X2\000A\X0\Chemical =\X2\0009\X0\Portable receptacle or soil appliance that receives and retains excrement in either an integral or a separate container, in which it is chemically treated and from which it has to be emptied periodically.\X2\000A\X0\CloseCoupled =\X2\0009\X0\Toilet suite in which a flushing cistern is connected directly to the water closet pan.\X2\000A\X0\LooseCoupled =\X2\0009\X0\Toilet arrangement in which a flushing cistern is connected to the water closet pan through a flushing pipe.\X2\000A\X0\SlopHopper =\X2\0009\X0\Hopper shaped soil appliance with a flushing rim and outlet similar to those of a toilet pan, into which human excrement is emptied for disposal\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1362,$,$,$,.READWRITE.); #1362=IFCPROPERTYENUMERATION('PEnum_ToiletType',(IFCLABEL('BedPanWasher'),IFCLABEL('Chemical'),IFCLABEL('CloseCoupled'),IFCLABEL('LooseCoupled'),IFCLABEL('SlopHopper'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset\X2\000A\X0\')),$); #1363=IFCSIMPLEPROPERTYTEMPLATE('0j6YUivx1DDQ6GJJD7c$J6',$,'ToiletPanType','The property enumeration Pset_ToiletPanTypeEnum defines the types of toilet pan that may be specified within the property set Pset_Toilet:-\X2\000A000A\X0\Siphonic =\X2\0009\X0\Toilet pan in which excrement is removed by siphonage induced by the flushing water.\X2\000A\X0\Squat =\X2\0009\X0\Toilet pan with an elongated bowl installed with its top edge at or near floor level, so that the user has to squat.\X2\000A\X0\WashDown =\X2\0009\X0\Toilet pan in which excrement is removed by the momentum of the flushing water.\X2\000A\X0\WashOut =\X2\0009\X0\A washdown toilet pan in which excrement falls first into a shallow water filled bowl.\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1364,$,$,$,.READWRITE.); @@ -1377,7 +1377,7 @@ DATA; #1370=IFCSIMPLEPROPERTYTEMPLATE('1EvegHMkn7ywYxQmew$v2$',$,'NominalLength','Nominal or quoted length of the object. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1371=IFCSIMPLEPROPERTYTEMPLATE('3kKQVFsJr6leWyMHsXjWJB',$,'NominalWidth','Nominal or quoted width of the object. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1372=IFCSIMPLEPROPERTYTEMPLATE('0j6zDDuR57r8wknkOfks_n',$,'NominalDepth','Nominal or quoted depth of the object. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1373=IFCPROPERTYSETTEMPLATE('2OFsrjocL05QFX86gPkD69',$,'Pset_SanitaryTerminalTypeUrinal','Definition from IAI: Soil appliance that receives urine and directs it to a waste outlet (BS6100)',$,'IfcSanitaryTerminalType',(#1374,#1376,#1377,#1378,#1379,#1380,#1381)); +#1373=IFCPROPERTYSETTEMPLATE('2OFsrjocL05QFX86gPkD69',$,'Pset_SanitaryTerminalTypeUrinal','Definition from IAI: Soil appliance that receives urine and directs it to a waste outlet (BS6100)',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminalType',(#1374,#1376,#1377,#1378,#1379,#1380,#1381)); #1374=IFCSIMPLEPROPERTYTEMPLATE('0kgZdz4TL3owKdgQ_GVcfV',$,'UrinalType','Selection of the type of urinal from the enumerated list of types where:-\X2\000A000A\X0\Bowl =\X2\0009\X0\Individual wall mounted urinal\X2\000A\X0\Slab =\X2\0009\X0\Urinal that consists of a slab or sheet fixed to a wall and down which urinal flows into a floor channel\X2\000A\X0\Stall =\X2\0009\X0\Floor mounted urinal that consists of an elliptically shaped sanitary stall fixed to a wall and down which urine flows into a floor channel\X2\000A\X0\Trough =\X2\0009\X0\Wall mounted urinal of elongated rectangular shape on plan, that can be used by more than one person at a time.\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1375,$,$,$,.READWRITE.); #1375=IFCPROPERTYENUMERATION('PEnum_UrinalType',(IFCLABEL('Bowl'),IFCLABEL('Slab'),IFCLABEL('Stall'),IFCLABEL('Trough'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1376=IFCSIMPLEPROPERTYTEMPLATE('2dmsR$yOzFn8HU2OS9sruP',$,'UrinalMaterial','Material from which the object is constructed',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); @@ -1386,7 +1386,7 @@ DATA; #1379=IFCSIMPLEPROPERTYTEMPLATE('2GZusOswfEe9i61377muva',$,'NominalLength','Nominal or quoted length of the object. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1380=IFCSIMPLEPROPERTYTEMPLATE('2fUgiePqPBOwhCFvr20ucO',$,'NominalWidth','Nominal or quoted width of the object. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1381=IFCSIMPLEPROPERTYTEMPLATE('2lXsWD1kDFKATmFQ_kI8XE',$,'NominalDepth','Nominal or quoted depth of the object. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1382=IFCPROPERTYSETTEMPLATE('2FqsMJnH9EIfAN3K2ooVoU',$,'Pset_SanitaryTerminalTypeWashHandBasin','Definition from IAI: Waste water appliance for washing the upper parts of the body.',$,'IfcSanitaryTerminalType',(#1383,#1385,#1387,#1388,#1389,#1390,#1391,#1392)); +#1382=IFCPROPERTYSETTEMPLATE('2FqsMJnH9EIfAN3K2ooVoU',$,'Pset_SanitaryTerminalTypeWashHandBasin','Definition from IAI: Waste water appliance for washing the upper parts of the body.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminalType',(#1383,#1385,#1387,#1388,#1389,#1390,#1391,#1392)); #1383=IFCSIMPLEPROPERTYTEMPLATE('20i88bzOXB3876K$dHe79J',$,'WashHandBasinType','Defines the types of wash hand basin that may be specified where: \X2\000A\X0\DentalCuspidor = Waste water appliance that receives and flushes away mouth washings\X2\000A\X0\HandRinse = Wall mounted wash hand basin that has an overall width of 500mm or less\X2\000A\X0\Hospital = Wash hand basin that has a smooth easy clean surface without tapholes or overflow slot for use where hygiene is of prime importance. \X2\000A\X0\Tipup = Wash hand basin mounted on pivots so that it can be emptied by tilting \X2\000A\X0\Vanity = Wash hand basin for installation into a horizontal surface \X2\000A\X0\Washfountain = Wash hand basin that is circular, semi-circular or polygonal on plan, at which more than one person can wash at the same time. \X2\000A\X0\WashingTrough = Wash hand basin of elongated rectangular shape in plan, at which more than one person can wash at the same time.\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1384,$,$,$,.READWRITE.); #1384=IFCPROPERTYENUMERATION('PEnum_WashHandBasinType',(IFCLABEL('DentalCuspidor'),IFCLABEL('HandRinse'),IFCLABEL('Hospital'),IFCLABEL('Tipup'),IFCLABEL('Washfountain'),IFCLABEL('WashingTrough'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1385=IFCSIMPLEPROPERTYTEMPLATE('1xwCmWCuT8vQ0Z1BUJBgR0',$,'WashHandBasinMounting','Selection of the form of mounting from the enumerated list of mountings where:-\X2\000A000A\X0\BackToWall =\X2\0009\X0\A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal =\X2\0009\X0\A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop =\X2\0009\X0\A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung =\X2\0009\X0\A sanitary terminal cantilevered clear of the floor\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1386,$,$,$,.READWRITE.); @@ -1397,13 +1397,13 @@ DATA; #1390=IFCSIMPLEPROPERTYTEMPLATE('294eJ28gb8xg6I$xEXEnPm',$,'Material','Material from which the object is constructed',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1391=IFCSIMPLEPROPERTYTEMPLATE('3jwk8l1_HE3gm$48lDFfr2',$,'Color','Color of the object',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1392=IFCSIMPLEPROPERTYTEMPLATE('1rGFHs$hr2mPjJOLV0Ms68',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1393=IFCPROPERTYSETTEMPLATE('08QkFjLKX6tx8JMKDIPB_m',$,'Pset_SanitaryTerminalTypeWCSeat','Definition from IAI: Hinged seat that fits on the top of a water closet (WC) pan. (BS6100 330 1401)',$,'IfcSanitaryTerminalType',(#1394,#1396,#1397,#1398)); +#1393=IFCPROPERTYSETTEMPLATE('08QkFjLKX6tx8JMKDIPB_m',$,'Pset_SanitaryTerminalTypeWCSeat','Definition from IAI: Hinged seat that fits on the top of a water closet (WC) pan. (BS6100 330 1401)',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminalType',(#1394,#1396,#1397,#1398)); #1394=IFCSIMPLEPROPERTYTEMPLATE('1ITVk_5F51zvCWaOGcig23',$,'SeatType','The property enumeration Pset_ToiletSeatTypeEnum defines the types of seat that may be attached to the toilet pan and specified within the property set Pset_Toilet where:-\X2\000A000A\X0\Extension =\X2\0009\X0\WC seat that is attached at the back, by means of side or top hinges, to a flat piece of material secured to the water closet pan\X2\000A\X0\Inset =\X2\0009\X0\Seat that consists of pads of impervious material fixed to the top of a water closet pan\X2\000A\X0\OpenFrontSeat =\X2\0009\X0\Hinged WC seat shaped like a horseshoe with the gap at the front\X2\000A\X0\RingSeat =\X2\0009\X0\WC seat in the shape of a ring\X2\000A\X0\SelfRaising =\X2\0009\X0\WC seat with balanced weights or springs to raise it when not in use\X2\000A\X0\None =\X2\0009\X0\There is no seat attached to the water closet pan\X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1395,$,$,$,.READWRITE.); #1395=IFCPROPERTYENUMERATION('PEnum_ToiletSeatType',(IFCLABEL('Extension'),IFCLABEL('Inset'),IFCLABEL('OpenFrontSeat'),IFCLABEL('RingSeat'),IFCLABEL('SelfRaising'),IFCLABEL('None'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset\X2\000A\X0\')),$); #1396=IFCSIMPLEPROPERTYTEMPLATE('3LL5h4b8bAfBzUxdCD1jUT',$,'SeatHasCover','Indicates whether there is a cover associated with the toilet seat',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1397=IFCSIMPLEPROPERTYTEMPLATE('1S$MmsFnDDAhI38zW5iM7d',$,'SeatMaterial','Material from which the object is constructed',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1398=IFCSIMPLEPROPERTYTEMPLATE('323ZMxfZH8qvD8DPmTIhZP',$,'SeatColor','Color of the object',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1399=IFCPROPERTYSETTEMPLATE('2o_p2$KDv959sjfEuoEUT4',$,'Pset_WasteTerminalTypeFloorTrap','Definition from IAI: Pipe fitting, set into the floor, that retains liquid to prevent the passage of foul air.',$,'IfcWasteTerminalType',(#1400,#1401,#1402,#1403,#1404,#1405,#1406,#1408,#1409,#1410,#1412,#1413,#1414,#1415)); +#1399=IFCPROPERTYSETTEMPLATE('2o_p2$KDv959sjfEuoEUT4',$,'Pset_WasteTerminalTypeFloorTrap','Definition from IAI: Pipe fitting, set into the floor, that retains liquid to prevent the passage of foul air.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminalType',(#1400,#1401,#1402,#1403,#1404,#1405,#1406,#1408,#1409,#1410,#1412,#1413,#1414,#1415)); #1400=IFCSIMPLEPROPERTYTEMPLATE('0AHAcKmYP5MgGID6y9xbBl',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the chamber of the trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1401=IFCSIMPLEPROPERTYTEMPLATE('09mc8Wc4f2pOS1JrEjnhZw',$,'NominalBodyWidth','Nominal or quoted length measured along the y-axis in the local coordinate system of the chamber of the trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1402=IFCSIMPLEPROPERTYTEMPLATE('3NviMgWqH6hui5ldmWnu_3',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis in the local coordinate system of the chamber of the trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1420,7 +1420,7 @@ DATA; #1413=IFCSIMPLEPROPERTYTEMPLATE('1xm3sojVn4uxijPhTdxAwh',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1414=IFCSIMPLEPROPERTYTEMPLATE('22PZlWd_H5R8Vb7hiofbiq',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1415=IFCSIMPLEPROPERTYTEMPLATE('0wNkLg7UXEgulwUrOx2YZI',$,'CoverMaterial','Material from which the cover or grating is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1416=IFCPROPERTYSETTEMPLATE('2XKiokOv95J9G5uv9Z4d5l',$,'Pset_WasteTerminalTypeFloorWaste','Definition from IAI: Pipe fitting, set into the floor, that collects waste water and discharges it to a separate trap.',$,'IfcWasteTerminalType',(#1417,#1418,#1419,#1420,#1421,#1422,#1423,#1424)); +#1416=IFCPROPERTYSETTEMPLATE('2XKiokOv95J9G5uv9Z4d5l',$,'Pset_WasteTerminalTypeFloorWaste','Definition from IAI: Pipe fitting, set into the floor, that collects waste water and discharges it to a separate trap.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminalType',(#1417,#1418,#1419,#1420,#1421,#1422,#1423,#1424)); #1417=IFCSIMPLEPROPERTYTEMPLATE('0YzElMgtrE3vLhjmczytxl',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the waste.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1418=IFCSIMPLEPROPERTYTEMPLATE('38G_Ra3zXFzuduLLNvqYpz',$,'NominalBodyWidth','Nominal or quoted length measured along the y-axis in the local coordinate system of the waste.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1419=IFCSIMPLEPROPERTYTEMPLATE('0hFdDLXqHChhUfhD30qkwU',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis in the local coordinate system of the waste.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1429,7 +1429,7 @@ DATA; #1422=IFCSIMPLEPROPERTYTEMPLATE('2LNsOC0$v6AA4LkwvWLcy_',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the waste.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1423=IFCSIMPLEPROPERTYTEMPLATE('2VDclZqvv44wKpvEm$hfya',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the waste.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1424=IFCSIMPLEPROPERTYTEMPLATE('201ko5kY10nxiEqjwa9sJ9',$,'CoverMaterial','Material from which the cover or grating is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1425=IFCPROPERTYSETTEMPLATE('39zfWQJwjA58HpwhP016H6',$,'Pset_WasteTerminalTypeGreaseInterceptor','Definition from IAI: Chamber, on the line of a drain or discharge pipe, that prevents grease passing into a drainage system (BS6100 330 6205).',$,'IfcWasteTerminalType',(#1426,#1427,#1428,#1429,#1430,#1431,#1432,#1433,#1434,#1435,#1436,#1437)); +#1425=IFCPROPERTYSETTEMPLATE('39zfWQJwjA58HpwhP016H6',$,'Pset_WasteTerminalTypeGreaseInterceptor','Definition from IAI: Chamber, on the line of a drain or discharge pipe, that prevents grease passing into a drainage system (BS6100 330 6205).',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminalType',(#1426,#1427,#1428,#1429,#1430,#1431,#1432,#1433,#1434,#1435,#1436,#1437)); #1426=IFCSIMPLEPROPERTYTEMPLATE('0croF6N6X4EBlMmc$gmWM8',$,'NominalBodyMaterial','The material from which the object is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1427=IFCSIMPLEPROPERTYTEMPLATE('0atQVt89f9$9zYFnicAJkE',$,'NominalBodyLength','Nominal or quoted length, measured along the x-axis of the local coordinate system of the object, of the body of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1428=IFCSIMPLEPROPERTYTEMPLATE('311USf8L98BOL2ancnw6eY',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object, of the body of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1442,7 +1442,7 @@ DATA; #1435=IFCSIMPLEPROPERTYTEMPLATE('3Mer$yQpz2zRq4Egjs4bam',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the grease interceptor.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1436=IFCSIMPLEPROPERTYTEMPLATE('19CxfvIhfBMwHUQeJJaY_U',$,'CoverWidth','The length measured along the x-axis in the local coordinate system of the cover of the grease interceptor.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1437=IFCSIMPLEPROPERTYTEMPLATE('21_rtZewP5rPy4HY3oostk',$,'CoverMaterial','Material from which the cover is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1438=IFCPROPERTYSETTEMPLATE('2sKyYKyuTFmQRTfVegJSpE',$,'Pset_WasteTerminalTypeGullySump','Definition from IAI: Pipe fitting or assembly of fittings to receive surface water or waste water, fitted with a grating or sealed cover.',$,'IfcWasteTerminalType',(#1439,#1440,#1441,#1442,#1443,#1445,#1447,#1448,#1450,#1451,#1452,#1453)); +#1438=IFCPROPERTYSETTEMPLATE('2sKyYKyuTFmQRTfVegJSpE',$,'Pset_WasteTerminalTypeGullySump','Definition from IAI: Pipe fitting or assembly of fittings to receive surface water or waste water, fitted with a grating or sealed cover.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminalType',(#1439,#1440,#1441,#1442,#1443,#1445,#1447,#1448,#1450,#1451,#1452,#1453)); #1439=IFCSIMPLEPROPERTYTEMPLATE('3MZFpbNUH8fPXHzRarDbpX',$,'NominalSumpLength','Nominal or quoted length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1440=IFCSIMPLEPROPERTYTEMPLATE('2H02rYIJf1HvJYIRsFzQd6',$,'NominalSumpWidth','Nominal or quoted length measured along the y-axis in the local coordinate system of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1441=IFCSIMPLEPROPERTYTEMPLATE('3UGKGTSj1188s1CwawLazK',$,'NominalSumpDepth','Nominal or quoted length measured along the z-axis in the local coordinate system of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1458,7 +1458,7 @@ DATA; #1451=IFCSIMPLEPROPERTYTEMPLATE('2sLokuNOfD8998_b8ML$pF',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the gully trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1452=IFCSIMPLEPROPERTYTEMPLATE('3syl0SgEz7GerMlU_fpaC9',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the gully trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1453=IFCSIMPLEPROPERTYTEMPLATE('1adT8Vs_55reMkbSEp_GuX',$,'CoverMaterial','Material from which the object is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1454=IFCPROPERTYSETTEMPLATE('0xxkk4vAfAwASTs$NJg__F',$,'Pset_WasteTerminalTypeGullyTrap','Definition from IAI: Pipe fitting or assembly of fittings to receive surface water or waste water, fitted with a grating or sealed cover and discharging through a trap (BS6100 330 3504 modified)',$,'IfcWasteTerminalType',(#1455,#1456,#1457,#1458,#1459,#1461,#1462,#1464,#1465,#1467,#1468,#1469,#1470)); +#1454=IFCPROPERTYSETTEMPLATE('0xxkk4vAfAwASTs$NJg__F',$,'Pset_WasteTerminalTypeGullyTrap','Definition from IAI: Pipe fitting or assembly of fittings to receive surface water or waste water, fitted with a grating or sealed cover and discharging through a trap (BS6100 330 3504 modified)',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminalType',(#1455,#1456,#1457,#1458,#1459,#1461,#1462,#1464,#1465,#1467,#1468,#1469,#1470)); #1455=IFCSIMPLEPROPERTYTEMPLATE('0jUXptVbz7ggX$vMULbOxQ',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the chamber of the gully trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1456=IFCSIMPLEPROPERTYTEMPLATE('0VhgByDWD90htC$BYJYrSD',$,'NominalBodyWidth','Nominal or quoted length measured along the y-axis in the local coordinate system of the chamber of the gully trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1457=IFCSIMPLEPROPERTYTEMPLATE('1RoGTg7_X7wwXD7yPiGtrO',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis in the local coordinate system of the chamber of the gully trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1475,7 +1475,7 @@ DATA; #1468=IFCSIMPLEPROPERTYTEMPLATE('3cblPMORP0l9Ws6aCE9P_L',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the gully trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1469=IFCSIMPLEPROPERTYTEMPLATE('2b8mNlhhD4wOdYVxFwIeqL',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the gully trap.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1470=IFCSIMPLEPROPERTYTEMPLATE('1kz_U2Q5TCGuWDpiDoHHEj',$,'CoverMaterial','Material from which the object is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1471=IFCPROPERTYSETTEMPLATE('3QBhCrbSP0xRtCWSuwKE2T',$,'Pset_WasteTerminalTypeOilInterceptor','Definition from IAI: One or more chambers arranged to prevent the ingress of oil to a drain or sewer, that retain the oil for later removal (BS6100 330 67316).',$,'IfcWasteTerminalType',(#1472,#1473,#1474,#1475,#1476,#1477,#1478,#1479,#1480)); +#1471=IFCPROPERTYSETTEMPLATE('3QBhCrbSP0xRtCWSuwKE2T',$,'Pset_WasteTerminalTypeOilInterceptor','Definition from IAI: One or more chambers arranged to prevent the ingress of oil to a drain or sewer, that retain the oil for later removal (BS6100 330 67316).',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminalType',(#1472,#1473,#1474,#1475,#1476,#1477,#1478,#1479,#1480)); #1472=IFCSIMPLEPROPERTYTEMPLATE('0R9xNLoJ92gBdxSR4oY1eP',$,'BodyMaterial','The material from which the object is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1473=IFCSIMPLEPROPERTYTEMPLATE('0Fn5gBbl5B5BpbvYLXLxqK',$,'NominalBodyLength','Nominal or quoted length, measured along the x-axis of the local coordinate system of the object, of the body of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1474=IFCSIMPLEPROPERTYTEMPLATE('2QEF85GV52FAt8ymUGziYF',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object, of the body of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1485,7 +1485,7 @@ DATA; #1478=IFCSIMPLEPROPERTYTEMPLATE('3yUvbCRHj8uuTYKya38fch',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the oil interceptor.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1479=IFCSIMPLEPROPERTYTEMPLATE('0RlzfVHOD94A6WVzFeEfkq',$,'CoverWidth','The length measured along the x-axis in the local coordinate system of the cover of the oil interceptor.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1480=IFCSIMPLEPROPERTYTEMPLATE('2aKWNJzgjCmuAE5VlygEu_',$,'CoverMaterial','Material from which the cover is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1481=IFCPROPERTYSETTEMPLATE('3EO7zk5$T3DwPb8o1iF6n2',$,'Pset_WasteTerminalTypePetrolInterceptor','Definition from IAI: Two or more chambers with inlet and outlet pipes arranged to allow petrol/gasoline collected on the surface of water drained into them to evaporate through ventilating pipes.',$,'IfcWasteTerminalType',(#1482,#1483,#1484,#1485,#1486,#1487,#1488,#1489,#1490,#1491)); +#1481=IFCPROPERTYSETTEMPLATE('3EO7zk5$T3DwPb8o1iF6n2',$,'Pset_WasteTerminalTypePetrolInterceptor','Definition from IAI: Two or more chambers with inlet and outlet pipes arranged to allow petrol/gasoline collected on the surface of water drained into them to evaporate through ventilating pipes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminalType',(#1482,#1483,#1484,#1485,#1486,#1487,#1488,#1489,#1490,#1491)); #1482=IFCSIMPLEPROPERTYTEMPLATE('2phwys9RP52ASTw4sDTxZs',$,'BodyMaterial','The material from which the object is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1483=IFCSIMPLEPROPERTYTEMPLATE('2bBYdkEW58dh6v34IvZROc',$,'NominalBodyLength','Nominal or quoted length, measured along the x-axis of the local coordinate system of the object, of the body of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1484=IFCSIMPLEPROPERTYTEMPLATE('3Li2MYSqbFJejAv5SiYDeX',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object, of the body of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1496,7 +1496,7 @@ DATA; #1489=IFCSIMPLEPROPERTYTEMPLATE('3KnTf2cj94tPapDoxUZ4CW',$,'CoverWidth','The length measured along the x-axis in the local coordinate system of the cover of the oil interceptor.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1490=IFCSIMPLEPROPERTYTEMPLATE('3vJsvHn0b3Ih3GucqHb2YO',$,'CoverMaterial','Material from which the cover is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1491=IFCSIMPLEPROPERTYTEMPLATE('07LoOFVtf9Fx3s0P2auZHT',$,'VentilatingPipeSize','Size of the ventilating pipe(s)',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1492=IFCPROPERTYSETTEMPLATE('0Dod68NUnBqQvFF8OG_Z5B',$,'Pset_WasteTerminalTypeRoofDrain','Definition from IAI: Pipe fitting, set into the roof, that collects rainwater for discharge into the rainwater system.',$,'IfcWasteTerminalType',(#1493,#1494,#1495,#1496,#1497,#1498,#1499,#1500)); +#1492=IFCPROPERTYSETTEMPLATE('0Dod68NUnBqQvFF8OG_Z5B',$,'Pset_WasteTerminalTypeRoofDrain','Definition from IAI: Pipe fitting, set into the roof, that collects rainwater for discharge into the rainwater system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminalType',(#1493,#1494,#1495,#1496,#1497,#1498,#1499,#1500)); #1493=IFCSIMPLEPROPERTYTEMPLATE('2wDCaIdQ13Ef_GwbA16ACN',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the drain.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1494=IFCSIMPLEPROPERTYTEMPLATE('3pScwF7XLDDOkphT_hN48X',$,'NominalBodyWidth','Nominal or quoted length measured along the y-axis in the local coordinate system of the drain.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1495=IFCSIMPLEPROPERTYTEMPLATE('2o2Ff7oTL2fP2AmzwwwNyt',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis in the local coordinate system of the drain.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1505,16 +1505,16 @@ DATA; #1498=IFCSIMPLEPROPERTYTEMPLATE('112vKSZ6H21fjGRImq1$cs',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the drain.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1499=IFCSIMPLEPROPERTYTEMPLATE('2c8MhcJbDBcR1blu_aRuMJ',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the drain.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1500=IFCSIMPLEPROPERTYTEMPLATE('0VxznatA13OBTks7aySFwr',$,'CoverMaterial','Material from which the cover or grating is constructed.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1501=IFCPROPERTYSETTEMPLATE('3MSyRP0iPAhQ30ERNjMZyI',$,'Pset_WasteTerminalTypeWasteDisposalUnit','Definition from IAI: Electrically operated device that reduces kitchen or other waste into fragments small enough to be flushed into a drainage system.',$,'IfcWasteTerminalType',(#1502,#1503,#1504)); +#1501=IFCPROPERTYSETTEMPLATE('3MSyRP0iPAhQ30ERNjMZyI',$,'Pset_WasteTerminalTypeWasteDisposalUnit','Definition from IAI: Electrically operated device that reduces kitchen or other waste into fragments small enough to be flushed into a drainage system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminalType',(#1502,#1503,#1504)); #1502=IFCSIMPLEPROPERTYTEMPLATE('1_eW6Y0N57gv4_NKlihtN4',$,'DrainConnectionSize','Size of the drain connection inlet to the waste disposal unit.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1503=IFCSIMPLEPROPERTYTEMPLATE('3ykghronL0nfK25x0pWqBI',$,'OutletConnectionSize','Size of the outlet connection from the waste disposal unit',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1504=IFCSIMPLEPROPERTYTEMPLATE('0mIUfbaYPBbxY5BuFK4lw7',$,'NominalDepth','Nominal or quoted depth of the object measured from the inlet drain connection to the base of the unit.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1505=IFCPROPERTYSETTEMPLATE('1GCacasTj5oeZnpHdahKd2',$,'Pset_WasteTerminalTypeWasteTrap','Definition from IAI: Pipe fitting, set adjacent to a sanitary terminal, that retains liquid to prevent the passage of foul air.',$,'IfcWasteTerminalType',(#1506,#1508,#1509)); +#1505=IFCPROPERTYSETTEMPLATE('1GCacasTj5oeZnpHdahKd2',$,'Pset_WasteTerminalTypeWasteTrap','Definition from IAI: Pipe fitting, set adjacent to a sanitary terminal, that retains liquid to prevent the passage of foul air.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminalType',(#1506,#1508,#1509)); #1506=IFCSIMPLEPROPERTYTEMPLATE('2WUUeCNWH7y9yuuZH_y7VO',$,'WasteTrapType','Identifies the predefined types of trap from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1507,$,$,$,.READWRITE.); #1507=IFCPROPERTYENUMERATION('PEnum_TrapType',(IFCLABEL('None'),IFCLABEL('P_Trap'),IFCLABEL('Q_Trap'),IFCLABEL('S_Trap'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #1508=IFCSIMPLEPROPERTYTEMPLATE('27XM5WuunA7Bu1BtNFVlO$',$,'OutletConnectionSize','Size of the outlet connection from the object',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1509=IFCSIMPLEPROPERTYTEMPLATE('0goThPNYjBbQcAQKpCe1zP',$,'InletConnectionSize','Size of the inlet connection(s), where used, of the inlet connections.\X2\000A000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1510=IFCPROPERTYSETTEMPLATE('1DLDSVpGn0PuXpMZtfUJHb',$,'Pset_BuildingCommon','Definition from IAI: Properties common to the definition of all instances of IfcBuilding. Please note that several building attributes are handled directly at the IfcBuilding instance, the building number (or short name) by IfcBuilding.Name, the building name (or long name) by IfcBuilding.LongName, and the description (or comments) by IfcBuilding.Description. Actual building quantities, like building perimeter, building area and building volume are provided by IfcElementQuantities, and the building classification according to national building code by IfcClassificationReference. ',$,'IfcBuilding',(#1511,#1512,#1513,#1514,#1515,#1516,#1517,#1518,#1519,#1520,#1521)); +#1510=IFCPROPERTYSETTEMPLATE('1DLDSVpGn0PuXpMZtfUJHb',$,'Pset_BuildingCommon','Definition from IAI: Properties common to the definition of all instances of IfcBuilding. Please note that several building attributes are handled directly at the IfcBuilding instance, the building number (or short name) by IfcBuilding.Name, the building name (or long name) by IfcBuilding.LongName, and the description (or comments) by IfcBuilding.Description. Actual building quantities, like building perimeter, building area and building volume are provided by IfcElementQuantities, and the building classification according to national building code by IfcClassificationReference. ',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#1511,#1512,#1513,#1514,#1515,#1516,#1517,#1518,#1519,#1520,#1521)); #1511=IFCSIMPLEPROPERTYTEMPLATE('12eEDv_jjDhedlYbyy92xh',$,'BuildingID','A unique identifier assigned to a building. A temporary identifier is initially assigned at the time of making a planning application. This temporary identifier is changed to a permanent identifier when the building is registered into a statutory buildings and properties database.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1512=IFCSIMPLEPROPERTYTEMPLATE('0MBM57Wkn3cvQDjTrXiAeT',$,'IsPermanentID','Indicates whether the identity assigned to a building is permanent (= TRUE) or temporary (=FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1513=IFCSIMPLEPROPERTYTEMPLATE('0xDEBuscHFAAfxCp_DMQM2',$,'MainFireUse','Main fire use for the building which is assigned from the fire use classification table as given by the relevant national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1526,16 +1526,16 @@ DATA; #1519=IFCSIMPLEPROPERTYTEMPLATE('2CmDsKXWr0z8AZvbIkdL6C',$,'NumberOfStoreys','Captures the number of storeys within a building for those cases where the IfcBuildingStorey entity is not used. Note that if IfcBuilingStorey is asserted and the number of storeys in a building can be determined from it, then this approach should be used in preference to setting a property for the number of storeys.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #1520=IFCSIMPLEPROPERTYTEMPLATE('1xIMJ8$9z0lh2ts$AUKtfk',$,'YearOfConstruction','Year of construction of this building, including expected year of completion.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1521=IFCSIMPLEPROPERTYTEMPLATE('2l9YIuVc15FuDvpdVhfZAg',$,'IsLandmarked','This builing is listed as a historic building (TRUE), or not (FALSE), or unknown.',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); -#1522=IFCPROPERTYSETTEMPLATE('10ZPAup_v82OJ78L7j3Rop',$,'Pset_BuildingElementProxyCommon','Definition from IAI: Properties common to the definition of all instances of IfcBuildingElementProxy.',$,'IfcBuildingElementProxy',(#1523)); +#1522=IFCPROPERTYSETTEMPLATE('10ZPAup_v82OJ78L7j3Rop',$,'Pset_BuildingElementProxyCommon','Definition from IAI: Properties common to the definition of all instances of IfcBuildingElementProxy.',.PSET_OCCURRENCEDRIVEN.,'IfcBuildingElementProxy',(#1523)); #1523=IFCSIMPLEPROPERTYTEMPLATE('2cSDiPkqL4lB8w1e3Bbr_7',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1524=IFCPROPERTYSETTEMPLATE('06kR_4_$93Oh9$yrlFe9Gh',$,'Pset_BuildingStoreyCommon','Definition from IAI: Properties common to the definition of all instances of IfcBuildingStorey. Please note that several building attributes are handled directly at the IfcBuildingStorey instance, the building storey number (or short name) by IfcBuildingStorey.Name, the building storey name (or long name) by IfcBuildingStorey.LongName, and the description (or comments) by IfcBuildingStorey.Description. Actual building storey quantities, like building storey perimeter, building storey area and building storey volume are provided by IfcElementQuantities, and the building storey classification according to national building code by IfcClassificationReference. \X2\000A\X0\',$,'IfcBuildingStorey',(#1525,#1526,#1527,#1528,#1529,#1530)); +#1524=IFCPROPERTYSETTEMPLATE('06kR_4_$93Oh9$yrlFe9Gh',$,'Pset_BuildingStoreyCommon','Definition from IAI: Properties common to the definition of all instances of IfcBuildingStorey. Please note that several building attributes are handled directly at the IfcBuildingStorey instance, the building storey number (or short name) by IfcBuildingStorey.Name, the building storey name (or long name) by IfcBuildingStorey.LongName, and the description (or comments) by IfcBuildingStorey.Description. Actual building storey quantities, like building storey perimeter, building storey area and building storey volume are provided by IfcElementQuantities, and the building storey classification according to national building code by IfcClassificationReference. \X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcBuildingStorey',(#1525,#1526,#1527,#1528,#1529,#1530)); #1525=IFCSIMPLEPROPERTYTEMPLATE('1erlnsTXjEuQBl3EXikiyh',$,'EntranceLevel','Indication whether this building storey is an entrance level to the building (TRUE), or (FALSE) if otherwise.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1526=IFCSIMPLEPROPERTYTEMPLATE('0xcolJKA9DlAoPdQU5zsbJ',$,'AboveGround','Indication whether this building storey is fully above ground (TRUE), or below ground (FALSE), or partially above and below ground (UNKNOWN) - as in sloped terrain.',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); #1527=IFCSIMPLEPROPERTYTEMPLATE('1wJI$e_ML5gfSJE4QibVN$',$,'SprinklerProtection','Indication whether this object is sprinkler protected (true) or not (false).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1528=IFCSIMPLEPROPERTYTEMPLATE('00X29dv1LBKQQbXeg6tFRv',$,'SprinklerProtectionAutomatic','Indication whether this object has an automatic sprinkler protection (true) or not (false).\X2\000A\X0\It should only be given, if the property "SprinklerProtection" is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1529=IFCSIMPLEPROPERTYTEMPLATE('330t2_dMj0jx_eaNbJe1uh',$,'GrossAreaPlanned','Total planned area for the building storey. Used for programming the building storey.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #1530=IFCSIMPLEPROPERTYTEMPLATE('0jlH4Q_b94Bw7YAyTumSkk',$,'NetAreaPlanned','Total planned net area for the building storey. Used for programming the building storey.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1531=IFCPROPERTYSETTEMPLATE('3VQgIPXUz88gjAWnaLgZ6L',$,'Pset_BuildingUse','Definition from IAI: Provides information on on the real estate context of the building of interest both current and anticipated.',$,'IfcBuilding',(#1532,#1533,#1534,#1535,#1536,#1537,#1538,#1539,#1540,#1541,#1542,#1543)); +#1531=IFCPROPERTYSETTEMPLATE('3VQgIPXUz88gjAWnaLgZ6L',$,'Pset_BuildingUse','Definition from IAI: Provides information on on the real estate context of the building of interest both current and anticipated.',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#1532,#1533,#1534,#1535,#1536,#1537,#1538,#1539,#1540,#1541,#1542,#1543)); #1532=IFCSIMPLEPROPERTYTEMPLATE('1wv5oOw1j8mwgjPFGt39ML',$,'MarketCategory','Category of use e.g. residential, commercial, recreation etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1533=IFCSIMPLEPROPERTYTEMPLATE('2hzpGNe8fEavQQvmMWMIIR',$,'MarketSubCategory','Subset of category of use e.g. multi-family, 2 bedroom, low rise',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1534=IFCSIMPLEPROPERTYTEMPLATE('1f7TKOAi9BSAE7yWrZn1S$',$,'PlanningControlStatus','Label of zoning category or class, or planning control category for the site or facility.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1548,23 +1548,23 @@ DATA; #1541=IFCSIMPLEPROPERTYTEMPLATE('1CWkk7RsT2zvuscrotOSr2',$,'TenureModesAvailableFuture','A list of the tenure modes that are expected to be available in the future expressed in terms of IfcLabel',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1542=IFCSIMPLEPROPERTYTEMPLATE('02WkYiSBP9CAVPF4k_oCH9',$,'MarketSubCategoriesAvailableFuture','A list of the sub categories of property that are expected to be available in the future expressed in terms of IfcLabel',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1543=IFCSIMPLEPROPERTYTEMPLATE('0m4$kZ$jL6m9XK6L_KuMP6',$,'RentalRatesInCategoryFuture','Range of the cost rates for property expected to be available in the future in the required category.',.P_BOUNDEDVALUE.,'IfcMonetaryMeasure',$,$,$,$,$,.READWRITE.); -#1544=IFCPROPERTYSETTEMPLATE('0BulcaI2jBjO9CpsnbSlmJ',$,'Pset_BuildingUseAdjacent','Definition from IAI: Provides information on adjacent buildings and their uses to enable their impact on the building of interest to be determined. Note that for each instance of the property set used, where there is an existence of risk, there will be an instance of the property set Pset_Risk (q.v)',$,'IfcBuilding',(#1545,#1546,#1547,#1548)); +#1544=IFCPROPERTYSETTEMPLATE('0BulcaI2jBjO9CpsnbSlmJ',$,'Pset_BuildingUseAdjacent','Definition from IAI: Provides information on adjacent buildings and their uses to enable their impact on the building of interest to be determined. Note that for each instance of the property set used, where there is an existence of risk, there will be an instance of the property set Pset_Risk (q.v)',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#1545,#1546,#1547,#1548)); #1545=IFCSIMPLEPROPERTYTEMPLATE('0sNdIDKFD7VvrrI7xKhTlL',$,'MarketCategory','Category of use e.g. residential, commercial, recreation etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1546=IFCSIMPLEPROPERTYTEMPLATE('20SvjKPBPBDQL0_IUrxKrG',$,'MarketSubCategory','Subset of category of use e.g. multi-family, 2 bedroom, low rise',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1547=IFCSIMPLEPROPERTYTEMPLATE('2Mu45VPWf9v9jnncdCdot9',$,'PlanningControlStatus','Label of zoning category or class, or planning control category for the site or facility.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1548=IFCSIMPLEPROPERTYTEMPLATE('3hEwPFeFr3gQUbM67yCoYH',$,'NarrativeText','Added information relating to the adjacent building use that is not appropriate to the general descriptive text associated with an entity through the inherited IfcRoot.Description',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1549=IFCPROPERTYSETTEMPLATE('2nZ1R73tvCF9D4tFgWnhtW',$,'Pset_BuildingWaterStorage','The basic set of properties that are used for determining the water requirements for a building.\X2\000A\X0\Typically, this property set is expected to be used in conjunction with IfcBuilding.',$,'IfcBuilding',(#1550,#1551,#1552,#1553,#1554)); +#1549=IFCPROPERTYSETTEMPLATE('2nZ1R73tvCF9D4tFgWnhtW',$,'Pset_BuildingWaterStorage','The basic set of properties that are used for determining the water requirements for a building.\X2\000A\X0\Typically, this property set is expected to be used in conjunction with IfcBuilding.',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#1550,#1551,#1552,#1553,#1554)); #1550=IFCSIMPLEPROPERTYTEMPLATE('0uNA0VywDBCfKK71vgxPli',$,'WaterStorageRatePerPerson','The volume of domestic water that needs to be stored per person. ',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); #1551=IFCSIMPLEPROPERTYTEMPLATE('0kNVBqIWDDWf2K69DenrGZ',$,'OneDayPotableWater','The volume of water that needs to be stored to supply water to the building for human use for one day in the event of water supply failure.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); #1552=IFCSIMPLEPROPERTYTEMPLATE('1YIy5KYjT6M9gTZXsfN8wK',$,'OneDayEssentialWater','The volume of water that needs to be stored to supply water to the building for uninterrupted water supply to essential areas for one day in the event of water supply failure. An essential area is considered to be a part of a building carrying out a critical function and that is unable to operate in the intended manner without a water supply.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); #1553=IFCSIMPLEPROPERTYTEMPLATE('11Tmi4d6fDLOBdDrGnypKy',$,'OneDayCoolingTowerMakeupWater','The volume of water that needs to be stored to supply make up water to the cooling towers in a building for one day in the event of water supply failure.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); #1554=IFCSIMPLEPROPERTYTEMPLATE('1zHlBCrJrEqg7kQk9ZTHat',$,'OneDayProcessOrProductionWater','The volume of water that needs to be stored to supply water for process or production requirements in a building for one day in the event of water supply failure.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#1555=IFCPROPERTYSETTEMPLATE('36FWmrk692CgIg7u0hvxhe',$,'Pset_CoveringCeiling','Definition from IAI: Properties common to the definition of all occurrences of IfcCovering with the PredefinedType set to CEILING.',$,'IfcCovering',(#1556,#1557,#1558,#1559)); +#1555=IFCPROPERTYSETTEMPLATE('36FWmrk692CgIg7u0hvxhe',$,'Pset_CoveringCeiling','Definition from IAI: Properties common to the definition of all occurrences of IfcCovering with the PredefinedType set to CEILING.',.PSET_OCCURRENCEDRIVEN.,'IfcCovering',(#1556,#1557,#1558,#1559)); #1556=IFCSIMPLEPROPERTYTEMPLATE('1kN735JdD0_vHHzuHi4$9P',$,'FragilityRating','The level of fragility of the ceiling.\X2\000A\X0\It is giving according to the national building code. ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1557=IFCSIMPLEPROPERTYTEMPLATE('1jROxcPgb5sRQ3RfkDgw3E',$,'Permeability','Ratio of the permeability of the ceiling.\X2\000A\X0\The ration can be used to indicate an open ceiling (that enables identification of whether ceiling construction should be considered as impeding distribution of sprinkler water, light etc. from installations within the ceiling area) .',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); #1558=IFCSIMPLEPROPERTYTEMPLATE('12ecHK3rD5D9pzYS5jIDcw',$,'TileLength','Length of ceiling tiles. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1559=IFCSIMPLEPROPERTYTEMPLATE('1u0RM5zkD86vDgjKmFjck6',$,'TileWidth','Width of ceiling tiles. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1560=IFCPROPERTYSETTEMPLATE('2D5B7GMaLFa8iibZZush4g',$,'Pset_CoveringCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcCovering.',$,'IfcCovering,IfcCoveringType',(#1561,#1562,#1563,#1564,#1565,#1566,#1567,#1568,#1569,#1570)); +#1560=IFCPROPERTYSETTEMPLATE('2D5B7GMaLFa8iibZZush4g',$,'Pset_CoveringCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcCovering.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCovering,IfcCoveringType',(#1561,#1562,#1563,#1564,#1565,#1566,#1567,#1568,#1569,#1570)); #1561=IFCSIMPLEPROPERTYTEMPLATE('15BAZa3rrDmxn_6_$7uYKJ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1562=IFCSIMPLEPROPERTYTEMPLATE('2qjHmAC151ohdZH7pA8Khn',$,'FireRating','Fire rating for this object.\X2\000A\X0\It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1563=IFCSIMPLEPROPERTYTEMPLATE('3W6wydFhb5yRHMfVu5W5gb',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is giving according to the national building code. It indicates the sound transmission resistance of this object by an index ration (instead of providing full sound absorbtion values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1575,16 +1575,16 @@ DATA; #1568=IFCSIMPLEPROPERTYTEMPLATE('3wPoeu6jPCb95ldJhw_2tV',$,'Combustible','Indication whether the object is made from combustible material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1569=IFCSIMPLEPROPERTYTEMPLATE('12GDK5Syv5tgvSoNPbsHkG',$,'TotalThickness','Thickness of the covering, The thickness information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1570=IFCSIMPLEPROPERTYTEMPLATE('3kDD6F4UnCn8DBo0V$v3Rk',$,'Finish','Finish selection for this object.\X2\000A\X0\Here specification of the surface finish for informational purposes',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1571=IFCPROPERTYSETTEMPLATE('3LLtzjasr8UBSdTle7mmyx',$,'Pset_CoveringFlooring','Definition from IAI: Properties common to the definition of all occurrences of IfcCovering with the PredefinedType set to FLOORING.',$,'IfcCovering',(#1572,#1573)); +#1571=IFCPROPERTYSETTEMPLATE('3LLtzjasr8UBSdTle7mmyx',$,'Pset_CoveringFlooring','Definition from IAI: Properties common to the definition of all occurrences of IfcCovering with the PredefinedType set to FLOORING.',.PSET_OCCURRENCEDRIVEN.,'IfcCovering',(#1572,#1573)); #1572=IFCSIMPLEPROPERTYTEMPLATE('1j6xw$AqD0Zv0818ehHqCJ',$,'HasNonSkidSurface','Indication whether the surface finish is designed to prevent slippery (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1573=IFCSIMPLEPROPERTYTEMPLATE('2eoXJfDe96$fzP8AReSEfU',$,'HasAntiStaticSurface','Indication whether the surface finish is designed to prevent electrostatic charge (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1574=IFCPROPERTYSETTEMPLATE('1feg9_SEfCOxF0QLGO2Fai',$,'Pset_Draughting','Definition from IAI: Property set to capture layer and colour as a quick win implementation within IFC2x platform to enable more efficient exchange of 3D building models.\X2\000A\X0\NOTE: With implementation of the IFC2x2 capabilities defined in the presentation resources (IfcPresentationLayerAssignment, IfcCurveStyle) the use of this property set may become obsolete.',$,'IfcElement,IfcSpatialStructureElement',(#1575,#1576)); +#1574=IFCPROPERTYSETTEMPLATE('1feg9_SEfCOxF0QLGO2Fai',$,'Pset_Draughting','Definition from IAI: Property set to capture layer and colour as a quick win implementation within IFC2x platform to enable more efficient exchange of 3D building models.\X2\000A\X0\NOTE: With implementation of the IFC2x2 capabilities defined in the presentation resources (IfcPresentationLayerAssignment, IfcCurveStyle) the use of this property set may become obsolete.',.PSET_OCCURRENCEDRIVEN.,'IfcElement,IfcSpatialStructureElement',(#1575,#1576)); #1575=IFCSIMPLEPROPERTYTEMPLATE('0$a6tMVaj9aevVxaru0kqa',$,'LayerName','Identifier of the layer name within the sending application.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1576=IFCCOMPLEXPROPERTYTEMPLATE('0jdn88Ifr4wgOEntxHPg2M',$,'Colour','Significant colour definition of the whole element for all shape representations, it is given for highlighting/differentiation purposes, full colour representation of individual geometric representation items, using the IFC2x2 presentation schemas, always takes precedence. In case of several colour information available (line, upper/lower surface, etc.) the sending application shall identify the most significant single colour to be included,','RGB_Colour',.P_COMPLEX.,(#1577,#1578,#1579)); #1577=IFCSIMPLEPROPERTYTEMPLATE('3XsqfcdDr16ftypeeq46Al',$,'Red','Red component of the RGB colour specification given by an integer of 0..255',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #1578=IFCSIMPLEPROPERTYTEMPLATE('1Wo3H6IDLDxuozZkuPT4iB',$,'Green','Green component of the RGB colour specification given by an integer of 0..256',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #1579=IFCSIMPLEPROPERTYTEMPLATE('1SL2v8n5n4CvX450EcUXDp',$,'Blue','Blue component of the RGB colour specification given by an integer of 0..257',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#1580=IFCPROPERTYSETTEMPLATE('1I3cnY971CQBXQ12n4qZg9',$,'Pset_ElementShading','Definition from IAI: Shading device properties associated with an element that represents a shading device, e.g. an IfcBuildingElementProxy or any other building element.\X2\000A\X0\',$,'IfcElement',(#1581,#1583,#1584,#1585,#1586,#1587,#1588,#1589,#1590)); +#1580=IFCPROPERTYSETTEMPLATE('1I3cnY971CQBXQ12n4qZg9',$,'Pset_ElementShading','Definition from IAI: Shading device properties associated with an element that represents a shading device, e.g. an IfcBuildingElementProxy or any other building element.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcElement',(#1581,#1583,#1584,#1585,#1586,#1587,#1588,#1589,#1590)); #1581=IFCSIMPLEPROPERTYTEMPLATE('2S$$NL_CP0U83oKIvTUc2$',$,'ShadingDeviceType','Specifies the type of shading device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1582,$,$,$,.READWRITE.); #1582=IFCPROPERTYENUMERATION('PEnum_ElementShading',(IFCLABEL('FIXED'),IFCLABEL('MOVABLE'),IFCLABEL('EXTERIOR'),IFCLABEL('INTERIOR'),IFCLABEL('OVERHANG'),IFCLABEL('SIDEFIN'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); #1583=IFCSIMPLEPROPERTYTEMPLATE('15jTMn8UP3MxFrK7lXt8G4',$,'Azimuth','Azimuth of the element as derived from the placement of the element shape, by convention: North = 0'' and measurement is done clockwise (I.e. east = 90'', if unit is grad). The calculation procedure will be specific for each type of element. In cases of inconsistency between the geometric parameters and the azimuth property, provided in the attached property set, the geometric parameters take precedence. ',.P_SINGLEVALUE.,'IfcPositivePlaneAngleMeasure',$,$,$,$,$,.READWRITE.); @@ -1595,23 +1595,23 @@ DATA; #1588=IFCSIMPLEPROPERTYTEMPLATE('1yVbjwTo95$AEl7_mF441S',$,'Reflectance','The ratio of reflected power to incident power.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #1589=IFCSIMPLEPROPERTYTEMPLATE('2j5Maf1m9DwvuN$5ymGPnX',$,'Roughness','A measure of the vertical deviations of the surface.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1590=IFCSIMPLEPROPERTYTEMPLATE('1VHSgxVf123Ap4Vx1$FJAd',$,'Color','The color of the surface.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1591=IFCPROPERTYSETTEMPLATE('2PgxYW18LAzR9Q3Zxm6v1j',$,'Pset_OpeningElementCommon','Definition from IAI: Properties common to the definition of all instances of IfcOpeningElement.\X2\000A\X0\',$,'IfcOpeningElement',(#1592,#1593,#1594,#1595,#1596)); +#1591=IFCPROPERTYSETTEMPLATE('2PgxYW18LAzR9Q3Zxm6v1j',$,'Pset_OpeningElementCommon','Definition from IAI: Properties common to the definition of all instances of IfcOpeningElement.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcOpeningElement',(#1592,#1593,#1594,#1595,#1596)); #1592=IFCSIMPLEPROPERTYTEMPLATE('01V2pG4jH11AdpxrQJ4_Gd',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1593=IFCSIMPLEPROPERTYTEMPLATE('2xHxpHUQTB0RN8kzvgbT7o',$,'Purpose','Indication of the purpose for that opening, e.g. ''ventilation'', ''access'', etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1594=IFCSIMPLEPROPERTYTEMPLATE('3Md4$JOzr3kxNBqik$0o7V',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A\X0\Here whether the space (in case of e.g., a corridor) is designed to serve as an exit space, e.g., for fire escape purposes.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1595=IFCSIMPLEPROPERTYTEMPLATE('05RJy88rb0Vg8XR8yfCESr',$,'ProtectedOpening','Indication whether the opening is considered to be protected under fire safety considerations. If (TRUE) it counts as a protected opening under the applicable building code, (FALSE) otherwise. ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1596=IFCSIMPLEPROPERTYTEMPLATE('2TL_$My_b6mANy$f5ZBVsD',$,'ParallelJambs','Indicated, whether the jambs of an opening in a curved building element are intended to be parallel (TRUE) or are radial (FALSE). Radial means, that the extension of the jambs are rays through the axis of the revolution forming the curved building element. ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1597=IFCPROPERTYSETTEMPLATE('2UnL_UHdfFd8t82v3yjT0w',$,'Pset_QuantityTakeOff','Definition from IAI: Description of quantities for work items to be exchanged in addition to the IfcElementQuantity\X2\000A\X0\',$,'IfcElement',(#1598,#1599,#1602)); +#1597=IFCPROPERTYSETTEMPLATE('2UnL_UHdfFd8t82v3yjT0w',$,'Pset_QuantityTakeOff','Definition from IAI: Description of quantities for work items to be exchanged in addition to the IfcElementQuantity\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcElement',(#1598,#1599,#1602)); #1598=IFCSIMPLEPROPERTYTEMPLATE('1gbTBKS8vCAuUT$cf3iVIw',$,'Reference','Reference ID for this specified type of quantity, e.g. linking back to a macro name, etc.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1599=IFCCOMPLEXPROPERTYTEMPLATE('2zx0DJ1vf04Ote2us03Gg7',$,'LayerQuantity','Quantity take-off information specific to a single layer of the element, if multiple layer information is passed, then the property shall be indexed, e.g. LayerQuantity1, ayerQuantity2, \X2\2026\X0\','QTO_Layer',.P_COMPLEX.,(#1600,#1601)); #1600=IFCSIMPLEPROPERTYTEMPLATE('3$pMNWROTFuh2uYWuO0nbZ',$,'MaterialLayer','Indication of the material layer (e.g. of a wall or slab) to which the quantity information belongs to)',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1601=IFCSIMPLEPROPERTYTEMPLATE('2FgMkejVjB8O0usf1iYaJQ',$,'LocalContext','Local context information for the take-off quantity, if multiple information items are passed, then the property shall be indexed, e.g. LocalContext1, LocalContext2, \X2\2026\X0\',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1602=IFCSIMPLEPROPERTYTEMPLATE('1bunfIEAbA1vAkunODI1H9',$,'LocalContext','Local context information for the take-off quantity, if multiple information items are passed, then the property shall be indexed, e.g. LocalContext1, LocalContext2, \X2\2026\X0\',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1603=IFCPROPERTYSETTEMPLATE('0GrkZRWoz559wbOVj4DhF3',$,'Pset_SiteCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcSite. Please note that several site attributes are handled directly at the IfcSite instance, the site number (or short name) by IfcSite.Name, the site name (or long name) by IfcSite.LongName, and the description (or comments) by IfcSite.Description. The land title number is also given as an explicit attribute IfcSite.LandTitleNumber. Actual site quantities, like site perimeter, site area and site volume are provided by IfcElementQuantities, and site classification according to national building code by IfcClassificationReference. The global positioning of the site in terms of Northing and Easting and height above sea level datum is given by IfcSite.RefLongitude, IfcSite.RefLatitude, IfcSite.RefElevation and the postal address by IfcSite.SiteAddress.',$,'IfcSite',(#1604,#1605,#1606)); +#1603=IFCPROPERTYSETTEMPLATE('0GrkZRWoz559wbOVj4DhF3',$,'Pset_SiteCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcSite. Please note that several site attributes are handled directly at the IfcSite instance, the site number (or short name) by IfcSite.Name, the site name (or long name) by IfcSite.LongName, and the description (or comments) by IfcSite.Description. The land title number is also given as an explicit attribute IfcSite.LandTitleNumber. Actual site quantities, like site perimeter, site area and site volume are provided by IfcElementQuantities, and site classification according to national building code by IfcClassificationReference. The global positioning of the site in terms of Northing and Easting and height above sea level datum is given by IfcSite.RefLongitude, IfcSite.RefLatitude, IfcSite.RefElevation and the postal address by IfcSite.SiteAddress.',.PSET_OCCURRENCEDRIVEN.,'IfcSite',(#1604,#1605,#1606)); #1604=IFCSIMPLEPROPERTYTEMPLATE('2rnyxfg2HE$v0NbQFX_aOY',$,'BuildableArea','The area of utilization expressed as a minimum value and a maximum value - according to local building codes. ',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #1605=IFCSIMPLEPROPERTYTEMPLATE('284gs4f5128wvEKSy7m_oR',$,'TotalArea','Total area of the site - masured according to local building codes.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #1606=IFCSIMPLEPROPERTYTEMPLATE('0yZ4QCBSDARQrks0Vl5WVA',$,'BuildingHeightLimit','Calculated maximum height of buildings on this site - according to local building codes. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1607=IFCPROPERTYSETTEMPLATE('2NzitGo59AM9KMGD90BPVJ',$,'Pset_SpaceCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcSpace. Please note that several space attributes are handled directly at the IfcSpace instance, the space number (or short name) by IfcSpace.Name, the space name (or long name) by IfcSpace:LongName, and the description (or comments) by IfcSpace.Description. Actual space quantities, like space perimeter, space area and space volume are provided by IfcElementQuantities, and space classification according to national building code by IfcClassificationReference. The level above zero (relative to the building) for the slab row construction is provided by the IfcBuildingStorey.Elevation, the level above zero (relative to the building) for the floor finish is provided by the IfcSpace.ElevationWithFlooring.',$,'IfcSpace',(#1608,#1609,#1610,#1611,#1612,#1613,#1614,#1615,#1616,#1617,#1618,#1619)); +#1607=IFCPROPERTYSETTEMPLATE('2NzitGo59AM9KMGD90BPVJ',$,'Pset_SpaceCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcSpace. Please note that several space attributes are handled directly at the IfcSpace instance, the space number (or short name) by IfcSpace.Name, the space name (or long name) by IfcSpace:LongName, and the description (or comments) by IfcSpace.Description. Actual space quantities, like space perimeter, space area and space volume are provided by IfcElementQuantities, and space classification according to national building code by IfcClassificationReference. The level above zero (relative to the building) for the slab row construction is provided by the IfcBuildingStorey.Elevation, the level above zero (relative to the building) for the floor finish is provided by the IfcSpace.ElevationWithFlooring.',.PSET_OCCURRENCEDRIVEN.,'IfcSpace',(#1608,#1609,#1610,#1611,#1612,#1613,#1614,#1615,#1616,#1617,#1618,#1619)); #1608=IFCSIMPLEPROPERTYTEMPLATE('3ZNCklAM14axAyO8R5yudI',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1609=IFCSIMPLEPROPERTYTEMPLATE('3Un3Qd2zbFcAZT7tPEPIJy',$,'Category','Category of space usage or utilization of the area. It is defined according to the presiding national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1610=IFCSIMPLEPROPERTYTEMPLATE('0DqMDMnvP56xe6WVepkJRC',$,'FloorCovering','Label to indicate the material or finish of the space flooring. The label is used for room book information and often displayed in room stamp.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1624,7 +1624,7 @@ DATA; #1617=IFCSIMPLEPROPERTYTEMPLATE('33RayuGinC6hL3$E5Iv9cX',$,'HandicapAccessible','Indication whether this space (in case of e.g., a toilet) is designed to serve as an accessible space for handicapped people, e.g., for a public toilet (TRUE) or not (FALSE). This information is often used to declare the need for access for the disabled and for special design requirements of this space.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1618=IFCSIMPLEPROPERTYTEMPLATE('0WwVp4WNj3bRr3p43k7SQD',$,'ConcealedFlooring','Indication whether this space is declared to be a concealed flooring (TRUE) or not (FALSE). A concealed flooring is normally meant to be the space beneath a raised floor.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1619=IFCSIMPLEPROPERTYTEMPLATE('0uLbdP8vb3oQlEqR7aNGLm',$,'ConcealedCeiling','Indication whether this space is declared to be a concealed ceiling (TRUE) or not (FALSE). A concealed ceiling is normally meant to be the space between a slab and a suspended ceiling.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1620=IFCPROPERTYSETTEMPLATE('3MN_FnmXL4DvWg_3JXYw7C',$,'Pset_SpaceFireSafetyRequirements','Definition from IAI: Properties related to fire protection of spaces that apply to the occurrences of IfcSpace or IfcZone.',$,'IfcSpace,IfcZone',(#1621,#1622,#1623,#1624,#1625,#1626,#1627,#1628,#1629)); +#1620=IFCPROPERTYSETTEMPLATE('3MN_FnmXL4DvWg_3JXYw7C',$,'Pset_SpaceFireSafetyRequirements','Definition from IAI: Properties related to fire protection of spaces that apply to the occurrences of IfcSpace or IfcZone.',.PSET_OCCURRENCEDRIVEN.,'IfcSpace,IfcZone',(#1621,#1622,#1623,#1624,#1625,#1626,#1627,#1628,#1629)); #1621=IFCSIMPLEPROPERTYTEMPLATE('1mN6H3vbL9pPKSusIkiUcq',$,'MainFireUse','Main fire use for the space which is assigned from the fire use classification table as given by the relevant national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1622=IFCSIMPLEPROPERTYTEMPLATE('18HfZ5hbPBu8a7ntNdvh7H',$,'AncillaryFireUse','Ancillary fire use for the space which is assigned from the fire use classification table as given by the relevant national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1623=IFCSIMPLEPROPERTYTEMPLATE('32L7cT$fn0PeOunMzLsNdM',$,'FireRiskFactor','Fire Risk factor assigned to the space according to local building regulations.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1634,10 +1634,10 @@ DATA; #1627=IFCSIMPLEPROPERTYTEMPLATE('2A0Z7l64vBHvjsXLbk__lQ',$,'SprinklerProtection','Indication whether the space is sprinkler protected (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1628=IFCSIMPLEPROPERTYTEMPLATE('3vk62BM45BN95aToz3vr_l',$,'SprinklerProtectionAutomatic','Indication whether the space has an automatic sprinkler protection (TRUE) or not (FALSE).\X2\000A\X0\It should only be given, if the property "SprinklerProtection" is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1629=IFCSIMPLEPROPERTYTEMPLATE('1n6lSkyFH3NO7nZIcYwrz7',$,'AirPressurization','Indication whether the space is required to have pressurized air (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1630=IFCPROPERTYSETTEMPLATE('0zJVZ8itb6RxrWN7UsvBIe',$,'Pset_SpaceLightingRequirements','Definition from IAI: Properties related to the lighting requirements that apply to the occurrences of IfcSpace or IfcZone. This includes the required artificial lighting, illuminance, etc.',$,'IfcSpace,IfcZone',(#1631,#1632)); +#1630=IFCPROPERTYSETTEMPLATE('0zJVZ8itb6RxrWN7UsvBIe',$,'Pset_SpaceLightingRequirements','Definition from IAI: Properties related to the lighting requirements that apply to the occurrences of IfcSpace or IfcZone. This includes the required artificial lighting, illuminance, etc.',.PSET_OCCURRENCEDRIVEN.,'IfcSpace,IfcZone',(#1631,#1632)); #1631=IFCSIMPLEPROPERTYTEMPLATE('0QA1LeRu58avmctxb_SOv4',$,'ArtificialLighting','Indication whether this space requires artificial lighting (as natural lighting would be not sufficient). (TRUE) indicates yes (FALSE) otherwise.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1632=IFCSIMPLEPROPERTYTEMPLATE('3QmBikv_n2n9Ihh5oLHZn5',$,'Illuminance','Required average illuminance value for this space.',.P_SINGLEVALUE.,'IfcIlluminanceMeasure',$,$,$,$,$,.READWRITE.); -#1633=IFCPROPERTYSETTEMPLATE('2bTXM3_wP9ihRySpnBa6V9',$,'Pset_SpaceOccupancyRequirements','Definition from IAI: Properties concerning work activities occurring or expected to occur within one or a set of similar spatial structure elements.',$,'IfcSpace,IfcZone',(#1634,#1635,#1636,#1637,#1638,#1639,#1640)); +#1633=IFCPROPERTYSETTEMPLATE('2bTXM3_wP9ihRySpnBa6V9',$,'Pset_SpaceOccupancyRequirements','Definition from IAI: Properties concerning work activities occurring or expected to occur within one or a set of similar spatial structure elements.',.PSET_OCCURRENCEDRIVEN.,'IfcSpace,IfcZone',(#1634,#1635,#1636,#1637,#1638,#1639,#1640)); #1634=IFCSIMPLEPROPERTYTEMPLATE('3RBbaFpkz8uBCnIatv5Rxp',$,'OccupancyType','Occupancy type for this object. It is defined according to the presiding national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1635=IFCSIMPLEPROPERTYTEMPLATE('3fyq8NIqv4QBWXB391TKm6',$,'OccupancyNumber','Number of people required for the activity assigned to this space.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); #1636=IFCSIMPLEPROPERTYTEMPLATE('100$mP6ejAuB0iFKsIyJ1y',$,'OccupancyNumberPeak','Maximal number of people required for the activity assigned to this space in peak time.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); @@ -1645,13 +1645,13 @@ DATA; #1638=IFCSIMPLEPROPERTYTEMPLATE('3jpzrvTgnBzfM$MA2fCzlM',$,'AreaPerOccupant','Design occupancy loading for this type of usage assigned to this space.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #1639=IFCSIMPLEPROPERTYTEMPLATE('3wwxejxxHFZRCMOvQaZGKU',$,'MinimumHeadroom','Headroom required for the activity assigned to this space.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #1640=IFCSIMPLEPROPERTYTEMPLATE('3oU35fngn0OOzh1D0Jwq82',$,'IsOutlookDesirable','An indication of whether the outlook is desirable (set TRUE) or not (set FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1641=IFCPROPERTYSETTEMPLATE('0kR5fLHbn0zQYmldUhEm$d',$,'Pset_SpaceParking','Definition from IAI: Properties common to the definition of all occurrences of IfcSpace which have an attribute value for ObjectType = ''Parking''. NOTE: Modified in IFC 2x3, properties ParkingUse and ParkingUnits added.',$,'IfcSpace',(#1642,#1643,#1644)); +#1641=IFCPROPERTYSETTEMPLATE('0kR5fLHbn0zQYmldUhEm$d',$,'Pset_SpaceParking','Definition from IAI: Properties common to the definition of all occurrences of IfcSpace which have an attribute value for ObjectType = ''Parking''. NOTE: Modified in IFC 2x3, properties ParkingUse and ParkingUnits added.',.PSET_OCCURRENCEDRIVEN.,'IfcSpace',(#1642,#1643,#1644)); #1642=IFCSIMPLEPROPERTYTEMPLATE('1JcTlApuX1Eh_TRL$8S89H',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. \X2\000A\X0\It is giving according to the requirements of the national building code. ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1643=IFCSIMPLEPROPERTYTEMPLATE('0_dbwgKm93nPbXVwUbbll9',$,'ParkingUse','Identifies the type of transporation for which the parking space is designed. Values are not predefined but might include car, compact car, motorcycle, bicycle, truck, bus etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1644=IFCSIMPLEPROPERTYTEMPLATE('3KX6_bz558cghD4n9VHZ9U',$,'ParkingUnits','Indicates the number of transporation units of the type specified by the property ParkingUse that may be accommodated within the space. Generally, this value should default to 1 unit. However, where the parking space is for motorcycles or bicycles, provision may be made for more than one unit in the space.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1645=IFCPROPERTYSETTEMPLATE('11flEP$qrCIwtqSAOVInKF',$,'Pset_SpaceParkingAisle','Definition from IAI: Properties common to the definition of all occurrences of IfcSpace which have an attribute value for ObjectType = ''ParkingAisle''.',$,'IfcSpace',(#1646)); +#1645=IFCPROPERTYSETTEMPLATE('11flEP$qrCIwtqSAOVInKF',$,'Pset_SpaceParkingAisle','Definition from IAI: Properties common to the definition of all occurrences of IfcSpace which have an attribute value for ObjectType = ''ParkingAisle''.',.PSET_OCCURRENCEDRIVEN.,'IfcSpace',(#1646)); #1646=IFCSIMPLEPROPERTYTEMPLATE('3Iasaahrz1zhvzKXNC0sU2',$,'IsOneWay','Indicates whether the parking aisle is designed for oneway traffic (TRUE) or twoway traffic (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1647=IFCPROPERTYSETTEMPLATE('19rV9eQb58V8T3WG_eW7fk',$,'Pset_SpaceThermalRequirements','Definition from IAI: Properties related to the comfort requirements for thermal and other thermal related performances of spaces that apply to the occurrences of IfcSpace or IfcZone. This includes the required design temperature, humidity, and air conditioning.',$,'IfcSpace,IfcZone',(#1648,#1649,#1650,#1651,#1652,#1653,#1654,#1655,#1656,#1657,#1658,#1659,#1660,#1661,#1662)); +#1647=IFCPROPERTYSETTEMPLATE('19rV9eQb58V8T3WG_eW7fk',$,'Pset_SpaceThermalRequirements','Definition from IAI: Properties related to the comfort requirements for thermal and other thermal related performances of spaces that apply to the occurrences of IfcSpace or IfcZone. This includes the required design temperature, humidity, and air conditioning.',.PSET_OCCURRENCEDRIVEN.,'IfcSpace,IfcZone',(#1648,#1649,#1650,#1651,#1652,#1653,#1654,#1655,#1656,#1657,#1658,#1659,#1660,#1661,#1662)); #1648=IFCSIMPLEPROPERTYTEMPLATE('1sggA$NMD0xObIF2komCtY',$,'SpaceTemperatureMax','Temperature of the space or zone, that is required from user/designer view point. If no summer or winter space temperature requirements are given, it applies all year, otherwise for the intermediate period.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #1649=IFCSIMPLEPROPERTYTEMPLATE('2n9VqRJBHDsP_1TfAQD9JA',$,'SpaceTemperatureMin',' Minimal temperature of the space or zone, that is required from user/designer view point. If no summer or winter space temperature requirements are given, it applies all year, otherwise for the intermediate period. ',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #1650=IFCSIMPLEPROPERTYTEMPLATE('2QeZKz8GXAefCAai95dUU7',$,'SpaceTemperatureSummerMax','Maximal temperature of the space or zone for the hot (summer) period, that is required from user/designer view point.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); @@ -1667,34 +1667,34 @@ DATA; #1660=IFCSIMPLEPROPERTYTEMPLATE('29_qOef2nAtQ7RT6QXjowH',$,'MechanicalVentilationRate','Indication of the requirement of a particular mechanical air ventilation rate, given in air changes per hour.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); #1661=IFCSIMPLEPROPERTYTEMPLATE('3Hft3gXKL7VRdlxVSKDEfd',$,'AirConditioning','Indication whether this space requires air conditioning provided (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1662=IFCSIMPLEPROPERTYTEMPLATE('0lfgeCxurF4AX54IVDx9VC',$,'AirConditioningCentral','Indication whether the space requires a central air conditioning provided (TRUE) or not (FALSE).\X2\000A\X0\It should only be given, if the property "AirConditioning" is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1663=IFCPROPERTYSETTEMPLATE('3YAjzXSlf0txi$guW9vCv$',$,'Pset_TransportElementCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcTransportElement.',$,'IfcTransportElement',(#1664,#1665)); +#1663=IFCPROPERTYSETTEMPLATE('3YAjzXSlf0txi$guW9vCv$',$,'Pset_TransportElementCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcTransportElement.',.PSET_OCCURRENCEDRIVEN.,'IfcTransportElement',(#1664,#1665)); #1664=IFCSIMPLEPROPERTYTEMPLATE('14NJlIb1v3IQ_OsM$zbudb',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1665=IFCSIMPLEPROPERTYTEMPLATE('2Nh50hoVHBy9aMBwU7_z4G',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A\X0\Here whether the transport element (in case of e.g., a lift) is designed to serve as a fire exit, e.g., for fire escape purposes.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1666=IFCPROPERTYSETTEMPLATE('271X8fCTX0v8h3GehHmS6Q',$,'Pset_TransportElementElevator','Definition from IAI: Properties common to the definition of all occurrences of IfcTransportElement with the predefined type ="ELEVATOR"',$,'IfcTransportElement',(#1667,#1668,#1669)); +#1666=IFCPROPERTYSETTEMPLATE('271X8fCTX0v8h3GehHmS6Q',$,'Pset_TransportElementElevator','Definition from IAI: Properties common to the definition of all occurrences of IfcTransportElement with the predefined type ="ELEVATOR"',.PSET_OCCURRENCEDRIVEN.,'IfcTransportElement',(#1667,#1668,#1669)); #1667=IFCSIMPLEPROPERTYTEMPLATE('3zEP1OFCnAje5j5C4DO7L4',$,'ClearWidth','Clear width of the object (elevator). It indicates the distance from the inner surfaces of the elevator car left and right from the elevator door. \X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1668=IFCSIMPLEPROPERTYTEMPLATE('1KCpNDXcf54vq3ADCSiUXj',$,'ClearDepth','Clear depth of the object (elevator). It indicates the distance from the inner surface of the elevator door to the opposite surface of the elevator car. \X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1669=IFCSIMPLEPROPERTYTEMPLATE('3zsaq9sof76BEVg0mW2uTh',$,'ClearHeight','Clear height of the object (elevator). \X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1670=IFCPROPERTYSETTEMPLATE('1$fsCCQr909Rg1U2WJxH5R',$,'Pset_ZoneCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcZone.',$,'IfcZone',(#1671,#1672,#1673,#1674,#1675,#1676)); +#1670=IFCPROPERTYSETTEMPLATE('1$fsCCQr909Rg1U2WJxH5R',$,'Pset_ZoneCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcZone.',.PSET_OCCURRENCEDRIVEN.,'IfcZone',(#1671,#1672,#1673,#1674,#1675,#1676)); #1671=IFCSIMPLEPROPERTYTEMPLATE('3HH0G2SoL4hALl2aGMq1Ga',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1672=IFCSIMPLEPROPERTYTEMPLATE('3j0lZiG3X4lA$edoJHSUFq',$,'Category','Category of space usage or utilization of the area. It is defined according to the presiding national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1673=IFCSIMPLEPROPERTYTEMPLATE('1iahFsuVr1A90cJmZg7_X$',$,'GrossAreaPlanned','Total planned gross area for the space. Used for programming the space.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #1674=IFCSIMPLEPROPERTYTEMPLATE('0EQTduACfCdBKXPmuA4pgk',$,'NetAreaPlanned','Total planned net area for the space. Used for programming the space.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #1675=IFCSIMPLEPROPERTYTEMPLATE('2Gn$zZ6Tv1gxT0TjVS8dKq',$,'PubliclyAccessible','Indication whether this space (in case of e.g., a toilet) is designed to serve as a publicly accessible space, e.g., for a public toilet (TRUE) or not (FALSE). ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1676=IFCSIMPLEPROPERTYTEMPLATE('09tR3tZ21Emgecar9u2z6M',$,'HandicapAccessible','Indication whether this space (in case of e.g., a toilet) is designed to serve as an accessible space for handicapped people, e.g., for a public toilet (TRUE) or not (FALSE). This information is often used to declare the need for access for the disabled and for special design requirements of this space.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1677=IFCPROPERTYSETTEMPLATE('11e4VX2KDExwIhqH_ZUQZ1',$,'Pset_BeamCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcBeam.',$,'IfcBeam',(#1678,#1679,#1680,#1681,#1682,#1683)); +#1677=IFCPROPERTYSETTEMPLATE('11e4VX2KDExwIhqH_ZUQZ1',$,'Pset_BeamCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcBeam.',.PSET_OCCURRENCEDRIVEN.,'IfcBeam',(#1678,#1679,#1680,#1681,#1682,#1683)); #1678=IFCSIMPLEPROPERTYTEMPLATE('21vlfcJwv28BbDmPzaSt7B',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1679=IFCSIMPLEPROPERTYTEMPLATE('2YrLcHfFfBOvjvR7aP1w4h',$,'Span','Clear span for this object.\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1680=IFCSIMPLEPROPERTYTEMPLATE('3mDowEtjb79R0nv4QMHs28',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); #1681=IFCSIMPLEPROPERTYTEMPLATE('0cE2E6KF1Fh8uycYYT72eA',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1682=IFCSIMPLEPROPERTYTEMPLATE('1X4nKVkp10GP5gpzFYlMqt',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1683=IFCSIMPLEPROPERTYTEMPLATE('0$FE4h67z7JvEIXqY0wwkz',$,'FireRating','Fire rating for this object.\X2\000A\X0\It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1684=IFCPROPERTYSETTEMPLATE('0BZJwHTwL0b9nKcrod9sWi',$,'Pset_ColumnCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcColumn.',$,'IfcColumn',(#1685,#1686,#1687,#1688,#1689)); +#1684=IFCPROPERTYSETTEMPLATE('0BZJwHTwL0b9nKcrod9sWi',$,'Pset_ColumnCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcColumn.',.PSET_OCCURRENCEDRIVEN.,'IfcColumn',(#1685,#1686,#1687,#1688,#1689)); #1685=IFCSIMPLEPROPERTYTEMPLATE('13n5nk1pHCQPvdG$qzk7a0',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1686=IFCSIMPLEPROPERTYTEMPLATE('281CSmlfL2Mw8NvoXPdEmq',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. ',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); #1687=IFCSIMPLEPROPERTYTEMPLATE('2d1RiykB94fAKxBClZHuFN',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1688=IFCSIMPLEPROPERTYTEMPLATE('2KdU5RNhL1tPTIijeTEp7d',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1689=IFCSIMPLEPROPERTYTEMPLATE('09hFbWs19309ugYPgHGL8Z',$,'FireRating','Fire rating for this object.\X2\000A\X0\It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1690=IFCPROPERTYSETTEMPLATE('1jSPL9guzAF8Xpg8KbDqdH',$,'Pset_CurtainWallCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcCurtainWall.',$,'IfcCurtainWall',(#1691,#1692,#1693,#1694,#1695,#1696,#1697)); +#1690=IFCPROPERTYSETTEMPLATE('1jSPL9guzAF8Xpg8KbDqdH',$,'Pset_CurtainWallCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcCurtainWall.',.PSET_OCCURRENCEDRIVEN.,'IfcCurtainWall',(#1691,#1692,#1693,#1694,#1695,#1696,#1697)); #1691=IFCSIMPLEPROPERTYTEMPLATE('2KMz7HHhj8UuQRMLVIs34Z',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1692=IFCSIMPLEPROPERTYTEMPLATE('337Alc_GjEi8xzSPMiDnv_',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is giving according to the national building code. It indicates the sound transmission resistance of this object by an index ration (instead of providing full sound absorbtion values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1693=IFCSIMPLEPROPERTYTEMPLATE('2m4spQK6z7xOxP9r0SJMIY',$,'FireRating','Fire rating given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1702,7 +1702,7 @@ DATA; #1695=IFCSIMPLEPROPERTYTEMPLATE('2QxVWGrIX3h9sT478p0OJY',$,'SurfaceSpreadOfFlame','Indication on how the flames spread around the surface,\X2\000A\X0\It is given according to the national building code that governs the fire behaviour for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1696=IFCSIMPLEPROPERTYTEMPLATE('2KKvQqY2bAzxDEM13sCgBy',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of a material.\X2\000A\X0\Here the total thermal transmittance coefficient through the wall (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); #1697=IFCSIMPLEPROPERTYTEMPLATE('3NbgbQ5ZjAVfX2GdIl5ZKK',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1698=IFCPROPERTYSETTEMPLATE('2C7yD2EBH7lAx0sTrT1YMn',$,'Pset_DoorCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcDoor.',$,'IfcDoor',(#1699,#1700,#1701,#1702,#1703,#1704,#1705,#1706,#1707,#1708,#1709,#1710)); +#1698=IFCPROPERTYSETTEMPLATE('2C7yD2EBH7lAx0sTrT1YMn',$,'Pset_DoorCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcDoor.',.PSET_OCCURRENCEDRIVEN.,'IfcDoor',(#1699,#1700,#1701,#1702,#1703,#1704,#1705,#1706,#1707,#1708,#1709,#1710)); #1699=IFCSIMPLEPROPERTYTEMPLATE('07aYT0tq1C5v75QdFuZUgp',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1700=IFCSIMPLEPROPERTYTEMPLATE('1kPulh$nnAXBIZr68Il1xn',$,'FireRating','Fire rating for this object.\X2\000A\X0\It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1701=IFCSIMPLEPROPERTYTEMPLATE('0AojJjhdvAze0yfh8eG86l',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is giving according to the national building code. It indicates the sound transmission resistance of this object by an index ration (instead of providing full sound absorbtion values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1715,7 +1715,7 @@ DATA; #1708=IFCSIMPLEPROPERTYTEMPLATE('0GYnxUfOH4$BNWxhYApWgH',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A\X0\Here it defines an exit door in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1709=IFCSIMPLEPROPERTYTEMPLATE('3mfb1MJb56PAX5AcAJn3ln',$,'SelfClosing','Indication whether this object is designed to close automatically after use (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1710=IFCSIMPLEPROPERTYTEMPLATE('1ixw7mi6n5uhMLTiOtvoHN',$,'SmokeStop','Indication whether the object is designed to provide a smoke stop (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1711=IFCPROPERTYSETTEMPLATE('1mDT_xI_r6q90giq7GRq$Z',$,'Pset_DoorWindowGlazingType','Definition from IAI: Properties common to the definition of the glazing component of occurrences of IfcDoor and IfcWindow, used for thermal and lighting calculations.',$,'IfcDoor,IfcWindow',(#1712,#1713,#1714,#1715,#1716,#1717,#1718,#1719,#1720,#1721,#1722,#1723,#1724,#1725,#1726,#1727)); +#1711=IFCPROPERTYSETTEMPLATE('1mDT_xI_r6q90giq7GRq$Z',$,'Pset_DoorWindowGlazingType','Definition from IAI: Properties common to the definition of the glazing component of occurrences of IfcDoor and IfcWindow, used for thermal and lighting calculations.',.PSET_OCCURRENCEDRIVEN.,'IfcDoor,IfcWindow',(#1712,#1713,#1714,#1715,#1716,#1717,#1718,#1719,#1720,#1721,#1722,#1723,#1724,#1725,#1726,#1727)); #1712=IFCSIMPLEPROPERTYTEMPLATE('0RE4yo8p1BuuNWBLxgE68t',$,'GlassLayers','Number of glass layers within the frame. E.g. "2" for double glazing. ',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); #1713=IFCSIMPLEPROPERTYTEMPLATE('1GSCQ5kCz2CfOFq8PK2KqW',$,'GlassThickness1','Thickness of the first (inner) glass layer. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1714=IFCSIMPLEPROPERTYTEMPLATE('1UMSpAK0j3NAGy00PWuX5d',$,'GlassThickness2','Thickness of the second (intermediate or outer) glass layer.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1732,30 +1732,30 @@ DATA; #1725=IFCSIMPLEPROPERTYTEMPLATE('0xbNW_s7z51hs7pZqih$G2',$,'SolarHeatGainTransmittance','Total solar heat transmittance that passes the glazing at normal incidence. It is a value without unit, often referred to as (SHGC):.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #1726=IFCSIMPLEPROPERTYTEMPLATE('1vpgAhv3L22hnTlVzfoQUo',$,'ThermalTransmittanceSummer','Thermal transmittance coefficient (U-Value) of a material.\X2\000A\X0\Summer thermal transmittance coefficient of the glazing only, often referred to as (U-value) ',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); #1727=IFCSIMPLEPROPERTYTEMPLATE('3caBqcksvDCxfHKvHi4fYy',$,'ThermalTransmittanceWinter','Thermal transmittance coefficient (U-Value) of a material.\X2\000A\X0\Winter thermal transmittance coefficient of the glazing only, often referred to as (U-value) ',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#1728=IFCPROPERTYSETTEMPLATE('2xzsN4Q9T0Mxi5wmmLTwgy',$,'Pset_DoorWindowShadingType','Definition from IAI: Properties common to the definition of the shading component of occurrences of IfcDoor and IfcWindow, used for static (simplified) shading calculations.',$,'IfcDoor,IfcWindow',(#1729,#1730,#1731)); +#1728=IFCPROPERTYSETTEMPLATE('2xzsN4Q9T0Mxi5wmmLTwgy',$,'Pset_DoorWindowShadingType','Definition from IAI: Properties common to the definition of the shading component of occurrences of IfcDoor and IfcWindow, used for static (simplified) shading calculations.',.PSET_OCCURRENCEDRIVEN.,'IfcDoor,IfcWindow',(#1729,#1730,#1731)); #1729=IFCSIMPLEPROPERTYTEMPLATE('2uU0lH4Bv6s8dbDKZfxoif',$,'ExternalShadingCoefficient','Radiation transmission coefficient of the outside shading device. It is a value without unit.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #1730=IFCSIMPLEPROPERTYTEMPLATE('2KX_AvHMb6gR8erT9JL55l',$,'InternalShadingCoefficient','Radiation transmission coefficient of the inside shading device, symbol "b-value". It is a value without unit. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #1731=IFCSIMPLEPROPERTYTEMPLATE('2kPuCLCTP8DwOZcp7irnpT',$,'InsetShadingCoefficient','Radiation transmission coefficient of the shading device inside the glazing, symbol "b-value". It is a value without unit. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1732=IFCPROPERTYSETTEMPLATE('3$iuAH2FfB3x1ThH$pwuzP',$,'Pset_MemberCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcMember.',$,'IfcMember',(#1733,#1734,#1735,#1736,#1737,#1738)); +#1732=IFCPROPERTYSETTEMPLATE('3$iuAH2FfB3x1ThH$pwuzP',$,'Pset_MemberCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcMember.',.PSET_OCCURRENCEDRIVEN.,'IfcMember',(#1733,#1734,#1735,#1736,#1737,#1738)); #1733=IFCSIMPLEPROPERTYTEMPLATE('2T5tmeOQP41R9olLlnN5CY',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1734=IFCSIMPLEPROPERTYTEMPLATE('3Rt$4Pcbf5yAtjr9QIiJua',$,'Span','Clear span for this object.\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1735=IFCSIMPLEPROPERTYTEMPLATE('2k6nj1RJL7$uh65TWmN$TU',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); #1736=IFCSIMPLEPROPERTYTEMPLATE('204kLJtEvAGQ8FljfUtXl9',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1737=IFCSIMPLEPROPERTYTEMPLATE('1ti_yd2G99eAqTSwWTjeqt',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1738=IFCSIMPLEPROPERTYTEMPLATE('2tp73JE81CBumG0BUUnu$U',$,'FireRating','Fire rating for this object.\X2\000A\X0\It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1739=IFCPROPERTYSETTEMPLATE('1eHjVvkKL7Uw2yd3Ezkjt_',$,'Pset_PlateCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcPlate.',$,'IfcPlate',(#1740,#1741,#1742,#1743,#1744,#1745)); +#1739=IFCPROPERTYSETTEMPLATE('1eHjVvkKL7Uw2yd3Ezkjt_',$,'Pset_PlateCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcPlate.',.PSET_OCCURRENCEDRIVEN.,'IfcPlate',(#1740,#1741,#1742,#1743,#1744,#1745)); #1740=IFCSIMPLEPROPERTYTEMPLATE('1oMKch5LfA4ACoS73kPtmm',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1741=IFCSIMPLEPROPERTYTEMPLATE('31GJYiPtvBH8W3VyNaunOx',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1742=IFCSIMPLEPROPERTYTEMPLATE('31mxD4u2vDYvk3xXbTsZOl',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1743=IFCSIMPLEPROPERTYTEMPLATE('1fNUbrRe19wfpnjwIiFvpm',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is giving according to the national building code. It indicates the sound transmission resistance of this object by an index ration (instead of providing full sound absorbtion values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1744=IFCSIMPLEPROPERTYTEMPLATE('0utpFxYKfB7xZMyHCV7N0k',$,'FireRating','Fire rating for this object.\X2\000A\X0\It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1745=IFCSIMPLEPROPERTYTEMPLATE('0Ss9sLM2b52fFiw4JomI6k',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of a material.\X2\000A\X0\It applies to the total door construction.',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#1746=IFCPROPERTYSETTEMPLATE('0qUbf75LrCPhZCWNU_2K0P',$,'Pset_RailingCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcRailing.',$,'IfcRailing',(#1747,#1748,#1749,#1750)); +#1746=IFCPROPERTYSETTEMPLATE('0qUbf75LrCPhZCWNU_2K0P',$,'Pset_RailingCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcRailing.',.PSET_OCCURRENCEDRIVEN.,'IfcRailing',(#1747,#1748,#1749,#1750)); #1747=IFCSIMPLEPROPERTYTEMPLATE('0qRjJJ$DbFdvAbZK8DfIf4',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1748=IFCSIMPLEPROPERTYTEMPLATE('2qVVWJ3LT5fw$rts1QE6i5',$,'Height','Height of the object. It is the upper hight of the railing above the floor or stair.\X2\000A\X0\The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1749=IFCSIMPLEPROPERTYTEMPLATE('1_DCudXg5BjveEQ1wsalg3',$,'Diameter','Diameter of the object. It is the diameter of the handrail of the railing.\X2\000A\X0\The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A\X0\Here the diameter of the hand or guardrail within the railing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1750=IFCSIMPLEPROPERTYTEMPLATE('3eT$Y77OP0fAUUU0e5o$rH',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1751=IFCPROPERTYSETTEMPLATE('26b9kBzwL2VRS0E8GCKNZ8',$,'Pset_RampCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcRamp.',$,'IfcRamp',(#1752,#1753,#1754,#1755,#1756,#1757,#1758,#1759)); +#1751=IFCPROPERTYSETTEMPLATE('26b9kBzwL2VRS0E8GCKNZ8',$,'Pset_RampCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcRamp.',.PSET_OCCURRENCEDRIVEN.,'IfcRamp',(#1752,#1753,#1754,#1755,#1756,#1757,#1758,#1759)); #1752=IFCSIMPLEPROPERTYTEMPLATE('3ahpVPSiPAJxo6vaYNzsPx',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1753=IFCSIMPLEPROPERTYTEMPLATE('0yoX$saaLC9ekuGVZWQC2k',$,'RequiredHeadroom','Required headroom clearance for the passageway according to the applicable building code or additional requirements.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1754=IFCSIMPLEPROPERTYTEMPLATE('0nMC0gwNH3nPcmiA_Ei$3P',$,'RequiredSlope','Required sloping angle of the object - relative to horizontal (0.0 degrees).\X2\000A\X0\Required maximum slope for the passageway according to the applicable building code or additional requirements ',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); @@ -1764,17 +1764,17 @@ DATA; #1757=IFCSIMPLEPROPERTYTEMPLATE('34VjwsiWH5iQeE8liK2sQA',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A\X0\Here it defines an exit ramp in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1758=IFCSIMPLEPROPERTYTEMPLATE('18DGdHF7HFtPLJw30GtmCt',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. \X2\000A\X0\Set to (TRUE) if this ramp is rated as handicap accessible according the local building codes, otherwise (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1759=IFCSIMPLEPROPERTYTEMPLATE('2YmVhvwdP7_BWAVvTNXWYA',$,'HasNonSkidSurface','Indication whether the surface finish is designed to prevent slippery (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1760=IFCPROPERTYSETTEMPLATE('2a2B_emyL09we0VwF_BYlM',$,'Pset_RampFlightCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcRampFlight.',$,'IfcRampFlight',(#1761,#1762,#1763)); +#1760=IFCPROPERTYSETTEMPLATE('2a2B_emyL09we0VwF_BYlM',$,'Pset_RampFlightCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcRampFlight.',.PSET_OCCURRENCEDRIVEN.,'IfcRampFlight',(#1761,#1762,#1763)); #1761=IFCSIMPLEPROPERTYTEMPLATE('1EnULnQtTDl8bTekZybOP6',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1762=IFCSIMPLEPROPERTYTEMPLATE('3HQggqDj95n80r45xtoqQD',$,'Headroom','Actual headroom clearance for the passageway according to the current design. \X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1763=IFCSIMPLEPROPERTYTEMPLATE('3zQSUs2$zCyg0dWGhFlav4',$,'Slope','Sloping angle of the object - relative to horizontal (0.0 degrees). \X2\000A\X0\Actual maximum slope for the passageway according to the current design.\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. ',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#1764=IFCPROPERTYSETTEMPLATE('3yxWAaYwLCWwHuQnTKZW0x',$,'Pset_RoofCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcRoof. Note: Properties for ProjectedArea and TotalArea added in IFC 2x3',$,'IfcRoof',(#1765,#1766,#1767,#1768,#1769)); +#1764=IFCPROPERTYSETTEMPLATE('3yxWAaYwLCWwHuQnTKZW0x',$,'Pset_RoofCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcRoof. Note: Properties for ProjectedArea and TotalArea added in IFC 2x3',.PSET_OCCURRENCEDRIVEN.,'IfcRoof',(#1765,#1766,#1767,#1768,#1769)); #1765=IFCSIMPLEPROPERTYTEMPLATE('3ln2Y_CcLEaO27UUMT05V5',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1766=IFCSIMPLEPROPERTYTEMPLATE('0Eiq1PwVv6OQWa81TQN2CG',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1767=IFCSIMPLEPROPERTYTEMPLATE('1sAhVK0QrCrQguj4xeh10U',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1768=IFCSIMPLEPROPERTYTEMPLATE('1fh_EwCZrF8hGog8h6v2Hl',$,'ProjectedArea','Area of the roof projected onto a 2D horizontal plane',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #1769=IFCSIMPLEPROPERTYTEMPLATE('3gJkLk3_z3Kv88hu5ZC3OD',$,'TotalArea','Total exposed area of the roof',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1770=IFCPROPERTYSETTEMPLATE('2ru99VyNvEdx4pNnmYKucK',$,'Pset_SlabCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcSlab. Note: Properties for PitchAngle added in IFC 2x3',$,'IfcSlab',(#1771,#1772,#1773,#1774,#1775,#1776,#1777,#1778,#1779,#1780)); +#1770=IFCPROPERTYSETTEMPLATE('2ru99VyNvEdx4pNnmYKucK',$,'Pset_SlabCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcSlab. Note: Properties for PitchAngle added in IFC 2x3',.PSET_OCCURRENCEDRIVEN.,'IfcSlab',(#1771,#1772,#1773,#1774,#1775,#1776,#1777,#1778,#1779,#1780)); #1771=IFCSIMPLEPROPERTYTEMPLATE('1HYC6s5bj0ghCkhP734vx8',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1772=IFCSIMPLEPROPERTYTEMPLATE('1FHcQk7f51QPtC0cyVtvEA',$,'AcousticRating','Acoustic rating for this object. It is giving according to the national building code. It indicates the sound transmission resistance of this object by an index ration (instead of providing full sound absorbtion values',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1773=IFCSIMPLEPROPERTYTEMPLATE('1y2G2zT2f92gvzAhPbn$NB',$,'FireRating',' Fire rating for this object. It is given according to the national fire safety classification. ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1785,7 +1785,7 @@ DATA; #1778=IFCSIMPLEPROPERTYTEMPLATE('1AF0Y0yhvC59z$$21HeAO9',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1779=IFCSIMPLEPROPERTYTEMPLATE('1CeI4$8_LFfAva$U58PGwi',$,'Compartmentation','Indication whether the object is designed to serve as a fire compartmentation (TRUE) or not (FALSE). ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1780=IFCSIMPLEPROPERTYTEMPLATE('25xOAttsT5_8$aDVGtFkoP',$,'PitchAngle','Angle of the slab to the horizontal when used as a component for the roof (specified as 0 degrees or not asserted for cases where the slab is not used as a roof component).',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#1781=IFCPROPERTYSETTEMPLATE('00P7WKNffDqf9rAFmHGJBe',$,'Pset_StairCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcStair.',$,'IfcStair',(#1782,#1783,#1784,#1785,#1786,#1787,#1788,#1789,#1790,#1791,#1792)); +#1781=IFCPROPERTYSETTEMPLATE('00P7WKNffDqf9rAFmHGJBe',$,'Pset_StairCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcStair.',.PSET_OCCURRENCEDRIVEN.,'IfcStair',(#1782,#1783,#1784,#1785,#1786,#1787,#1788,#1789,#1790,#1791,#1792)); #1782=IFCSIMPLEPROPERTYTEMPLATE('2rscjPVffDJgrsLOH5cQRg',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1783=IFCSIMPLEPROPERTYTEMPLATE('02jnGVhH9EbuFO6gBHngWP',$,'NumberOfRiser','Total number of the risers included in the stair',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); #1784=IFCSIMPLEPROPERTYTEMPLATE('2J7NX9twn8cxV6oreZ47gJ',$,'NumberOfTreads','Total number of treads included in the stair',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); @@ -1797,7 +1797,7 @@ DATA; #1790=IFCSIMPLEPROPERTYTEMPLATE('3r59Zwet1BLgkk4dW3m24f',$,'FireRating','Fire rating for this object.\X2\000A\X0\It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1791=IFCSIMPLEPROPERTYTEMPLATE('1j4m2PbmD0lAX5xdxdsWal',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A\X0\Here it defines an exit stair in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1792=IFCSIMPLEPROPERTYTEMPLATE('0nzj7uY4f4EfT_ItH_JXcw',$,'HasNonSkidSurface','Indication whether the surface finish is designed to prevent slippery (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1793=IFCPROPERTYSETTEMPLATE('1Oc4WJ999DuAVDReSlQeWK',$,'Pset_StairFlightCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcStairFlight.',$,'IfcStairFlight',(#1794,#1795,#1796,#1797,#1798,#1799,#1800,#1801,#1802,#1803,#1804)); +#1793=IFCPROPERTYSETTEMPLATE('1Oc4WJ999DuAVDReSlQeWK',$,'Pset_StairFlightCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcStairFlight.',.PSET_OCCURRENCEDRIVEN.,'IfcStairFlight',(#1794,#1795,#1796,#1797,#1798,#1799,#1800,#1801,#1802,#1803,#1804)); #1794=IFCSIMPLEPROPERTYTEMPLATE('1dxRNpyiD8wwl$Ueu03fqu',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1795=IFCSIMPLEPROPERTYTEMPLATE('1p9g_xXWL2XAYFZ73AvRJS',$,'NumberOfRiser','Total number of the risers included in the stair flight',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); #1796=IFCSIMPLEPROPERTYTEMPLATE('3AlPzsZ6rAUvZuKAUK8jxL',$,'NumberOfTreads','Total number of treads included in the stair flight',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); @@ -1809,7 +1809,7 @@ DATA; #1802=IFCSIMPLEPROPERTYTEMPLATE('0xR6662CP9zgZtLfvWxMHb',$,'TreadLengthAtInnerSide','Minimum length of treads at the inner side of the winder. \X2\000A\X0\Only relevant in case of winding flights, for straight flights it is identical with IfcStairFlight.TreadLength. It is a pre-calculated value, in case of inconsistencies, the value derived from the shape representation shall take precedence. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1803=IFCSIMPLEPROPERTYTEMPLATE('1xoO_7u9PDp8VMXjbeLrUZ',$,'Headroom','Actual headroom clearance for the passageway according to the current design. \X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1804=IFCSIMPLEPROPERTYTEMPLATE('0VdvC$4mr6oeaBCx1ouwJ5',$,'WaistThickness','Minimum thickness of the stair flight, measured perpendicular to the slope of the flight to the inner corner of riser and tread. It is a pre-calculated value, in case of inconsistencies, the value derived from the shape representation shall take precedence. ',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1805=IFCPROPERTYSETTEMPLATE('3_yggJYDn98g9N0SAQY_SE',$,'Pset_WallCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcWall and IfcWallStandardCase.',$,'IfcWall,IfcWallStandardCase',(#1806,#1807,#1808,#1809,#1810,#1811,#1812,#1813,#1814,#1815)); +#1805=IFCPROPERTYSETTEMPLATE('3_yggJYDn98g9N0SAQY_SE',$,'Pset_WallCommon','Definition from IAI: Properties common to the definition of all occurrences of IfcWall and IfcWallStandardCase.',.PSET_OCCURRENCEDRIVEN.,'IfcWall,IfcWallStandardCase',(#1806,#1807,#1808,#1809,#1810,#1811,#1812,#1813,#1814,#1815)); #1806=IFCSIMPLEPROPERTYTEMPLATE('12YDWZ8Kn1gfAl4vdvpLQT',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1807=IFCSIMPLEPROPERTYTEMPLATE('0ZIebxfD1DtByuxg6C3LLK',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is giving according to the national building code. It indicates the sound transmission resistance of this object by an index ration (instead of providing full sound absorbtion values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1808=IFCSIMPLEPROPERTYTEMPLATE('36Ns1dCo52m9eDo_i8DLHT',$,'FireRating','Fire rating given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1820,7 +1820,7 @@ DATA; #1813=IFCSIMPLEPROPERTYTEMPLATE('22Q2OzqFXDJxSaMMSWiJ$4',$,'ExtendToStructure','Indicates whether the object extend to the structure above (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1814=IFCSIMPLEPROPERTYTEMPLATE('2v7fqKPPP1iRl1LkqjX_78',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1815=IFCSIMPLEPROPERTYTEMPLATE('1JiAoga1P5YRa2MzjKNRpY',$,'Compartmentation','Indication whether the object is designed to serve as a fire compartmentation (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1816=IFCPROPERTYSETTEMPLATE('1X9b17O0j688lsy9WaP31Z',$,'Pset_WindowCommon','Definition from IAI: Properties common to the definition of all occurrences of Window.',$,'IfcWindow',(#1817,#1818,#1819,#1820,#1821,#1822,#1823,#1824,#1825)); +#1816=IFCPROPERTYSETTEMPLATE('1X9b17O0j688lsy9WaP31Z',$,'Pset_WindowCommon','Definition from IAI: Properties common to the definition of all occurrences of Window.',.PSET_OCCURRENCEDRIVEN.,'IfcWindow',(#1817,#1818,#1819,#1820,#1821,#1822,#1823,#1824,#1825)); #1817=IFCSIMPLEPROPERTYTEMPLATE('3opoCWoMnBAQV4zeWvAgw4',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1'')',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #1818=IFCSIMPLEPROPERTYTEMPLATE('05zllBl953SuCMcSUXoZ_i',$,'FireRating','Fire rating for this object.\X2\000A\X0\It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1819=IFCSIMPLEPROPERTYTEMPLATE('3CfUlCjv5AO8XaCZI3aeCt',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is giving according to the national building code. It indicates the sound transmission resistance of this object by an index ration (instead of providing full sound absorbtion values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -1830,7 +1830,7 @@ DATA; #1823=IFCSIMPLEPROPERTYTEMPLATE('1KWx8nwoP0WeuQM61$5ONh',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of a material.\X2\000A\X0\It applies to the total door construction.',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); #1824=IFCSIMPLEPROPERTYTEMPLATE('0hpZTTKcTFmgoAzv7ubEpC',$,'GlazingAreaFraction','Fraction of the glazing area relative to the total area of the filling element. \X2\000A\X0\It shall be used, if the glazing area is not given separately for all panels within the filling element. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #1825=IFCSIMPLEPROPERTYTEMPLATE('0z1mvcHDf8oAT_Ite1dmWv',$,'SmokeStop','Indication whether the object is designed to provide a smoke stop (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1826=IFCPROPERTYSETTEMPLATE('3GBtheDSD1Rfo7WpBsojlT',$,'Pset_AirSideSystemInformation','Definition from IAI: Attributes that apply to an air side HVAC system. HISTORY: New property set in IFC Release 1.0.',$,'IfcSpatialStructureElement,IfcSystem',(#1827,#1828,#1829,#1831,#1833,#1834,#1835,#1836,#1837,#1838,#1839,#1840,#1841,#1842,#1843,#1844,#1845,#1846)); +#1826=IFCPROPERTYSETTEMPLATE('3GBtheDSD1Rfo7WpBsojlT',$,'Pset_AirSideSystemInformation','Definition from IAI: Attributes that apply to an air side HVAC system. HISTORY: New property set in IFC Release 1.0.',.PSET_OCCURRENCEDRIVEN.,'IfcSpatialStructureElement,IfcSystem',(#1827,#1828,#1829,#1831,#1833,#1834,#1835,#1836,#1837,#1838,#1839,#1840,#1841,#1842,#1843,#1844,#1845,#1846)); #1827=IFCSIMPLEPROPERTYTEMPLATE('1nuMC2Jaj8YR1SBiJJRhpH',$,'Name','The name of the air side system ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1828=IFCSIMPLEPROPERTYTEMPLATE('0Sk2PLQ7LBNuNwwQ6eKjfP',$,'Description','The description of the air side system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1829=IFCSIMPLEPROPERTYTEMPLATE('1GeEXnYCjEDegrkY$h4ziW',$,'AirSideSystemType','This enumeration specifies the basic types of possible air side systems (e.g., Constant Volume, Variable Volume, etc.) ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1830,$,$,$,.READWRITE.); @@ -1851,7 +1851,7 @@ DATA; #1844=IFCSIMPLEPROPERTYTEMPLATE('0eSgwnoNj2YBT5ip1Z9CKD',$,'CoolingTemperatureDelta','Cooling temperature difference for calculating space air flow rates ',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #1845=IFCSIMPLEPROPERTYTEMPLATE('3tdRCD3uj1H9is11jXWMxW',$,'Ventilation','Required outside air ventilation. ',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #1846=IFCSIMPLEPROPERTYTEMPLATE('3XtTUITpHA0BmjSGo$25OS',$,'FanPower','Fan motor loads contributing to the cooling load. ',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1847=IFCPROPERTYSETTEMPLATE('3AeO3Ck9T1lBDpQB7z7Net',$,'Pset_DistributionChamberElementTypeFormedDuct','Definition from BS6100 100 3410: Space formed in the ground for the passage of pipes, cables, ducts.',$,'IfcDistributionChamberElementType',(#1848,#1849,#1850,#1851,#1852,#1853,#1854,#1855,#1856)); +#1847=IFCPROPERTYSETTEMPLATE('3AeO3Ck9T1lBDpQB7z7Net',$,'Pset_DistributionChamberElementTypeFormedDuct','Definition from BS6100 100 3410: Space formed in the ground for the passage of pipes, cables, ducts.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElementType',(#1848,#1849,#1850,#1851,#1852,#1853,#1854,#1855,#1856)); #1848=IFCSIMPLEPROPERTYTEMPLATE('1jkaiAKIb5kB589z9knXfl',$,'ClearWidth','The width of the formed space in the duct.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1849=IFCSIMPLEPROPERTYTEMPLATE('2zWh3t9k53a8S$7bfEE5TW',$,'ClearDepth','The depth of the formed space in the duct.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1850=IFCSIMPLEPROPERTYTEMPLATE('2ZKvi$9cfB5RTzOqwUNrq8',$,'WallMaterial','The material from which the wall of the duct is constructed.\X2\000A\X0\NOTE: It is assumed that duct walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); @@ -1861,7 +1861,7 @@ DATA; #1854=IFCSIMPLEPROPERTYTEMPLATE('3spFJP3CnD_wxr4dmdOAMC',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1855=IFCSIMPLEPROPERTYTEMPLATE('0ThM4oXLX9Wv8evERUIk58',$,'AccessCoverLoadRating','The load rating of the access cover (which may be a value or an alphanumerically defined class rating)',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #1856=IFCSIMPLEPROPERTYTEMPLATE('0buxYBytf1tAp7XukNZV2u',$,'FillMaterial','The material that is used to fill the duct (where used).',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1857=IFCPROPERTYSETTEMPLATE('1i8Cby2Xv0AueP_i5WNEWc',$,'Pset_DistributionChamberElementTypeInspectionChamber','Definition from IAI: Chamber constructed on a drain, sewer or pipeline and with a removable cover, that permits visible inspection.',$,'IfcDistributionChamberElementType',(#1858,#1859,#1860,#1861,#1862,#1863,#1864,#1865,#1866,#1867,#1868,#1869,#1870)); +#1857=IFCPROPERTYSETTEMPLATE('1i8Cby2Xv0AueP_i5WNEWc',$,'Pset_DistributionChamberElementTypeInspectionChamber','Definition from IAI: Chamber constructed on a drain, sewer or pipeline and with a removable cover, that permits visible inspection.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElementType',(#1858,#1859,#1860,#1861,#1862,#1863,#1864,#1865,#1866,#1867,#1868,#1869,#1870)); #1858=IFCSIMPLEPROPERTYTEMPLATE('2r0qe3Iz1BxuJU3y5CAdw1',$,'ChamberLengthOrRadius','Length or, in the event of the shape being circular in plan, the radius of the chamber.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1859=IFCSIMPLEPROPERTYTEMPLATE('049X0qfQjAdOvQfyWqS1tB',$,'ChamberWidth','Width, in the event of the shape being non circular in plan.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1860=IFCSIMPLEPROPERTYTEMPLATE('2o77o5aUr2rhsJeojwka5p',$,'InvertLevel','Level of the lowest part of the cross section. (BS6100 250 8001)',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -1875,11 +1875,11 @@ DATA; #1868=IFCSIMPLEPROPERTYTEMPLATE('1HC1mMPp92_AUrXMSxZFGl',$,'AccessLengthOrRadius','The length of the chamber access cover or, where the plan shape of the cover is circular, the radius.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1869=IFCSIMPLEPROPERTYTEMPLATE('1CZfITLvPECPa2NgBCTZes',$,'AccessWidth','The width of the chamber access cover where the plan shape of the cover is not circular.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1870=IFCSIMPLEPROPERTYTEMPLATE('15oRePe5vBk9Ffd4RSopQr',$,'AccessCoverLoadRating','The load rating of the access cover (which may be a value or an alphanumerically defined class rating)',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1871=IFCPROPERTYSETTEMPLATE('03IX0wMdDEFArkSOfZv6_q',$,'Pset_DistributionChamberElementTypeInspectionPit','Definition from IAI: Recess or chamber formed to permit access for inspection of substructure and services (definition modified from BS6100 221 4128).',$,'IfcDistributionChamberElementType',(#1872,#1873,#1874)); +#1871=IFCPROPERTYSETTEMPLATE('03IX0wMdDEFArkSOfZv6_q',$,'Pset_DistributionChamberElementTypeInspectionPit','Definition from IAI: Recess or chamber formed to permit access for inspection of substructure and services (definition modified from BS6100 221 4128).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElementType',(#1872,#1873,#1874)); #1872=IFCSIMPLEPROPERTYTEMPLATE('0dyrpX_M93wvR56UL_4Xb4',$,'Length','The length of the pit.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1873=IFCSIMPLEPROPERTYTEMPLATE('36w3Ly_u5FixoXWVVjQLHw',$,'Width','The width of the pit.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1874=IFCSIMPLEPROPERTYTEMPLATE('36XaXMy9T87xaIEcShxxaG',$,'Depth','The depth of the pit.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1875=IFCPROPERTYSETTEMPLATE('2NWHEZcfb808PkBwvDMkZd',$,'Pset_DistributionChamberElementTypeManhole','Definition from IAI: Chamber constructed on a drain, sewer or pipeline and with a removable cover, that permits the entry of a person.',$,'IfcDistributionChamberElementType',(#1876,#1877,#1878,#1879,#1880,#1881,#1882,#1883,#1884,#1885,#1886,#1887,#1888)); +#1875=IFCPROPERTYSETTEMPLATE('2NWHEZcfb808PkBwvDMkZd',$,'Pset_DistributionChamberElementTypeManhole','Definition from IAI: Chamber constructed on a drain, sewer or pipeline and with a removable cover, that permits the entry of a person.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElementType',(#1876,#1877,#1878,#1879,#1880,#1881,#1882,#1883,#1884,#1885,#1886,#1887,#1888)); #1876=IFCSIMPLEPROPERTYTEMPLATE('3_cmseT8zClv$AY$70xqDx',$,'InvertLevel','Level of the lowest part of the cross section. (BS6100 250 8001)',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #1877=IFCSIMPLEPROPERTYTEMPLATE('2yG$FBEdH3igYSlB3RgkhK',$,'SoffitLevel','Level of the highest internal part of the cross section. (BS6100 250 8002)',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #1878=IFCSIMPLEPROPERTYTEMPLATE('3DOk_aQfrB0gLqZprDvgb5',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); @@ -1893,7 +1893,7 @@ DATA; #1886=IFCSIMPLEPROPERTYTEMPLATE('1XefYUkzb2MQUggDRxG_MW',$,'AccessLengthOrRadius','The length of the chamber access cover or, where the plan shape of the cover is circular, the radius.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1887=IFCSIMPLEPROPERTYTEMPLATE('0KU6eQ2ZvAP8eK$NaeRPIU',$,'AccessWidth','The width of the chamber access cover where the plan shape of the cover is not circular.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1888=IFCSIMPLEPROPERTYTEMPLATE('3o_aLUNNvCIegfWzJjM3NV',$,'AccessCoverLoadRating','The load rating of the access cover (which may be a value or an alphanumerically defined class rating)',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1889=IFCPROPERTYSETTEMPLATE('2R13G0sd59SBvg6lSUxLuw',$,'Pset_DistributionChamberElementTypeMeterChamber','Definition from IAI: Chamber that houses a meter(s) (definition modified from BS6100 250 6224).',$,'IfcDistributionChamberElementType',(#1890,#1891,#1892,#1893,#1894,#1895,#1896)); +#1889=IFCPROPERTYSETTEMPLATE('2R13G0sd59SBvg6lSUxLuw',$,'Pset_DistributionChamberElementTypeMeterChamber','Definition from IAI: Chamber that houses a meter(s) (definition modified from BS6100 250 6224).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElementType',(#1890,#1891,#1892,#1893,#1894,#1895,#1896)); #1890=IFCSIMPLEPROPERTYTEMPLATE('2XNlRRXrjDlxmkjI6yZ6IV',$,'ChamberLengthOrRadius','Length or, in the event of the shape being circular in plan, the radius of the chamber.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1891=IFCSIMPLEPROPERTYTEMPLATE('2ov5v9lUX4qhcUJIsKUZct',$,'ChamberWidth','Width, in the event of the shape being non circular in plan.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1892=IFCSIMPLEPROPERTYTEMPLATE('2EtJEr_lb7h97ielcHZGx4',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); @@ -1901,15 +1901,15 @@ DATA; #1894=IFCSIMPLEPROPERTYTEMPLATE('1lbBKPWPX4GvI8fyeybNpU',$,'BaseMaterial','The material from which the base of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1895=IFCSIMPLEPROPERTYTEMPLATE('0yRrEZmk50LhPlShSzYaMV',$,'BaseThickness','The thickness of the chamber base construction\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1896=IFCSIMPLEPROPERTYTEMPLATE('05v4GqMVr1vQZX0yO0k5tt',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1897=IFCPROPERTYSETTEMPLATE('1t8BGgSiv8duf5UlB8$Irw',$,'Pset_DistributionChamberElementTypeSump','Definition from BS6100 100 3431: Recess or small chamber into which liquid is drained to facilitate its removal.',$,'IfcDistributionChamberElementType',(#1898,#1899,#1900)); +#1897=IFCPROPERTYSETTEMPLATE('1t8BGgSiv8duf5UlB8$Irw',$,'Pset_DistributionChamberElementTypeSump','Definition from BS6100 100 3431: Recess or small chamber into which liquid is drained to facilitate its removal.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElementType',(#1898,#1899,#1900)); #1898=IFCSIMPLEPROPERTYTEMPLATE('2VUpQGkObD69cjtlc6XQE8',$,'Length','The length of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1899=IFCSIMPLEPROPERTYTEMPLATE('01pH$vBIf7LOE$sPKiNtuj',$,'Width','The width of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1900=IFCSIMPLEPROPERTYTEMPLATE('3m81WaehnBE98nAf0NQbcw',$,'InvertLevel','The lowest point in the cross section of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1901=IFCPROPERTYSETTEMPLATE('2gET7G8MzDzRiT7$BlN97s',$,'Pset_DistributionChamberElementTypeTrench','Definition from BS6100 221 4118: Excavation, the length of which greatly exceeds the width.',$,'IfcDistributionChamberElementType',(#1902,#1903,#1904)); +#1901=IFCPROPERTYSETTEMPLATE('2gET7G8MzDzRiT7$BlN97s',$,'Pset_DistributionChamberElementTypeTrench','Definition from BS6100 221 4118: Excavation, the length of which greatly exceeds the width.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElementType',(#1902,#1903,#1904)); #1902=IFCSIMPLEPROPERTYTEMPLATE('3Nsc_ZmoTF7Ryn6d41Va3v',$,'Width','The width of the trench.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1903=IFCSIMPLEPROPERTYTEMPLATE('0gHnhBo6568OxLynpdfvD9',$,'Depth','The depth of the trench.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1904=IFCSIMPLEPROPERTYTEMPLATE('1EIp5tbtPEnO0TuSPKc1K5',$,'InvertLevel','Level of the lowest part of the cross section. (BS6100 250 8001)',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1905=IFCPROPERTYSETTEMPLATE('0xzX72YZzCkvsieAfE8$AC',$,'Pset_DistributionChamberElementTypeValveChamber','Definition from BS6100 250 6224: Chamber that houses a valve(s).',$,'IfcDistributionChamberElementType',(#1906,#1907,#1908,#1909,#1910,#1911,#1912)); +#1905=IFCPROPERTYSETTEMPLATE('0xzX72YZzCkvsieAfE8$AC',$,'Pset_DistributionChamberElementTypeValveChamber','Definition from BS6100 250 6224: Chamber that houses a valve(s).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElementType',(#1906,#1907,#1908,#1909,#1910,#1911,#1912)); #1906=IFCSIMPLEPROPERTYTEMPLATE('2DmVvKpC9ArO5LlaVo6bHk',$,'ChamberLengthOrRadius','Length or, in the event of the shape being circular in plan, the radius of the chamber.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1907=IFCSIMPLEPROPERTYTEMPLATE('36bKSOhj9Bvh2PKpboDeqz',$,'ChamberWidth','Width, in the event of the shape being non circular in plan.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1908=IFCSIMPLEPROPERTYTEMPLATE('0d42dU6UXEu8iE7uTOr9pz',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); @@ -1917,42 +1917,42 @@ DATA; #1910=IFCSIMPLEPROPERTYTEMPLATE('1s_sAM0CPC6QIiofXZTQIN',$,'BaseMaterial','The material from which the base of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); #1911=IFCSIMPLEPROPERTYTEMPLATE('33vTMB1Dz43u2JX2PIY5y2',$,'BaseThickness','The thickness of the chamber base construction\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1912=IFCSIMPLEPROPERTYTEMPLATE('146l850MPBkA07mWcqc099',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterial',$,$,$,$,$,.READWRITE.); -#1913=IFCPROPERTYSETTEMPLATE('3_U0quLdLBowcWw9H4wEY_',$,'Pset_DistributionFlowElementCommon','Definition from IAI: Common properties of all occurrences of IfcDistributionFlowElement and their subtypes.\X2\000A\X0\',$,'IfcDistributionFlowElement,IfcDistributionChamberElement,IfcEnergyConversionDevice,IfcFlowController,IfcFlowFitting,IfcFlowMovingDevice,IfcFlowSegment,IfcFlowStorageDevice,IfcFlowTerminal,IfcFlowTreatmentDevice',(#1914)); +#1913=IFCPROPERTYSETTEMPLATE('3_U0quLdLBowcWw9H4wEY_',$,'Pset_DistributionFlowElementCommon','Definition from IAI: Common properties of all occurrences of IfcDistributionFlowElement and their subtypes.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionFlowElement,IfcDistributionChamberElement,IfcEnergyConversionDevice,IfcFlowController,IfcFlowFitting,IfcFlowMovingDevice,IfcFlowSegment,IfcFlowStorageDevice,IfcFlowTerminal,IfcFlowTreatmentDevice',(#1914)); #1914=IFCSIMPLEPROPERTYTEMPLATE('3mEbPyrp90YhE0gJsb1511',$,'Reference','Reference ID for this specific instance (e.g. ''WWS/VS1/400/001'', which indicates the occurrence belongs to system WWS, subsystems VSI/400, and has the component number 001) ',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1915=IFCPROPERTYSETTEMPLATE('3JrDjzZ1bFSgF2F6uxfrbh',$,'Pset_DistributionPortDuct','Definition from IAI: Duct port occurrence attributes attached to an instance of IfcDistributionPort.\X2\000A\X0\',$,'IfcDistributionPort',(#1916,#1917)); +#1915=IFCPROPERTYSETTEMPLATE('3JrDjzZ1bFSgF2F6uxfrbh',$,'Pset_DistributionPortDuct','Definition from IAI: Duct port occurrence attributes attached to an instance of IfcDistributionPort.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort',(#1916,#1917)); #1916=IFCSIMPLEPROPERTYTEMPLATE('0ylNAUSUzE$uxc7X8uuh53',$,'PortNumber','The index of the port as it relates to the related object. Each index must be unique for any given related object.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #1917=IFCSIMPLEPROPERTYTEMPLATE('0s0LBH70zEggWTIS2W6GJt',$,'ConnectionType','The end-style treatment of the duct port:\X2\000A\X0\BEADEDSLEEVE: Beaded Sleeve. \X2\000A\X0\COMPRESSION: Compression. \X2\000A\X0\CRIMP: Crimp. \X2\000A\X0\DRAWBAND: Drawband. \X2\000A\X0\DRIVESLIP: Drive slip. \X2\000A\X0\FLANGED: Flanged. \X2\000A\X0\OUTSIDESLEEVE: Outside Sleeve. \X2\000A\X0\SLIPON: Slipon. \X2\000A\X0\SOLDERED: Soldered. \X2\000A\X0\SSLIP: S-Slip. \X2\000A\X0\STANDINGSEAM: Standing seam. \X2\000A\X0\SWEDGE: Swedge. \X2\000A\X0\WELDED: Welded. \X2\000A\X0\OTHER: Another type of end-style has been applied.\X2\000A\X0\NONE: No end-style has been applied.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1918,$,$,$,.READWRITE.); #1918=IFCPROPERTYENUMERATION('PEnum_DuctConnectionType',(IFCLABEL('BEADEDSLEEVE'),IFCLABEL('COMPRESSION'),IFCLABEL('CRIMP'),IFCLABEL('DRAWBAND'),IFCLABEL('DRIVESLIP'),IFCLABEL('FLANGED'),IFCLABEL('OUTSIDESLEEVE'),IFCLABEL('SLIPON'),IFCLABEL('SOLDERED'),IFCLABEL('SSLIP'),IFCLABEL('STANDINGSEAM'),IFCLABEL('SWEDGE'),IFCLABEL('WELDED'),IFCLABEL('OTHER'),IFCLABEL('NONE'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); -#1919=IFCPROPERTYSETTEMPLATE('1AsvA8bK1208WgdoSxNxxK',$,'Pset_DistributionPortPipe','Definition from IAI: Pipe port occurrence attributes attached to an instance of IfcDistributionPort.\X2\000A\X0\',$,'IfcDistributionPort',(#1920,#1921)); +#1919=IFCPROPERTYSETTEMPLATE('1AsvA8bK1208WgdoSxNxxK',$,'Pset_DistributionPortPipe','Definition from IAI: Pipe port occurrence attributes attached to an instance of IfcDistributionPort.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort',(#1920,#1921)); #1920=IFCSIMPLEPROPERTYTEMPLATE('1SjF$zFvzCBO4lfQ_S6VRM',$,'PortNumber','The index of the port as it relates to the related object. Each index must be unique for any given related object.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #1921=IFCSIMPLEPROPERTYTEMPLATE('3eBBKpHu5FcB1tDHN1KU_m',$,'ConnectionType','The end-style treatment of the pipe port:\X2\000A\X0\BRAZED: Brazed. \X2\000A\X0\COMPRESSION: Compression. \X2\000A\X0\FLANGED: Flanged. \X2\000A\X0\GROOVED: Grooved. \X2\000A\X0\OUTSIDESLEEVE: Outside Sleeve. \X2\000A\X0\SOLDERED: Soldered. \X2\000A\X0\SWEDGE: Swedge. \X2\000A\X0\THREADED: Threaded. \X2\000A\X0\WELDED: Welded. \X2\000A\X0\OTHER: Another type of end-style has been applied.\X2\000A\X0\NONE: No end-style has been applied.\X2\000A\X0\USERDEFINED: User-defined port connection type. \X2\000A\X0\NOTDEFINED: Undefined port connection type. ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1922,$,$,$,.READWRITE.); #1922=IFCPROPERTYENUMERATION('PEnum_PipeEndStyleTreatment',(IFCLABEL('BRAZED'),IFCLABEL('COMPRESSION'),IFCLABEL('FLANGED'),IFCLABEL('GROOVED'),IFCLABEL('OUTSIDESLEEVE'),IFCLABEL('SOLDERED'),IFCLABEL('SWEDGE'),IFCLABEL('THREADED'),IFCLABEL('WELDED'),IFCLABEL('OTHER'),IFCLABEL('NONE'),IFCLABEL('UNSET')),$); -#1923=IFCPROPERTYSETTEMPLATE('2e1lh3pqnFPxaF1td16rwt',$,'Pset_EnergyConversionDeviceCoil','Definition from IAI: Coil occurrence attributes attached to an instance of IfcEnergyConversionDevice.\X2\000A\X0\',$,'IfcEnergyConversionDevice',(#1924)); +#1923=IFCPROPERTYSETTEMPLATE('2e1lh3pqnFPxaF1td16rwt',$,'Pset_EnergyConversionDeviceCoil','Definition from IAI: Coil occurrence attributes attached to an instance of IfcEnergyConversionDevice.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcEnergyConversionDevice',(#1924)); #1924=IFCSIMPLEPROPERTYTEMPLATE('3rOH$PhGrDJR841oJF9cwZ',$,'HasSoundAttentuation','TRUE if the coil has sound attenuation, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1925=IFCPROPERTYSETTEMPLATE('2YKKSBUyD5GQSstH7bJufz',$,'Pset_EnergyConversionDeviceSpaceHeaterPanel','Definition from IAI: Panel space heater type occurrence attributes.\X2\000A\X0\',$,'IfcEnergyConversionDevice',(#1926)); +#1925=IFCPROPERTYSETTEMPLATE('2YKKSBUyD5GQSstH7bJufz',$,'Pset_EnergyConversionDeviceSpaceHeaterPanel','Definition from IAI: Panel space heater type occurrence attributes.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcEnergyConversionDevice',(#1926)); #1926=IFCSIMPLEPROPERTYTEMPLATE('0IDhhSWyTBQQvtp_txCCKM',$,'NumberOfPanels','Number of panels.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#1927=IFCPROPERTYSETTEMPLATE('0zhqaGe4D7vfpvolM4z9Im',$,'Pset_EnergyConversionDeviceSpaceHeaterSectional','Definition from IAI: Sectional space heater type occurrence attributes.\X2\000A\X0\',$,'IfcEnergyConversionDevice',(#1928)); +#1927=IFCPROPERTYSETTEMPLATE('0zhqaGe4D7vfpvolM4z9Im',$,'Pset_EnergyConversionDeviceSpaceHeaterSectional','Definition from IAI: Sectional space heater type occurrence attributes.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcEnergyConversionDevice',(#1928)); #1928=IFCSIMPLEPROPERTYTEMPLATE('2pxVAs3hn7Z9f0rqCqv0Nq',$,'NumberOfSections','Number of vertical sections, measured in the direction of flow.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#1929=IFCPROPERTYSETTEMPLATE('3mmw54EoHExuJ1ZVgIq$cE',$,'Pset_FireRatingProperties','Definition from IAI: Properties related to the combustion of materials for purposes of assessing fire hazard.',$,'IfcSpatialStructureElement,IfcElement',(#1930,#1931,#1932)); +#1929=IFCPROPERTYSETTEMPLATE('3mmw54EoHExuJ1ZVgIq$cE',$,'Pset_FireRatingProperties','Definition from IAI: Properties related to the combustion of materials for purposes of assessing fire hazard.',.PSET_OCCURRENCEDRIVEN.,'IfcSpatialStructureElement,IfcElement',(#1930,#1931,#1932)); #1930=IFCSIMPLEPROPERTYTEMPLATE('2EYu580sTAHg11bIhd8erd',$,'FireResistanceRating','Fire rating identifying the entity''s fire resistive value (e.g., 1-hour, 2-hour, etc.) so that its resistance to fire can be compared to that of the surrounding structure.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1931=IFCSIMPLEPROPERTYTEMPLATE('3hJZFtS6LBxOOcVmjmentf',$,'IsCombustible','Combustibility (YES it is combustible or NO it is not combustible).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1932=IFCSIMPLEPROPERTYTEMPLATE('1qt7bpNFf34O87ifXgiUmX',$,'SurfaceSpreadOfFlame','Surface spread of flame characteristics.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1933=IFCPROPERTYSETTEMPLATE('1qY$QkEiXB0O1d6TIJVK$N',$,'Pset_FlowControllerDamper','Definition from IAI: Damper occurrence attributes attached to an instance of IfcFlowController.\X2\000A\X0\',$,'IfcFlowController',(#1934)); +#1933=IFCPROPERTYSETTEMPLATE('1qY$QkEiXB0O1d6TIJVK$N',$,'Pset_FlowControllerDamper','Definition from IAI: Damper occurrence attributes attached to an instance of IfcFlowController.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowController',(#1934)); #1934=IFCSIMPLEPROPERTYTEMPLATE('3Lb6_qUnTBTu2RDBsoDqwa',$,'SizingMethod','Identifies whether the damper is sized nominally or with exact measurements:\X2\000A\X0\NOMINAL: Nominal sizing method. \X2\000A\X0\EXACT: Exact sizing method. ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1935,$,$,$,.READWRITE.); #1935=IFCPROPERTYENUMERATION('PEnum_DamperSizingMethod',(IFCLABEL('NOMINAL'),IFCLABEL('EXACT'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1936=IFCPROPERTYSETTEMPLATE('1uHr9WUc18_vdAJAXhyBIs',$,'Pset_FlowControllerFlowMeter','Definition from IAI: Flow meter occurrence common attributes.\X2\000A\X0\',$,'IfcFlowController',(#1937)); +#1936=IFCPROPERTYSETTEMPLATE('1uHr9WUc18_vdAJAXhyBIs',$,'Pset_FlowControllerFlowMeter','Definition from IAI: Flow meter occurrence common attributes.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowController',(#1937)); #1937=IFCSIMPLEPROPERTYTEMPLATE('2w4IEnbbH3ZuITAaBPu$Iz',$,'Purpose','Enumeration defining the purpose of the flow meter occurrence.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1938,$,$,$,.READWRITE.); #1938=IFCPROPERTYENUMERATION('PEnum_FlowMeterPurpose',(IFCLABEL('MASTER'),IFCLABEL('SUBMASTER'),IFCLABEL('SUBMETER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1939=IFCPROPERTYSETTEMPLATE('14FBkQX4PEIhvY$n7o$Mou',$,'Pset_FlowFittingDuctFitting','Definition from IAI: Duct fitting occurrence attributes attached to an instance of IfcFlowFitting.\X2\000A\X0\',$,'IfcFlowFitting',(#1940,#1941,#1942)); +#1939=IFCPROPERTYSETTEMPLATE('14FBkQX4PEIhvY$n7o$Mou',$,'Pset_FlowFittingDuctFitting','Definition from IAI: Duct fitting occurrence attributes attached to an instance of IfcFlowFitting.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowFitting',(#1940,#1941,#1942)); #1940=IFCSIMPLEPROPERTYTEMPLATE('0d0kfF4jPCM9W5TMYZ6OAw',$,'AbsoluteRoughnessFactor','The absolute roughness factor of the duct fitting.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1941=IFCSIMPLEPROPERTYTEMPLATE('2T7EtrJzT07OCXjoUXUqGc',$,'HasLiner','TRUE if the fitting has interior duct insulating lining, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1942=IFCSIMPLEPROPERTYTEMPLATE('1u6QFTow9E1g$pRqi$UmCT',$,'Color','The color of the duct fitting.\X2\000A000A\X0\Note: This is typically used for any duct fittings with a painted surface which is not otherwise specified as a covering.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1943=IFCPROPERTYSETTEMPLATE('2lV4DQKTz5SgmLXfY9WvOM',$,'Pset_FlowFittingPipeFitting','Definition from IAI: Pipe fitting occurrence attributes attached to an instance of IfcFlowFitting.\X2\000A\X0\',$,'IfcFlowFitting',(#1944,#1945)); +#1943=IFCPROPERTYSETTEMPLATE('2lV4DQKTz5SgmLXfY9WvOM',$,'Pset_FlowFittingPipeFitting','Definition from IAI: Pipe fitting occurrence attributes attached to an instance of IfcFlowFitting.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowFitting',(#1944,#1945)); #1944=IFCSIMPLEPROPERTYTEMPLATE('3pXNxaFVD4p9K2eulaaOmp',$,'InteriorRoughnessCoefficient','The interior roughness of the pipe fitting material.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1945=IFCSIMPLEPROPERTYTEMPLATE('0mA9pNBKTBGuyW3$ginH_b',$,'Color','The color of the pipe fitting.\X2\000A000A\X0\Note: This is typically used only for plastic pipe fittings. However, it may be used for any pipe fittings with a painted surface which is not otherwise specified as a covering.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1946=IFCPROPERTYSETTEMPLATE('38KgSmy_X5hOxmSMIDYGYy',$,'Pset_FlowMovingDeviceCompressor','Definition from IAI: Compressor occurrence attributes attached to an instance of IfcFlowMovingDevice.\X2\000A\X0\',$,'IfcFlowMovingDevice',(#1947)); +#1946=IFCPROPERTYSETTEMPLATE('38KgSmy_X5hOxmSMIDYGYy',$,'Pset_FlowMovingDeviceCompressor','Definition from IAI: Compressor occurrence attributes attached to an instance of IfcFlowMovingDevice.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowMovingDevice',(#1947)); #1947=IFCSIMPLEPROPERTYTEMPLATE('2kTn6c3zP4YxiVV7Ftz_8z',$,'ImpellerDiameter','Diameter of compressor impeller - used to scale performance of geometrically similar compressors.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1948=IFCPROPERTYSETTEMPLATE('0baD84u2H50eTY9kaTTebT',$,'Pset_FlowMovingDeviceFan','Definition from IAI: Fan occurrence attributes attached to an instance of IfcFlowMovingDevice.\X2\000A\X0\',$,'IfcFlowMovingDevice',(#1949,#1951,#1953,#1955,#1957,#1959,#1960)); +#1948=IFCPROPERTYSETTEMPLATE('0baD84u2H50eTY9kaTTebT',$,'Pset_FlowMovingDeviceFan','Definition from IAI: Fan occurrence attributes attached to an instance of IfcFlowMovingDevice.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowMovingDevice',(#1949,#1951,#1953,#1955,#1957,#1959,#1960)); #1949=IFCSIMPLEPROPERTYTEMPLATE('2ghy7oEET4IQSgm_XtX6qH',$,'DischargeType','Defines the type of connection at the fan discharge.\X2\000A\X0\Duct: Discharge into ductwork.\X2\000A\X0\Screen: Discharge into screen outlet.\X2\000A\X0\Louver: Discharge into a louver.\X2\000A\X0\Damper: Discharge into a damper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1950,$,$,$,.READWRITE.); #1950=IFCPROPERTYENUMERATION('PEnum_FanDischargeType',(IFCLABEL('DUCT'),IFCLABEL('SCREEN'),IFCLABEL('LOUVER'),IFCLABEL('DAMPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1951=IFCSIMPLEPROPERTYTEMPLATE('19GTSfTDr9PPSZ9vdLmaa$',$,'ApplicationOfFan','The functional application of the fan:\X2\000A\X0\SUPPLYAIR: Supply air fan. \X2\000A\X0\RETURNAIR: Return air fan. \X2\000A\X0\EXHAUSTAIR: Exhaust air fan. \X2\000A\X0\OTHER: Other type of application not defined above.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1952,$,$,$,.READWRITE.); @@ -1965,42 +1965,42 @@ DATA; #1958=IFCPROPERTYENUMERATION('PEnum_FanMountingType',(IFCLABEL('MANUFACTUREDCURB'),IFCLABEL('FIELDERECTEDCURB'),IFCLABEL('CONCRETEPAD'),IFCLABEL('SUSPENDED'),IFCLABEL('WALLMOUNTED'),IFCLABEL('DUCTMOUNTED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1959=IFCSIMPLEPROPERTYTEMPLATE('1Pa$kHQwP7WQm21SVkypbj',$,'FractionOfMotorHeatToAirStream','Fraction of the motor heat released into the fluid flow.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #1960=IFCSIMPLEPROPERTYTEMPLATE('2jqAZAWj14tBr45d_FshrA',$,'ImpellerDiameter','Diameter of fan wheel - used to scale performance of geometrically similar fans.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1961=IFCPROPERTYSETTEMPLATE('32UidnOqTBD9vrYNOCyG4N',$,'Pset_FlowMovingDeviceFanCentrifugal','Definition from IAI: Centrifugal fan occurrence attributes attached to an instance of IfcFlowMovingDevice.\X2\000A\X0\',$,'IfcFlowMovingDevice',(#1962,#1964,#1966)); +#1961=IFCPROPERTYSETTEMPLATE('32UidnOqTBD9vrYNOCyG4N',$,'Pset_FlowMovingDeviceFanCentrifugal','Definition from IAI: Centrifugal fan occurrence attributes attached to an instance of IfcFlowMovingDevice.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowMovingDevice',(#1962,#1964,#1966)); #1962=IFCSIMPLEPROPERTYTEMPLATE('0ZVNqEQlT8nvOQEJKC1SAr',$,'DischargePosition','Centrifugal fan discharge position:\X2\000A\X0\TOPHORIZONTAL: Top horizontal discharge. \X2\000A\X0\TOPANGULARDOWN: Top angular down discharge. \X2\000A\X0\DOWNBLAST: Downblast discharge. \X2\000A\X0\BOTTOMANGULARDOWN: Bottom angular down discharge. \X2\000A\X0\BOTTOMHORIZONTAL: Bottom horizontal discharge. \X2\000A\X0\BOTTOMANGULARUP: Bottom angular up discharge. \X2\000A\X0\UPBLAST: Upblast discharge. \X2\000A\X0\TOPANGULARUP: Top angular up discharge. \X2\000A\X0\OTHER: Other type of fan arrangement.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1963,$,$,$,.READWRITE.); #1963=IFCPROPERTYENUMERATION('PEnum_CentrifugalFanDischargePosition',(IFCLABEL('TOPHORIZONTAL'),IFCLABEL('TOPANGULARDOWN'),IFCLABEL('TOPANGULARUP'),IFCLABEL('DOWNBLAST'),IFCLABEL('BOTTOMANGULARDOWN'),IFCLABEL('BOTTOMHORIZONTAL'),IFCLABEL('BOTTOMANGULARUP'),IFCLABEL('UPBLAST'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1964=IFCSIMPLEPROPERTYTEMPLATE('3a9gJOikr7xwhXaS41k6eh',$,'DirectionOfRotation','The direction of the centrifugal fan wheel rotation when viewed from the drive side of the fan:\X2\000A\X0\CLOCKWISE: Clockwise. \X2\000A\X0\COUNTERCLOCKWISE: Counter-clockwise. \X2\000A\X0\OTHER: Other type of fan rotation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1965,$,$,$,.READWRITE.); #1965=IFCPROPERTYENUMERATION('PEnum_CentrifugalFanRotation',(IFCLABEL('CLOCKWISE'),IFCLABEL('COUNTERCLOCKWISE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1966=IFCSIMPLEPROPERTYTEMPLATE('0Gs9O6WVb5xObCoxP6GcCp',$,'Arrangement','Defines the fan and motor drive arrangement as defined by AMCA:\X2\000A\X0\ARRANGEMENT1: Arrangement 1. \X2\000A\X0\ARRANGEMENT2: Arrangement 2. \X2\000A\X0\ARRANGEMENT3: Arrangement 3. \X2\000A\X0\ARRANGEMENT4: Arrangement 4. \X2\000A\X0\ARRANGEMENT7: Arrangement 7. \X2\000A\X0\ARRANGEMENT8: Arrangement 8. \X2\000A\X0\ARRANGEMENT9: Arrangement 9. \X2\000A\X0\ARRANGEMENT10: Arrangement 10. \X2\000A\X0\OTHER: Other type of fan drive arrangement.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1967,$,$,$,.READWRITE.); #1967=IFCPROPERTYENUMERATION('PEnum_CentrifugalFanArrangement',(IFCLABEL('ARRANGEMENT1'),IFCLABEL('ARRANGEMENT2'),IFCLABEL('ARRANGEMENT3'),IFCLABEL('ARRANGEMENT4'),IFCLABEL('ARRANGEMENT7'),IFCLABEL('ARRANGEMENT8'),IFCLABEL('ARRANGEMENT9'),IFCLABEL('ARRANGEMENT10'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1968=IFCPROPERTYSETTEMPLATE('0ZZlkGAHjAnui97HQgNENm',$,'Pset_FlowMovingDevicePump','Definition from IAI: Pump occurrence attributes attached to an instance of IfcFlowMovingDevice.\X2\000A\X0\',$,'IfcFlowMovingDevice',(#1969,#1970,#1972)); +#1968=IFCPROPERTYSETTEMPLATE('0ZZlkGAHjAnui97HQgNENm',$,'Pset_FlowMovingDevicePump','Definition from IAI: Pump occurrence attributes attached to an instance of IfcFlowMovingDevice.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowMovingDevice',(#1969,#1970,#1972)); #1969=IFCSIMPLEPROPERTYTEMPLATE('1HkOMPlC1708HC6cVr9kiX',$,'ImpellerDiameter','Diameter of pump impeller - used to scale performance of geometrically similar pumps.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1970=IFCSIMPLEPROPERTYTEMPLATE('3F6LliK$536el6T7LtM72h',$,'BaseType','Defines general types of pump bases:\X2\000A\X0\FRAME: Frame. \X2\000A\X0\BASE: Base. \X2\000A\X0\NONE: There is no pump base, such as an inline pump. \X2\000A\X0\OTHER: Other type of pump base. ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1971,$,$,$,.READWRITE.); #1971=IFCPROPERTYENUMERATION('PEnum_PumpBaseType',(IFCLABEL('FRAME'),IFCLABEL('BASE'),IFCLABEL('NONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1972=IFCSIMPLEPROPERTYTEMPLATE('0foTg4Ctn4teU9c0xKLSF2',$,'DriveConnectionType','The way the pump drive mechanism is connected to the pump:\X2\000A\X0\DIRECTDRIVE: Direct drive. \X2\000A\X0\BELTDRIVE: Belt drive. \X2\000A\X0\COUPLING: Coupling. \X2\000A\X0\OTHER: Other type of drive connection. \X2\000A\X0\',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1973,$,$,$,.READWRITE.); #1973=IFCPROPERTYENUMERATION('PEnum_PumpDriveConnectionType',(IFCLABEL('DIRECTDRIVE'),IFCLABEL('BELTDRIVE'),IFCLABEL('COUPLING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1974=IFCPROPERTYSETTEMPLATE('2JKBWSyqj9JeBYkk7Nmr8w',$,'Pset_FlowSegmentDuctSegment','Definition from IAI: Duct segment occurrence attributes attached to an instance of IfcFlowSegment.\X2\000A\X0\',$,'IfcFlowSegment',(#1975,#1976,#1977,#1978,#1979)); +#1974=IFCPROPERTYSETTEMPLATE('2JKBWSyqj9JeBYkk7Nmr8w',$,'Pset_FlowSegmentDuctSegment','Definition from IAI: Duct segment occurrence attributes attached to an instance of IfcFlowSegment.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowSegment',(#1975,#1976,#1977,#1978,#1979)); #1975=IFCSIMPLEPROPERTYTEMPLATE('0LrnOUBaP0MPrGpu4dZmbD',$,'MaterialThickness','The thickness of the duct fitting material.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1976=IFCSIMPLEPROPERTYTEMPLATE('0$ih_wBhP9KwkQfIEYGyg3',$,'InteriorRoughnessCoefficient','The interior roughness of the duct fitting material.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1977=IFCSIMPLEPROPERTYTEMPLATE('04WGIYojX3PBNm_3XkFtFx',$,'HasLiner','TRUE if the fitting has interior duct insulating lining, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1978=IFCSIMPLEPROPERTYTEMPLATE('33njBxg0v49f$ZmFQJhPH9',$,'Length','Length of the duct segment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1979=IFCSIMPLEPROPERTYTEMPLATE('2yUmO2hjj1i8R5G__MWBn0',$,'Color','The color of the duct segment.\X2\000A000A\X0\Note: This is typically used for any duct segments with a painted surface which is not otherwise specified as a covering.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1980=IFCPROPERTYSETTEMPLATE('0d3n2iAcbCoh3PToMsgY7G',$,'Pset_FlowSegmentPipeSegment','Definition from IAI: Pipe segment occurrence attributes attached to an instance of IfcFlowSegment.\X2\000A\X0\',$,'IfcFlowSegment',(#1981,#1982,#1983,#1984,#1985)); +#1980=IFCPROPERTYSETTEMPLATE('0d3n2iAcbCoh3PToMsgY7G',$,'Pset_FlowSegmentPipeSegment','Definition from IAI: Pipe segment occurrence attributes attached to an instance of IfcFlowSegment.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowSegment',(#1981,#1982,#1983,#1984,#1985)); #1981=IFCSIMPLEPROPERTYTEMPLATE('3jef5qqkv5cAnF0kBYq6xZ',$,'InteriorRoughnessCoefficient','The interior roughness coefficient of the pipe segment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1982=IFCSIMPLEPROPERTYTEMPLATE('3YOVxxtmH6EOcPi9UaEZlu',$,'Length','Length of the pipe segment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #1983=IFCSIMPLEPROPERTYTEMPLATE('1kjUThWkr7efdxIHPDhwsK',$,'Color','The color of the pipe segment.\X2\000A000A\X0\Note: This is typically used only for plastic pipe segments. However, it may be used for any pipe segments with a painted surface which is not otherwise specified as a covering.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #1984=IFCSIMPLEPROPERTYTEMPLATE('2A2DNcrdb32BwuTqINISiu',$,'Gradient','The gradient of the pipe segment.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #1985=IFCSIMPLEPROPERTYTEMPLATE('2Y$m6tlurBw8vK2voDVEyV',$,'InvertElevation','The invert elevation relative to the datum established for the project.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1986=IFCPROPERTYSETTEMPLATE('06AoYHS8v9zAK986qPg2GM',$,'Pset_FlowStorageDeviceTank','Definition from IAI: Properties that relate to an instance of a flow storage device that is typed as a tank. Note that a partial tank may be considered as a compartment within a compartmentalized tank.',$,'IfcFlowStorageDevice',(#1987,#1989,#1990)); +#1986=IFCPROPERTYSETTEMPLATE('06AoYHS8v9zAK986qPg2GM',$,'Pset_FlowStorageDeviceTank','Definition from IAI: Properties that relate to an instance of a flow storage device that is typed as a tank. Note that a partial tank may be considered as a compartment within a compartmentalized tank.',.PSET_OCCURRENCEDRIVEN.,'IfcFlowStorageDevice',(#1987,#1989,#1990)); #1987=IFCSIMPLEPROPERTYTEMPLATE('0jMi0$LhXE5f75x4qBTVC3',$,'TankComposition','Defines the level of element composition where:\X2\000A000A\X0\COMPLEX = A set of elementary units aggregated together to fulfill the overall required purpose.\X2\000A\X0\ELEMENT = A single elementary unit that may exist of itself or as an aggregation of partial units..\X2\000A\X0\PARTIAL ',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1988,$,$,$,.READWRITE.); #1988=IFCPROPERTYENUMERATION('PEnum_TankComposition',(IFCLABEL('COMPLEX'),IFCLABEL('ELEMENT'),IFCLABEL('PARTIAL'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1989=IFCSIMPLEPROPERTYTEMPLATE('3DLleIYPT0MQqOZLv7yyXR',$,'HasLadder','Indication of whether the tank is provided with a ladder (set TRUE) for access to the top. If no ladder is provided then value is set FALSE.\X2\000A000A\X0\Note: No indication is given of the type of ladder (gooseneck etc.)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #1990=IFCSIMPLEPROPERTYTEMPLATE('1NmHi3MH97cBhcbCiE5VRj',$,'HasVisualIndicator','Indication of whether the tank is provided with a visual indicator (set TRUE) that shows the water level in the tank. If no visual indicator is provided then value is set FALSE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1991=IFCPROPERTYSETTEMPLATE('0Wv7EI9zL7PRsGmSQAxzAN',$,'Pset_FlowTerminalAirTerminal','Definition from IAI: Air terminal occurrence attributes attached to an instance of IfcFlowTerminal.\X2\000A\X0\',$,'IfcFlowTerminal',(#1992,#1994)); +#1991=IFCPROPERTYSETTEMPLATE('0Wv7EI9zL7PRsGmSQAxzAN',$,'Pset_FlowTerminalAirTerminal','Definition from IAI: Air terminal occurrence attributes attached to an instance of IfcFlowTerminal.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcFlowTerminal',(#1992,#1994)); #1992=IFCSIMPLEPROPERTYTEMPLATE('0OvVTGji96HQD2JBty5mb4',$,'AirflowType','Enumeration defining the functional type of air flow through the terminal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1993,$,$,$,.READWRITE.); #1993=IFCPROPERTYENUMERATION('PEnum_AirTerminalAirflowType',(IFCLABEL('SUPPLYAIR'),IFCLABEL('RETURNAIR'),IFCLABEL('EXHAUSTAIR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #1994=IFCSIMPLEPROPERTYTEMPLATE('3RNK4Rpy12RQusLEUr8KJi',$,'Location','Location (a single type of diffuser can be used for multiple locations); high means close to ceiling.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1995,$,$,$,.READWRITE.); #1995=IFCPROPERTYENUMERATION('PEnum_AirTerminalLocation',(IFCLABEL('SIDEWALLHIGH'),IFCLABEL('SIDEWALLLOW'),IFCLABEL('CEILINGPERIMETER'),IFCLABEL('CEILINGINTERIOR'),IFCLABEL('FLOOR'),IFCLABEL('SILL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1996=IFCPROPERTYSETTEMPLATE('1ks_9ZJtPDqu_pxhqG0bhu',$,'Pset_OutsideDesignCriteria','Definition from IAI: Outside air conditions used as the basis for calculating thermal loads at peak conditions, as well as the weather data location from which these conditions were obtained. HISTORY: New property set in IFC Release 1.0.',$,'IfcBuilding',(#1997,#1998,#1999,#2000,#2001,#2002,#2003,#2004,#2005,#2007,#2008)); +#1996=IFCPROPERTYSETTEMPLATE('1ks_9ZJtPDqu_pxhqG0bhu',$,'Pset_OutsideDesignCriteria','Definition from IAI: Outside air conditions used as the basis for calculating thermal loads at peak conditions, as well as the weather data location from which these conditions were obtained. HISTORY: New property set in IFC Release 1.0.',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#1997,#1998,#1999,#2000,#2001,#2002,#2003,#2004,#2005,#2007,#2008)); #1997=IFCSIMPLEPROPERTYTEMPLATE('2I7ZS$q3bEiBlgIg6sfSH6',$,'HeatingDryBulb','Outside dry bulb temperature for heating design ',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #1998=IFCSIMPLEPROPERTYTEMPLATE('0TQYxsydz5nOR9hmygFtv3',$,'HeatingWetBulb','Outside wet bulb temperature for heating design ',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); #1999=IFCSIMPLEPROPERTYTEMPLATE('1jtjwJzJzCIAgEsGMusllA',$,'HeatingDesignDay','The month, day and time that has been selected for the heating design calculations.',.P_REFERENCEVALUE.,'IfcCalendarDate ',$,$,$,$,$,.READWRITE.); @@ -2013,7 +2013,7 @@ DATA; #2006=IFCPROPERTYENUMERATION('PEnum_BuildingThermalExposure',(IFCLABEL('LIGHT'),IFCLABEL('MEDIUM'),IFCLABEL('HEAVY'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #2007=IFCSIMPLEPROPERTYTEMPLATE('1$YwY03fX69uE1qrYw79Gu',$,'PrevailingWindDirection','The prevailing wind angle direction measured from True North (0 degrees) in a clockwise direction.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); #2008=IFCSIMPLEPROPERTYTEMPLATE('3by_m5S4XF4wSA3CuPbOQR',$,'PrevailingWindVelocity','The design wind velocity coming from the direction specified by the PrevailingWindDirection attribute.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#2009=IFCPROPERTYSETTEMPLATE('09LxBOR6r5qA0cTVmpWNAL',$,'Pset_SpaceThermalDesign','Definition from IAI: Space or zone HVAC design requirements. HISTORY: New property set in IFC Release 1.0 (Pset_SpaceHvacInformation); renamed to Pset_SpaceThermalDesign and revised in IFC2x2.',$,'IfcSpace',(#2010,#2011,#2012,#2013,#2014,#2015,#2016,#2017,#2018,#2019,#2020,#2021,#2022)); +#2009=IFCPROPERTYSETTEMPLATE('09LxBOR6r5qA0cTVmpWNAL',$,'Pset_SpaceThermalDesign','Definition from IAI: Space or zone HVAC design requirements. HISTORY: New property set in IFC Release 1.0 (Pset_SpaceHvacInformation); renamed to Pset_SpaceThermalDesign and revised in IFC2x2.',.PSET_OCCURRENCEDRIVEN.,'IfcSpace',(#2010,#2011,#2012,#2013,#2014,#2015,#2016,#2017,#2018,#2019,#2020,#2021,#2022)); #2010=IFCSIMPLEPROPERTYTEMPLATE('1vZ7YuLKfCYQh5$DiaRn4x',$,'CoolingDesignAirflow','The air flowrate required during the peak cooling conditions. ',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #2011=IFCSIMPLEPROPERTYTEMPLATE('2NeARTpO54BQG9kXkFk_6G',$,'HeatingDesignAirflow','The air flowrate required during the peak heating conditions, but could also be determined by minimum ventilation requirement or minimum air change requirements. ',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #2012=IFCSIMPLEPROPERTYTEMPLATE('0AGvngsCf5NvuRWny7VEtZ',$,'TotalSensibleHeatGain','The total sensible heat or energy gained by the space during the peak cooling conditions. ',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); @@ -2027,7 +2027,7 @@ DATA; #2020=IFCSIMPLEPROPERTYTEMPLATE('0Ue7emsmP5s9CLS0tLBYcg',$,'ExhaustAirFlowrate','Design exhaust air flow rate for the space. ',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #2021=IFCSIMPLEPROPERTYTEMPLATE('0O4DxFDc1ErfqGb59qtSZ9',$,'CeilingRAPlenum','Ceiling plenum used for return air or not. TRUE = Yes, FALSE = No. ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #2022=IFCSIMPLEPROPERTYTEMPLATE('2Wfz8hhnr3OuQB52Yc3SOj',$,'BoundaryAreaHeatLoss','Heat loss per unit area for the boundary object. This is a design input value for use in the absence of calculated load data. ',.P_SINGLEVALUE.,'IfcHeatFluxDensityMeasure',$,$,$,$,$,.READWRITE.); -#2023=IFCPROPERTYSETTEMPLATE('3ZSg9wSuzEI8wJEN29iKt0',$,'Pset_ThermalLoadAggregate','Definition from IAI: The aggregated thermal loads experienced by one or many spaces, zones, or buildings. This aggregate thermal load information is typically addressed by a system or plant. HISTORY: New property set in IFC Release 1.0 (Pset_AggregateLoadInformation); renamed Pset_ThermalLoadAggregate in IFC2x2.',$,'IfcZone,IfcSpatialStructureElement,IfcSystem',(#2024,#2025,#2026,#2027,#2028,#2029,#2030)); +#2023=IFCPROPERTYSETTEMPLATE('3ZSg9wSuzEI8wJEN29iKt0',$,'Pset_ThermalLoadAggregate','Definition from IAI: The aggregated thermal loads experienced by one or many spaces, zones, or buildings. This aggregate thermal load information is typically addressed by a system or plant. HISTORY: New property set in IFC Release 1.0 (Pset_AggregateLoadInformation); renamed Pset_ThermalLoadAggregate in IFC2x2.',.PSET_OCCURRENCEDRIVEN.,'IfcZone,IfcSpatialStructureElement,IfcSystem',(#2024,#2025,#2026,#2027,#2028,#2029,#2030)); #2024=IFCSIMPLEPROPERTYTEMPLATE('2W48JlEDXDJB3ampZwis9s',$,'TotalCoolingLoad','The peak total cooling load for the building, zone or space.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #2025=IFCSIMPLEPROPERTYTEMPLATE('2tKqkNEXD0uh0tAPH13Ov3',$,'TotalHeatingLoad','The peak total heating load for the building, zone or space.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); #2026=IFCSIMPLEPROPERTYTEMPLATE('0WVmHA6Wb2cxqpA5k6EbSk',$,'LightingDiversity','Lighting diversity. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); @@ -2035,108 +2035,108 @@ DATA; #2028=IFCSIMPLEPROPERTYTEMPLATE('26KznqRUb0$u9IsjoRzPpE',$,'InfiltrationDiversityWinter','Diversity factor for Winter infiltration. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #2029=IFCSIMPLEPROPERTYTEMPLATE('1W$9arbfT3vv3hGVuIexxU',$,'ApplianceDiversity','Diversity of appliance load. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #2030=IFCSIMPLEPROPERTYTEMPLATE('2icqwUO6n1x9$p12jg623j',$,'LoadSafetyFactor','Load safety factor. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2031=IFCPROPERTYSETTEMPLATE('0V9L$LtZb8wf230oKiUBpX',$,'Pset_ThermalLoadDesignCriteria','Definition from IAI: Building thermal load design data that are used for calculating thermal loads in a space or building. HISTORY: New property set in IFC Release 1.0 (Pset_LoadDesignCriteria); renamed Pset_ThermalLoadDesignCriteria in IFC2x2.',$,'IfcSpatialStructureElement,IfcSystem,IfcBuilding,IfcZone',(#2032,#2033,#2034,#2035,#2036,#2037)); +#2031=IFCPROPERTYSETTEMPLATE('0V9L$LtZb8wf230oKiUBpX',$,'Pset_ThermalLoadDesignCriteria','Definition from IAI: Building thermal load design data that are used for calculating thermal loads in a space or building. HISTORY: New property set in IFC Release 1.0 (Pset_LoadDesignCriteria); renamed Pset_ThermalLoadDesignCriteria in IFC2x2.',.PSET_OCCURRENCEDRIVEN.,'IfcSpatialStructureElement,IfcSystem,IfcBuilding,IfcZone',(#2032,#2033,#2034,#2035,#2036,#2037)); #2032=IFCSIMPLEPROPERTYTEMPLATE('3aWRAjtWzBhALtZqFOxgXQ',$,'OccupancyDiversity','Diversity factor that may be applied to the number of people in the space. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #2033=IFCSIMPLEPROPERTYTEMPLATE('3wZsNp6C1B6PzGEg3UOOBH',$,'OutsideAirPerPerson','Design quantity of outside air to be provided per person in the space. ',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); #2034=IFCSIMPLEPROPERTYTEMPLATE('20vGTdB95BBO_cS5fx4JUd',$,'ReceptacleLoadIntensity','Average power use intensity of appliances and other non-HVAC equipment.in the space per unit area.(PowerMeasure/IfcAreaMeasure) ',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #2035=IFCSIMPLEPROPERTYTEMPLATE('2oI_dEzCf4ZhJZho5axNKk',$,'AppliancePercentLoadToRadiant','Percent of sensible load to radiant heat. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); #2036=IFCSIMPLEPROPERTYTEMPLATE('3pV7ClAvn7exzyZWT6$xtH',$,'LightingLoadIntensity','Average lighting load intensity in the space per unit area (PowerMeasure/IfcAreaMeasure) ',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); #2037=IFCSIMPLEPROPERTYTEMPLATE('3DW8quxe5DRfgVWxgEC2FM',$,'LightingPercentLoadToReturnAir','Percent of lighting load to the return air plenum. ',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2038=IFCPROPERTYSETTEMPLATE('0dcBdiGlH2_O1RjnSctlXo',$,'Pset_UtilityConsumption','Definition from IAI: Consumption of utility resources, typically applied to the IfcBuilding instance, used to identify how much was consumed on I.e., a monthly basis.',$,'IfcBuilding',(#2039,#2040,#2041,#2042,#2043)); +#2038=IFCPROPERTYSETTEMPLATE('0dcBdiGlH2_O1RjnSctlXo',$,'Pset_UtilityConsumption','Definition from IAI: Consumption of utility resources, typically applied to the IfcBuilding instance, used to identify how much was consumed on I.e., a monthly basis.',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#2039,#2040,#2041,#2042,#2043)); #2039=IFCSIMPLEPROPERTYTEMPLATE('2KnBzf$vb2t8d0kwYNdlfN',$,'Heat','The amount of heat energy consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCENERGYMEASURE',$,$,$,$,.READWRITE.); #2040=IFCSIMPLEPROPERTYTEMPLATE('0LRzumNw58xxtD8xi7XbRN',$,'Electricity','The amount of electricity consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCENERGYMEASURE',$,$,$,$,.READWRITE.); #2041=IFCSIMPLEPROPERTYTEMPLATE('1cpP39HFv2eRGSobuYAlw3',$,'Water','The amount of water consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMEMEASURE',$,$,$,$,.READWRITE.); #2042=IFCSIMPLEPROPERTYTEMPLATE('0$buezmPvAww9kCkid79Ej',$,'Fuel','The amount of fuel consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCVOLUMEMEASURE',$,$,$,$,.READWRITE.); #2043=IFCSIMPLEPROPERTYTEMPLATE('2gj6BClN96tB8MapeKsEAU',$,'Steam','The amount of steam consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries','IFCMASSMEASURE',$,$,$,$,.READWRITE.); -#2044=IFCPROPERTYSETTEMPLATE('0c2h_6VA93zA_LJnQgP5SD',$,'Pset_DiscreteAccessoryAnchorBolt','Definition from IAI: Properties common to different types of anchor bolts.',$,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2045,#2046,#2047,#2048)); +#2044=IFCPROPERTYSETTEMPLATE('0c2h_6VA93zA_LJnQgP5SD',$,'Pset_DiscreteAccessoryAnchorBolt','Definition from IAI: Properties common to different types of anchor bolts.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2045,#2046,#2047,#2048)); #2045=IFCSIMPLEPROPERTYTEMPLATE('10qWOatsnBvvOrtIrbimuN',$,'AnchorBoltLength','The length of the anchor bolt.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2046=IFCSIMPLEPROPERTYTEMPLATE('2xMXujarT4dxCjbgKh6xPL',$,'AnchorBoltDiameter','The nominal diameter of the anchor bolt bar(s).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2047=IFCSIMPLEPROPERTYTEMPLATE('3sw093K6r9$elzaba3sbto',$,'AnchorBoltThreadLength','The length of the threaded part of the anchor bolt.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2048=IFCSIMPLEPROPERTYTEMPLATE('1WlVyK1XPDigfsAqMpEVxv',$,'AnchorBoltProtrusionLength','The length of the protruding part of the anchor bolt.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2049=IFCPROPERTYSETTEMPLATE('0noaFegLL82QTMelMrkp0P',$,'Pset_DiscreteAccessoryColumnShoe','Definition from IAI: Shape properties common to column shoes.',$,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2050,#2051,#2052,#2053,#2054,#2055)); +#2049=IFCPROPERTYSETTEMPLATE('0noaFegLL82QTMelMrkp0P',$,'Pset_DiscreteAccessoryColumnShoe','Definition from IAI: Shape properties common to column shoes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2050,#2051,#2052,#2053,#2054,#2055)); #2050=IFCSIMPLEPROPERTYTEMPLATE('3hd4udRWrANgGi9GHiEEpe',$,'ColumnShoeBasePlateThickness','The thickness of the column shoe base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2051=IFCSIMPLEPROPERTYTEMPLATE('0vNa4m0O98KA8zhI0DmL_L',$,'ColumnShoeBasePlateWidth','The width of the column shoe base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2052=IFCSIMPLEPROPERTYTEMPLATE('37ddinr89Cwh2n1wdKbPS5',$,'ColumnShoeBasePlateDepth','The depth of the column shoe base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2053=IFCSIMPLEPROPERTYTEMPLATE('0JOO7wWlD21feC61nV58UO',$,'ColumnShoeCasingHeight','The height of the column shoe casing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2054=IFCSIMPLEPROPERTYTEMPLATE('1VNBZHVjzFYg9sH4i71KSi',$,'ColumnShoeCasingWidth','The width of the column shoe casing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2055=IFCSIMPLEPROPERTYTEMPLATE('0C3nu3ZmPBVP9kesU9cboD',$,'ColumnShoeCasingDepth','The depth of the column shoe casing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2056=IFCPROPERTYSETTEMPLATE('3ogOXlhCLDB8XttAqdIWfd',$,'Pset_DiscreteAccessoryCornerFixingPlate','Definition from IAI: Properties specific to corner fixing plates.',$,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2057,#2058,#2059,#2060)); +#2056=IFCPROPERTYSETTEMPLATE('3ogOXlhCLDB8XttAqdIWfd',$,'Pset_DiscreteAccessoryCornerFixingPlate','Definition from IAI: Properties specific to corner fixing plates.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2057,#2058,#2059,#2060)); #2057=IFCSIMPLEPROPERTYTEMPLATE('0kgG_8UsD3guHLTX2PNsBU',$,'CornerFixingPlateLength','The length of the L-shaped corner plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2058=IFCSIMPLEPROPERTYTEMPLATE('1Q0Rusg1b5HviqwfzHDWZ7',$,'CornerFixingPlateThickness','The thickness of the L-shaped corner plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2059=IFCSIMPLEPROPERTYTEMPLATE('2OFVs$rC16FOpDdU3OlGUe',$,'CornerFixingPlateFlangeWidthInPlaneZ','The flange width of the L-shaped corner plate in plane Z.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2060=IFCSIMPLEPROPERTYTEMPLATE('3IAcUOEJ15svaWC6Zt3L9x',$,'CornerFixingPlateFlangeWidthInPlaneX','The flange width of the L-shaped corner plate in plane X.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2061=IFCPROPERTYSETTEMPLATE('2OQMrQ6J96YfVD0Ll9fcRQ',$,'Pset_DiscreteAccessoryDiagonalTrussConnector','Definition from IAI: Shape properties specific to connecting accessories in truss form with diagonal cross-bars.',$,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2062,#2063,#2064,#2065,#2066,#2067)); +#2061=IFCPROPERTYSETTEMPLATE('2OQMrQ6J96YfVD0Ll9fcRQ',$,'Pset_DiscreteAccessoryDiagonalTrussConnector','Definition from IAI: Shape properties specific to connecting accessories in truss form with diagonal cross-bars.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2062,#2063,#2064,#2065,#2066,#2067)); #2062=IFCSIMPLEPROPERTYTEMPLATE('1H_vpAKxHEQvUK09CsieRV',$,'DiagonalTrussHeight','The overall height of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2063=IFCSIMPLEPROPERTYTEMPLATE('1jjL4n_G93fOkPyK6CRyWM',$,'DiagonalTrussLength','The overall length of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2064=IFCSIMPLEPROPERTYTEMPLATE('06t7z6Mk17w9_uRbfMUM0h',$,'DiagonalTrussCrossBarSpacing','The spacing between diagonal cross-bar sections.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2065=IFCSIMPLEPROPERTYTEMPLATE('1_vh6DOZn2nfbJTcYlexYU',$,'DiagonalTrussBaseBarDiameter','The nominal diameter of the base bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2066=IFCSIMPLEPROPERTYTEMPLATE('07c_VjtMP1Wxekhrv3qalv',$,'DiagonalTrussSecondaryBarDiameter','The nominal diameter of the secondary bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2067=IFCSIMPLEPROPERTYTEMPLATE('32$gVWC1X7TwUatxrWaz6H',$,'DiagonalTrussCrossBarDiameter','The nominal diameter of the diagonal cross-bars.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2068=IFCPROPERTYSETTEMPLATE('1B1Sdsg2n3ivYHBddMHFac',$,'Pset_DiscreteAccessoryEdgeFixingPlate','Definition from IAI: Properties specific to edge fixing plates.',$,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2069,#2070,#2071,#2072)); +#2068=IFCPROPERTYSETTEMPLATE('1B1Sdsg2n3ivYHBddMHFac',$,'Pset_DiscreteAccessoryEdgeFixingPlate','Definition from IAI: Properties specific to edge fixing plates.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2069,#2070,#2071,#2072)); #2069=IFCSIMPLEPROPERTYTEMPLATE('1I84h0XzfDR83iEm5Pzt0M',$,'EdgeFixingPlateLength','The length of the L-shaped edge plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2070=IFCSIMPLEPROPERTYTEMPLATE('2pzFhDjUj5vBio5y08E6se',$,'EdgeFixingPlateThickness','The thickness of the L-shaped edge plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2071=IFCSIMPLEPROPERTYTEMPLATE('2nFW0ZwZ51wvNOJD2xKz4x',$,'EdgeFixingPlateFlangeWidthInPlaneZ','The flange width of the L-shaped edge plate in plane Z.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2072=IFCSIMPLEPROPERTYTEMPLATE('1TnuYzlAjAyvXFwDmDTNW_',$,'EdgeFixingPlateFlangeWidthInPlaneX','The flange width of the L-shaped edge plate in plane X.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2073=IFCPROPERTYSETTEMPLATE('3_YuylJh5ESwtV0_fKefWz',$,'Pset_DiscreteAccessoryFixingSocket','Definition from IAI: Properties common to fixing sockets.',$,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2074,#2075,#2076,#2077)); +#2073=IFCPROPERTYSETTEMPLATE('3_YuylJh5ESwtV0_fKefWz',$,'Pset_DiscreteAccessoryFixingSocket','Definition from IAI: Properties common to fixing sockets.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2074,#2075,#2076,#2077)); #2074=IFCSIMPLEPROPERTYTEMPLATE('1tJtNjYYjAlQqbKVf8g8LM',$,'FixingSocketTypeReference','Type reference for the fixing socket according to local standards. ',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); #2075=IFCSIMPLEPROPERTYTEMPLATE('17NkuJ1QH9CuHxrNpVTaRo',$,'FixingSocketHeight','The overall height of the fixing socket.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2076=IFCSIMPLEPROPERTYTEMPLATE('3UrCzCbCzB3BYJ7yRERWMh',$,'FixingSocketThreadDiameter','The nominal diameter of the thread.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2077=IFCSIMPLEPROPERTYTEMPLATE('3AlzNe6PXBEQrAyTRcNwbg',$,'FixingSocketThreadLength','The length of the threaded part of the fixing socket.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2078=IFCPROPERTYSETTEMPLATE('3nBXRQu3bEKxPHOloofbla',$,'Pset_DiscreteAccessoryLadderTrussConnector','Definition from IAI: Shape properties specific to connecting accessories in truss form with straight cross-bars in ladder shape.',$,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2079,#2080,#2081,#2082,#2083,#2084)); +#2078=IFCPROPERTYSETTEMPLATE('3nBXRQu3bEKxPHOloofbla',$,'Pset_DiscreteAccessoryLadderTrussConnector','Definition from IAI: Shape properties specific to connecting accessories in truss form with straight cross-bars in ladder shape.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2079,#2080,#2081,#2082,#2083,#2084)); #2079=IFCSIMPLEPROPERTYTEMPLATE('1whN_0Bpv8qw35dLgsCeCB',$,'LadderTrussHeight','The overall height of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2080=IFCSIMPLEPROPERTYTEMPLATE('2ByXbUzmj3F8RUhntpJDnM',$,'LadderTrussLength','The overall length of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2081=IFCSIMPLEPROPERTYTEMPLATE('2$5MAY0cjBax_Nm6AixWHI',$,'LadderTrussCrossBarSpacing','The spacing between the straight cross-bars.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2082=IFCSIMPLEPROPERTYTEMPLATE('2UnwqT_L90a8nrLEyMpwfK',$,'LadderTrussBaseBarDiameter','The nominal diameter of the base bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2083=IFCSIMPLEPROPERTYTEMPLATE('29pgFeQCb77fd9ck38BhL3',$,'LadderTrussSecondaryBarDiameter','The nominal diameter of the secondary bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2084=IFCSIMPLEPROPERTYTEMPLATE('1jSi9ujTbBHOY4FbaLEwkO',$,'LadderTrussCrossBarDiameter','The nominal diameter of the straight cross-bars.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2085=IFCPROPERTYSETTEMPLATE('1xJfM$FcXEw912aY0Lx9nL',$,'Pset_DiscreteAccessoryStandardFixingPlate','Definition from IAI: Properties specific to standard fixing plates.',$,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2086,#2087,#2088)); +#2085=IFCPROPERTYSETTEMPLATE('1xJfM$FcXEw912aY0Lx9nL',$,'Pset_DiscreteAccessoryStandardFixingPlate','Definition from IAI: Properties specific to standard fixing plates.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2086,#2087,#2088)); #2086=IFCSIMPLEPROPERTYTEMPLATE('0HqxKb_$H7xuRj7Qec8Kya',$,'StandardFixingPlateWidth','The width of the standard fixing plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2087=IFCSIMPLEPROPERTYTEMPLATE('2U4Wtvb995OPjXPSKWLsZu',$,'StandardFixingPlateDepth','The depth of the standard fixing plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2088=IFCSIMPLEPROPERTYTEMPLATE('2atUqWSsD4nOFqHDYj2yto',$,'StandardFixingPlateThickness','The thickness of the standard fixing plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2089=IFCPROPERTYSETTEMPLATE('2bgvBFI3T0avGd50guKVmU',$,'Pset_DiscreteAccessoryWireLoop','Definition from IAI: Shape properties common to wire loop joint connectors.',$,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2090,#2091,#2092,#2093,#2094,#2095)); +#2089=IFCPROPERTYSETTEMPLATE('2bgvBFI3T0avGd50guKVmU',$,'Pset_DiscreteAccessoryWireLoop','Definition from IAI: Shape properties common to wire loop joint connectors.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#2090,#2091,#2092,#2093,#2094,#2095)); #2090=IFCSIMPLEPROPERTYTEMPLATE('3qN9DqGGfCEvj5LKeQask$',$,'WireLoopBasePlateThickness','The thickness of the base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2091=IFCSIMPLEPROPERTYTEMPLATE('1wFKMcc0nCxRQZGnZ4gPlD',$,'WireLoopBasePlateWidth','The width of the base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2092=IFCSIMPLEPROPERTYTEMPLATE('3fM5oN5ub5mAllMBEIPcMo',$,'WireLoopBasePlateLength','The length of the base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2093=IFCSIMPLEPROPERTYTEMPLATE('3$CmhCawT5beUqCqN_2xkD',$,'WireDiameter','The nominal diameter of the wire.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2094=IFCSIMPLEPROPERTYTEMPLATE('0bvvCKpr53RwKn2fuugNcz',$,'WireEmbeddingLength','The length of the part of wire which is embedded in the precast concrete element.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2095=IFCSIMPLEPROPERTYTEMPLATE('0eDQdZWQD2Dg8fO_qZIDSi',$,'WireLoopLength','The length of the fastening loop part of the wire.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2096=IFCPROPERTYSETTEMPLATE('2pEzbJ7R55VRALRuoJCPVf',$,'Pset_Asset','Definition from IAI: An asset is a uniquely identifiable element which has a financial value and against which maintenance actions are recorded. \X2\000A\X0\',$,'IfcAsset',(#2097,#2099,#2101)); +#2096=IFCPROPERTYSETTEMPLATE('2pEzbJ7R55VRALRuoJCPVf',$,'Pset_Asset','Definition from IAI: An asset is a uniquely identifiable element which has a financial value and against which maintenance actions are recorded. \X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcAsset',(#2097,#2099,#2101)); #2097=IFCSIMPLEPROPERTYTEMPLATE('0Acd4FBJX7GusPTnPO9ELX',$,'AssetAccountingType','Identifies the predefined types of risk from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2098,$,$,$,.READWRITE.); #2098=IFCPROPERTYENUMERATION('PEnum_AssetAccountingType',(IFCLABEL('Fixed'),IFCLABEL('NonFixed'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #2099=IFCSIMPLEPROPERTYTEMPLATE('0zSXd4CoLAeAfeRG0XYKf$',$,'AssetTaxType','Identifies the predefined types of taxation group from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2100,$,$,$,.READWRITE.); #2100=IFCPROPERTYENUMERATION('PEnum_AssetTaxType',(IFCLABEL('Capitalised'),IFCLABEL('Expensed'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #2101=IFCSIMPLEPROPERTYTEMPLATE('1gKRZCpoHBDQKQAfiPXidf',$,'AssetInsuranceType','Identifies the predefined types of insurance rating from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2102,$,$,$,.READWRITE.); #2102=IFCPROPERTYENUMERATION('PEnum_AssetInsuranceType',(IFCLABEL('Personal'),IFCLABEL('Real'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); -#2103=IFCPROPERTYSETTEMPLATE('1deyaKZc16vhKBdsMJEG1a',$,'Pset_FurnitureTypeChair','Definition from IAI: A set of specific properties for furniture type chair. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Chair\X2\000A\X0\',$,'IfcFurnitureType',(#2104,#2105,#2106)); +#2103=IFCPROPERTYSETTEMPLATE('1deyaKZc16vhKBdsMJEG1a',$,'Pset_FurnitureTypeChair','Definition from IAI: A set of specific properties for furniture type chair. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Chair\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurnitureType',(#2104,#2105,#2106)); #2104=IFCSIMPLEPROPERTYTEMPLATE('0TQd5OWC97Awy0py8UofTz',$,'SeatingHeight','The value of seating height if the chair height is not adjustable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2105=IFCSIMPLEPROPERTYTEMPLATE('2aNTTA68v6t9A3qxlTgMCA',$,'HighestSeatingHeight','The value of seating height of high level if the chair height is adjustable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2106=IFCSIMPLEPROPERTYTEMPLATE('19Er2ncG9F1fXw5AyukinG',$,'LowestSeatingHeight','The value of seating height of low level if the chair height is adjustable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2107=IFCPROPERTYSETTEMPLATE('2lM3geJVTFcu_wY8s0RqF2',$,'Pset_FurnitureTypeCommon','Definition from IAI: Common properties for all types of furniture such as chair, desk, table, and file cabinet. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FurnitureCommon',$,'IfcFurnitureType',(#2108,#2109,#2110,#2111,#2112,#2113)); +#2107=IFCPROPERTYSETTEMPLATE('2lM3geJVTFcu_wY8s0RqF2',$,'Pset_FurnitureTypeCommon','Definition from IAI: Common properties for all types of furniture such as chair, desk, table, and file cabinet. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FurnitureCommon',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurnitureType',(#2108,#2109,#2110,#2111,#2112,#2113)); #2108=IFCSIMPLEPROPERTYTEMPLATE('1rRUfnx1LF3wuMf9NlTu4v',$,'Description','Specific description of this type of furniture.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2109=IFCSIMPLEPROPERTYTEMPLATE('2FCahIek52xvpeExwNPsY5',$,'Style','Description of the furniture style',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2110=IFCSIMPLEPROPERTYTEMPLATE('2QwZdntyD46BdS5vzHcUqd',$,'NominalHeight','The nominal height of the furniture of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2111=IFCSIMPLEPROPERTYTEMPLATE('3cx9s9p$zAquyn$Fz3FHQV',$,'NominalLength','The nominal length of the furniture of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2112=IFCSIMPLEPROPERTYTEMPLATE('1Fs6KMl_f09gAa8jqkiKNN',$,'NominalDepth','The nominal depth of the furniture of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2113=IFCSIMPLEPROPERTYTEMPLATE('1t3Z1gi_n8aB_TMXvqC3oj',$,'MainColor','The main color of the furniture of this type',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2114=IFCPROPERTYSETTEMPLATE('33q67xmiXClO4_FfwSA7i_',$,'Pset_FurnitureTypeDesk','Definition from IAI: A set of specific properties for furniture type desk. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Desk\X2\000A\X0\',$,'IfcFurnitureType',(#2115)); +#2114=IFCPROPERTYSETTEMPLATE('33q67xmiXClO4_FfwSA7i_',$,'Pset_FurnitureTypeDesk','Definition from IAI: A set of specific properties for furniture type desk. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Desk\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurnitureType',(#2115)); #2115=IFCSIMPLEPROPERTYTEMPLATE('2Syt4bk5D6WPuiSPDLjttZ',$,'WorksurfaceArea','The value of the work surface area of the desk.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#2116=IFCPROPERTYSETTEMPLATE('16eeldrXT0JOYOXbQpWDqH',$,'Pset_FurnitureTypeFileCabinet','Definition from IAI: A set of specific properties for furniture type file cabinet HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FileCabinet\X2\000A\X0\',$,'IfcFurnitureType',(#2117)); +#2116=IFCPROPERTYSETTEMPLATE('16eeldrXT0JOYOXbQpWDqH',$,'Pset_FurnitureTypeFileCabinet','Definition from IAI: A set of specific properties for furniture type file cabinet HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FileCabinet\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurnitureType',(#2117)); #2117=IFCSIMPLEPROPERTYTEMPLATE('1G3mxHK011hvrLO3uBzCzN',$,'WithLock','Indicates whether the file cabinet is lockable (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2118=IFCPROPERTYSETTEMPLATE('1R5LrPTv500gfzqrSAZSUV',$,'Pset_FurnitureTypeTable','A set of specific properties for furniture type table. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Table\X2\000A\X0\',$,'IfcFurnitureType',(#2119,#2120)); +#2118=IFCPROPERTYSETTEMPLATE('1R5LrPTv500gfzqrSAZSUV',$,'Pset_FurnitureTypeTable','A set of specific properties for furniture type table. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Table\X2\000A\X0\',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurnitureType',(#2119,#2120)); #2119=IFCSIMPLEPROPERTYTEMPLATE('1AKzjrXTHD1ebEhVYwC5vS',$,'WorksurfaceArea','The value of the work surface area of the desk..',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #2120=IFCSIMPLEPROPERTYTEMPLATE('1X8S0NyZD2FPoGVeoFg5BC',$,'NumberOfChairs','Maximum number of chairs that can fit with the table for normal use.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2121=IFCPROPERTYSETTEMPLATE('0adTdhptj15Qy5tiqpt5P6',$,'Pset_ManufacturerOccurrence','Definition from IAI: Defines properties of individual instances of manufactured products that may be given by the manufacturer.',$,'IfcElement',(#2122,#2123,#2124,#2125)); +#2121=IFCPROPERTYSETTEMPLATE('0adTdhptj15Qy5tiqpt5P6',$,'Pset_ManufacturerOccurrence','Definition from IAI: Defines properties of individual instances of manufactured products that may be given by the manufacturer.',.PSET_OCCURRENCEDRIVEN.,'IfcElement',(#2122,#2123,#2124,#2125)); #2122=IFCSIMPLEPROPERTYTEMPLATE('3Oay6JvYr3tB02BTp9OgLT',$,'AcquisitionDate','The date that the manufactured item was purchased.',.P_REFERENCEVALUE.,'IfcCalendarDate',$,$,$,$,$,.READWRITE.); #2123=IFCSIMPLEPROPERTYTEMPLATE('0P4YyDwyv959i$GK4OsIWu',$,'BarCode','The identity of the bar code given to an occurrence of the product',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #2124=IFCSIMPLEPROPERTYTEMPLATE('2XOIvbzTTBuweIsOLdAZyX',$,'SerialNumber','The serial number assigned to an occurrence of a product',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #2125=IFCSIMPLEPROPERTYTEMPLATE('0ltkJHPJr77QvExGFteGaE',$,'BatchReference','The identity of the batch reference from which an occurrence of a product is taken.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2126=IFCPROPERTYSETTEMPLATE('2FTxVItr97G9vIrFiAqy$F',$,'Pset_ManufacturerTypeInformation','Definition from IAI: Defines characteristics of manufactured products that may be given by the manufacturer. Note that the term ''manufactured'' may also be used to refer to products that are supplied and identified by the supplier or that are assembled off site by a third party provider. \X2\000A\X0\This property set replaces the entity IfcManufacturerInformation from previous IFC releases.',$,'IfcElement',(#2127,#2128,#2129,#2130,#2131)); +#2126=IFCPROPERTYSETTEMPLATE('2FTxVItr97G9vIrFiAqy$F',$,'Pset_ManufacturerTypeInformation','Definition from IAI: Defines characteristics of manufactured products that may be given by the manufacturer. Note that the term ''manufactured'' may also be used to refer to products that are supplied and identified by the supplier or that are assembled off site by a third party provider. \X2\000A\X0\This property set replaces the entity IfcManufacturerInformation from previous IFC releases.',.PSET_OCCURRENCEDRIVEN.,'IfcElement',(#2127,#2128,#2129,#2130,#2131)); #2127=IFCSIMPLEPROPERTYTEMPLATE('0hYtH2QjzBC8Epe4MZoNao',$,'ArticleNumber','Article number or reference that may be applied to a product according to a standard scheme for article number definition (e.g. UN, EAN)',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #2128=IFCSIMPLEPROPERTYTEMPLATE('0ZZfj1Cvr17ORLzefgvXoj',$,'ModelReference','The name of the manufactured item as used by the manufacturer.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2129=IFCSIMPLEPROPERTYTEMPLATE('0ML$Y9azr5$OdvwDDJdjik',$,'ModelLabel','The model number and/or unit designator assigned by the manufacturer of the manufactured item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2130=IFCSIMPLEPROPERTYTEMPLATE('3G6ssddvnAIQjb54ZJqDhj',$,'Manufacturer','The organization that manufactured and/or assembled the item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2131=IFCSIMPLEPROPERTYTEMPLATE('2fQqdoJhn1gA5KOf69EaXp',$,'ProductionYear','The year of production of the manufactured item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2132=IFCPROPERTYSETTEMPLATE('2b1eQcRbL4XejHoN8xfj3D',$,'Pset_PropertyAgreement','Definition from IAI: A property agreement is an agreement that enables the occupation of a property for a period of time.\X2\000A000A\X0\The objective is to capture the information within an agreement that is relevant to a facilities manager. Design and construction information associated with the property is not considered. A property agreement may be applied to an instance of IfcSpatialStructureElement including to compositions defined through the IfcSpatialStructureElement.Element.CompositionEnum.\X2\000A000A\X0\Note that the associated actors are captured by the IfcOccupant class.\X2\000A\X0\',$,'IfcSpatialStructureElement',(#2133,#2135,#2136,#2137,#2138,#2139,#2140,#2141,#2142,#2143,#2144,#2145)); +#2132=IFCPROPERTYSETTEMPLATE('2b1eQcRbL4XejHoN8xfj3D',$,'Pset_PropertyAgreement','Definition from IAI: A property agreement is an agreement that enables the occupation of a property for a period of time.\X2\000A000A\X0\The objective is to capture the information within an agreement that is relevant to a facilities manager. Design and construction information associated with the property is not considered. A property agreement may be applied to an instance of IfcSpatialStructureElement including to compositions defined through the IfcSpatialStructureElement.Element.CompositionEnum.\X2\000A000A\X0\Note that the associated actors are captured by the IfcOccupant class.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcSpatialStructureElement',(#2133,#2135,#2136,#2137,#2138,#2139,#2140,#2141,#2142,#2143,#2144,#2145)); #2133=IFCSIMPLEPROPERTYTEMPLATE('2MSMGDzRf2VQoozRLY7bwQ',$,'AgreementType','Identifies the predefined types of property agreement from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2134,$,$,$,.READWRITE.); #2134=IFCPROPERTYENUMERATION('PEnum_PropertyAgreementType',(IFCLABEL('Assignment'),IFCLABEL('Lease'),IFCLABEL('Tenant'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #2135=IFCSIMPLEPROPERTYTEMPLATE('2B6tkBhb52IOb_rINAkXoQ',$,'Identifier','The identifier assigned to the agreement for the purposes of tracking.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); @@ -2150,9 +2150,9 @@ DATA; #2143=IFCSIMPLEPROPERTYTEMPLATE('3QNzaht99CXAEgnA4R90_h',$,'ConditionCommencement','Condition of property provided on commencement of the agreement e.g. cold shell, warm lit shell, broom clean, turn-key',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2144=IFCSIMPLEPROPERTYTEMPLATE('2qaDoNJpb5$fvj2yCTRUuu',$,'Restrictions','Restrictions that may be placed by a competent authority',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2145=IFCSIMPLEPROPERTYTEMPLATE('2wftJxbGHCYO_DEAJ9_bkm',$,'ConditionTermination','Condition of property required on termination of the agreement e.g. cold shell, warm lit shell, broom clean, turn-key',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2146=IFCPROPERTYSETTEMPLATE('0ikB1Li1X5VOmr97IsEhpk',$,'Pset_Reliability','Definition from IAI: Indication of the expected reliability of a product\X2\000A\X0\',$,'IfcProduct',(#2147)); +#2146=IFCPROPERTYSETTEMPLATE('0ikB1Li1X5VOmr97IsEhpk',$,'Pset_Reliability','Definition from IAI: Indication of the expected reliability of a product\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcProduct',(#2147)); #2147=IFCSIMPLEPROPERTYTEMPLATE('1u3jf3x9f3zgD0cnrY03AC',$,'MeanTimeBetweenFailure','The average time duration between instances of failure of a product.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#2148=IFCPROPERTYSETTEMPLATE('1G7uu84J1DMhGgelv4XKq3',$,'Pset_Risk','Definition from IAI: An indication of exposure to mischance, peril, menace, hazard or loss. \X2\000A000A\X0\HISTORY: Extended in IFC2x3\X2\000A000A\X0\There are various types of risk that may be encountered and there may be several instances of Pset_Risk associated in an instance of an IfcObject (either a physical object, a grouping of physical objects such as an asset or a process).\X2\000A\X0\Specification of this property set incorporates the values of the Incom risk analysis matrix (satisfying AS/NZS 4360) together with additional identified requirements.\X2\000A\X0\',$,'IfcObject',(#2149,#2151,#2152,#2153,#2154,#2155,#2157,#2159,#2161,#2163,#2164)); +#2148=IFCPROPERTYSETTEMPLATE('1G7uu84J1DMhGgelv4XKq3',$,'Pset_Risk','Definition from IAI: An indication of exposure to mischance, peril, menace, hazard or loss. \X2\000A000A\X0\HISTORY: Extended in IFC2x3\X2\000A000A\X0\There are various types of risk that may be encountered and there may be several instances of Pset_Risk associated in an instance of an IfcObject (either a physical object, a grouping of physical objects such as an asset or a process).\X2\000A\X0\Specification of this property set incorporates the values of the Incom risk analysis matrix (satisfying AS/NZS 4360) together with additional identified requirements.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcObject',(#2149,#2151,#2152,#2153,#2154,#2155,#2157,#2159,#2161,#2163,#2164)); #2149=IFCSIMPLEPROPERTYTEMPLATE('1VPQE5GAX9BgG9gFNoNEEC',$,'RiskType','Identifies the predefined types of risk from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2150,$,$,$,.READWRITE.); #2150=IFCPROPERTYENUMERATION('PEnum_RiskType',(IFCLABEL('Business'),IFCLABEL('Hazard'),IFCLABEL('HealthAndSafety'),IFCLABEL('Insurance'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #2151=IFCSIMPLEPROPERTYTEMPLATE('0dTgzthhLArvmkA4Exicsi',$,'NatureOfRisk','An indication of the generic nature of the risk that might be encountered. \X2\000A000A\X0\NOTE: It is anticipated that there will be a local agreement that constrains the values that might be assigned to this property. An example might be ''Fall'' or ''Fall of grille unit'' causing injury and damage to person and property',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -2169,25 +2169,25 @@ DATA; #2162=IFCPROPERTYENUMERATION('PEnum_RiskOwner',(IFCLABEL('Designer'),IFCLABEL('Specifier'),IFCLABEL('Constructor'),IFCLABEL('Installer'),IFCLABEL('Maintainer'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #2163=IFCSIMPLEPROPERTYTEMPLATE('0ZQOj8sp5EBwBabVNPes7q',$,'AffectsSurroundings','Indicates wether the risk affects only to the person assigned to that task (FALSE) or if it can also affect to the people in the surroundings (TRUE).\X2\000A000A\X0\For example, the process of painting would affect all the people in the vicinity of the process ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #2164=IFCSIMPLEPROPERTYTEMPLATE('3LiHy7Gob0huyuciD3gyZV',$,'PreventiveMeassures','Identifies preventive measures to be taken to mitigate risk',.P_LISTVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2165=IFCPROPERTYSETTEMPLATE('3CY40ULqz1Sefq$E00VjKU',$,'Pset_SystemFurnitureElementTypeCommon','Definition from IAI: Common properties for all systems furniture (I.e. modular furniture) element types (e.g. vertical panels, work surfaces, and storage). HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FurnitureElementCommon',$,'IfcSystemFurnitureElementType',(#2166,#2167,#2168,#2169,#2170)); +#2165=IFCPROPERTYSETTEMPLATE('3CY40ULqz1Sefq$E00VjKU',$,'Pset_SystemFurnitureElementTypeCommon','Definition from IAI: Common properties for all systems furniture (I.e. modular furniture) element types (e.g. vertical panels, work surfaces, and storage). HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FurnitureElementCommon',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElementType',(#2166,#2167,#2168,#2169,#2170)); #2166=IFCSIMPLEPROPERTYTEMPLATE('2EI_kKs1L9zwBvYOGiYyot',$,'IsUsed','Indicates whether the element is being used in a workstation (= TRUE) or not.(= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #2167=IFCSIMPLEPROPERTYTEMPLATE('2pGoNqxVLEV9nRoKvQUoAc',$,'GroupCode','e.g. panels, worksurfaces, storage, etc.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #2168=IFCSIMPLEPROPERTYTEMPLATE('2XdoVYfFX0Wv8HRIiMSb_W',$,'NominalWidth','The nominal width of the system furniture elements of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2169=IFCSIMPLEPROPERTYTEMPLATE('1fPqMNG_95luPC82Lh5Ney',$,'NominalHeight','The nominal height of the system furniture elements of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2170=IFCSIMPLEPROPERTYTEMPLATE('3sPyyUBy14M89x3HFmZJwN',$,'Finishing','The finishing applied to system furniture elements of this type e.g. walnut, fabric.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2171=IFCPROPERTYSETTEMPLATE('07CO3UkC53axSh1QaDCFXi',$,'Pset_SystemFurnitureElementTypePanel','Definition from IAI: A set of specific properties for vertical panels that assembly workstations.. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Panel',$,'IfcSystemFurnitureElementType',(#2172,#2173,#2175)); +#2171=IFCPROPERTYSETTEMPLATE('07CO3UkC53axSh1QaDCFXi',$,'Pset_SystemFurnitureElementTypePanel','Definition from IAI: A set of specific properties for vertical panels that assembly workstations.. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Panel',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElementType',(#2172,#2173,#2175)); #2172=IFCSIMPLEPROPERTYTEMPLATE('0wpzAQpBnBe98W9OOZBJpM',$,'HasOpening','indicates whether the panel has an opening (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #2173=IFCSIMPLEPROPERTYTEMPLATE('2TBa417K98HgStJZ7J8Ug8',$,'FurniturePanelType','Available panel types from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2174,$,$,$,.READWRITE.); #2174=IFCPROPERTYENUMERATION('PEnum_FurniturePanelType',(IFCLABEL('Acoustical'),IFCLABEL('Glazed'),IFCLABEL('Horz_Seg'),IFCLABEL('Monolithic'),IFCLABEL('Open'),IFCLABEL('Ends'),IFCLABEL('Door'),IFCLABEL('Screen'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #2175=IFCSIMPLEPROPERTYTEMPLATE('2$c1UJAl17KQigFpsIqA2p',$,'NominalThickness','The nominal thickness of the panel',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2176=IFCPROPERTYSETTEMPLATE('3qPTr51Tn2Eejxpv7X994b',$,'Pset_SystemFurnitureElementTypeWorkSurface','Definition from IAI: A set of specific properties for work surfaces used in workstations. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Worksurface',$,'IfcSystemFurnitureElementType',(#2177,#2178,#2180,#2181,#2182)); +#2176=IFCPROPERTYSETTEMPLATE('3qPTr51Tn2Eejxpv7X994b',$,'Pset_SystemFurnitureElementTypeWorkSurface','Definition from IAI: A set of specific properties for work surfaces used in workstations. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Worksurface',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElementType',(#2177,#2178,#2180,#2181,#2182)); #2177=IFCSIMPLEPROPERTYTEMPLATE('0Zi3OxjwX9rRJ3YOjR2KT1',$,'UsePurpose','The principal purpose for which the work surface is intended to be used e.g. writing/reading, computer, meeting, printer, reference files, etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2178=IFCSIMPLEPROPERTYTEMPLATE('1wPdMSzPPEnR81mfoIpmac',$,'SupportType','Available support types from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2179,$,$,$,.READWRITE.); #2179=IFCPROPERTYENUMERATION('PEnum_FurniturePanelType',(IFCLABEL('Freestanding'),IFCLABEL('Supported'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #2180=IFCSIMPLEPROPERTYTEMPLATE('1HZ54nfGX0u8pJeH0s68Em',$,'HangingHeight','The hanging height of the worksurface.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2181=IFCSIMPLEPROPERTYTEMPLATE('1RyBIUFH9DYRVzU0mak9CT',$,'NominalThickness','The nominal thickness of the work surface.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2182=IFCSIMPLEPROPERTYTEMPLATE('1jDLXiIK9ElRMUnBBTRtr3',$,'ShapeDescription','A description of the shape of the work surface e.g. corner square, rectangle, etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2183=IFCPROPERTYSETTEMPLATE('18t1dE$rrCS81kno$fW$Dn',$,'Pset_Warranty','Definition from IAI: An assurance given by the seller or provider of an artefact that the artefact is without defects and will operate as described for a defined period of time without failure and that if a defect does arise during that time, that it will be corrected by the seller or provider.\X2\000A\X0\',$,'IFCKERNEL/IfcProduct,IFCPRODUCTEXTENSION/IfcSystem',(#2184,#2185,#2186,#2187,#2188,#2189,#2190,#2191)); +#2183=IFCPROPERTYSETTEMPLATE('18t1dE$rrCS81kno$fW$Dn',$,'Pset_Warranty','Definition from IAI: An assurance given by the seller or provider of an artefact that the artefact is without defects and will operate as described for a defined period of time without failure and that if a defect does arise during that time, that it will be corrected by the seller or provider.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IFCKERNEL/IfcProduct,IFCPRODUCTEXTENSION/IfcSystem',(#2184,#2185,#2186,#2187,#2188,#2189,#2190,#2191)); #2184=IFCSIMPLEPROPERTYTEMPLATE('3ypobcbXzDRw5sljrqVEox',$,'WarrantyIdentifier','The identifier assigned to a warranty.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #2185=IFCSIMPLEPROPERTYTEMPLATE('2GO11QbSzEPudJwEP5Ed_O',$,'WarrantyStartDate','The date on which the warranty commences',.P_REFERENCEVALUE.,'IfcCalendarDate',$,$,$,$,$,.READWRITE.); #2186=IFCSIMPLEPROPERTYTEMPLATE('0_JIsw4pH8WgNov740szf4',$,'WarrantyEndDate','The date on which the warranty expires.',.P_REFERENCEVALUE.,'IfcCalendarDate',$,$,$,$,$,.READWRITE.); @@ -2196,11 +2196,11 @@ DATA; #2189=IFCSIMPLEPROPERTYTEMPLATE('29DMmbsAPFrAjNE$hxY6yz',$,'PointOfContact','The organization that should be contacted for action under the terms of the warranty. Note that the role of the organization (manufacturer, supplier, installer etc.) is determined by the IfcActorRole attribute of IfcOrganization.',.P_REFERENCEVALUE.,'IfcOrganization',$,$,$,$,$,.READWRITE.); #2190=IFCSIMPLEPROPERTYTEMPLATE('0S2gPMuF979gM8urJo6h09',$,'WarrantyContent','The content of the warranty',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2191=IFCSIMPLEPROPERTYTEMPLATE('0b7$CWSm9Cxg7bOiYAcq$r',$,'Exclusions','Items, conditions or actions that may be excluded from the warranty or that may cause the warranty to become void.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2192=IFCPROPERTYSETTEMPLATE('2PZZtRXYXEofjDVh1oyvkr',$,'Pset_ProjectOrderChangeOrder','Definition from IAI: A change order is an instruction to make a change to a product or work being undertake. Note that the change order status is defined in the same way as a work order status since a change order implies a work requirement.\X2\000A\X0\',$,'IfcProjectOrder',(#2193,#2194,#2195)); +#2192=IFCPROPERTYSETTEMPLATE('2PZZtRXYXEofjDVh1oyvkr',$,'Pset_ProjectOrderChangeOrder','Definition from IAI: A change order is an instruction to make a change to a product or work being undertake. Note that the change order status is defined in the same way as a work order status since a change order implies a work requirement.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder',(#2193,#2194,#2195)); #2193=IFCSIMPLEPROPERTYTEMPLATE('2LG5q$iiX929VLUtBnP4D2',$,'ChangeDescription','A general description of the change.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2194=IFCSIMPLEPROPERTYTEMPLATE('1EH9RG9Cj5M91rdSYgVl4m',$,'ReasonForChange','A description of the problem for why a change is needed.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2195=IFCSIMPLEPROPERTYTEMPLATE('2Nn9SO35fDKfLvobcCG5Hg',$,'BudgetSource','The budget source requested.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2196=IFCPROPERTYSETTEMPLATE('3FZb3z1Nr7rRLDqFLvmQIS',$,'Pset_ProjectOrderMaintenanceWorkOrder','Definition from IAI: A MaintenanceWorkOrder is a detailed description of maintenance work that is to be performed. Note that the Scheduled Frequency property of the maintenance work order is used when the order is required as an instance of a scheduled work order.',$,'IfcProjectOrder',(#2197,#2198,#2199,#2200,#2201,#2202,#2203,#2205,#2207,#2209)); +#2196=IFCPROPERTYSETTEMPLATE('3FZb3z1Nr7rRLDqFLvmQIS',$,'Pset_ProjectOrderMaintenanceWorkOrder','Definition from IAI: A MaintenanceWorkOrder is a detailed description of maintenance work that is to be performed. Note that the Scheduled Frequency property of the maintenance work order is used when the order is required as an instance of a scheduled work order.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder',(#2197,#2198,#2199,#2200,#2201,#2202,#2203,#2205,#2207,#2209)); #2197=IFCSIMPLEPROPERTYTEMPLATE('1BWHJcVw18yv9rJbX_bxUY',$,'ProductDescription','A textual description of the products that require the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2198=IFCSIMPLEPROPERTYTEMPLATE('0HW0nK7tHAUg2PF7MHZj2h',$,'ShortJobDescription','Short description of the job requested.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2199=IFCSIMPLEPROPERTYTEMPLATE('3p82TyvPnDZPV36fE2X5So',$,'LongJobDescription','Description of the job requested.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); @@ -2214,20 +2214,20 @@ DATA; #2207=IFCSIMPLEPROPERTYTEMPLATE('1IvljmOfz5bPhcZsfiF6fJ',$,'LocationPriorityType','Identifies the predefined types of priority that can be assigned from which the type may be set where:\X2\000A000A\X0\High = action is required urgently.\X2\000A\X0\Medium = action can occur within a reasonable period of time.\X2\000A\X0\Low = action can occur when convenient.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2208,$,$,$,.READWRITE.); #2208=IFCPROPERTYENUMERATION('PEnum_PriorityType',(IFCLABEL('High'),IFCLABEL('Medium'),IFCLABEL('Low'),IFCLABEL('Other'),IFCLABEL('NotKnown'),IFCLABEL('Unset')),$); #2209=IFCSIMPLEPROPERTYTEMPLATE('0D7$3Mbin4muToVnt7A5xV',$,'ScheduledFrequency','The period of time between expected instantiations of a work order that may have been predefined.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#2210=IFCPROPERTYSETTEMPLATE('3AAeqAOAL7igyZmy4MZav4',$,'Pset_ProjectOrderMoveOrder','Definition from IAI: Defines the requirements for move orders. Note that the move order status is defined in the same way as a work order status since a move order implies a work requirement.\X2\000A\X0\',$,'IfcProjectOrder',(#2211,#2212)); +#2210=IFCPROPERTYSETTEMPLATE('3AAeqAOAL7igyZmy4MZav4',$,'Pset_ProjectOrderMoveOrder','Definition from IAI: Defines the requirements for move orders. Note that the move order status is defined in the same way as a work order status since a move order implies a work requirement.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder',(#2211,#2212)); #2211=IFCSIMPLEPROPERTYTEMPLATE('2QFasar0v1PA5eBLonClD7',$,'MoveDescription','A textual description of the move required.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2212=IFCSIMPLEPROPERTYTEMPLATE('15W1BcIeXBqvb63EJeHKfe',$,'SpecialInstructions','Special instructions that affect the move.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2213=IFCPROPERTYSETTEMPLATE('3D6rO$Aa98cRYkhw201Ytr',$,'Pset_ProjectOrderPurchaseOrder','Definition from IAI: Defines the requirements for purchase orders in a project.\X2\000A\X0\',$,'IfcProjectOrder',(#2214,#2215)); +#2213=IFCPROPERTYSETTEMPLATE('3D6rO$Aa98cRYkhw201Ytr',$,'Pset_ProjectOrderPurchaseOrder','Definition from IAI: Defines the requirements for purchase orders in a project.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder',(#2214,#2215)); #2214=IFCSIMPLEPROPERTYTEMPLATE('0QaQ_NxHH72PpAsm6DSvlg',$,'IsFOB','Indication of whether contents of the purchase order are delivered ''Free on Board'' (= True) or not (= False). ',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #2215=IFCSIMPLEPROPERTYTEMPLATE('0tQhAhVsn8DR5k8ed6QPrh',$,'ShipMethod','Method of shipping that will be used for goods or services. ',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2216=IFCPROPERTYSETTEMPLATE('3BS7x4UZ92rhMC7s4h60ah',$,'Pset_ProjectOrderWorkOrder','Definition from IAI: Defines the requirements for purchase orders in a project.\X2\000A\X0\',$,'IfcProjectOrder',(#2217,#2218,#2219,#2220,#2221,#2222)); +#2216=IFCPROPERTYSETTEMPLATE('3BS7x4UZ92rhMC7s4h60ah',$,'Pset_ProjectOrderWorkOrder','Definition from IAI: Defines the requirements for purchase orders in a project.\X2\000A\X0\',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder',(#2217,#2218,#2219,#2220,#2221,#2222)); #2217=IFCSIMPLEPROPERTYTEMPLATE('2Wk_L2YNbEZQzNbQIVA$6Y',$,'ProductDescription','A textual description of the products that require the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2218=IFCSIMPLEPROPERTYTEMPLATE('19Q7Zohqv8U8liP5hvyY74',$,'ShortJobDescription','Short description of the job requested.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2219=IFCSIMPLEPROPERTYTEMPLATE('1gogMWsrH0nhHQbH0p6Y2H',$,'LongJobDescription','Description of the job requested.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2220=IFCSIMPLEPROPERTYTEMPLATE('3iPnsyFjb5kxqVjz$6RA_x',$,'WorkTypeRequested','Work type requested in circumstances where there are categorizations of types of work task. It could be used to identify a remedial task, minor work task, electrical task etc.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2221=IFCSIMPLEPROPERTYTEMPLATE('3Cv9KI5P15HRMeLs7YJ6hN',$,'ContractualType','The contractual type of the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2222=IFCSIMPLEPROPERTYTEMPLATE('3Fc0rs6yTBoOFuJQ7ch_3f',$,'IfNotAccomplished','Comments if the job is not accomplished.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2223=IFCPROPERTYSETTEMPLATE('2X3vBUebD2XOzbO5kEf3G7',$,'Pset_ConcreteElementGeneral','Definition from IAI: General properties common to different types of concrete elements. The Pset can be used by a number of subtypes of IfcBuildingElement.',$,'IFCSHAREDBLDGELEMENTS/IfcBeam,IFCSTRUCTURALELEMENTSDOMAIN/IfcBuildingElementPart,IFCPRODUCTEXTENSION/IfcBuildingElementProxy,IFCSHAREDBLDGELEMENTS/IfcColumn,IFCPRODUCTEXTENSION/IfcCovering,IFCSHAREDBLDGELEMENTS/IfcCurtainWall,IFCSHAREDBLDGELEMENTS/IfcDoor,IFCSTRUCTURALELEMENTSDOMAIN/IfcFooting,IFCSHAREDBLDGELEMENTS/IfcMember,IFCSTRUCTURALELEMENTSDOMAIN/IfcPile,IFCSHAREDBLDGELEMENTS/IfcRailing,IFCSHAREDBLDGELEMENTS/IfcRamp,IFCSHAREDBLDGELEMENTS/IfcRampFlight,IFCSHAREDBLDGELEMENTS/IfcRoof,IFCSHAREDBLDGELEMENTS/IfcSlab,IFCSHAREDBLDGELEMENTS/IfcStair,IFCSHAREDBLDGELEMENTS/IfcStairFlight,IFCSHAREDBLDGELEMENTS/IfcWall,IFCSHAREDBLDGELEMENTS/IfcWallStandardCase\X2\000A\X0\',(#2224,#2225,#2226,#2227,#2228,#2229,#2230,#2231,#2232,#2233)); +#2223=IFCPROPERTYSETTEMPLATE('2X3vBUebD2XOzbO5kEf3G7',$,'Pset_ConcreteElementGeneral','Definition from IAI: General properties common to different types of concrete elements. The Pset can be used by a number of subtypes of IfcBuildingElement.',.PSET_OCCURRENCEDRIVEN.,'IFCSHAREDBLDGELEMENTS/IfcBeam,IFCSTRUCTURALELEMENTSDOMAIN/IfcBuildingElementPart,IFCPRODUCTEXTENSION/IfcBuildingElementProxy,IFCSHAREDBLDGELEMENTS/IfcColumn,IFCPRODUCTEXTENSION/IfcCovering,IFCSHAREDBLDGELEMENTS/IfcCurtainWall,IFCSHAREDBLDGELEMENTS/IfcDoor,IFCSTRUCTURALELEMENTSDOMAIN/IfcFooting,IFCSHAREDBLDGELEMENTS/IfcMember,IFCSTRUCTURALELEMENTSDOMAIN/IfcPile,IFCSHAREDBLDGELEMENTS/IfcRailing,IFCSHAREDBLDGELEMENTS/IfcRamp,IFCSHAREDBLDGELEMENTS/IfcRampFlight,IFCSHAREDBLDGELEMENTS/IfcRoof,IFCSHAREDBLDGELEMENTS/IfcSlab,IFCSHAREDBLDGELEMENTS/IfcStair,IFCSHAREDBLDGELEMENTS/IfcStairFlight,IFCSHAREDBLDGELEMENTS/IfcWall,IFCSHAREDBLDGELEMENTS/IfcWallStandardCase',(#2224,#2225,#2226,#2227,#2228,#2229,#2230,#2231,#2232,#2233)); #2224=IFCSIMPLEPROPERTYTEMPLATE('1Lso1DMgv9WfakraDP7RFk',$,'StructuralClass','The structural class defined for the concrete structure (e.g. ''1'').',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2225=IFCSIMPLEPROPERTYTEMPLATE('13lkg01s14fOksc4AkNR1c',$,'EnvironmentalClass','The environmental class for the concrete structure (e.g. ''Y1'')',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2226=IFCSIMPLEPROPERTYTEMPLATE('3JCl4SH3z2sAQnc3chAN$Y',$,'FireRating','Fire rating given according to the national fire safety classification',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -2238,7 +2238,7 @@ DATA; #2231=IFCSIMPLEPROPERTYTEMPLATE('174rjgYQP9_BZPFoKrhv9Q',$,'ConstructionType','Designator for whether the concrete element is constructed on site or prefabricated. Allowed values are: ''Insitu'' vs ''Precast''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2232=IFCSIMPLEPROPERTYTEMPLATE('3xnZZmmnP0ehm2exVvimkT',$,'ConcreteCoverAtMainBars','The protective concrete cover at the main reinforcing bars according to local building regulations.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2233=IFCSIMPLEPROPERTYTEMPLATE('0lQB$ikHP89OiHkdQ0M8Nc',$,'ConcreteCoverAtLinks','The protective concrete cover at the reinforcement links according to local building regulations.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2234=IFCPROPERTYSETTEMPLATE('3JmZPXJDX4$gPsniMC$oIw',$,'Pset_ConcreteElementQuantityGeneral','Definition from IAI: Bill-of-Quantity properties common to different types of precast concrete elements. The Pset is used to express the total bulk quantities per element. The quantities may include the concrete, reinforcement, and different kinds of accessories. The Pset can be used by a number of subtypes of IfcBuildingElement. Note: Bulk quantities for parts used for surface finish, tiles, bricks, etc. are included as area quantities in Pset_ConcreteElementSurfaceFinishQuantityGeneral.',$,'IFCSHAREDBLDGELEMENTS/IfcBeam,IFCSTRUCTURALELEMENTSDOMAIN/IfcBuildingElementPart,IFCPRODUCTEXTENSION/IfcBuildingElementProxy,IFCSHAREDBLDGELEMENTS/IfcColumn,IFCPRODUCTEXTENSION/IfcCovering,IFCSHAREDBLDGELEMENTS/IfcCurtainWall,IFCSHAREDBLDGELEMENTS/IfcDoor,IFCSTRUCTURALELEMENTSDOMAIN/IfcFooting,IFCSHAREDBLDGELEMENTS/IfcMember,IFCSTRUCTURALELEMENTSDOMAIN/IfcPile,IFCSHAREDBLDGELEMENTS/IfcRailing,IFCSHAREDBLDGELEMENTS/IfcRamp,IFCSHAREDBLDGELEMENTS/IfcRampFlight,IFCSHAREDBLDGELEMENTS/IfcRoof,IFCSHAREDBLDGELEMENTS/IfcSlab,IFCSHAREDBLDGELEMENTS/IfcStair,IFCSHAREDBLDGELEMENTS/IfcStairFlight,IFCSHAREDBLDGELEMENTS/IfcWall,IFCSHAREDBLDGELEMENTS/IfcWallStandardCase\X2\000A\X0\',(#2235,#2236,#2241)); +#2234=IFCPROPERTYSETTEMPLATE('3JmZPXJDX4$gPsniMC$oIw',$,'Pset_ConcreteElementQuantityGeneral','Definition from IAI: Bill-of-Quantity properties common to different types of precast concrete elements. The Pset is used to express the total bulk quantities per element. The quantities may include the concrete, reinforcement, and different kinds of accessories. The Pset can be used by a number of subtypes of IfcBuildingElement. Note: Bulk quantities for parts used for surface finish, tiles, bricks, etc. are included as area quantities in Pset_ConcreteElementSurfaceFinishQuantityGeneral.',.PSET_OCCURRENCEDRIVEN.,'IFCSHAREDBLDGELEMENTS/IfcBeam,IFCSTRUCTURALELEMENTSDOMAIN/IfcBuildingElementPart,IFCPRODUCTEXTENSION/IfcBuildingElementProxy,IFCSHAREDBLDGELEMENTS/IfcColumn,IFCPRODUCTEXTENSION/IfcCovering,IFCSHAREDBLDGELEMENTS/IfcCurtainWall,IFCSHAREDBLDGELEMENTS/IfcDoor,IFCSTRUCTURALELEMENTSDOMAIN/IfcFooting,IFCSHAREDBLDGELEMENTS/IfcMember,IFCSTRUCTURALELEMENTSDOMAIN/IfcPile,IFCSHAREDBLDGELEMENTS/IfcRailing,IFCSHAREDBLDGELEMENTS/IfcRamp,IFCSHAREDBLDGELEMENTS/IfcRampFlight,IFCSHAREDBLDGELEMENTS/IfcRoof,IFCSHAREDBLDGELEMENTS/IfcSlab,IFCSHAREDBLDGELEMENTS/IfcStair,IFCSHAREDBLDGELEMENTS/IfcStairFlight,IFCSHAREDBLDGELEMENTS/IfcWall,IFCSHAREDBLDGELEMENTS/IfcWallStandardCase',(#2235,#2236,#2241)); #2235=IFCSIMPLEPROPERTYTEMPLATE('2Aai$r251E6wgNxSArz9zb',$,'TotalConcreteQuantity','The total bulk quantity of concrete used for the precast concrete element expressed as the volume of concrete in cubic meter (m3).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); #2236=IFCCOMPLEXPROPERTYTEMPLATE('0s4wbkOUj7yRXgZi6puNeY',$,'TotalRebarQuantity','The total bulk quantity of rebar per size used for the precast concrete element expressed as the mass measure of rebar in kg. Note: several complex properties of this type, one for each rebar size, may be attached to the Pset.','CP_RebarQuantity',.P_COMPLEX.,(#2237,#2238,#2239,#2240)); #2237=IFCSIMPLEPROPERTYTEMPLATE('3YuyBNuZT8Lh0ZP2R47iSw',$,'RebarSteelGrade','The rebar steel grade (e.g. ''A500HW'') for which the total quantity is specified. ',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -2255,7 +2255,7 @@ DATA; #2248=IFCSIMPLEPROPERTYTEMPLATE('0m4J73a8rAzfT$T5Ul47OO',$,'AccessorySize',' Size designation according to local classification standards or manufacturer practices.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2249=IFCSIMPLEPROPERTYTEMPLATE('1PSAQ6r1b3NvkCa4PXPA3s',$,'AccessoryQuantityByNumberOfItems',' The total quantity of accessories of the specified accessory type expressed as number of items.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); #2250=IFCSIMPLEPROPERTYTEMPLATE('2khzWYPCn6OAEj5bOPMYHp',$,'AccessoryQuantityByWeight',' The total quantity of accessories of the specified accessory type expressed as mass measure in kg.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#2251=IFCPROPERTYSETTEMPLATE('3_EeqBo8z5lPknE$5qDxNJ',$,'Pset_ConcreteElementSurfaceFinishQuantityGeneral','Definition from IAI: Surface finish related properties common to different types of concrete elements. The Pset can be used by a number of subtypes of IfcBuildingElement, like IfcBeam, IfcColumn, IfcWall, etc. If a precast concrete element is a sandwich wall panel each structural layer or shell represented by an IfcBuildingElementPart may be attached to a separate Pset.The surface finishes are expressed as area quantities only for each surface finish type. The exact details (location, area shape, overlaps, tile joints, patterns, etc.) of the surface finishes are expressed in external documents using the IfcDocumentReference mechanism. Each of the defined properties are instantiated as needed, and multiple instantiations of the same property for each different surface classification are possible.',$,'IFCSHAREDBLDGELEMENTS/IfcBeam,IFCSTRUCTURALELEMENTSDOMAIN/IfcBuildingElementPart,IFCPRODUCTEXTENSION/IfcBuildingElementProxy,IFCSHAREDBLDGELEMENTS/IfcColumn,IFCPRODUCTEXTENSION/IfcCovering,IFCSHAREDBLDGELEMENTS/IfcCurtainWall,IFCSHAREDBLDGELEMENTS/IfcDoor,IFCSTRUCTURALELEMENTSDOMAIN/IfcFooting,IFCSHAREDBLDGELEMENTS/IfcMember,IFCSTRUCTURALELEMENTSDOMAIN/IfcPile,IFCSHAREDBLDGELEMENTS/IfcRailing,IFCSHAREDBLDGELEMENTS/IfcRamp,IFCSHAREDBLDGELEMENTS/IfcRampFlight,IFCSHAREDBLDGELEMENTS/IfcRoof,IFCSHAREDBLDGELEMENTS/IfcSlab,IFCSHAREDBLDGELEMENTS/IfcStair,IFCSHAREDBLDGELEMENTS/IfcStairFlight,IFCSHAREDBLDGELEMENTS/IfcWall,IFCSHAREDBLDGELEMENTS/IfcWallStandardCase\X2\000A\X0\',(#2252,#2256,#2260)); +#2251=IFCPROPERTYSETTEMPLATE('3_EeqBo8z5lPknE$5qDxNJ',$,'Pset_ConcreteElementSurfaceFinishQuantityGeneral','Definition from IAI: Surface finish related properties common to different types of concrete elements. The Pset can be used by a number of subtypes of IfcBuildingElement, like IfcBeam, IfcColumn, IfcWall, etc. If a precast concrete element is a sandwich wall panel each structural layer or shell represented by an IfcBuildingElementPart may be attached to a separate Pset.The surface finishes are expressed as area quantities only for each surface finish type. The exact details (location, area shape, overlaps, tile joints, patterns, etc.) of the surface finishes are expressed in external documents using the IfcDocumentReference mechanism. Each of the defined properties are instantiated as needed, and multiple instantiations of the same property for each different surface classification are possible.',.PSET_OCCURRENCEDRIVEN.,'IFCSHAREDBLDGELEMENTS/IfcBeam,IFCSTRUCTURALELEMENTSDOMAIN/IfcBuildingElementPart,IFCPRODUCTEXTENSION/IfcBuildingElementProxy,IFCSHAREDBLDGELEMENTS/IfcColumn,IFCPRODUCTEXTENSION/IfcCovering,IFCSHAREDBLDGELEMENTS/IfcCurtainWall,IFCSHAREDBLDGELEMENTS/IfcDoor,IFCSTRUCTURALELEMENTSDOMAIN/IfcFooting,IFCSHAREDBLDGELEMENTS/IfcMember,IFCSTRUCTURALELEMENTSDOMAIN/IfcPile,IFCSHAREDBLDGELEMENTS/IfcRailing,IFCSHAREDBLDGELEMENTS/IfcRamp,IFCSHAREDBLDGELEMENTS/IfcRampFlight,IFCSHAREDBLDGELEMENTS/IfcRoof,IFCSHAREDBLDGELEMENTS/IfcSlab,IFCSHAREDBLDGELEMENTS/IfcStair,IFCSHAREDBLDGELEMENTS/IfcStairFlight,IFCSHAREDBLDGELEMENTS/IfcWall,IFCSHAREDBLDGELEMENTS/IfcWallStandardCase',(#2252,#2256,#2260)); #2252=IFCCOMPLEXPROPERTYTEMPLATE('0RQ4UAMiDD7gp8m7Vorw6s',$,'FormSurface','Formwork surface area quantity. Several complex properties of this type may be attached to this Pset, one for each formwork subsurface with different properties.','CP_FormSurface',.P_COMPLEX.,(#2253,#2254,#2255)); #2253=IFCSIMPLEPROPERTYTEMPLATE('0N716_fsn8_As_GjPS7LSK',$,'FormSurfaceClass','Classification designation for the formwork surface according to local standards, e.g. E, 1, 2, or 3.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2254=IFCSIMPLEPROPERTYTEMPLATE('2hXzUa3HH6q8wCWFn3Mouf',$,'FormSurfaceTextureDescription','Textual description of the form surface texture pattern. Used only if the form work includes sub-areas with textures.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); @@ -2265,7 +2265,7 @@ DATA; #2258=IFCSIMPLEPROPERTYTEMPLATE('0EX8gfNkX3vP5IHT4YrZGO',$,'ExternalSurfaceClass','Class designation for the surface. This usually depends on what kind of surface type is used and how the classification is expressed in local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2259=IFCSIMPLEPROPERTYTEMPLATE('1dRvp5axn9Cwa6faWsnSf2',$,'ExternalSurfaceArea','The external surface area quantity for which the particular surface finish is defined. Usually expressed in square meter (m2).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #2260=IFCSIMPLEPROPERTYTEMPLATE('1jjRgsJhzAzgIhR1WEgaIL',$,'SurfaceDescriptionDocReference','Reference to an external document describing the details of the surface of the concrete element, i.e. a drawing or textual document file.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#2261=IFCPROPERTYSETTEMPLATE('3BRJkc_652W9yXqyB1pOyD',$,'Pset_PrecastConcreteElementGeneral','Definition from IAI: Production and manufacturing related properties common to different types of precast concrete elements. The Pset can be used by a number of subtypes of IfcBuildingElement. If the precast concrete element is a sandwich wall panel each structural layer or shell represented by an IfcBuildingElementPart may be attached to a separate Pset of this type, if needed. Some of the properties apply only for specific types of precast concrete elements.',$,'IFCSHAREDBLDGELEMENTS/IfcBeam,IFCSTRUCTURALELEMENTSDOMAIN/IfcBuildingElementPart,IFCPRODUCTEXTENSION/IfcBuildingElementProxy,IFCSHAREDBLDGELEMENTS/IfcColumn,IFCPRODUCTEXTENSION/IfcCovering,IFCSHAREDBLDGELEMENTS/IfcCurtainWall,IFCSHAREDBLDGELEMENTS/IfcDoor,IFCSTRUCTURALELEMENTSDOMAIN/IfcFooting,IFCSHAREDBLDGELEMENTS/IfcMember,IFCSTRUCTURALELEMENTSDOMAIN/IfcPile,IFCSHAREDBLDGELEMENTS/IfcRailing,IFCSHAREDBLDGELEMENTS/IfcRamp,IFCSHAREDBLDGELEMENTS/IfcRampFlight,IFCSHAREDBLDGELEMENTS/IfcRoof,IFCSHAREDBLDGELEMENTS/IfcSlab,IFCSHAREDBLDGELEMENTS/IfcStair,IFCSHAREDBLDGELEMENTS/IfcStairFlight,IFCSHAREDBLDGELEMENTS/IfcWall,IFCSHAREDBLDGELEMENTS/IfcWallStandardCase\X2\000A\X0\',(#2262,#2263,#2264,#2265,#2266,#2267,#2268,#2269,#2270,#2271,#2272,#2273,#2274,#2275,#2276,#2277,#2278,#2279)); +#2261=IFCPROPERTYSETTEMPLATE('3BRJkc_652W9yXqyB1pOyD',$,'Pset_PrecastConcreteElementGeneral','Definition from IAI: Production and manufacturing related properties common to different types of precast concrete elements. The Pset can be used by a number of subtypes of IfcBuildingElement. If the precast concrete element is a sandwich wall panel each structural layer or shell represented by an IfcBuildingElementPart may be attached to a separate Pset of this type, if needed. Some of the properties apply only for specific types of precast concrete elements.',.PSET_OCCURRENCEDRIVEN.,'IFCSHAREDBLDGELEMENTS/IfcBeam,IFCSTRUCTURALELEMENTSDOMAIN/IfcBuildingElementPart,IFCPRODUCTEXTENSION/IfcBuildingElementProxy,IFCSHAREDBLDGELEMENTS/IfcColumn,IFCPRODUCTEXTENSION/IfcCovering,IFCSHAREDBLDGELEMENTS/IfcCurtainWall,IFCSHAREDBLDGELEMENTS/IfcDoor,IFCSTRUCTURALELEMENTSDOMAIN/IfcFooting,IFCSHAREDBLDGELEMENTS/IfcMember,IFCSTRUCTURALELEMENTSDOMAIN/IfcPile,IFCSHAREDBLDGELEMENTS/IfcRailing,IFCSHAREDBLDGELEMENTS/IfcRamp,IFCSHAREDBLDGELEMENTS/IfcRampFlight,IFCSHAREDBLDGELEMENTS/IfcRoof,IFCSHAREDBLDGELEMENTS/IfcSlab,IFCSHAREDBLDGELEMENTS/IfcStair,IFCSHAREDBLDGELEMENTS/IfcStairFlight,IFCSHAREDBLDGELEMENTS/IfcWall,IFCSHAREDBLDGELEMENTS/IfcWallStandardCase',(#2262,#2263,#2264,#2265,#2266,#2267,#2268,#2269,#2270,#2271,#2272,#2273,#2274,#2275,#2276,#2277,#2278,#2279)); #2262=IFCSIMPLEPROPERTYTEMPLATE('1YxdfLlYXBRRILNMAjGsY3',$,'TypeDesignator','Type designator for the precast concrete element. The content depends on local standards. For instance in Finland it usually a one-letter acronym, e.g. P=Column, K=reinforced concrete beam,etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2263=IFCSIMPLEPROPERTYTEMPLATE('1EMyeZW0f6du1iWu8dX8co',$,'ProductionLotId','The manufacturer''s production lot identifier.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #2264=IFCSIMPLEPROPERTYTEMPLATE('2PR8XVZM13tB_Y3_Xs_LMT',$,'SerialNumber','The manufacturer''s serial number for the precast concrete element.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); @@ -2284,19 +2284,19 @@ DATA; #2277=IFCSIMPLEPROPERTYTEMPLATE('2_iiNg$dD2xf4WOwQ3IpbY',$,'SupportDuringTransportDescription','Textual description of how the concrete element is supported during transportation',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2278=IFCSIMPLEPROPERTYTEMPLATE('07lNDn$NjApR8Z4KmBY3QN',$,'SupportDuringTransportDocReference','Reference to an external document defining how the concrete element is supported during transportation',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); #2279=IFCSIMPLEPROPERTYTEMPLATE('2uIYJLyP1F9gUXPErhQztG',$,'HollowCorePlugging','A descriptive label for how the hollow core ends are treated: they may be left open, closed with a plug, or sealed with cast concrete. Values would be, for example: ''Unplugged'', ''Plugged'', ''SealedWithConcrete''. This property applies to hollow core slabs only.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2280=IFCPROPERTYSETTEMPLATE('3dp32yRir9hB0hm3iWYGjB',$,'Pset_ReinforcementBarCountOfIndependentFooting','Definition from IAI: Reinforcement Concrete parameter [ST-2]: The amount number information of reinforcement bar with the independent footing. The X and Y direction are based on the local coordinate system of building storey. The X and Y direction of the reinforcement bar are parallel to the X and Y axis of the IfcBuildingStorey''s local coordinate system, respectively.',$,'IfcFooting',(#2281,#2282,#2283,#2284,#2285,#2286)); +#2280=IFCPROPERTYSETTEMPLATE('3dp32yRir9hB0hm3iWYGjB',$,'Pset_ReinforcementBarCountOfIndependentFooting','Definition from IAI: Reinforcement Concrete parameter [ST-2]: The amount number information of reinforcement bar with the independent footing. The X and Y direction are based on the local coordinate system of building storey. The X and Y direction of the reinforcement bar are parallel to the X and Y axis of the IfcBuildingStorey''s local coordinate system, respectively.',.PSET_OCCURRENCEDRIVEN.,'IfcFooting',(#2281,#2282,#2283,#2284,#2285,#2286)); #2281=IFCSIMPLEPROPERTYTEMPLATE('39g9M8ADf1exahsCE4eZ5W',$,'Description','Description of the reinforcement.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2282=IFCSIMPLEPROPERTYTEMPLATE('2LyKaPsFvCPw5fbcGOA9_Q',$,'Reference','A descriptive label for the general reinforcement type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2283=IFCSIMPLEPROPERTYTEMPLATE('11UjldvZnCrvSKRyvsksd7',$,'XDirectionLowerBarCount','The number of bars with X direction lower bar.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #2284=IFCSIMPLEPROPERTYTEMPLATE('1psGY0w25BqAh1FOZ5Tyt2',$,'YDirectionLowerBarCount','The number of bars with Y direction lower bar.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #2285=IFCSIMPLEPROPERTYTEMPLATE('3oTQ7qG0PC9xyx2S5OEW_z',$,'XDirectionUpperBarCount','The number of bars with X direction upper bar.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #2286=IFCSIMPLEPROPERTYTEMPLATE('0Br1FAuOvANxWnZrkkWtco',$,'YDirectionUpperBarCount','The number of bars with Y direction upper bar.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2287=IFCPROPERTYSETTEMPLATE('26PL_Y1J1C28VVZbistSi$',$,'Pset_ReinforcementBarPitchOfBeam','Definition from IAI: The ptich length information of reinforcement bar with the beam.',$,'IfcBeam',(#2288,#2289,#2290,#2291)); +#2287=IFCPROPERTYSETTEMPLATE('26PL_Y1J1C28VVZbistSi$',$,'Pset_ReinforcementBarPitchOfBeam','Definition from IAI: The ptich length information of reinforcement bar with the beam.',.PSET_OCCURRENCEDRIVEN.,'IfcBeam',(#2288,#2289,#2290,#2291)); #2288=IFCSIMPLEPROPERTYTEMPLATE('2RBd0bulrEfx8jGP69xKdm',$,'Description','Description of the reinforcement.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2289=IFCSIMPLEPROPERTYTEMPLATE('3HFRk6tdL6aBA5qQBxSN3a',$,'Reference','A descriptive label for the general reinforcement type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2290=IFCSIMPLEPROPERTYTEMPLATE('2uiFF$HJXFZA3BTaAIjAe8',$,'StirrupBarPitch','The pitch length of the stirrup bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2291=IFCSIMPLEPROPERTYTEMPLATE('1eW3J0zb1FvAtbkEFzm4X3',$,'SpacingBarPitch','The pitch length of the spacing bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2292=IFCPROPERTYSETTEMPLATE('0BMYxb3mD7eOI_MPy6baUA',$,'Pset_ReinforcementBarPitchOfColumn','Definition from IAI: The pitch length information of reinforcement bar with the column. The X and Y direction are based on the local coordinate system of building storey. The X and Y direction of the reinforcement bar are parallel to the X and Y axis of the IfcBuildingStorey''s local coordinate system, respectively.',$,'IfcColumn',(#2293,#2294,#2295,#2297,#2298,#2299,#2300,#2301)); +#2292=IFCPROPERTYSETTEMPLATE('0BMYxb3mD7eOI_MPy6baUA',$,'Pset_ReinforcementBarPitchOfColumn','Definition from IAI: The pitch length information of reinforcement bar with the column. The X and Y direction are based on the local coordinate system of building storey. The X and Y direction of the reinforcement bar are parallel to the X and Y axis of the IfcBuildingStorey''s local coordinate system, respectively.',.PSET_OCCURRENCEDRIVEN.,'IfcColumn',(#2293,#2294,#2295,#2297,#2298,#2299,#2300,#2301)); #2293=IFCSIMPLEPROPERTYTEMPLATE('2yzST_tKHBawflZHuA2A4u',$,'Description','Description of the reinforcement.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2294=IFCSIMPLEPROPERTYTEMPLATE('2msVSvBvn6tuVn8h2TBjES',$,'Reference','A descriptive label for the general reinforcement type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2295=IFCSIMPLEPROPERTYTEMPLATE('1Y_V_uI6X1Lwo6gz__K4US',$,'ReinforcementBarType','Defines the type of the reinforcement bar.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2296,$,$,$,.READWRITE.); @@ -2306,12 +2306,12 @@ DATA; #2299=IFCSIMPLEPROPERTYTEMPLATE('0hAoL2B8zE_QpWDab6MDD6',$,'XDirectionTieHoopCount','The number of bars with X direction tie hoop bars.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); #2300=IFCSIMPLEPROPERTYTEMPLATE('3F1MJj22P8_8HojRjmfBj0',$,'YDirectionTieHoopBarPitch','The Y direction pitch length of the tie hoop.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2301=IFCSIMPLEPROPERTYTEMPLATE('2oUTmMENbByg4BsUj5PKUe',$,'YDirectionTieHoopCount','The number of bars with Y direction tie hoop bars.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2302=IFCPROPERTYSETTEMPLATE('2igQk2TXT38eEUJunayZwE',$,'Pset_ReinforcementBarPitchOfContinuousFooting','Definition from IAI: Reinforcement Concrete parameter [ST-2]: The pitch length information of reinforcement bar with the continuous footing.',$,'IfcFooting',(#2303,#2304,#2305,#2306)); +#2302=IFCPROPERTYSETTEMPLATE('2igQk2TXT38eEUJunayZwE',$,'Pset_ReinforcementBarPitchOfContinuousFooting','Definition from IAI: Reinforcement Concrete parameter [ST-2]: The pitch length information of reinforcement bar with the continuous footing.',.PSET_OCCURRENCEDRIVEN.,'IfcFooting',(#2303,#2304,#2305,#2306)); #2303=IFCSIMPLEPROPERTYTEMPLATE('2thNWf$nP1Xw36NI0sgTRl',$,'Description','Description of the reinforcement.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2304=IFCSIMPLEPROPERTYTEMPLATE('1aOOcuZpv1wee$GuM4Axmg',$,'Reference','A descriptive label for the general reinforcement type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2305=IFCSIMPLEPROPERTYTEMPLATE('0U$SY_odL4MBoJDPTvMWf4',$,'CrossingUpperBarPitch','The pitch length of the crossing upper bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2306=IFCSIMPLEPROPERTYTEMPLATE('19dLYLK0DFhO91tD$geJzJ',$,'CrossingLowerBarPitch','The pitch length of the crossing lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2307=IFCPROPERTYSETTEMPLATE('2Z3TMgawb8uAcnk4XPrphP',$,'Pset_ReinforcementBarPitchOfSlab','Definition from IAI: The pitch length information of reinforcement bar with the slab.',$,'IfcSlab',(#2308,#2309,#2310,#2311,#2312,#2313,#2314,#2315,#2316,#2317,#2318,#2319,#2320,#2321)); +#2307=IFCPROPERTYSETTEMPLATE('2Z3TMgawb8uAcnk4XPrphP',$,'Pset_ReinforcementBarPitchOfSlab','Definition from IAI: The pitch length information of reinforcement bar with the slab.',.PSET_OCCURRENCEDRIVEN.,'IfcSlab',(#2308,#2309,#2310,#2311,#2312,#2313,#2314,#2315,#2316,#2317,#2318,#2319,#2320,#2321)); #2308=IFCSIMPLEPROPERTYTEMPLATE('1O2TtFmaLCvvmf2jP2qtvw',$,'Description','Description of the reinforcement.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2309=IFCSIMPLEPROPERTYTEMPLATE('3SnvCE5NTFdO18XfG36G45',$,'Reference','A descriptive label for the general reinforcement type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2310=IFCSIMPLEPROPERTYTEMPLATE('0PYzflCyf1CvNjGbZhel6g',$,'LongOutsideTopBarPitch','The pitch length of the long outside top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -2326,7 +2326,7 @@ DATA; #2319=IFCSIMPLEPROPERTYTEMPLATE('0oK3jZZL5BvhL8WL_piLVh',$,'ShortOutsideLowerBarPitch','The pitch length of the short outside lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2320=IFCSIMPLEPROPERTYTEMPLATE('33AgOsr6TFZuItFq8hBwtr',$,'ShortInsideCenterLowerBarPitch','The pitch length of the short inside center lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2321=IFCSIMPLEPROPERTYTEMPLATE('1XHu$PCGPF2eQD1sHtntFt',$,'ShortInsideEndLowerBarPitch','The pitch length of the short inside end lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2322=IFCPROPERTYSETTEMPLATE('2ku6Tbwa5AdQaqwq5dwKzS',$,'Pset_ReinforcementBarPitchOfWall','Definition from IAI: The pitch length information of reinforcement bar with the wall.',$,'IfcWall',(#2323,#2324,#2325,#2327,#2328,#2329)); +#2322=IFCPROPERTYSETTEMPLATE('2ku6Tbwa5AdQaqwq5dwKzS',$,'Pset_ReinforcementBarPitchOfWall','Definition from IAI: The pitch length information of reinforcement bar with the wall.',.PSET_OCCURRENCEDRIVEN.,'IfcWall',(#2323,#2324,#2325,#2327,#2328,#2329)); #2323=IFCSIMPLEPROPERTYTEMPLATE('3c1Eotwi927PP_MAEQUXjS',$,'Description','Description of the reinforcement.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); #2324=IFCSIMPLEPROPERTYTEMPLATE('11EihJq1bAz8pH9bppqw01',$,'Reference','A descriptive label for the general reinforcement type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2325=IFCSIMPLEPROPERTYTEMPLATE('1lj_vnAAXAhBxv8vxHiXt_',$,'BarAllocationType','Defines the type of the reinforcement bar allocation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2326,$,$,$,.READWRITE.); @@ -2334,7 +2334,7 @@ DATA; #2327=IFCSIMPLEPROPERTYTEMPLATE('1BymBc4Q9FrRBTSJtHkKwS',$,'VerticalBarPitch','The pitch length of the vertical bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2328=IFCSIMPLEPROPERTYTEMPLATE('06KxkSxVTFPO$hEqBfTe4S',$,'HorizontalBarPitch','The pitch length of the horizontal bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2329=IFCSIMPLEPROPERTYTEMPLATE('0yhobw41rERwvY7ViStz9q',$,'SpacingBarPitch','The pitch length of the spacing bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2330=IFCPROPERTYSETTEMPLATE('2LD2kY$GD71flgnSUpX$ba',$,'Pset_ReinforcingBarBendingsBECCommon','Definition from IAI: Properties expressing the bending information of non-prestressed reinforcing bars. The properties in this Pset are defined according to the local Finnish BEC standard with minor adjustements (only bar bending information is included). The bending shape property definitions apply to both reinforcing bars (IfcReinforcingBar) and reinforcing meshes (IfcReinforcingMesh). It is presumed that a single standard for defining the bar bending is used throughout the project and that this standard is referenced from the IfcProject object through the IfcDocumentReference mechanism.',$,'IfcReinforcingBar,IfcReinforcingMesh',(#2331,#2332,#2333,#2334,#2335,#2336,#2337,#2338,#2339,#2340,#2341,#2342,#2343,#2344,#2345,#2346,#2347,#2348,#2349,#2350,#2351)); +#2330=IFCPROPERTYSETTEMPLATE('2LD2kY$GD71flgnSUpX$ba',$,'Pset_ReinforcingBarBendingsBECCommon','Definition from IAI: Properties expressing the bending information of non-prestressed reinforcing bars. The properties in this Pset are defined according to the local Finnish BEC standard with minor adjustements (only bar bending information is included). The bending shape property definitions apply to both reinforcing bars (IfcReinforcingBar) and reinforcing meshes (IfcReinforcingMesh). It is presumed that a single standard for defining the bar bending is used throughout the project and that this standard is referenced from the IfcProject object through the IfcDocumentReference mechanism.',.PSET_OCCURRENCEDRIVEN.,'IfcReinforcingBar,IfcReinforcingMesh',(#2331,#2332,#2333,#2334,#2335,#2336,#2337,#2338,#2339,#2340,#2341,#2342,#2343,#2344,#2345,#2346,#2347,#2348,#2349,#2350,#2351)); #2331=IFCSIMPLEPROPERTYTEMPLATE('23Cl89PHHD3RirGHiuDS$1',$,'BECBarShapeCode','The bending type code for the specific bending shape as defined in the BEC standard. Note: depending on the standardized shape different combinations of following parameters a...e (f...l), TD, u, v, u1, v1, aid_x, and aid_y are used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2332=IFCSIMPLEPROPERTYTEMPLATE('2oH548fDz60gdXv5SB_h0$',$,'BECCuttingLength','Usually calculated from the sum of the partial length parameters with corrections for the bendings.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2333=IFCSIMPLEPROPERTYTEMPLATE('1Oaa$9NdHAff_G$8lcx6VQ',$,'BECShapeParameter_a','Bar shape parameter a.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -2356,7 +2356,7 @@ DATA; #2349=IFCSIMPLEPROPERTYTEMPLATE('0$cG7sYCTFFOQMFEJAkpRt',$,'BECShapeAid_x','Bar shape measure aid x.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2350=IFCSIMPLEPROPERTYTEMPLATE('2yccPqM2XCmf2K7g0IQew9',$,'BECShapeAid_y','Bar shape measure aid y.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2351=IFCSIMPLEPROPERTYTEMPLATE('3osRyTTfrCr9qbZwaq8ggo',$,'BECRollerDiameter','Diameter of bending roller.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2352=IFCPROPERTYSETTEMPLATE('3jsIqNYi13X9X9KYwqTW$t',$,'Pset_ReinforcingBarBendingsBS8666Common','Definition from IAI: Properties expressing the bending information of non-prestressed reinforcing bars. The properties in this Pset are largely defined according to BS8666. It is presumed that a single standard for defining the bar bending is used throughout the project and that this standard is referenced from the IfcProject object through the IfcDocumentReference mechanism.',$,'IfcReinforcingBar',(#2353,#2354,#2355,#2356,#2357,#2358,#2359)); +#2352=IFCPROPERTYSETTEMPLATE('3jsIqNYi13X9X9KYwqTW$t',$,'Pset_ReinforcingBarBendingsBS8666Common','Definition from IAI: Properties expressing the bending information of non-prestressed reinforcing bars. The properties in this Pset are largely defined according to BS8666. It is presumed that a single standard for defining the bar bending is used throughout the project and that this standard is referenced from the IfcProject object through the IfcDocumentReference mechanism.',.PSET_OCCURRENCEDRIVEN.,'IfcReinforcingBar',(#2353,#2354,#2355,#2356,#2357,#2358,#2359)); #2353=IFCSIMPLEPROPERTYTEMPLATE('2c8YHTuNDDVeD5kqEwBZcJ',$,'BS8666ShapeCode','The bending type code for the specific bending shape as defined in the BS8666 standard. Note: depending on the standardized shape different combinations of following parameters A...E and r are used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2354=IFCSIMPLEPROPERTYTEMPLATE('1IBWlzQE59SRlBUl1FvciP',$,'BS8666ShapeParameter_A','Bar shape parameter A.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2355=IFCSIMPLEPROPERTYTEMPLATE('0KZUMVK4r7zgyUvkKPKCdS',$,'BS8666ShapeParameter_B','Bar shape parameter B.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -2364,7 +2364,7 @@ DATA; #2357=IFCSIMPLEPROPERTYTEMPLATE('1I$sYzHTzD1Oy$WX2pTZR6',$,'BS8666ShapeParameter_D','Bar shape parameter D.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2358=IFCSIMPLEPROPERTYTEMPLATE('3g9qxg7Gj2nfLqpcqA6rSq',$,'BS8666ShapeParameter_E','Bar shape parameter E.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2359=IFCSIMPLEPROPERTYTEMPLATE('1doqyJP6f37xW9dXzpZEZH',$,'BS8666ShapeParameter_r','Bar shape parameter r. Used for bending radius.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2360=IFCPROPERTYSETTEMPLATE('36pta5QTrCdOpYI9jlNyO0',$,'Pset_ReinforcingBarBendingsDIN135610Common','Definition from IAI: Properties expressing the bending information of non-prestressed reinforcing bars. The properties in this Pset are largely defined according to DIN 1356 Teil 10 with some minor omissions: the shape type X2 is not considered since it is better represented by the explicit shape geometry. It is presumed that a single standard for defining the bar bending is used throughout the project and that this standard is referenced from the IfcProject object through the IfcDocumentReference mechanism. Note: This bending standard is presumably to be replaced by the upcoming ISO 3766 standard. ',$,'IfcReinforcingBar',(#2361,#2362,#2363,#2364,#2365,#2366,#2367)); +#2360=IFCPROPERTYSETTEMPLATE('36pta5QTrCdOpYI9jlNyO0',$,'Pset_ReinforcingBarBendingsDIN135610Common','Definition from IAI: Properties expressing the bending information of non-prestressed reinforcing bars. The properties in this Pset are largely defined according to DIN 1356 Teil 10 with some minor omissions: the shape type X2 is not considered since it is better represented by the explicit shape geometry. It is presumed that a single standard for defining the bar bending is used throughout the project and that this standard is referenced from the IfcProject object through the IfcDocumentReference mechanism. Note: This bending standard is presumably to be replaced by the upcoming ISO 3766 standard. ',.PSET_OCCURRENCEDRIVEN.,'IfcReinforcingBar',(#2361,#2362,#2363,#2364,#2365,#2366,#2367)); #2361=IFCSIMPLEPROPERTYTEMPLATE('2_Toz9k7X0GQFzBGEzoEqJ',$,'DIN135610ShapeCode','The bending type code for the specific bending shape as defined in the DIN 1356 Teil 10 standard. Note: depending on the standardized shape different combinations of following parameters a...z are used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2362=IFCSIMPLEPROPERTYTEMPLATE('02iUzdbPT4h9aIGv6_Av4c',$,'DIN135610ShapeParameter_a','Bar shape parameter a. Note: this parameter is also used for parameter a0 (shape code B3)',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2363=IFCSIMPLEPROPERTYTEMPLATE('0urD900A186Orf9XXJZG7k',$,'DIN135610ShapeParameter_b','Bar shape parameter b. Note: this parameter is also used for parameter b0 (shape codes C2 and C3)',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -2372,7 +2372,7 @@ DATA; #2365=IFCSIMPLEPROPERTYTEMPLATE('2cfDaOI2f6VfKkaixQS29j',$,'DIN135610ShapeParameter_d','Bar shape parameter d. Note: this parameter is also used for parameter d0 (shape code B3)',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2366=IFCSIMPLEPROPERTYTEMPLATE('2YJgCySwb0Xe3oOMJY3w$s',$,'DIN135610ShapeParameter_e','Bar shape parameter e. Note: this parameter is also used for parameter e0 (shape codes A4 and C3)',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2367=IFCSIMPLEPROPERTYTEMPLATE('2gcbqJKlT4Jwp5yETVXad7',$,'DIN135610ShapeParameter_z','Bar shape parameter z.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2368=IFCPROPERTYSETTEMPLATE('2WndF8ehbBDAOeZlzV5_MF',$,'Pset_ReinforcingBarBendingsISOCD3766Common','Definition from IAI: Properties expressing the bending information of non-prestressed reinforcing bars. The properties in this Pset are largely defined according to ISO/CD 3766 with some minor changes in how the hooks are defined (explicit angle measures instead of coded parameters). It is presumed that a single standard for defining the bar bending is used throughout the project and that this standard is referenced from the IfcProject object through the IfcDocumentReference mechanism. Note: This standard is still under development and the Pset will be changed accordingly if so required.',$,'IfcReinforcingBar',(#2369,#2370,#2371,#2372,#2373,#2374,#2375,#2376,#2377)); +#2368=IFCPROPERTYSETTEMPLATE('2WndF8ehbBDAOeZlzV5_MF',$,'Pset_ReinforcingBarBendingsISOCD3766Common','Definition from IAI: Properties expressing the bending information of non-prestressed reinforcing bars. The properties in this Pset are largely defined according to ISO/CD 3766 with some minor changes in how the hooks are defined (explicit angle measures instead of coded parameters). It is presumed that a single standard for defining the bar bending is used throughout the project and that this standard is referenced from the IfcProject object through the IfcDocumentReference mechanism. Note: This standard is still under development and the Pset will be changed accordingly if so required.',.PSET_OCCURRENCEDRIVEN.,'IfcReinforcingBar',(#2369,#2370,#2371,#2372,#2373,#2374,#2375,#2376,#2377)); #2369=IFCSIMPLEPROPERTYTEMPLATE('0yHKDTIBP0rRuY6eirpQ02',$,'ISOCD3766ShapeCode','The bending type code for the specific bending shape as defined in the ISO/CD 3766 standard. Note: depending on the standardized shape different combinations of following parameters a...e and R are used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #2370=IFCSIMPLEPROPERTYTEMPLATE('0SdwiJBmL55Qwi00iW0rec',$,'ISOCD3766ShapeParameter_a','Bar shape parameter a.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #2371=IFCSIMPLEPROPERTYTEMPLATE('1UOYRO36HDlvJ64L$RhmTi',$,'ISOCD3766ShapeParameter_b','Bar shape parameter b.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); From ce26d931c1cc4add4541d9256b8de80a8dacb377 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 28 May 2024 18:01:33 +0500 Subject: [PATCH 318/429] regenerate ifc4x3 pset templates after the release Change log Different props in pset 'Pset_BuildingCommon': - new props: ElevationOfTerrain, ElevationOfRefHeight New template 'Pset_DoorLiningProperties' with props: LiningDepth, LiningThickness, ThresholdDepth, ThresholdThickness, TransomThickness, TransomOffset, LiningOffset, ThresholdOffset, CasingThickness, CasingDepth, LiningToPanelOffsetX, LiningToPanelOffsetY New template 'Pset_DoorPanelProperties' with props: PanelDepth, PanelOperation, PanelWidth, PanelPosition New template 'Pset_PermeableCoveringProperties' with props: OperationType, PanelPosition, FrameDepth, FrameThickness Different props in pset 'Pset_Stationing': - new props: HasIncreasingStation New template 'Pset_WindowLiningProperties' with props: LiningDepth, LiningThickness, TransomThickness, MullionThickness, FirstTransomOffset, SecondTransomOffset, FirstMullionOffset, SecondMullionOffset, LiningOffset, LiningToPanelOffsetX, LiningToPanelOffsetY New template 'Pset_WindowPanelProperties' with props: OperationType, PanelPosition, FrameDepth, FrameThickness --- .../util/generate_pset_templates.py | 18 +- .../ifcopenshell/util/schema/Pset_IFC4X3.ifc | 9711 +++++++++-------- 2 files changed, 4888 insertions(+), 4841 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py b/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py index 3a0ac9e681..716f476481 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py +++ b/src/ifcopenshell-python/ifcopenshell/util/generate_pset_templates.py @@ -34,9 +34,9 @@ if not RUN_FROM_DEV_REPO: import shutil BASE_MODULE_PATH = Path(__file__).parent -IFC4x3_HTML_LOCATION = BASE_MODULE_PATH / "IFC4.3-html-iso-release" if not RUN_FROM_DEV_REPO: + IFC4x3_HTML_ZIP_LOCATION = BASE_MODULE_PATH / "annex-a-psd.zip" IFC4x3_OUTPUT_PATH = BASE_MODULE_PATH / "schema/Pset_IFC4X3.ifc" else: IFC4x3_PSD_LOCATION = BASE_MODULE_PATH / "../output/psd" @@ -68,20 +68,18 @@ class PsetTemplatesGenerator: print("Starting parsing data for IFC4X3...") if not RUN_FROM_DEV_REPO: - if not IFC4x3_HTML_LOCATION.is_dir(): + if not IFC4x3_HTML_ZIP_LOCATION.is_file(): raise Exception( - f'ISO release for Ifc4.3.0.1 expected to be in folder "{IFC4x3_HTML_LOCATION.resolve()}\\"\n' + f'ISO release for Ifc4.3.2.0 expected to be located in "{IFC4x3_HTML_ZIP_LOCATION.resolve()}"\n' "For generating ifc pset library please either setup docs as described above \n" - "or change IFC4x3_HTML_LOCATION in the script accordingly.\n" + "or change IFC4x3_HTML_ZIP_LOCATION in the script accordingly.\n" "You can download docs from the repository: \n" - "https://github.com/buildingSMART/IFC4.3-html/releases/tag/sep-13-release" + "https://standards.buildingsmart.org/IFC/RELEASE/IFC4_3/HTML/annex-a-psd.zip" ) # unzip the data - if not RUN_FROM_DEV_REPO: - pset_data_zip = IFC4x3_HTML_LOCATION / "IFC/RELEASE/IFC4x3/HTML/annex-a-psd.zip" - pset_data_location = BASE_MODULE_PATH / "temp/annex-a-psd" - with zipfile.ZipFile(pset_data_zip, "r") as fi_zip: - fi_zip.extractall(pset_data_location) + pset_data_location = BASE_MODULE_PATH / "temp/annex-a-psd" + with zipfile.ZipFile(IFC4x3_HTML_ZIP_LOCATION, "r") as fi_zip: + fi_zip.extractall(pset_data_location) else: if not IFC4x3_PSD_LOCATION.is_dir(): raise Exception( diff --git a/src/ifcopenshell-python/ifcopenshell/util/schema/Pset_IFC4X3.ifc b/src/ifcopenshell-python/ifcopenshell/util/schema/Pset_IFC4X3.ifc index 3449d04305..395de9cdba 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/schema/Pset_IFC4X3.ifc +++ b/src/ifcopenshell-python/ifcopenshell/util/schema/Pset_IFC4X3.ifc @@ -1,12 +1,12 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); -FILE_NAME('/dev/null','2023-06-03T10:19:28+05:00',(),(),'IfcOpenShell v0.7.0-476ab506d','IfcOpenShell v0.7.0-476ab506d','Nobody'); -FILE_SCHEMA(('IFC4X3')); +FILE_NAME('/dev/null','2024-05-28T16:56:32+05:00',(),(),'IfcOpenShell v0.7.0-f7c03db75','IfcOpenShell v0.7.0-f7c03db75','Nobody'); +FILE_SCHEMA(('IFC4X3_ADD2')); ENDSEC; DATA; #1=IFCPROJECT('3o$lBN9DX4RRXdKdTLtYz5',$,'IFC4X3 Property Set Templates',$,$,$,$,$,$); -#2=IFCRELDECLARES('3lkFXTb_vDt95nHsqnBqnY',$,$,$,#1,(#3,#7,#11,#15,#24,#29,#32,#35,#38,#41,#59,#77,#82,#101,#107,#115,#151,#163,#173,#179,#184,#189,#192,#194,#200,#205,#214,#219,#224,#238,#244,#261,#266,#274,#277,#282,#285,#293,#299,#311,#314,#325,#328,#336,#346,#363,#367,#370,#380,#382,#385,#388,#403,#411,#422,#424,#437,#442,#447,#454,#460,#464,#466,#468,#470,#484,#488,#495,#504,#508,#510,#513,#522,#524,#542,#559,#583,#587,#609,#619,#643,#645,#651,#655,#664,#670,#678,#685,#693,#697,#710,#719,#723,#731,#733,#738,#749,#766,#776,#778,#786,#791,#795,#799,#801,#803,#810,#817,#820,#824,#827,#829,#837,#852,#868,#884,#896,#908,#917,#921,#926,#935,#939,#943,#952,#958,#965,#976,#982,#996,#1000,#1007,#1033,#1039,#1061,#1064,#1068,#1081,#1084,#1087,#1098,#1108,#1111,#1118,#1149,#1153,#1160,#1168,#1170,#1176,#1183,#1188,#1195,#1200,#1205,#1212,#1216,#1218,#1221,#1235,#1238,#1240,#1248,#1251,#1253,#1255,#1262,#1269,#1272,#1276,#1280,#1282,#1286,#1293,#1307,#1311,#1331,#1339,#1343,#1347,#1355,#1358,#1367,#1375,#1379,#1394,#1406,#1419,#1421,#1431,#1444,#1457,#1478,#1484,#1504,#1508,#1512,#1519,#1523,#1528,#1542,#1545,#1556,#1574,#1579,#1585,#1587,#1591,#1594,#1597,#1606,#1608,#1632,#1635,#1637,#1642,#1650,#1657,#1672,#1676,#1680,#1686,#1694,#1698,#1700,#1703,#1708,#1714,#1718,#1722,#1727,#1751,#1759,#1767,#1771,#1775,#1780,#1786,#1798,#1804,#1825,#1843,#1849,#1861,#1873,#1889,#1896,#1909,#1919,#1936,#1943,#1960,#1972,#1985,#1989,#2003,#2018,#2025,#2028,#2036,#2040,#2052,#2064,#2081,#2084,#2091,#2095,#2099,#2103,#2107,#2111,#2114,#2121,#2125,#2131,#2134,#2142,#2147,#2150,#2154,#2164,#2166,#2168,#2171,#2173,#2180,#2188,#2194,#2196,#2199,#2213,#2218,#2222,#2226,#2238,#2240,#2246,#2256,#2273,#2276,#2280,#2286,#2301,#2305,#2319,#2331,#2338,#2349,#2358,#2363,#2368,#2376,#2388,#2392,#2395,#2404,#2407,#2414,#2418,#2423,#2427,#2434,#2442,#2447,#2453,#2459,#2469,#2478,#2483,#2491,#2501,#2503,#2520,#2537,#2554,#2559,#2568,#2572,#2577,#2588,#2600,#2612,#2624,#2628,#2639,#2643,#2649,#2652,#2659,#2661,#2668,#2673,#2683,#2687,#2694,#2705,#2709,#2712,#2722,#2727,#2736,#2740,#2743,#2753,#2761,#2764,#2769,#2774,#2780,#2793,#2799,#2801,#2811,#2814,#2817,#2822,#2827,#2836,#2839,#2842,#2850,#2855,#2858,#2869,#2872,#2880,#2889,#2899,#2901,#2909,#2930,#2935,#2944,#2951,#2967,#2991,#3017,#3025,#3028,#3040,#3042,#3045,#3050,#3064,#3069,#3074,#3079,#3088,#3096,#3112,#3116,#3134,#3149,#3159,#3177,#3184,#3194,#3203,#3215,#3223,#3226,#3235,#3238,#3246,#3250,#3254,#3270,#3272,#3274,#3282,#3286,#3293,#3299,#3306,#3316,#3322,#3332,#3336,#3343,#3348,#3352,#3359,#3374,#3378,#3391,#3393,#3400,#3406,#3420,#3428,#3443,#3449,#3462,#3470,#3472,#3479,#3484,#3494,#3499,#3514,#3522,#3526,#3529,#3552,#3560,#3565,#3572,#3575,#3584,#3589,#3594,#3603,#3611,#3617,#3623,#3631,#3639,#3645,#3652,#3655,#3660,#3665,#3667,#3671,#3673,#3675,#3691,#3695,#3697,#3703,#3705,#3709,#3713,#3715,#3717,#3720,#3722,#3724,#3726,#3730,#3732,#3735,#3737,#3739,#3751,#3755,#3769,#3771,#3775,#3778,#3795,#3798,#3806,#3821,#3824,#3829,#3834,#3843,#3845,#3853,#3858,#3865,#3868,#3881,#3883,#3887,#3901,#3916,#3921,#3923,#3937,#3944,#3959,#3966,#3979,#3999,#4002,#4007,#4028,#4031,#4039,#4044,#4059,#4074,#4081,#4084,#4088,#4092,#4113,#4127,#4130,#4140,#4142,#4148,#4159,#4162,#4165,#4180,#4183,#4186,#4188,#4198,#4210,#4213,#4218,#4225,#4228,#4234,#4239,#4243,#4250,#4255,#4276,#4280,#4287,#4291,#4295,#4305,#4319,#4322,#4332,#4336,#4356,#4359,#4365,#4367,#4372,#4383,#4390,#4392,#4414,#4416,#4423,#4428,#4436,#4439,#4457,#4466,#4474,#4478,#4483,#4488,#4494,#4497,#4499,#4509,#4515,#4519,#4525,#4529,#4531,#4546,#4548,#4557,#4561,#4563,#4567,#4571,#4574,#4576,#4579,#4583,#4597,#4606,#4617,#4630,#4638,#4642,#4658,#4665,#4679,#4694,#4701,#4705,#4710,#4717,#4723,#4742,#4746,#4752,#4759,#4761,#4765,#4767,#4769,#4771,#4775,#4777,#4787,#4794,#4798,#4806,#4809,#4817,#4819,#4821,#4826,#4828,#4833,#4835,#4837,#4839,#4849,#4851,#4853,#4855,#4858,#4861,#4866,#4868,#4870,#4872,#4879,#4883,#4889,#4891,#4894,#4900,#4905,#4911,#4917,#4919,#4926,#4932,#4934,#4936,#4938,#4940,#4942,#4944,#4946,#4952,#4954,#4956,#4958,#4960,#4962,#4973,#4975,#4977,#4979,#4981,#4987,#4994,#4997,#4999,#5001,#5004,#5010,#5020,#5022,#5028,#5030,#5038,#5041,#5050,#5057,#5065,#5074,#5077,#5079,#5081,#5083,#5087,#5089,#5096,#5102,#5106,#5110,#5112,#5114,#5116,#5121,#5124,#5135,#5139,#5142,#5156,#5160,#5164,#5166,#5170,#5173,#5175,#5179,#5181,#5184,#5186,#5188,#5190,#5194,#5196,#5201,#5213,#5215)); +#2=IFCRELDECLARES('3lkFXTb_vDt95nHsqnBqnY',$,$,$,#1,(#3,#7,#11,#15,#24,#29,#32,#35,#38,#41,#59,#77,#82,#101,#107,#115,#151,#163,#173,#179,#184,#189,#192,#194,#200,#205,#214,#219,#224,#238,#244,#261,#266,#274,#277,#282,#285,#293,#299,#311,#314,#325,#328,#336,#346,#363,#367,#370,#380,#382,#385,#388,#405,#413,#424,#426,#439,#444,#449,#456,#462,#466,#468,#470,#472,#486,#490,#497,#506,#510,#512,#515,#524,#526,#544,#561,#585,#589,#611,#621,#645,#647,#653,#657,#666,#672,#680,#687,#695,#699,#712,#721,#725,#733,#735,#740,#751,#768,#778,#780,#788,#793,#797,#801,#803,#805,#812,#819,#822,#826,#829,#831,#839,#854,#870,#886,#898,#910,#919,#923,#928,#937,#941,#945,#954,#960,#967,#978,#984,#998,#1002,#1009,#1035,#1041,#1063,#1066,#1070,#1083,#1086,#1089,#1100,#1110,#1113,#1120,#1151,#1155,#1162,#1170,#1172,#1178,#1185,#1190,#1197,#1202,#1207,#1214,#1218,#1220,#1223,#1237,#1240,#1242,#1250,#1253,#1255,#1257,#1264,#1271,#1274,#1278,#1282,#1284,#1288,#1295,#1309,#1313,#1333,#1341,#1345,#1349,#1357,#1360,#1369,#1377,#1381,#1396,#1408,#1421,#1423,#1433,#1446,#1459,#1480,#1493,#1500,#1506,#1526,#1530,#1534,#1541,#1545,#1550,#1564,#1567,#1578,#1596,#1601,#1607,#1609,#1613,#1616,#1619,#1628,#1630,#1654,#1657,#1659,#1664,#1672,#1679,#1694,#1698,#1702,#1708,#1716,#1720,#1722,#1725,#1730,#1736,#1740,#1744,#1749,#1773,#1781,#1789,#1793,#1797,#1802,#1808,#1820,#1826,#1847,#1865,#1871,#1883,#1895,#1911,#1918,#1931,#1941,#1958,#1965,#1982,#1994,#2007,#2011,#2025,#2040,#2047,#2050,#2058,#2062,#2074,#2086,#2103,#2106,#2113,#2117,#2121,#2125,#2129,#2133,#2136,#2143,#2147,#2153,#2156,#2164,#2169,#2172,#2176,#2186,#2188,#2190,#2193,#2195,#2202,#2210,#2216,#2218,#2221,#2235,#2240,#2244,#2248,#2260,#2262,#2268,#2278,#2295,#2298,#2302,#2308,#2323,#2327,#2341,#2353,#2360,#2371,#2380,#2385,#2390,#2398,#2410,#2414,#2417,#2426,#2429,#2436,#2440,#2445,#2449,#2456,#2464,#2469,#2475,#2481,#2491,#2500,#2505,#2513,#2523,#2525,#2542,#2559,#2576,#2581,#2590,#2594,#2599,#2610,#2622,#2634,#2646,#2650,#2661,#2665,#2671,#2674,#2681,#2683,#2690,#2695,#2705,#2709,#2716,#2727,#2731,#2734,#2744,#2749,#2758,#2762,#2765,#2775,#2783,#2786,#2791,#2796,#2802,#2815,#2821,#2823,#2833,#2836,#2839,#2846,#2851,#2856,#2865,#2868,#2871,#2879,#2884,#2887,#2898,#2901,#2909,#2918,#2928,#2930,#2938,#2959,#2964,#2973,#2980,#2996,#3020,#3046,#3054,#3057,#3069,#3071,#3074,#3079,#3093,#3098,#3103,#3108,#3117,#3125,#3141,#3145,#3163,#3178,#3188,#3206,#3213,#3223,#3232,#3244,#3252,#3255,#3264,#3267,#3275,#3279,#3283,#3299,#3301,#3303,#3311,#3315,#3322,#3328,#3335,#3345,#3351,#3361,#3365,#3372,#3377,#3381,#3388,#3403,#3407,#3420,#3422,#3429,#3435,#3449,#3457,#3472,#3478,#3491,#3499,#3501,#3508,#3513,#3523,#3528,#3543,#3551,#3555,#3558,#3581,#3589,#3594,#3601,#3604,#3613,#3618,#3623,#3632,#3640,#3646,#3652,#3660,#3668,#3674,#3681,#3684,#3689,#3694,#3696,#3700,#3702,#3704,#3720,#3724,#3726,#3732,#3734,#3738,#3742,#3744,#3746,#3749,#3751,#3753,#3755,#3759,#3761,#3764,#3766,#3768,#3780,#3784,#3798,#3800,#3804,#3807,#3824,#3827,#3835,#3850,#3853,#3858,#3863,#3872,#3874,#3882,#3887,#3894,#3897,#3910,#3912,#3916,#3930,#3945,#3950,#3952,#3966,#3973,#3988,#3995,#4008,#4028,#4031,#4036,#4057,#4060,#4068,#4073,#4088,#4103,#4110,#4113,#4117,#4121,#4142,#4156,#4160,#4170,#4172,#4178,#4189,#4192,#4195,#4210,#4213,#4216,#4218,#4228,#4240,#4243,#4248,#4255,#4258,#4264,#4269,#4273,#4280,#4285,#4306,#4310,#4317,#4321,#4325,#4335,#4349,#4352,#4362,#4366,#4386,#4389,#4395,#4397,#4402,#4413,#4420,#4422,#4444,#4446,#4453,#4458,#4466,#4469,#4487,#4496,#4504,#4508,#4513,#4518,#4524,#4527,#4529,#4539,#4545,#4549,#4555,#4559,#4561,#4576,#4578,#4587,#4591,#4593,#4597,#4601,#4604,#4606,#4609,#4613,#4627,#4636,#4647,#4660,#4668,#4672,#4688,#4695,#4709,#4724,#4731,#4735,#4740,#4747,#4753,#4772,#4784,#4791,#4795,#4801,#4808,#4810,#4814,#4816,#4818,#4820,#4824,#4826,#4836,#4843,#4847,#4855,#4858,#4866,#4868,#4870,#4875,#4877,#4882,#4884,#4886,#4888,#4898,#4900,#4902,#4904,#4907,#4910,#4915,#4917,#4919,#4921,#4928,#4932,#4938,#4940,#4943,#4949,#4954,#4960,#4966,#4968,#4975,#4981,#4983,#4985,#4987,#4989,#4991,#4993,#4995,#5001,#5003,#5005,#5007,#5009,#5011,#5022,#5024,#5026,#5028,#5030,#5036,#5043,#5046,#5048,#5050,#5053,#5059,#5069,#5071,#5077,#5079,#5087,#5090,#5099,#5106,#5114,#5123,#5126,#5128,#5130,#5132,#5136,#5138,#5145,#5151,#5155,#5159,#5161,#5163,#5165,#5170,#5173,#5184,#5188,#5191,#5205,#5209,#5213,#5215,#5219,#5222,#5224,#5228,#5230,#5233,#5235,#5237,#5239,#5243,#5245,#5250,#5262,#5264)); #3=IFCPROPERTYSETTEMPLATE('0O5PVtKJr0vQ1WHIJycdMK',$,'Pset_ActionRequest','An action request is a request for an action to fulfill a need. HISTORY: IFC4: Removed RequestSourceType, RequestDescription, Status',.PSET_OCCURRENCEDRIVEN.,'IfcActionRequest',(#4,#5,#6)); #4=IFCSIMPLEPROPERTYTEMPLATE('3_y4d84qf93h$7sdRv7UT8',$,'RequestSourceLabel','A specific name or label that further qualifies the identity of a request source. In the event of an email, this may be the email address.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #5=IFCSIMPLEPROPERTYTEMPLATE('2BB1KrtHb0Q8GrFZdmqVGN',$,'RequestSourceName','The person making the request, where known.',.P_REFERENCEVALUE.,'IfcPerson',$,$,$,$,$,.READWRITE.); @@ -188,7 +188,7 @@ DATA; #181=IFCSIMPLEPROPERTYTEMPLATE('0EJLI_ahjBoQNvg7Sayh9$',$,'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',$,#182,$,$,$,.READWRITE.); #182=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #183=IFCSIMPLEPROPERTYTEMPLATE('3PGj9ZmuD8iOaicYKL$JXE',$,'AlarmCondition','Table mapping alarm condition identifiers to descriptive labels, which may be used for interpreting Pset_AlarmPHistory.Condition.',.P_TABLEVALUE.,'IfcIdentifier','IfcLabel',$,$,$,$,.READWRITE.); -#184=IFCPROPERTYSETTEMPLATE('1bBigFPHX8wfiGqxL2um0Y',$,'Pset_AlignmentCantSegmentCommon','Properties common to the definition of all instances of alignment cant segment.',.PSET_OCCURRENCEDRIVEN.,'IfcAlignmentSegment',(#185,#186,#187,#188)); +#184=IFCPROPERTYSETTEMPLATE('1bBigFPHX8wfiGqxL2um0Y',$,'Pset_AlignmentCantSegmentCommon','Properties common to the definition of all instances of alignment segment that have designParameters for cant.',.PSET_OCCURRENCEDRIVEN.,'IfcAlignmentSegment',(#185,#186,#187,#188)); #185=IFCSIMPLEPROPERTYTEMPLATE('1ra1Exwtj71hGg$abo6csO',$,'CantDeficiency','Difference between applied cant and a higher equilibrium cant.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #186=IFCSIMPLEPROPERTYTEMPLATE('1WNC_J3VjAlANRfCELPitK',$,'CantEquilibrium','Cant at a particular speed at which the vehicle will have a resultant force perpendicular to the running plane.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #187=IFCSIMPLEPROPERTYTEMPLATE('3wmJGzSHDBqh0RljsGhiCj',$,'StartSmoothingLength','Length for the circular transition change of curvature at the start of the cant segment, measured from the start of the cant segment to the end of the circular transition change of curvature.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -196,15 +196,15 @@ DATA; #189=IFCPROPERTYSETTEMPLATE('3RoHWRq_T9ixRwBIFa_r0Z',$,'Pset_AlignmentVerticalSegmentCommon','Properties common to the definition of all instances of alignment vertical segment.',.PSET_OCCURRENCEDRIVEN.,'IfcAlignmentSegment',(#190,#191)); #190=IFCSIMPLEPROPERTYTEMPLATE('1Nrw0tIPX0v9UPngfNt8w3',$,'StartElevation','Elevation of the start point relative to the mean sea level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #191=IFCSIMPLEPROPERTYTEMPLATE('1dmr5UsT9A1xDMyzJyaBQk',$,'EndElevation','Elevation of the end point relative to the mean sea level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#192=IFCPROPERTYSETTEMPLATE('1atYGS$09DJhlerX$$N7f0',$,'Pset_AnnotationContourLine','Specifies parameters of a standard curve that has a single, consistent measure value.',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation',(#193)); +#192=IFCPROPERTYSETTEMPLATE('1atYGS$09DJhlerX$$N7f0',$,'Pset_AnnotationContourLine','Specifies properties of a standard curve that has a single, consistent measure value.',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation/CONTOURLINE',(#193)); #193=IFCSIMPLEPROPERTYTEMPLATE('32aZkzmLf8NO62luVPqnpi',$,'ContourValue','Value of the elevation of the contour above or below a reference plane.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#194=IFCPROPERTYSETTEMPLATE('0zxz_OHIP7jRGYAsXE298i',$,'Pset_AnnotationLineOfSight','Specifies the properties of the line of sight at a point of connection between two elements. Typically used to define the line of sight visibility at the junction between two roads (particularly between an access road and a public road).',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation',(#195,#196,#197,#198,#199)); +#194=IFCPROPERTYSETTEMPLATE('0zxz_OHIP7jRGYAsXE298i',$,'Pset_AnnotationLineOfSight','Specifies the properties of the line of sight. For example, it can be used to define the line of sight visibility at the junction between two roads (particularly between an access road and a public road); or in the design of a stadium or theatre.',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation',(#195,#196,#197,#198,#199)); #195=IFCSIMPLEPROPERTYTEMPLATE('2nk8R$lcvAWgefbhUDssya',$,'SetbackDistance','Setback distance from the point of connection on the major element along the axis of the minor element (e.g. distance from a public road at which the line of sigfht is measured.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #196=IFCSIMPLEPROPERTYTEMPLATE('09mIv5quPFPgvXkwyyDh5V',$,'VisibleAngleLeft','Angle of visibility to the left of the access.',.P_SINGLEVALUE.,'IfcPositivePlaneAngleMeasure',$,$,$,$,$,.READWRITE.); #197=IFCSIMPLEPROPERTYTEMPLATE('2_1IDv6THCIQkgYJ9otYdo',$,'VisibleAngleRight','Angle of visibility to the right of the access.',.P_SINGLEVALUE.,'IfcPositivePlaneAngleMeasure',$,$,$,$,$,.READWRITE.); #198=IFCSIMPLEPROPERTYTEMPLATE('12zpOIqqX6FAneSuF2m4Iy',$,'RoadVisibleDistanceLeft','Distance visible to the left of the access.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #199=IFCSIMPLEPROPERTYTEMPLATE('2Gwhl5Naz2oQCQzGiiH5ut',$,'RoadVisibleDistanceRight','Distance visible to the right of the access.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#200=IFCPROPERTYSETTEMPLATE('2eHpYNnJ14fv9D0f9tMZnK',$,'Pset_AnnotationSurveyArea','Specifies particular properties of survey methods to be assigned to survey point set or resulting surface patches',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation',(#201,#203,#204)); +#200=IFCPROPERTYSETTEMPLATE('2eHpYNnJ14fv9D0f9tMZnK',$,'Pset_AnnotationSurveyArea','Specifies particular properties of survey methods to be assigned to survey point set or resulting surface patches',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation/SURVEY',(#201,#203,#204)); #201=IFCSIMPLEPROPERTYTEMPLATE('13iGJq9ZL81PYJA2JnRvRY',$,'AcquisitionMethod','The means by which survey data was acquired.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#202,$,$,$,.READWRITE.); #202=IFCPROPERTYENUMERATION('PEnum_AcquisitionMethod',(IFCLABEL('GPS'),IFCLABEL('LASERSCAN_AIRBORNE'),IFCLABEL('LASERSCAN_GROUND'),IFCLABEL('SONAR'),IFCLABEL('THEODOLITE'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET'),IFCLABEL('USERDEFINED')),$); #203=IFCSIMPLEPROPERTYTEMPLATE('3hL7G8yRf13gYI$WZjb8TX',$,'AccuracyQualityObtained','A measure of the accuracy quality of survey points as obtained expressed in percentage terms.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); @@ -340,7 +340,7 @@ DATA; #333=IFCSIMPLEPROPERTYTEMPLATE('0Z6P_W4uH5wAMuiRPGMDaf',$,'BerthingAngle','Angle of approach for the vessel to the berth',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); #334=IFCSIMPLEPROPERTYTEMPLATE('1lA06njo19Gwqj1wyWoZt9',$,'BerthingVelocity','Velocity of the vessel as it berths',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); #335=IFCSIMPLEPROPERTYTEMPLATE('3sTEr7ZEn8PAFTAYFeOdhG',$,'AbnormalBerthingFactor','Risk assessed safety factor',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#336=IFCPROPERTYSETTEMPLATE('0eIDTkhwf97u3qjTpMmjdZ',$,'Pset_BoilerPHistory','Boiler performance history common attributes.\X2\000A\X0\WaterQuality attribute deleted in IFC2x2 Pset Addendum: Use IfcWaterProperties instead. CombustionProductsMaximulLoad and CombustionProductsPartialLoad attributes deleted in IFC2x2 Pset Addendum: Use IfcProductsOfCombustionProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcBoiler',(#337,#338,#339,#340,#341,#342,#343,#344,#345)); +#336=IFCPROPERTYSETTEMPLATE('0eIDTkhwf97u3qjTpMmjdZ',$,'Pset_BoilerPHistory','Boiler performance history common attributes.\X2\000A\X0\WaterQuality attribute deleted in IFC2x2 Pset Addendum: Use IfcMaterialProperties instead. CombustionProductsMaximulLoad and CombustionProductsPartialLoad attributes deleted in IFC2x2 Pset Addendum: Use IfcMaterialProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcBoiler',(#337,#338,#339,#340,#341,#342,#343,#344,#345)); #337=IFCSIMPLEPROPERTYTEMPLATE('1tJw9Mq3HFWQjpXiN6jppt',$,'EnergySourceConsumption','Energy consumption.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #338=IFCSIMPLEPROPERTYTEMPLATE('3t20Q4$7z0lQ_eftkPRbw1',$,'OperationalEfficiency','Operational efficiency: boiler output divided by total energy input (electrical and fuel).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #339=IFCSIMPLEPROPERTYTEMPLATE('1OGx41YTf83umJXvDv425B',$,'CombustionEfficiency','Combustion efficiency under nominal condition.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); @@ -350,7 +350,7 @@ DATA; #343=IFCSIMPLEPROPERTYTEMPLATE('1_tcv3dq13_vFDPuK_jJLY',$,'Load','Boiler real load.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #344=IFCSIMPLEPROPERTYTEMPLATE('14wcQ441HCrfdT8jtWeobc',$,'PrimaryEnergyConsumption','Boiler primary energy source consumption (i.e., the fuel consumed for changing the thermodynamic state of the fluid).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); #345=IFCSIMPLEPROPERTYTEMPLATE('3oI3_Vzk9DQ9Ulk7hpE4CR',$,'AuxiliaryEnergyConsumption','Boiler secondary energy source consumption (i.e., the electricity consumed by electrical devices such as fans and pumps).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#346=IFCPROPERTYSETTEMPLATE('1vzmRPXCzCWBwoOOpZuIeP',$,'Pset_BoilerTypeCommon','Boiler type common attributes.\X2\000A\X0\SoundLevel attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead. PrimaryEnergySource and AuxiliaryEnergySource attributes deleted in IFC2x2 Pset Addendum: Use IfcEnergyProperties, IfcFuelProperties, etc. instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBoiler,IfcBoilerType',(#347,#348,#350,#351,#353,#354,#355,#356,#357,#358,#359,#360,#361)); +#346=IFCPROPERTYSETTEMPLATE('1vzmRPXCzCWBwoOOpZuIeP',$,'Pset_BoilerTypeCommon','Boiler type common attributes.\X2\000A\X0\SoundLevel attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead. PrimaryEnergySource and AuxiliaryEnergySource attributes deleted in IFC2x2 Pset Addendum: Use IfcMaterialProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBoiler,IfcBoilerType',(#347,#348,#350,#351,#353,#354,#355,#356,#357,#358,#359,#360,#361)); #347=IFCSIMPLEPROPERTYTEMPLATE('1K6LpM83r2lgltr0i0wTkn',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #348=IFCSIMPLEPROPERTYTEMPLATE('20KAFZJZv9chW4nOoMGZsr',$,'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',$,#349,$,$,$,.READWRITE.); #349=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); @@ -369,12 +369,12 @@ DATA; #362=IFCPROPERTYENUMERATION('PEnum_EnergySource',(IFCLABEL('COAL'),IFCLABEL('COAL_PULVERIZED'),IFCLABEL('ELECTRICITY'),IFCLABEL('GAS'),IFCLABEL('OIL'),IFCLABEL('PROPANE'),IFCLABEL('WOOD'),IFCLABEL('WOOD_CHIP'),IFCLABEL('WOOD_PELLET'),IFCLABEL('WOOD_PULVERIZED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #363=IFCPROPERTYSETTEMPLATE('2cUFevJrvEWwuf7mhndDwJ',$,'Pset_BoilerTypeSteam','Steam boiler type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBoiler/STEAM,IfcBoilerType/STEAM',(#364,#365,#366)); #364=IFCSIMPLEPROPERTYTEMPLATE('0vREXGjab6WAx2OwteUJnF',$,'MaximumOutletPressure','Maximum steam outlet pressure.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#365=IFCSIMPLEPROPERTYTEMPLATE('03aGA5VFn3khDL4iyuOr$I',$,'NominalEfficiencyTable','The nominal efficiency of the boiler as defined by the manufacturer. For steam boilers, a function of inlet temperature versus steam pressure. Note: as two variables are used, DefiningValues and DefinedValues are null, and values are stored in IfcTable in the following order: InletTemperature(IfcThermodynamicTemperatureMeasure) and OutletTemperature(IfcThermodynamicTemperatureMeasure) in DefiningValues, and NominalEfficiency(IfcNormalisedRatioMeasure) in DefinedValues. For example, DefininfValues(InletTemp, OutletTemp), DefinedValues(null, NominalEfficiency). The IfcTable is related to IfcPropertyTableValue using IfcMetric and IfcPropertyConstraintRelationship.',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); -#366=IFCSIMPLEPROPERTYTEMPLATE('14XslhIZf9DfwpAim8Ce7n',$,'HeatOutput','Total nominal heat output as listed by the Boiler manufacturer.\X2\000A000A\X0\For steam boilers, it is a function of inlet temperature versus steam pressure. Note: as two variables are used, DefiningValues and DefinedValues are null, and values are stored in IfcTable in the following order: InletTemperature(IfcThermodynamicTemperatureMeasure) and OutletTemperature(IfcThermodynamicTemperatureMeasure) in DefiningValues, and HeatOutput(IfcEnergyMeasure) in DefinedValues. For example, DefiningValues(InletTemp, OutletTemp), DefinedValues(null, HeatOutput). The IfcTable is related to IfcPropertyTableValue using IfcMetric and IfcPropertyConstraintRelationship.',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcEnergyMeasure',$,$,$,$,.READWRITE.); +#365=IFCSIMPLEPROPERTYTEMPLATE('03aGA5VFn3khDL4iyuOr$I',$,'NominalEfficiencyTable','The nominal efficiency of the boiler as defined by the manufacturer. For steam boilers, a function of inlet temperature versus steam pressure. Note: as two variables are used, DefiningValues and DefinedValues are null, and values are stored in IfcTable in the following order: InletTemperature(IfcThermodynamicTemperatureMeasure) and OutletTemperature(IfcThermodynamicTemperatureMeasure) in DefiningValues, and NominalEfficiency(IfcNormalisedRatioMeasure) in DefinedValues. For example, DefininfValues(InletTemp, OutletTemp), DefinedValues(null, NominalEfficiency). The IfcTable is related to IfcPropertyTableValue using IfcMetric and IfcResourceConstraintRelationship.',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); +#366=IFCSIMPLEPROPERTYTEMPLATE('14XslhIZf9DfwpAim8Ce7n',$,'HeatOutput','Total nominal heat output as listed by the Boiler manufacturer.\X2\000A000A\X0\For steam boilers, it is a function of inlet temperature versus steam pressure. Note: as two variables are used, DefiningValues and DefinedValues are null, and values are stored in IfcTable in the following order: InletTemperature(IfcThermodynamicTemperatureMeasure) and OutletTemperature(IfcThermodynamicTemperatureMeasure) in DefiningValues, and HeatOutput(IfcEnergyMeasure) in DefinedValues. For example, DefiningValues(InletTemp, OutletTemp), DefinedValues(null, HeatOutput). The IfcTable is related to IfcPropertyTableValue using IfcMetric and IfcResourceConstraintRelationship.',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcEnergyMeasure',$,$,$,$,.READWRITE.); #367=IFCPROPERTYSETTEMPLATE('3nUGIFxg581waf2ZABJq_i',$,'Pset_BoilerTypeWater','Water boiler type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBoiler/WATER,IfcBoilerType/WATER',(#368,#369)); -#368=IFCSIMPLEPROPERTYTEMPLATE('3cAUUGuGD2Fh3e2TNS7B7M',$,'NominalEfficiency','Nominal object efficiency under nominal conditions.\X2\000A000A\X0\The nominal efficiency of the boiler as defined by the manufacturer. For water boilers, a function of inlet versus outlet temperature. Note: as two variables are used, DefiningValues and DefinedValues are null, and values are stored in IfcTable in the following order: InletTemperature(IfcThermodynamicTemperatureMeasure), OutletTemperature(IfcThermodynamicTemperatureMeasure), NominalEfficiency(IfcNormalizedRatioMeasure). The IfcTable is related to IfcPropertyTableValue using IfcMetric and IfcPropertyConstraintRelationship.',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); -#369=IFCSIMPLEPROPERTYTEMPLATE('1Uopet$k1CNeGD5E9FNinX',$,'HeatOutput','Total nominal heat output as listed by the Boiler manufacturer.\X2\000A000A\X0\For water boilers, it is a function of inlet versus outlet temperature. For steam boilers, it is a function of inlet temperature versus steam pressure. Note: as two variables are used, DefiningValues and DefinedValues are null, and values are stored in IfcTable in the following order: InletTemperature(IfcThermodynamicTemperatureMeasure), OutletTemperature(IfcThermodynamicTemperatureMeasure), HeatOutput(IfcEnergyMeasure). The IfcTable is related to IfcPropertyTableValue using IfcMetric and IfcPropertyConstraintRelationship.',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcEnergyMeasure',$,$,$,$,.READWRITE.); -#370=IFCPROPERTYSETTEMPLATE('3R7yitlazFsRrSkv$3IPBf',$,'Pset_BoreholeCommon','Properties describing the features of a borehole (If not modelled separately).',.PSET_OCCURRENCEDRIVEN.,'IfcBorehole',(#371,#373,#374,#375,#376,#377,#378,#379)); +#368=IFCSIMPLEPROPERTYTEMPLATE('3cAUUGuGD2Fh3e2TNS7B7M',$,'NominalEfficiency','Nominal object efficiency under nominal conditions.\X2\000A000A\X0\The nominal efficiency of the boiler as defined by the manufacturer. For water boilers, a function of inlet versus outlet temperature. Note: as two variables are used, DefiningValues and DefinedValues are null, and values are stored in IfcTable in the following order: InletTemperature(IfcThermodynamicTemperatureMeasure), OutletTemperature(IfcThermodynamicTemperatureMeasure), NominalEfficiency(IfcNormalisedRatioMeasure). The IfcTable is related to IfcPropertyTableValue using IfcMetric and IfcResourceConstraintRelationship.',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); +#369=IFCSIMPLEPROPERTYTEMPLATE('1Uopet$k1CNeGD5E9FNinX',$,'HeatOutput','Total nominal heat output as listed by the Boiler manufacturer.\X2\000A000A\X0\For water boilers, it is a function of inlet versus outlet temperature. For steam boilers, it is a function of inlet temperature versus steam pressure. Note: as two variables are used, DefiningValues and DefinedValues are null, and values are stored in IfcTable in the following order: InletTemperature(IfcThermodynamicTemperatureMeasure), OutletTemperature(IfcThermodynamicTemperatureMeasure), HeatOutput(IfcEnergyMeasure). The IfcTable is related to IfcPropertyTableValue using IfcMetric and IfcResourceConstraintRelationship.',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcEnergyMeasure',$,$,$,$,.READWRITE.); +#370=IFCPROPERTYSETTEMPLATE('3R7yitlazFsRrSkv$3IPBf',$,'Pset_BoreholeCommon','Properties describing the features of a borehole (if not modelled separately).',.PSET_OCCURRENCEDRIVEN.,'IfcBorehole',(#371,#373,#374,#375,#376,#377,#378,#379)); #371=IFCSIMPLEPROPERTYTEMPLATE('3WDrEI1db9LASwd7bZ2T9j',$,'BoreholeState','The state the borehole or trial pit has been left in. (boreholeML).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#372,$,$,$,.READWRITE.); #372=IFCPROPERTYENUMERATION('PEnum_BoreholeState',(IFCLABEL('CAP_REPLACED'),IFCLABEL('CASING_INSTALLED'),IFCLABEL('CASING_PARTIALLY_REPLACED'),IFCLABEL('CASING_REPLACED'),IFCLABEL('CHAMBER_RECONDITIONED'),IFCLABEL('DECONSTRUCTED'),IFCLABEL('INSTALLED'),IFCLABEL('PARTIALLY_DECONSTRUCTED'),IFCLABEL('PARTIALLY_REFILLED'),IFCLABEL('RECONDITIONED'),IFCLABEL('REFILLED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); #373=IFCSIMPLEPROPERTYTEMPLATE('0ubOvMDX1Dnfkoc3joIXVN',$,'CapDepth','Depth of cap (boreholeML).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); @@ -383,16 +383,16 @@ DATA; #376=IFCSIMPLEPROPERTYTEMPLATE('0yp6htb8TCoOjDrS8MOdsx',$,'FillingMaterial','Filling material or ''NOT FILLED'' or ''UNKNOWN'' (boreholeML).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #377=IFCSIMPLEPROPERTYTEMPLATE('1rTgHFHaT8684uP__4QcWm',$,'GroundwaterDepth','Depth groundwater encountered (boreholeML).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #378=IFCSIMPLEPROPERTYTEMPLATE('3L57DOXJbCB888gE49fZUC',$,'LiningMaterial','Lining material or ''NOT LINED'' or ''UNKNOWN'' (boreholeML).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#379=IFCSIMPLEPROPERTYTEMPLATE('1F7UcZUhXFrOsiX7F23Q3_',$,'LiningThickness','Lining thickness (boreholeML).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#379=IFCSIMPLEPROPERTYTEMPLATE('1F7UcZUhXFrOsiX7F23Q3_',$,'LiningThickness','Thickness of the lining.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); #380=IFCPROPERTYSETTEMPLATE('1ZhMfKopf8RwVqIXtOfq4b',$,'Pset_BoundedCourseCommon','Properties for a bounded course.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCourse,IfcCourseType',(#381)); #381=IFCSIMPLEPROPERTYTEMPLATE('2E5Pr2lnLEreE9MQBgZzDs',$,'SpreadingRate','The nominal overall mass of material per area covered by the course.',.P_SINGLEVALUE.,'IfcNumericMeasure',$,$,$,$,$,.READWRITE.); #382=IFCPROPERTYSETTEMPLATE('2MdyvF4p59nQ3C83sdn5hZ',$,'Pset_BreakwaterCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to BREAKWATER.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/BREAKWATER',(#383,#384)); #383=IFCSIMPLEPROPERTYTEMPLATE('2ZvJ0z2dLDKBTU9MvdwRWK',$,'StructuralStyle','Structural style of the element',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #384=IFCSIMPLEPROPERTYTEMPLATE('2$Spf0NT5CD8NNvcnZPeuG',$,'Elevation','Elevation of the entity',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); #385=IFCPROPERTYSETTEMPLATE('38uKbhc3H9bekQINb6p5xb',$,'Pset_BridgeCommon','Common property set for bridges.',.PSET_OCCURRENCEDRIVEN.,'IfcBridge',(#386)); -#386=IFCSIMPLEPROPERTYTEMPLATE('3VNrp1571BQwSlONoxS61P',$,'StructureIndicator','Structure Indicator',.P_ENUMERATEDVALUE.,'IfcLabel',$,#387,$,$,$,.READWRITE.); +#386=IFCSIMPLEPROPERTYTEMPLATE('3VNrp1571BQwSlONoxS61P',$,'StructureIndicator','The type of bridge structure (composite, coated, homogeneous or other)',.P_ENUMERATEDVALUE.,'IfcLabel',$,#387,$,$,$,.READWRITE.); #387=IFCPROPERTYENUMERATION('PEnum_StructureIndicator',(IFCLABEL('COATED'),IFCLABEL('COMPOSITE'),IFCLABEL('HOMOGENEOUS')),$); -#388=IFCPROPERTYSETTEMPLATE('3UxRooRpT8Z908mOT4ocSC',$,'Pset_BuildingCommon','Properties common to the definition of all instances of IfcBuilding. Please note that several building attributes are handled directly at the IfcBuilding instance, the building number (or short name) by IfcBuilding.Name, the building name (or long name) by IfcBuilding.LongName, and the description (or comments) by IfcBuilding.Description. Actual building quantities, like building perimeter, building area and building volume are provided by IfcElementQuantity, and the building classification according to national building code by IfcClassificationReference.',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#389,#390,#391,#392,#393,#394,#395,#396,#397,#398,#399,#400,#401,#402)); +#388=IFCPROPERTYSETTEMPLATE('3UxRooRpT8Z908mOT4ocSC',$,'Pset_BuildingCommon','Properties common to the definition of all instances of IfcBuilding. Please note that several building attributes are handled directly at the IfcBuilding instance, the building number (or short name) by IfcBuilding.Name, the building name (or long name) by IfcBuilding.LongName, and the description (or comments) by IfcBuilding.Description. Actual building quantities, like building perimeter, building area and building volume are provided by IfcElementQuantity, and the building classification according to national building code by IfcClassificationReference.',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#389,#390,#391,#392,#393,#394,#395,#396,#397,#398,#399,#400,#401,#402,#403,#404)); #389=IFCSIMPLEPROPERTYTEMPLATE('2hFCdUtLP2Che$ixlGDqvX',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #390=IFCSIMPLEPROPERTYTEMPLATE('1WcUJsi0L0qQohfKesSRTG',$,'BuildingID','A unique identifier assigned to a building. A temporary identifier is initially assigned at the time of making a planning application. This temporary identifier is changed to a permanent identifier when the building is registered into a statutory buildings and properties database.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); #391=IFCSIMPLEPROPERTYTEMPLATE('1I2XlaV6P0xeEhL1jxPUJi',$,'IsPermanentID','Indicates whether the identity assigned to the object is permanent (= TRUE) or temporary (=FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); @@ -403,4826 +403,4875 @@ DATA; #396=IFCSIMPLEPROPERTYTEMPLATE('2rN2k8Vxv3Dx43D5TERMey',$,'OccupancyType','Occupancy type for this object.\X2\000A\X0\It is defined according to the presiding national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #397=IFCSIMPLEPROPERTYTEMPLATE('2AKPWGIZX1oBQtC6tB$$KU',$,'GrossPlannedArea','Total planned gross area of the spatial structure element. Used for programming the spatial structure element.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); #398=IFCSIMPLEPROPERTYTEMPLATE('1vndR$MsLEZuWryb8mpS9Z',$,'NetPlannedArea','Total planned net area of the object. Used for programming the object.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#399=IFCSIMPLEPROPERTYTEMPLATE('2CHuju2KHF99QOG7cvRxq3',$,'NumberOfStoreys','The number of storeys within a building.\X2\000A\X0\Captured for those cases where the IfcBuildingStorey entity is not used. Note that if IfcBuilingStorey is asserted and the number of storeys in a building can be determined from it, then this approach should be used in preference to setting a property for the number of storeys.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#399=IFCSIMPLEPROPERTYTEMPLATE('2CHuju2KHF99QOG7cvRxq3',$,'NumberOfStoreys','The number of storeys within a building.\X2\000A\X0\Captured for those cases where the IfcBuildingStorey entity is not used. Note that if IfcBuildingStorey is asserted and the number of storeys in a building can be determined from it, then this approach should be used in preference to setting a property for the number of storeys.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); #400=IFCSIMPLEPROPERTYTEMPLATE('3CAczRnIXCL81yd7P2Nc4d',$,'YearOfConstruction','Year of construction of this building, including expected year of completion.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #401=IFCSIMPLEPROPERTYTEMPLATE('1eU$idP3j5DQ9eL7YDhAME',$,'YearOfLastRefurbishment','Year of last major refurbishment, or reconstruction, of the building (applies to reconstruction works).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #402=IFCSIMPLEPROPERTYTEMPLATE('2$GcxJQYL9ZABRfVCnRd_v',$,'IsLandmarked','This builing is listed as a historic building (TRUE), or not (FALSE), or unknown.',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); -#403=IFCPROPERTYSETTEMPLATE('0URpFS9DPD1fZKTkz_JOUj',$,'Pset_BuildingElementProxyCommon','Common properties for built elements that don''t have a specific entity name.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBuildingElementProxy,IfcBuildingElementProxyType',(#404,#405,#407,#408,#409,#410)); -#404=IFCSIMPLEPROPERTYTEMPLATE('3NgydhdUvFTwhYQM5feBUS',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#405=IFCSIMPLEPROPERTYTEMPLATE('3ln3rfPQvEABFv8WdTjCDf',$,'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',$,#406,$,$,$,.READWRITE.); -#406=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#407=IFCSIMPLEPROPERTYTEMPLATE('3u19FpAfn2PPa0Bhnrn$cF',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#408=IFCSIMPLEPROPERTYTEMPLATE('0xj6XqNVH0_RbI_UL$ornH',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#409=IFCSIMPLEPROPERTYTEMPLATE('0G_wrQCn14CfCk_eQ6gzVI',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#410=IFCSIMPLEPROPERTYTEMPLATE('1$$g1aw0r9uRhYbf0h3BdZ',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#411=IFCPROPERTYSETTEMPLATE('1yQB96GrHAsfJH2I_lSJqt',$,'Pset_BuildingStoreyCommon','Properties common to the definition of all instances of IfcBuildingStorey. Please note that several building attributes are handled directly at the IfcBuildingStorey instance, the building storey number (or short name) by IfcBuildingStorey.Name, the building storey name (or long name) by IfcBuildingStorey.LongName, and the description (or comments) by IfcBuildingStorey.Description. Actual building storey quantities, like building storey perimeter, building storey area and building storey volume are provided by IfcElementQuantity, and the building storey classification according to national building code by IfcClassificationReference.',.PSET_OCCURRENCEDRIVEN.,'IfcBuildingStorey',(#412,#413,#414,#415,#416,#417,#418,#419,#420,#421)); -#412=IFCSIMPLEPROPERTYTEMPLATE('0W4vXqJ8z54gRCsfeMuYDC',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#413=IFCSIMPLEPROPERTYTEMPLATE('1sUehS_GD5HP_xISveShzv',$,'EntranceLevel','Indication whether this building storey is an entrance level to the building (TRUE), or (FALSE) if otherwise.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#414=IFCSIMPLEPROPERTYTEMPLATE('0DpqDoR9PAKBH8oYGi0lgw',$,'AboveGround','Indication whether this building storey is fully above ground (TRUE), or below ground (FALSE), or partially above and below ground (UNKNOWN) - as in sloped terrain.',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); -#415=IFCSIMPLEPROPERTYTEMPLATE('1WQMa6OWr1jPHcU_LRKSo8',$,'SprinklerProtection','Indication whether this object is sprinkler protected (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#416=IFCSIMPLEPROPERTYTEMPLATE('2oWo80cTPEcefgc0C1RYJF',$,'SprinklerProtectionAutomatic','Indication whether this object has an automatic sprinkler protection (TRUE) or not (FALSE).\X2\000A\X0\It should only be given, if the property "SprinklerProtection" is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#417=IFCSIMPLEPROPERTYTEMPLATE('1eG4aVIqv1LOJuREtiomob',$,'LoadBearingCapacity','Maximum load bearing capacity of the floor structure throughtout the storey as designed.',.P_SINGLEVALUE.,'IfcPlanarForceMeasure',$,$,$,$,$,.READWRITE.); -#418=IFCSIMPLEPROPERTYTEMPLATE('3lHyFtcCH7dwi78zKtKrMr',$,'GrossPlannedArea','Total planned gross area of the spatial structure element. Used for programming the spatial structure element.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#419=IFCSIMPLEPROPERTYTEMPLATE('0XSsy$an55IuMLlrkwzV3$',$,'NetPlannedArea','Total planned net area of the object. Used for programming the object.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#420=IFCSIMPLEPROPERTYTEMPLATE('330K7BvQf9Hf5qUq6XioLo',$,'ElevationOfSSLRelative','Elevation of the top surface of the structural slab level given in elevation above the local zero height. If the level varies and there is no significantly more prominent elevation, then this property may be omitted. In case of any inconsistency with the geometric positioning of the top surface, the geometric representation takes precedence.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#421=IFCSIMPLEPROPERTYTEMPLATE('2jCsCfVHX0SO_qboT7XtSz',$,'ElevationOfFFLRelative','Elevation of the top surface of the finished floor level given in elevation above the local zero height. If the level varies and there is no significantly more prominent elevation, then this property may be omitted. In case of any inconsistency with the geometric positioning of the top surface, the geometric representation takes precedence.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#422=IFCPROPERTYSETTEMPLATE('2jwC1HqGXFIQgI$UC3sX51',$,'Pset_BuildingSystemCommon','Properties common to the definition of building systems.',.PSET_OCCURRENCEDRIVEN.,'IfcBuildingSystem',(#423)); -#423=IFCSIMPLEPROPERTYTEMPLATE('3gFQuJ_7P8MOGQZmi3qkzK',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#424=IFCPROPERTYSETTEMPLATE('2se$xLvPX8ugoAd9buxAlg',$,'Pset_BuildingUse','Provides information on on the real estate context of the building of interest both current and anticipated.',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#425,#426,#427,#428,#429,#430,#431,#432,#433,#434,#435,#436)); -#425=IFCSIMPLEPROPERTYTEMPLATE('36eOvFxlz5TevzshgEDTbF',$,'MarketCategory','Category of use e.g. residential, commercial, recreation etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#426=IFCSIMPLEPROPERTYTEMPLATE('3RkGHGhJ1Dw8zj8ga71ASR',$,'MarketSubCategory','Subset of category of use e.g. multi-family, 2 bedroom, low rise.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#427=IFCSIMPLEPROPERTYTEMPLATE('1iWxd3TlrE2uJgBH4tmsot',$,'PlanningControlStatus','Label of zoning category or class, or planning control category for the site or facility.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#428=IFCSIMPLEPROPERTYTEMPLATE('2wXE$uZR173uGm8kbLxGHp',$,'NarrativeText','Added information relating to the adjacent building use that is not appropriate to the general descriptive text associated with an entity through the inherited IfcRoot.Description.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#429=IFCSIMPLEPROPERTYTEMPLATE('1fNYTiO8D0eAt0Y3337mTZ',$,'VacancyRateInCategoryNow','Percentage of vacancy found in the particular category currently.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#430=IFCSIMPLEPROPERTYTEMPLATE('0tRahMCrnAaRX3JvlYJLrU',$,'TenureModesAvailableNow','A list of the tenure modes that are currently available expressed in terms of IfcLabel.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#431=IFCSIMPLEPROPERTYTEMPLATE('1bh87tcpr9XAaig1GfXkax',$,'MarketSubCategoriesAvailableNow','A list of the sub categories of property that are currently available expressed in terms of IfcLabel.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#432=IFCSIMPLEPROPERTYTEMPLATE('0uUieJHPj66vC7UXbEigKr',$,'RentalRatesInCategoryNow','Range of the cost rates for property currently available in the required category.',.P_BOUNDEDVALUE.,'IfcMonetaryMeasure',$,$,$,$,$,.READWRITE.); -#433=IFCSIMPLEPROPERTYTEMPLATE('0vux3cwQL3HO5o4wBaQjoS',$,'VacancyRateInCategoryFuture','Percentage of vacancy found in the particular category expected in the future.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#434=IFCSIMPLEPROPERTYTEMPLATE('05FtugkrzAQumKzvtWvtJ$',$,'TenureModesAvailableFuture','A list of the tenure modes that are expected to be available in the future expressed in terms of IfcLabel.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#435=IFCSIMPLEPROPERTYTEMPLATE('16XmFZg$T8rvwixKOe$rMK',$,'MarketSubCategoriesAvailableFuture','A list of the sub categories of property that are expected to be available in the future expressed in terms of IfcLabel.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#436=IFCSIMPLEPROPERTYTEMPLATE('3GFGMzbXTAqO1ulYc55xTM',$,'RentalRatesInCategoryFuture','Range of the cost rates for property expected to be available in the future in the required category.',.P_BOUNDEDVALUE.,'IfcMonetaryMeasure',$,$,$,$,$,.READWRITE.); -#437=IFCPROPERTYSETTEMPLATE('0Q3ZD3C8HFUPdB3l9o1a_m',$,'Pset_BuildingUseAdjacent','Provides information on adjacent buildings and their uses to enable their impact on the building of interest to be determined. Note that for each instance of the property set used, where there is an existence of risk, there will be an instance of the property set Pset_Risk (q.v).',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#438,#439,#440,#441)); -#438=IFCSIMPLEPROPERTYTEMPLATE('1FjO5Dqon5rw$NwpYYh$d0',$,'MarketCategory','Category of use e.g. residential, commercial, recreation etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#439=IFCSIMPLEPROPERTYTEMPLATE('0EtV4QYaf88Rmaet5LgICf',$,'MarketSubCategory','Subset of category of use e.g. multi-family, 2 bedroom, low rise.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#440=IFCSIMPLEPROPERTYTEMPLATE('3zqwIKyzXBgO7WyArignaX',$,'PlanningControlStatus','Label of zoning category or class, or planning control category for the site or facility.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#441=IFCSIMPLEPROPERTYTEMPLATE('3M$wPUpDrD$gtl5eBTr238',$,'NarrativeText','Added information relating to the adjacent building use that is not appropriate to the general descriptive text associated with an entity through the inherited IfcRoot.Description.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#442=IFCPROPERTYSETTEMPLATE('2B4OnLraPCpOMisqH9cQtw',$,'Pset_BuiltSystemRailwayLine','Properties common to the definition of a railway line system, which is a set of functional tracks with explicit terminals. It is usually composed of a set of tracks with continuous track parts and alignments.',.PSET_OCCURRENCEDRIVEN.,'IfcBuiltSystem/RAILWAYLINE',(#443,#444,#445)); -#443=IFCSIMPLEPROPERTYTEMPLATE('18UszdKQL7MvOXobLrWqgF',$,'LineID','The unique identifier of the line.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#444=IFCSIMPLEPROPERTYTEMPLATE('1BRrqg$1j3axZ8Q0GZrqKQ',$,'IsElectrified','Indicates whether the track system is electrified or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#445=IFCSIMPLEPROPERTYTEMPLATE('3sHxj_wL12pw09i$UZtOT8',$,'LineCharacteristic','Indicates the characteristic of the line.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#446,$,$,$,.READWRITE.); -#446=IFCPROPERTYENUMERATION('PEnum_LineCharacteristic',(IFCLABEL('ENTERDEPOT'),IFCLABEL('EXITDEPOT'),IFCLABEL('FREIGHT'),IFCLABEL('PASSENGER'),IFCLABEL('PASSENGERANDFREIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#447=IFCPROPERTYSETTEMPLATE('3_H$wOTUv2Furxpb5D9REd',$,'Pset_BuiltSystemRailwayTrack','Properties common to the definition of a track system. It is usually composed of continuous sequences of track parts and alignments.',.PSET_OCCURRENCEDRIVEN.,'IfcBuiltSystem/RAILWAYTRACK',(#448,#449,#450,#452)); -#448=IFCSIMPLEPROPERTYTEMPLATE('0Vx9HgRm11hPYoahVzURxg',$,'TrackID','The unique identification number of the track.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#449=IFCSIMPLEPROPERTYTEMPLATE('3ec075glT0Pv9MEx6_4x9A',$,'TrackNumber','Indicates the local identification number of the track.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#450=IFCSIMPLEPROPERTYTEMPLATE('1pmIBiYbP7QPrmBOaug3$W',$,'TrackUsage','The expected primary usage of the track.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#451,$,$,$,.READWRITE.); -#451=IFCPROPERTYENUMERATION('PEnum_TrackUsage',(IFCLABEL('CATCHSIDING'),IFCLABEL('CLASSIFICATIONTRACK'),IFCLABEL('CONNECTINGLINE'),IFCLABEL('FREIGHTTRACK'),IFCLABEL('LOCOMOTIVEHOLDTRACK'),IFCLABEL('LOCOMOTIVERUNNINGTRACK'),IFCLABEL('LOCOMOTIVESERVICETRACK'),IFCLABEL('MAINTRACK'),IFCLABEL('MULTIPLEUNITRUNNINGTRACK'),IFCLABEL('RECEIVINGDEPARTURETRACK'),IFCLABEL('REFUGESIDING'),IFCLABEL('REPAIRSIDING'),IFCLABEL('ROLLINGFORBIDDENTRACK'),IFCLABEL('ROLLINGTRACK'),IFCLABEL('ROUNDABOUTLINE'),IFCLABEL('STORAGETRACK'),IFCLABEL('SWITCHINGLEAD'),IFCLABEL('UNTWININGLINE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#452=IFCSIMPLEPROPERTYTEMPLATE('0WaOTELkL6gfvpiUnM1MGs',$,'TrackCharacteristic','Indicates the characteristic of the track.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#453,$,$,$,.READWRITE.); -#453=IFCPROPERTYENUMERATION('PEnum_TrackCharacteristic',(IFCLABEL('FUNICULAR'),IFCLABEL('NORMAL'),IFCLABEL('RACK'),IFCLABEL('RIGIDOVERHEAD'),IFCLABEL('THIRDRAIL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#454=IFCPROPERTYSETTEMPLATE('1EdUnQb39DGvvapepRMS5V',$,'Pset_BurnerTypeCommon','Common attributes of burner types.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBurner,IfcBurnerType',(#455,#456,#458)); -#455=IFCSIMPLEPROPERTYTEMPLATE('3B8RS0Ov94HuOVgv8CkVn1',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#456=IFCSIMPLEPROPERTYTEMPLATE('2i19Nxlg1FwBycmImbVlBj',$,'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',$,#457,$,$,$,.READWRITE.); -#457=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#458=IFCSIMPLEPROPERTYTEMPLATE('0yEdAvZQbEpQ_pWb6xlbfP',$,'EnergySource','Enumeration defining the energy source or fuel cumbusted.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#459,$,$,$,.READWRITE.); -#459=IFCPROPERTYENUMERATION('PEnum_EnergySource',(IFCLABEL('COAL'),IFCLABEL('COAL_PULVERIZED'),IFCLABEL('ELECTRICITY'),IFCLABEL('GAS'),IFCLABEL('OIL'),IFCLABEL('PROPANE'),IFCLABEL('WOOD'),IFCLABEL('WOOD_CHIP'),IFCLABEL('WOOD_PELLET'),IFCLABEL('WOOD_PULVERIZED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#460=IFCPROPERTYSETTEMPLATE('1Y0ZnBp9PF$hhMRTo2FFiL',$,'Pset_CableCarrierFittingTypeCommon','Common properties for cable carrier fittings. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierFitting,IfcCableCarrierFittingType',(#461,#462)); -#461=IFCSIMPLEPROPERTYTEMPLATE('2S4xYptCX9phGURM2F1yYr',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#462=IFCSIMPLEPROPERTYTEMPLATE('3pK0qvfZn1SOv8X4Kz7xdQ',$,'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',$,#463,$,$,$,.READWRITE.); -#463=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#464=IFCPROPERTYSETTEMPLATE('0H6RHh3brEQuDNwjxYBia$',$,'Pset_CableCarrierSegmentTypeCableLadderSegment','An open carrier segment on which cables are carried on a ladder structure.\X2\000A\X0\HISTORY: IFC4 - NominalLength deleted. To be handled as a quantity measure.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CABLELADDERSEGMENT,IfcCableCarrierSegmentType/CABLELADDERSEGMENT',(#465)); -#465=IFCSIMPLEPROPERTYTEMPLATE('1WMwFzIYD9ZhxK1s1_CBLX',$,'LadderConfiguration','Description of the configuration of the ladder structure used.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#466=IFCPROPERTYSETTEMPLATE('2NkasFCTb8rw3SYDe$lK2T',$,'Pset_CableCarrierSegmentTypeCableTraySegment','An (typically) open carrier segment onto which cables are laid.\X2\000A\X0\HISTORY: IFC4 - NominalLength deleted. To be handled as a quantity measure',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CABLETRAYSEGMENT,IfcCableCarrierSegmentType/CABLETRAYSEGMENT',(#467)); -#467=IFCSIMPLEPROPERTYTEMPLATE('383r$0_gP22hLxU_nBgxZV',$,'HasCover','Indication of whether the cable tray has a cover (=TRUE) or not (= FALSE). By default, this value should be set to FALSE..',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#468=IFCPROPERTYSETTEMPLATE('21tWSPILLFUvC2HqDmQwk4',$,'Pset_CableCarrierSegmentTypeCableTrunkingSegment','An enclosed carrier segment with one or more compartments into which cables are placed.\X2\000A\X0\HISTORY: IFC4 - NominalLength deleted. To be handled as a quantity measure',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CABLETRUNKINGSEGMENT,IfcCableCarrierSegmentType/CABLETRUNKINGSEGMENT',(#469)); -#469=IFCSIMPLEPROPERTYTEMPLATE('0IoOpWbgP8LRCBh5f06Pyc',$,'NumberOfCompartments','The number of separate internal compartments within the trunking.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#470=IFCPROPERTYSETTEMPLATE('0Tqww0BVX4buMt1Bd_dESC',$,'Pset_CableCarrierSegmentTypeCatenaryWire','Properties of a catenary wire, which is a longtitudinal wire supporting the grooved contact wires. Properties in this property set are applicable to a type or an occurrence ifcCableCarrierSegment with predefined type of CATENARYWIRE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CATENARYWIRE,IfcCableCarrierSegmentType/CATENARYWIRE',(#471,#472,#473,#474,#475,#476,#477,#478,#479,#480,#481,#482,#483)); -#471=IFCSIMPLEPROPERTYTEMPLATE('1$aR1Btbb84AWu2_oD4NY2',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#472=IFCSIMPLEPROPERTYTEMPLATE('3$MFwBd_11nv3VMt2OB7Mr',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#473=IFCSIMPLEPROPERTYTEMPLATE('0uSO0nhh5BTwe3Bi3O6mET',$,'CatenaryWireType','Indicate the type of Catenary wire.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#474=IFCSIMPLEPROPERTYTEMPLATE('1dYWqT0m54dAMDT0W7J3g9',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); -#475=IFCSIMPLEPROPERTYTEMPLATE('1WdinNcTf2iv26vT7bpPLm',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#476=IFCSIMPLEPROPERTYTEMPLATE('1E6XreTbj7CuOWur8LeW08',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#477=IFCSIMPLEPROPERTYTEMPLATE('1NBxjXTG15uQk1C$PXDFg0',$,'LayRatio','The ratio between lay length and the diameter of the single conductor.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#478=IFCSIMPLEPROPERTYTEMPLATE('0Nx5IzQw53jeubxSJ3W8iQ',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); -#479=IFCSIMPLEPROPERTYTEMPLATE('1_Xjau5s9CpxarexBtgfKE',$,'MechanicalTension','Nominal value of mechanical force applied to a flow segment.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#480=IFCSIMPLEPROPERTYTEMPLATE('2KEIKKk5P0qg6NTjkSSUea',$,'PhysicalDescriptionReference','Physical description as external reference of the equipment, including e.g.weight, shape, model, length, height, diameter.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#481=IFCSIMPLEPROPERTYTEMPLATE('1BwWEnWBbDgvjWt2XeUJXQ',$,'StrandingMethod','Specifies the method used to strand the cable. Stranding is the process where a particular number of stranding elements are joined together while winding them round a common axis.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#482=IFCSIMPLEPROPERTYTEMPLATE('2aIk9IGqj8yO7zJwZ3BAnh',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#483=IFCSIMPLEPROPERTYTEMPLATE('0WJV5$WL52OOcGIW1aaA8V',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#484=IFCPROPERTYSETTEMPLATE('0taWa70x52wxwMiK0uZjyv',$,'Pset_CableCarrierSegmentTypeCommon','Common properties for cable carrier segments. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment,IfcCableCarrierSegmentType',(#485,#486)); -#485=IFCSIMPLEPROPERTYTEMPLATE('0w129dAzL2Cho2YMZaKBlA',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#486=IFCSIMPLEPROPERTYTEMPLATE('3i8zQlQyPBIghnNcC3fb_p',$,'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',$,#487,$,$,$,.READWRITE.); -#487=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#488=IFCPROPERTYSETTEMPLATE('3i3Qfv_cTCBRkoyibT$NYf',$,'Pset_CableCarrierSegmentTypeConduitSegment','An enclosed tubular carrier segment through which cables are pulled.\X2\000A\X0\HISTORY: IFC4 - NominalLength deleted. To be handled as a quantity measure.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CONDUITSEGMENT,IfcCableCarrierSegmentType/CONDUITSEGMENT',(#489,#490,#491,#493,#494)); -#489=IFCSIMPLEPROPERTYTEMPLATE('32l_Cx1x54Ke7VARNYze7P',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#490=IFCSIMPLEPROPERTYTEMPLATE('1WBI5W7a18wh5$yFgqAh_a',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#491=IFCSIMPLEPROPERTYTEMPLATE('0HFPXuL3rApAoDiCtpl6uR',$,'ConduitShapeType','The shape of the conduit segment.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#492,$,$,$,.READWRITE.); -#492=IFCPROPERTYENUMERATION('PEnum_ConduitShapeType',(IFCLABEL('CIRCULAR'),IFCLABEL('OVAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#493=IFCSIMPLEPROPERTYTEMPLATE('1lO0ICilHF1RxmD7goFYyg',$,'IsRigid','Indication of whether the conduit is rigid (= TRUE) or flexible (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#494=IFCSIMPLEPROPERTYTEMPLATE('00XsZHdDXFdwVvDdh3kOg7',$,'NominalDiameter','Nominal diameter or width of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#495=IFCPROPERTYSETTEMPLATE('3bccyzKMj7B9Q2cyRCZqwT',$,'Pset_CableCarrierSegmentTypeDropper','Properties that are applicable to a type or an occurrence of dropper.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/DROPPER,IfcCableCarrierSegmentType/DROPPER',(#496,#497,#498,#499,#500,#501,#502,#503)); -#496=IFCSIMPLEPROPERTYTEMPLATE('2sVhWaFtP2$8XSWKBoAA99',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#497=IFCSIMPLEPROPERTYTEMPLATE('1wpUjRpBP1x8iO32wcAj6i',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#498=IFCSIMPLEPROPERTYTEMPLATE('1ey8S_Daz4j92r7qsRUyO8',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#499=IFCSIMPLEPROPERTYTEMPLATE('1SYgOdgtP21RVxcv1oHBYF',$,'IsRigid','Indication of whether the conduit is rigid (= TRUE) or flexible (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#500=IFCSIMPLEPROPERTYTEMPLATE('2kyJAJgC19TgiWrDGiQQQo',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#501=IFCSIMPLEPROPERTYTEMPLATE('2rLHCeLM58Uu9KKI93IurK',$,'IsAdjustable','Indicates whether the element is adjustable or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#502=IFCSIMPLEPROPERTYTEMPLATE('1lTQUKB7T05PFPTb$5S3wF',$,'IsCurrentCarrying','To indicate whether the current will go through the dropper.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#503=IFCSIMPLEPROPERTYTEMPLATE('0_KVEl2nTCOBdVxTxZH0XK',$,'NominalLoad','The nominal load that a component can support.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#504=IFCPROPERTYSETTEMPLATE('2tn2xhW0P4x8TaCVTYTKOq',$,'Pset_CableFittingTypeCommon','Common properties for cable fittings. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting,IfcCableFittingType',(#505,#506)); -#505=IFCSIMPLEPROPERTYTEMPLATE('3HAJid8dbEkAePM2ahncZD',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#506=IFCSIMPLEPROPERTYTEMPLATE('0oSFGDXD1B3PQ8$7kdzRpt',$,'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',$,#507,$,$,$,.READWRITE.); -#507=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#508=IFCPROPERTYSETTEMPLATE('3A6kDs9if9ruBIrj6t5ff2',$,'Pset_CableFittingTypeExit','Properties of the exit type of cable fitting which ends a cable segment at a non-electric element.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting/EXIT,IfcCableFittingType/EXIT',(#509)); -#509=IFCSIMPLEPROPERTYTEMPLATE('0YlmgI$FLFOeORazxwrIrS',$,'GroundResistance','The soil or ground resistance to electrical current from the cable fitting.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#510=IFCPROPERTYSETTEMPLATE('3O6dxd1j5E9PIF3P31rDMU',$,'Pset_CableFittingTypeFanout','Properties of the fanout type of cable fitting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting/FANOUT,IfcCableFittingType/FANOUT',(#511,#512)); -#511=IFCSIMPLEPROPERTYTEMPLATE('3bUh2dU_L1dhPD6ye6wvLw',$,'NumberOfTubes','Number of fiber tubes.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#512=IFCSIMPLEPROPERTYTEMPLATE('3JNFmK2pP3tvxHq_crrGui',$,'TubeDiameter','Indicates the diameter of the fiber tubes that are used in the fan out.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#513=IFCPROPERTYSETTEMPLATE('2vfC5i7x56LBqz6sO4VHxd',$,'Pset_CableSegmentConnector','Properties about cable connectors. This property set is applicable to a type or occurrence of IfcCableSegment, indicated that the cable segment has one or two connectors affiliated.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment,IfcCableSegmentType',(#514,#515,#516,#517,#518,#520)); -#514=IFCSIMPLEPROPERTYTEMPLATE('287OjqGgr5SxNUeEIbUuSd',$,'ConnectorAColour','Indicates the colour A- end of connector.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#515=IFCSIMPLEPROPERTYTEMPLATE('0F2RqDlv1Cqge$M827TNON',$,'ConnectorBColour','Indicates the colour B- end of connector.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#516=IFCSIMPLEPROPERTYTEMPLATE('3_fNuLOCDEXgFJ9tP5QXWe',$,'ConnectorAType','Indicates the type of A-end connector.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#517=IFCSIMPLEPROPERTYTEMPLATE('0_202KKBr1kALGnkBEXotl',$,'ConnectorBType','Indicates the type of B-end connector.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#518=IFCSIMPLEPROPERTYTEMPLATE('3MuxV2xN11PBq1S18hQez1',$,'ConnectorAGender','Indicates the gender of A-end connector.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#519,$,$,$,.READWRITE.); -#519=IFCPROPERTYENUMERATION('PEnum_DistributionPortGender',(IFCLABEL('FEMALE'),IFCLABEL('MALE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#520=IFCSIMPLEPROPERTYTEMPLATE('2o6ZW7xWTDwhX2eX3VHEha',$,'ConnectorBGender','Indicates the gender of B-end connector.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#521,$,$,$,.READWRITE.); +#403=IFCSIMPLEPROPERTYTEMPLATE('230KY0kQ54ffjFX7c63aBw',$,'ElevationOfRefHeight','Elevation above sea level of the reference height used for all storey elevation measures, equals to height 0.0. It is usually the ground floor level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#404=IFCSIMPLEPROPERTYTEMPLATE('2NBfobcLbDev_V4n4ndbsM',$,'ElevationOfTerrain','Elevation above the minimal terrain level around the foot print of the building, given in elevation above sea level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#405=IFCPROPERTYSETTEMPLATE('0URpFS9DPD1fZKTkz_JOUj',$,'Pset_BuildingElementProxyCommon','Common properties for built elements that don''t have a specific entity name.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBuildingElementProxy,IfcBuildingElementProxyType',(#406,#407,#409,#410,#411,#412)); +#406=IFCSIMPLEPROPERTYTEMPLATE('3NgydhdUvFTwhYQM5feBUS',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#407=IFCSIMPLEPROPERTYTEMPLATE('3ln3rfPQvEABFv8WdTjCDf',$,'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',$,#408,$,$,$,.READWRITE.); +#408=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#409=IFCSIMPLEPROPERTYTEMPLATE('3u19FpAfn2PPa0Bhnrn$cF',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#410=IFCSIMPLEPROPERTYTEMPLATE('0xj6XqNVH0_RbI_UL$ornH',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#411=IFCSIMPLEPROPERTYTEMPLATE('0G_wrQCn14CfCk_eQ6gzVI',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#412=IFCSIMPLEPROPERTYTEMPLATE('1$$g1aw0r9uRhYbf0h3BdZ',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#413=IFCPROPERTYSETTEMPLATE('1yQB96GrHAsfJH2I_lSJqt',$,'Pset_BuildingStoreyCommon','Properties common to the definition of all instances of IfcBuildingStorey. Please note that several building attributes are handled directly at the IfcBuildingStorey instance, the building storey number (or short name) by IfcBuildingStorey.Name, the building storey name (or long name) by IfcBuildingStorey.LongName, and the description (or comments) by IfcBuildingStorey.Description. Actual building storey quantities, like building storey perimeter, building storey area and building storey volume are provided by IfcElementQuantity, and the building storey classification according to national building code by IfcClassificationReference.',.PSET_OCCURRENCEDRIVEN.,'IfcBuildingStorey',(#414,#415,#416,#417,#418,#419,#420,#421,#422,#423)); +#414=IFCSIMPLEPROPERTYTEMPLATE('0W4vXqJ8z54gRCsfeMuYDC',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#415=IFCSIMPLEPROPERTYTEMPLATE('1sUehS_GD5HP_xISveShzv',$,'EntranceLevel','Indication whether this building storey is an entrance level to the building (TRUE), or (FALSE) if otherwise.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#416=IFCSIMPLEPROPERTYTEMPLATE('0DpqDoR9PAKBH8oYGi0lgw',$,'AboveGround','Indication whether this building storey is fully above ground (TRUE), or below ground (FALSE), or partially above and below ground (UNKNOWN) - as in sloped terrain.',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); +#417=IFCSIMPLEPROPERTYTEMPLATE('1WQMa6OWr1jPHcU_LRKSo8',$,'SprinklerProtection','Indication whether this object is sprinkler protected (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#418=IFCSIMPLEPROPERTYTEMPLATE('2oWo80cTPEcefgc0C1RYJF',$,'SprinklerProtectionAutomatic','Indication whether this object has an automatic sprinkler protection (TRUE) or not (FALSE).\X2\000A\X0\It should only be given, if the property "SprinklerProtection" is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#419=IFCSIMPLEPROPERTYTEMPLATE('1eG4aVIqv1LOJuREtiomob',$,'LoadBearingCapacity','Maximum load bearing capacity of the floor structure throughtout the storey as designed.',.P_SINGLEVALUE.,'IfcPlanarForceMeasure',$,$,$,$,$,.READWRITE.); +#420=IFCSIMPLEPROPERTYTEMPLATE('3lHyFtcCH7dwi78zKtKrMr',$,'GrossPlannedArea','Total planned gross area of the spatial structure element. Used for programming the spatial structure element.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#421=IFCSIMPLEPROPERTYTEMPLATE('0XSsy$an55IuMLlrkwzV3$',$,'NetPlannedArea','Total planned net area of the object. Used for programming the object.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#422=IFCSIMPLEPROPERTYTEMPLATE('330K7BvQf9Hf5qUq6XioLo',$,'ElevationOfSSLRelative','Elevation of the top surface of the structural slab level given in elevation above the local zero height. If the level varies and there is no significantly more prominent elevation, then this property may be omitted. In case of any inconsistency with the geometric positioning of the top surface, the geometric representation takes precedence.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#423=IFCSIMPLEPROPERTYTEMPLATE('2jCsCfVHX0SO_qboT7XtSz',$,'ElevationOfFFLRelative','Elevation of the top surface of the finished floor level given in elevation above the local zero height. If the level varies and there is no significantly more prominent elevation, then this property may be omitted. In case of any inconsistency with the geometric positioning of the top surface, the geometric representation takes precedence.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#424=IFCPROPERTYSETTEMPLATE('2jwC1HqGXFIQgI$UC3sX51',$,'Pset_BuildingSystemCommon','Properties common to the definition of building systems.',.PSET_OCCURRENCEDRIVEN.,'IfcBuildingSystem',(#425)); +#425=IFCSIMPLEPROPERTYTEMPLATE('3gFQuJ_7P8MOGQZmi3qkzK',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#426=IFCPROPERTYSETTEMPLATE('2se$xLvPX8ugoAd9buxAlg',$,'Pset_BuildingUse','Provides information on on the real estate context of the building of interest both current and anticipated.',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#427,#428,#429,#430,#431,#432,#433,#434,#435,#436,#437,#438)); +#427=IFCSIMPLEPROPERTYTEMPLATE('36eOvFxlz5TevzshgEDTbF',$,'MarketCategory','Category of use e.g. residential, commercial, recreation etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#428=IFCSIMPLEPROPERTYTEMPLATE('3RkGHGhJ1Dw8zj8ga71ASR',$,'MarketSubCategory','Subset of category of use e.g. multi-family, 2 bedroom, low rise.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#429=IFCSIMPLEPROPERTYTEMPLATE('1iWxd3TlrE2uJgBH4tmsot',$,'PlanningControlStatus','Label of zoning category or class, or planning control category for the site or facility.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#430=IFCSIMPLEPROPERTYTEMPLATE('2wXE$uZR173uGm8kbLxGHp',$,'NarrativeText','Added information relating to the adjacent building use that is not appropriate to the general descriptive text associated with an entity through the inherited IfcRoot.Description.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#431=IFCSIMPLEPROPERTYTEMPLATE('1fNYTiO8D0eAt0Y3337mTZ',$,'VacancyRateInCategoryNow','Percentage of vacancy found in the particular category currently.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#432=IFCSIMPLEPROPERTYTEMPLATE('0tRahMCrnAaRX3JvlYJLrU',$,'TenureModesAvailableNow','A list of the tenure modes that are currently available expressed in terms of IfcLabel.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#433=IFCSIMPLEPROPERTYTEMPLATE('1bh87tcpr9XAaig1GfXkax',$,'MarketSubCategoriesAvailableNow','A list of the sub categories of property that are currently available expressed in terms of IfcLabel.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#434=IFCSIMPLEPROPERTYTEMPLATE('0uUieJHPj66vC7UXbEigKr',$,'RentalRatesInCategoryNow','Range of the cost rates for property currently available in the required category.',.P_BOUNDEDVALUE.,'IfcMonetaryMeasure',$,$,$,$,$,.READWRITE.); +#435=IFCSIMPLEPROPERTYTEMPLATE('0vux3cwQL3HO5o4wBaQjoS',$,'VacancyRateInCategoryFuture','Percentage of vacancy found in the particular category expected in the future.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#436=IFCSIMPLEPROPERTYTEMPLATE('05FtugkrzAQumKzvtWvtJ$',$,'TenureModesAvailableFuture','A list of the tenure modes that are expected to be available in the future expressed in terms of IfcLabel.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#437=IFCSIMPLEPROPERTYTEMPLATE('16XmFZg$T8rvwixKOe$rMK',$,'MarketSubCategoriesAvailableFuture','A list of the sub categories of property that are expected to be available in the future expressed in terms of IfcLabel.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#438=IFCSIMPLEPROPERTYTEMPLATE('3GFGMzbXTAqO1ulYc55xTM',$,'RentalRatesInCategoryFuture','Range of the cost rates for property expected to be available in the future in the required category.',.P_BOUNDEDVALUE.,'IfcMonetaryMeasure',$,$,$,$,$,.READWRITE.); +#439=IFCPROPERTYSETTEMPLATE('0Q3ZD3C8HFUPdB3l9o1a_m',$,'Pset_BuildingUseAdjacent','Provides information on adjacent buildings and their uses to enable their impact on the building of interest to be determined. Note that for each instance of the property set used, where there is an existence of risk, there will be an instance of the property set Pset_Risk (q.v).',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#440,#441,#442,#443)); +#440=IFCSIMPLEPROPERTYTEMPLATE('1FjO5Dqon5rw$NwpYYh$d0',$,'MarketCategory','Category of use e.g. residential, commercial, recreation etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#441=IFCSIMPLEPROPERTYTEMPLATE('0EtV4QYaf88Rmaet5LgICf',$,'MarketSubCategory','Subset of category of use e.g. multi-family, 2 bedroom, low rise.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#442=IFCSIMPLEPROPERTYTEMPLATE('3zqwIKyzXBgO7WyArignaX',$,'PlanningControlStatus','Label of zoning category or class, or planning control category for the site or facility.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#443=IFCSIMPLEPROPERTYTEMPLATE('3M$wPUpDrD$gtl5eBTr238',$,'NarrativeText','Added information relating to the adjacent building use that is not appropriate to the general descriptive text associated with an entity through the inherited IfcRoot.Description.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#444=IFCPROPERTYSETTEMPLATE('2B4OnLraPCpOMisqH9cQtw',$,'Pset_BuiltSystemRailwayLine','Properties common to the definition of a railway line system, which is a set of functional tracks with explicit terminals. It is usually composed of a set of tracks with continuous track parts and alignments.',.PSET_OCCURRENCEDRIVEN.,'IfcBuiltSystem/RAILWAYLINE',(#445,#446,#447)); +#445=IFCSIMPLEPROPERTYTEMPLATE('18UszdKQL7MvOXobLrWqgF',$,'LineID','The unique identifier of the line.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#446=IFCSIMPLEPROPERTYTEMPLATE('1BRrqg$1j3axZ8Q0GZrqKQ',$,'IsElectrified','Indicates whether the track system is electrified or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#447=IFCSIMPLEPROPERTYTEMPLATE('3sHxj_wL12pw09i$UZtOT8',$,'LineCharacteristic','Indicates the characteristic of the line.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#448,$,$,$,.READWRITE.); +#448=IFCPROPERTYENUMERATION('PEnum_LineCharacteristic',(IFCLABEL('ENTERDEPOT'),IFCLABEL('EXITDEPOT'),IFCLABEL('FREIGHT'),IFCLABEL('PASSENGER'),IFCLABEL('PASSENGERANDFREIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#449=IFCPROPERTYSETTEMPLATE('3_H$wOTUv2Furxpb5D9REd',$,'Pset_BuiltSystemRailwayTrack','Properties common to the definition of a track system. It is usually composed of continuous sequences of track parts and alignments.',.PSET_OCCURRENCEDRIVEN.,'IfcBuiltSystem/RAILWAYTRACK',(#450,#451,#452,#454)); +#450=IFCSIMPLEPROPERTYTEMPLATE('0Vx9HgRm11hPYoahVzURxg',$,'TrackID','The unique identification number of the track.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#451=IFCSIMPLEPROPERTYTEMPLATE('3ec075glT0Pv9MEx6_4x9A',$,'TrackNumber','Indicates the local identification number of the track.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#452=IFCSIMPLEPROPERTYTEMPLATE('1pmIBiYbP7QPrmBOaug3$W',$,'TrackUsage','The expected primary usage of the track.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#453,$,$,$,.READWRITE.); +#453=IFCPROPERTYENUMERATION('PEnum_TrackUsage',(IFCLABEL('CATCHSIDING'),IFCLABEL('CLASSIFICATIONTRACK'),IFCLABEL('CONNECTINGLINE'),IFCLABEL('FREIGHTTRACK'),IFCLABEL('LOCOMOTIVEHOLDTRACK'),IFCLABEL('LOCOMOTIVERUNNINGTRACK'),IFCLABEL('LOCOMOTIVESERVICETRACK'),IFCLABEL('MAINTRACK'),IFCLABEL('MULTIPLEUNITRUNNINGTRACK'),IFCLABEL('RECEIVINGDEPARTURETRACK'),IFCLABEL('REFUGESIDING'),IFCLABEL('REPAIRSIDING'),IFCLABEL('ROLLINGFORBIDDENTRACK'),IFCLABEL('ROLLINGTRACK'),IFCLABEL('ROUNDABOUTLINE'),IFCLABEL('STORAGETRACK'),IFCLABEL('SWITCHINGLEAD'),IFCLABEL('UNTWININGLINE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#454=IFCSIMPLEPROPERTYTEMPLATE('0WaOTELkL6gfvpiUnM1MGs',$,'TrackCharacteristic','Indicates the characteristic of the track.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#455,$,$,$,.READWRITE.); +#455=IFCPROPERTYENUMERATION('PEnum_TrackCharacteristic',(IFCLABEL('FUNICULAR'),IFCLABEL('NORMAL'),IFCLABEL('RACK'),IFCLABEL('RIGIDOVERHEAD'),IFCLABEL('THIRDRAIL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#456=IFCPROPERTYSETTEMPLATE('1EdUnQb39DGvvapepRMS5V',$,'Pset_BurnerTypeCommon','Common attributes of burner types.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBurner,IfcBurnerType',(#457,#458,#460)); +#457=IFCSIMPLEPROPERTYTEMPLATE('3B8RS0Ov94HuOVgv8CkVn1',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#458=IFCSIMPLEPROPERTYTEMPLATE('2i19Nxlg1FwBycmImbVlBj',$,'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',$,#459,$,$,$,.READWRITE.); +#459=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#460=IFCSIMPLEPROPERTYTEMPLATE('0yEdAvZQbEpQ_pWb6xlbfP',$,'EnergySource','Enumeration defining the energy source or fuel cumbusted.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#461,$,$,$,.READWRITE.); +#461=IFCPROPERTYENUMERATION('PEnum_EnergySource',(IFCLABEL('COAL'),IFCLABEL('COAL_PULVERIZED'),IFCLABEL('ELECTRICITY'),IFCLABEL('GAS'),IFCLABEL('OIL'),IFCLABEL('PROPANE'),IFCLABEL('WOOD'),IFCLABEL('WOOD_CHIP'),IFCLABEL('WOOD_PELLET'),IFCLABEL('WOOD_PULVERIZED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#462=IFCPROPERTYSETTEMPLATE('1Y0ZnBp9PF$hhMRTo2FFiL',$,'Pset_CableCarrierFittingTypeCommon','Common properties for cable carrier fittings. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierFitting,IfcCableCarrierFittingType',(#463,#464)); +#463=IFCSIMPLEPROPERTYTEMPLATE('2S4xYptCX9phGURM2F1yYr',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#464=IFCSIMPLEPROPERTYTEMPLATE('3pK0qvfZn1SOv8X4Kz7xdQ',$,'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',$,#465,$,$,$,.READWRITE.); +#465=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#466=IFCPROPERTYSETTEMPLATE('0H6RHh3brEQuDNwjxYBia$',$,'Pset_CableCarrierSegmentTypeCableLadderSegment','An open carrier segment on which cables are carried on a ladder structure.\X2\000A\X0\HISTORY: IFC4 - NominalLength deleted. To be handled as a quantity measure.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CABLELADDERSEGMENT,IfcCableCarrierSegmentType/CABLELADDERSEGMENT',(#467)); +#467=IFCSIMPLEPROPERTYTEMPLATE('1WMwFzIYD9ZhxK1s1_CBLX',$,'LadderConfiguration','Description of the configuration of the ladder structure used.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#468=IFCPROPERTYSETTEMPLATE('2NkasFCTb8rw3SYDe$lK2T',$,'Pset_CableCarrierSegmentTypeCableTraySegment','An (typically) open carrier segment onto which cables are laid.\X2\000A\X0\HISTORY: IFC4 - NominalLength deleted. To be handled as a quantity measure',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CABLETRAYSEGMENT,IfcCableCarrierSegmentType/CABLETRAYSEGMENT',(#469)); +#469=IFCSIMPLEPROPERTYTEMPLATE('383r$0_gP22hLxU_nBgxZV',$,'HasCover','Indication of whether the cable tray has a cover (=TRUE) or not (= FALSE). By default, this value should be set to FALSE..',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#470=IFCPROPERTYSETTEMPLATE('21tWSPILLFUvC2HqDmQwk4',$,'Pset_CableCarrierSegmentTypeCableTrunkingSegment','An enclosed carrier segment with one or more compartments into which cables are placed.\X2\000A\X0\HISTORY: IFC4 - NominalLength deleted. To be handled as a quantity measure',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CABLETRUNKINGSEGMENT,IfcCableCarrierSegmentType/CABLETRUNKINGSEGMENT',(#471)); +#471=IFCSIMPLEPROPERTYTEMPLATE('0IoOpWbgP8LRCBh5f06Pyc',$,'NumberOfCompartments','The number of separate internal compartments within the trunking.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#472=IFCPROPERTYSETTEMPLATE('0Tqww0BVX4buMt1Bd_dESC',$,'Pset_CableCarrierSegmentTypeCatenaryWire','Properties of a catenary wire, which is a longtitudinal wire supporting the grooved contact wires. Properties in this property set are applicable to a type or an occurrence IfcCableCarrierSegment with predefined type of CATENARYWIRE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CATENARYWIRE,IfcCableCarrierSegmentType/CATENARYWIRE',(#473,#474,#475,#476,#477,#478,#479,#480,#481,#482,#483,#484,#485)); +#473=IFCSIMPLEPROPERTYTEMPLATE('1$aR1Btbb84AWu2_oD4NY2',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#474=IFCSIMPLEPROPERTYTEMPLATE('3$MFwBd_11nv3VMt2OB7Mr',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#475=IFCSIMPLEPROPERTYTEMPLATE('0uSO0nhh5BTwe3Bi3O6mET',$,'CatenaryWireType','Indicate the type of Catenary wire.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#476=IFCSIMPLEPROPERTYTEMPLATE('1dYWqT0m54dAMDT0W7J3g9',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); +#477=IFCSIMPLEPROPERTYTEMPLATE('1WdinNcTf2iv26vT7bpPLm',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#478=IFCSIMPLEPROPERTYTEMPLATE('1E6XreTbj7CuOWur8LeW08',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#479=IFCSIMPLEPROPERTYTEMPLATE('1NBxjXTG15uQk1C$PXDFg0',$,'LayRatio','The ratio between lay length and the diameter of the single conductor.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#480=IFCSIMPLEPROPERTYTEMPLATE('0Nx5IzQw53jeubxSJ3W8iQ',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); +#481=IFCSIMPLEPROPERTYTEMPLATE('1_Xjau5s9CpxarexBtgfKE',$,'MechanicalTension','Nominal value of mechanical force applied to a flow segment.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#482=IFCSIMPLEPROPERTYTEMPLATE('2KEIKKk5P0qg6NTjkSSUea',$,'PhysicalDescriptionReference','Physical description as external reference of the equipment, including e.g.weight, shape, model, length, height, diameter.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#483=IFCSIMPLEPROPERTYTEMPLATE('1BwWEnWBbDgvjWt2XeUJXQ',$,'StrandingMethod','Specifies the method used to strand the cable. Stranding is the process where a particular number of stranding elements are joined together while winding them round a common axis.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#484=IFCSIMPLEPROPERTYTEMPLATE('2aIk9IGqj8yO7zJwZ3BAnh',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#485=IFCSIMPLEPROPERTYTEMPLATE('0WJV5$WL52OOcGIW1aaA8V',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#486=IFCPROPERTYSETTEMPLATE('0taWa70x52wxwMiK0uZjyv',$,'Pset_CableCarrierSegmentTypeCommon','Common properties for cable carrier segments. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment,IfcCableCarrierSegmentType',(#487,#488)); +#487=IFCSIMPLEPROPERTYTEMPLATE('0w129dAzL2Cho2YMZaKBlA',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#488=IFCSIMPLEPROPERTYTEMPLATE('3i8zQlQyPBIghnNcC3fb_p',$,'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',$,#489,$,$,$,.READWRITE.); +#489=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#490=IFCPROPERTYSETTEMPLATE('3i3Qfv_cTCBRkoyibT$NYf',$,'Pset_CableCarrierSegmentTypeConduitSegment','An enclosed tubular carrier segment through which cables are pulled.\X2\000A\X0\HISTORY: IFC4 - NominalLength deleted. To be handled as a quantity measure.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CONDUITSEGMENT,IfcCableCarrierSegmentType/CONDUITSEGMENT',(#491,#492,#493,#495,#496)); +#491=IFCSIMPLEPROPERTYTEMPLATE('32l_Cx1x54Ke7VARNYze7P',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#492=IFCSIMPLEPROPERTYTEMPLATE('1WBI5W7a18wh5$yFgqAh_a',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#493=IFCSIMPLEPROPERTYTEMPLATE('0HFPXuL3rApAoDiCtpl6uR',$,'ConduitShapeType','The shape of the conduit segment.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#494,$,$,$,.READWRITE.); +#494=IFCPROPERTYENUMERATION('PEnum_ConduitShapeType',(IFCLABEL('CIRCULAR'),IFCLABEL('OVAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#495=IFCSIMPLEPROPERTYTEMPLATE('1lO0ICilHF1RxmD7goFYyg',$,'IsRigid','Indication of whether the conduit is rigid (= TRUE) or flexible (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#496=IFCSIMPLEPROPERTYTEMPLATE('00XsZHdDXFdwVvDdh3kOg7',$,'NominalDiameter','Nominal diameter or width of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#497=IFCPROPERTYSETTEMPLATE('3bccyzKMj7B9Q2cyRCZqwT',$,'Pset_CableCarrierSegmentTypeDropper','Properties that are applicable to a type or an occurrence of dropper.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/DROPPER,IfcCableCarrierSegmentType/DROPPER',(#498,#499,#500,#501,#502,#503,#504,#505)); +#498=IFCSIMPLEPROPERTYTEMPLATE('2sVhWaFtP2$8XSWKBoAA99',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#499=IFCSIMPLEPROPERTYTEMPLATE('1wpUjRpBP1x8iO32wcAj6i',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#500=IFCSIMPLEPROPERTYTEMPLATE('1ey8S_Daz4j92r7qsRUyO8',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#501=IFCSIMPLEPROPERTYTEMPLATE('1SYgOdgtP21RVxcv1oHBYF',$,'IsRigid','Indication of whether the conduit is rigid (= TRUE) or flexible (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#502=IFCSIMPLEPROPERTYTEMPLATE('2kyJAJgC19TgiWrDGiQQQo',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#503=IFCSIMPLEPROPERTYTEMPLATE('2rLHCeLM58Uu9KKI93IurK',$,'IsAdjustable','Indicates whether the element is adjustable or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#504=IFCSIMPLEPROPERTYTEMPLATE('1lTQUKB7T05PFPTb$5S3wF',$,'IsCurrentCarrying','To indicate whether the current will go through the dropper.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#505=IFCSIMPLEPROPERTYTEMPLATE('0_KVEl2nTCOBdVxTxZH0XK',$,'NominalLoad','The nominal load that a component can support.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#506=IFCPROPERTYSETTEMPLATE('2tn2xhW0P4x8TaCVTYTKOq',$,'Pset_CableFittingTypeCommon','Common properties for cable fittings. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting,IfcCableFittingType',(#507,#508)); +#507=IFCSIMPLEPROPERTYTEMPLATE('3HAJid8dbEkAePM2ahncZD',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#508=IFCSIMPLEPROPERTYTEMPLATE('0oSFGDXD1B3PQ8$7kdzRpt',$,'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',$,#509,$,$,$,.READWRITE.); +#509=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#510=IFCPROPERTYSETTEMPLATE('3A6kDs9if9ruBIrj6t5ff2',$,'Pset_CableFittingTypeExit','Properties of the exit type of cable fitting which ends a cable segment at a non-electric element.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting/EXIT,IfcCableFittingType/EXIT',(#511)); +#511=IFCSIMPLEPROPERTYTEMPLATE('0YlmgI$FLFOeORazxwrIrS',$,'GroundResistance','The soil or ground resistance to electrical current from the cable fitting.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#512=IFCPROPERTYSETTEMPLATE('3O6dxd1j5E9PIF3P31rDMU',$,'Pset_CableFittingTypeFanout','Properties of the fanout type of cable fitting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting/FANOUT,IfcCableFittingType/FANOUT',(#513,#514)); +#513=IFCSIMPLEPROPERTYTEMPLATE('3bUh2dU_L1dhPD6ye6wvLw',$,'NumberOfTubes','Number of fiber tubes.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#514=IFCSIMPLEPROPERTYTEMPLATE('3JNFmK2pP3tvxHq_crrGui',$,'TubeDiameter','Indicates the diameter of the fiber tubes that are used in the fan out.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#515=IFCPROPERTYSETTEMPLATE('2vfC5i7x56LBqz6sO4VHxd',$,'Pset_CableSegmentConnector','Properties about cable connectors. This property set is applicable to a type or occurrence of IfcCableSegment, indicated that the cable segment has one or two connectors affiliated.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment,IfcCableSegmentType',(#516,#517,#518,#519,#520,#522)); +#516=IFCSIMPLEPROPERTYTEMPLATE('287OjqGgr5SxNUeEIbUuSd',$,'ConnectorAColour','Indicates the colour A- end of connector.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#517=IFCSIMPLEPROPERTYTEMPLATE('0F2RqDlv1Cqge$M827TNON',$,'ConnectorBColour','Indicates the colour B- end of connector.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#518=IFCSIMPLEPROPERTYTEMPLATE('3_fNuLOCDEXgFJ9tP5QXWe',$,'ConnectorAType','Indicates the type of A-end connector.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#519=IFCSIMPLEPROPERTYTEMPLATE('0_202KKBr1kALGnkBEXotl',$,'ConnectorBType','Indicates the type of B-end connector.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#520=IFCSIMPLEPROPERTYTEMPLATE('3MuxV2xN11PBq1S18hQez1',$,'ConnectorAGender','Indicates the gender of A-end connector.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#521,$,$,$,.READWRITE.); #521=IFCPROPERTYENUMERATION('PEnum_DistributionPortGender',(IFCLABEL('FEMALE'),IFCLABEL('MALE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#522=IFCPROPERTYSETTEMPLATE('1ZcNw5iqb4nQQa1ypheEc0',$,'Pset_CableSegmentOccurenceFiberSegment','Properties of fiber segment occurrences. This property set is applicable to occurrences of IfcCableSegment with predefined type FIBERSEGMENT.',.PSET_OCCURRENCEDRIVEN.,'IfcCableSegment/FIBERSEGMENT',(#523)); -#523=IFCSIMPLEPROPERTYTEMPLATE('3E2EG5p59AluQbNPn9MtuU',$,'InUse','Indicates whether the fiber has been assigned to some specific use.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#524=IFCPROPERTYSETTEMPLATE('1mgkk0KE1De8gtESOkrfDD',$,'Pset_CableSegmentOccurrence','Properties for the occurrence of an electrical cable, core or conductor that conforms to a type as specified by an appropriate type definition within IFC. NOTE: Maximum allowed voltage drop should be derived from the property within Pset_ElectricalCircuit.',.PSET_OCCURRENCEDRIVEN.,'IfcCableSegment',(#525,#526,#527,#528,#529,#531,#532,#533,#534,#536,#537,#538,#539,#540,#541)); -#525=IFCSIMPLEPROPERTYTEMPLATE('1tFix9eiX1NhF9Y5hHH131',$,'DesignAmbientTemperature','The highest and lowest local ambient temperature likely to be encountered.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#526=IFCSIMPLEPROPERTYTEMPLATE('0Iye1mspT7mO8cGWER87RO',$,'UserCorrectionFactor','An arbitrary correction factor that may be applied by the user.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#527=IFCSIMPLEPROPERTYTEMPLATE('0t9qaWEqb2S9fntiCpeR_V',$,'NumberOfParallelCircuits','Number of parallel circuits.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#528=IFCSIMPLEPROPERTYTEMPLATE('1HXCsiO9zAdhMrKcKgoVxq',$,'InstallationMethod','Method of installation of cable/conductor. Installation methods are typically defined by reference in standards such as IEC 60364-5-52, table 52A-1 or BS7671 Appendix 4 Table 4A1 etc. Selection of the value to be used should be determined from such a standard according to local usage.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#529=IFCSIMPLEPROPERTYTEMPLATE('2J9BBFy89A6RUYIqTvR8JW',$,'InstallationMethodFlagEnum','Special installation conditions relating to particular types of installation based on IEC60364-5-52:2001 reference installation methods C and D.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#530,$,$,$,.READWRITE.); -#530=IFCPROPERTYENUMERATION('PEnum_InstallationMethodFlagEnum',(IFCLABEL('BELOWCEILING'),IFCLABEL('INDUCT'),IFCLABEL('INSOIL'),IFCLABEL('ONWALL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#531=IFCSIMPLEPROPERTYTEMPLATE('0yunUf8Oz9kAXcisoK3_Xt',$,'DistanceBetweenParallelCircuits','Distance measured between parallel circuits.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#532=IFCSIMPLEPROPERTYTEMPLATE('06nQtZaFL1exY5A1oXw4r7',$,'SoilConductivity','Thermal conductivity of soil. Generally, within standards such as IEC 60364-5-52, table 52A-16, the resistivity of soil is required (measured in [SI] units of degK.m /W). This is the reciprocal of the conductivity value and needs to be calculated accordingly.',.P_SINGLEVALUE.,'IfcThermalConductivityMeasure',$,$,$,$,$,.READWRITE.); -#533=IFCSIMPLEPROPERTYTEMPLATE('1$UljvOvvEORnyPJd84HKJ',$,'CarrierStackNumber','Number of carrier segments (tray, ladder etc.) that are vertically stacked (vertical is measured as the z-axis of the local coordinate system of the carrier segment).',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#534=IFCSIMPLEPROPERTYTEMPLATE('1NRPBIrxLDQ95S3s5c8QVn',$,'MountingMethod','The method of mounting cable segment occurrences on a cable carrier occurrence from which the method required can be selected. This is for the purpose of carrying out ''worst case'' cable sizing calculations and may be a conceptual requirement rather than a statement of the physical occurrences of cable and carrier segments.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#535,$,$,$,.READWRITE.); -#535=IFCPROPERTYENUMERATION('PEnum_MountingMethodEnum',(IFCLABEL('LADDER'),IFCLABEL('PERFORATEDTRAY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#536=IFCSIMPLEPROPERTYTEMPLATE('2WbUUWg11B6Qc6jHGhG_jo',$,'IsHorizontalCable','Indication of whether the cable occurrences are mounted horizontally (= TRUE) or vertically (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#537=IFCSIMPLEPROPERTYTEMPLATE('1HMX1_tHj5i8e5q3bhLYEJ',$,'IsMountedFlatCable','Indication of whether the cable occurrences are mounted flat (= TRUE) or in a trefoil pattern (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#538=IFCSIMPLEPROPERTYTEMPLATE('2vVO_JeR1D3RmKJBacBN69',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#539=IFCSIMPLEPROPERTYTEMPLATE('37taBaSPP4iwUzr88cj5A9',$,'MaximumCableLength','Maximum cable length based on voltagedrop. NOTE: This value may also be specified as a constraint within an IFC model if required but is included within the property set at this stage pending implementation of the required capabilities within software applications.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#540=IFCSIMPLEPROPERTYTEMPLATE('3LO3eCJ1r4getqUmdq4bS4',$,'PowerLoss','The power loss in [W].\X2\000A000A\X0\Total loss of power across this cable.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#541=IFCSIMPLEPROPERTYTEMPLATE('3PZvWajuTDz89kLwMesp4T',$,'SequentialCode','Indicates the sequential code of the cable or wire.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#542=IFCPROPERTYSETTEMPLATE('0Du_pfLufAWBgLnDlnA4oy',$,'Pset_CableSegmentTypeBusBarSegment','Properties specific to busbar cable segments.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/BUSBARSEGMENT,IfcCableSegmentType/BUSBARSEGMENT',(#543,#544,#545,#546,#547,#548,#549,#550,#551,#552,#553,#554,#556,#557,#558)); -#543=IFCSIMPLEPROPERTYTEMPLATE('0qzp9x5r98Vw$d1D9WWN5Q',$,'IsHorizontalBusbar','Indication of whether the busbar occurrences are routed horizontally (= TRUE) or vertically (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#544=IFCSIMPLEPROPERTYTEMPLATE('1FpatILjHDIRmV1_o1xi20',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#545=IFCSIMPLEPROPERTYTEMPLATE('2CtLdElm5CAg8kBoy0JmLt',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#546=IFCSIMPLEPROPERTYTEMPLATE('0ULlShzWP01BRW13MIlPHO',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#547=IFCSIMPLEPROPERTYTEMPLATE('2uvtdaVrT4leZfnTRqFskO',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); -#548=IFCSIMPLEPROPERTYTEMPLATE('3cjEmFu_T1FxAttGk8Ow$M',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#549=IFCSIMPLEPROPERTYTEMPLATE('3Lh6Kvvh5DxQvhl9xUtKD_',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#550=IFCSIMPLEPROPERTYTEMPLATE('0spYDANerDi8RDUkf1W62x',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); -#551=IFCSIMPLEPROPERTYTEMPLATE('2xHVDRDLr5rxIgh_PtLepE',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#552=IFCSIMPLEPROPERTYTEMPLATE('3xVbOe2JbCFhNY_0MucbAs',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#553=IFCSIMPLEPROPERTYTEMPLATE('0WwDyaXBDBxxQJp3U9MPgy',$,'CrossSectionalArea','Cross section area of the phase(s) lead(s).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#554=IFCSIMPLEPROPERTYTEMPLATE('1oCm26PfzAERsuxmmJzRdp',$,'InsulationMethod','The method used to insulate.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#555,$,$,$,.READWRITE.); -#555=IFCPROPERTYENUMERATION('PEnum_InsulatorType',(IFCLABEL('LONGRODINSULATOR'),IFCLABEL('PININSULATOR'),IFCLABEL('POSTINSULATOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#556=IFCSIMPLEPROPERTYTEMPLATE('0lyg$q1cPD_xUrb4lXPcaC',$,'OverallDiameter','The overall diameter of a object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#557=IFCSIMPLEPROPERTYTEMPLATE('3b8kTVYTr3PhTjqE2NckAg',$,'OperationalTemperatureRange','The temperature range in which the device operates normally.\X2\000A000A\X0\Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#558=IFCSIMPLEPROPERTYTEMPLATE('0TXfthz_H5V94p2Ch6KMye',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#559=IFCPROPERTYSETTEMPLATE('25DL3WRUX3KvOtV9daOMCs',$,'Pset_CableSegmentTypeCableSegment','Electrical cable with a specific purpose to lead electric current within a circuit or any other electric construction. Includes all types of electric cables, mainly several electrical segments wrapped together, e.g. cable, tube, busbar. Note that the number of conductors within a cable is determined by an aggregation mechanism that aggregates the conductors within the cable. A single-core cable is defined in IEV 461-06-02 as being ''a cable having only one core''; a multiconductor cable is defined in IEV 461-06-03 as b eing ''a cable having more than one conductor, some of which may be uninsulated''; a mulicore cable is defined in IEV 461-06-04 as being ''a cable having more than one core''.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CABLESEGMENT,IfcCableSegmentType/CABLESEGMENT',(#560,#561,#562,#563,#564,#565,#566,#567,#568,#569,#570,#571,#572,#573,#574,#575,#576,#577,#578,#579,#580,#581,#582)); -#560=IFCSIMPLEPROPERTYTEMPLATE('0QBgawcQ93KApBZkoua7sY',$,'Standard','The designation of the standard applicable for the definition of the object used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#561=IFCSIMPLEPROPERTYTEMPLATE('0EQGjsoA57peC4D_alWgT3',$,'NumberOfCores','The number of cores.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#562=IFCSIMPLEPROPERTYTEMPLATE('2eV$AkUr54mP90wY9pBbFA',$,'OverallDiameter','The overall diameter of a object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#563=IFCSIMPLEPROPERTYTEMPLATE('0vj_XHZgjFNBzry29P5kg8',$,'RatedTemperature','The range of allowed temperature that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#564=IFCSIMPLEPROPERTYTEMPLATE('0RbDY1vaz5ehrsHLoES8ZG',$,'ScreenDiameter','The diameter of the screen around an object (if present).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#565=IFCSIMPLEPROPERTYTEMPLATE('3xUIsBrJTA8erHhvw9U_Zi',$,'HasProtectiveEarth','Indicates whether the object has a protective earth connection (=TRUE) or not (= FALSE).\X2\000A000A\X0\One core has protective earth marked insulation, Yellow/Green.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#566=IFCSIMPLEPROPERTYTEMPLATE('0GhI6UwpH6DAF3xczr2Fn_',$,'MaximumOperatingTemperature','The maximum temperature at which a cable or bus is certified to operate.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#567=IFCSIMPLEPROPERTYTEMPLATE('2SCdaLml50lOT1Rj2$XKUu',$,'MaximumShortCircuitTemperature','The maximum short circuit temperature at which a cable or bus is certified to operate.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#568=IFCSIMPLEPROPERTYTEMPLATE('0x0_WRnGDCrOBpAVlsC_6h',$,'SpecialConstruction','Special construction capabilities like self-supporting, flat devidable cable or bus flat non devidable cable or bus supporting elements inside (steal, textile, concentric conductor). Note that materials used should be agreed between exchange participants before use.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#569=IFCSIMPLEPROPERTYTEMPLATE('0fe4n31590dP15Y7IukZHo',$,'Weight','Total weight of object\X2\000A000A\X0\Weight of cable kg/km.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#570=IFCSIMPLEPROPERTYTEMPLATE('1AuHEpfvXEMBY9jgnx4k$P',$,'SelfExtinguishing60332_1','Self Extinguishing cable/core according to IEC 60332.1.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#571=IFCSIMPLEPROPERTYTEMPLATE('2nnlDUrWL3qPiihljnL__q',$,'SelfExtinguishing60332_3','Self Extinguishing cable/core according to IEC 60332.3.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#572=IFCSIMPLEPROPERTYTEMPLATE('0MLmjuiSn0jPaZc4M3Nk$4',$,'HalogenProof','Produces small amount of smoke and irritating Deaerator/Gas.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#573=IFCSIMPLEPROPERTYTEMPLATE('0XendF7ub3aOtGL80Pir2e',$,'FunctionReliable','Element (such as cable, bus, core) maintain given properties/functions over a given (tested) time and conditions. According to IEC standard.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#574=IFCSIMPLEPROPERTYTEMPLATE('1V7plYky5F797sYM5rAi6Z',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#575=IFCSIMPLEPROPERTYTEMPLATE('39u313OMT4Xwt7R8PyBN$P',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#576=IFCSIMPLEPROPERTYTEMPLATE('3PiNJt91f4jPUSgWsumUJo',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#577=IFCSIMPLEPROPERTYTEMPLATE('1v8yHLc2T98AygJrPxJ23Z',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); -#578=IFCSIMPLEPROPERTYTEMPLATE('0Ssu$TKcD2fONB$QSTJhPd',$,'MaximumCurrent','The maximum allowed current that a device is certified to handle.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#579=IFCSIMPLEPROPERTYTEMPLATE('3BEMt6GEb1rAWunhWHJV8t',$,'MaximumBendingRadius','The maximum bending radius that the cable could withstand.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#580=IFCSIMPLEPROPERTYTEMPLATE('1aKVpZO1TAlPYMZfkZLHVy',$,'NumberOfWires','The number of wires used in the element.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#581=IFCSIMPLEPROPERTYTEMPLATE('3BeSvFR7j2he0dUzlCld7Y',$,'InsulationVoltage','The insulation voltage.\X2\000A000A\X0\It indicates the wire-to-ground (metal sheath) insulation voltage or the insulation voltage between the wires.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#582=IFCSIMPLEPROPERTYTEMPLATE('3OtJEXiyTFpgLyV189I1G6',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#583=IFCPROPERTYSETTEMPLATE('3FXTH9TFTDqQsb2jbIQUY0',$,'Pset_CableSegmentTypeCommon','Properties for the definitions of electrical cable segments.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment,IfcCableSegmentType',(#584,#585)); -#584=IFCSIMPLEPROPERTYTEMPLATE('0XkT$uUR9289SeHCT_IDJg',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#585=IFCSIMPLEPROPERTYTEMPLATE('2fdeJf1HH2yhemZXWIOdVI',$,'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',$,#586,$,$,$,.READWRITE.); -#586=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#587=IFCPROPERTYSETTEMPLATE('2HqV3GJBfBAea367yqADAc',$,'Pset_CableSegmentTypeConductorSegment','An electrical conductor is a single linear element with the specific purpose to lead electric current. The core of one lead is normally single wired or multiwired which are intertwined. According to IEC 60050: IEV 195-01-07, a conductor is a conductive part intended to carry a specified electric current.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CONDUCTORSEGMENT,IfcCableSegmentType/CONDUCTORSEGMENT',(#588,#589,#591,#593,#595,#597,#598,#599,#600,#601,#602,#603,#604,#605,#606,#607,#608)); -#588=IFCSIMPLEPROPERTYTEMPLATE('1aQOorZ656yQKkeX0PDUrH',$,'CrossSectionalArea','Cross section area of the phase(s) lead(s).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#589=IFCSIMPLEPROPERTYTEMPLATE('2LQK9RejzBcfgdoxlbhvL7',$,'Function','Type of function for which the conductor is intended.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#590,$,$,$,.READWRITE.); -#590=IFCPROPERTYENUMERATION('PEnum_FunctionEnum',(IFCLABEL('LINE'),IFCLABEL('NEUTRAL'),IFCLABEL('PROTECTIVEEARTH'),IFCLABEL('PROTECTIVEEARTHNEUTRAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#591=IFCSIMPLEPROPERTYTEMPLATE('0rAV2hE95C6hdSeRwKy3oc',$,'ConductorMaterial','Type of material from which the conductor is constructed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#592,$,$,$,.READWRITE.); -#592=IFCPROPERTYENUMERATION('PEnum_MaterialEnum',(IFCLABEL('ALUMINIUM'),IFCLABEL('COPPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#593=IFCSIMPLEPROPERTYTEMPLATE('0efMbrkgj2Ff3$GUYYW6sJ',$,'Construction','Purpose of informing on how the vonductor is constructed (interwined or solid). I.e. Solid (IEV 461-01-06), stranded (IEV 461-01-07), solid-/finestranded(IEV 461-01-11) (not flexible/flexible).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#594,$,$,$,.READWRITE.); -#594=IFCPROPERTYENUMERATION('PEnum_ConstructionEnum',(IFCLABEL('FLEXIBLESTRANDEDCONDUCTOR'),IFCLABEL('SOLIDCONDUCTOR'),IFCLABEL('STRANDEDCONDUCTOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#595=IFCSIMPLEPROPERTYTEMPLATE('2ipdNZaNzDOwTwJdhXHKa3',$,'ConductorShape','Indication of the shape of the conductor.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#596,$,$,$,.READWRITE.); -#596=IFCPROPERTYENUMERATION('PEnum_ShapeEnum',(IFCLABEL('CIRCULARCONDUCTOR'),IFCLABEL('HELICALCONDUCTOR'),IFCLABEL('RECTANGULARCONDUCTOR'),IFCLABEL('SECTORCONDUCTOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#597=IFCSIMPLEPROPERTYTEMPLATE('0I6jq02L1CJRSRRNTrAFd5',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#598=IFCSIMPLEPROPERTYTEMPLATE('2FB1BhLBD13eoEktSjYAMz',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#599=IFCSIMPLEPROPERTYTEMPLATE('2Wz_N36PX04OVofg120wPU',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); -#600=IFCSIMPLEPROPERTYTEMPLATE('1mWHiJJHHAzBOxPMLlL_5K',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#601=IFCSIMPLEPROPERTYTEMPLATE('3h9A2leDLB7OWl37bG7EZF',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#602=IFCSIMPLEPROPERTYTEMPLATE('2iO0ht2yX0hPXoKvJrpGot',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); -#603=IFCSIMPLEPROPERTYTEMPLATE('2Hoey1cOv0mgPNxg57V6Bs',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#604=IFCSIMPLEPROPERTYTEMPLATE('0rDo0Gk_HE7QoR2Pvqf5$G',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#605=IFCSIMPLEPROPERTYTEMPLATE('1HYea1mN11582aVq9yi7Ng',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#606=IFCSIMPLEPROPERTYTEMPLATE('0LaTwwCo5AUxihWMZAUXC6',$,'OverallDiameter','The overall diameter of a object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#607=IFCSIMPLEPROPERTYTEMPLATE('3GDvnt7ez2cvu6rg82OEpk',$,'NumberOfCores','The number of cores.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#608=IFCSIMPLEPROPERTYTEMPLATE('21koJcuMXCzQTw4WI8c0PC',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#609=IFCPROPERTYSETTEMPLATE('2hgz12zpj6PfFjXG4AUzSa',$,'Pset_CableSegmentTypeContactWire','Properties of contact wires used in overhead contact line systems. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type CONTACTWIRESEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CONTACTWIRESEGMENT,IfcCableSegmentType/CONTACTWIRESEGMENT',(#610,#611,#612,#613,#614,#615,#616,#617,#618)); -#610=IFCSIMPLEPROPERTYTEMPLATE('12ZUSNFvfEk9TU9gtMO6aG',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#611=IFCSIMPLEPROPERTYTEMPLATE('065YSBNo19Uh_uvLIvzZca',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); -#612=IFCSIMPLEPROPERTYTEMPLATE('1H6NVXg8L6qAoh_lxjgV2i',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#613=IFCSIMPLEPROPERTYTEMPLATE('0XqVTIyHjDnPmGWCuCL_TC',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#614=IFCSIMPLEPROPERTYTEMPLATE('0Ay668Amn03gOTWIxyLdZ5',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); -#615=IFCSIMPLEPROPERTYTEMPLATE('1PdHdhdgrFavsEyZf0x$Af',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#616=IFCSIMPLEPROPERTYTEMPLATE('2wt9KGoLD4BuoYj44vYjv0',$,'CrossSectionalArea','Cross section area of the phase(s) lead(s).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#617=IFCSIMPLEPROPERTYTEMPLATE('34mTwoynH5rQt9IzYx1S83',$,'TorsionalStrength','Shear strength in torsion.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#618=IFCSIMPLEPROPERTYTEMPLATE('0$X5DNsSb558VP5vbDBXXW',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#619=IFCPROPERTYSETTEMPLATE('0G5DTLNtH9Ngh6WaxHWauC',$,'Pset_CableSegmentTypeCoreSegment','An assembly comprising a conductor with its own insulation (and screens if any)',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CORESEGMENT,IfcCableSegmentType/CORESEGMENT',(#620,#621,#622,#623,#624,#625,#627,#628,#629,#630,#631,#632,#633,#634,#635,#636,#637,#638,#639,#640,#641,#642)); -#620=IFCSIMPLEPROPERTYTEMPLATE('3qETD109D7aR0hLhLmufVZ',$,'OverallDiameter','The overall diameter of a object.\X2\000A000A\X0\The overall diameter of a core (maximum space used).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#621=IFCSIMPLEPROPERTYTEMPLATE('11sUHmK6b0PfaC6Dk0WbuS',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#622=IFCSIMPLEPROPERTYTEMPLATE('3hmyQSqsvCf8HOsMEtp8Zq',$,'RatedTemperature','The range of allowed temperature that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#623=IFCSIMPLEPROPERTYTEMPLATE('0D4zOXOnD6$huaQQZ2Bx_W',$,'ScreenDiameter','The diameter of the screen around an object (if present).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#624=IFCSIMPLEPROPERTYTEMPLATE('0RG0TxBab5LejQriMv8oj0',$,'CoreIdentifier','The core identification used Identifiers may be used such as by color (Black, Brown, Grey) or by number (1, 2, 3) or by IEC phase reference (L1, L2, L3) etc.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#625=IFCSIMPLEPROPERTYTEMPLATE('1Cteuc5xf43vw8yNv9p6BF',$,'SheathColours','Colour of the core (derived from IEC 60757). Note that the combined color ''GreenAndYellow'' shall be used only as Protective Earth (PE) conductors according to the requirements of IEC 60446.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#626,$,$,$,.READWRITE.); -#626=IFCPROPERTYENUMERATION('PEnum_CoreColoursEnum',(IFCLABEL('BLACK'),IFCLABEL('BLUE'),IFCLABEL('BROWN'),IFCLABEL('GOLD'),IFCLABEL('GREEN'),IFCLABEL('GREENANDYELLOW'),IFCLABEL('GREY'),IFCLABEL('ORANGE'),IFCLABEL('PINK'),IFCLABEL('RED'),IFCLABEL('SILVER'),IFCLABEL('TURQUOISE'),IFCLABEL('VIOLET'),IFCLABEL('WHITE'),IFCLABEL('YELLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#627=IFCSIMPLEPROPERTYTEMPLATE('0pePbAWYL6lQ_XM9iQQT4q',$,'Weight','Total weight of object\X2\000A000A\X0\Weight of core kg/km.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#628=IFCSIMPLEPROPERTYTEMPLATE('0kE6koGtD30f6MTQkesERs',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#629=IFCSIMPLEPROPERTYTEMPLATE('2e9_wknrDEF9xsYtzcwWJQ',$,'SelfExtinguishing60332_1','Self Extinguishing cable/core according to IEC 60332.1.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#630=IFCSIMPLEPROPERTYTEMPLATE('0gAKkgepz7g8dAY8iwTdyQ',$,'SelfExtinguishing60332_3','Self Extinguishing cable/core according to IEC 60332.3.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#631=IFCSIMPLEPROPERTYTEMPLATE('0AhCDOP9DCZ8npDS5SdWJj',$,'HalogenProof','Produces small amount of smoke and irritating Deaerator/Gas.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#632=IFCSIMPLEPROPERTYTEMPLATE('3teH_Z1_99ixvd82$EYRiy',$,'FunctionReliable','Element (such as cable, bus, core) maintain given properties/functions over a given (tested) time and conditions. According to IEC standard.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#633=IFCSIMPLEPROPERTYTEMPLATE('1NCrTZzoL6Hx2lajbyQ1az',$,'Standard','The designation of the standard applicable for the definition of the object used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#634=IFCSIMPLEPROPERTYTEMPLATE('2nHZGciQj7L8PZqXIRwVze',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); -#635=IFCSIMPLEPROPERTYTEMPLATE('2QcWigg7j20hZ4vCM8HUCL',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#636=IFCSIMPLEPROPERTYTEMPLATE('3gWoLhZZ55T9dUHuQr8mVD',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#637=IFCSIMPLEPROPERTYTEMPLATE('1lIBA04YPADPVQVI4jBHTQ',$,'LayRatio','The ratio between lay length and the diameter of the single conductor.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#638=IFCSIMPLEPROPERTYTEMPLATE('1kj0m5Pcv9Pg6B9JuVAFL0',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); -#639=IFCSIMPLEPROPERTYTEMPLATE('2RUKaavbv07wCLCTtEklGI',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#640=IFCSIMPLEPROPERTYTEMPLATE('1baF7dglLDV9boMmzHFvmf',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#641=IFCSIMPLEPROPERTYTEMPLATE('2cbwqE5Jr5vA1K$g37cbWC',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#642=IFCSIMPLEPROPERTYTEMPLATE('33q_vsQDf4se9ILw7Su4ad',$,'StrandingMethod','Specifies the method used to strand the cable. Stranding is the process where a particular number of stranding elements are joined together while winding them round a common axis.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#643=IFCPROPERTYSETTEMPLATE('2ZJXuzxWf42O2yI3NKmbi4',$,'Pset_CableSegmentTypeEarthingConductor','Properties of earthing conductors used in overhead contact line systems. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type CONDUCTORSEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CONDUCTORSEGMENT,IfcCableSegmentType/CONDUCTORSEGMENT',(#644)); -#644=IFCSIMPLEPROPERTYTEMPLATE('0d1sivS1j6nw$jjvmox$TA',$,'ResistanceToGround','The resistance through earthing conductor to the ground. Real part of the impedance to earth [SOURCE IEC: 195-01-18]',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#645=IFCPROPERTYSETTEMPLATE('2XDxRjwEvDQfpcxY2YDE_D',$,'Pset_CableSegmentTypeFiberSegment','Properties of fiber segments. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type FIBERSEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/FIBERSEGMENT,IfcCableSegmentType/FIBERSEGMENT',(#646,#648,#649)); -#646=IFCSIMPLEPROPERTYTEMPLATE('37HgkslmPE6uGGC8Vv3Tr2',$,'FiberColour','Indicates the colour of a single fiber.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#647,$,$,$,.READWRITE.); -#647=IFCPROPERTYENUMERATION('PEnum_FiberColour',(IFCLABEL('AQUA'),IFCLABEL('BLACK'),IFCLABEL('BLUE'),IFCLABEL('BROWN'),IFCLABEL('GREEN'),IFCLABEL('ORANGE'),IFCLABEL('RED'),IFCLABEL('ROSE'),IFCLABEL('SLATE'),IFCLABEL('VIOLET'),IFCLABEL('WHITE'),IFCLABEL('YELLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#648=IFCSIMPLEPROPERTYTEMPLATE('208o7TkTT2tglOjG0qWCLT',$,'HasTightJacket','Indicates whether the fiber has a tight jacket or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#649=IFCSIMPLEPROPERTYTEMPLATE('3TD5oDEtz2ivz6kVbsorLb',$,'FiberType','Indicates the type of the single fiber.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#650,$,$,$,.READWRITE.); -#650=IFCPROPERTYENUMERATION('PEnum_FiberType',(IFCLABEL('BEND_INSENSITIVEFIBER'),IFCLABEL('CUTOFFSHIFTEDFIBER'),IFCLABEL('DISPERSIONSHIFTEDFIBER'),IFCLABEL('LOWWATERPEAKFIBER'),IFCLABEL('NON_ZERODISPERSIONSHIFTEDFIBER'),IFCLABEL('OM1'),IFCLABEL('OM2'),IFCLABEL('OM3'),IFCLABEL('OM4'),IFCLABEL('OM5'),IFCLABEL('STANDARDSINGLEMODEFIBER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#651=IFCPROPERTYSETTEMPLATE('2V4jZsRifBnfSrOwiLronD',$,'Pset_CableSegmentTypeFiberTubeSegment','Properties of Fiber tubes segments. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type FIBERTUBESEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/FIBERTUBE,IfcCableSegmentType/FIBERTUBE',(#652,#654)); -#652=IFCSIMPLEPROPERTYTEMPLATE('3FtQHVShT5RfSTq$a2h_Jh',$,'FiberTubeColour','Indicates the colour of a single fiber tube.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#653,$,$,$,.READWRITE.); -#653=IFCPROPERTYENUMERATION('PEnum_FiberColour',(IFCLABEL('AQUA'),IFCLABEL('BLACK'),IFCLABEL('BLUE'),IFCLABEL('BROWN'),IFCLABEL('GREEN'),IFCLABEL('ORANGE'),IFCLABEL('RED'),IFCLABEL('ROSE'),IFCLABEL('SLATE'),IFCLABEL('VIOLET'),IFCLABEL('WHITE'),IFCLABEL('YELLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#654=IFCSIMPLEPROPERTYTEMPLATE('3CYFG_AtX50ucGr2rqtKqm',$,'NumberOfFibers','Indicates the number of fibers in the single tube or cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#655=IFCPROPERTYSETTEMPLATE('2l3opB9LT1GePIXX_NKsSG',$,'Pset_CableSegmentTypeOpticalCableSegment','Properties of optical cables segments. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type OPTICALCABLESEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/OPTICALCABLESEGMENT,IfcCableSegmentType/OPTICALCABLESEGMENT',(#656,#657,#659,#660,#661,#662)); -#656=IFCSIMPLEPROPERTYTEMPLATE('2H2E8txyP7eRLzfv7$Hlwz',$,'NumberOfFibers','Indicates the number of fibers in the single tube or cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#657=IFCSIMPLEPROPERTYTEMPLATE('17Xt0Uwh586fxHmVt02xtq',$,'OpticalCableStructure','Distinguishes between different structures of an optical fiber cable.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#658,$,$,$,.READWRITE.); -#658=IFCPROPERTYENUMERATION('PEnum_OpticalCableStructureType',(IFCLABEL('BREAKOUT'),IFCLABEL('LOOSETUBE'),IFCLABEL('PATCHCORD'),IFCLABEL('PIGTAIL'),IFCLABEL('TIGHTBUFFERED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#659=IFCSIMPLEPROPERTYTEMPLATE('2oil23Xtv6WvLMsYn7lqlX',$,'NumberOfMultiModeFibers','Total number of multi-mode fibers in the optical fiber cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#660=IFCSIMPLEPROPERTYTEMPLATE('0yZ6ms01D5yfjPrmY3tEZd',$,'NumberOfSingleModeFibers','Total number of single-mode fibers in the optical fiber cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#661=IFCSIMPLEPROPERTYTEMPLATE('0vXTNt3uv7txYJivOW_GCb',$,'NumberOfTubes','Number of fiber tubes.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#662=IFCSIMPLEPROPERTYTEMPLATE('20LCuJKFDBJwqxCjg810x9',$,'FiberMode','Indicates the fiber mode.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#663,$,$,$,.READWRITE.); -#663=IFCPROPERTYENUMERATION('PEnum_FiberMode',(IFCLABEL('MULTIMODE'),IFCLABEL('SINGLEMODE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#664=IFCPROPERTYSETTEMPLATE('3Dh9Fv0oD2S9eDOjjM_xrt',$,'Pset_CableSegmentTypeStitchWire','Properties of stitch wires. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type STICHWIRE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/STITCHWIRE,IfcCableSegmentType/STITCHWIRE',(#665,#666,#667,#668,#669)); -#665=IFCSIMPLEPROPERTYTEMPLATE('0Aew29xjn2Ef8bkJzSJWQG',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#666=IFCSIMPLEPROPERTYTEMPLATE('3M9o9$UL5EVOfCyNo7hCxx',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#667=IFCSIMPLEPROPERTYTEMPLATE('3VBwOK$xvCkQ5jJLsT6oj6',$,'MechanicalTension','Nominal value of mechanical force applied to a flow segment.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#668=IFCSIMPLEPROPERTYTEMPLATE('2wSVBioan5BONx$v3V28Ce',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#669=IFCSIMPLEPROPERTYTEMPLATE('1W2gGL83j3qADFgE6Vqjbu',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#670=IFCPROPERTYSETTEMPLATE('3GB3HUNDX0EeHHVm2qj_wh',$,'Pset_CableSegmentTypeWirePairSegment','Properties of wire pair segments. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type WIREPAIRSEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/WIREPAIRSEGMENT,IfcCableSegmentType/WIREPAIRSEGMENT',(#671,#672,#673,#674,#675,#676)); -#671=IFCSIMPLEPROPERTYTEMPLATE('0tCSSlSWjFSA_FptyaJF6R',$,'CharacteristicImpedance','A quantity defined for a mode of propagation at a given frequency in a specific uniform transmission line or uniform waveguide by one of the three following relations:\X2\000A\X0\Z1 = S/ |I|2\X2\000A\X0\Z2 = |U|2 / S\X2\000A\X0\Z3 = U / I\X2\000A\X0\where Z is the complex characteristic impedance, S the complex power and U and I are the values, usually complex, respectively of a voltage and a current conventionally defined for each type of mode by analogy with transmission line equations.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#672=IFCSIMPLEPROPERTYTEMPLATE('0UGKBchNDDehXil7pjTErC',$,'ConductorDiameter','Indicates the conductor diameter. It is only used for twisted and untwisted wire pair.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#673=IFCSIMPLEPROPERTYTEMPLATE('1TL4yxw1v2jfiGuynShaDN',$,'CoreConductorDiameter','Indicates the core conductor diameter. It is only used for coaxial wire pair.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#674=IFCSIMPLEPROPERTYTEMPLATE('3qVPbXI3f5hOqTEbPsuGql',$,'JacketColour','Indicates the colour of the cable or fitting jacket.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#675=IFCSIMPLEPROPERTYTEMPLATE('2jjopgldzBru$sRuOLMSe8',$,'ShieldConductorDiameter','Indicates the shielded conductor diameter. It is only used for coaxial wire pair.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#676=IFCSIMPLEPROPERTYTEMPLATE('0YXhYx7Rj0xQPuUlz1m84S',$,'WirePairType','Indicates the type of wire pair, i.e., twisted, untwisted or coaxial pair.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#677,$,$,$,.READWRITE.); -#677=IFCPROPERTYENUMERATION('PEnum_WirePairType',(IFCLABEL('COAXIAL'),IFCLABEL('TWISTED'),IFCLABEL('UNTWISTED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#678=IFCPROPERTYSETTEMPLATE('3kHqJ4MGz14PRX5F7tu6wn',$,'Pset_CargoCommon','Properties common to the definition of all occurrences of IfcTransportElement and types of IfcTransportElementType with the predefined type set to CARGO.',.PSET_TYPEDRIVENOVERRIDE.,'IfcVehicle/CARGO,IfcVehicleType/CARGO',(#679,#681,#683)); -#679=IFCSIMPLEPROPERTYTEMPLATE('3MQ4ER8bD2pBkbQHBOpC$7',$,'ProcessItem','The type of item (and its measurement method) being modelled within a process. This can be cargo, passengers or vehicles that pass through the system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#680,$,$,$,.READWRITE.); -#680=IFCPROPERTYENUMERATION('PEnum_ProcessItem',(IFCLABEL('BARREL'),IFCLABEL('CGT'),IFCLABEL('PASSENGER'),IFCLABEL('TEU'),IFCLABEL('TONNE'),IFCLABEL('VEHICLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#681=IFCSIMPLEPROPERTYTEMPLATE('1bEJMUrW12jAv2F6lfwipJ',$,'AdditionalProcessing','Any additional or special processing requirements on the associated cargo.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#682,$,$,$,.READWRITE.); -#682=IFCPROPERTYENUMERATION('PEnum_AdditionalProcessing',(IFCLABEL('INSPECTION'),IFCLABEL('ISOLATION'),IFCLABEL('NONE'),IFCLABEL('TARIFFS')),$); -#683=IFCSIMPLEPROPERTYTEMPLATE('3PbO66Jn13Je$dAQKfTw8C',$,'ProcessDirection','The direction of flow of the cargo within the process.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#684,$,$,$,.READWRITE.); -#684=IFCPROPERTYENUMERATION('PEnum_ProcessDirection',(IFCLABEL('EXPORT'),IFCLABEL('IMPORT'),IFCLABEL('TRANSFER')),$); -#685=IFCPROPERTYSETTEMPLATE('3ijcHXlsP1thdfseQBEnIk',$,'Pset_CessBetweenRails','Properties in this property set are applicable for IfcSlab with PredefinedType TRACKSLAB, indicated that the slab is a cess or covering between rails.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab/TRACKSLAB,IfcSlabType/TRACKSLAB',(#686,#688,#690,#691)); -#686=IFCSIMPLEPROPERTYTEMPLATE('0f3dMl0D12RRietYHphJbj',$,'JointRelativePosition','Indicates the relative position of the joint, which lies in the left or right rail or in the middle, or in combination. The left rail is to the left as facing in the direction of increasing stationing values, and the right rail is to the right.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#687,$,$,$,.READWRITE.); -#687=IFCPROPERTYENUMERATION('PEnum_RelativePosition',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#688=IFCSIMPLEPROPERTYTEMPLATE('1qib9v39L98BmteKcD$xC0',$,'CheckRailType','Type of the check rail. Check rail types enumerated in this property are defined based on EN 13674.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#689,$,$,$,.READWRITE.); -#689=IFCPROPERTYENUMERATION('PEnum_CheckRailType',(IFCLABEL('TYPE_33C1'),IFCLABEL('TYPE_40C1'),IFCLABEL('TYPE_47C1'),IFCLABEL('TYPE_CR3_60U'),IFCLABEL('TYPE_R260'),IFCLABEL('TYPE_R320CR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#690=IFCSIMPLEPROPERTYTEMPLATE('0sNd271nT9ewn03DCqnssP',$,'LoadCapacity','Indicates the highest permissible load capacity.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#691=IFCSIMPLEPROPERTYTEMPLATE('3u7nubBb12svRY$SZLG2tk',$,'UsagePurpose','The purpose of usage of the cess between rails, e.g. maintenance, rescue services.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#692,$,$,$,.READWRITE.); -#692=IFCPROPERTYENUMERATION('PEnum_UsagePurpose',(IFCLABEL('MAINTENANCE'),IFCLABEL('RESCUESERVICES'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#693=IFCPROPERTYSETTEMPLATE('3eIY87tA94yeglZBxUvV2J',$,'Pset_ChillerPHistory','Chiller performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcChiller',(#694,#695,#696)); -#694=IFCSIMPLEPROPERTYTEMPLATE('077$lBukLA2B4cV2jw4IHr',$,'Capacity','The capacity of the element.\X2\000A000A\X0\The product of the ideal capacity and the overall volumetric efficiency of the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#695=IFCSIMPLEPROPERTYTEMPLATE('28GCD7hRr53x2Ctov_vAi6',$,'EnergyEfficiencyRatio','Energy efficiency ratio (EER).\X2\000A000A\X0\Ratio of net cooling capacity to the total input rate of electric power applied. By definition, the units are BTU/hour per Watt.\X2\000A\X0\The input electric power may be obtained from Pset_DistributionPortPHistoryElectrical.RealPower on the ''Power'' port of the IfcChiller.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#696=IFCSIMPLEPROPERTYTEMPLATE('2KXLUIHKP9u8uAe5GYJHVw',$,'CoefficientOfPerformance','The Coefficient of performance (COP) is the ratio of heat removed to energy input.\X2\000A\X0\The energy input may be obtained by multiplying\X2\000A\X0\Pset_DistributionPortPHistoryGas.FlowRate on the ''Fuel'' port of the IfcChiller by Pset_MaterialFuel.LowerHeatingValue.\X2\000A\X0\The IfcDistributionPort for fuel has an associated IfcMaterial with fuel properties and is assigned to an IfcPerformanceHistory object nested within this IfcPerformanceHistory object.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#697=IFCPROPERTYSETTEMPLATE('3jJ6fGQz56SvK_Tf7arpQ7',$,'Pset_ChillerTypeCommon','Chiller type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcChiller,IfcChillerType',(#698,#699,#701,#702,#703,#704,#705,#706,#707,#708,#709)); -#698=IFCSIMPLEPROPERTYTEMPLATE('3w3$fGRFrDQOYRbNjfHerj',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#699=IFCSIMPLEPROPERTYTEMPLATE('2rACbGSC51Tvi$gTrNq_Vw',$,'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',$,#700,$,$,$,.READWRITE.); -#700=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#701=IFCSIMPLEPROPERTYTEMPLATE('0rmqU$nM9DVgN_2nJqIgHJ',$,'ChillerCapacity','Nominal cooling capacity of chiller at standardized conditions as defined by the agency having jurisdiction.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#702=IFCSIMPLEPROPERTYTEMPLATE('3VSzRsBCj3rPANoZeEKg7w',$,'NominalEfficiency','Nominal object efficiency under nominal conditions.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#703=IFCSIMPLEPROPERTYTEMPLATE('1ZOjzDjDDAnORTCZoRedab',$,'NominalCondensingTemperature','Chiller condensing temperature.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#704=IFCSIMPLEPROPERTYTEMPLATE('0Wx8dcvwP2oO$Ew24VwtnX',$,'NominalEvaporatingTemperature','Chiller evaporating temperature.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#705=IFCSIMPLEPROPERTYTEMPLATE('2C34xGnHL95x1CNbWPBgCN',$,'NominalHeatRejectionRate','Sum of the refrigeration effect and the heat equivalent of the power input to the compressor.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#706=IFCSIMPLEPROPERTYTEMPLATE('22A5pR0GTAYxPNEHFD3ARY',$,'NominalPowerConsumption','Nominal total power consumption.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#707=IFCSIMPLEPROPERTYTEMPLATE('0YBE$y1cj5NOVnCqu$SSZL',$,'CapacityCurve','Chiller cooling capacity is a function of condensing temperature and evaporating temperature, data is in table form, Capacity = f (TempCon, TempEvp), capacity = a1+b1*Tei+c1*Tei\\^2+d1*Tci+e1*Tci\\^2+f1*Tei*Tci.\X2\000A\X0\This table uses multiple input variables; to represent, both DefiningValues and DefinedValues lists are null and IfcTable is attached using IfcPropertyConstraintRelationship and IfcMetric. Columns are specified in the following order:\X2\000A\X0\1.IfcPowerMeasure:Capacity\X2\000A\X0\2.IfcThermodynamicTemperatureMeasure:CondensingTemperature\X2\000A\X0\3.IfcThermodynamicTemperatureMeasure:EvaporatingTemperature',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcPowerMeasure',$,$,$,$,.READWRITE.); -#708=IFCSIMPLEPROPERTYTEMPLATE('3ppjF99xD1aQ7K9MIF5DI9',$,'CoefficientOfPerformanceCurve','Chiller coefficient of performance (COP) is function of condensing temperature and evaporating temperature, data is in table form, COP= f (TempCon, TempEvp), COP = a2+b2*Tei+c2*Tei\\^2+d2*Tci+e2*Tci\\^2+f2*Tei*Tci.\X2\000A\X0\This table uses multiple input variables; to represent, both DefiningValues and DefinedValues lists are null and IfcTable is attached using IfcPropertyConstraintRelationship and IfcMetric. Columns are specified in the following order:\X2\000A\X0\1.IfcPositiveRatioMeasure:CoefficientOfPerformance\X2\000A\X0\2.IfcThermodynamicTemperatureMeasure:CondensingTemperature\X2\000A\X0\3.IfcThermodynamicTemperatureMeasure:EvaporatingTemperature',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcReal',$,$,$,$,.READWRITE.); -#709=IFCSIMPLEPROPERTYTEMPLATE('1zTL2ZoKfFt80tdhp70Ow1',$,'FullLoadRatioCurve','Ratio of actual power to full load power as a quadratic function of part load, at certain condensing and evaporating temperature, FracFullLoadPower = f ( PartLoadRatio).',.P_TABLEVALUE.,'IfcPositiveRatioMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); -#710=IFCPROPERTYSETTEMPLATE('15VoRz61P1UfWofpSFQXhO',$,'Pset_ChimneyCommon','Properties common to the definition of all occurrence and type objects of chimneys.',.PSET_TYPEDRIVENOVERRIDE.,'IfcChimney,IfcChimneyType',(#711,#712,#714,#715,#716,#717,#718)); -#711=IFCSIMPLEPROPERTYTEMPLATE('3uZcVRXXf0qxr4ixkzGuHe',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#712=IFCSIMPLEPROPERTYTEMPLATE('3UYWyhwVjC$xcdRFgQ5E6B',$,'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',$,#713,$,$,$,.READWRITE.); -#713=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#714=IFCSIMPLEPROPERTYTEMPLATE('0wr4GfVYvE3RUZ3Za509cm',$,'NumberOfDrafts','Number of the chimney drafts, continuous holes in the chimney through which the air passes, within the single chimney.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#715=IFCSIMPLEPROPERTYTEMPLATE('15jbkT15z19AVokiDGapAb',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#716=IFCSIMPLEPROPERTYTEMPLATE('2Snre6OV96LxEk38JUvYLG',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#717=IFCSIMPLEPROPERTYTEMPLATE('02BkTuUnz0lwZwd372g0eX',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#718=IFCSIMPLEPROPERTYTEMPLATE('1PT7753cL2zQngWlQFfqrm',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#719=IFCPROPERTYSETTEMPLATE('2sq_koa3f6bvDxg1A2VQwt',$,'Pset_CivilElementCommon','Properties common to the definition of all occurrence and type objects of civil element.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCivilElement,IfcCivilElementType',(#720,#721)); -#720=IFCSIMPLEPROPERTYTEMPLATE('2B8_WVylbBiQkmSP4$usEk',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#721=IFCSIMPLEPROPERTYTEMPLATE('0iq9toTEr7Ywhv6RkRsLtK',$,'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',$,#722,$,$,$,.READWRITE.); -#722=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#723=IFCPROPERTYSETTEMPLATE('0YS2ckoYnCP8oa1wdNeSAz',$,'Pset_CoaxialCable','Properties applicable to a coaxial cable, which is a copper cable with a variable number of copper coaxial pair conductors used to transmit data by means of electrical signals, especially at radio frequency. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type CABLESEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CABLESEGMENT,IfcCableSegmentType/CABLESEGMENT',(#724,#725,#726,#727,#728,#729,#730)); -#724=IFCSIMPLEPROPERTYTEMPLATE('3fb5mJ61XEOgBRvN_SQNcp',$,'CharacteristicImpedance','A quantity defined for a mode of propagation at a given frequency in a specific uniform transmission line or uniform waveguide by one of the three following relations:\X2\000A\X0\Z1 = S/ |I|2\X2\000A\X0\Z2 = |U|2 / S\X2\000A\X0\Z3 = U / I\X2\000A\X0\where Z is the complex characteristic impedance, S the complex power and U and I are the values, usually complex, respectively of a voltage and a current conventionally defined for each type of mode by analogy with transmission line equations.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#725=IFCSIMPLEPROPERTYTEMPLATE('2fU51yKPX74gzSrCKPTgUS',$,'CouplingLoss','Indicates the coupling loss of a leaky coaxial cable (radiating cable).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#726=IFCSIMPLEPROPERTYTEMPLATE('1WJG9PUTLAKwHRM2wzByH3',$,'MaximumTransmissionAttenuation','Indicates the Maximum transmission attenuation of feeder.',.P_SINGLEVALUE.,'IfcSoundPowerLevelMeasure',$,$,$,$,$,.READWRITE.); -#727=IFCSIMPLEPROPERTYTEMPLATE('0FXQbgYCP4awv51$hh42AF',$,'NumberOfCoaxialPairs','Indicates the total number of coaxial pairs in the coaxial cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#728=IFCSIMPLEPROPERTYTEMPLATE('1netzADuX7JxupSbNX4BWM',$,'PropagationSpeedCoefficient','Indicates the propagation speed coefficient.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#729=IFCSIMPLEPROPERTYTEMPLATE('3OqdigB2PCvx4JxLDs69Na',$,'TransmissionLoss','Indicates the transmission loss of the leaky coaxial cable (radiating cable).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#730=IFCSIMPLEPROPERTYTEMPLATE('1Mf76sYLvDtuXMtyh7xNEs',$,'RadiantFrequency','Indicates the radiant frequency of the leaky coaxial cable (radiating cable).',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#731=IFCPROPERTYSETTEMPLATE('17cFPHznT38fZxCGLunq6e',$,'Pset_CoilOccurrence','Coil occurrence attributes attached to an instance of IfcCoil.',.PSET_OCCURRENCEDRIVEN.,'IfcCoil',(#732)); -#732=IFCSIMPLEPROPERTYTEMPLATE('2p5JoXUNX3vfxwka1L6mbA',$,'HasSoundAttenuation','TRUE if the coil has sound attenuation, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#733=IFCPROPERTYSETTEMPLATE('0RV924xg50mhD2bq1TRxHJ',$,'Pset_CoilPHistory','Coil performance history common attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcCoil',(#734,#735,#736,#737)); -#734=IFCSIMPLEPROPERTYTEMPLATE('30ODKK4Pv5EAivFd40H31J',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#735=IFCSIMPLEPROPERTYTEMPLATE('0al3BzRLb1hfzhGAyc8VGI',$,'AirPressureDropCurveHistory','Air pressure drop curve, pressure drop \X2\2013\X0\ flow rate curve, AirPressureDrop = f (AirflowRate).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#736=IFCSIMPLEPROPERTYTEMPLATE('2jgYjHidv8veICz4dDHoWP',$,'SoundCurveHistory','Regenerated sound versus air-flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#737=IFCSIMPLEPROPERTYTEMPLATE('1nYEGDR8P3lQWE3QWQQcj8',$,'FaceVelocity','Air velocity through the coil.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#738=IFCPROPERTYSETTEMPLATE('1raPB6MsT97eLwvTTXXBh1',$,'Pset_CoilTypeCommon','Coil type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCoil,IfcCoilType',(#739,#740,#742,#743,#744,#745,#746,#747)); -#739=IFCSIMPLEPROPERTYTEMPLATE('3Mr0ZjDsPBsPSRO6JEN7SI',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#740=IFCSIMPLEPROPERTYTEMPLATE('2jC9oWbKL0G95Rvl7o0NdF',$,'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',$,#741,$,$,$,.READWRITE.); -#741=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#742=IFCSIMPLEPROPERTYTEMPLATE('0pINQtvHn0_wclsBqhyitl',$,'OperationalTemperatureRange','The temperature range in which the device operates normally.\X2\000A000A\X0\Allowable operational air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#743=IFCSIMPLEPROPERTYTEMPLATE('1rTtLp2jnBT9JUEp5_Jk4U',$,'AirFlowRateRange','Possible range of airflow that can be delivered.\X2\000A000A\X0\For cases where there is no airflow across the coil (e.g. electric coil in a floor slab), then the value is zero.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#744=IFCSIMPLEPROPERTYTEMPLATE('0_5T_tNgL4exP8hu3hFXmV',$,'NominalSensibleCapacity','Nominal sensible capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#745=IFCSIMPLEPROPERTYTEMPLATE('0RJ2RVSebC4wvoJSnNaLh2',$,'NominalLatentCapacity','Nominal latent capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#746=IFCSIMPLEPROPERTYTEMPLATE('07d_Mwl7r2eB3Lx0MuRP4K',$,'NominalUA','Nominal UA value.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#747=IFCSIMPLEPROPERTYTEMPLATE('0pMCGtAWb5gwJHWcpTmKeE',$,'CoilPlacement','Indicates the placement of the coil.\X2\000A\X0\FLOOR indicates an under floor heater (if coil type is WATERHEATINGCOIL or ELECTRICHEATINGCOIL);\X2\000A\X0\CEILING indicates a cooling ceiling (if coil type is WATERCOOLINGCOIL);\X2\000A\X0\UNIT indicates that the coil is part of a cooling or heating unit, like cooled beam, etc.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#748,$,$,$,.READWRITE.); -#748=IFCPROPERTYENUMERATION('PEnum_CoilPlacementType',(IFCLABEL('CEILING'),IFCLABEL('FLOOR'),IFCLABEL('UNIT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#749=IFCPROPERTYSETTEMPLATE('2upugkGLn4Fgckmjsf7mcp',$,'Pset_CoilTypeHydronic','Hydronic coil type attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCoil,IfcCoilType',(#750,#751,#753,#755,#757,#758,#759,#760,#761,#762,#763,#764,#765)); -#750=IFCSIMPLEPROPERTYTEMPLATE('3cw5qT7gT3gBsNfaSkpnwC',$,'FluidPressureRange','Allowable water working pressure range inside the tube.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#751=IFCSIMPLEPROPERTYTEMPLATE('3fledXRUP9c9NsvGlmd9Vh',$,'CoilCoolant','The fluid used for heating or cooling used by the hydronic coil.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#752,$,$,$,.READWRITE.); -#752=IFCPROPERTYENUMERATION('PEnum_CoilCoolant',(IFCLABEL('BRINE'),IFCLABEL('GLYCOL'),IFCLABEL('WATER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#753=IFCSIMPLEPROPERTYTEMPLATE('0qErV5t1P3dw3Kd2IDNUhv',$,'CoilConnectionDirection','Coil connection direction (facing into the air stream).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#754,$,$,$,.READWRITE.); -#754=IFCPROPERTYENUMERATION('PEnum_CoilConnectionDirection',(IFCLABEL('LEFT'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#755=IFCSIMPLEPROPERTYTEMPLATE('3urdow$BH2ke$2omdWNmnF',$,'CoilFluidArrangement','Fluid flow arrangement of the coil.CrossCounterFlow: Air and water flow enter in different directions.\X2\000A\X0\CrossFlow: Air and water flow are perpendicular.\X2\000A\X0\CrossParallelFlow: Air and water flow enter in same directions.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#756,$,$,$,.READWRITE.); -#756=IFCPROPERTYENUMERATION('PEnum_CoilFluidArrangement',(IFCLABEL('CROSSCOUNTERFLOW'),IFCLABEL('CROSSFLOW'),IFCLABEL('CROSSPARALLELFLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#757=IFCSIMPLEPROPERTYTEMPLATE('1W9V8H9Rv5mh_kkCN_QUh9',$,'CoilFaceArea','Coil face area in the direction against air the flow.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#758=IFCSIMPLEPROPERTYTEMPLATE('0JICk6IRj0Xebp$4yEGvRB',$,'HeatExchangeSurfaceArea','Heat exchange surface area associated with U-value.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#759=IFCSIMPLEPROPERTYTEMPLATE('2nKyJAfqTEBRqXsghVpf1G',$,'PrimarySurfaceArea','Primary heat transfer surface area of the tubes and headers.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#760=IFCSIMPLEPROPERTYTEMPLATE('0k9Tw1wZH3Q8YA_R1T1LOy',$,'SecondarySurfaceArea','Secondary heat transfer surface area created by fins.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#761=IFCSIMPLEPROPERTYTEMPLATE('1DIFZyb7r8auiFr9AdDilN',$,'TotalUACurves','Total UA curves, UA - air and water velocities, UA = [(C1 * AirFlowRate\\^0.8)\\^-1 + (C2 * WaterFlowRate\\^0.8)\\^-1]\\^-1. Note: as two variables are used, DefiningValues and DefinedValues are null, and values are stored in IfcTable in the following order: AirFlowRate,WaterFlowRate,UA. The IfcTable is related to IfcPropertyTableValue using IfcMetric and IfcPropertyConstraintRelationship.',.P_TABLEVALUE.,'IfcReal','IfcVolumetricFlowRateMeasure',$,$,$,$,.READWRITE.); -#762=IFCSIMPLEPROPERTYTEMPLATE('1IsHysxfTEYeLqDg$xFPZw',$,'WaterPressureDropCurve','Water pressure drop curve, pressure drop \X2\2013\X0\ flow rate curve, WaterPressureDrop = f(WaterflowRate).',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#763=IFCSIMPLEPROPERTYTEMPLATE('0$cBgoFBL4HuEP5r8SvdjB',$,'BypassFactor','Fraction of air that is bypassed by the coil (0-1).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#764=IFCSIMPLEPROPERTYTEMPLATE('20vP5ArFn5iP05gUgSxYUy',$,'SensibleHeatRatio','Air-side sensible heat ratio, or fraction of sensible heat transfer to the total heat transfer.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#765=IFCSIMPLEPROPERTYTEMPLATE('0jg9h2TYP2AAu5utawz96D',$,'WetCoilFraction','Fraction of coil surface area that is wet (0-1).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#766=IFCPROPERTYSETTEMPLATE('1IpI9G2H93IfFw0iFArrGQ',$,'Pset_ColumnCommon','Properties common to the definition of all occurrence and type objects of column.',.PSET_TYPEDRIVENOVERRIDE.,'IfcColumn,IfcColumnType',(#767,#768,#770,#771,#772,#773,#774,#775)); -#767=IFCSIMPLEPROPERTYTEMPLATE('2Uoxyo_Mn9duVz$qYqRCpd',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#768=IFCSIMPLEPROPERTYTEMPLATE('3xzWrae2bDvBeBeOT351Qf',$,'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',$,#769,$,$,$,.READWRITE.); -#769=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#770=IFCSIMPLEPROPERTYTEMPLATE('2GBk0cAkX1OA2tpvqWzeH2',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#771=IFCSIMPLEPROPERTYTEMPLATE('2aVZHaekT3D8GAyL2aJrwl',$,'Roll','Rotation against the longitudinal axis.\X2\000A000A\X0\Relative to the global X direction for all columns that are vertical in regard to the global coordinate system (Profile direction equals global X is Roll = 0.). For all non-vertical columns the following applies: Roll is relative to the global Z direction f(Profile direction of non-vertical columns that equals global Z is Roll = 0.)The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.Note: new property in IFC4',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#772=IFCSIMPLEPROPERTYTEMPLATE('0HZoJify91pP1ibno2Adk0',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#773=IFCSIMPLEPROPERTYTEMPLATE('3W6vnqGg91cg3ah$IPg5mL',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#774=IFCSIMPLEPROPERTYTEMPLATE('3njp29ZL9FjB0WMKYZqNER',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#775=IFCSIMPLEPROPERTYTEMPLATE('0fsbJ4v1PFCh0KjEC9VyO5',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#776=IFCPROPERTYSETTEMPLATE('3sTTUcXNX8sgFrfkbTy7zm',$,'Pset_CommunicationsAppliancePHistory','Captures realtime information for communications devices, such as for server farm energy usage. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcCommunicationsAppliance',(#777)); -#777=IFCSIMPLEPROPERTYTEMPLATE('3R$vCzyYj49OVqu7ZlMWEW',$,'PowerState','Indicates the power state of the device where True is on and False is off.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#778=IFCPROPERTYSETTEMPLATE('3LSfXMUW9FF8N_q0VG33Ub',$,'Pset_CommunicationsApplianceTypeAntenna','Properties common to an antenna. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with the predefined type ANTENNA.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/ANTENNA,IfcCommunicationsApplianceType/ANTENNA',(#779,#780,#782,#784)); -#779=IFCSIMPLEPROPERTYTEMPLATE('0Xot7zG_P4L9$DkGPZtoaI',$,'AntennaGain','Indicates the antenna gain, which is a ratio of the power transmitted by an antenna in a specific direction compared to an isotropic antenna.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#780=IFCSIMPLEPROPERTYTEMPLATE('1rjjUy5IX9nPFez_XEFUHi',$,'PolarizationMode','Indicates the polarization mode of antenna.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#781,$,$,$,.READWRITE.); -#781=IFCPROPERTYENUMERATION('PEnum_PolarizationMode',(IFCLABEL('DUALPOLARIZATION'),IFCLABEL('SINGLEPOLARIZATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#782=IFCSIMPLEPROPERTYTEMPLATE('0JyBqMKKzAgvAU7xRcx4b0',$,'RadiationPattern','Indicates the radiation pattern of antenna.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#783,$,$,$,.READWRITE.); -#783=IFCPROPERTYENUMERATION('PEnum_RadiationPattern',(IFCLABEL('DIRECTIONAL'),IFCLABEL('FANBEAM'),IFCLABEL('OMNIDIRECTIONAL'),IFCLABEL('PENCILBEAM'),IFCLABEL('SHAPEDBEAM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#784=IFCSIMPLEPROPERTYTEMPLATE('2Occf6wcz30gdm9mv27Y4h',$,'AntennaType','Indicates the type of antenna.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#785,$,$,$,.READWRITE.); -#785=IFCPROPERTYENUMERATION('PEnum_AntennaType',(IFCLABEL('CEILING'),IFCLABEL('PANEL'),IFCLABEL('YAGI'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#786=IFCPROPERTYSETTEMPLATE('11iCiiNEr4s80A0Z5q7ZXm',$,'Pset_CommunicationsApplianceTypeAutomaton','Properties common to automaton appliances. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type of AUTOMATON.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/AUTOMATON,IfcCommunicationsApplianceType/AUTOMATON',(#787,#789)); -#787=IFCSIMPLEPROPERTYTEMPLATE('08K$txaMX5zAG$UtBkKfHg',$,'InputSignalType','The type of the input signal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#788,$,$,$,.READWRITE.); -#788=IFCPROPERTYENUMERATION('PEnum_InputOutputSignalType',(IFCLABEL('CURRENT'),IFCLABEL('VOLTAGE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#789=IFCSIMPLEPROPERTYTEMPLATE('3O0M5CPbvF89DADvDc8XsP',$,'OutputSignalType','The type of the output signal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#790,$,$,$,.READWRITE.); +#522=IFCSIMPLEPROPERTYTEMPLATE('2o6ZW7xWTDwhX2eX3VHEha',$,'ConnectorBGender','Indicates the gender of B-end connector.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#523,$,$,$,.READWRITE.); +#523=IFCPROPERTYENUMERATION('PEnum_DistributionPortGender',(IFCLABEL('FEMALE'),IFCLABEL('MALE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#524=IFCPROPERTYSETTEMPLATE('1ZcNw5iqb4nQQa1ypheEc0',$,'Pset_CableSegmentOccurenceFiberSegment','Properties of fiber segment occurrences. This property set is applicable to occurrences of IfcCableSegment with predefined type FIBERSEGMENT.',.PSET_OCCURRENCEDRIVEN.,'IfcCableSegment/FIBERSEGMENT',(#525)); +#525=IFCSIMPLEPROPERTYTEMPLATE('3E2EG5p59AluQbNPn9MtuU',$,'InUse','Indicates whether the fiber has been assigned to some specific use.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#526=IFCPROPERTYSETTEMPLATE('1mgkk0KE1De8gtESOkrfDD',$,'Pset_CableSegmentOccurrence','Properties for the occurrence of an electrical cable, core or conductor that conforms to a type as specified by an appropriate type definition within IFC. NOTE: Maximum allowed voltage drop should be derived from the property within Pset_ElectricalCircuit.',.PSET_OCCURRENCEDRIVEN.,'IfcCableSegment',(#527,#528,#529,#530,#531,#533,#534,#535,#536,#538,#539,#540,#541,#542,#543)); +#527=IFCSIMPLEPROPERTYTEMPLATE('1tFix9eiX1NhF9Y5hHH131',$,'DesignAmbientTemperature','The highest and lowest local ambient temperature likely to be encountered.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#528=IFCSIMPLEPROPERTYTEMPLATE('0Iye1mspT7mO8cGWER87RO',$,'UserCorrectionFactor','An arbitrary correction factor that may be applied by the user.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#529=IFCSIMPLEPROPERTYTEMPLATE('0t9qaWEqb2S9fntiCpeR_V',$,'NumberOfParallelCircuits','Number of parallel circuits.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#530=IFCSIMPLEPROPERTYTEMPLATE('1HXCsiO9zAdhMrKcKgoVxq',$,'InstallationMethod','Method of installation of cable/conductor. Installation methods are typically defined by reference in standards such as IEC 60364-5-52, table 52A-1 or BS7671 Appendix 4 Table 4A1 etc. Selection of the value to be used should be determined from such a standard according to local usage.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#531=IFCSIMPLEPROPERTYTEMPLATE('2J9BBFy89A6RUYIqTvR8JW',$,'InstallationMethodFlagEnum','Special installation conditions relating to particular types of installation based on IEC60364-5-52:2001 reference installation methods C and D.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#532,$,$,$,.READWRITE.); +#532=IFCPROPERTYENUMERATION('PEnum_InstallationMethodFlagEnum',(IFCLABEL('BELOWCEILING'),IFCLABEL('INDUCT'),IFCLABEL('INSOIL'),IFCLABEL('ONWALL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#533=IFCSIMPLEPROPERTYTEMPLATE('0yunUf8Oz9kAXcisoK3_Xt',$,'DistanceBetweenParallelCircuits','Distance measured between parallel circuits.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#534=IFCSIMPLEPROPERTYTEMPLATE('06nQtZaFL1exY5A1oXw4r7',$,'SoilConductivity','Thermal conductivity of soil. Generally, within standards such as IEC 60364-5-52, table 52A-16, the resistivity of soil is required (measured in [SI] units of degK.m /W). This is the reciprocal of the conductivity value and needs to be calculated accordingly.',.P_SINGLEVALUE.,'IfcThermalConductivityMeasure',$,$,$,$,$,.READWRITE.); +#535=IFCSIMPLEPROPERTYTEMPLATE('1$UljvOvvEORnyPJd84HKJ',$,'CarrierStackNumber','Number of carrier segments (tray, ladder etc.) that are vertically stacked (vertical is measured as the z-axis of the local coordinate system of the carrier segment).',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#536=IFCSIMPLEPROPERTYTEMPLATE('1NRPBIrxLDQ95S3s5c8QVn',$,'MountingMethod','The method of mounting cable segment occurrences on a cable carrier occurrence from which the method required can be selected. This is for the purpose of carrying out ''worst case'' cable sizing calculations and may be a conceptual requirement rather than a statement of the physical occurrences of cable and carrier segments.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#537,$,$,$,.READWRITE.); +#537=IFCPROPERTYENUMERATION('PEnum_MountingMethodEnum',(IFCLABEL('LADDER'),IFCLABEL('PERFORATEDTRAY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#538=IFCSIMPLEPROPERTYTEMPLATE('2WbUUWg11B6Qc6jHGhG_jo',$,'IsHorizontalCable','Indication of whether the cable occurrences are mounted horizontally (= TRUE) or vertically (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#539=IFCSIMPLEPROPERTYTEMPLATE('1HMX1_tHj5i8e5q3bhLYEJ',$,'IsMountedFlatCable','Indication of whether the cable occurrences are mounted flat (= TRUE) or in a trefoil pattern (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#540=IFCSIMPLEPROPERTYTEMPLATE('2vVO_JeR1D3RmKJBacBN69',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#541=IFCSIMPLEPROPERTYTEMPLATE('37taBaSPP4iwUzr88cj5A9',$,'MaximumCableLength','Maximum cable length based on voltagedrop. NOTE: This value may also be specified as a constraint within an IFC model if required but is included within the property set at this stage pending implementation of the required capabilities within software applications.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#542=IFCSIMPLEPROPERTYTEMPLATE('3LO3eCJ1r4getqUmdq4bS4',$,'PowerLoss','The power loss in [W].\X2\000A000A\X0\Total loss of power across this cable.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#543=IFCSIMPLEPROPERTYTEMPLATE('3PZvWajuTDz89kLwMesp4T',$,'SequentialCode','Indicates the sequential code of the cable or wire.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#544=IFCPROPERTYSETTEMPLATE('0Du_pfLufAWBgLnDlnA4oy',$,'Pset_CableSegmentTypeBusBarSegment','Properties specific to busbar cable segments.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/BUSBARSEGMENT,IfcCableSegmentType/BUSBARSEGMENT',(#545,#546,#547,#548,#549,#550,#551,#552,#553,#554,#555,#556,#558,#559,#560)); +#545=IFCSIMPLEPROPERTYTEMPLATE('0qzp9x5r98Vw$d1D9WWN5Q',$,'IsHorizontalBusbar','Indication of whether the busbar occurrences are routed horizontally (= TRUE) or vertically (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#546=IFCSIMPLEPROPERTYTEMPLATE('1FpatILjHDIRmV1_o1xi20',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#547=IFCSIMPLEPROPERTYTEMPLATE('2CtLdElm5CAg8kBoy0JmLt',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#548=IFCSIMPLEPROPERTYTEMPLATE('0ULlShzWP01BRW13MIlPHO',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#549=IFCSIMPLEPROPERTYTEMPLATE('2uvtdaVrT4leZfnTRqFskO',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); +#550=IFCSIMPLEPROPERTYTEMPLATE('3cjEmFu_T1FxAttGk8Ow$M',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#551=IFCSIMPLEPROPERTYTEMPLATE('3Lh6Kvvh5DxQvhl9xUtKD_',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#552=IFCSIMPLEPROPERTYTEMPLATE('0spYDANerDi8RDUkf1W62x',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); +#553=IFCSIMPLEPROPERTYTEMPLATE('2xHVDRDLr5rxIgh_PtLepE',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#554=IFCSIMPLEPROPERTYTEMPLATE('3xVbOe2JbCFhNY_0MucbAs',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#555=IFCSIMPLEPROPERTYTEMPLATE('0WwDyaXBDBxxQJp3U9MPgy',$,'CrossSectionalArea','Cross section area of the phase(s) lead(s).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#556=IFCSIMPLEPROPERTYTEMPLATE('1oCm26PfzAERsuxmmJzRdp',$,'InsulationMethod','The method used to insulate.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#557,$,$,$,.READWRITE.); +#557=IFCPROPERTYENUMERATION('PEnum_InsulatorType',(IFCLABEL('LONGRODINSULATOR'),IFCLABEL('PININSULATOR'),IFCLABEL('POSTINSULATOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#558=IFCSIMPLEPROPERTYTEMPLATE('0lyg$q1cPD_xUrb4lXPcaC',$,'OverallDiameter','The overall diameter of a object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#559=IFCSIMPLEPROPERTYTEMPLATE('3b8kTVYTr3PhTjqE2NckAg',$,'OperationalTemperatureRange','The temperature range in which the device operates normally.\X2\000A000A\X0\Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#560=IFCSIMPLEPROPERTYTEMPLATE('0TXfthz_H5V94p2Ch6KMye',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#561=IFCPROPERTYSETTEMPLATE('25DL3WRUX3KvOtV9daOMCs',$,'Pset_CableSegmentTypeCableSegment','Electrical cable with a specific purpose to lead electric current within a circuit or any other electric construction. Includes all types of electric cables, mainly several electrical segments wrapped together, e.g. cable, tube, busbar. Note that the number of conductors within a cable is determined by an aggregation mechanism that aggregates the conductors within the cable. A single-core cable is defined in IEV 461-06-02 as being ''a cable having only one core''; a multiconductor cable is defined in IEV 461-06-03 as b eing ''a cable having more than one conductor, some of which may be uninsulated''; a mulicore cable is defined in IEV 461-06-04 as being ''a cable having more than one core''.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CABLESEGMENT,IfcCableSegmentType/CABLESEGMENT',(#562,#563,#564,#565,#566,#567,#568,#569,#570,#571,#572,#573,#574,#575,#576,#577,#578,#579,#580,#581,#582,#583,#584)); +#562=IFCSIMPLEPROPERTYTEMPLATE('0QBgawcQ93KApBZkoua7sY',$,'Standard','The designation of the standard applicable for the definition of the object used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#563=IFCSIMPLEPROPERTYTEMPLATE('0EQGjsoA57peC4D_alWgT3',$,'NumberOfCores','The number of cores.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#564=IFCSIMPLEPROPERTYTEMPLATE('2eV$AkUr54mP90wY9pBbFA',$,'OverallDiameter','The overall diameter of a object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#565=IFCSIMPLEPROPERTYTEMPLATE('0vj_XHZgjFNBzry29P5kg8',$,'RatedTemperature','The range of allowed temperature that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#566=IFCSIMPLEPROPERTYTEMPLATE('0RbDY1vaz5ehrsHLoES8ZG',$,'ScreenDiameter','The diameter of the screen around an object (if present).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#567=IFCSIMPLEPROPERTYTEMPLATE('3xUIsBrJTA8erHhvw9U_Zi',$,'HasProtectiveEarth','Indicates whether the object has a protective earth connection (=TRUE) or not (= FALSE).\X2\000A000A\X0\One core has protective earth marked insulation, Yellow/Green.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#568=IFCSIMPLEPROPERTYTEMPLATE('0GhI6UwpH6DAF3xczr2Fn_',$,'MaximumOperatingTemperature','The maximum temperature at which a cable or bus is certified to operate.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#569=IFCSIMPLEPROPERTYTEMPLATE('2SCdaLml50lOT1Rj2$XKUu',$,'MaximumShortCircuitTemperature','The maximum short circuit temperature at which a cable or bus is certified to operate.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#570=IFCSIMPLEPROPERTYTEMPLATE('0x0_WRnGDCrOBpAVlsC_6h',$,'SpecialConstruction','Special construction capabilities like self-supporting, flat devidable cable or bus flat non devidable cable or bus supporting elements inside (steal, textile, concentric conductor). Note that materials used should be agreed between exchange participants before use.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#571=IFCSIMPLEPROPERTYTEMPLATE('0fe4n31590dP15Y7IukZHo',$,'Weight','Total weight of object\X2\000A000A\X0\Weight of cable kg/km.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#572=IFCSIMPLEPROPERTYTEMPLATE('1AuHEpfvXEMBY9jgnx4k$P',$,'SelfExtinguishing60332_1','Self Extinguishing cable/core according to IEC 60332.1.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#573=IFCSIMPLEPROPERTYTEMPLATE('2nnlDUrWL3qPiihljnL__q',$,'SelfExtinguishing60332_3','Self Extinguishing cable/core according to IEC 60332.3.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#574=IFCSIMPLEPROPERTYTEMPLATE('0MLmjuiSn0jPaZc4M3Nk$4',$,'HalogenProof','Produces small amount of smoke and irritating Deaerator/Gas.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#575=IFCSIMPLEPROPERTYTEMPLATE('0XendF7ub3aOtGL80Pir2e',$,'FunctionReliable','Element (such as cable, bus, core) maintain given properties/functions over a given (tested) time and conditions. According to IEC standard.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#576=IFCSIMPLEPROPERTYTEMPLATE('1V7plYky5F797sYM5rAi6Z',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#577=IFCSIMPLEPROPERTYTEMPLATE('39u313OMT4Xwt7R8PyBN$P',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#578=IFCSIMPLEPROPERTYTEMPLATE('3PiNJt91f4jPUSgWsumUJo',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#579=IFCSIMPLEPROPERTYTEMPLATE('1v8yHLc2T98AygJrPxJ23Z',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); +#580=IFCSIMPLEPROPERTYTEMPLATE('0Ssu$TKcD2fONB$QSTJhPd',$,'MaximumCurrent','The maximum allowed current that a device is certified to handle.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#581=IFCSIMPLEPROPERTYTEMPLATE('3BEMt6GEb1rAWunhWHJV8t',$,'MaximumBendingRadius','The maximum bending radius that the cable could withstand.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#582=IFCSIMPLEPROPERTYTEMPLATE('1aKVpZO1TAlPYMZfkZLHVy',$,'NumberOfWires','The number of wires used in the element.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#583=IFCSIMPLEPROPERTYTEMPLATE('3BeSvFR7j2he0dUzlCld7Y',$,'InsulationVoltage','The insulation voltage.\X2\000A000A\X0\It indicates the wire-to-ground (metal sheath) insulation voltage or the insulation voltage between the wires.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#584=IFCSIMPLEPROPERTYTEMPLATE('3OtJEXiyTFpgLyV189I1G6',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#585=IFCPROPERTYSETTEMPLATE('3FXTH9TFTDqQsb2jbIQUY0',$,'Pset_CableSegmentTypeCommon','Properties for the definitions of electrical cable segments.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment,IfcCableSegmentType',(#586,#587)); +#586=IFCSIMPLEPROPERTYTEMPLATE('0XkT$uUR9289SeHCT_IDJg',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#587=IFCSIMPLEPROPERTYTEMPLATE('2fdeJf1HH2yhemZXWIOdVI',$,'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',$,#588,$,$,$,.READWRITE.); +#588=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#589=IFCPROPERTYSETTEMPLATE('2HqV3GJBfBAea367yqADAc',$,'Pset_CableSegmentTypeConductorSegment','An electrical conductor is a single linear element with the specific purpose to lead electric current. The core of one lead is normally single wired or multiwired which are intertwined. According to IEC 60050: IEV 195-01-07, a conductor is a conductive part intended to carry a specified electric current.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CONDUCTORSEGMENT,IfcCableSegmentType/CONDUCTORSEGMENT',(#590,#591,#593,#595,#597,#599,#600,#601,#602,#603,#604,#605,#606,#607,#608,#609,#610)); +#590=IFCSIMPLEPROPERTYTEMPLATE('1aQOorZ656yQKkeX0PDUrH',$,'CrossSectionalArea','Cross section area of the phase(s) lead(s).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#591=IFCSIMPLEPROPERTYTEMPLATE('2LQK9RejzBcfgdoxlbhvL7',$,'Function','Type of function for which the conductor is intended.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#592,$,$,$,.READWRITE.); +#592=IFCPROPERTYENUMERATION('PEnum_FunctionEnum',(IFCLABEL('LINE'),IFCLABEL('NEUTRAL'),IFCLABEL('PROTECTIVEEARTH'),IFCLABEL('PROTECTIVEEARTHNEUTRAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#593=IFCSIMPLEPROPERTYTEMPLATE('0rAV2hE95C6hdSeRwKy3oc',$,'ConductorMaterial','Type of material from which the conductor is constructed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#594,$,$,$,.READWRITE.); +#594=IFCPROPERTYENUMERATION('PEnum_MaterialEnum',(IFCLABEL('ALUMINIUM'),IFCLABEL('COPPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#595=IFCSIMPLEPROPERTYTEMPLATE('0efMbrkgj2Ff3$GUYYW6sJ',$,'Construction','Purpose of informing on how the vonductor is constructed (interwined or solid). I.e. Solid (IEV 461-01-06), stranded (IEV 461-01-07), solid-/finestranded(IEV 461-01-11) (not flexible/flexible).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#596,$,$,$,.READWRITE.); +#596=IFCPROPERTYENUMERATION('PEnum_ConstructionEnum',(IFCLABEL('FLEXIBLESTRANDEDCONDUCTOR'),IFCLABEL('SOLIDCONDUCTOR'),IFCLABEL('STRANDEDCONDUCTOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#597=IFCSIMPLEPROPERTYTEMPLATE('2ipdNZaNzDOwTwJdhXHKa3',$,'ConductorShape','Indication of the shape of the conductor.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#598,$,$,$,.READWRITE.); +#598=IFCPROPERTYENUMERATION('PEnum_ShapeEnum',(IFCLABEL('CIRCULARCONDUCTOR'),IFCLABEL('HELICALCONDUCTOR'),IFCLABEL('RECTANGULARCONDUCTOR'),IFCLABEL('SECTORCONDUCTOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#599=IFCSIMPLEPROPERTYTEMPLATE('0I6jq02L1CJRSRRNTrAFd5',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#600=IFCSIMPLEPROPERTYTEMPLATE('2FB1BhLBD13eoEktSjYAMz',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#601=IFCSIMPLEPROPERTYTEMPLATE('2Wz_N36PX04OVofg120wPU',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); +#602=IFCSIMPLEPROPERTYTEMPLATE('1mWHiJJHHAzBOxPMLlL_5K',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#603=IFCSIMPLEPROPERTYTEMPLATE('3h9A2leDLB7OWl37bG7EZF',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#604=IFCSIMPLEPROPERTYTEMPLATE('2iO0ht2yX0hPXoKvJrpGot',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); +#605=IFCSIMPLEPROPERTYTEMPLATE('2Hoey1cOv0mgPNxg57V6Bs',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#606=IFCSIMPLEPROPERTYTEMPLATE('0rDo0Gk_HE7QoR2Pvqf5$G',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#607=IFCSIMPLEPROPERTYTEMPLATE('1HYea1mN11582aVq9yi7Ng',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#608=IFCSIMPLEPROPERTYTEMPLATE('0LaTwwCo5AUxihWMZAUXC6',$,'OverallDiameter','The overall diameter of a object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#609=IFCSIMPLEPROPERTYTEMPLATE('3GDvnt7ez2cvu6rg82OEpk',$,'NumberOfCores','The number of cores.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#610=IFCSIMPLEPROPERTYTEMPLATE('21koJcuMXCzQTw4WI8c0PC',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#611=IFCPROPERTYSETTEMPLATE('2hgz12zpj6PfFjXG4AUzSa',$,'Pset_CableSegmentTypeContactWire','Properties of contact wires used in overhead contact line systems. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type CONTACTWIRESEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CONTACTWIRESEGMENT,IfcCableSegmentType/CONTACTWIRESEGMENT',(#612,#613,#614,#615,#616,#617,#618,#619,#620)); +#612=IFCSIMPLEPROPERTYTEMPLATE('12ZUSNFvfEk9TU9gtMO6aG',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#613=IFCSIMPLEPROPERTYTEMPLATE('065YSBNo19Uh_uvLIvzZca',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); +#614=IFCSIMPLEPROPERTYTEMPLATE('1H6NVXg8L6qAoh_lxjgV2i',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#615=IFCSIMPLEPROPERTYTEMPLATE('0XqVTIyHjDnPmGWCuCL_TC',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#616=IFCSIMPLEPROPERTYTEMPLATE('0Ay668Amn03gOTWIxyLdZ5',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); +#617=IFCSIMPLEPROPERTYTEMPLATE('1PdHdhdgrFavsEyZf0x$Af',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#618=IFCSIMPLEPROPERTYTEMPLATE('2wt9KGoLD4BuoYj44vYjv0',$,'CrossSectionalArea','Cross section area of the phase(s) lead(s).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#619=IFCSIMPLEPROPERTYTEMPLATE('34mTwoynH5rQt9IzYx1S83',$,'TorsionalStrength','Shear strength in torsion.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#620=IFCSIMPLEPROPERTYTEMPLATE('0$X5DNsSb558VP5vbDBXXW',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#621=IFCPROPERTYSETTEMPLATE('0G5DTLNtH9Ngh6WaxHWauC',$,'Pset_CableSegmentTypeCoreSegment','An assembly comprising a conductor with its own insulation (and screens if any)',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CORESEGMENT,IfcCableSegmentType/CORESEGMENT',(#622,#623,#624,#625,#626,#627,#629,#630,#631,#632,#633,#634,#635,#636,#637,#638,#639,#640,#641,#642,#643,#644)); +#622=IFCSIMPLEPROPERTYTEMPLATE('3qETD109D7aR0hLhLmufVZ',$,'OverallDiameter','The overall diameter of a object.\X2\000A000A\X0\The overall diameter of a core (maximum space used).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#623=IFCSIMPLEPROPERTYTEMPLATE('11sUHmK6b0PfaC6Dk0WbuS',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#624=IFCSIMPLEPROPERTYTEMPLATE('3hmyQSqsvCf8HOsMEtp8Zq',$,'RatedTemperature','The range of allowed temperature that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#625=IFCSIMPLEPROPERTYTEMPLATE('0D4zOXOnD6$huaQQZ2Bx_W',$,'ScreenDiameter','The diameter of the screen around an object (if present).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#626=IFCSIMPLEPROPERTYTEMPLATE('0RG0TxBab5LejQriMv8oj0',$,'CoreIdentifier','The core identification used Identifiers may be used such as by color (Black, Brown, Grey) or by number (1, 2, 3) or by IEC phase reference (L1, L2, L3) etc.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#627=IFCSIMPLEPROPERTYTEMPLATE('1Cteuc5xf43vw8yNv9p6BF',$,'SheathColours','Colour of the core (derived from IEC 60757). Note that the combined color ''GreenAndYellow'' shall be used only as Protective Earth (PE) conductors according to the requirements of IEC 60446.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#628,$,$,$,.READWRITE.); +#628=IFCPROPERTYENUMERATION('PEnum_CoreColoursEnum',(IFCLABEL('BLACK'),IFCLABEL('BLUE'),IFCLABEL('BROWN'),IFCLABEL('GOLD'),IFCLABEL('GREEN'),IFCLABEL('GREENANDYELLOW'),IFCLABEL('GREY'),IFCLABEL('ORANGE'),IFCLABEL('PINK'),IFCLABEL('RED'),IFCLABEL('SILVER'),IFCLABEL('TURQUOISE'),IFCLABEL('VIOLET'),IFCLABEL('WHITE'),IFCLABEL('YELLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#629=IFCSIMPLEPROPERTYTEMPLATE('0pePbAWYL6lQ_XM9iQQT4q',$,'Weight','Total weight of object\X2\000A000A\X0\Weight of core kg/km.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#630=IFCSIMPLEPROPERTYTEMPLATE('0kE6koGtD30f6MTQkesERs',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#631=IFCSIMPLEPROPERTYTEMPLATE('2e9_wknrDEF9xsYtzcwWJQ',$,'SelfExtinguishing60332_1','Self Extinguishing cable/core according to IEC 60332.1.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#632=IFCSIMPLEPROPERTYTEMPLATE('0gAKkgepz7g8dAY8iwTdyQ',$,'SelfExtinguishing60332_3','Self Extinguishing cable/core according to IEC 60332.3.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#633=IFCSIMPLEPROPERTYTEMPLATE('0AhCDOP9DCZ8npDS5SdWJj',$,'HalogenProof','Produces small amount of smoke and irritating Deaerator/Gas.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#634=IFCSIMPLEPROPERTYTEMPLATE('3teH_Z1_99ixvd82$EYRiy',$,'FunctionReliable','Element (such as cable, bus, core) maintain given properties/functions over a given (tested) time and conditions. According to IEC standard.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#635=IFCSIMPLEPROPERTYTEMPLATE('1NCrTZzoL6Hx2lajbyQ1az',$,'Standard','The designation of the standard applicable for the definition of the object used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#636=IFCSIMPLEPROPERTYTEMPLATE('2nHZGciQj7L8PZqXIRwVze',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); +#637=IFCSIMPLEPROPERTYTEMPLATE('2QcWigg7j20hZ4vCM8HUCL',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#638=IFCSIMPLEPROPERTYTEMPLATE('3gWoLhZZ55T9dUHuQr8mVD',$,'DCResistance','The resistance under direct current and 20 degrees centigrade.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#639=IFCSIMPLEPROPERTYTEMPLATE('1lIBA04YPADPVQVI4jBHTQ',$,'LayRatio','The ratio between lay length and the diameter of the single conductor.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#640=IFCSIMPLEPROPERTYTEMPLATE('1kj0m5Pcv9Pg6B9JuVAFL0',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); +#641=IFCSIMPLEPROPERTYTEMPLATE('2RUKaavbv07wCLCTtEklGI',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#642=IFCSIMPLEPROPERTYTEMPLATE('1baF7dglLDV9boMmzHFvmf',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#643=IFCSIMPLEPROPERTYTEMPLATE('2cbwqE5Jr5vA1K$g37cbWC',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#644=IFCSIMPLEPROPERTYTEMPLATE('33q_vsQDf4se9ILw7Su4ad',$,'StrandingMethod','Specifies the method used to strand the cable. Stranding is the process where a particular number of stranding elements are joined together while winding them round a common axis.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#645=IFCPROPERTYSETTEMPLATE('2ZJXuzxWf42O2yI3NKmbi4',$,'Pset_CableSegmentTypeEarthingConductor','Properties of earthing conductors used in overhead contact line systems. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type CONDUCTORSEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CONDUCTORSEGMENT,IfcCableSegmentType/CONDUCTORSEGMENT',(#646)); +#646=IFCSIMPLEPROPERTYTEMPLATE('0d1sivS1j6nw$jjvmox$TA',$,'ResistanceToGround','The resistance through earthing conductor to the ground. Real part of the impedance to earth [SOURCE IEC: 195-01-18]',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#647=IFCPROPERTYSETTEMPLATE('2XDxRjwEvDQfpcxY2YDE_D',$,'Pset_CableSegmentTypeFiberSegment','Properties of fiber segments. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type FIBERSEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/FIBERSEGMENT,IfcCableSegmentType/FIBERSEGMENT',(#648,#650,#651)); +#648=IFCSIMPLEPROPERTYTEMPLATE('37HgkslmPE6uGGC8Vv3Tr2',$,'FiberColour','Indicates the colour of a single fiber.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#649,$,$,$,.READWRITE.); +#649=IFCPROPERTYENUMERATION('PEnum_FiberColour',(IFCLABEL('AQUA'),IFCLABEL('BLACK'),IFCLABEL('BLUE'),IFCLABEL('BROWN'),IFCLABEL('GREEN'),IFCLABEL('ORANGE'),IFCLABEL('RED'),IFCLABEL('ROSE'),IFCLABEL('SLATE'),IFCLABEL('VIOLET'),IFCLABEL('WHITE'),IFCLABEL('YELLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#650=IFCSIMPLEPROPERTYTEMPLATE('208o7TkTT2tglOjG0qWCLT',$,'HasTightJacket','Indicates whether the fiber has a tight jacket or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#651=IFCSIMPLEPROPERTYTEMPLATE('3TD5oDEtz2ivz6kVbsorLb',$,'FiberType','Indicates the type of the single fiber.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#652,$,$,$,.READWRITE.); +#652=IFCPROPERTYENUMERATION('PEnum_FiberType',(IFCLABEL('BEND_INSENSITIVEFIBER'),IFCLABEL('CUTOFFSHIFTEDFIBER'),IFCLABEL('DISPERSIONSHIFTEDFIBER'),IFCLABEL('LOWWATERPEAKFIBER'),IFCLABEL('NON_ZERODISPERSIONSHIFTEDFIBER'),IFCLABEL('OM1'),IFCLABEL('OM2'),IFCLABEL('OM3'),IFCLABEL('OM4'),IFCLABEL('OM5'),IFCLABEL('STANDARDSINGLEMODEFIBER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#653=IFCPROPERTYSETTEMPLATE('2V4jZsRifBnfSrOwiLronD',$,'Pset_CableSegmentTypeFiberTubeSegment','Properties of Fiber tubes segments. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type FIBERTUBESEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/FIBERTUBE,IfcCableSegmentType/FIBERTUBE',(#654,#656)); +#654=IFCSIMPLEPROPERTYTEMPLATE('3FtQHVShT5RfSTq$a2h_Jh',$,'FiberTubeColour','Indicates the colour of a single fiber tube.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#655,$,$,$,.READWRITE.); +#655=IFCPROPERTYENUMERATION('PEnum_FiberColour',(IFCLABEL('AQUA'),IFCLABEL('BLACK'),IFCLABEL('BLUE'),IFCLABEL('BROWN'),IFCLABEL('GREEN'),IFCLABEL('ORANGE'),IFCLABEL('RED'),IFCLABEL('ROSE'),IFCLABEL('SLATE'),IFCLABEL('VIOLET'),IFCLABEL('WHITE'),IFCLABEL('YELLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#656=IFCSIMPLEPROPERTYTEMPLATE('3CYFG_AtX50ucGr2rqtKqm',$,'NumberOfFibers','Indicates the number of fibers in the single tube or cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#657=IFCPROPERTYSETTEMPLATE('2l3opB9LT1GePIXX_NKsSG',$,'Pset_CableSegmentTypeOpticalCableSegment','Properties of optical cables segments. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type OPTICALCABLESEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/OPTICALCABLESEGMENT,IfcCableSegmentType/OPTICALCABLESEGMENT',(#658,#659,#661,#662,#663,#664)); +#658=IFCSIMPLEPROPERTYTEMPLATE('2H2E8txyP7eRLzfv7$Hlwz',$,'NumberOfFibers','Indicates the number of fibers in the single tube or cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#659=IFCSIMPLEPROPERTYTEMPLATE('17Xt0Uwh586fxHmVt02xtq',$,'OpticalCableStructure','Distinguishes between different structures of an optical fiber cable.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#660,$,$,$,.READWRITE.); +#660=IFCPROPERTYENUMERATION('PEnum_OpticalCableStructureType',(IFCLABEL('BREAKOUT'),IFCLABEL('LOOSETUBE'),IFCLABEL('PATCHCORD'),IFCLABEL('PIGTAIL'),IFCLABEL('TIGHTBUFFERED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#661=IFCSIMPLEPROPERTYTEMPLATE('2oil23Xtv6WvLMsYn7lqlX',$,'NumberOfMultiModeFibers','Total number of multi-mode fibers in the optical fiber cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#662=IFCSIMPLEPROPERTYTEMPLATE('0yZ6ms01D5yfjPrmY3tEZd',$,'NumberOfSingleModeFibers','Total number of single-mode fibers in the optical fiber cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#663=IFCSIMPLEPROPERTYTEMPLATE('0vXTNt3uv7txYJivOW_GCb',$,'NumberOfTubes','Number of fiber tubes.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#664=IFCSIMPLEPROPERTYTEMPLATE('20LCuJKFDBJwqxCjg810x9',$,'FiberMode','Indicates the fiber mode.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#665,$,$,$,.READWRITE.); +#665=IFCPROPERTYENUMERATION('PEnum_FiberMode',(IFCLABEL('MULTIMODE'),IFCLABEL('SINGLEMODE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#666=IFCPROPERTYSETTEMPLATE('3Dh9Fv0oD2S9eDOjjM_xrt',$,'Pset_CableSegmentTypeStitchWire','Properties of stitch wires. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type STICHWIRE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/STITCHWIRE,IfcCableSegmentType/STITCHWIRE',(#667,#668,#669,#670,#671)); +#667=IFCSIMPLEPROPERTYTEMPLATE('0Aew29xjn2Ef8bkJzSJWQG',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#668=IFCSIMPLEPROPERTYTEMPLATE('3M9o9$UL5EVOfCyNo7hCxx',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#669=IFCSIMPLEPROPERTYTEMPLATE('3VBwOK$xvCkQ5jJLsT6oj6',$,'MechanicalTension','Nominal value of mechanical force applied to a flow segment.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#670=IFCSIMPLEPROPERTYTEMPLATE('2wSVBioan5BONx$v3V28Ce',$,'UltimateTensileStrength','Indicates the maximum stress that a material or element can withstand before breaking while being stretched or pulled.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#671=IFCSIMPLEPROPERTYTEMPLATE('1W2gGL83j3qADFgE6Vqjbu',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#672=IFCPROPERTYSETTEMPLATE('3GB3HUNDX0EeHHVm2qj_wh',$,'Pset_CableSegmentTypeWirePairSegment','Properties of wire pair segments. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type WIREPAIRSEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/WIREPAIRSEGMENT,IfcCableSegmentType/WIREPAIRSEGMENT',(#673,#674,#675,#676,#677,#678)); +#673=IFCSIMPLEPROPERTYTEMPLATE('0tCSSlSWjFSA_FptyaJF6R',$,'CharacteristicImpedance','A quantity defined for a mode of propagation at a given frequency in a specific uniform transmission line or uniform waveguide by one of the three following relations:\X2\000A\X0\Z1 = S/ |I|2\X2\000A\X0\Z2 = |U|2 / S\X2\000A\X0\Z3 = U / I\X2\000A\X0\where Z is the complex characteristic impedance, S the complex power and U and I are the values, usually complex, respectively of a voltage and a current conventionally defined for each type of mode by analogy with transmission line equations.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#674=IFCSIMPLEPROPERTYTEMPLATE('0UGKBchNDDehXil7pjTErC',$,'ConductorDiameter','Indicates the conductor diameter. It is only used for twisted and untwisted wire pair.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#675=IFCSIMPLEPROPERTYTEMPLATE('1TL4yxw1v2jfiGuynShaDN',$,'CoreConductorDiameter','Indicates the core conductor diameter. It is only used for coaxial wire pair.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#676=IFCSIMPLEPROPERTYTEMPLATE('3qVPbXI3f5hOqTEbPsuGql',$,'JacketColour','Indicates the colour of the cable or fitting jacket.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#677=IFCSIMPLEPROPERTYTEMPLATE('2jjopgldzBru$sRuOLMSe8',$,'ShieldConductorDiameter','Indicates the shielded conductor diameter. It is only used for coaxial wire pair.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#678=IFCSIMPLEPROPERTYTEMPLATE('0YXhYx7Rj0xQPuUlz1m84S',$,'WirePairType','Indicates the type of wire pair, i.e., twisted, untwisted or coaxial pair.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#679,$,$,$,.READWRITE.); +#679=IFCPROPERTYENUMERATION('PEnum_WirePairType',(IFCLABEL('COAXIAL'),IFCLABEL('TWISTED'),IFCLABEL('UNTWISTED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#680=IFCPROPERTYSETTEMPLATE('3kHqJ4MGz14PRX5F7tu6wn',$,'Pset_CargoCommon','Properties common to the definition of all occurrences of IfcTransportElement and types of IfcTransportElementType with the predefined type set to CARGO.',.PSET_TYPEDRIVENOVERRIDE.,'IfcVehicle/CARGO,IfcVehicleType/CARGO',(#681,#683,#685)); +#681=IFCSIMPLEPROPERTYTEMPLATE('3MQ4ER8bD2pBkbQHBOpC$7',$,'ProcessItem','The type of item (and its measurement method) being modelled within a process. This can be cargo, passengers or vehicles that pass through the system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#682,$,$,$,.READWRITE.); +#682=IFCPROPERTYENUMERATION('PEnum_ProcessItem',(IFCLABEL('BARREL'),IFCLABEL('CGT'),IFCLABEL('PASSENGER'),IFCLABEL('TEU'),IFCLABEL('TONNE'),IFCLABEL('VEHICLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#683=IFCSIMPLEPROPERTYTEMPLATE('1bEJMUrW12jAv2F6lfwipJ',$,'AdditionalProcessing','Any additional or special processing requirements on the associated cargo.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#684,$,$,$,.READWRITE.); +#684=IFCPROPERTYENUMERATION('PEnum_AdditionalProcessing',(IFCLABEL('INSPECTION'),IFCLABEL('ISOLATION'),IFCLABEL('NONE'),IFCLABEL('TARIFFS')),$); +#685=IFCSIMPLEPROPERTYTEMPLATE('3PbO66Jn13Je$dAQKfTw8C',$,'ProcessDirection','The direction of flow of the cargo within the process.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#686,$,$,$,.READWRITE.); +#686=IFCPROPERTYENUMERATION('PEnum_ProcessDirection',(IFCLABEL('EXPORT'),IFCLABEL('IMPORT'),IFCLABEL('TRANSFER')),$); +#687=IFCPROPERTYSETTEMPLATE('3ijcHXlsP1thdfseQBEnIk',$,'Pset_CessBetweenRails','Properties in this property set are applicable for IfcSlab with PredefinedType TRACKSLAB, indicated that the slab is a cess or covering between rails.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab/TRACKSLAB,IfcSlabType/TRACKSLAB',(#688,#690,#692,#693)); +#688=IFCSIMPLEPROPERTYTEMPLATE('0f3dMl0D12RRietYHphJbj',$,'JointRelativePosition','Indicates the relative position of the joint, which lies in the left or right rail or in the middle, or in combination. The left rail is to the left as facing in the direction of increasing stationing values, and the right rail is to the right.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#689,$,$,$,.READWRITE.); +#689=IFCPROPERTYENUMERATION('PEnum_RelativePosition',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#690=IFCSIMPLEPROPERTYTEMPLATE('1qib9v39L98BmteKcD$xC0',$,'CheckRailType','Type of the check rail. Check rail types enumerated in this property are defined based on EN 13674.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#691,$,$,$,.READWRITE.); +#691=IFCPROPERTYENUMERATION('PEnum_CheckRailType',(IFCLABEL('TYPE_33C1'),IFCLABEL('TYPE_40C1'),IFCLABEL('TYPE_47C1'),IFCLABEL('TYPE_CR3_60U'),IFCLABEL('TYPE_R260'),IFCLABEL('TYPE_R320CR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#692=IFCSIMPLEPROPERTYTEMPLATE('0sNd271nT9ewn03DCqnssP',$,'LoadCapacity','Indicates the highest permissible load capacity.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#693=IFCSIMPLEPROPERTYTEMPLATE('3u7nubBb12svRY$SZLG2tk',$,'UsagePurpose','The purpose of usage of the cess between rails, e.g. maintenance, rescue services.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#694,$,$,$,.READWRITE.); +#694=IFCPROPERTYENUMERATION('PEnum_UsagePurpose',(IFCLABEL('MAINTENANCE'),IFCLABEL('RESCUESERVICES'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#695=IFCPROPERTYSETTEMPLATE('3eIY87tA94yeglZBxUvV2J',$,'Pset_ChillerPHistory','Chiller performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcChiller',(#696,#697,#698)); +#696=IFCSIMPLEPROPERTYTEMPLATE('077$lBukLA2B4cV2jw4IHr',$,'Capacity','The capacity of the element.\X2\000A000A\X0\The product of the ideal capacity and the overall volumetric efficiency of the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#697=IFCSIMPLEPROPERTYTEMPLATE('28GCD7hRr53x2Ctov_vAi6',$,'EnergyEfficiencyRatio','Energy efficiency ratio (EER).\X2\000A000A\X0\Ratio of net cooling capacity to the total input rate of electric power applied. By definition, the units are BTU/hour per Watt.\X2\000A\X0\The input electric power may be obtained from Pset_DistributionPortPHistoryElectrical.RealPower on the ''Power'' port of the IfcChiller.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#698=IFCSIMPLEPROPERTYTEMPLATE('2KXLUIHKP9u8uAe5GYJHVw',$,'CoefficientOfPerformance','The Coefficient of performance (COP) is the ratio of heat removed to energy input.\X2\000A\X0\The energy input may be obtained by multiplying\X2\000A\X0\Pset_DistributionPortPHistoryGas.FlowRate on the ''Fuel'' port of the IfcChiller by Pset_MaterialFuel.LowerHeatingValue.\X2\000A\X0\The IfcDistributionPort for fuel has an associated IfcMaterial with fuel properties and is assigned to an IfcPerformanceHistory object nested within this IfcPerformanceHistory object.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#699=IFCPROPERTYSETTEMPLATE('3jJ6fGQz56SvK_Tf7arpQ7',$,'Pset_ChillerTypeCommon','Chiller type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcChiller,IfcChillerType',(#700,#701,#703,#704,#705,#706,#707,#708,#709,#710,#711)); +#700=IFCSIMPLEPROPERTYTEMPLATE('3w3$fGRFrDQOYRbNjfHerj',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#701=IFCSIMPLEPROPERTYTEMPLATE('2rACbGSC51Tvi$gTrNq_Vw',$,'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',$,#702,$,$,$,.READWRITE.); +#702=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#703=IFCSIMPLEPROPERTYTEMPLATE('0rmqU$nM9DVgN_2nJqIgHJ',$,'ChillerCapacity','Nominal cooling capacity of chiller at standardized conditions as defined by the agency having jurisdiction.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#704=IFCSIMPLEPROPERTYTEMPLATE('3VSzRsBCj3rPANoZeEKg7w',$,'NominalEfficiency','Nominal object efficiency under nominal conditions.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#705=IFCSIMPLEPROPERTYTEMPLATE('1ZOjzDjDDAnORTCZoRedab',$,'NominalCondensingTemperature','Chiller condensing temperature.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#706=IFCSIMPLEPROPERTYTEMPLATE('0Wx8dcvwP2oO$Ew24VwtnX',$,'NominalEvaporatingTemperature','Chiller evaporating temperature.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#707=IFCSIMPLEPROPERTYTEMPLATE('2C34xGnHL95x1CNbWPBgCN',$,'NominalHeatRejectionRate','Sum of the refrigeration effect and the heat equivalent of the power input to the compressor.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#708=IFCSIMPLEPROPERTYTEMPLATE('22A5pR0GTAYxPNEHFD3ARY',$,'NominalPowerConsumption','Nominal total power consumption.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#709=IFCSIMPLEPROPERTYTEMPLATE('0YBE$y1cj5NOVnCqu$SSZL',$,'CapacityCurve','Chiller cooling capacity is a function of condensing temperature and evaporating temperature, data is in table form, Capacity = f (TempCon, TempEvp), capacity = a1+b1*Tei+c1*Tei\\^2+d1*Tci+e1*Tci\\^2+f1*Tei*Tci.\X2\000A\X0\This table uses multiple input variables; to represent, both DefiningValues and DefinedValues lists are null and IfcTable is attached using IfcResourceConstraintRelationship and IfcMetric. Columns are specified in the following order:\X2\000A\X0\1.IfcPowerMeasure:Capacity\X2\000A\X0\2.IfcThermodynamicTemperatureMeasure:CondensingTemperature\X2\000A\X0\3.IfcThermodynamicTemperatureMeasure:EvaporatingTemperature',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcPowerMeasure',$,$,$,$,.READWRITE.); +#710=IFCSIMPLEPROPERTYTEMPLATE('3ppjF99xD1aQ7K9MIF5DI9',$,'CoefficientOfPerformanceCurve','Chiller coefficient of performance (COP) is function of condensing temperature and evaporating temperature, data is in table form, COP= f (TempCon, TempEvp), COP = a2+b2*Tei+c2*Tei\\^2+d2*Tci+e2*Tci\\^2+f2*Tei*Tci.\X2\000A\X0\This table uses multiple input variables; to represent, both DefiningValues and DefinedValues lists are null and IfcTable is attached using IfcResourceConstraintRelationship and IfcMetric. Columns are specified in the following order:\X2\000A\X0\1.IfcPositiveRatioMeasure:CoefficientOfPerformance\X2\000A\X0\2.IfcThermodynamicTemperatureMeasure:CondensingTemperature\X2\000A\X0\3.IfcThermodynamicTemperatureMeasure:EvaporatingTemperature',.P_TABLEVALUE.,'IfcThermodynamicTemperatureMeasure','IfcReal',$,$,$,$,.READWRITE.); +#711=IFCSIMPLEPROPERTYTEMPLATE('1zTL2ZoKfFt80tdhp70Ow1',$,'FullLoadRatioCurve','Ratio of actual power to full load power as a quadratic function of part load, at certain condensing and evaporating temperature, FracFullLoadPower = f ( PartLoadRatio).',.P_TABLEVALUE.,'IfcPositiveRatioMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); +#712=IFCPROPERTYSETTEMPLATE('15VoRz61P1UfWofpSFQXhO',$,'Pset_ChimneyCommon','Properties common to the definition of all occurrence and type objects of chimneys.',.PSET_TYPEDRIVENOVERRIDE.,'IfcChimney,IfcChimneyType',(#713,#714,#716,#717,#718,#719,#720)); +#713=IFCSIMPLEPROPERTYTEMPLATE('3uZcVRXXf0qxr4ixkzGuHe',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#714=IFCSIMPLEPROPERTYTEMPLATE('3UYWyhwVjC$xcdRFgQ5E6B',$,'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',$,#715,$,$,$,.READWRITE.); +#715=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#716=IFCSIMPLEPROPERTYTEMPLATE('0wr4GfVYvE3RUZ3Za509cm',$,'NumberOfDrafts','Number of the chimney drafts, continuous holes in the chimney through which the air passes, within the single chimney.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#717=IFCSIMPLEPROPERTYTEMPLATE('15jbkT15z19AVokiDGapAb',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#718=IFCSIMPLEPROPERTYTEMPLATE('2Snre6OV96LxEk38JUvYLG',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#719=IFCSIMPLEPROPERTYTEMPLATE('02BkTuUnz0lwZwd372g0eX',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#720=IFCSIMPLEPROPERTYTEMPLATE('1PT7753cL2zQngWlQFfqrm',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#721=IFCPROPERTYSETTEMPLATE('2sq_koa3f6bvDxg1A2VQwt',$,'Pset_CivilElementCommon','Properties common to the definition of all occurrence and type objects of civil element.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCivilElement,IfcCivilElementType',(#722,#723)); +#722=IFCSIMPLEPROPERTYTEMPLATE('2B8_WVylbBiQkmSP4$usEk',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#723=IFCSIMPLEPROPERTYTEMPLATE('0iq9toTEr7Ywhv6RkRsLtK',$,'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',$,#724,$,$,$,.READWRITE.); +#724=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#725=IFCPROPERTYSETTEMPLATE('0YS2ckoYnCP8oa1wdNeSAz',$,'Pset_CoaxialCable','Properties applicable to a coaxial cable, which is a copper cable with a variable number of copper coaxial pair conductors used to transmit data by means of electrical signals, especially at radio frequency. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type CABLESEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CABLESEGMENT,IfcCableSegmentType/CABLESEGMENT',(#726,#727,#728,#729,#730,#731,#732)); +#726=IFCSIMPLEPROPERTYTEMPLATE('3fb5mJ61XEOgBRvN_SQNcp',$,'CharacteristicImpedance','A quantity defined for a mode of propagation at a given frequency in a specific uniform transmission line or uniform waveguide by one of the three following relations:\X2\000A\X0\Z1 = S/ |I|2\X2\000A\X0\Z2 = |U|2 / S\X2\000A\X0\Z3 = U / I\X2\000A\X0\where Z is the complex characteristic impedance, S the complex power and U and I are the values, usually complex, respectively of a voltage and a current conventionally defined for each type of mode by analogy with transmission line equations.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#727=IFCSIMPLEPROPERTYTEMPLATE('2fU51yKPX74gzSrCKPTgUS',$,'CouplingLoss','Indicates the coupling loss of a leaky coaxial cable (radiating cable).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#728=IFCSIMPLEPROPERTYTEMPLATE('1WJG9PUTLAKwHRM2wzByH3',$,'MaximumTransmissionAttenuation','Indicates the Maximum transmission attenuation of feeder.',.P_SINGLEVALUE.,'IfcSoundPowerLevelMeasure',$,$,$,$,$,.READWRITE.); +#729=IFCSIMPLEPROPERTYTEMPLATE('0FXQbgYCP4awv51$hh42AF',$,'NumberOfCoaxialPairs','Indicates the total number of coaxial pairs in the coaxial cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#730=IFCSIMPLEPROPERTYTEMPLATE('1netzADuX7JxupSbNX4BWM',$,'PropagationSpeedCoefficient','Indicates the propagation speed coefficient.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#731=IFCSIMPLEPROPERTYTEMPLATE('3OqdigB2PCvx4JxLDs69Na',$,'TransmissionLoss','Indicates the transmission loss of the leaky coaxial cable (radiating cable).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#732=IFCSIMPLEPROPERTYTEMPLATE('1Mf76sYLvDtuXMtyh7xNEs',$,'RadiantFrequency','Indicates the radiant frequency of the leaky coaxial cable (radiating cable).',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#733=IFCPROPERTYSETTEMPLATE('17cFPHznT38fZxCGLunq6e',$,'Pset_CoilOccurrence','Coil occurrence attributes attached to an instance of IfcCoil.',.PSET_OCCURRENCEDRIVEN.,'IfcCoil',(#734)); +#734=IFCSIMPLEPROPERTYTEMPLATE('2p5JoXUNX3vfxwka1L6mbA',$,'HasSoundAttenuation','TRUE if the coil has sound attenuation, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#735=IFCPROPERTYSETTEMPLATE('0RV924xg50mhD2bq1TRxHJ',$,'Pset_CoilPHistory','Coil performance history common attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcCoil',(#736,#737,#738,#739)); +#736=IFCSIMPLEPROPERTYTEMPLATE('30ODKK4Pv5EAivFd40H31J',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#737=IFCSIMPLEPROPERTYTEMPLATE('0al3BzRLb1hfzhGAyc8VGI',$,'AirPressureDropCurveHistory','Air pressure drop curve, pressure drop \X2\2013\X0\ flow rate curve, AirPressureDrop = f (AirflowRate).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#738=IFCSIMPLEPROPERTYTEMPLATE('2jgYjHidv8veICz4dDHoWP',$,'SoundCurveHistory','Regenerated sound versus air-flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#739=IFCSIMPLEPROPERTYTEMPLATE('1nYEGDR8P3lQWE3QWQQcj8',$,'FaceVelocity','Air velocity through the coil.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#740=IFCPROPERTYSETTEMPLATE('1raPB6MsT97eLwvTTXXBh1',$,'Pset_CoilTypeCommon','Coil type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCoil,IfcCoilType',(#741,#742,#744,#745,#746,#747,#748,#749)); +#741=IFCSIMPLEPROPERTYTEMPLATE('3Mr0ZjDsPBsPSRO6JEN7SI',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#742=IFCSIMPLEPROPERTYTEMPLATE('2jC9oWbKL0G95Rvl7o0NdF',$,'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',$,#743,$,$,$,.READWRITE.); +#743=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#744=IFCSIMPLEPROPERTYTEMPLATE('0pINQtvHn0_wclsBqhyitl',$,'OperationalTemperatureRange','The temperature range in which the device operates normally.\X2\000A000A\X0\Allowable operational air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#745=IFCSIMPLEPROPERTYTEMPLATE('1rTtLp2jnBT9JUEp5_Jk4U',$,'AirFlowRateRange','Possible range of airflow that can be delivered.\X2\000A000A\X0\For cases where there is no airflow across the coil (e.g. electric coil in a floor slab), then the value is zero.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#746=IFCSIMPLEPROPERTYTEMPLATE('0_5T_tNgL4exP8hu3hFXmV',$,'NominalSensibleCapacity','Nominal sensible capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#747=IFCSIMPLEPROPERTYTEMPLATE('0RJ2RVSebC4wvoJSnNaLh2',$,'NominalLatentCapacity','Nominal latent capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#748=IFCSIMPLEPROPERTYTEMPLATE('07d_Mwl7r2eB3Lx0MuRP4K',$,'NominalUA','Nominal UA value.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#749=IFCSIMPLEPROPERTYTEMPLATE('0pMCGtAWb5gwJHWcpTmKeE',$,'CoilPlacement','Indicates the placement of the coil.\X2\000A\X0\FLOOR indicates an under floor heater (if coil type is WATERHEATINGCOIL or ELECTRICHEATINGCOIL);\X2\000A\X0\CEILING indicates a cooling ceiling (if coil type is WATERCOOLINGCOIL);\X2\000A\X0\UNIT indicates that the coil is part of a cooling or heating unit, like cooled beam, etc.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#750,$,$,$,.READWRITE.); +#750=IFCPROPERTYENUMERATION('PEnum_CoilPlacementType',(IFCLABEL('CEILING'),IFCLABEL('FLOOR'),IFCLABEL('UNIT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#751=IFCPROPERTYSETTEMPLATE('2upugkGLn4Fgckmjsf7mcp',$,'Pset_CoilTypeHydronic','Hydronic coil type attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCoil,IfcCoilType',(#752,#753,#755,#757,#759,#760,#761,#762,#763,#764,#765,#766,#767)); +#752=IFCSIMPLEPROPERTYTEMPLATE('3cw5qT7gT3gBsNfaSkpnwC',$,'FluidPressureRange','Allowable water working pressure range inside the tube.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#753=IFCSIMPLEPROPERTYTEMPLATE('3fledXRUP9c9NsvGlmd9Vh',$,'CoilCoolant','The fluid used for heating or cooling used by the hydronic coil.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#754,$,$,$,.READWRITE.); +#754=IFCPROPERTYENUMERATION('PEnum_CoilCoolant',(IFCLABEL('BRINE'),IFCLABEL('GLYCOL'),IFCLABEL('WATER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#755=IFCSIMPLEPROPERTYTEMPLATE('0qErV5t1P3dw3Kd2IDNUhv',$,'CoilConnectionDirection','Coil connection direction (facing into the air stream).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#756,$,$,$,.READWRITE.); +#756=IFCPROPERTYENUMERATION('PEnum_CoilConnectionDirection',(IFCLABEL('LEFT'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#757=IFCSIMPLEPROPERTYTEMPLATE('3urdow$BH2ke$2omdWNmnF',$,'CoilFluidArrangement','Fluid flow arrangement of the coil.CrossCounterFlow: Air and water flow enter in different directions.\X2\000A\X0\CrossFlow: Air and water flow are perpendicular.\X2\000A\X0\CrossParallelFlow: Air and water flow enter in same directions.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#758,$,$,$,.READWRITE.); +#758=IFCPROPERTYENUMERATION('PEnum_CoilFluidArrangement',(IFCLABEL('CROSSCOUNTERFLOW'),IFCLABEL('CROSSFLOW'),IFCLABEL('CROSSPARALLELFLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#759=IFCSIMPLEPROPERTYTEMPLATE('1W9V8H9Rv5mh_kkCN_QUh9',$,'CoilFaceArea','Coil face area in the direction against air the flow.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#760=IFCSIMPLEPROPERTYTEMPLATE('0JICk6IRj0Xebp$4yEGvRB',$,'HeatExchangeSurfaceArea','Heat exchange surface area associated with U-value.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#761=IFCSIMPLEPROPERTYTEMPLATE('2nKyJAfqTEBRqXsghVpf1G',$,'PrimarySurfaceArea','Primary heat transfer surface area of the tubes and headers.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#762=IFCSIMPLEPROPERTYTEMPLATE('0k9Tw1wZH3Q8YA_R1T1LOy',$,'SecondarySurfaceArea','Secondary heat transfer surface area created by fins.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#763=IFCSIMPLEPROPERTYTEMPLATE('1DIFZyb7r8auiFr9AdDilN',$,'TotalUACurves','Total UA curves, UA - air and water velocities, UA = [(C1 * AirFlowRate\\^0.8)\\^-1 + (C2 * WaterFlowRate\\^0.8)\\^-1]\\^-1. Note: as two variables are used, DefiningValues and DefinedValues are null, and values are stored in IfcTable in the following order: AirFlowRate,WaterFlowRate,UA. The IfcTable is related to IfcPropertyTableValue using IfcMetric and IfcResourceConstraintRelationship.',.P_TABLEVALUE.,'IfcReal','IfcVolumetricFlowRateMeasure',$,$,$,$,.READWRITE.); +#764=IFCSIMPLEPROPERTYTEMPLATE('1IsHysxfTEYeLqDg$xFPZw',$,'WaterPressureDropCurve','Water pressure drop curve, pressure drop \X2\2013\X0\ flow rate curve, WaterPressureDrop = f(WaterflowRate).',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#765=IFCSIMPLEPROPERTYTEMPLATE('0$cBgoFBL4HuEP5r8SvdjB',$,'BypassFactor','Fraction of air that is bypassed by the coil (0-1).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#766=IFCSIMPLEPROPERTYTEMPLATE('20vP5ArFn5iP05gUgSxYUy',$,'SensibleHeatRatio','Air-side sensible heat ratio, or fraction of sensible heat transfer to the total heat transfer.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#767=IFCSIMPLEPROPERTYTEMPLATE('0jg9h2TYP2AAu5utawz96D',$,'WetCoilFraction','Fraction of coil surface area that is wet (0-1).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#768=IFCPROPERTYSETTEMPLATE('1IpI9G2H93IfFw0iFArrGQ',$,'Pset_ColumnCommon','Properties common to the definition of all occurrence and type objects of column.',.PSET_TYPEDRIVENOVERRIDE.,'IfcColumn,IfcColumnType',(#769,#770,#772,#773,#774,#775,#776,#777)); +#769=IFCSIMPLEPROPERTYTEMPLATE('2Uoxyo_Mn9duVz$qYqRCpd',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#770=IFCSIMPLEPROPERTYTEMPLATE('3xzWrae2bDvBeBeOT351Qf',$,'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',$,#771,$,$,$,.READWRITE.); +#771=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#772=IFCSIMPLEPROPERTYTEMPLATE('2GBk0cAkX1OA2tpvqWzeH2',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#773=IFCSIMPLEPROPERTYTEMPLATE('2aVZHaekT3D8GAyL2aJrwl',$,'Roll','Rotation against the longitudinal axis.\X2\000A000A\X0\Relative to the global X direction for all columns that are vertical in regard to the global coordinate system (Profile direction equals global X is Roll = 0.). For all non-vertical columns the following applies: Roll is relative to the global Z direction f(Profile direction of non-vertical columns that equals global Z is Roll = 0.)The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.Note: new property in IFC4',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#774=IFCSIMPLEPROPERTYTEMPLATE('0HZoJify91pP1ibno2Adk0',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#775=IFCSIMPLEPROPERTYTEMPLATE('3W6vnqGg91cg3ah$IPg5mL',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#776=IFCSIMPLEPROPERTYTEMPLATE('3njp29ZL9FjB0WMKYZqNER',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#777=IFCSIMPLEPROPERTYTEMPLATE('0fsbJ4v1PFCh0KjEC9VyO5',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#778=IFCPROPERTYSETTEMPLATE('3sTTUcXNX8sgFrfkbTy7zm',$,'Pset_CommunicationsAppliancePHistory','Captures realtime information for communications devices, such as for server farm energy usage. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcCommunicationsAppliance',(#779)); +#779=IFCSIMPLEPROPERTYTEMPLATE('3R$vCzyYj49OVqu7ZlMWEW',$,'PowerState','Indicates the power state of the device where True is on and False is off.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#780=IFCPROPERTYSETTEMPLATE('3LSfXMUW9FF8N_q0VG33Ub',$,'Pset_CommunicationsApplianceTypeAntenna','Properties common to an antenna. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with the predefined type ANTENNA.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/ANTENNA,IfcCommunicationsApplianceType/ANTENNA',(#781,#782,#784,#786)); +#781=IFCSIMPLEPROPERTYTEMPLATE('0Xot7zG_P4L9$DkGPZtoaI',$,'AntennaGain','Indicates the antenna gain, which is a ratio of the power transmitted by an antenna in a specific direction compared to an isotropic antenna.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#782=IFCSIMPLEPROPERTYTEMPLATE('1rjjUy5IX9nPFez_XEFUHi',$,'PolarizationMode','Indicates the polarization mode of antenna.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#783,$,$,$,.READWRITE.); +#783=IFCPROPERTYENUMERATION('PEnum_PolarizationMode',(IFCLABEL('DUALPOLARIZATION'),IFCLABEL('SINGLEPOLARIZATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#784=IFCSIMPLEPROPERTYTEMPLATE('0JyBqMKKzAgvAU7xRcx4b0',$,'RadiationPattern','Indicates the radiation pattern of antenna.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#785,$,$,$,.READWRITE.); +#785=IFCPROPERTYENUMERATION('PEnum_RadiationPattern',(IFCLABEL('DIRECTIONAL'),IFCLABEL('FANBEAM'),IFCLABEL('OMNIDIRECTIONAL'),IFCLABEL('PENCILBEAM'),IFCLABEL('SHAPEDBEAM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#786=IFCSIMPLEPROPERTYTEMPLATE('2Occf6wcz30gdm9mv27Y4h',$,'AntennaType','Indicates the type of antenna.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#787,$,$,$,.READWRITE.); +#787=IFCPROPERTYENUMERATION('PEnum_AntennaType',(IFCLABEL('CEILING'),IFCLABEL('PANEL'),IFCLABEL('YAGI'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#788=IFCPROPERTYSETTEMPLATE('11iCiiNEr4s80A0Z5q7ZXm',$,'Pset_CommunicationsApplianceTypeAutomaton','Properties common to automaton appliances. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type of AUTOMATON.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/AUTOMATON,IfcCommunicationsApplianceType/AUTOMATON',(#789,#791)); +#789=IFCSIMPLEPROPERTYTEMPLATE('08K$txaMX5zAG$UtBkKfHg',$,'InputSignalType','The type of the input signal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#790,$,$,$,.READWRITE.); #790=IFCPROPERTYENUMERATION('PEnum_InputOutputSignalType',(IFCLABEL('CURRENT'),IFCLABEL('VOLTAGE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#791=IFCPROPERTYSETTEMPLATE('3k4Nup931Bk8AqglP3JpAc',$,'Pset_CommunicationsApplianceTypeCommon','Common properties for communications appliances. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance,IfcCommunicationsApplianceType',(#792,#793)); -#792=IFCSIMPLEPROPERTYTEMPLATE('0Y45nBrNfDJA7Vt9SMksHx',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#793=IFCSIMPLEPROPERTYTEMPLATE('3_IF3H1Hz5bPrvXtxz8$4j',$,'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',$,#794,$,$,$,.READWRITE.); -#794=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#795=IFCPROPERTYSETTEMPLATE('1NGzGiyvT9Ag$kx2Ejorom',$,'Pset_CommunicationsApplianceTypeComputer','Properties common to a computer. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type of COMPUTER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/COMPUTER,IfcCommunicationsApplianceType/COMPUTER',(#796,#797)); -#796=IFCSIMPLEPROPERTYTEMPLATE('0omVqQYmHBwgLt07jjRDZy',$,'StorageCapacity','Indicates the total data storage capacity of the device. It is defined by bytes.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#797=IFCSIMPLEPROPERTYTEMPLATE('29hL1Xvj1DDe1bedhLT$FI',$,'UserInterfaceType','Indicates the user interface of the computer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#798,$,$,$,.READWRITE.); -#798=IFCPROPERTYENUMERATION('PEnum_ComputerUIType',(IFCLABEL('CLI'),IFCLABEL('GUI'),IFCLABEL('TOUCHSCREEN'),IFCLABEL('TOUCHTONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#799=IFCPROPERTYSETTEMPLATE('3$$XGp$bz6ZfsxjEItTtAP',$,'Pset_CommunicationsApplianceTypeGateway','Properties common to a gateway. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type of GATEWAY.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/GATEWAY,IfcCommunicationsApplianceType/GATEWAY',(#800)); -#800=IFCSIMPLEPROPERTYTEMPLATE('1x$6xB9G12f9Cb56IHl8_9',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#801=IFCPROPERTYSETTEMPLATE('3JNxq7NrD5iRKWzz2psuo7',$,'Pset_CommunicationsApplianceTypeIntelligentPeripheral','Properties common to a intelligent peripheral. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type of INTELLIGENT_PERIPHERAL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/INTELLIGENTPERIPHERAL,IfcCommunicationsApplianceType/INTELLIGENTPERIPHERAL',(#802)); -#802=IFCSIMPLEPROPERTYTEMPLATE('0UMS5rjnPFifnXqcRu1F7s',$,'UserCapacity','Indicates the user capacity of the device, defined as the maximum number of users that can be active at the same time.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#803=IFCPROPERTYSETTEMPLATE('1ze6g4AVX7ogQiYMXy4CWv',$,'Pset_CommunicationsApplianceTypeIpNetworkEquipment','Properties common to a IP network equipment. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type of IP_NETWORK_EQUIPMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/IPNETWORKEQUIPMENT,IfcCommunicationsApplianceType/IPNETWORKEQUIPMENT',(#804,#805,#806,#807,#808,#809)); -#804=IFCSIMPLEPROPERTYTEMPLATE('2d7rHfItXFDg0FBCIk2h7O',$,'NumberOfSlots','Indicates the number of slots.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#805=IFCSIMPLEPROPERTYTEMPLATE('07aoPZrTL2Ne47kk1R27h4',$,'EquipmentCapacity','Indicates the equipment capacity of the appliance. The value is defined in bits/s.',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); -#806=IFCSIMPLEPROPERTYTEMPLATE('0KrR2fh$XCsPVZ_w8qHAlN',$,'NumberOfCoolingFans','Indicates the number of cooling fans in the equipment.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#807=IFCSIMPLEPROPERTYTEMPLATE('02KX8S5C93WBpWZkO5gor5',$,'SupportedProtocol','Indicates the protocol supported by the IP network equipment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#808=IFCSIMPLEPROPERTYTEMPLATE('1LH_8DCHP5B8KR_vrMwsp4',$,'ManagingSoftware','Indicates the type of software responsible for managing the equipment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#809=IFCSIMPLEPROPERTYTEMPLATE('1afh3Hebf3KeJMYzXaZXPJ',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#810=IFCPROPERTYSETTEMPLATE('2qu$Fd25983OXVrbjzARL8',$,'Pset_CommunicationsApplianceTypeModem','Properties common to a modem. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type MODEM.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/MODEM,IfcCommunicationsApplianceType/MODEM',(#811,#812,#813,#815)); -#811=IFCSIMPLEPROPERTYTEMPLATE('0ge809KYHFTAxVfPLrT4aq',$,'NumberOfCommonInterfaces','Indicates the number of common interfaces on the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#812=IFCSIMPLEPROPERTYTEMPLATE('2B$HNSw417LPZ2AxrkGp0K',$,'NumberOfTrafficInterfaces','Indicates the number of traffic interfaces on the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#813=IFCSIMPLEPROPERTYTEMPLATE('2Qz_UpZuD9s9a8byeYbLqu',$,'CommonInterfaceType','Indicates the type of the device common interfaces.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#814,$,$,$,.READWRITE.); -#814=IFCPROPERTYENUMERATION('PEnum_CommonInterfaceType',(IFCLABEL('DRYCONTACTSINTERFACE'),IFCLABEL('MANAGEMENTINTERFACE'),IFCLABEL('OTHER_IO_INTERFACE'),IFCLABEL('SYNCHRONIZATIONINTERFACE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#815=IFCSIMPLEPROPERTYTEMPLATE('0UKLwCXbL7wRyE1BzijHMt',$,'TrafficInterfaceType','Indicates the type of the device traffic interfaces.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#816,$,$,$,.READWRITE.); -#816=IFCPROPERTYENUMERATION('PEnum_ModemTrafficInterfaceType',(IFCLABEL('E1'),IFCLABEL('FASTETHERNET'),IFCLABEL('XDSL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#817=IFCPROPERTYSETTEMPLATE('1NdrUqQJP3meF5kB9xrFXN',$,'Pset_CommunicationsApplianceTypeOpticalLineTerminal','Properties common to a optical line terminal. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type OPTICALLINETERMINAL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/OPTICALLINETERMINAL,IfcCommunicationsApplianceType/OPTICALLINETERMINAL',(#818,#819)); -#818=IFCSIMPLEPROPERTYTEMPLATE('3dB06b$I1CkvQOxFmX_$Ee',$,'NumberOfSlots','Indicates the number of slots.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#819=IFCSIMPLEPROPERTYTEMPLATE('2BLyRsWz9DnhKrD2uN6pTw',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#820=IFCPROPERTYSETTEMPLATE('1wuEM_xL9BSgtmvVO0kn7f',$,'Pset_CommunicationsApplianceTypeOpticalNetworkUnit','Properties common to a optical network unit. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type OPTICAL_NETWORK_UNIT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/OPTICALNETWORKUNIT,IfcCommunicationsApplianceType/OPTICALNETWORKUNIT',(#821,#823)); -#821=IFCSIMPLEPROPERTYTEMPLATE('0Pez2Fjkv9sun4rJUlFaDy',$,'OpticalNetworkUnitType','Indicates the type of the optical network unit equipment.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#822,$,$,$,.READWRITE.); -#822=IFCPROPERTYENUMERATION('PEnum_OpticalNetworkUnitType',(IFCLABEL('ACTIVE'),IFCLABEL('PASSIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#823=IFCSIMPLEPROPERTYTEMPLATE('2DvEcPgHTEtv6p5JDXtwwG',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#824=IFCPROPERTYSETTEMPLATE('17redGCiz2ePTuMTNsoWqI',$,'Pset_CommunicationsApplianceTypeTelecommand','Properties common to a telecommand. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type TELECOMMAND.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/TELECOMMAND,IfcCommunicationsApplianceType/TELECOMMAND',(#825,#826)); -#825=IFCSIMPLEPROPERTYTEMPLATE('1_Qvsp4oj1xhOcC7A4Njhg',$,'NumberOfWorkstations','Indicates the types or purposes of workstations and their number in the equipment. The defined purpose can be e.g. ''Diagnostic and maintenance'', ''Traffic and electric traction'', etc.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#826=IFCSIMPLEPROPERTYTEMPLATE('3j6vEMpzL4sR5ZupZDAy3s',$,'NumberOfCPUs','The number of CPUs used by the equipment.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#827=IFCPROPERTYSETTEMPLATE('0biefTfu93kP9ukeBN$g2y',$,'Pset_CommunicationsApplianceTypeTelephonyExchange','Properties common to a telephony exchange. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type TELEPHONYEXCHANGE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/TELEPHONYEXCHANGE,IfcCommunicationsApplianceType/TELEPHONYEXCHANGE',(#828)); -#828=IFCSIMPLEPROPERTYTEMPLATE('1$qk0kAwPBmRzhPQ8iLWrc',$,'UserCapacity','Indicates the user capacity of the device, defined as the maximum number of users that can be active at the same time.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#829=IFCPROPERTYSETTEMPLATE('37vrXiA$DCBeOmK9ojDwz8',$,'Pset_CommunicationsApplianceTypeTransportEquipment','Properties common to a transport equipment. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type TRANSPORTEQUIPMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/TRANSPORTEQUIPMENT,IfcCommunicationsApplianceType/TRANSPORTEQUIPMENT',(#830,#831,#832,#833,#835)); -#830=IFCSIMPLEPROPERTYTEMPLATE('3WMQPNjcP9HwOP8oPRTghA',$,'IsUpgradable','Indicates whether the transport equipment can be upgraded or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#831=IFCSIMPLEPROPERTYTEMPLATE('1VlbRew$nAseUtIkd2FU2t',$,'ElectricalCrossCapacity','Indicates the electrical cross capacity of the transport equipment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#832=IFCSIMPLEPROPERTYTEMPLATE('2iQQqi6jP7te69cscSIylp',$,'NumberOfSlots','Indicates the number of slots.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#833=IFCSIMPLEPROPERTYTEMPLATE('0BLo6cGoz90O8UAjnMpLeU',$,'TransportEquipmentType','Indicates the type of transport equipment.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#834,$,$,$,.READWRITE.); -#834=IFCPROPERTYENUMERATION('PEnum_TransportEquipmentType',(IFCLABEL('MPLS_TP'),IFCLABEL('OTN'),IFCLABEL('PDH'),IFCLABEL('SDH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#835=IFCSIMPLEPROPERTYTEMPLATE('2zEpzbGLHCtOhCNXLC6TBv',$,'TransportEquipmentAssemblyType','Indicates the type of transport equipment assembly.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#836,$,$,$,.READWRITE.); -#836=IFCPROPERTYENUMERATION('PEnum_TransportEquipmentAssemblyType',(IFCLABEL('FIXEDCONFIGURATION'),IFCLABEL('MODULARCONFIGURATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#837=IFCPROPERTYSETTEMPLATE('03gAHWm5TBS9wF_lQO0f5n',$,'Pset_CompressorPHistory','Compressor performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcCompressor',(#838,#839,#840,#841,#842,#843,#844,#845,#846,#847,#848,#849,#850,#851)); -#838=IFCSIMPLEPROPERTYTEMPLATE('3tmgbVunXEFx_OYAdU0c45',$,'CompressorCapacity','The product of the ideal capacity and the overall volumetric efficiency of the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#839=IFCSIMPLEPROPERTYTEMPLATE('1ARZCSDlr24e4lulHL7ZoJ',$,'EnergyEfficiencyRatio','Energy efficiency ratio (EER).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#840=IFCSIMPLEPROPERTYTEMPLATE('1oExYZgIHDYRqK5AmiIs30',$,'CoefficientOfPerformance','The Coefficient of performance (COP) is the ratio of heat removed to energy input.\X2\000A\X0\The energy input may be obtained by multiplying\X2\000A\X0\Pset_DistributionPortPHistoryGas.FlowRate on the ''Fuel'' port of the IfcChiller by Pset_MaterialFuel.LowerHeatingValue.\X2\000A\X0\The IfcDistributionPort for fuel has an associated IfcMaterial with fuel properties and is assigned to an IfcPerformanceHistory object nested within this IfcPerformanceHistory object.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#841=IFCSIMPLEPROPERTYTEMPLATE('32Dt8dPTf86uLXd4IVrzbA',$,'VolumetricEfficiency','Ratio of the actual volume of gas entering the compressor to the theoretical displacement of the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#842=IFCSIMPLEPROPERTYTEMPLATE('2HiB1oyJbEyR1okWy3lf0L',$,'CompressionEfficiency','Ratio of the work required for isentropic compression of the gas to the work delivered to the gas within the compression volume (as obtained by measurement).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#843=IFCSIMPLEPROPERTYTEMPLATE('2mVVmqqyjFzxSmfLNzC8HD',$,'MechanicalEfficiency','The objects operational mechanical efficiency.\X2\000A000A\X0\Ratio of the work (as measured) delivered to the gas to the work input to the compressor shaft.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#844=IFCSIMPLEPROPERTYTEMPLATE('2rWJeCfYnCYhC494H1DImD',$,'IsentropicEfficiency','Ratio of the work required for isentropic compression of the gas to work input to the compressor shaft.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#845=IFCSIMPLEPROPERTYTEMPLATE('2BIIRb3x58n8yrlKPeVdL5',$,'CompressorTotalEfficiency','Ratio of the thermal cooling capacity to electrical input.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#846=IFCSIMPLEPROPERTYTEMPLATE('3Xph$_qTb4ngzv0Q3Y$rLu',$,'ShaftPower','The actual shaft power input to the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#847=IFCSIMPLEPROPERTYTEMPLATE('3wN01MxCX1OPQOLPedMNbf',$,'InputPower','Input power to the compressor motor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#848=IFCSIMPLEPROPERTYTEMPLATE('3ibQFhXOrBjOnrQ73EceHa',$,'LubricantPumpHeatGain','Lubricant pump heat gain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#849=IFCSIMPLEPROPERTYTEMPLATE('0KtCPlcXn0khq67Umzg8uS',$,'FrictionHeatGain','Friction heat gain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#850=IFCSIMPLEPROPERTYTEMPLATE('1s1oneCFX8CAvlRnm4Ey_F',$,'CompressorTotalHeatGain','Compressor total heat gain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#851=IFCSIMPLEPROPERTYTEMPLATE('1TTgM5I4r2vAYu4uH4RUhM',$,'FullLoadRatio','Ratio of actual power to full load power as a quadratic function of part load, at certain condensing and evaporating temperature, FracFullLoadPower = f ( PartLoadRatio).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#852=IFCPROPERTYSETTEMPLATE('1cPskmZNX3VR_CRNUCPyOp',$,'Pset_CompressorTypeCommon','Compressor type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCompressor,IfcCompressorType',(#853,#854,#856,#858,#860,#861,#862,#863,#864,#865,#866,#867)); -#853=IFCSIMPLEPROPERTYTEMPLATE('0fzxhEvm5EoR5AaWKzFQ0G',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#854=IFCSIMPLEPROPERTYTEMPLATE('0ucwHUQSj7gQAZYJNheJPE',$,'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',$,#855,$,$,$,.READWRITE.); -#855=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#856=IFCSIMPLEPROPERTYTEMPLATE('2s9wpcDSD8NhZ0hOMLelSM',$,'PowerSource','Type of power driving the compressor.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#857,$,$,$,.READWRITE.); -#857=IFCPROPERTYENUMERATION('PEnum_CompressorTypePowerSource',(IFCLABEL('ENGINEDRIVEN'),IFCLABEL('GASTURBINE'),IFCLABEL('MOTORDRIVEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#858=IFCSIMPLEPROPERTYTEMPLATE('3oNNwfqNvEu9OaJ1ITTQrF',$,'RefrigerantClass','Refrigerant class used by the object.\X2\000A\X0\CFC: Chlorofluorocarbons.\X2\000A\X0\HCFC: Hydrochlorofluorocarbons.\X2\000A\X0\HFC: Hydrofluorocarbons.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#859,$,$,$,.READWRITE.); -#859=IFCPROPERTYENUMERATION('PEnum_RefrigerantClass',(IFCLABEL('AMMONIA'),IFCLABEL('CFC'),IFCLABEL('CO2'),IFCLABEL('H2O'),IFCLABEL('HCFC'),IFCLABEL('HFC'),IFCLABEL('HYDROCARBONS'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#860=IFCSIMPLEPROPERTYTEMPLATE('1_zIxySBHET9C6skPF1Szl',$,'MinimumPartLoadRatio','Minimum part load ratio as a fraction of nominal capacity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#861=IFCSIMPLEPROPERTYTEMPLATE('29v6IeMyr7JQiMPyFzEaAX',$,'MaximumPartLoadRatio','Maximum part load ratio as a fraction of nominal capacity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#862=IFCSIMPLEPROPERTYTEMPLATE('1NVDAgMPn7mxfjkeicvpEm',$,'CompressorSpeed','Compressor speed.',.P_SINGLEVALUE.,'IfcRotationalFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#863=IFCSIMPLEPROPERTYTEMPLATE('1wSFXvAO50qeu_3Gl2FkKZ',$,'NominalCapacity','The total nominal or volumetric capacity of the object.\X2\000A000A\X0\Compressor nameplate capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#864=IFCSIMPLEPROPERTYTEMPLATE('1xOubpRv14Og5aA0gyma7C',$,'IdealCapacity','Compressor capacity under ideal conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#865=IFCSIMPLEPROPERTYTEMPLATE('3P1u4VqX57ZAbtUFX2HIvS',$,'IdealShaftPower','Compressor shaft power under ideal conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#866=IFCSIMPLEPROPERTYTEMPLATE('3riKw9TYb70BQDKqhDw6Ht',$,'HasHotGasBypass','Whether or not hot gas bypass is provided for the compressor. TRUE = Yes, FALSE = No.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#867=IFCSIMPLEPROPERTYTEMPLATE('3IDW5EgGPBmwmGszPyrvh0',$,'ImpellerDiameter','Diameter of object - used to scale performance of geometrically similar objects.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#868=IFCPROPERTYSETTEMPLATE('2pkE$oqdj4hPcKhGff8SmM',$,'Pset_ConcreteElementGeneral','General properties common to different types of concrete elements, including reinforced concrete elements. The property set can be used by a number of subtypes of IfcBuildingElement, indicated that such element is designed or constructed using a concrete construction method.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBeam,IfcBuildingElementProxy,IfcChimney,IfcCivilElement,IfcColumn,IfcFooting,IfcMember,IfcPile,IfcPlate,IfcRailing,IfcRampFlight,IfcRamp,IfcRoof,IfcSlab,IfcStairFlight,IfcStair,IfcWall,IfcBeamType,IfcBuildingElementProxyType,IfcChimneyType,IfcCivilElementType,IfcColumnType,IfcFootingType,IfcMemberType,IfcPileType,IfcPlateType,IfcRailingType,IfcRampFlightType,IfcRampType,IfcRoofType,IfcSlabType,IfcStairFlightType,IfcStairType,IfcWallType',(#869,#871,#873,#874,#875,#876,#877,#878,#879,#880,#881,#882,#883)); -#869=IFCSIMPLEPROPERTYTEMPLATE('3pMxfX6ljCKQ4a4edKDx2p',$,'AssemblyPlace','Enumeration defining where the assembly is intended to take place, either in a factory, other offsite location or on the building site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#870,$,$,$,.READWRITE.); -#870=IFCPROPERTYENUMERATION('PEnum_AssemblyPlace',(IFCLABEL('FACTORY'),IFCLABEL('OFFSITE'),IFCLABEL('SITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#871=IFCSIMPLEPROPERTYTEMPLATE('130dhEByTEeOjbhszIO2Ss',$,'CastingMethod','The method of casting the concrete into its designed form.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#872,$,$,$,.READWRITE.); -#872=IFCPROPERTYENUMERATION('PEnum_ConcreteCastingMethod',(IFCLABEL('INSITU'),IFCLABEL('MIXED'),IFCLABEL('PRECAST'),IFCLABEL('PRINTED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#873=IFCSIMPLEPROPERTYTEMPLATE('1LCHsgRm9Ba8SrN8rQ_ZE_',$,'StructuralClass','The structural class defined for the concrete structure (e.g. ''1'').',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#874=IFCSIMPLEPROPERTYTEMPLATE('162UuKc6D1i8aM5NAdNYm4',$,'StrengthClass','Classification of the concrete strength in accordance with the concrete design code which is applied in the project.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#875=IFCSIMPLEPROPERTYTEMPLATE('1WrwMB_QD9MQVQUc6sppcq',$,'ExposureClass','Classification of exposure to environmental conditions, usually specified in accordance with the concrete design code which is applied in the project.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#876=IFCSIMPLEPROPERTYTEMPLATE('3L3GCZeCj7484nEsqcrNUl',$,'ReinforcementVolumeRatio','The required ratio of the effective mass of the reinforcement to the effective volume of the concrete of a reinforced concrete structural element.',.P_SINGLEVALUE.,'IfcMassDensityMeasure',$,$,$,$,$,.READWRITE.); -#877=IFCSIMPLEPROPERTYTEMPLATE('2GrnewJBD2pRehVzhyJ9T$',$,'ReinforcementAreaRatio','The required ratio of the effective area of the reinforcement to the effective area of the concrete At any section of a reinforced concrete structural element.',.P_SINGLEVALUE.,'IfcAreaDensityMeasure',$,$,$,$,$,.READWRITE.); -#878=IFCSIMPLEPROPERTYTEMPLATE('133nC0Ksr2GuG1s$UyT34k',$,'DimensionalAccuracyClass','Classification designation of the dimensional accuracy requirement according to local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#879=IFCSIMPLEPROPERTYTEMPLATE('0yb8g6lM1C5ARCfrg$Ptmh',$,'ConstructionToleranceClass','Classification designation of the on-site construction tolerances according to local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#880=IFCSIMPLEPROPERTYTEMPLATE('1kkjYTXyP779b53EI6Zu$r',$,'ConcreteCover','The protective concrete cover at the reinforcing bars according to local building regulations.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#881=IFCSIMPLEPROPERTYTEMPLATE('1wMSZZHynF0e2huxA9YFry',$,'ConcreteCoverAtMainBars','The protective concrete cover at the main reinforcing bars according to local building regulations.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#882=IFCSIMPLEPROPERTYTEMPLATE('2nseC3QUj43ObGNRNHZkMN',$,'ConcreteCoverAtLinks','The protective concrete cover at the reinforcement links according to local building regulations.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#883=IFCSIMPLEPROPERTYTEMPLATE('3G8rVbxnv7Sx$YWtF82rHn',$,'ReinforcementStrengthClass','Classification of the reinforcement strength in accordance with the concrete design code which is applied in the project. The reinforcing strength class often combines strength and ductility.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#884=IFCPROPERTYSETTEMPLATE('11YO69ZQvEIhqPowMKMtst',$,'Pset_CondenserPHistory','Condenser performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcCondenser',(#885,#886,#887,#888,#889,#890,#891,#892,#893,#894,#895)); -#885=IFCSIMPLEPROPERTYTEMPLATE('0P_LCSee174BfblllXvsMw',$,'HeatRejectionRate','Sum of the refrigeration effect and the heat equivalent of the power input to the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#886=IFCSIMPLEPROPERTYTEMPLATE('3rJxfABp17WvYZQDmZs4yB',$,'ExteriorHeatTransferCoefficient','Exterior heat transfer coefficient associated with exterior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#887=IFCSIMPLEPROPERTYTEMPLATE('0iaxqxtHj6Ifn6xoKRNCya',$,'InteriorHeatTransferCoefficient','Interior heat transfer coefficient associated with interior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#888=IFCSIMPLEPROPERTYTEMPLATE('3zww1dzg917ePwNvdOON2j',$,'RefrigerantFoulingResistance','Fouling resistance on the refrigerant side.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#889=IFCSIMPLEPROPERTYTEMPLATE('3$y4f5FjbFoe7kF3OtSj0j',$,'CondensingTemperature','Refrigerant condensing temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#890=IFCSIMPLEPROPERTYTEMPLATE('0iHnJG_Vn2cgbZG84yItAG',$,'LogarithmicMeanTemperatureDifference','Logarithmic mean temperature difference between refrigerant and water or air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#891=IFCSIMPLEPROPERTYTEMPLATE('20YeJpNND3OQgXQSmY$dLM',$,'UAcurves','UV = f (VExterior, VInterior), UV as a function of interior and exterior fluid flow velocity at the entrance.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#892=IFCSIMPLEPROPERTYTEMPLATE('0KVOEcv6P8$wlRTNxK9$0f',$,'CompressorCondenserHeatGain','Heat gain between condenser inlet to compressor outlet.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#893=IFCSIMPLEPROPERTYTEMPLATE('2aUGERC2P8JQnvL7udNMmi',$,'CompressorCondenserPressureDrop','Pressure drop between condenser inlet and compressor outlet.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#894=IFCSIMPLEPROPERTYTEMPLATE('28qEpa8FXEgh3Jw6iclSqk',$,'CondenserMeanVoidFraction','Mean void fraction in condenser.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#895=IFCSIMPLEPROPERTYTEMPLATE('1su5rv56vBFPmhqDAdtLyJ',$,'WaterFoulingResistance','Fouling resistance on water/air side.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#896=IFCPROPERTYSETTEMPLATE('12zUHl8Ef7ufxpGslJjPLi',$,'Pset_CondenserTypeCommon','Condenser type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCondenser,IfcCondenserType',(#897,#898,#900,#902,#903,#904,#905,#906,#907)); -#897=IFCSIMPLEPROPERTYTEMPLATE('2Np_3YHQb6c8VBhReVaHEQ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#898=IFCSIMPLEPROPERTYTEMPLATE('2drsGOmzT16vKru$aW5fZT',$,'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',$,#899,$,$,$,.READWRITE.); -#899=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#900=IFCSIMPLEPROPERTYTEMPLATE('0Xa2M2IxjFm8z9d67bBsz8',$,'RefrigerantClass','Refrigerant class used by the object.\X2\000A\X0\CFC: Chlorofluorocarbons.\X2\000A\X0\HCFC: Hydrochlorofluorocarbons.\X2\000A\X0\HFC: Hydrofluorocarbons.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#901,$,$,$,.READWRITE.); -#901=IFCPROPERTYENUMERATION('PEnum_RefrigerantClass',(IFCLABEL('AMMONIA'),IFCLABEL('CFC'),IFCLABEL('CO2'),IFCLABEL('H2O'),IFCLABEL('HCFC'),IFCLABEL('HFC'),IFCLABEL('HYDROCARBONS'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#902=IFCSIMPLEPROPERTYTEMPLATE('1WS0yfdYz3PAVnoK_gPIHC',$,'ExternalSurfaceArea','External surface area (both primary and secondary area).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#903=IFCSIMPLEPROPERTYTEMPLATE('3mFXZFEUn7nOI3GvEhn18I',$,'InternalSurfaceArea','Internal surface area.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#904=IFCSIMPLEPROPERTYTEMPLATE('2FHM1hvVP1q9f708cuUc8w',$,'InternalRefrigerantVolume','Internal volume of object (refrigerant side).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#905=IFCSIMPLEPROPERTYTEMPLATE('05vGwqK8rBDAGDaZd1fnYJ',$,'InternalWaterVolume','Internal volume of object (water side).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#906=IFCSIMPLEPROPERTYTEMPLATE('1HS6Kik9bAXeruptf4pbrM',$,'NominalHeatTransferArea','Nominal heat transfer surface area associated with nominal overall heat transfer coefficient.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#907=IFCSIMPLEPROPERTYTEMPLATE('3qZHq7kfnBHht8gHCY6RYH',$,'NominalHeatTransferCoefficient','Nominal overall heat transfer coefficient associated with nominal heat transfer area.',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#908=IFCPROPERTYSETTEMPLATE('3_fQWmexPEQhQnUAvmzxBh',$,'Pset_Condition','Determines the state or condition of an element at a particular point in time.',.PSET_TYPEDRIVENOVERRIDE.,'IfcAsset,IfcElement,IfcSystem,IfcElementType',(#909,#910,#911,#912,#913,#914,#915,#916)); -#909=IFCSIMPLEPROPERTYTEMPLATE('08LDzkui1D6x5kUD7xita5',$,'AssessmentDate','Date on which the overall condition is assessed',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#910=IFCSIMPLEPROPERTYTEMPLATE('17o8RnHnjFSwFfrvRD9WeR',$,'AssessmentCondition','The overall condition of a product based on an assessment of the contributions to the overall condition made by the various criteria considered. The meanings given to the values of assessed condition should be agreed and documented by local agreements. For instance, is overall condition measured on a scale of 1 - 10 or by assigning names such as Good, OK, Poor.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#911=IFCSIMPLEPROPERTYTEMPLATE('3oCSYj4K52pO7yPV$8GUwF',$,'AssessmentDescription','Qualitative description of the condition.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#912=IFCSIMPLEPROPERTYTEMPLATE('2Qg3dQeHf1LPljseF5o7bU',$,'AssessmentType','Category of latest condition assessment report of the asset.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#913=IFCSIMPLEPROPERTYTEMPLATE('1VLPyf9kz0pRtCR1L6xTqu',$,'AssessmentMethod','External reference to assessment method or application used to perform the assessment.',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); -#914=IFCSIMPLEPROPERTYTEMPLATE('2ZaccT6Rb6MRMkIwzlySfX',$,'LastAssessmentReport','Reference to latest condition (state of health) report.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#915=IFCSIMPLEPROPERTYTEMPLATE('0hqrk11UPFVeDTri1aTkvg',$,'NextAssessmentDate','Date of next condition inspection',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#916=IFCSIMPLEPROPERTYTEMPLATE('1O$TOKOMr2MPC2ceclbUP$',$,'AssessmentFrequency','Indicates how often the equipment should be assessed, to have a clear estimation on its working state, based on which the maintenance staff can decide whether it requires maintenance or requires to be updated or replaced.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#917=IFCPROPERTYSETTEMPLATE('0nS__xUbb52u9Uk28iIPTH',$,'Pset_ConstructionAdministration','Properties for Construction Administration. Often used for facility and asset management.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#918,#919,#920)); -#918=IFCSIMPLEPROPERTYTEMPLATE('1TU_Gx_4v1q9ocaZYGkDCK',$,'ProcurementMethod','The method by which an IfcProductType/IfcProduct is acquired and installed. The value provided shall be one of the following four character acronyms: \X2\201C\X0\CFCI\X2\201D\X0\ (meaning Contractor Furnished Contractor Installed), \X2\201C\X0\OFCI\X2\201D\X0\ (meaning Owner Furnished Contractor Installed), or \X2\201C\X0\OFOI\X2\201D\X0\ (meaning Owner Furnished Owner Installed).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#919=IFCSIMPLEPROPERTYTEMPLATE('3Vvaaz1R573Ri6jK4MSU$A',$,'SpecificationSectionNumber','A reference number to an external contract technical specification section describing either (a) minimum performance requirements of a given IfcProductType/IfcProduct or (b) a preselection for a specific IfcProductType/IfcProduct made for this project.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#920=IFCSIMPLEPROPERTYTEMPLATE('0tAgjK_tb8gQ2FyW4VMkuT',$,'SubmittalIdentifer','The reference number to an external construction administration submittal used by the construction contractor and/or subcontractor to verify that the referenced IfcProductType/IfcProduct selection conforms with the requirements found in the referenced SpecificationSectionNumber.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#921=IFCPROPERTYSETTEMPLATE('24n_eZtRH3sO5ookEBZDZa',$,'Pset_ConstructionOccurence','Property set for construction occurence.',.PSET_OCCURRENCEDRIVEN.,'IfcElement',(#922,#923,#924,#925)); -#922=IFCSIMPLEPROPERTYTEMPLATE('1p_AeEvZbDUxU4$beehCN3',$,'InstallationDate','Date on which the element is installed.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#923=IFCSIMPLEPROPERTYTEMPLATE('2Dg0qCi7L7th53wlpVnJdW',$,'ModelNumber','The model number and/or unit designator assigned by the manufacturer of the manufactured item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#924=IFCSIMPLEPROPERTYTEMPLATE('3elu5y3wj8NggzzB_4UrU0',$,'TagNumber','Tag number.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#925=IFCSIMPLEPROPERTYTEMPLATE('0Ur7iEmGb1zuNl5FBi6NcG',$,'AssetIdentifier','A unique identification assigned to an asset that enables its differentiation from other assets.NOTE The asset identifier is unique within the asset register. It differs from the globally unique id assigned to the instance of an entity populating a database.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#926=IFCPROPERTYSETTEMPLATE('1BJMCnqcf3nA2vOsC8YZ7p',$,'Pset_ConstructionResource','Properties for tracking resource usage over time.',.PSET_TYPEDRIVENOVERRIDE.,'IfcConstructionResource,IfcConstructionResourceType',(#927,#928,#929,#930,#931,#932,#933,#934)); -#927=IFCSIMPLEPROPERTYTEMPLATE('3qWxNsJIXBbOLUemmgPljg',$,'ScheduleWorkProgression','The scheduled work on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#928=IFCSIMPLEPROPERTYTEMPLATE('3qoByc1BL0MPpnxNi108Ol',$,'ActualWorkTime','The actual work on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#929=IFCSIMPLEPROPERTYTEMPLATE('10BjuKx$993u21wRfn2Kfu',$,'RemainingWorkProgression','The remaining work on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#930=IFCSIMPLEPROPERTYTEMPLATE('1nyCfV29HBavNab1Qk3gZ2',$,'ScheduleCost','The budgeted cost on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#931=IFCSIMPLEPROPERTYTEMPLATE('1EoI3Ax$L6UAz7LEo_Hv8r',$,'ActualCost','The actual cost on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#932=IFCSIMPLEPROPERTYTEMPLATE('1ONcOhmyHBE8dI$Ks_Pwf7',$,'RemainingCost','The remaining cost on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#933=IFCSIMPLEPROPERTYTEMPLATE('2EUxMVdFP3Fuv9TrK4Yv_p',$,'ScheduleCompletion','The scheduled completion percentage of the allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#934=IFCSIMPLEPROPERTYTEMPLATE('3kRsIb4HP4F9tQHM85VzqN',$,'ActualCompletion','The actual completion percentage of the allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#935=IFCPROPERTYSETTEMPLATE('2Go9zD6gbAyxr812NGvE9D',$,'Pset_ControllerPHistory','Properties for history of controller values. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcController',(#936,#937,#938)); -#936=IFCSIMPLEPROPERTYTEMPLATE('07j6DWm855ohmI4aJyAeek',$,'ValueHistory','Indicates values over time which may be recorded continuously or only when changed beyond a particular deadband. The range of possible values is defined by the Value property on the corresponding occurrence property set (Pset_ControllerTypeFloating, Pset_ControllerTypeProportional, Pset_ControllerTypeMultiPosition, or Pset_ControllerTypeTwoPosition).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#937=IFCSIMPLEPROPERTYTEMPLATE('0MDkM9YuP39B6qO_oCVBTi',$,'Quality','Indicates the quality of measurement or failure condition, which may be further qualified by the Status. True: measured values are considered reliable; False: measured values are considered not reliable (i.e. a fault has been detected); Unknown: reliability of values is uncertain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#938=IFCSIMPLEPROPERTYTEMPLATE('3wyEIoVkXFfAEPT5q2wIjN',$,'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).\X2\000A000A\X0\Indicates an error code or identifier, whose meaning is specific to the particular automation system. Example values include: ''ConfigurationError'', ''NotConnected'', ''DeviceFailure'', ''SensorFailure'', ''LastKnown, ''CommunicationsFailure'', ''OutOfService''.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#939=IFCPROPERTYSETTEMPLATE('2kIjeFbmf4n8pC_7D3GBpf',$,'Pset_ControllerTypeCommon','Controller type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController,IfcControllerType',(#940,#941)); -#940=IFCSIMPLEPROPERTYTEMPLATE('0bm2o3tAfAXALc9KoZ6_V9',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#941=IFCSIMPLEPROPERTYTEMPLATE('1lPn44ctPBZQi3TqfgxYiC',$,'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',$,#942,$,$,$,.READWRITE.); -#942=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#943=IFCPROPERTYSETTEMPLATE('0$7e_Sk9zBRuDqmCBGHPm9',$,'Pset_ControllerTypeFloating','Properties for signal handling for an analog controller taking disparate valued multiple inputs and creating a single valued output. HISTORY: IFC4 adapted from Pset_ControllerTypeCommon and applicable predefined type made specific to FLOATING; ACCUMULATOR and PULSECONVERTER types added; additional properties added to replace Pset_AnalogInput and Pset_AnalogOutput.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController/FLOATING,IfcControllerType/FLOATING',(#944,#946,#947,#948,#949,#950,#951)); -#944=IFCSIMPLEPROPERTYTEMPLATE('3DzU6uQwPC0fgln4DlBReo',$,'ControlType','The type controller, signal modification effected and applicable ports\X2\000A000A\X0\CONSTANT: No inputs; SignalOffset is written to the output value.\X2\000A\X0\MODIFIER: Single analog input is read, added to SignalOffset, multiplied by SignalFactor, and written to the output value.\X2\000A\X0\ABSOLUTE: Single analog input is read and absolute value is written to the output value.\X2\000A\X0\INVERSE: Single analog input is read, 1.0 is divided by the input value and written to the output value.\X2\000A\X0\HYSTERISIS: Single analog input is read, delayed according to SignalTime, and written to the output value.\X2\000A\X0\RUNNINGAVERAGE: Single analog input is read, averaged over SignalTime, and written to the output value.\X2\000A\X0\DERIVATIVE: Single analog input is read and the rate of change during the SignalTime is written to the output value.\X2\000A\X0\INTEGRAL: Single analog input is read and the average value during the SignalTime is written to the output value.\X2\000A\X0\BINARY: Single binary input is read and SignalOffset is written to the output value if True.\X2\000A\X0\ACCUMULATOR: Single binary input is read, and for each pulse the SignalOffset is added to the accumulator, and while the accumulator is greater than the SignalFactor, the accumulator is decremented by SignalFactor and the integer result is incremented by one.\X2\000A\X0\PULSECONVERTER: Single integer input is read, and for each increment the SignalMultiplier is added and written to the output value.\X2\000A\X0\SUM: Two analog inputs are read, added, and written to the output value.\X2\000A\X0\SUBTRACT: Two analog inputs are read, subtracted, and written to the output value.\X2\000A\X0\PRODUCT: Two analog inputs are read, multiplied, and written to the output value.\X2\000A\X0\DIVIDE: Two analog inputs are read, divided, and written to the output value.\X2\000A\X0\AVERAGE: Two analog inputs are read and the average is written to the output value.\X2\000A\X0\MAXIMUM: Two analog inputs are read and the maximum is written to the output value.\X2\000A\X0\MINIMUM: Two analog inputs are read and the minimum is written to the output value..\X2\000A\X0\INPUT: Controller element is a dedicated input.\X2\000A\X0\OUTPUT: Controller element is a dedicated output.\X2\000A\X0\VARIABLE: Controller element is an in-memory variable.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#945,$,$,$,.READWRITE.); -#945=IFCPROPERTYENUMERATION('PEnum_ControllerTypeFloating',(IFCLABEL('ABSOLUTE'),IFCLABEL('ACCUMULATOR'),IFCLABEL('AVERAGE'),IFCLABEL('BINARY'),IFCLABEL('CONSTANT'),IFCLABEL('DERIVATIVE'),IFCLABEL('DIVIDE'),IFCLABEL('HYSTERESIS'),IFCLABEL('INPUT'),IFCLABEL('INTEGRAL'),IFCLABEL('INVERSE'),IFCLABEL('LOWERLIMITCONTROL'),IFCLABEL('MAXIMUM'),IFCLABEL('MINIMUM'),IFCLABEL('MODIFIER'),IFCLABEL('OUTPUT'),IFCLABEL('PRODUCT'),IFCLABEL('PULSECONVERTER'),IFCLABEL('REPORT'),IFCLABEL('RUNNINGAVERAGE'),IFCLABEL('SPLIT'),IFCLABEL('SUBTRACT'),IFCLABEL('SUM'),IFCLABEL('UPPERLIMITCONTROL'),IFCLABEL('VARIABLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#946=IFCSIMPLEPROPERTYTEMPLATE('3_Gp0nsqTCrgqLTPenn8FP',$,'Labels','Table mapping values to labels\X2\000A000A\X0\Labels indicate transition points such as ''Hi'', ''Lo'', ''HiHi'', or ''LoLo''.',.P_TABLEVALUE.,'IfcReal','IfcLabel',$,$,$,$,.READWRITE.); -#947=IFCSIMPLEPROPERTYTEMPLATE('2ghK$twiP15A1zx1RP9_f7',$,'Range','The physical range of values supported by the device.',.P_BOUNDEDVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#948=IFCSIMPLEPROPERTYTEMPLATE('0v0QqBTSP7bOh7zbjDGiDG',$,'Value','The expected range and default value.\X2\000A000A\X0\The expected range and default value. While the property data type is IfcReal (to support all cases including when the units are unknown), a unit may optionally be provided to indicate the measure and unit. The LowerLimitValue and UpperLimitValue must fall within the physical Range and may be used to determine extents when charting Pset_ControllerPHistory.Value.',.P_BOUNDEDVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#949=IFCSIMPLEPROPERTYTEMPLATE('0zG9AyBrP3FAZypIskdgB1',$,'SignalOffset','Offset constant added to modified signal.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#950=IFCSIMPLEPROPERTYTEMPLATE('0k_heUqN134QklBskwqTIc',$,'SignalFactor','Factor multiplied onto offset signal.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#951=IFCSIMPLEPROPERTYTEMPLATE('2sR5xbyOz2aRhZnAPWn5cA',$,'SignalTime','Time factor used for integral and running average controllers.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#952=IFCPROPERTYSETTEMPLATE('3LqF6ibhr0jeVeogFw1475',$,'Pset_ControllerTypeMultiPosition','Properties for discrete inputs, outputs, and values within a programmable logic controller. HISTORY: New in IFC4, replaces Pset_MultiStateInput and Pset_MultiStateOutput.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController/MULTIPOSITION,IfcControllerType/MULTIPOSITION',(#953,#955,#956,#957)); -#953=IFCSIMPLEPROPERTYTEMPLATE('0v4Horp8b8Mgq42tbjAOVe',$,'ControlType','The type controller, signal modification effected and applicable ports\X2\000A000A\X0\INPUT: Controller element is a dedicated input.\X2\000A\X0\OUTPUT: Controller element is a dedicated output.\X2\000A\X0\VARIABLE: Controller element is an in-memory variable.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#954,$,$,$,.READWRITE.); -#954=IFCPROPERTYENUMERATION('PEnum_ControllerMultiPositionType',(IFCLABEL('INPUT'),IFCLABEL('OUTPUT'),IFCLABEL('VARIABLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#955=IFCSIMPLEPROPERTYTEMPLATE('1nQ9pcgT17TfB5d7n4XvKu',$,'Labels','Table mapping values to labels\X2\000A000A\X0\Each entry corresponds to an integer within the ValueRange.',.P_TABLEVALUE.,'IfcInteger','IfcLabel',$,$,$,$,.READWRITE.); -#956=IFCSIMPLEPROPERTYTEMPLATE('3tNVTO3VX5kOvuTKgIjbJ_',$,'IntegerRange','The physical range of values supported by the device.',.P_BOUNDEDVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#957=IFCSIMPLEPROPERTYTEMPLATE('0YIUey$tL1GgXtGIm7k_KS',$,'Value','The expected range and default value.\X2\000A000A\X0\The expected range and default value. The LowerLimitValue and UpperLimitValue must fall within the physical Range.',.P_BOUNDEDVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#958=IFCPROPERTYSETTEMPLATE('0lVhzaDT57rAqtiRqw6wez',$,'Pset_ControllerTypeProgrammable','Properties for Discrete Digital Control (DDC) or programmable logic controllers. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController/PROGRAMMABLE,IfcControllerType/PROGRAMMABLE',(#959,#961,#962,#963)); -#959=IFCSIMPLEPROPERTYTEMPLATE('0k0x_ni5T5wvMSOfCk6rWN',$,'ControlType','The type controller, signal modification effected and applicable ports\X2\000A000A\X0\PRIMARY: Controller has built-in communication interface for PC connection, may manage secondary controllers.\X2\000A\X0\SECONDARY: Controller communicates with primary controller and its own managed devices.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#960,$,$,$,.READWRITE.); -#960=IFCPROPERTYENUMERATION('PEnum_ControllerTypeProgrammable',(IFCLABEL('PRIMARY'),IFCLABEL('SECONDARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#961=IFCSIMPLEPROPERTYTEMPLATE('2qKt9cpaT4$uXqthVM7yPo',$,'FirmwareVersion','Indicates version of device firmware according to device manufacturer.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#962=IFCSIMPLEPROPERTYTEMPLATE('1zUFgaA9XAxfTiDE9YoC1J',$,'SoftwareVersion','Indicates version of application software according to systems integrator.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#963=IFCSIMPLEPROPERTYTEMPLATE('1BYs1WTYfDzfMMxQVxAr5m',$,'Application','Indicates application of controller.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#964,$,$,$,.READWRITE.); -#964=IFCPROPERTYENUMERATION('PEnum_ControllerApplication',(IFCLABEL('BOILERCONTROLLER'),IFCLABEL('CONSTANTLIGHTCONTROLLER'),IFCLABEL('DISCHARGEAIRCONTROLLER'),IFCLABEL('FANCOILUNITCONTROLLER'),IFCLABEL('LIGHTINGPANELCONTROLLER'),IFCLABEL('MODEMCONTROLLER'),IFCLABEL('OCCUPANCYCONTROLLER'),IFCLABEL('PARTITIONWALLCONTROLLER'),IFCLABEL('PUMPCONTROLLER'),IFCLABEL('REALTIMEBASEDSCHEDULER'),IFCLABEL('REALTIMEKEEPER'),IFCLABEL('ROOFTOPUNITCONTROLLER'),IFCLABEL('SCENECONTROLLER'),IFCLABEL('SPACECONFORTCONTROLLER'),IFCLABEL('SUNBLINDCONTROLLER'),IFCLABEL('TELEPHONEDIRECTORY'),IFCLABEL('UNITVENTILATORCONTROLLER'),IFCLABEL('VAV'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#965=IFCPROPERTYSETTEMPLATE('354HCnTr1A6AEDd0D7Md6K',$,'Pset_ControllerTypeProportional','Properties for signal handling for an proportional controller taking setpoint and feedback inputs and creating a single valued output. HISTORY: In IFC4, SignalFactor1, SignalFactor2 and SignalFactor3 changed to ProportionalConstant, IntegralConstant and DerivativeConstant. SignalTime1 and SignalTime2 changed to SignalTimeIncrease and SignalTimeDecrease.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController/PROPORTIONAL,IfcControllerType/PROPORTIONAL',(#966,#968,#969,#970,#971,#972,#973,#974,#975)); -#966=IFCSIMPLEPROPERTYTEMPLATE('0ikq8VHFr2PQosneKE7nnV',$,'ControlType','The type controller, signal modification effected and applicable ports\X2\000A000A\X0\PROPORTIONAL: Output is proportional to the control error. The gain of a proportional control (Kp) will have the effect of reducing the rise time and reducing , but never eliminating, the steady-state error of the variable controlled.\X2\000A\X0\PROPORTIONALINTEGRAL: Part of the output is proportional to the control error and part is proportional to the time integral of the control error. Adding the gain of an integral control (Ki) will have the effect of eliminating the steady-state error of the variable controlled, but it may make the transient response worse.\X2\000A\X0\PROPORTIONALINTEGRALDERIVATIVE: Part of the output is proportional to the control error, part is proportional to the time integral of the control error and part is proportional to the time derivative of the control error. Adding the gain of a derivative control (Kd) will have the effect of increasing the stability of the system, reducing the overshoot, and improving the transient response of the variable controlled.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#967,$,$,$,.READWRITE.); -#967=IFCPROPERTYENUMERATION('PEnum_ControllerProportionalType',(IFCLABEL('PROPORTIONAL'),IFCLABEL('PROPORTIONALINTEGRAL'),IFCLABEL('PROPORTIONALINTEGRALDERIVATIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#968=IFCSIMPLEPROPERTYTEMPLATE('3XIq3mLQf1hwEMp9kcDkUS',$,'Labels','Table mapping values to labels\X2\000A000A\X0\Labels indicate transition points such as ''Hi'', ''Lo'', ''HiHi'', or ''LoLo''.',.P_TABLEVALUE.,'IfcReal','IfcLabel',$,$,$,$,.READWRITE.); -#969=IFCSIMPLEPROPERTYTEMPLATE('2xUp1F8RL39P_V50bwCLp_',$,'Range','The physical range of values supported by the device.',.P_BOUNDEDVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#970=IFCSIMPLEPROPERTYTEMPLATE('2pEvQXxrf86hPTtVZLpHeY',$,'Value','The expected range and default value.\X2\000A000A\X0\The expected range and default value. While the property data type is IfcReal (to support all cases including when the units are unknown), a unit may optionally be provided to indicate the measure and unit.',.P_BOUNDEDVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#971=IFCSIMPLEPROPERTYTEMPLATE('1t0msdeNn36u7GABQnNk2w',$,'ProportionalConstant','The proportional gain factor of the controller (usually referred to as Kp).',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#972=IFCSIMPLEPROPERTYTEMPLATE('13ob5MaRL0dfJItnxryM06',$,'IntegralConstant','The integral gain factor of the controller (usually referred to as Ki). Asserted where ControlType is PROPORTIONALINTEGRAL or PROPORTIONALINTEGRALDERIVATIVE.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#973=IFCSIMPLEPROPERTYTEMPLATE('0Z6FefBoXBLAvpQXmtfl0G',$,'DerivativeConstant','The derivative gain factor of the controller (usually referred to as Kd). Asserted where ControlType is PROPORTIONALINTEGRALDERIVATIVE.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#974=IFCSIMPLEPROPERTYTEMPLATE('1RXI9rsG18l8rU6ed1VKWw',$,'SignalTimeIncrease','Time factor used for exponential increase.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#975=IFCSIMPLEPROPERTYTEMPLATE('3K$4HNy9f43udS5rDHPQoS',$,'SignalTimeDecrease','Time factor used for exponential decrease.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#976=IFCPROPERTYSETTEMPLATE('1Uz4_1vFTEpxfywqrN$wqv',$,'Pset_ControllerTypeTwoPosition','Properties for signal handling for an analog controller taking disparate valued multiple inputs and creating a single valued binary output. HISTORY: In IFC4, extended properties to replace Pset_BinaryInput and Pset_BinaryOutput.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController/TWOPOSITION,IfcControllerType/TWOPOSITION',(#977,#979,#980,#981)); -#977=IFCSIMPLEPROPERTYTEMPLATE('1CnJyi4ozCzv4tqJc1Hg1j',$,'ControlType','The type controller, signal modification effected and applicable ports\X2\000A000A\X0\LOWERLIMITSWITCH: Single analog input is read and if less than Value.LowerBound then True is written to the output value.\X2\000A\X0\UPPERLIMITSWITCH: Single analog input is read and if more than Value.UpperBound then True is written to the output value.\X2\000A\X0\LOWERBANDSWITCH: Single analog input is read and if less than Value.LowerBound+BandWidth then True is written to the output value.\X2\000A\X0\UPPERBANDSWITCH: Single analog input is read and if more than Value.UpperBound-BandWidth then True is written to the output value.\X2\000A\X0\NOT: Single binary input is read and the opposite value is written to the output value.\X2\000A\X0\AND: Two binary inputs are read and if both are True then True is written to the output value.\X2\000A\X0\OR: Two binary inputs are read and if either is True then True is written to the output value.\X2\000A\X0\XOR: Two binary inputs are read and if one is true then True is written to the output value.\X2\000A\X0\CALENDAR: No inputs; the current time is compared with an IfcWorkCalendar to which the IfcController is assigned and True is written if active.\X2\000A\X0\INPUT: Controller element is a dedicated input.\X2\000A\X0\OUTPUT: Controller element is a dedicated output.\X2\000A\X0\VARIABLE: Controller element is an in-memory variable.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#978,$,$,$,.READWRITE.); -#978=IFCPROPERTYENUMERATION('PEnum_ControllerTwoPositionType',(IFCLABEL('AND'),IFCLABEL('AVERAGE'),IFCLABEL('CALENDAR'),IFCLABEL('INPUT'),IFCLABEL('LOWERBANDSWITCH'),IFCLABEL('LOWERLIMITSWITCH'),IFCLABEL('NOT'),IFCLABEL('OR'),IFCLABEL('OUTPUT'),IFCLABEL('UPPERBANDSWITCH'),IFCLABEL('UPPERLIMITSWITCH'),IFCLABEL('VARIABLE'),IFCLABEL('XOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#979=IFCSIMPLEPROPERTYTEMPLATE('0vNQsjxPb8_hCnYK1tCvKR',$,'Labels','Table mapping values to labels\X2\000A000A\X0\Labels indicate the meanings of True and False, such as ''Open'' and ''Closed''',.P_TABLEVALUE.,'IfcBoolean','IfcLabel',$,$,$,$,.READWRITE.); -#980=IFCSIMPLEPROPERTYTEMPLATE('0rdMyhwzX9tPCNczlrkBeo',$,'Polarity','True indicates normal polarity; False indicates reverse polarity.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#981=IFCSIMPLEPROPERTYTEMPLATE('3BN9vGkmH9xQhxRJEaTAlb',$,'Value','The expected range and default value.\X2\000A000A\X0\The default value such as normally-closed or normally-open.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#982=IFCPROPERTYSETTEMPLATE('0G6zrvMaz6nuPrFOuMqCBw',$,'Pset_CooledBeamPHistory','Common performance history attributes for a cooled beam.',.PSET_PERFORMANCEDRIVEN.,'IfcCooledBeam',(#983,#984,#985,#986,#987,#988,#989,#990,#991,#992,#993,#994,#995)); -#983=IFCSIMPLEPROPERTYTEMPLATE('0GEYhWTw5BePsS7w1WEjKY',$,'TotalCoolingCapacity','Total cooling capacity. This includes cooling capacity of beam and cooling capacity of supply air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#984=IFCSIMPLEPROPERTYTEMPLATE('3rHMf7Tgj4bBxllHo5TOgR',$,'TotalHeatingCapacity','Total heating capacity. This includes heating capacity of beam and heating capacity of supply air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#985=IFCSIMPLEPROPERTYTEMPLATE('2ae6kVe550bvT0Pya_6fUr',$,'BeamCoolingCapacity','Cooling capacity of beam. This excludes cooling capacity of supply air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#986=IFCSIMPLEPROPERTYTEMPLATE('1PtbEp9VX32wYVrIVD07Ho',$,'BeamHeatingCapacity','Heating capacity of beam. This excludes heating capacity of supply air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#987=IFCSIMPLEPROPERTYTEMPLATE('36tWy10h1DlAEW9_O01s9Z',$,'CoolingWaterFlowRate','Water flow rate for cooling.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#988=IFCSIMPLEPROPERTYTEMPLATE('3C1C7lkt10burntSrtP69G',$,'HeatingWaterFlowRate','Water flow rate for heating.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#989=IFCSIMPLEPROPERTYTEMPLATE('3Is15DI790Ff24MOKBlrUU',$,'CorrectionFactorForCooling','Correction factor k as a function of water flow rate (used to calculate cooling capacity).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#990=IFCSIMPLEPROPERTYTEMPLATE('1WJMkYHLz2xu8A4eiEMn86',$,'CorrectionFactorForHeating','Correction factor k as a function of water flow rate (used to calculate heating capacity).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#991=IFCSIMPLEPROPERTYTEMPLATE('39FLn3$KTD_xAkcA9QEVhS',$,'WaterPressureDropCurves','Water pressure drop as function of water flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#992=IFCSIMPLEPROPERTYTEMPLATE('1fXZXljdP1SA0Yl6h4UPM6',$,'SupplyWaterTemperatureCooling','Supply water temperature in cooling mode.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#993=IFCSIMPLEPROPERTYTEMPLATE('0djTFsJpb1RPv5Sd2tcR$f',$,'ReturnWaterTemperatureCooling','Return water temperature in cooling mode.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#994=IFCSIMPLEPROPERTYTEMPLATE('3qEYuuYrLDOvMMc_8GQiom',$,'SupplyWaterTemperatureHeating','Supply water temperature in heating mode.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#995=IFCSIMPLEPROPERTYTEMPLATE('3F6qzHJB529RQVzpTs2sym',$,'ReturnWaterTemperatureHeating','Return water temperature in heating mode.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#996=IFCPROPERTYSETTEMPLATE('3jt2Ke3N5DvePFIWKADG04',$,'Pset_CooledBeamPHistoryActive','Performance history attributes for an active cooled beam.',.PSET_PERFORMANCEDRIVEN.,'IfcCooledBeam/ACTIVE',(#997,#998,#999)); -#997=IFCSIMPLEPROPERTYTEMPLATE('0GAABRwanC9hHwxzLwhKUi',$,'AirFlowRate','Air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#998=IFCSIMPLEPROPERTYTEMPLATE('2JM5nDGZjCNwwRTyXkB99Z',$,'Throw','Distance cooled beam throws the air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#999=IFCSIMPLEPROPERTYTEMPLATE('3U54teTd50GvjbRyWA0ZHM',$,'AirPressureDropCurves','Air pressure drop as function of air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1000=IFCPROPERTYSETTEMPLATE('2t1eFgLOLBbh$OjQwRy8cI',$,'Pset_CooledBeamTypeActive','Active (ventilated) cooled beam common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCooledBeam/ACTIVE,IfcCooledBeamType/ACTIVE',(#1001,#1003,#1004,#1006)); -#1001=IFCSIMPLEPROPERTYTEMPLATE('1AiMVNat14TRkAKs_peQ3d',$,'AirFlowConfiguration','Air flow configuration type of cooled beam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1002,$,$,$,.READWRITE.); -#1002=IFCPROPERTYENUMERATION('PEnum_CooledBeamActiveAirFlowConfigurationType',(IFCLABEL('BIDIRECTIONAL'),IFCLABEL('UNIDIRECTIONALLEFT'),IFCLABEL('UNIDIRECTIONALRIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1003=IFCSIMPLEPROPERTYTEMPLATE('0tswKcJajATP$BEVP6ESIQ',$,'AirFlowRateRange','Possible range of airflow that can be delivered.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1004=IFCSIMPLEPROPERTYTEMPLATE('1GP$d8jar2XfTe5$naKUZW',$,'SupplyAirConnectionType','The manner in which the pipe connection is made to the cooled beam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1005,$,$,$,.READWRITE.); -#1005=IFCPROPERTYENUMERATION('PEnum_CooledBeamSupplyAirConnectionType',(IFCLABEL('LEFT'),IFCLABEL('RIGHT'),IFCLABEL('STRAIGHT'),IFCLABEL('TOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1006=IFCSIMPLEPROPERTYTEMPLATE('2wpYCE4J90EO_iuk3HrM26',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\Duct connection diameter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1007=IFCPROPERTYSETTEMPLATE('315DRvQOj4OB7m_ke_wUTM',$,'Pset_CooledBeamTypeCommon','Cooled beam common attributes.\X2\000A\X0\SoundLevel and SoundAttenuation attributes deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCooledBeam,IfcCooledBeamType',(#1008,#1009,#1011,#1012,#1014,#1016,#1017,#1018,#1019,#1020,#1021,#1022,#1023,#1024,#1025,#1026,#1027,#1028,#1030,#1031,#1032)); -#1008=IFCSIMPLEPROPERTYTEMPLATE('0c3eX87nP5qONqUGQIbJRQ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1009=IFCSIMPLEPROPERTYTEMPLATE('1TRV1DrT5CiAq30_MryBYD',$,'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',$,#1010,$,$,$,.READWRITE.); -#1010=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1011=IFCSIMPLEPROPERTYTEMPLATE('3bLcIVX9bB2v$mkUwu9jxS',$,'IsFreeHanging','Is it free hanging type (not mounted in a false ceiling)?',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1012=IFCSIMPLEPROPERTYTEMPLATE('2ddcqNO4D5j92Eo9z4JPeG',$,'PipeConnection','The manner in which the pipe connection is made to the cooled beam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1013,$,$,$,.READWRITE.); -#1013=IFCPROPERTYENUMERATION('PEnum_CooledBeamPipeConnection',(IFCLABEL('LEFT'),IFCLABEL('RIGHT'),IFCLABEL('STRAIGHT'),IFCLABEL('TOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1014=IFCSIMPLEPROPERTYTEMPLATE('0HOWFzBnn7qhN_S2myUQPj',$,'WaterFlowControlSystemType','Factory fitted waterflow control system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1015,$,$,$,.READWRITE.); -#1015=IFCPROPERTYENUMERATION('PEnum_CooledBeamWaterFlowControlSystemType',(IFCLABEL('2WAYVALVE'),IFCLABEL('3WAYVALVE'),IFCLABEL('NONE'),IFCLABEL('ONOFFVALVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1016=IFCSIMPLEPROPERTYTEMPLATE('2u2rT0ptn678p9x_hO5mzA',$,'WaterPressureRange','Allowable water circuit working pressure range.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1017=IFCSIMPLEPROPERTYTEMPLATE('3QIgsJW9L1kg5o4AIjSV4J',$,'NominalCoolingCapacity','Nominal cooling capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1018=IFCSIMPLEPROPERTYTEMPLATE('3Ed8Qc0l1Fp8BCXXTfOYTd',$,'NominalSurroundingTemperatureCooling','Nominal surrounding temperature (refers to nominal cooling capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1019=IFCSIMPLEPROPERTYTEMPLATE('1W0B5zXfTBQuQ4Olt0WLOj',$,'NominalSurroundingHumidityCooling','Nominal surrounding humidity (refers to nominal cooling capacity).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1020=IFCSIMPLEPROPERTYTEMPLATE('1MGRJmByrEBxTEk_4U$6c1',$,'NominalSupplyWaterTemperatureCooling','Nominal supply water temperature (refers to nominal cooling capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1021=IFCSIMPLEPROPERTYTEMPLATE('3RF5XVoE11EB88wF_fMVmQ',$,'NominalReturnWaterTemperatureCooling','Nominal return water temperature (refers to nominal cooling capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1022=IFCSIMPLEPROPERTYTEMPLATE('2uk8PEplfEiu2IgSgC0LPG',$,'NominalWaterFlowCooling','Nominal water flow (refers to nominal cooling capacity).',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1023=IFCSIMPLEPROPERTYTEMPLATE('0ophSbCez8jBvouaJlOraU',$,'NominalHeatingCapacity','Nominal heating capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1024=IFCSIMPLEPROPERTYTEMPLATE('1RCM9YrMn6phjIxZ_52dFc',$,'NominalSurroundingTemperatureHeating','Nominal surrounding temperature (refers to nominal heating capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1025=IFCSIMPLEPROPERTYTEMPLATE('250$cN8Sf7XhFyV26T245d',$,'NominalSupplyWaterTemperatureHeating','Nominal supply water temperature (refers to nominal heating capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1026=IFCSIMPLEPROPERTYTEMPLATE('1xY7crw_T0Pu7TKsXNnLgq',$,'NominalReturnWaterTemperatureHeating','Nominal return water temperature (refers to nominal heating capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1027=IFCSIMPLEPROPERTYTEMPLATE('1Mp1mY_NzCifTxPRGr9y9r',$,'NominalWaterFlowHeating','Nominal water flow (refers to nominal heating capacity).',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1028=IFCSIMPLEPROPERTYTEMPLATE('1scrh3OZz7Sg3EyjAARmY6',$,'IntegratedLightingType','Integrated lighting in cooled beam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1029,$,$,$,.READWRITE.); -#1029=IFCPROPERTYENUMERATION('PEnum_CooledBeamIntegratedLightingType',(IFCLABEL('DIRECT'),IFCLABEL('DIRECTANDINDIRECT'),IFCLABEL('INDIRECT'),IFCLABEL('NONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1030=IFCSIMPLEPROPERTYTEMPLATE('2cBZphpen5mh4Nxnm$hV20',$,'FinishColour','The finish colour of the object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1031=IFCSIMPLEPROPERTYTEMPLATE('3wUEzxvDnAMe5TDhEWn02r',$,'CoilLength','Length of coil.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1032=IFCSIMPLEPROPERTYTEMPLATE('3ftFFk_LPDefCJvQ6O5hv9',$,'CoilWidth','Width of coil.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1033=IFCPROPERTYSETTEMPLATE('0QBq$oFaL7FuV$f$GkkTg9',$,'Pset_CoolingTowerPHistory','Cooling tower performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcCoolingTower',(#1034,#1035,#1036,#1037,#1038)); -#1034=IFCSIMPLEPROPERTYTEMPLATE('0DrpcdbuT6av0hz_C7JdG_',$,'Capacity','The capacity of the element.\X2\000A000A\X0\Heat transfer rate of the cooling tower between air stream and water stream.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1035=IFCSIMPLEPROPERTYTEMPLATE('0wJiToxQPDw9Av5fn$Uf7S',$,'HeatTransferCoefficient','Heat transfer coefficient-area product.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1036=IFCSIMPLEPROPERTYTEMPLATE('1IYRQwf791DucDiEJpWhS$',$,'SumpHeaterPower','Electrical heat power of sump heater.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1037=IFCSIMPLEPROPERTYTEMPLATE('0uV3sByAv6Vv1t6CatxJsn',$,'UACurve','UA value.\X2\000A000A\X0\As a function of fan speed at certain water flow rate, UA = f ( fan speed).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1038=IFCSIMPLEPROPERTYTEMPLATE('2aHng$Nmj8m9OY0T8EhvXv',$,'Performance','Water temperature change as a function of wet-bulb temperature, water entering temperature, water flow rate, air flow rate, Tdiff = f ( Twet-bulb, Twater,in, mwater, mair).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1039=IFCPROPERTYSETTEMPLATE('0y9_7bRRf7SB11bwoWbRwL',$,'Pset_CoolingTowerTypeCommon','Cooling tower type common attributes.\X2\000A\X0\WaterRequirement attribute unit type modified in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCoolingTower,IfcCoolingTowerType',(#1040,#1041,#1043,#1044,#1046,#1048,#1050,#1052,#1054,#1055,#1056,#1057,#1058,#1059,#1060)); -#1040=IFCSIMPLEPROPERTYTEMPLATE('0xFeuqp0n7WBL$A8Q47xwo',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1041=IFCSIMPLEPROPERTYTEMPLATE('2jJ1PRaDbEuPej7$4aiic1',$,'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',$,#1042,$,$,$,.READWRITE.); -#1042=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1043=IFCSIMPLEPROPERTYTEMPLATE('2Q1otxWlXDVhwF4J7ur2tA',$,'NominalCapacity','The total nominal or volumetric capacity of the object.\X2\000A000A\X0\Nominal cooling tower capacity in terms of heat transfer rate of the cooling tower between air stream and water stream at nominal conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1044=IFCSIMPLEPROPERTYTEMPLATE('0mRooSa2jAUednFziv5elb',$,'CircuitType','OpenCircuit: Exposes water directly to the cooling atmosphere.\X2\000A\X0\CloseCircuit: The fluid is separated from the atmosphere by a heat exchanger.\X2\000A\X0\Wet: The air stream or the heat exchange surface is evaporatively cooled.\X2\000A\X0\Dry: No evaporation into the air stream.\X2\000A\X0\DryWet: A combination of a dry tower and a wet tower.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1045,$,$,$,.READWRITE.); -#1045=IFCPROPERTYENUMERATION('PEnum_CoolingTowerCircuitType',(IFCLABEL('CLOSEDCIRCUITDRY'),IFCLABEL('CLOSEDCIRCUITDRYWET'),IFCLABEL('CLOSEDCIRCUITWET'),IFCLABEL('OPENCIRCUIT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1046=IFCSIMPLEPROPERTYTEMPLATE('3ga_uOupr69PTZoYafN6Up',$,'FlowArrangement','Defines the basic flow arrangements for the heat exchanger or cooler tower:COUNTERFLOW: Air and water flow enter in different directions.\X2\000A\X0\CROSSFLOW: Air and water flow are perpendicular.\X2\000A\X0\PARALLELFLOW: Air and water flow enter in same directions.\X2\000A\X0\MULTIPASS: Multipass flow heat exchanger arrangement. \X2\000A\X0\OTHER: Other type of heat exchanger flow arrangement not defined above.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1047,$,$,$,.READWRITE.); -#1047=IFCPROPERTYENUMERATION('PEnum_CoolingTowerFlowArrangement',(IFCLABEL('COUNTERFLOW'),IFCLABEL('CROSSFLOW'),IFCLABEL('PARALLELFLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1048=IFCSIMPLEPROPERTYTEMPLATE('1R8$Rs$oL9kws_NGuXr1xg',$,'SprayType','SprayFilled: Water is sprayed into airflow.\X2\000A\X0\SplashTypeFill: water cascades over successive rows of splash bars.\X2\000A\X0\FilmTypeFill: water flows in a thin layer over closely spaced sheets.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1049,$,$,$,.READWRITE.); -#1049=IFCPROPERTYENUMERATION('PEnum_CoolingTowerSprayType',(IFCLABEL('FILMTYPEFILL'),IFCLABEL('SPLASHTYPEFILL'),IFCLABEL('SPRAYFILLED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1050=IFCSIMPLEPROPERTYTEMPLATE('1qBQA2jvPCNvK8a7qiadBJ',$,'CapacityControl','FanCycling: Fan is cycled on and off to control duty.\X2\000A\X0\TwoSpeedFan: Fan is switched between low and high speed to control duty.\X2\000A\X0\VariableSpeedFan: Fan speed is varied to control duty.\X2\000A\X0\DampersControl: Dampers modulate the air flow to control duty.\X2\000A\X0\BypassValveControl: Bypass valve modulates the water flow to control duty.\X2\000A\X0\MultipleSeriesPumps: Turn on/off multiple series pump to control duty.\X2\000A\X0\TwoSpeedPump: Switch between high/low pump speed to control duty.\X2\000A\X0\VariableSpeedPump: vary pump speed to control duty.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1051,$,$,$,.READWRITE.); -#1051=IFCPROPERTYENUMERATION('PEnum_CoolingTowerCapacityControl',(IFCLABEL('BYPASSVALVECONTROL'),IFCLABEL('DAMPERSCONTROL'),IFCLABEL('FANCYCLING'),IFCLABEL('MULTIPLESERIESPUMPS'),IFCLABEL('TWOSPEEDFAN'),IFCLABEL('TWOSPEEDPUMP'),IFCLABEL('VARIABLESPEEDFAN'),IFCLABEL('VARIABLESPEEDPUMP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1052=IFCSIMPLEPROPERTYTEMPLATE('1N2CGQ_6186elEpdfGoh5z',$,'ControlStrategy','FixedExitingWaterTemp: The capacity is controlled to maintain a fixed exiting water temperature.\X2\000A\X0\WetBulbTempReset: The set-point is reset based on the wet-bulb temperature.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1053,$,$,$,.READWRITE.); -#1053=IFCPROPERTYENUMERATION('PEnum_CoolingTowerControlStrategy',(IFCLABEL('FIXEDEXITINGWATERTEMP'),IFCLABEL('WETBULBTEMPRESET'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1054=IFCSIMPLEPROPERTYTEMPLATE('20saNk2JTFBuKAg$71AVwD',$,'NumberOfCells','Number of cells in one cooling tower unit.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1055=IFCSIMPLEPROPERTYTEMPLATE('1CIX1E6LT2_xyUnSIp8DYD',$,'BasinReserveVolume','Volume between operating and overflow levels in cooling tower basin.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#1056=IFCSIMPLEPROPERTYTEMPLATE('3c_qUdQGD2tx1l$wGhMtUD',$,'LiftElevationDifference','Elevation difference between cooling tower sump and the top of the tower.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1057=IFCSIMPLEPROPERTYTEMPLATE('1fQmrIoIvEU9tBxjGwYwNn',$,'WaterRequirement','Make-up water requirement.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1058=IFCSIMPLEPROPERTYTEMPLATE('1ZVvMDpWb8YBfoA4dVyw0M',$,'OperationTemperatureRange','Allowable operation ambient air temperature range.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1059=IFCSIMPLEPROPERTYTEMPLATE('0z6w1a3S5Fc8ZIbJXI7eHF',$,'AmbientDesignDryBulbTemperature','Ambient design dry bulb temperature used for selecting the cooling tower.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1060=IFCSIMPLEPROPERTYTEMPLATE('3Wj8uXVWD7cxgJC0djpwqa',$,'AmbientDesignWetBulbTemperature','Ambient design wet bulb temperature used for selecting the cooling tower.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1061=IFCPROPERTYSETTEMPLATE('3EivV3SoP6VgXcr5Gz4WYB',$,'Pset_CourseApplicationConditions','Properties regarding the conditions when applying a course.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCourse,IfcCourseType',(#1062,#1063)); -#1062=IFCSIMPLEPROPERTYTEMPLATE('01O61Gn9T9rQLjCKEBuOVL',$,'ApplicationTemperature','Indicates the ambient temperature at which the course is applied',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1063=IFCSIMPLEPROPERTYTEMPLATE('0nvnGaHKDDhOlXG7NeBxkZ',$,'WeatherConditions','Indicates the weather conditions during the application of the course',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1064=IFCPROPERTYSETTEMPLATE('03FzAxkXbAgwPTWWyTuBF5',$,'Pset_CourseCommon','Common properties for courses.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCourse,IfcCourseType',(#1065,#1066,#1067)); -#1065=IFCSIMPLEPROPERTYTEMPLATE('1jBGLVSWj4sQpxyqnY6Fs1',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#1066=IFCSIMPLEPROPERTYTEMPLATE('1OT7MUOxzCt9nBQJCW_RXB',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#1067=IFCSIMPLEPROPERTYTEMPLATE('39$t6moV18ohrtnD9YizSU',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#1068=IFCPROPERTYSETTEMPLATE('20wRms9DH0XPrJUILL2ypk',$,'Pset_CoveringCommon','Properties common to the definition of all occurrence and type objects of covering',.PSET_TYPEDRIVENOVERRIDE.,'IfcCovering,IfcCoveringType',(#1069,#1070,#1072,#1073,#1074,#1075,#1076,#1077,#1078,#1079,#1080)); -#1069=IFCSIMPLEPROPERTYTEMPLATE('0VURV6RhT9TR46X3PLufC8',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1070=IFCSIMPLEPROPERTYTEMPLATE('3_mjNls2v0DOqGSJQFgiwD',$,'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',$,#1071,$,$,$,.READWRITE.); -#1071=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1072=IFCSIMPLEPROPERTYTEMPLATE('1622y1KwL2Ju1bElZBx6td',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1073=IFCSIMPLEPROPERTYTEMPLATE('265B30RZn3ugomQz5UL30J',$,'FlammabilityRating','Flammability Rating for this object.\X2\000A\X0\It is given according to the national building code that governs the rating of flammability for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1074=IFCSIMPLEPROPERTYTEMPLATE('0AZYzY2VD7WhxH2mFnAjPv',$,'FragilityRating','Indication on the fragility of the covering (e.g., under fire conditions). It is given according to the national building code that might provide a classification for fragility.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1075=IFCSIMPLEPROPERTYTEMPLATE('2LzWXBKCz82vUnXPLhF$IP',$,'Combustible','Indication whether the object is made from combustible material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1076=IFCSIMPLEPROPERTYTEMPLATE('3KKUZ7IAX5Lv93pI5LJFWd',$,'SurfaceSpreadOfFlame','Indication on how the flames spread around the surface,\X2\000A\X0\It is given according to the national building code that governs the fire behaviour for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1077=IFCSIMPLEPROPERTYTEMPLATE('0n5OECVfH5TuilgMuSW3X4',$,'Finish','Description of the (surface) finish of the object for informational purposes.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1078=IFCSIMPLEPROPERTYTEMPLATE('2hITFIYHP5xgL21_pXjMNE',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1079=IFCSIMPLEPROPERTYTEMPLATE('3LrBWnCrD3T9u5IvUCUmy$',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#1080=IFCSIMPLEPROPERTYTEMPLATE('03yaDj8CP6ZO2VZc_ef9pP',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1081=IFCPROPERTYSETTEMPLATE('1Jghzr2zT2OxbVcvT9CRO6',$,'Pset_CoveringFlooring','Properties common to the definition of all occurrence and type objects of covering with the predefined type set to FLOORING.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCovering/FLOORING,IfcCoveringType/FLOORING',(#1082,#1083)); -#1082=IFCSIMPLEPROPERTYTEMPLATE('3HeXQZNXn11QJmtX1WuCcV',$,'HasNonSkidSurface','Indication whether the surface finish is designed to prevent slippery (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1083=IFCSIMPLEPROPERTYTEMPLATE('3$AfMkW_93Fwl31dX4$Pz2',$,'HasAntiStaticSurface','Indication whether the surface finish is designed to prevent electrostatic charge (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1084=IFCPROPERTYSETTEMPLATE('3OZCH947r4IRLpNChxZdB_',$,'Pset_CoveringTypeMembrane','Property set for overing Type Membrane.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCovering/MEMBRANE,IfcCoveringType/MEMBRANE',(#1085,#1086)); -#1085=IFCSIMPLEPROPERTYTEMPLATE('3GvEvEtHrBROnnwoc0Z2KC',$,'NominalInstallationDepth','Nominal installation depth underground.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1086=IFCSIMPLEPROPERTYTEMPLATE('2VnNE3y8rA3vvxVt6FHKda',$,'NominalTransverseInclination','Required nominal angle of transverse slope.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#1087=IFCPROPERTYSETTEMPLATE('36eOYUajLE9QC2m7tYJAM9',$,'Pset_CurrentInstrumentTransformer','Instrument transformers are high accuracy class electrical devices used to isolate or transform voltage or current levels. The main function of instrument transformers is to operate instruments or metering from high voltage or high current circuits, safely isolating secondary control circuitry from the high voltages or currents. Combination instrument transformers are metering current.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument/AMMETER,IfcFlowInstrument/COMBINED,IfcFlowInstrumentType/AMMETER,IfcFlowInstrumentType/COMBINED',(#1088,#1089,#1090,#1091,#1092,#1093,#1094,#1095,#1096,#1097)); -#1088=IFCSIMPLEPROPERTYTEMPLATE('0fRmbSoIP3$e8j4rNj4cWa',$,'AccuracyClass','A designation assigned to an instrument transformer the current (or voltage) error and phase displacement of which remain within specified limits under prescribed conditions of use (IEC 321-01-24).',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#1089=IFCSIMPLEPROPERTYTEMPLATE('1cYNDnM2D0cfcA1tTGpB4u',$,'AccuracyGrade','The grade of accuracy.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1090=IFCSIMPLEPROPERTYTEMPLATE('15vpGe6NH3rQ115c1fCebM',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1091=IFCSIMPLEPROPERTYTEMPLATE('1dzgotu7HDUel_lOcdW8gJ',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1092=IFCSIMPLEPROPERTYTEMPLATE('3qgdJkNyL6yhov41GrkT7W',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1093=IFCSIMPLEPROPERTYTEMPLATE('3EOwEZL9T7WhrEOcnRwrWc',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1094=IFCSIMPLEPROPERTYTEMPLATE('21fCkgXkv9QBXXLWi$Rxqz',$,'PrimaryFrequency','The frequency that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#1095=IFCSIMPLEPROPERTYTEMPLATE('2mxMeIAAP6ixoBu5aXmCFc',$,'PrimaryCurrent','The current that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1096=IFCSIMPLEPROPERTYTEMPLATE('1FmHIWcpv0Mepe1iSlmXjM',$,'SecondaryFrequency','The frequency that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#1097=IFCSIMPLEPROPERTYTEMPLATE('1s0zEyvEzDsQZ4P7RG4DXX',$,'SecondaryCurrent','The current that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1098=IFCPROPERTYSETTEMPLATE('3lioZ5GiDEVPgq7HcHEaWp',$,'Pset_CurtainWallCommon','Properties common to the definition of all occurrences of IfcCurtainWall.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCurtainWall,IfcCurtainWallType',(#1099,#1100,#1102,#1103,#1104,#1105,#1106,#1107)); -#1099=IFCSIMPLEPROPERTYTEMPLATE('1hG3DeF21CreothIY5kGt9',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1100=IFCSIMPLEPROPERTYTEMPLATE('0CpGab17XF6uscdgs4czte',$,'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',$,#1101,$,$,$,.READWRITE.); -#1101=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1102=IFCSIMPLEPROPERTYTEMPLATE('0LK2fB6dz7jw8p4xtbg_P0',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1103=IFCSIMPLEPROPERTYTEMPLATE('25R0AxsOb97OWNvBR0$fj9',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1104=IFCSIMPLEPROPERTYTEMPLATE('2PblTYmQv8m9xXFAV8FHV$',$,'Combustible','Indication whether the object is made from combustible material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1105=IFCSIMPLEPROPERTYTEMPLATE('3X8Rztrlr0yPQBDc48SeNe',$,'SurfaceSpreadOfFlame','Indication on how the flames spread around the surface,\X2\000A\X0\It is given according to the national building code that governs the fire behaviour for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1106=IFCSIMPLEPROPERTYTEMPLATE('0mOcusBv167vWOkENUN9rv',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#1107=IFCSIMPLEPROPERTYTEMPLATE('0phiCkW9z4tBc0MLPXs8m7',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1108=IFCPROPERTYSETTEMPLATE('2jMYGmhTP5dACuUpAVikEg',$,'Pset_DamperOccurrence','Damper occurrence attributes attached to an instance of IfcDamper',.PSET_OCCURRENCEDRIVEN.,'IfcDamper',(#1109)); -#1109=IFCSIMPLEPROPERTYTEMPLATE('39B1k8fzT0WwU14MDj6Opk',$,'SizingMethod','Identifies whether the damper is sized nominally or with exact measurements:NOMINAL: Nominal sizing method.\X2\000A\X0\EXACT: Exact sizing method.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1110,$,$,$,.READWRITE.); -#1110=IFCPROPERTYENUMERATION('PEnum_DamperSizingMethod',(IFCLABEL('EXACT'),IFCLABEL('NOMINAL'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1111=IFCPROPERTYSETTEMPLATE('2Ged6rPZLEzxWWnRUrfQXc',$,'Pset_DamperPHistory','Damper performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcDamper',(#1112,#1113,#1114,#1115,#1116,#1117)); -#1112=IFCSIMPLEPROPERTYTEMPLATE('3R$A2E4_5E1fm6jhAyljm0',$,'AirFlowRate','Air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1113=IFCSIMPLEPROPERTYTEMPLATE('2D2avGFVz8_vBoQcJ0pPbf',$,'Leakage','Air leakage rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1114=IFCSIMPLEPROPERTYTEMPLATE('0DYSv9WQvFpvdSVYJhwn26',$,'PressureDrop','Pressure drop.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1115=IFCSIMPLEPROPERTYTEMPLATE('3WrymTugP84AoU58pndN1v',$,'BladePositionAngle','Blade position angle; angle between the blade and flow direction ( 0 - 90).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1116=IFCSIMPLEPROPERTYTEMPLATE('073pjxJ3X4DvNdua4LQs_6',$,'DamperPosition','Control damper position, ranging from 0 to 1; damper position (0=closed=90deg position angle, 1=open=0deg position angle).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1117=IFCSIMPLEPROPERTYTEMPLATE('1mpYYeRtn2Ve0V1jkUIeSJ',$,'PressureLossCoefficient','Pressure loss coefficient.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1118=IFCPROPERTYSETTEMPLATE('2C4NtWAL1FOhbq5R9WcbaE',$,'Pset_DamperTypeCommon','Damper type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamper,IfcDamperType',(#1119,#1120,#1122,#1124,#1126,#1127,#1129,#1131,#1133,#1134,#1135,#1136,#1137,#1138,#1139,#1140,#1141,#1142,#1143,#1144,#1145,#1146,#1147,#1148)); -#1119=IFCSIMPLEPROPERTYTEMPLATE('1H0p3a$tHESu6ws1S7lnsE',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1120=IFCSIMPLEPROPERTYTEMPLATE('397D7GA6P3PBjgd8Q_WSF4',$,'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',$,#1121,$,$,$,.READWRITE.); -#1121=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1122=IFCSIMPLEPROPERTYTEMPLATE('2IYn1Ifd90MxOkyTz5Ir9e',$,'Operation','The operational mechanism for the damper operation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1123,$,$,$,.READWRITE.); -#1123=IFCPROPERTYENUMERATION('PEnum_DamperOperation',(IFCLABEL('AUTOMATIC'),IFCLABEL('MANUAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1124=IFCSIMPLEPROPERTYTEMPLATE('11H6SjMwf5ru_h34TWAVIQ',$,'Orientation','The intended orientation for the damper as specified by the manufacturer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1125,$,$,$,.READWRITE.); -#1125=IFCPROPERTYENUMERATION('PEnum_DamperOrientation',(IFCLABEL('HORIZONTAL'),IFCLABEL('VERTICAL'),IFCLABEL('VERTICALORHORIZONTAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1126=IFCSIMPLEPROPERTYTEMPLATE('3DYNkYG_T2xu0U0Nj6BnzS',$,'BladeThickness','The thickness of the damper blade.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1127=IFCSIMPLEPROPERTYTEMPLATE('3pNNkGN1vFbOQvXW_vEOTI',$,'BladeAction','Blade action.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1128,$,$,$,.READWRITE.); -#1128=IFCPROPERTYENUMERATION('PEnum_DamperBladeAction',(IFCLABEL('FOLDINGCURTAIN'),IFCLABEL('OPPOSED'),IFCLABEL('PARALLEL'),IFCLABEL('SINGLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1129=IFCSIMPLEPROPERTYTEMPLATE('0AMIoStHLE_gbYt$25bCVQ',$,'BladeShape','Blade shape. Flat means triple V-groove.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1130,$,$,$,.READWRITE.); -#1130=IFCPROPERTYENUMERATION('PEnum_DamperBladeShape',(IFCLABEL('EXTRUDEDAIRFOIL'),IFCLABEL('FABRICATEDAIRFOIL'),IFCLABEL('FLAT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1131=IFCSIMPLEPROPERTYTEMPLATE('0AaynzzObDCAvVTdlyECWF',$,'BladeEdge','Blade edge.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1132,$,$,$,.READWRITE.); -#1132=IFCPROPERTYENUMERATION('PEnum_DamperBladeEdge',(IFCLABEL('CRIMPED'),IFCLABEL('UNCRIMPED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1133=IFCSIMPLEPROPERTYTEMPLATE('3FU6zajSXDRAffkpuy7DuY',$,'NumberofBlades','Number of blades.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#1134=IFCSIMPLEPROPERTYTEMPLATE('1AMXx8NaT789D7W0bcZeFJ',$,'FaceArea','Face area open to the airstream.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1135=IFCSIMPLEPROPERTYTEMPLATE('0tJY9tZ5j9A8ezVj4t2kWl',$,'MaximumAirFlowRate','Maximum allowable air flow rate.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1136=IFCSIMPLEPROPERTYTEMPLATE('1m5L1cerHC5QBK_sgjRufk',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1137=IFCSIMPLEPROPERTYTEMPLATE('2ujLieSvzFRukoPFGv9Ygz',$,'MaximumWorkingPressure','Maximum pressure that the object is manufactured to withstand.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1138=IFCSIMPLEPROPERTYTEMPLATE('30KYhNHZ56CuntelR4mRm9',$,'TemperatureRating','Temperature rating.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1139=IFCSIMPLEPROPERTYTEMPLATE('1r4ItZRXPFQwO2TwS3T2rI',$,'NominalAirFlowRate','Nominal air flow rate.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1140=IFCSIMPLEPROPERTYTEMPLATE('2PV69aKc944R2YVbiVBr6s',$,'OpenPressureDrop','Total pressure drop across damper.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1141=IFCSIMPLEPROPERTYTEMPLATE('2OCeMoJBHC9eswUh5djcDe',$,'LeakageFullyClosed','Leakage when fully closed.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1142=IFCSIMPLEPROPERTYTEMPLATE('3Homaf2qPAuQi$rME9XQ5M',$,'LossCoefficentCurve','Loss coefficient \X2\2013\X0\ blade position angle curve; ratio of pressure drop to velocity pressure versus blade angle; C = f (blade angle position).',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcReal',$,$,$,$,.READWRITE.); -#1143=IFCSIMPLEPROPERTYTEMPLATE('08QqhW8FTEYOftz9A_xmwC',$,'LeakageCurve','Leakage versus pressure drop; Leakage = f (pressure).',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#1144=IFCSIMPLEPROPERTYTEMPLATE('0ggpz4gAX1rgv49JjeAzya',$,'RegeneratedSoundCurve','Regenerated sound versus air flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcSoundPressureMeasure',$,$,$,$,.READWRITE.); -#1145=IFCSIMPLEPROPERTYTEMPLATE('3F3i9xDVHChBzTeSDye7$O',$,'FrameType','The type of frame used by the damper (e.g., Standard, Single Flange, Single Reversed Flange, Double Flange, etc.).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1146=IFCSIMPLEPROPERTYTEMPLATE('2qxnIF_Qr8zgqCrcBNjuQ0',$,'FrameDepth','The length (or depth) of the damper frame.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1147=IFCSIMPLEPROPERTYTEMPLATE('2CYYPFkXnFsg$7cpYNQkac',$,'FrameThickness','The thickness of the damper frame material.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1148=IFCSIMPLEPROPERTYTEMPLATE('2WgCNEXK94DPb3z5l_PxDu',$,'CloseOffRating','Close off rating.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1149=IFCPROPERTYSETTEMPLATE('2ITWbSBkT1SOZACvd_BNr7',$,'Pset_DamperTypeControlDamper','Control damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeControl to Pset_DamperTypeControlDamper in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamper/CONTROLDAMPER,IfcDamperType/CONTROLDAMPER',(#1150,#1151)); -#1150=IFCSIMPLEPROPERTYTEMPLATE('3WUvF8bQz21up0Ecbx$uZe',$,'TorqueRange','Torque range: minimum operational torque to maximum allowable torque.',.P_BOUNDEDVALUE.,'IfcTorqueMeasure',$,$,$,$,$,.READWRITE.); -#1151=IFCSIMPLEPROPERTYTEMPLATE('3bQ4TxSFb9oR26AU7Lh29z',$,'ControlDamperOperation','The inherent characteristic of the control damper operation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1152,$,$,$,.READWRITE.); -#1152=IFCPROPERTYENUMERATION('PEnum_ControlDamperOperation',(IFCLABEL('EXPONENTIAL'),IFCLABEL('LINEAR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1153=IFCPROPERTYSETTEMPLATE('137pwHBRj5Rfd3dK4NTA3T',$,'Pset_DamperTypeFireDamper','Fire damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeFire to Pset_DamperTypeFireDamper in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamper/FIREDAMPER,IfcDamperType/FIREDAMPER',(#1154,#1156,#1158,#1159)); -#1154=IFCSIMPLEPROPERTYTEMPLATE('2BGv2rfTTCGx0Z83GuokOf',$,'ActuationType','Enumeration that identifies the different types of dampers.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1155,$,$,$,.READWRITE.); -#1155=IFCPROPERTYENUMERATION('PEnum_FireDamperActuationType',(IFCLABEL('GRAVITY'),IFCLABEL('SPRING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1156=IFCSIMPLEPROPERTYTEMPLATE('0TtB6RaDr8LRUhCukGOj2A',$,'ClosureRatingEnum','Enumeration that identifies the closure rating for the damper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1157,$,$,$,.READWRITE.); -#1157=IFCPROPERTYENUMERATION('PEnum_FireDamperClosureRating',(IFCLABEL('DYNAMIC'),IFCLABEL('STATIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1158=IFCSIMPLEPROPERTYTEMPLATE('2NvpnigTb5ZAlsuXDq6z3v',$,'FireResistanceRating','Measure of the fire resistance rating in hours (e.g., 1.5 hours, 2 hours, etc.).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1159=IFCSIMPLEPROPERTYTEMPLATE('0yfi6UMBP1cwF0F1oQav2B',$,'FusibleLinkTemperature','The temperature that the fusible link melts.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1160=IFCPROPERTYSETTEMPLATE('3K8VGux_v23AhfE3kHPHqR',$,'Pset_DamperTypeFireSmokeDamper','Combination Fire and Smoke damper type attributes.\X2\000A\X0\New Pset in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamper/FIRESMOKEDAMPER,IfcDamperType/FIRESMOKEDAMPER',(#1161,#1162,#1164,#1166,#1167)); -#1161=IFCSIMPLEPROPERTYTEMPLATE('27e8VgvQb34P9qEOTJdb6P',$,'DamperControlType','The type of control used to operate the damper (e.g., Open/Closed Indicator, Resettable Temperature Sensor, Temperature Override, etc.).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1162=IFCSIMPLEPROPERTYTEMPLATE('2HgMZXt1z7E9QIEdz7BAvi',$,'ActuationType','Enumeration that identifies the different types of dampers.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1163,$,$,$,.READWRITE.); -#1163=IFCPROPERTYENUMERATION('PEnum_FireDamperActuationType',(IFCLABEL('GRAVITY'),IFCLABEL('SPRING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1164=IFCSIMPLEPROPERTYTEMPLATE('1MuNPWG8nCEgGBqZELtksk',$,'ClosureRatingEnum','Enumeration that identifies the closure rating for the damper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1165,$,$,$,.READWRITE.); -#1165=IFCPROPERTYENUMERATION('PEnum_FireDamperClosureRating',(IFCLABEL('DYNAMIC'),IFCLABEL('STATIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1166=IFCSIMPLEPROPERTYTEMPLATE('3gy5OaMabDSgUqlNvIWhDI',$,'FireResistanceRating','Measure of the fire resistance rating in hours (e.g., 1.5 hours, 2 hours, etc.).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1167=IFCSIMPLEPROPERTYTEMPLATE('2t_NuRowX8Uhl8F7SF2DTg',$,'FusibleLinkTemperature','The temperature that the fusible link melts.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1168=IFCPROPERTYSETTEMPLATE('2QJGMgiZP9ru9w8ku_pHT8',$,'Pset_DamperTypeSmokeDamper','Smoke damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeSmoke to Pset_DamperTypeSmokeDamper in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamper/SMOKEDAMPER,IfcDamperType/SMOKEDAMPER',(#1169)); -#1169=IFCSIMPLEPROPERTYTEMPLATE('18P4E1JBTBkgoJkcpfLXLm',$,'ControlType','The type controller, signal modification effected and applicable ports',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1170=IFCPROPERTYSETTEMPLATE('2knW0fqL1CXwuB8jMcOYec',$,'Pset_DataTransmissionUnit','Properties common to a data transmission unit. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type MODEM.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/MODEM,IfcCommunicationsApplianceType/MODEM',(#1171,#1172,#1174)); -#1171=IFCSIMPLEPROPERTYTEMPLATE('0xyGOOsaj5aP_8rYVFrLyW',$,'WorkingState','Indicates the working state of device or system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1172=IFCSIMPLEPROPERTYTEMPLATE('1jt8Hlx$5AvffXKDfYb9HA',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1173,$,$,$,.READWRITE.); -#1173=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1174=IFCSIMPLEPROPERTYTEMPLATE('1IB6W4WFH4g9xdvOI58WwM',$,'DataTransmissionUnitUsage','Indicates the usage of the data transmission unit. It can be used to transmit data for different types of sensors.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1175,$,$,$,.READWRITE.); -#1175=IFCPROPERTYENUMERATION('PEnum_DataTransmissionUnitUsage',(IFCLABEL('EARTHQUAKE'),IFCLABEL('FOREIGNOBJECT'),IFCLABEL('WINDANDRAIN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1176=IFCPROPERTYSETTEMPLATE('2Pu7jjtVjAaxn3TUryxWLI',$,'Pset_DiscreteAccessoryColumnShoe','Shape properties common to column shoes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/SHOE,IfcDiscreteAccessoryType/SHOE',(#1177,#1178,#1179,#1180,#1181,#1182)); -#1177=IFCSIMPLEPROPERTYTEMPLATE('1FoWK2nLv7_hSWFAmEFGRp',$,'ColumnShoeBasePlateThickness','The thickness of the column shoe base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1178=IFCSIMPLEPROPERTYTEMPLATE('3rDhL7$VL4e8YJBew2z28G',$,'ColumnShoeBasePlateWidth','The width of the column shoe base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1179=IFCSIMPLEPROPERTYTEMPLATE('2W9A5asnD8wBFi$Jl9yKIJ',$,'ColumnShoeBasePlateDepth','The depth of the column shoe base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1180=IFCSIMPLEPROPERTYTEMPLATE('1qAkmEumr02AMwlDu5eMPb',$,'ColumnShoeCasingHeight','The height of the column shoe casing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1181=IFCSIMPLEPROPERTYTEMPLATE('00ovUUgdnFTv2ELJfjGEc$',$,'ColumnShoeCasingWidth','The width of the column shoe casing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1182=IFCSIMPLEPROPERTYTEMPLATE('3sX3tWxN5CDBgHLmZB5Yjm',$,'ColumnShoeCasingDepth','The depth of the column shoe casing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1183=IFCPROPERTYSETTEMPLATE('06fQVMIgH03Rlh7xykPrTQ',$,'Pset_DiscreteAccessoryCornerFixingPlate','Properties specific to corner fixing plates.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1184,#1185,#1186,#1187)); -#1184=IFCSIMPLEPROPERTYTEMPLATE('0nkJ9b50v4V90rpGPzHN3j',$,'CornerFixingPlateLength','The length of the L-shaped corner plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1185=IFCSIMPLEPROPERTYTEMPLATE('1scm2d_nn5cP7iFmg5oXe$',$,'CornerFixingPlateThickness','The thickness of the L-shaped corner plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1186=IFCSIMPLEPROPERTYTEMPLATE('389FDiDdPB1wdziUDTScxw',$,'CornerFixingPlateFlangeWidthInPlaneZ','The flange width of the L-shaped corner plate in plane Z.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1187=IFCSIMPLEPROPERTYTEMPLATE('3YrflYi497kxF7ESbzgwCe',$,'CornerFixingPlateFlangeWidthInPlaneX','The flange width of the L-shaped corner plate in plane X.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1188=IFCPROPERTYSETTEMPLATE('1mD_IkW2H66g4RJYNHQuIt',$,'Pset_DiscreteAccessoryDiagonalTrussConnector','Shape properties specific to connecting accessories in truss form with diagonal cross-bars.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1189,#1190,#1191,#1192,#1193,#1194)); -#1189=IFCSIMPLEPROPERTYTEMPLATE('1o8cGxi0bC3PnuuOpCRKJg',$,'DiagonalTrussHeight','The overall height of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1190=IFCSIMPLEPROPERTYTEMPLATE('3CUGTzjQ938R_ofXDESm_J',$,'DiagonalTrussLength','The overall length of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1191=IFCSIMPLEPROPERTYTEMPLATE('0aW_h4Obf6lReOrf0bsao1',$,'DiagonalTrussCrossBarSpacing','The spacing between diagonal cross-bar sections.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1192=IFCSIMPLEPROPERTYTEMPLATE('0iXZteVb16_Q9dYtDnMJgJ',$,'DiagonalTrussBaseBarDiameter','The nominal diameter of the base bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1193=IFCSIMPLEPROPERTYTEMPLATE('15r14GZar9kxdQfzGtOGfc',$,'DiagonalTrussSecondaryBarDiameter','The nominal diameter of the secondary bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1194=IFCSIMPLEPROPERTYTEMPLATE('3znKVZtr55$QuziHCpMEGR',$,'DiagonalTrussCrossBarDiameter','The nominal diameter of the diagonal cross-bars.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1195=IFCPROPERTYSETTEMPLATE('1h8SSCQKv6T98bxmPqL$Am',$,'Pset_DiscreteAccessoryEdgeFixingPlate','Properties specific to edge fixing plates.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1196,#1197,#1198,#1199)); -#1196=IFCSIMPLEPROPERTYTEMPLATE('1VamEd8j9Fx9Jnwq1ooxWQ',$,'EdgeFixingPlateLength','The length of the L-shaped edge plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1197=IFCSIMPLEPROPERTYTEMPLATE('0K4A3QLmL8kA65Qa9pUDTq',$,'EdgeFixingPlateThickness','The thickness of the L-shaped edge plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1198=IFCSIMPLEPROPERTYTEMPLATE('13J57OpBH7PAhifpiKQqJk',$,'EdgeFixingPlateFlangeWidthInPlaneZ','The flange width of the L-shaped edge plate in plane Z.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1199=IFCSIMPLEPROPERTYTEMPLATE('1xWsicWZn6GvoS1yxXUmSd',$,'EdgeFixingPlateFlangeWidthInPlaneX','The flange width of the L-shaped edge plate in plane X.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1200=IFCPROPERTYSETTEMPLATE('03f4XIDEn41uoxbAW9Yrsc',$,'Pset_DiscreteAccessoryFixingSocket','Properties common to fixing sockets.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1201,#1202,#1203,#1204)); -#1201=IFCSIMPLEPROPERTYTEMPLATE('2c4uPABzrDAx3SwqpuFvHe',$,'FixingSocketTypeReference','Type reference for the fixing socket according to local standards.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#1202=IFCSIMPLEPROPERTYTEMPLATE('1ndN64Uxv0LP2PW5D3kG2P',$,'FixingSocketHeight','The overall height of the fixing socket.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1203=IFCSIMPLEPROPERTYTEMPLATE('1IkRQ$5ND5Af4VJCV1q4HI',$,'FixingSocketThreadDiameter','The nominal diameter of the thread.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1204=IFCSIMPLEPROPERTYTEMPLATE('1ITlL88O56kOOs5a9L7SQx',$,'FixingSocketThreadLength','The length of the threaded part of the fixing socket.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1205=IFCPROPERTYSETTEMPLATE('1bqBRpdg5FxwIGHcGCPhiJ',$,'Pset_DiscreteAccessoryLadderTrussConnector','Shape properties specific to connecting accessories in truss form with straight cross-bars in ladder shape.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1206,#1207,#1208,#1209,#1210,#1211)); -#1206=IFCSIMPLEPROPERTYTEMPLATE('3siDmFfqrDYh728LFms0Mq',$,'LadderTrussHeight','The overall height of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1207=IFCSIMPLEPROPERTYTEMPLATE('1q0$yvqkLAPvfZgfKXdriJ',$,'LadderTrussLength','The overall length of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1208=IFCSIMPLEPROPERTYTEMPLATE('2$S95UBYLAp92ksYEnivXB',$,'LadderTrussCrossBarSpacing','The spacing between the straight cross-bars.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1209=IFCSIMPLEPROPERTYTEMPLATE('0oJm7P1yb4JBXaSoQsYuX1',$,'LadderTrussBaseBarDiameter','The nominal diameter of the base bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1210=IFCSIMPLEPROPERTYTEMPLATE('2wGsBOcKPCoeofnopXiCg1',$,'LadderTrussSecondaryBarDiameter','The nominal diameter of the secondary bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1211=IFCSIMPLEPROPERTYTEMPLATE('1G$3EihKn8XeJ5r_YmObwp',$,'LadderTrussCrossBarDiameter','The nominal diameter of the straight cross-bars.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1212=IFCPROPERTYSETTEMPLATE('20is0HT053bg8K9JYIvP4e',$,'Pset_DiscreteAccessoryStandardFixingPlate','Properties specific to standard fixing plates.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1213,#1214,#1215)); -#1213=IFCSIMPLEPROPERTYTEMPLATE('1mdKg_r_bDhBIjm2xXGQcq',$,'StandardFixingPlateWidth','The width of the standard fixing plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1214=IFCSIMPLEPROPERTYTEMPLATE('1TROubSSzFrhVmTy8TISYM',$,'StandardFixingPlateDepth','The depth of the standard fixing plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1215=IFCSIMPLEPROPERTYTEMPLATE('307I52HjTDChkcr3ramq_o',$,'StandardFixingPlateThickness','The thickness of the standard fixing plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1216=IFCPROPERTYSETTEMPLATE('3DPqoV$jv0WBwdJ9czIoQV',$,'Pset_DiscreteAccessoryTypeBracket','Properties of a bracket. The property set can be used by the predefined type BRACKET of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/BRACKET,IfcDiscreteAccessoryType/BRACKET',(#1217)); -#1217=IFCSIMPLEPROPERTYTEMPLATE('18LK9ksZH0GfqLG7hzHL51',$,'IsInsulated','Indicates whether the element is insulated or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1218=IFCPROPERTYSETTEMPLATE('0JKBtP5yD4hQOl5VFTYtyo',$,'Pset_DiscreteAccessoryTypeCableArranger','Properties used for a cable arranger. The property set can be used by the predefined type CABLEARRANGER of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/CABLEARRANGER,IfcDiscreteAccessoryType/CABLEARRANGER',(#1219)); -#1219=IFCSIMPLEPROPERTYTEMPLATE('3lWpSWP41B0e7Pd_YBE3Mw',$,'CableArrangerPosition','Indicates the directional position of the cable arranger: vertical, horizontal, front or rear. It is relative to the element (usually a cabinet) that the cable arranger is affiliated.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1220,$,$,$,.READWRITE.); -#1220=IFCPROPERTYENUMERATION('PEnum_ArrangerPositionEnum',(IFCLABEL('FRONTSIDE'),IFCLABEL('HORIZONTAL'),IFCLABEL('REARSIDE'),IFCLABEL('VERTICAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1221=IFCPROPERTYSETTEMPLATE('2vH6ktT2H8Hw2NQa$OFRnZ',$,'Pset_DiscreteAccessoryTypeInsulator','Properties of an insulator. The property set can be used by the predefined type INSULATOR of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/INSULATOR,IfcDiscreteAccessoryType/INSULATOR',(#1222,#1223,#1224,#1225,#1226,#1228,#1229,#1230,#1231,#1232,#1233,#1234)); -#1222=IFCSIMPLEPROPERTYTEMPLATE('1rse6D19D33O0hLeo1XEBN',$,'RatedCurrent','The current that a device is designed to handle.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1223=IFCSIMPLEPROPERTYTEMPLATE('065aGD3TT1JBWtARIJJrl9',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1224=IFCSIMPLEPROPERTYTEMPLATE('26mMD0ZbH8jgUDgKAYZPOU',$,'InsulationVoltage','The insulation voltage.\X2\000A000A\X0\The max voltage for normal insulation operation.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1225=IFCSIMPLEPROPERTYTEMPLATE('3jU6EDQaP2bRjXY_GaA0j8',$,'BreakdownVoltageTolerance','Nominal value of the spark gap breakdown voltage tolerance.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1226=IFCSIMPLEPROPERTYTEMPLATE('2Ut9648K19ehj82x$jrKgH',$,'InsulationMethod','The method used to insulate.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1227,$,$,$,.READWRITE.); -#1227=IFCPROPERTYENUMERATION('PEnum_InsulatorType',(IFCLABEL('LONGRODINSULATOR'),IFCLABEL('PININSULATOR'),IFCLABEL('POSTINSULATOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1228=IFCSIMPLEPROPERTYTEMPLATE('0iYNigMsb27Q6TvsBkGMM1',$,'OperationalTemperatureRange','The temperature range in which the device operates normally.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1229=IFCSIMPLEPROPERTYTEMPLATE('0Zorfmv1z3Nu8e7UBc9vUy',$,'CreepageDistance','Shortest distance or the sum of the shortest distances along the surface on an insulator between two conductive parts which normally have the operating voltage between them. (IEV ref 471-01-04)',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1230=IFCSIMPLEPROPERTYTEMPLATE('1OZZoKChz6pQuAtQeaRgrn',$,'InstallationMethod','Method of installation of cable/conductor. Installation methods are typically defined by reference in standards such as IEC 60364-5-52, table 52A-1 or BS7671 Appendix 4 Table 4A1 etc. Selection of the value to be used should be determined from such a standard according to local usage.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1231=IFCSIMPLEPROPERTYTEMPLATE('0wxdpX_pnBUhHCBrDFkg4Y',$,'LightningPeakVoltage','The peak lightning voltage that the insulator could withstand.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1232=IFCSIMPLEPROPERTYTEMPLATE('2yvb7J1Cb14AoKLLy1l6o6',$,'BendingStrength','Bending strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1233=IFCSIMPLEPROPERTYTEMPLATE('2na1UQFy12sh9ZEFJFKakc',$,'RMSWithstandVoltage','Rms value of sinusoidal power frequency voltage that the insulation of the given equipment can withstand during tests made under specified conditions and for a specified duration. (IEV ref 614-03-22\X2\FF09\X0\',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1234=IFCSIMPLEPROPERTYTEMPLATE('2I5$vYtBnDEvyOtAP1TAW5',$,'Voltage','The actual voltage and operable range.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1235=IFCPROPERTYSETTEMPLATE('3805pJu4T2dwQIQXVDLc$z',$,'Pset_DiscreteAccessoryTypeLock','Properties of locking equipment. The property set can be used by the predefined type LOCK of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/LOCK,IfcDiscreteAccessoryType/LOCK',(#1236,#1237)); -#1236=IFCSIMPLEPROPERTYTEMPLATE('0hLBxHda53ERGtghMjV9mQ',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#1237=IFCSIMPLEPROPERTYTEMPLATE('2bhZbwK1n7mvjgQRpmriFt',$,'RequiredClosureSpacing','Required length of the closure spacing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1238=IFCPROPERTYSETTEMPLATE('3_oKKv8cP62PfYSP2AfRwC',$,'Pset_DiscreteAccessoryTypeRailBrace','Properties of a rail brace. The property set can be used by the predefined type RAILBRACE of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/RAILBRACE,IfcDiscreteAccessoryType/RAILBRACE',(#1239)); -#1239=IFCSIMPLEPROPERTYTEMPLATE('047UDJ0gj1lRENoXIO374s',$,'IsTemporary','Indicates if the installation of the element is temporary or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1240=IFCPROPERTYSETTEMPLATE('2KgNBk8Yv0WfAd0QH1iKbI',$,'Pset_DiscreteAccessoryTypeRailLubrication','Properties of rail lubrication equipment. The property set can be used by the predefined type RAIL_LUBRICATION of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/RAIL_LUBRICATION,IfcDiscreteAccessoryType/RAIL_LUBRICATION',(#1241,#1243,#1244,#1246)); -#1241=IFCSIMPLEPROPERTYTEMPLATE('2wdN$DGnbByuprXi4eq6sI',$,'PositionInTrack','Indicates the relative position of the element in track, which lies to the left or right as facing in the direction of increasing stationing values.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1242,$,$,$,.READWRITE.); -#1242=IFCPROPERTYENUMERATION('PEnum_RelativePosition',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1243=IFCSIMPLEPROPERTYTEMPLATE('2izTEleH56IxZ97pEyUjGk',$,'MaximumNoiseEmissions','Maximum noise emissions limit at this location.',.P_SINGLEVALUE.,'IfcSoundPowerLevelMeasure',$,$,$,$,$,.READWRITE.); -#1244=IFCSIMPLEPROPERTYTEMPLATE('3vGZ4P5BHAJf3rIHlcLdyR',$,'LubricationSystemType','Design and type of lubricating system e.g. active, passive.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1245,$,$,$,.READWRITE.); -#1245=IFCPROPERTYENUMERATION('PEnum_LubricationSystemType',(IFCLABEL('ACTIVE_LUBRICATION'),IFCLABEL('PASSIVE_LUBRICATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1246=IFCSIMPLEPROPERTYTEMPLATE('1ytT1TuPfCOwdAGlJ3NrFR',$,'LubricationPowerSupplyType','Type of power supply method used by the rail lubrication.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1247,$,$,$,.READWRITE.); -#1247=IFCPROPERTYENUMERATION('PEnum_LubricationPowerSupply',(IFCLABEL('ELECTRIC'),IFCLABEL('PHOTOVOLTAIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1248=IFCPROPERTYSETTEMPLATE('1SeM2Lak973AT6QH6sbJTR',$,'Pset_DiscreteAccessoryTypeRailPad','Properties of rail pads. The property set can be used by the predefined type RAILPAD of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/RAILPAD,IfcDiscreteAccessoryType/RAILPAD',(#1249)); -#1249=IFCSIMPLEPROPERTYTEMPLATE('0lntKs1NTDlQ4sbvS36rzD',$,'RailPadStiffness','Indicates the stiffness of a rail pad.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1250,$,$,$,.READWRITE.); -#1250=IFCPROPERTYENUMERATION('PEnum_RailPadStiffness',(IFCLABEL('MEDIUM'),IFCLABEL('SOFT'),IFCLABEL('STIFF'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1251=IFCPROPERTYSETTEMPLATE('0YxzvTlrD0kx1OhFGY01Z1',$,'Pset_DiscreteAccessoryTypeSlidingChair','Properties of a sliding chair. The property set can be used by the predefined type SLIDINGCHAIR of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/SLIDINGCHAIR,IfcDiscreteAccessoryType/SLIDINGCHAIR',(#1252)); -#1252=IFCSIMPLEPROPERTYTEMPLATE('3y9DF8yNXANu59NmBQFUP1',$,'IsSelfLubricated','Indicates whether the element is self lubricated or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1253=IFCPROPERTYSETTEMPLATE('1H5Dd0ehLBLuyrQhan323l',$,'Pset_DiscreteAccessoryTypeSoundAbsorption','Properties of sound absorption equipment used in railway. The property set can be used by the predefined type SOUNDABSORPTION of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/SOUNDABSORPTION,IfcDiscreteAccessoryType/SOUNDABSORPTION',(#1254)); -#1254=IFCSIMPLEPROPERTYTEMPLATE('2yFjFmemf7IxnTjJuPy_sm',$,'SoundAbsorptionLimit','Mandatory limit values in sound absorption.',.P_SINGLEVALUE.,'IfcSoundPowerLevelMeasure',$,$,$,$,$,.READWRITE.); -#1255=IFCPROPERTYSETTEMPLATE('2aL1mmV4D0UeH6k_KKp9bl',$,'Pset_DiscreteAccessoryTypeTensioningEquipment','Properties of tensioning equipment used in railway. The property set can be used by the predefined type TENSIONINGEQUIPMENT of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/TENSIONINGEQUIPMENT,IfcDiscreteAccessoryType/TENSIONINGEQUIPMENT',(#1256,#1257,#1258,#1259,#1260,#1261)); -#1256=IFCSIMPLEPROPERTYTEMPLATE('21K8ZddfP80vKyINrG_MjG',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1257=IFCSIMPLEPROPERTYTEMPLATE('3lic5sl4DD2usPUWfBG2l4',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#1258=IFCSIMPLEPROPERTYTEMPLATE('1rgI5RXH993PtCf7Wxa4QC',$,'HasBreakLineLock','Indicates whether the equipment has the function of brake line lock or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1259=IFCSIMPLEPROPERTYTEMPLATE('21u61SEib0t89M_25RccuZ',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1260=IFCSIMPLEPROPERTYTEMPLATE('3tHkjsxKv7BRCIPeZ$6aKM',$,'RatioOfWireTension','The ratio of wire tension to tensioner weight.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1261=IFCSIMPLEPROPERTYTEMPLATE('1988awfJb0cBT13$drzWyl',$,'TransmissionEfficiency','Transmission efficiency of the tensioning equipment.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#1262=IFCPROPERTYSETTEMPLATE('1iYx_TL5P5axE2ZRss$tYk',$,'Pset_DiscreteAccessoryWireLoop','Shape properties common to wire loop joint connectors.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1263,#1264,#1265,#1266,#1267,#1268)); -#1263=IFCSIMPLEPROPERTYTEMPLATE('00L5JCc$P74fw62JYK1Z0y',$,'WireLoopBasePlateThickness','The thickness of the base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1264=IFCSIMPLEPROPERTYTEMPLATE('3bMuB4RlX4GeTupCnwFyDy',$,'WireLoopBasePlateWidth','The width of the base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1265=IFCSIMPLEPROPERTYTEMPLATE('0fIPcoqp90huPZAB_84NF2',$,'WireLoopBasePlateLength','The length of the base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1266=IFCSIMPLEPROPERTYTEMPLATE('25su$9cnz1chMXTleCflEs',$,'WireDiameter','The nominal diameter of the wire.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1267=IFCSIMPLEPROPERTYTEMPLATE('1dALuwemn1_wJvCAuMFLIu',$,'WireEmbeddingLength','The length of the part of wire which is embedded in the precast concrete element.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1268=IFCSIMPLEPROPERTYTEMPLATE('2HrBNfRdf3s9SB$bDZ4wWe',$,'WireLoopLength','The length of the fastening loop part of the wire.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1269=IFCPROPERTYSETTEMPLATE('1pXMj3AkvFvOinHxiPqJUk',$,'Pset_DistributionBoardOccurrence','Properties that may be applied to electric distribution board occurrences.',.PSET_OCCURRENCEDRIVEN.,'IfcElectricDistributionBoard',(#1270,#1271)); -#1270=IFCSIMPLEPROPERTYTEMPLATE('3hR8GZAoLDoAWoGcCo$MUh',$,'IsMain','Identifies if the current instance is a main distribution point or topmost level in an electrical distribution hierarchy (= TRUE) or a sub-main distribution point (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1271=IFCSIMPLEPROPERTYTEMPLATE('11$rvYBQn1IfOSKuSJLNAh',$,'IsSkilledOperator','Identifies if the current instance requires a skilled person or instructed person to perform operations on the distribution board (= TRUE) or whether operations may be performed by a person without appropriate skills or instruction (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1272=IFCPROPERTYSETTEMPLATE('2$wUqM3g9C6AebnnFmmjlo',$,'Pset_DistributionBoardTypeCommon','Properties that may be applied to electric distribution boards.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricDistributionBoard,IfcElectricDistributionBoardType',(#1273,#1274)); -#1273=IFCSIMPLEPROPERTYTEMPLATE('1N1gC5RTD4i9$LGVK8KiA4',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1274=IFCSIMPLEPROPERTYTEMPLATE('1FkKfJRN14M83jJxXUNgZw',$,'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',$,#1275,$,$,$,.READWRITE.); -#1275=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1276=IFCPROPERTYSETTEMPLATE('3xDmgFZZD7qv6mhunXYi0k',$,'Pset_DistributionBoardTypeDispatchingBoard','Properties for IfcDistributionBoard with PredefinedType DISPATCHINGBOARD.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionBoard/DISPATCHINGBOARD,IfcDistributionBoardType/DISPATCHINGBOARD',(#1277,#1278)); -#1277=IFCSIMPLEPROPERTYTEMPLATE('1wx3ikcSb7Tx7B$RT4yzAc',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#1278=IFCSIMPLEPROPERTYTEMPLATE('1ZqjdrjGf2fPIBDmq5nBxJ',$,'DispatchingBoardType','Indicates the type of dispatching board.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1279,$,$,$,.READWRITE.); -#1279=IFCPROPERTYENUMERATION('PEnum_DispatchingBoardType',(IFCLABEL('CENTER'),IFCLABEL('STATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1280=IFCPROPERTYSETTEMPLATE('0pXFVqj2j0dAJ4_jzPc4EM',$,'Pset_DistributionBoardTypeDistributionFrame','Properties for IfcDistributionBoard with PredefinedType DISTRIBUTIONFRAME.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionBoard/DISTRIBUTIONFRAME,IfcDistributionBoardType/DISTRIBUTIONFRAME',(#1281)); -#1281=IFCSIMPLEPROPERTYTEMPLATE('2tI37D7Dr1MxNNBq3A3FkS',$,'PortCapacity','Indicates the number of ports in the passive device that can be used to interconnect cables.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#1282=IFCPROPERTYSETTEMPLATE('1C5QwWnILEuArhsGPBVPE4',$,'Pset_DistributionChamberElementCommon','Common properties of all occurrences of IfcDistributionChamberElement.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement,IfcDistributionChamberElementType',(#1283,#1284)); -#1283=IFCSIMPLEPROPERTYTEMPLATE('0iOlGYMwXDvfz63xWMaJlz',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.\X2\000A000A\X0\E.g. ''WWS/VS1/400/001'', which indicates the occurrence belongs to system WWS, subsystems VSI/400, and has the component number 001.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1284=IFCSIMPLEPROPERTYTEMPLATE('35jjb2uCn9hfVoHS0wdP8T',$,'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',$,#1285,$,$,$,.READWRITE.); -#1285=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1286=IFCPROPERTYSETTEMPLATE('3QaDlc9h1CBhmFuLky0Nqb',$,'Pset_DistributionChamberElementTypeFormedDuct','Space formed in the ground for the passage of pipes, cables, ducts.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/FORMEDDUCT,IfcDistributionChamberElementType/FORMEDDUCT',(#1287,#1288,#1289,#1290,#1291,#1292)); -#1287=IFCSIMPLEPROPERTYTEMPLATE('10yoXIsrDFG8b5_wKGj9Ld',$,'ClearWidth','The clear width.\X2\000A000A\X0\It indicates the formed space in the duct.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1288=IFCSIMPLEPROPERTYTEMPLATE('3LwcmuFnX6GujOpcnsD14o',$,'ClearDepth','The clear depth.\X2\000A000A\X0\It indicates the formed space in the duct.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1289=IFCSIMPLEPROPERTYTEMPLATE('2n3gLV5FDD1whTzxqWCAKw',$,'WallThickness','The thickness of the wall construction.\X2\000A\X0\NOTE: It is assumed that walls will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1290=IFCSIMPLEPROPERTYTEMPLATE('2IQ_xlizX92u2t7Parl0YD',$,'BaseThickness','The thickness of the base construction, assumed to be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1291=IFCSIMPLEPROPERTYTEMPLATE('1gG21PJLL0ZPP0WynscknR',$,'AccessCoverLoadRating','The load rating of the access cover (which may be a value or an alphanumerically defined class rating).',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1292=IFCSIMPLEPROPERTYTEMPLATE('1iVKstS_f0oOOQSWMMyod$',$,'CableDuctOccupancyRatio','Indicates the ratio between the number of cables in the duct and the maximum number of cables that the duct can contain.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1293=IFCPROPERTYSETTEMPLATE('3SrvZH0QHFTA7BZkevLH9s',$,'Pset_DistributionChamberElementTypeInspectionChamber','Chamber constructed on a drain, sewer or pipeline and with a removable cover, that permits visible inspection.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/INSPECTIONCHAMBER,IfcDistributionChamberElementType/INSPECTIONCHAMBER',(#1294,#1295,#1296,#1297,#1298,#1299,#1300,#1301,#1302,#1303,#1304,#1305,#1306)); -#1294=IFCSIMPLEPROPERTYTEMPLATE('2wNpEUcAv6WBwb$TqoPBpC',$,'ChamberLengthOrRadius','Length or, in the event of the shape being circular in plan, the radius of the chamber.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1295=IFCSIMPLEPROPERTYTEMPLATE('3ryYgC$WH4mAKZS_wGBihO',$,'ChamberWidth','Width, in the event of the shape being non circular in plan.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1296=IFCSIMPLEPROPERTYTEMPLATE('2KWdRJ67DDifAOQHfuoDMl',$,'InspectionChamberInvertLevel','Level of the lowest part of the cross section as measured from ground level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1297=IFCSIMPLEPROPERTYTEMPLATE('1MrpQ0hEzDkeWBBX9LMAIS',$,'SoffitLevel','Level of the highest internal part of the cross section as measured from ground level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1298=IFCSIMPLEPROPERTYTEMPLATE('2x6C0qlOjBwv04KTk_eoaj',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1299=IFCSIMPLEPROPERTYTEMPLATE('3gTAGUDfPDq90oUngZDzJs',$,'WallThickness','The thickness of the wall construction.\X2\000A\X0\NOTE: It is assumed that walls will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1300=IFCSIMPLEPROPERTYTEMPLATE('3QaHY1$8rE4e6jupGOTRWN',$,'BaseMaterial','The material from which the base of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1301=IFCSIMPLEPROPERTYTEMPLATE('0bOI2GKyT7RQkRiNkMzr6q',$,'BaseThickness','The thickness of the base construction, assumed to be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1302=IFCSIMPLEPROPERTYTEMPLATE('2BCPQCAlTCA9DTEDwjzU1S',$,'WithBackdrop','Indicates whether the chamber has a backdrop or tumbling bay (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1303=IFCSIMPLEPROPERTYTEMPLATE('2uWf8Qk394n8_9B8AifK0I',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1304=IFCSIMPLEPROPERTYTEMPLATE('36Juil$O9CBgR3fto$5UyJ',$,'AccessLengthOrRadius','The length of the chamber access cover or, where the plan shape of the cover is circular, the radius.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1305=IFCSIMPLEPROPERTYTEMPLATE('0xs$PLvnH98wp59_n6iEy3',$,'AccessWidth','The width of the chamber access cover where the plan shape of the cover is not circular.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1306=IFCSIMPLEPROPERTYTEMPLATE('0jDdbXm9PAR8SbLFyy0jvw',$,'AccessCoverLoadRating','The load rating of the access cover (which may be a value or an alphanumerically defined class rating).',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1307=IFCPROPERTYSETTEMPLATE('0ut05cIEXELvxbA3SRIafj',$,'Pset_DistributionChamberElementTypeInspectionPit','Recess or chamber formed to permit access for inspection of substructure and services (definition modified from BS6100 221 4128).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/INSPECTIONPIT,IfcDistributionChamberElementType/INSPECTIONPIT',(#1308,#1309,#1310)); -#1308=IFCSIMPLEPROPERTYTEMPLATE('1Qt9hBI1DANPaGcvd23nk6',$,'Length','The length of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1309=IFCSIMPLEPROPERTYTEMPLATE('09aXuLhgv11Q8jOVZ_WpT$',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1310=IFCSIMPLEPROPERTYTEMPLATE('3kgHObXjv3b8gO7E_y2eGo',$,'Depth','The depth of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1311=IFCPROPERTYSETTEMPLATE('00n_4zNs1DXRMGuf4kVENB',$,'Pset_DistributionChamberElementTypeManhole','Chamber constructed on a drain, sewer or pipeline and with a removable cover, that permits the entry of a person.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/MANHOLE,IfcDistributionChamberElementType/MANHOLE',(#1312,#1313,#1314,#1315,#1316,#1317,#1318,#1319,#1320,#1321,#1322,#1323,#1324,#1325,#1326,#1327,#1328,#1329)); -#1312=IFCSIMPLEPROPERTYTEMPLATE('2KdIVbpPLAQvI1T_Y6wzdf',$,'InvertLevel','Level of the lowest part of the cross section as measured from ground level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1313=IFCSIMPLEPROPERTYTEMPLATE('2x3PCe01TA$uDZZ7eYwRfK',$,'SoffitLevel','Level of the highest internal part of the cross section as measured from ground level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1314=IFCSIMPLEPROPERTYTEMPLATE('1Zv2T1AJz7V9fmCVh73P36',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1315=IFCSIMPLEPROPERTYTEMPLATE('1Y8bQFuv570PV5oJp80Gct',$,'WallThickness','The thickness of the wall construction.\X2\000A\X0\NOTE: It is assumed that walls will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1316=IFCSIMPLEPROPERTYTEMPLATE('25VZwww$nEQvoJK2uCQVG6',$,'BaseMaterial','The material from which the base of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1317=IFCSIMPLEPROPERTYTEMPLATE('0wRsmxb5v8Te7_PCxw4TTF',$,'BaseThickness','The thickness of the base construction, assumed to be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1318=IFCSIMPLEPROPERTYTEMPLATE('2v$_TGojfDguFN8WqKWtni',$,'IsShallow','Indicates whether the chamber has been designed as being shallow (TRUE) or deep (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1319=IFCSIMPLEPROPERTYTEMPLATE('0OSCY73xz6ph0M37kKxZlV',$,'HasSteps','Indicates whether the chamber has steps (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1320=IFCSIMPLEPROPERTYTEMPLATE('0l$UX$xnT7jQlc87zV1228',$,'WithBackdrop','Indicates whether the chamber has a backdrop or tumbling bay (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1321=IFCSIMPLEPROPERTYTEMPLATE('1flUDfIY9AaOcKCmDEWPFU',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1322=IFCSIMPLEPROPERTYTEMPLATE('1OsvImAxvDoO9sx4kUTGFe',$,'AccessLengthOrRadius','The length of the chamber access cover or, where the plan shape of the cover is circular, the radius.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1323=IFCSIMPLEPROPERTYTEMPLATE('0qH9wQsHb1f9AjmycB4wJ8',$,'AccessWidth','The width of the chamber access cover where the plan shape of the cover is not circular.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1324=IFCSIMPLEPROPERTYTEMPLATE('2btnxYn9D4aANRrQ5wuA7X',$,'AccessCoverLoadRating','The load rating of the access cover (which may be a value or an alphanumerically defined class rating).',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1325=IFCSIMPLEPROPERTYTEMPLATE('1ctJTpmbPBcAzVfcNNL9lb',$,'IsAccessibleOnFoot','Indicates whether the element is accessible on foot (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1326=IFCSIMPLEPROPERTYTEMPLATE('3LoyVWS6vCq9t_Pliu9evV',$,'IsLocked','Indicates whether the element is locked (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1327=IFCSIMPLEPROPERTYTEMPLATE('2kx1kfpdf1pPqBVyrRToJh',$,'NumberOfCableEntries','Indicates the number of cable entries in the manhole.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1328=IFCSIMPLEPROPERTYTEMPLATE('39Bm$fesD8PRcgBLtMBmyS',$,'NumberOfManholeCovers','Indicates the number of manhole covers.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1329=IFCSIMPLEPROPERTYTEMPLATE('2slD70Ak59P9$1k2k1VPwx',$,'TypeOfShaft','Additional information on the purpose of the shaft.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1330,$,$,$,.READWRITE.); -#1330=IFCPROPERTYENUMERATION('PEnum_TypeOfShaft',(IFCLABEL('DIVERSIONSHAFT'),IFCLABEL('FLUSHINGCHAMBER'),IFCLABEL('GATESHAFT'),IFCLABEL('GULLY'),IFCLABEL('INSPECTIONCHAMBER'),IFCLABEL('PUMPSHAFT'),IFCLABEL('ROOFWATERSHAFT'),IFCLABEL('SHAFTWITHCHECKVALVE'),IFCLABEL('SLURRYCOLLECTOR'),IFCLABEL('SOAKAWAY'),IFCLABEL('WELL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1331=IFCPROPERTYSETTEMPLATE('1eUBCt1mzAVuHku0Nidx5P',$,'Pset_DistributionChamberElementTypeMeterChamber','Chamber that houses a meter(s) (definition modified from BS6100 250 6224).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/METERCHAMBER,IfcDistributionChamberElementType/METERCHAMBER',(#1332,#1333,#1334,#1335,#1336,#1337,#1338)); -#1332=IFCSIMPLEPROPERTYTEMPLATE('1ZuLxRh7HBMQrKz5SYTsEq',$,'ChamberLengthOrRadius','Length or, in the event of the shape being circular in plan, the radius of the chamber.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1333=IFCSIMPLEPROPERTYTEMPLATE('1PqE8zxKX2weHbW8YW9Pcm',$,'ChamberWidth','Width, in the event of the shape being non circular in plan.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1334=IFCSIMPLEPROPERTYTEMPLATE('192FMF1Hz2selGTu8I8SdP',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1335=IFCSIMPLEPROPERTYTEMPLATE('2fi0IJriT8aQv2oM3kCM5E',$,'WallThickness','The thickness of the wall construction.\X2\000A\X0\NOTE: It is assumed that walls will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1336=IFCSIMPLEPROPERTYTEMPLATE('1iatYBAYr4MPWq6$OUDxPK',$,'BaseMaterial','The material from which the base of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1337=IFCSIMPLEPROPERTYTEMPLATE('2TSIJzSTb36u5SHMz3GukK',$,'BaseThickness','The thickness of the base construction, assumed to be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1338=IFCSIMPLEPROPERTYTEMPLATE('0iUrEttaX9APxjmOyohGda',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1339=IFCPROPERTYSETTEMPLATE('2dzrRYb89EiRqfDrH0$Rr8',$,'Pset_DistributionChamberElementTypeSump','Recess or small chamber into which liquid is drained to facilitate its removal.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/SUMP,IfcDistributionChamberElementType/SUMP',(#1340,#1341,#1342)); -#1340=IFCSIMPLEPROPERTYTEMPLATE('0UK7P3lED6bA13_0a7UNMB',$,'Length','The length of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1341=IFCSIMPLEPROPERTYTEMPLATE('1vtxucKJX1xufGrJOWJemb',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1342=IFCSIMPLEPROPERTYTEMPLATE('3u25ZkOd5B2xuvlxouLYY9',$,'SumpInvertLevel','The lowest point in the cross section of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1343=IFCPROPERTYSETTEMPLATE('30w82vFkL4pvIrc3UPl3jF',$,'Pset_DistributionChamberElementTypeTrench','Excavation, the length of which greatly exceeds the width.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/TRENCH,IfcDistributionChamberElementType/TRENCH',(#1344,#1345,#1346)); -#1344=IFCSIMPLEPROPERTYTEMPLATE('2h3dXmW_j2kBSoeCDjlnrd',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1345=IFCSIMPLEPROPERTYTEMPLATE('3LbpMnjPL7yhn2T4SeZRZx',$,'Depth','The depth of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1346=IFCSIMPLEPROPERTYTEMPLATE('1wjEFC5cn2Zwr87eRqDs0r',$,'InvertLevel','Level of the lowest part of the cross section as measured from ground level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1347=IFCPROPERTYSETTEMPLATE('0A7JEPAOv6NAi5yPV47IP1',$,'Pset_DistributionChamberElementTypeValveChamber','Chamber that houses a valve(s).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/VALVECHAMBER,IfcDistributionChamberElementType/VALVECHAMBER',(#1348,#1349,#1350,#1351,#1352,#1353,#1354)); -#1348=IFCSIMPLEPROPERTYTEMPLATE('0GRyxaflr5wxEjM6tLi9zn',$,'ChamberLengthOrRadius','Length or, in the event of the shape being circular in plan, the radius of the chamber.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1349=IFCSIMPLEPROPERTYTEMPLATE('13S3swzFf8I9po8PV8V4yF',$,'ChamberWidth','Width, in the event of the shape being non circular in plan.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1350=IFCSIMPLEPROPERTYTEMPLATE('2J_MBiX4v5zP9qwT4fPqWx',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1351=IFCSIMPLEPROPERTYTEMPLATE('2U8HaR01r2fOYZbAOycr_L',$,'WallThickness','The thickness of the wall construction.\X2\000A\X0\NOTE: It is assumed that walls will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1352=IFCSIMPLEPROPERTYTEMPLATE('3wifyTlpfD$835At9$$Zmo',$,'BaseMaterial','The material from which the base of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1353=IFCSIMPLEPROPERTYTEMPLATE('1f415b39j4uuyX5dIdz6T_',$,'BaseThickness','The thickness of the base construction, assumed to be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1354=IFCSIMPLEPROPERTYTEMPLATE('3dYHB59Y19eOqW8uhcGztX',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1355=IFCPROPERTYSETTEMPLATE('0Lt6NDHBL5TeHAWYsnJd1G',$,'Pset_DistributionPortCommon','Common attributes attached to an instance of IfcDistributionPort.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort',(#1356,#1357)); -#1356=IFCSIMPLEPROPERTYTEMPLATE('39_7i1QyL3vfUgU_e3uTje',$,'PortNumber','The port index for logically ordering the port within the containing element or element type.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#1357=IFCSIMPLEPROPERTYTEMPLATE('3gm3TjJ4HAqfKKlQ4ZTyN8',$,'ColourCode','Name of a colour for identifying the connector, if applicable.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1358=IFCPROPERTYSETTEMPLATE('3GWEZtO_v9SxNg3CXVpkwT',$,'Pset_DistributionPortPHistoryCable','Log of electrical activity attached to an instance of IfcPerformanceHistory having an assigned IfcDistributionPort of type CABLE.',.PSET_PERFORMANCEDRIVEN.,'IfcDistributionPort/CABLE',(#1359,#1360,#1361,#1362,#1363,#1364,#1365,#1366)); -#1359=IFCSIMPLEPROPERTYTEMPLATE('1kcyPMIoL43xWGIWoCIqU9',$,'CurrentHistory','Log of electrical current.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1360=IFCSIMPLEPROPERTYTEMPLATE('076fiMx0j2ZexHOQ4oSek2',$,'VoltageHistory','Log of electrical voltage.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1361=IFCSIMPLEPROPERTYTEMPLATE('2kW5zcYwn90eXCCWJHrRmA',$,'RealPower','Real power.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1362=IFCSIMPLEPROPERTYTEMPLATE('1OWS5NaLT0WhqNtI6pBDdJ',$,'ReactivePower','Reactive power.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1363=IFCSIMPLEPROPERTYTEMPLATE('11NJHAQN55Sf_5a2iddmxr',$,'ApparentPower','Apparent power.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1364=IFCSIMPLEPROPERTYTEMPLATE('3zNgyNWM153922YzYN1Ovd',$,'PowerFactorHistory','Power factor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1365=IFCSIMPLEPROPERTYTEMPLATE('0IjeiIEVDB6e5eUkBobvbn',$,'DataTransmitted','For data ports, captures log of data transmitted. The LIST at IfcTimeSeriesValue.Values may split out data according to Pset_DistributionPortTypeCable.Protocols.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1366=IFCSIMPLEPROPERTYTEMPLATE('2JMEpgtknC_RaM2gvK$cOj',$,'DataReceived','For data ports, captures log of data received. The LIST at IfcTimeSeriesValue.Values may split out data according to Pset_DistributionPortTypeCable.Protocols.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1367=IFCPROPERTYSETTEMPLATE('02ipp5WjjCLul4cc7Fttt0',$,'Pset_DistributionPortPHistoryDuct','Fluid flow performance history attached to an instance of IfcPerformanceHistory assigned to IfcDistributionPort. This replaces the deprecated IfcFluidFlowProperties for performance values.',.PSET_PERFORMANCEDRIVEN.,'IfcDistributionPort/DUCT',(#1368,#1369,#1370,#1371,#1372,#1373,#1374)); -#1368=IFCSIMPLEPROPERTYTEMPLATE('3RDWJtzVXB9hkfvB0T_Zrs',$,'TemperatureHistory','Temperature of the fluid. For air this value represents the dry bulb temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1369=IFCSIMPLEPROPERTYTEMPLATE('1AU$nIsB1BiAGJBbqWazNM',$,'WetBulbTemperatureHistory','Wet bulb temperature of the fluid; only applicable if the fluid is air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1370=IFCSIMPLEPROPERTYTEMPLATE('3talPcB$r9R9Vi75fp4vuJ',$,'VolumetricFlowRateHistory','The volumetric flow rate of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1371=IFCSIMPLEPROPERTYTEMPLATE('15_VysnIn39fQbAAF4PrWH',$,'MassFlowRateHistory','The mass flow rate of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1372=IFCSIMPLEPROPERTYTEMPLATE('2OiwTQIj9B5Axonj8mZSP3',$,'FlowConditionHistory','Defines the flow condition as a percentage of the cross-sectional area.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1373=IFCSIMPLEPROPERTYTEMPLATE('0CI8r7jCH138aRvZA_mGHI',$,'VelocityHistory','The velocity of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1374=IFCSIMPLEPROPERTYTEMPLATE('3IM3g2bXz5h9LqXQJZBEKm',$,'PressureHisotry','The pressure of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1375=IFCPROPERTYSETTEMPLATE('13jCyXvV51A96zK1S2FmJe',$,'Pset_DistributionPortPHistoryPipe','Log of substance usage attached to an instance of IfcPerformanceHistory having an assigned IfcDistributionPort of type PIPE.',.PSET_PERFORMANCEDRIVEN.,'IfcDistributionPort/PIPE',(#1376,#1377,#1378)); -#1376=IFCSIMPLEPROPERTYTEMPLATE('3BeWfkRGvFJALb0Bqn9_P_',$,'Temperature','Temperature of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1377=IFCSIMPLEPROPERTYTEMPLATE('1qJ_yeh094UOZ4bBrox9FW',$,'Pressure','The pressure of fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1378=IFCSIMPLEPROPERTYTEMPLATE('1lHJ6OFrf7DQz2AZKtTvF1',$,'Flowrate','The flowrate of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1379=IFCPROPERTYSETTEMPLATE('3ZtYFVpPn1m8KX6VHbc1Sl',$,'Pset_DistributionPortTypeCable','Cable port occurrence attributes attached to an instance of IfcDistributionPort.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort/CABLE',(#1380,#1382,#1383,#1385,#1387,#1388,#1389,#1390,#1391,#1392,#1393)); -#1380=IFCSIMPLEPROPERTYTEMPLATE('3pDl4CCV167h38JUCJiJ8w',$,'ElectricalConnectionType','The physical port connection:ACPLUG: AC plug\X2\000A\X0\DCPLUG: DC plug\X2\000A\X0\CRIMP: bare wire',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1381,$,$,$,.READWRITE.); -#1381=IFCPROPERTYENUMERATION('PEnum_DistributionPortElectricalType',(IFCLABEL('ACPLUG'),IFCLABEL('COAXIAL'),IFCLABEL('CRIMP'),IFCLABEL('DCPLUG'),IFCLABEL('DIN'),IFCLABEL('DSUB'),IFCLABEL('DVI'),IFCLABEL('EIAJ'),IFCLABEL('HDMI'),IFCLABEL('RADIO'),IFCLABEL('RCA'),IFCLABEL('RJ'),IFCLABEL('SOCKET'),IFCLABEL('TRS'),IFCLABEL('USB'),IFCLABEL('XLR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1382=IFCSIMPLEPROPERTYTEMPLATE('35L_xOeyL9CPI_zFGpy7Wr',$,'ConnectionSubtype','The physical port connection subtype that further qualifies the ConnectionType. The following values are recommended:ACPLUG: A, B, C, D, E, F, EF, G, H, I, J, K, L, M\X2\000A\X0\DIN: Mini3P, Mini4P, Mini5P, Mini6P, Mini7P, Mini8P, Mini9P\X2\000A\X0\DSub: DA15, DB25, DC37, DD50, DE9, DE15\X2\000A\X0\EIAJ: RC5720\X2\000A\X0\HDMI: A, B, C\X2\000A\X0\RADIO: IEEE802.11g, IEEE802.11n\X2\000A\X0\RJ: 4P4C, 6P2C, 8P8C\X2\000A\X0\SOCKET: E-11, E-12, E-14, E-17, E-26, E-27, E-39, E-40\X2\000A\X0\TRS: TS_Mini, TS_SubMini, TRS_Mini, TRS_SubMini',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1383=IFCSIMPLEPROPERTYTEMPLATE('2n_fgPfAXENOs3P4QSOEZN',$,'ConnectionGender','The physical connection gender.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1384,$,$,$,.READWRITE.); -#1384=IFCPROPERTYENUMERATION('PEnum_DistributionPortGender',(IFCLABEL('FEMALE'),IFCLABEL('MALE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1385=IFCSIMPLEPROPERTYTEMPLATE('2PzY_anGj0tgCwCLgd6P32',$,'ConductorFunction','Indicates function of the conductors to which the load is connected. Where L1, L2 and L3 represent the phase lines according to IEC 60446 notation (sometimes phase lines may be referenced by color [Red, Blue, Yellow] or by number [1, 2, 3] etc). Protective Earth is sometimes also known as CPC or common protective conductor. Note that for an electrical device, a set of line conductor functions may be applied.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1386,$,$,$,.READWRITE.); -#1386=IFCPROPERTYENUMERATION('PEnum_ConductorFunctionEnum',(IFCLABEL('NEUTRAL'),IFCLABEL('PHASE_L1'),IFCLABEL('PHASE_L2'),IFCLABEL('PHASE_L3'),IFCLABEL('PROTECTIVEEARTH'),IFCLABEL('PROTECTIVEEARTHNEUTRAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1387=IFCSIMPLEPROPERTYTEMPLATE('1AQaEjcOj0mPN73WoPBeRc',$,'CurrentContent3rdHarmonic','The ratio between the third harmonic current and the phase current.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1388=IFCSIMPLEPROPERTYTEMPLATE('1LcP$WYWP7wuRiLK_0EtuG',$,'Current','The actual current and operable range.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1389=IFCSIMPLEPROPERTYTEMPLATE('10FWQ3vqH3Pueadvb6h2AR',$,'Voltage','The actual voltage and operable range.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1390=IFCSIMPLEPROPERTYTEMPLATE('0Npf3efH55_OVAdl$qBqPd',$,'Power','The actual power and operable range.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1391=IFCSIMPLEPROPERTYTEMPLATE('05a$pLyo5EcxxQW0Yq4x8y',$,'Protocols','For data ports, identifies the protocols used as defined by the Open System Interconnection (OSI) Basic Reference Model (ISO 7498). Layers include: 1. Physical; 2. DataLink; 3. Network; 4. Transport; 5. Session; 6. Presentation; 7. Application. Example: 3:IP, 4:TCP, 5:HTTP',.P_LISTVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1392=IFCSIMPLEPROPERTYTEMPLATE('3n3uUy0WT8rxax4jbSWpvX',$,'HasConnector','Indicate whether the wire pair end point is terminated with a connector or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1393=IFCSIMPLEPROPERTYTEMPLATE('0EJ20W3ujAFA0R9_rZy3GH',$,'IsWelded','Indicates whether the wire pair end point is joined to another wire pair end point by means of a welded junction.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1394=IFCPROPERTYSETTEMPLATE('1fLriByrH7rA$8PpLb7tb$',$,'Pset_DistributionPortTypeDuct','Duct port occurrence attributes attached to an instance of IfcDistributionPort.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort/DUCT',(#1395,#1397,#1398,#1399,#1400,#1401,#1402,#1403,#1404,#1405)); -#1395=IFCSIMPLEPROPERTYTEMPLATE('0DHsqe5Jv9OOGgdMuakeyH',$,'ConnectionType','The end-style treatment of the duct port:BEADEDSLEEVE: Beaded Sleeve.\X2\000A\X0\COMPRESSION: Compression.\X2\000A\X0\CRIMP: Crimp.\X2\000A\X0\DRAWBAND: Drawband.\X2\000A\X0\DRIVESLIP: Drive slip.\X2\000A\X0\FLANGED: Flanged.\X2\000A\X0\OUTSIDESLEEVE: Outside Sleeve.\X2\000A\X0\SLIPON: Slipon.\X2\000A\X0\SOLDERED: Soldered.\X2\000A\X0\SSLIP: S-Slip.\X2\000A\X0\STANDINGSEAM: Standing seam.\X2\000A\X0\SWEDGE: Swedge.\X2\000A\X0\WELDED: Welded.\X2\000A\X0\OTHER: Another type of end-style has been applied.\X2\000A\X0\NONE: No end-style has been applied.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1396,$,$,$,.READWRITE.); -#1396=IFCPROPERTYENUMERATION('PEnum_DuctConnectionType',(IFCLABEL('BEADEDSLEEVE'),IFCLABEL('COMPRESSION'),IFCLABEL('CRIMP'),IFCLABEL('DRAWBAND'),IFCLABEL('DRIVESLIP'),IFCLABEL('FLANGED'),IFCLABEL('NONE'),IFCLABEL('OUTSIDESLEEVE'),IFCLABEL('SLIPON'),IFCLABEL('SOLDERED'),IFCLABEL('SSLIP'),IFCLABEL('STANDINGSEAM'),IFCLABEL('SWEDGE'),IFCLABEL('WELDED'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); -#1397=IFCSIMPLEPROPERTYTEMPLATE('35KmYefzDBdP$FTk$_3r1u',$,'ConnectionSubtype','The physical port connection subtype that further qualifies the ConnectionType. The following values are recommended:ACPLUG: A, B, C, D, E, F, EF, G, H, I, J, K, L, M\X2\000A\X0\DIN: Mini3P, Mini4P, Mini5P, Mini6P, Mini7P, Mini8P, Mini9P\X2\000A\X0\DSub: DA15, DB25, DC37, DD50, DE9, DE15\X2\000A\X0\EIAJ: RC5720\X2\000A\X0\HDMI: A, B, C\X2\000A\X0\RADIO: IEEE802.11g, IEEE802.11n\X2\000A\X0\RJ: 4P4C, 6P2C, 8P8C\X2\000A\X0\SOCKET: E-11, E-12, E-14, E-17, E-26, E-27, E-39, E-40\X2\000A\X0\TRS: TS_Mini, TS_SubMini, TRS_Mini, TRS_SubMini',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1398=IFCSIMPLEPROPERTYTEMPLATE('0vjIjL6zf7SuajCDMrYgwo',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#1399=IFCSIMPLEPROPERTYTEMPLATE('0ti4qCOz18FxMqq8eSOF_I',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A000A\X0\The nominal height of the duct connection. Only provided for rectangular shaped ducts.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1400=IFCSIMPLEPROPERTYTEMPLATE('3kgYQyisXDBwKzvRKov4QQ',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#1401=IFCSIMPLEPROPERTYTEMPLATE('2UpE9GBjj0evj3oYA9gwAu',$,'DryBulbTemperature','Dry bulb temperature of the object.\X2\000A000A\X0\Indicates dry bulb temperature of the air.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1402=IFCSIMPLEPROPERTYTEMPLATE('1L6zqMUzf4Z9jSpXPJK5bu',$,'WetBulbTemperature','Wet bulb temperature of the air.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1403=IFCSIMPLEPROPERTYTEMPLATE('0M8_0xky1Cze0d2BhGF1MT',$,'VolumetricFlowRate','The volumetric flow rate of the fluid.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1404=IFCSIMPLEPROPERTYTEMPLATE('2shJnYuWD5BPSn1FbGqfbv',$,'Velocity','The velocity of the fluid.',.P_BOUNDEDVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#1405=IFCSIMPLEPROPERTYTEMPLATE('2TLmxLAXj10xyHT$T5A5zH',$,'Pressure','The pressure of fluid.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1406=IFCPROPERTYSETTEMPLATE('3FYiT6mRjCyQBYz2tjQcKT',$,'Pset_DistributionPortTypePipe','Pipe port occurrence attributes attached to an instance of IfcDistributionPort.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort/PIPE',(#1407,#1409,#1410,#1411,#1412,#1413,#1414,#1415,#1416,#1417,#1418)); -#1407=IFCSIMPLEPROPERTYTEMPLATE('2e9WmJUbL5guUVxRgQnJF7',$,'ConnectionType','The end-style treatment of the duct port:BEADEDSLEEVE: Beaded Sleeve.\X2\000A\X0\COMPRESSION: Compression.\X2\000A\X0\CRIMP: Crimp.\X2\000A\X0\DRAWBAND: Drawband.\X2\000A\X0\DRIVESLIP: Drive slip.\X2\000A\X0\FLANGED: Flanged.\X2\000A\X0\OUTSIDESLEEVE: Outside Sleeve.\X2\000A\X0\SLIPON: Slipon.\X2\000A\X0\SOLDERED: Soldered.\X2\000A\X0\SSLIP: S-Slip.\X2\000A\X0\STANDINGSEAM: Standing seam.\X2\000A\X0\SWEDGE: Swedge.\X2\000A\X0\WELDED: Welded.\X2\000A\X0\OTHER: Another type of end-style has been applied.\X2\000A\X0\NONE: No end-style has been applied.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1408,$,$,$,.READWRITE.); -#1408=IFCPROPERTYENUMERATION('PEnum_PipeEndStyleTreatment',(IFCLABEL('BRAZED'),IFCLABEL('COMPRESSION'),IFCLABEL('FLANGED'),IFCLABEL('GROOVED'),IFCLABEL('NONE'),IFCLABEL('OUTSIDESLEEVE'),IFCLABEL('SOLDERED'),IFCLABEL('SWEDGE'),IFCLABEL('THREADED'),IFCLABEL('WELDED'),IFCLABEL('OTHER'),IFCLABEL('UNSET')),$); -#1409=IFCSIMPLEPROPERTYTEMPLATE('0cabYBr5DBBec46n3tg0Re',$,'ConnectionSubtype','The physical port connection subtype that further qualifies the ConnectionType. The following values are recommended:ACPLUG: A, B, C, D, E, F, EF, G, H, I, J, K, L, M\X2\000A\X0\DIN: Mini3P, Mini4P, Mini5P, Mini6P, Mini7P, Mini8P, Mini9P\X2\000A\X0\DSub: DA15, DB25, DC37, DD50, DE9, DE15\X2\000A\X0\EIAJ: RC5720\X2\000A\X0\HDMI: A, B, C\X2\000A\X0\RADIO: IEEE802.11g, IEEE802.11n\X2\000A\X0\RJ: 4P4C, 6P2C, 8P8C\X2\000A\X0\SOCKET: E-11, E-12, E-14, E-17, E-26, E-27, E-39, E-40\X2\000A\X0\TRS: TS_Mini, TS_SubMini, TRS_Mini, TRS_SubMini',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1410=IFCSIMPLEPROPERTYTEMPLATE('3FFMya2KDFI83amO8O0OTg',$,'NominalDiameter','Nominal diameter or width of the object.\X2\000A000A\X0\The nominal diameter of the pipe connection.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1411=IFCSIMPLEPROPERTYTEMPLATE('13yJbe2O91MwcTnAzD0orD',$,'InnerDiameter','The actual inner diameter of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1412=IFCSIMPLEPROPERTYTEMPLATE('2791sU1WnELPx5bJcqOID1',$,'OuterDiameter','The actual outer diameter of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1413=IFCSIMPLEPROPERTYTEMPLATE('2ahba76lX2GvHe9zX6FPql',$,'Temperature','Temperature of the fluid.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1414=IFCSIMPLEPROPERTYTEMPLATE('3$SgwefOT9YhX7nd14H5c5',$,'VolumetricFlowRate','The volumetric flow rate of the fluid.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1415=IFCSIMPLEPROPERTYTEMPLATE('1ZibBcMaHBtwVSz5oecprQ',$,'MassFlowRate','The mass flow rate of the fluid.',.P_BOUNDEDVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1416=IFCSIMPLEPROPERTYTEMPLATE('025fz7rU52agZn8FMpU6et',$,'FlowCondition','Defines the flow condition as a percentage of the cross-sectional area.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1417=IFCSIMPLEPROPERTYTEMPLATE('3PsnJgzmrBth$5xoBFDGL4',$,'Velocity','The velocity of the fluid.',.P_BOUNDEDVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#1418=IFCSIMPLEPROPERTYTEMPLATE('0Rhq5bOf160OIMywTcSEvE',$,'Pressure','The pressure of fluid.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1419=IFCPROPERTYSETTEMPLATE('1c9n2q4h5FeQT_ZD3rezRQ',$,'Pset_DistributionSystemCommon','Distribution system occurrence attributes attached to an instance of IfcDistributionSystem.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem',(#1420)); -#1420=IFCSIMPLEPROPERTYTEMPLATE('1YTg_Oktn9Ng7640ydVt7L',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.\X2\000A000A\X0\E.g. ''WWS/VS1'', which indicates the system to be WWS, subsystems VSI/400.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1421=IFCPROPERTYSETTEMPLATE('2dMM7pZgDCRB60ZLySI4V0',$,'Pset_DistributionSystemTypeElectrical','Properties of electrical circuits.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem/ELECTRICAL',(#1422,#1424,#1426,#1427,#1428,#1429,#1430)); -#1422=IFCSIMPLEPROPERTYTEMPLATE('0RyjF2QmD26BLxRdJJUdSP',$,'ElectricalSystemType','For certain purposes of electrical regulations, IEC 60364 defines types of system using type identifiers. Assignment of identifiers depends upon the relationship of the source, and of exposed conductive parts of the installation, to Ground (Earth). Identifiers that may be assigned through IEC 60364 are:\X2\2022\X0\TN type system, a system having one or more points of the source of energy directly earthed, the exposed conductive parts of the installation being connected to that point by protective conductors,\X2\000A2022\X0\TN C type system, a TN type system in which neutral and protective functions are combined in a single conductor throughout the system,\X2\000A2022\X0\TN S type system, a TN type system having separate neutral and protective conductors throughout the system,\X2\000A2022\X0\TN C S type system, a TN type system in which neutral and protective functions are combined in a single conductor in part of the system,\X2\000A2022\X0\TT type system, a system having one point of the source of energy directly earthed, the exposed conductive parts of the installation being connected to earth electrodes electrically independent of the earth electrodes of the source,\X2\000A2022\X0\IT type system, a system having no direct connection between live parts and Earth, the exposed conductive parts of the electrical installation being earthed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1423,$,$,$,.READWRITE.); -#1423=IFCPROPERTYENUMERATION('PEnum_DistributionSystemElectricalType',(IFCLABEL('IT'),IFCLABEL('TN'),IFCLABEL('TN_C'),IFCLABEL('TN_C_S'),IFCLABEL('TN_S'),IFCLABEL('TT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1424=IFCSIMPLEPROPERTYTEMPLATE('2GctECpKT9qgu0$jOIpEdK',$,'ElectricalSystemCategory','Designates the voltage range of the circuit, according to IEC. HIGHVOLTAGE indicates >1000V AC or >1500V DV; LOWVOLTAGE indicates 50-1000V AC or 120-1500V DC; EXTRALOWVOLTAGE indicates <50V AC or <120V DC.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1425,$,$,$,.READWRITE.); -#1425=IFCPROPERTYENUMERATION('PEnum_DistributionSystemElectricalCategory',(IFCLABEL('EXTRALOWVOLTAGE'),IFCLABEL('HIGHVOLTAGE'),IFCLABEL('LOWVOLTAGE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1426=IFCSIMPLEPROPERTYTEMPLATE('2p1$7sApD45gdkVfYpNDaG',$,'Diversity','The ratio, expressed as a numerical\X2\000A\X0\value or as a percentage, of the\X2\000A\X0\simultaneous maximum demand of\X2\000A\X0\a group of electrical appliances or\X2\000A\X0\consumers within a specified period,\X2\000A\X0\to the sum of their individual maximum\X2\000A\X0\demands within the same\X2\000A\X0\period. The group of electrical appliances is in this case connected to this circuit. Definition from IEC 60050, IEV 691-10-04\X2\000A\X0\NOTE1: It is often not desirable to size each conductor in a distribution system to support the total connected load at that point in the network. Diversity is applied on the basis of the anticipated loadings that are likely to result from all loads not being connected at the same time.\X2\000A\X0\NOTE2: Diversity is applied to final circuits only, not to sub-main circuits supplying other DBs.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1427=IFCSIMPLEPROPERTYTEMPLATE('0u0sGoEUT5xhg0OKP2KA7y',$,'NumberOfLiveConductors','Number of live conductors within this circuit. Either this property or the ConductorFunction property (if only one) may be asserted.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1428=IFCSIMPLEPROPERTYTEMPLATE('32mCgzbJT1whDbcMEvs84a',$,'MaximumAllowedVoltageDrop','The maximum voltage drop across the circuit that must not be exceeded.\X2\000A\X0\There are two voltage drop limit settings that may be applied; one for sub-main circuits, and one in each Distribution Board or Consumer Unit for final circuits connected to that board. The settings should limit the overall voltage drop to the required level. Default settings of 1.5% for sub-main circuits and 2.5% for final circuits, giving an overall limit of 4% may be applied.\X2\000A\X0\NOTE: This value may also be specified as a constraint within an IFC model if required but is included within the property set at this stage pending implementation of the required capabilities within software applications.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1429=IFCSIMPLEPROPERTYTEMPLATE('09Ojz7Vd1DcQPcRAKTUyU_',$,'NetImpedance','The maximum earth loop impedance upstream of a circuit (typically stated as the variable Zs). This value is for 55o C (130oF) Celsius usage.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#1430=IFCSIMPLEPROPERTYTEMPLATE('35L0MnkXz6Nuaa930uDmKH',$,'RatedVoltageRange','Voltage range as declared by the manufacturer expressed by its lower and upper rated voltages [Source : IEC 62368-1:2010, 3.3.10.5].',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1431=IFCPROPERTYSETTEMPLATE('2293dKLK50Xvq0k9jqTjWE',$,'Pset_DistributionSystemTypeOverheadContactlineSystem','Properties of an overhead contact line system. The property set is associated with the predefined type OVERHEAD_CONTACT_LINE_SYSTEM of IfcDistributionSystem.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem/OVERHEAD_CONTACTLINE_SYSTEM',(#1432,#1433,#1434,#1435,#1436,#1437,#1438,#1439,#1440,#1441,#1442)); -#1432=IFCSIMPLEPROPERTYTEMPLATE('2OC03gSp1FZOxkutwaT8gZ',$,'SpanNominalLength','The length of span as a design parameter for the overhead contactline system.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1433=IFCSIMPLEPROPERTYTEMPLATE('1yNaoIImv3B9m8rRooxVj7',$,'ContactWireStagger','Lateral displacement of the contact wire to opposite sides of the track centre at successive supports.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1434=IFCSIMPLEPROPERTYTEMPLATE('09FNQvNqvFxAP8kMU1PMuu',$,'ContactWireNominalDrop','Vertical distance between the main catenary wire and the contact wire measured at a support point.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1435=IFCSIMPLEPROPERTYTEMPLATE('12Ad3hyfLCNQiCnhOLrU3i',$,'PressureRange','Allowable maximum and minimum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1436=IFCSIMPLEPROPERTYTEMPLATE('1XvZJGfIb4BuXkbNJEzd1$',$,'ContactWireNominalHeight','Nominal distance from the top of the rail to the lower face of the contact wire, measured perpendicular to the track.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1437=IFCSIMPLEPROPERTYTEMPLATE('0Cxg9ht01EegLS89EI6xHo',$,'ContactWireUplift','Vertical upward movement of the contact wire due to the force produced from the pantograph.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#1438=IFCSIMPLEPROPERTYTEMPLATE('2FB7NQ18jESfgm0sBMMalK',$,'ElectricalClearance','The recommended air clearances between earth and the live parts of the overhead contactline system.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1439=IFCSIMPLEPROPERTYTEMPLATE('0kRWTAN8fBOPpIG1wbTM6T',$,'NumberOfOverlappingSpans','Number of overlapping spans in the overhead contactline system.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1440=IFCSIMPLEPROPERTYTEMPLATE('1DKGjTrL9Fxg781e$0S9DG',$,'PantographType','Indicates the type of pantograph as a design parameter for the overhead contactline system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1441=IFCSIMPLEPROPERTYTEMPLATE('1atNkw7Tr5SuD4TCVUdeDa',$,'TensionLength','Length of overhead contactline between two terminating points. It is a design parameter for the overhead contactline system.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1442=IFCSIMPLEPROPERTYTEMPLATE('1wvNri4I90uPUO7OVKYF6R',$,'OCSType','Indicates the type of overhead contactline system (OCS).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1443,$,$,$,.READWRITE.); -#1443=IFCPROPERTYENUMERATION('PEnum_OverheadContactLineType',(IFCLABEL('COMPOUND_CATENARY_SUSPENSION'),IFCLABEL('OCL_WITH_CATENARY_SUSPENSION'),IFCLABEL('OCL_WITH_STITCHED_CATENARY_SUSPENSION'),IFCLABEL('RIGID_CATENARY'),IFCLABEL('TROLLY_TYPE_CONTACT_LINE'),IFCLABEL('TROLLY_TYPE_WITH_STITCHWIRE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1444=IFCPROPERTYSETTEMPLATE('1PZpE4dwD8u9ENBJXuLopz',$,'Pset_DistributionSystemTypeVentilation','This property set is used to define the general characteristics of the duct design parameters within a system.\X2\000A\X0\HISTORY: New property set in IFC Release 2.0. Renamed from Pset_DuctDesignCriteria in IFC4.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem/VENTILATION',(#1445,#1446,#1448,#1449,#1450,#1451,#1452,#1453,#1454,#1455,#1456)); -#1445=IFCSIMPLEPROPERTYTEMPLATE('0xYmNNrOf3E9dyBQ0XzHyI',$,'DesignName','A name for the design values.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1446=IFCSIMPLEPROPERTYTEMPLATE('33XN227Vj7CeX4suYpKoJG',$,'DuctSizingMethod','Enumeration that identifies the methodology to be used to size system components.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1447,$,$,$,.READWRITE.); -#1447=IFCPROPERTYENUMERATION('PEnum_DuctSizingMethod',(IFCLABEL('CONSTANTFRICTION'),IFCLABEL('CONSTANTPRESSURE'),IFCLABEL('STATICREGAIN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1448=IFCSIMPLEPROPERTYTEMPLATE('2Ac6adY2P6_O$QuNIf7cES',$,'PressureClass','Nominal pressure rating of the object.\X2\000A000A\X0\Nominal pressure rating of the system components.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1449=IFCSIMPLEPROPERTYTEMPLATE('2SNlVGcpnAqQzNziLCy2Ri',$,'LeakageClass','Nominal leakage rating for the system components.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1450=IFCSIMPLEPROPERTYTEMPLATE('1cfdauOrP19P2P6Ygp7_KT',$,'FrictionLoss','The pressure loss due to friction per unit length. (Data type = PressureMeasure/LengthMeasure)',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1451=IFCSIMPLEPROPERTYTEMPLATE('0VGJG2rn9DDvv7YGP_ek1L',$,'ScrapFactor','Sheet metal scrap factor.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1452=IFCSIMPLEPROPERTYTEMPLATE('1lrjy1iSf5OeA_YcZeIMMo',$,'DuctSealant','Type of sealant used on the duct and fittings.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1453=IFCSIMPLEPROPERTYTEMPLATE('03WsdThXbBLvK7J6LnE3ZS',$,'MaximumVelocity','The maximum design velocity of the air in the duct or fitting.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#1454=IFCSIMPLEPROPERTYTEMPLATE('075hPZGFPB5x7aIxqxSJY_',$,'AspectRatio','The default aspect ratio.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1455=IFCSIMPLEPROPERTYTEMPLATE('1nUPKF8VH4qeqFbN8aGFZv',$,'MinimumHeight','The minimum duct height for rectangular, oval or round duct.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1456=IFCSIMPLEPROPERTYTEMPLATE('1USt$Gc5T1thJlaxOB_Ysj',$,'MinimumWidth','The minimum duct width for oval or rectangular duct.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1457=IFCPROPERTYSETTEMPLATE('1XSWOgWw9E6AfnD$TK1pzZ',$,'Pset_DoorCommon','Properties common to the definition of all occurrences of IfcDoor.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor,IfcDoorType',(#1458,#1459,#1461,#1462,#1463,#1464,#1465,#1466,#1467,#1468,#1469,#1470,#1471,#1472,#1473,#1474,#1475,#1476,#1477)); -#1458=IFCSIMPLEPROPERTYTEMPLATE('3TVJtZtOX0VxkKU0TBgyel',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1459=IFCSIMPLEPROPERTYTEMPLATE('3XXByCtOL5mhHXjZHH5xwr',$,'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',$,#1460,$,$,$,.READWRITE.); -#1460=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1461=IFCSIMPLEPROPERTYTEMPLATE('3Eq5vY2ZLCzvzz_xfd4Fsx',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1462=IFCSIMPLEPROPERTYTEMPLATE('3LEO1T6J509eCw$1sIyhUF',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1463=IFCSIMPLEPROPERTYTEMPLATE('3$X8YPNJjFN8e$zTSrYdQX',$,'SecurityRating','Index based rating system indicating security level.\X2\000A\X0\It is giving according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1464=IFCSIMPLEPROPERTYTEMPLATE('2B57Nv2Vn5ZwEE7lJ03z7R',$,'DurabilityRating','Durability against mechanical stress. It is given according to the national code or regulation.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1465=IFCSIMPLEPROPERTYTEMPLATE('3clKafSUzFqfq6XxI6Y9mj',$,'HygrothermalRating','Resistance against hygrothermal impact from different temperatures and humidities inside and outside. It is given according to the national code or regulation.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1466=IFCSIMPLEPROPERTYTEMPLATE('3M71IM7BL3cAxi3GEAuYkP',$,'WaterTightnessRating','Water tightness rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1467=IFCSIMPLEPROPERTYTEMPLATE('1ExSnzRDHC_BS3yUe4h1dY',$,'MechanicalLoadRating','Mechanical load rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1468=IFCSIMPLEPROPERTYTEMPLATE('0eTVyjfW9B5Bsx244aClTu',$,'WindLoadRating','Wind load resistance rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1469=IFCSIMPLEPROPERTYTEMPLATE('2khS_PYFH4F804__ekgBMi',$,'Infiltration','Infiltration flowrate of outside air for the filler object based on the area of the filler object at a pressure level of 50 Pascals. It shall be used, if the length of all joints is unknown.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1470=IFCSIMPLEPROPERTYTEMPLATE('1$bmJgKF1AZfdl7FMc$gJs',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1471=IFCSIMPLEPROPERTYTEMPLATE('3AvlVXdxT4_vC$l6JCTCBb',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#1472=IFCSIMPLEPROPERTYTEMPLATE('0m_KQc2nHEVBA_1oZfNQpc',$,'GlazingAreaFraction','Fraction of the glazing area relative to the total area of the filling element.\X2\000A\X0\It shall be used, if the glazing area is not given separately for all panels within the filling element.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1473=IFCSIMPLEPROPERTYTEMPLATE('0RiyilGEHBpxVeVUtMK370',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. Set to (TRUE) if this object is rated as handicap accessible according the local building codes, otherwise (FALSE).\X2\000A\X0\It is giving according to the requirements of the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1474=IFCSIMPLEPROPERTYTEMPLATE('3BO75XS4v6m8XvrkUjkmKC',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here it defines an exit door in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1475=IFCSIMPLEPROPERTYTEMPLATE('3gSswOG1P5igBI$uGxOYRo',$,'HasDrive','Indication whether this object has an automatic drive to operate it (TRUE) or no drive (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1476=IFCSIMPLEPROPERTYTEMPLATE('0df9GIQxbEOfuv_IrSPvS5',$,'SelfClosing','Indication whether this object is designed to close automatically after use (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1477=IFCSIMPLEPROPERTYTEMPLATE('1knXvRk_52LAHGf6kGzx6E',$,'SmokeStop','Indication whether the object is designed to provide a smoke stop (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1478=IFCPROPERTYSETTEMPLATE('2y8L$BoLX78x2MosT6ONoY',$,'Pset_DoorTypeTurnstile','Properties common to turnstiles or automatic gates used to control the flow of people or vehicles. This property set is applied to IfcDoor instances of predefined type TURNSTILE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor/TURNSTILE,IfcDoorType/TURNSTILE',(#1479,#1480,#1482,#1483)); -#1479=IFCSIMPLEPROPERTYTEMPLATE('2UQ1zKwuzAxwd4kr7_HTpJ',$,'IsBidirectional','Indicates whether the turnstile is bidirectional.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1480=IFCSIMPLEPROPERTYTEMPLATE('33WYkoLUv49vMYnWfKz5_i',$,'TurnstileType','Indicates the type of turnstile gate.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1481,$,$,$,.READWRITE.); -#1481=IFCPROPERTYENUMERATION('PEnum_TurnstileType',(IFCLABEL('SWINGGATEBRAKE'),IFCLABEL('THREEPOLEROTARYBRAKE'),IFCLABEL('WINGGATEBRAKE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1482=IFCSIMPLEPROPERTYTEMPLATE('3AswsRgcb2GwWaAuojX4yC',$,'NarrowChannelWidth','Indicates the width of the narrow channel.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1483=IFCSIMPLEPROPERTYTEMPLATE('2ZGRUUY_r7yRroZSnJ5ZzB',$,'WideChannelWidth','Indicates the width of the wide channel.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1484=IFCPROPERTYSETTEMPLATE('0spWeaKhHCnBFoAXlqvx$M',$,'Pset_DoorWindowGlazingType','Properties common to the definition of the glazing component of occurrences of IfcDoor and IfcWindow, used for thermal and lighting calculations.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor,IfcWindow,IfcDoorType,IfcWindowType',(#1485,#1486,#1487,#1488,#1489,#1490,#1491,#1492,#1493,#1494,#1495,#1496,#1497,#1498,#1499,#1500,#1501,#1502,#1503)); -#1485=IFCSIMPLEPROPERTYTEMPLATE('3e6S1FKdDD893HfU5qG06a',$,'GlassLayers','Number of glass layers within the frame. E.g. "2" for double glazing.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1486=IFCSIMPLEPROPERTYTEMPLATE('0cL06MFxX3bebe4kZpc23b',$,'GlassThickness1','Thickness of the first (inner) glass layer.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1487=IFCSIMPLEPROPERTYTEMPLATE('06$QI75Tr91vsOlv_hj0AE',$,'GlassThickness2','Thickness of the second (intermediate or outer) glass layer.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1488=IFCSIMPLEPROPERTYTEMPLATE('3CaKPz7jD8QwSyyOcsF8ka',$,'GlassThickness3','Thickness of the third (outer) glass layer.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1489=IFCSIMPLEPROPERTYTEMPLATE('38M3F0Ejb5suTVhkIfHSoL',$,'FillGas','Name of the gas by which the gap between two glass layers is filled. It is given for information purposes only.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1490=IFCSIMPLEPROPERTYTEMPLATE('0XQldKw1bCrh5x2BCSKd3N',$,'GlassColour','Colour (tint) selection for this glazing. It is given for information purposes only.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1491=IFCSIMPLEPROPERTYTEMPLATE('0d1QTURYP0nxor4wJgzBF_',$,'IsTempered','Indication whether the glass is tempered (TRUE) or not (FALSE) .',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1492=IFCSIMPLEPROPERTYTEMPLATE('2LvyRDMYn8ReScxw$G24ct',$,'IsLaminated','Indication whether the glass is layered with other materials (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1493=IFCSIMPLEPROPERTYTEMPLATE('2GdwKfCnv74vJKdJQ6Lvsl',$,'IsCoated','Indication whether the glass is coated with a material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1494=IFCSIMPLEPROPERTYTEMPLATE('03bZ9Jex13a8w_gHwjWwa_',$,'IsWired','Indication whether the glass includes a contained wire mesh to prevent break-in (TRUE) or not (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1495=IFCSIMPLEPROPERTYTEMPLATE('1r5joKJXvF18DSiytEwBMS',$,'VisibleLightReflectance','Fraction of the visible light that is reflected by the glazing at normal incidence. It is a value without unit.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1496=IFCSIMPLEPROPERTYTEMPLATE('2XvxGBoPf8rgNOKE6g13Zf',$,'VisibleLightTransmittance','Fraction of the visible light that passes the object at normal incidence. It is a value without unit.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1497=IFCSIMPLEPROPERTYTEMPLATE('0fZLlmK2n1P9Be5GZ4tRwV',$,'SolarAbsorption','(Asol) The ratio of incident solar radiation that is absorbed by a glazing system. It is the sum of the absorption distributed to the exterior (a) and to the interior (qi). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1498=IFCSIMPLEPROPERTYTEMPLATE('0wGVcH2h95cArts5vtNJL8',$,'SolarReflectance','(Rsol): The ratio of incident solar radiation that is reflected by a glazing system (also named \X2\03C1\X0\e). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1499=IFCSIMPLEPROPERTYTEMPLATE('3rkLZS$HX1B9qRPRaF82j4',$,'SolarTransmittance','The ratio of incident solar radiation that directly passes through a system (also named \X2\03C4\X0\e). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1500=IFCSIMPLEPROPERTYTEMPLATE('3749AedJz0iACioeH1yqjJ',$,'SolarHeatGainTransmittance','(SHGC): The ratio of incident solar radiation that contributes to the heat gain of the interior, it is the solar radiation that directly passes (Tsol or \X2\03C4\X0\e) plus the part of the absorbed radiation that is distributed to the interior (qi). The SHGC is referred to also as g-value (g = \X2\03C4\X0\e + qi).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1501=IFCSIMPLEPROPERTYTEMPLATE('1AMjbibjTAtBxKz03iNVed',$,'ShadingCoefficient','(SC): The measure of the ability of a glazing to transmit solar heat, relative to that ability for 3 mm (1/8-inch) clear, double-strength, single glass. Shading coefficient is being phased out in favor of the solar heat gain coefficient (SHGC), and is approximately equal to the SHGC multiplied by 1.15. The shading coefficient is expressed as a number without units between 0 and 1.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1502=IFCSIMPLEPROPERTYTEMPLATE('32oSzxu9XE6um4JkfnLjF$',$,'ThermalTransmittanceSummer','Thermal transmittance coefficient (U-Value) of a material.\X2\000A\X0\Summer thermal transmittance coefficient of the glazing only, often referred to as (U-value).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#1503=IFCSIMPLEPROPERTYTEMPLATE('00UpA9wOD6TfIFTJRR_FQd',$,'ThermalTransmittanceWinter','Thermal transmittance coefficient (U-Value) of a material.\X2\000A\X0\Winter thermal transmittance coefficient of the glazing only, often referred to as (U-value).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#1504=IFCPROPERTYSETTEMPLATE('2FFQuT0KTEgQVTHhv9LT85',$,'Pset_DuctFittingOccurrence','Duct fitting occurrence attributes.',.PSET_OCCURRENCEDRIVEN.,'IfcDuctFitting',(#1505,#1506,#1507)); -#1505=IFCSIMPLEPROPERTYTEMPLATE('3DbKDFizL62fVbwH6PCbVL',$,'InteriorRoughnessCoefficient','The interior roughness of the material of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1506=IFCSIMPLEPROPERTYTEMPLATE('34uz6xIYzCavOb16VIdg3P',$,'HasLiner','TRUE if the fitting has interior duct insulating lining, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1507=IFCSIMPLEPROPERTYTEMPLATE('1ctzLaD1fEmuB$cjlxzE5E',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1508=IFCPROPERTYSETTEMPLATE('0NfTeoVHb62O8ZF3j0Yy$j',$,'Pset_DuctFittingPHistory','Duct fitting performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcDuctFitting',(#1509,#1510,#1511)); -#1509=IFCSIMPLEPROPERTYTEMPLATE('0nvBs_$Db9hAM5WSNKPg3r',$,'LossCoefficient','Dimensionless loss coefficient used for calculating fluid resistance representing the ratio of total pressure loss to velocity pressure at a referenced cross-section.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1510=IFCSIMPLEPROPERTYTEMPLATE('1Kbr7W2MDDxuYqj9N56iqE',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1511=IFCSIMPLEPROPERTYTEMPLATE('3prIfYghvAXx8OFppCcAv9',$,'AirFlowLeakage','Volumetric leakage flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1512=IFCPROPERTYSETTEMPLATE('1Mf5z4klj1zwBOrsJdKSMz',$,'Pset_DuctFittingTypeCommon','Duct fitting type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDuctFitting,IfcDuctFittingType',(#1513,#1514,#1516,#1517,#1518)); -#1513=IFCSIMPLEPROPERTYTEMPLATE('00UtuIPgHEdQuZRfJXU4BN',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1514=IFCSIMPLEPROPERTYTEMPLATE('2xFdAfNRjENOBRbRONvflz',$,'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',$,#1515,$,$,$,.READWRITE.); -#1515=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1516=IFCSIMPLEPROPERTYTEMPLATE('1ru6GWBST0DuAylvUW6dur',$,'PressureClass','Nominal pressure rating of the object.\X2\000A000A\X0\Pressure classification as defined by the authority having jurisdiction (e.g., SMACNA, etc.).',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1517=IFCSIMPLEPROPERTYTEMPLATE('334hzecOf2yx6$IiQI0HgV',$,'PressureRange','Allowable maximum and minimum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1518=IFCSIMPLEPROPERTYTEMPLATE('1xy6Yz2wnBuPydiasn7XGP',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1519=IFCPROPERTYSETTEMPLATE('2ff8mMnFz4RO9VH$l7fr5W',$,'Pset_DuctSegmentOccurrence','Duct segment occurrence attributes attached to an instance of IfcDuctSegment.',.PSET_OCCURRENCEDRIVEN.,'IfcDuctSegment',(#1520,#1521,#1522)); -#1520=IFCSIMPLEPROPERTYTEMPLATE('1T44L0OvT95vyKfV03g_Sg',$,'InteriorRoughnessCoefficient','The interior roughness of the material of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1521=IFCSIMPLEPROPERTYTEMPLATE('3Vrv2HOp5Cq9GIDaLWdMzy',$,'HasLiner','TRUE if the fitting has interior duct insulating lining, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1522=IFCSIMPLEPROPERTYTEMPLATE('2utikyb7jFiOA8b31ou4TT',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1523=IFCPROPERTYSETTEMPLATE('3AOiEnuln5phdr956JogTX',$,'Pset_DuctSegmentPHistory','Duct segment performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcDuctSegment',(#1524,#1525,#1526,#1527)); -#1524=IFCSIMPLEPROPERTYTEMPLATE('2JlYogvFH6tAQ1_4iG1hlH',$,'LossCoefficient','Dimensionless loss coefficient used for calculating fluid resistance representing the ratio of total pressure loss to velocity pressure at a referenced cross-section.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1525=IFCSIMPLEPROPERTYTEMPLATE('0jxhnwb5XFXg2UUQQeWoiS',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1526=IFCSIMPLEPROPERTYTEMPLATE('1OaK6shnnABgtKT8iIX3P9',$,'LeakageCurveHistory','Leakage per unit length curve versus working pressure. If a scalar is expressed then it represents LeakageClass which is flowrate per unit area at a specified pressure rating (e.g., ASHRAE Fundamentals 2001 34.16.).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1527=IFCSIMPLEPROPERTYTEMPLATE('0c4q8g1CXBQQZ$1EzF0SoJ',$,'FluidFlowLeakage','Volumetric leakage flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1528=IFCPROPERTYSETTEMPLATE('3zNDgYxj9C9f1I8EKtq5nl',$,'Pset_DuctSegmentTypeCommon','Duct segment type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDuctSegment,IfcDuctSegmentType',(#1529,#1530,#1532,#1534,#1535,#1536,#1537,#1538,#1539,#1540,#1541)); -#1529=IFCSIMPLEPROPERTYTEMPLATE('0d48u7DJX0jexIENbmtxzx',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1530=IFCSIMPLEPROPERTYTEMPLATE('2h$rtny9L8IfyCSrZR4dxZ',$,'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',$,#1531,$,$,$,.READWRITE.); -#1531=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1532=IFCSIMPLEPROPERTYTEMPLATE('227e9uEC9AeONP_HVH9MTV',$,'CrossSectionShape','Cross sectional shape. Note that this shape is uniform throughout the length of the segment. For nonuniform shapes, a transition fitting should be used instead.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1533,$,$,$,.READWRITE.); -#1533=IFCPROPERTYENUMERATION('PEnum_DuctSegmentShape',(IFCLABEL('FLATOVAL'),IFCLABEL('RECTANGULAR'),IFCLABEL('ROUND'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1534=IFCSIMPLEPROPERTYTEMPLATE('2KDs3$jkb4$89P2GPnNMyU',$,'WorkingPressure','Working pressure.\X2\000A000A\X0\Pressure classification as defined by the authority having jurisdiction (e.g., SMACNA, etc.).',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1535=IFCSIMPLEPROPERTYTEMPLATE('0QwLP0KRv08wR$KYPSpRl8',$,'PressureRange','Allowable maximum and minimum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1536=IFCSIMPLEPROPERTYTEMPLATE('3RSxnZryfEzRvYxrb55Vxw',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1537=IFCSIMPLEPROPERTYTEMPLATE('3pqFWDXTfFywz3HMKFpahh',$,'LongitudinalSeam','The type of seam to be used along the longitudinal axis of the duct segment.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1538=IFCSIMPLEPROPERTYTEMPLATE('2VR5zeaGH059UuRqwLsgHU',$,'NominalDiameterOrWidth','The nominal diameter or width of the duct segment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1539=IFCSIMPLEPROPERTYTEMPLATE('1IgJDZrD91xefZm8OPd4o4',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1540=IFCSIMPLEPROPERTYTEMPLATE('3dho2ZDLn1rBTm9xJvFvEU',$,'Reinforcement','The type of reinforcement, if any, used for the duct segment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1541=IFCSIMPLEPROPERTYTEMPLATE('2zwZe_xhzDXgQN9tRxARF5',$,'ReinforcementSpacing','The spacing between reinforcing elements.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1542=IFCPROPERTYSETTEMPLATE('1zNpnATpzB4QktoI47Gwm9',$,'Pset_DuctSilencerPHistory','Duct silencer performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcDuctSilencer',(#1543,#1544)); -#1543=IFCSIMPLEPROPERTYTEMPLATE('2NQdjL8sH5PADorlVDBHrv',$,'AirFlowRate','Air flow rate.\X2\000A000A\X0\Volumetric air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1544=IFCSIMPLEPROPERTYTEMPLATE('2X44sG6p10ru8yDumobKOj',$,'AirPressureDropCurve','Air pressure drop as a function of air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1545=IFCPROPERTYSETTEMPLATE('21bWK288X5kvZX5KwrIFSv',$,'Pset_DuctSilencerTypeCommon','Duct silencer type common attributes.\X2\000A\X0\InsertionLoss and RegeneratedSound attributes deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDuctSilencer,IfcDuctSilencerType',(#1546,#1547,#1549,#1550,#1551,#1552,#1553,#1554,#1555)); -#1546=IFCSIMPLEPROPERTYTEMPLATE('0ijdXrqSnFiRrwZXNO$xUK',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1547=IFCSIMPLEPROPERTYTEMPLATE('0NfqtFGG16gwDxML7_XwE_',$,'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',$,#1548,$,$,$,.READWRITE.); -#1548=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1549=IFCSIMPLEPROPERTYTEMPLATE('2A7XVJy2z4xQNawrkohWDy',$,'HydraulicDiameter','Hydraulic diameter.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1550=IFCSIMPLEPROPERTYTEMPLATE('2sr$nBmSHAgxkaBfte8SFq',$,'Length','The length of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1551=IFCSIMPLEPROPERTYTEMPLATE('1om21pDU9CU98j8QyLLnrJ',$,'Weight','Total weight of object',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1552=IFCSIMPLEPROPERTYTEMPLATE('1pBxvaq7DFjg11ac56hKKh',$,'AirFlowRateRange','Possible range of airflow that can be delivered.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1553=IFCSIMPLEPROPERTYTEMPLATE('3rba7818v3hQ5WXdQyeHAP',$,'WorkingPressureRange','Allowable minimum and maximum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1554=IFCSIMPLEPROPERTYTEMPLATE('1pOjd6zA15FRcvPnHgaA8A',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1555=IFCSIMPLEPROPERTYTEMPLATE('18Ox2wu7H4iw3vFrtdIHUU',$,'HasExteriorInsulation','TRUE if the silencer has exterior insulation. FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1556=IFCPROPERTYSETTEMPLATE('3Y5g6EpCHDcRfI$FW8PfOk',$,'Pset_ElectricalDeviceCommon','A collection of properties that are commonly used by electrical device types.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionElement,IfcDistributionElementType',(#1557,#1558,#1559,#1560,#1561,#1563,#1564,#1565,#1567,#1568,#1569,#1570,#1571,#1572,#1573)); -#1557=IFCSIMPLEPROPERTYTEMPLATE('0NKyxOCPXDs9NuobAEbqCO',$,'RatedCurrent','The current that a device is designed to handle.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1558=IFCSIMPLEPROPERTYTEMPLATE('0U6_HlF$P2dw3qHFrxqBqZ',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1559=IFCSIMPLEPROPERTYTEMPLATE('0bOKKqQ3j4DBPY5OlrMU2v',$,'NominalFrequencyRange','The upper and lower limits of frequency for which the operation of the device is certified.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#1560=IFCSIMPLEPROPERTYTEMPLATE('2D_MONuOz9sPzmFDmHhZGf',$,'PowerFactor','Power factor; usually as ratio.\X2\000A000A\X0\The ratio between the rated electrical power and the product of the rated current and rated voltage',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1561=IFCSIMPLEPROPERTYTEMPLATE('2X4BBZBen2ou__SF8Xu6cJ',$,'ConductorFunction','Indicates function of the conductors to which the load is connected. Where L1, L2 and L3 represent the phase lines according to IEC 60446 notation (sometimes phase lines may be referenced by color [Red, Blue, Yellow] or by number [1, 2, 3] etc). Protective Earth is sometimes also known as CPC or common protective conductor. Note that for an electrical device, a set of line conductor functions may be applied.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1562,$,$,$,.READWRITE.); -#1562=IFCPROPERTYENUMERATION('PEnum_ConductorFunctionEnum',(IFCLABEL('NEUTRAL'),IFCLABEL('PHASE_L1'),IFCLABEL('PHASE_L2'),IFCLABEL('PHASE_L3'),IFCLABEL('PROTECTIVEEARTH'),IFCLABEL('PROTECTIVEEARTHNEUTRAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1563=IFCSIMPLEPROPERTYTEMPLATE('2qISl8DOL6VeqW$CyHJf$v',$,'NumberOfPoles','Number of poles that the object would affect.\X2\000A000A\X0\The number of live lines that is intended to be handled by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1564=IFCSIMPLEPROPERTYTEMPLATE('0JH$5dZnr8uw9Nz7rFGoeA',$,'HasProtectiveEarth','Indicates whether the object has a protective earth connection (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1565=IFCSIMPLEPROPERTYTEMPLATE('3heqP$KYXBRe4Wl77fd_2m',$,'InsulationStandardClass','Insulation standard classes provides basic protection information against electric shock. Defines levels of insulation required in terms of constructional requirements (creepage and clearance distances) and electrical requirements (compliance with electric strength tests). Basic insulation is considered to be shorted under single fault conditions. The actual values required depend on the working voltage to which the insulation is subjected, as well as other factors. Also indicates whether the electrical device has a protective earth connection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1566,$,$,$,.READWRITE.); -#1566=IFCPROPERTYENUMERATION('PEnum_InsulationStandardClass',(IFCLABEL('CLASS0APPLIANCE'),IFCLABEL('CLASS0IAPPLIANCE'),IFCLABEL('CLASSIAPPLIANCE'),IFCLABEL('CLASSIIAPPLIANCE'),IFCLABEL('CLASSIIIAPPLIANCE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1567=IFCSIMPLEPROPERTYTEMPLATE('19D2yR0nXEcwdkPIriN3tq',$,'IP_Code','IP Code, the International Protection Marking, IEC 60529), classifies and rates the degree of protection provided against intrusion.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1568=IFCSIMPLEPROPERTYTEMPLATE('2h30b9LLX8b9K14Q9NeCIT',$,'IK_Code','IK Code according to IEC 62262 (2002) is a numeric classification for the degree of protection provided by enclosures for electrical equipment against external mechanical impacts.NOTE In earlier labeling, the third numeral (1..) had been occasionally added to the closely related IP Code on ingress protection, to indicate the level of impact protection.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1569=IFCSIMPLEPROPERTYTEMPLATE('2v2EGGJXn5yhSuwd2QRJky',$,'EarthingStyle','Indicates the earthing style of the electric device.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1570=IFCSIMPLEPROPERTYTEMPLATE('05mJh0T152Sgz0oKIbH6ss',$,'HeatDissipation','Indicates the heat dissipation of the electric device measured in power.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1571=IFCSIMPLEPROPERTYTEMPLATE('2xT3MElrH3OOj0aEvx4xoS',$,'Power','The actual power and operable range.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1572=IFCSIMPLEPROPERTYTEMPLATE('0LFc$j36T0W8v5Y9JFvgR5',$,'NominalPowerConsumption','Nominal total power consumption.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1573=IFCSIMPLEPROPERTYTEMPLATE('2yIP01efP9Hwnu4v6ruueD',$,'NumberOfPowerSupplyPorts','Indicates the number of power supply ports of the electric device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#1574=IFCPROPERTYSETTEMPLATE('3lqBCmx6XDcBu35db1Jejg',$,'Pset_ElectricalDeviceCompliance','Properties related to information about compliance to standards or regulations of electric devices.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionElement,IfcDistributionElementType',(#1575,#1576,#1577,#1578)); -#1575=IFCSIMPLEPROPERTYTEMPLATE('3lhX6Lts9BDeoz6o1H$rbc',$,'ElectroMagneticStandardsCompliance','Information about compliance with regard to electro magnetic related standards.',.P_TABLEVALUE.,'IfcLabel','IfcBoolean',$,$,$,$,.READWRITE.); -#1576=IFCSIMPLEPROPERTYTEMPLATE('3Eo2EjcGvAxBIJJW1_gAAN',$,'ExplosiveAtmosphereStandardsCompliance','Information about compliance with regard to explosive atmosphere related standards.',.P_TABLEVALUE.,'IfcLabel','IfcBoolean',$,$,$,$,.READWRITE.); -#1577=IFCSIMPLEPROPERTYTEMPLATE('1tOWoyY4rC88GpsobxQ64C',$,'FireProofingStandardsCompliance','Information about compliance with regard to fire proofing related standards.',.P_TABLEVALUE.,'IfcLabel','IfcBoolean',$,$,$,$,.READWRITE.); -#1578=IFCSIMPLEPROPERTYTEMPLATE('3Ph9Hel9b0k8a7hKi821NN',$,'LightningProtectionStandardsCompliance','Information about compliance with regard to lightning protection related standards.',.P_TABLEVALUE.,'IfcLabel','IfcBoolean',$,$,$,$,.READWRITE.); -#1579=IFCPROPERTYSETTEMPLATE('3IZdp2s_f3BejbBapUHFd0',$,'Pset_ElectricalFeederLine','Properties of conductors used as feeder line. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type CONDUCTORSEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CONDUCTORSEGMENT,IfcCableSegmentType/CONDUCTORSEGMENT',(#1580,#1581,#1582,#1583)); -#1580=IFCSIMPLEPROPERTYTEMPLATE('0l5eO9d8r839nTsh_Lhxsh',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1581=IFCSIMPLEPROPERTYTEMPLATE('140zZt5yD2wRhns4K15c27',$,'DesignAmbientTemperature','The highest and lowest local ambient temperature likely to be encountered.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1582=IFCSIMPLEPROPERTYTEMPLATE('3$4U5U5M9CffouCBV49_ZO',$,'ElectricalClearanceDistance','The distance between two conductive parts along a string stretched the shortest way between these conductive parts. (IEV ref 441-17-31)',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1583=IFCSIMPLEPROPERTYTEMPLATE('0IFWAfv_z3SgqrNp5pS096',$,'ElectricalFeederType','Type of electrical feeder.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1584,$,$,$,.READWRITE.); -#1584=IFCPROPERTYENUMERATION('PEnum_ElectricalFeederType',(IFCLABEL('ALONGTRACKFEEDER'),IFCLABEL('BYPASSFEEDER'),IFCLABEL('NEGATIVEFEEDER'),IFCLABEL('POSITIVEFEEDER'),IFCLABEL('REINFORCINGFEEDER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1585=IFCPROPERTYSETTEMPLATE('0ToZiVPKbBM8SPA0mQ3An1',$,'Pset_ElectricAppliancePHistory','Captures realtime information for electric appliances, such as for energy usage. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcElectricAppliance',(#1586)); -#1586=IFCSIMPLEPROPERTYTEMPLATE('2a7xhKVX54bgBH6g6cmXQb',$,'PowerState','Indicates the power state of the device where True is on and False is off.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1587=IFCPROPERTYSETTEMPLATE('3TjqDFSZ5BGxh8UdxpoArR',$,'Pset_ElectricApplianceTypeCommon','Common properties for electric appliances. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricAppliance,IfcElectricApplianceType',(#1588,#1589)); -#1588=IFCSIMPLEPROPERTYTEMPLATE('0DNx$4Dm12VfzGuBrgPHOL',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1589=IFCSIMPLEPROPERTYTEMPLATE('1ykDHrFnr1zParu04wd9bw',$,'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',$,#1590,$,$,$,.READWRITE.); -#1590=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1591=IFCPROPERTYSETTEMPLATE('2YDusATXf459q36jspzajP',$,'Pset_ElectricApplianceTypeDishwasher','Common properties for dishwasher appliances. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricAppliance/DISHWASHER,IfcElectricApplianceType/DISHWASHER',(#1592)); -#1592=IFCSIMPLEPROPERTYTEMPLATE('1$v27uyhT5e8Ib5SIYzM6d',$,'DishwasherType','Type of dishwasher.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1593,$,$,$,.READWRITE.); -#1593=IFCPROPERTYENUMERATION('PEnum_ElectricApplianceDishwasherType',(IFCLABEL('BOTTLEWASHER'),IFCLABEL('CUTLERYWASHER'),IFCLABEL('DISHWASHER'),IFCLABEL('POTWASHER'),IFCLABEL('TRAYWASHER'),IFCLABEL('UNKNOWN'),IFCLABEL('OTHER'),IFCLABEL('UNSET')),$); -#1594=IFCPROPERTYSETTEMPLATE('2a$uAl7kXCxO9_3EiKa7kL',$,'Pset_ElectricApplianceTypeElectricCooker','Common properties for electric cooker appliances. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricAppliance/ELECTRICCOOKER,IfcElectricApplianceType/ELECTRICCOOKER',(#1595)); -#1595=IFCSIMPLEPROPERTYTEMPLATE('00JHy2mZLA7fmeSb_Of7UJ',$,'ElectricCookerType','Type of electric cooker.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1596,$,$,$,.READWRITE.); -#1596=IFCPROPERTYENUMERATION('PEnum_ElectricApplianceElectricCookerType',(IFCLABEL('COOKINGKETTLE'),IFCLABEL('DEEPFRYER'),IFCLABEL('OVEN'),IFCLABEL('STEAMCOOKER'),IFCLABEL('STOVE'),IFCLABEL('TILTINGFRYINGPAN'),IFCLABEL('UNKNOWN'),IFCLABEL('OTHER'),IFCLABEL('UNSET')),$); -#1597=IFCPROPERTYSETTEMPLATE('1Sg5yKHNH4d9tU1mvjjQqA',$,'Pset_ElectricFlowStorageDeviceTypeBattery','Properties of batteries. The property set can be used by the predefined type BATTERY of IfcElectricFlowStorageDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice/BATTERY,IfcElectricFlowStorageDeviceType/BATTERY',(#1598,#1599,#1600,#1601,#1602,#1604,#1605)); -#1598=IFCSIMPLEPROPERTYTEMPLATE('371LE8qUf2duUebk0uEwqi',$,'CurrentRegulationRate','It shows the ability of DC regulated power supply to suppress the fluctuation of output voltage caused by the change of load current (output current) when the input voltage is constant.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#1599=IFCSIMPLEPROPERTYTEMPLATE('21o8VSwd59rwFdxrF1LI0b',$,'NominalSupplyCurrent','The nominal current of the supply.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1600=IFCSIMPLEPROPERTYTEMPLATE('1u3b7$_sP7N9hILbn1B0Tt',$,'VoltageRegulationRate','When the input side voltage changes from the lowest allowable input value to the specified maximum value, the relative change value of the output voltage is the percentage of the rated output voltage.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#1601=IFCSIMPLEPROPERTYTEMPLATE('0fV6iy5eT9qQjjntO$oqVW',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#1602=IFCSIMPLEPROPERTYTEMPLATE('2Z23LoKQfA58rmRUV_KJ_r',$,'BatteryChargingType','Identifies the predefined types of battery charging.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1603,$,$,$,.READWRITE.); -#1603=IFCPROPERTYENUMERATION('PEnum_BatteryChargingType',(IFCLABEL('RECHARGEABLE'),IFCLABEL('SINGLECHARGE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1604=IFCSIMPLEPROPERTYTEMPLATE('2blunbngn3Lg2p9hK$St1v',$,'EncapsulationTechnologyCode','Code indicating the encapsulation technology which has been applied in an electric, electronic or electromechanical component.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1605=IFCSIMPLEPROPERTYTEMPLATE('0Ac37t2eL2ERn6AbgkckTw',$,'OpenCircuitVoltage','Voltage of a cell or battery when the discharge current is zero [Source IEC 482-03-32]',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1606=IFCPROPERTYSETTEMPLATE('2pLhi4qfP5DwJjM5swXRYd',$,'Pset_ElectricFlowStorageDeviceTypeCapacitor','Properties of capacitors. The property set can be used by the predefined type CAPACITOR of IfcElectricFlowStorageDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice/CAPACITOR,IfcElectricFlowStorageDeviceType/CAPACITOR',(#1607)); -#1607=IFCSIMPLEPROPERTYTEMPLATE('2kB6ftJCzEoBycW508ZhoO',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1608=IFCPROPERTYSETTEMPLATE('0i_1GNcEzAcOhRtZprcuHa',$,'Pset_ElectricFlowStorageDeviceTypeCommon','The characteristics of the supply associated with an electrical device occurrence acting as a source of supply to an electrical distribution system NOTE: Properties within this property set should ONLY be used in circumstances when an electrical supply is applied. The property set, the properties contained and their values are not applicable to a circumstance where the sypply is not being applied to the eletrical system or is temporarily disconnected. All properties within this property set are considered to represent a steady state situation.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice,IfcElectricFlowStorageDeviceType',(#1609,#1610,#1612,#1613,#1614,#1615,#1617,#1618,#1619,#1620,#1621,#1622,#1623,#1624,#1625,#1626,#1627,#1628,#1629,#1630,#1631)); -#1609=IFCSIMPLEPROPERTYTEMPLATE('1b19VkPhv1fhIskPzQEC5U',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1610=IFCSIMPLEPROPERTYTEMPLATE('0rPpq0OM9AvRsqLdOAoHR_',$,'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',$,#1611,$,$,$,.READWRITE.); -#1611=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1612=IFCSIMPLEPROPERTYTEMPLATE('1IGd3rzCbAYBNpiE0CH$$j',$,'NominalSupplyVoltage','The nominal voltage of the supply.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1613=IFCSIMPLEPROPERTYTEMPLATE('3VtNrSQSD4Zes5Yc9oFPge',$,'NominalSupplyVoltageOffset','The maximum and minimum allowed voltage of the supply e.g. boundaries of 380V/440V may be applied for a nominal voltage of 400V.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1614=IFCSIMPLEPROPERTYTEMPLATE('0evZ7hxtf4$OnycByLCIDx',$,'NominalFrequency','The nominal frequency of the supply.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#1615=IFCSIMPLEPROPERTYTEMPLATE('3fvvRotUzAofCgSzmcL3bS',$,'ConnectedConductorFunction','Function of the conductors to which the load is connected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1616,$,$,$,.READWRITE.); -#1616=IFCPROPERTYENUMERATION('PEnum_ConductorFunctionEnum',(IFCLABEL('NEUTRAL'),IFCLABEL('PHASE_L1'),IFCLABEL('PHASE_L2'),IFCLABEL('PHASE_L3'),IFCLABEL('PROTECTIVEEARTH'),IFCLABEL('PROTECTIVEEARTHNEUTRAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1617=IFCSIMPLEPROPERTYTEMPLATE('0NGkeQPP18nx2mYDbZm8tE',$,'ShortCircuit3PoleMaximumState','Maximum 3 pole short circuit current provided at the point of supply.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1618=IFCSIMPLEPROPERTYTEMPLATE('2f9vycmKz3lBRrLOm1ziQz',$,'ShortCircuit3PolePowerFactorMaximumState','Power factor of the maximum 3 pole short circuit current provided at the point of supply.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1619=IFCSIMPLEPROPERTYTEMPLATE('0j0gCk7JHDaRQzwGNEjeFF',$,'ShortCircuit2PoleMinimumState','Minimum 2 pole short circuit current provided at the point of supply.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1620=IFCSIMPLEPROPERTYTEMPLATE('1veF0LubTEUxR8dcoI8XfR',$,'ShortCircuit2PolePowerFactorMinimumState','Power factor of the minimum 2 pole short circuit current provided at the point of supply.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1621=IFCSIMPLEPROPERTYTEMPLATE('2fyjHrxAf4IhIdohk$lt19',$,'ShortCircuit1PoleMaximumState','Maximum 1 pole short circuit current provided at the point of supply i.e. the fault between 1 phase and N.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1622=IFCSIMPLEPROPERTYTEMPLATE('2mKviIS0r87egy50BMA5b9',$,'ShortCircuit1PolePowerFactorMaximumState','Power factor of the maximum 1 pole short circuit current provided at the point of supply i.e. the fault between 1 phase and N.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1623=IFCSIMPLEPROPERTYTEMPLATE('3PLGF4mpbC6BFrE48wKnJ3',$,'ShortCircuit1PoleMinimumState','Minimum 1 pole short circuit current provided at the point of supply i.e. the fault between 1 phase and N.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1624=IFCSIMPLEPROPERTYTEMPLATE('39jp7yFInCh9NO5RV3L_h7',$,'ShortCircuit1PolePowerFactorMinimumState','Power factor of the minimum 1 pole short circuit current provided at the point of supply i.e. the fault between 1 phase and N.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1625=IFCSIMPLEPROPERTYTEMPLATE('0d22VaT9LBiemGN5FkwbSw',$,'EarthFault1PoleMaximumState','Maximum 1 pole earth fault current provided at the point of supply i.e. the fault between 1 phase and PE/PEN.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1626=IFCSIMPLEPROPERTYTEMPLATE('3ycAgVqdzFzurx4DRrQl8v',$,'EarthFault1PolePowerFactorMaximumState','Power factor of the maximum 1 pole earth fault current provided at the point of supply i.e. the fault between 1 phase and PE/PEN.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1627=IFCSIMPLEPROPERTYTEMPLATE('3_IG7f68r5DBNA_mB2RHu8',$,'EarthFault1PoleMinimumState','Minimum 1 pole earth fault current provided at the point of supply i.e. the fault between 1 phase and PE/PEN.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1628=IFCSIMPLEPROPERTYTEMPLATE('2mHXQThMv7$OuYWj90EkKX',$,'EarthFault1PolePowerFactorMinimumState','Power factor of the minimum 1 pole earth fault current provided at the point of supply i.e. the fault between 1 phase and PE/PEN.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1629=IFCSIMPLEPROPERTYTEMPLATE('2$JhnUJfTDbQnWjWh2kGSf',$,'MaximumInsulatedVoltage','The max voltage that the insulation would operate normally',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1630=IFCSIMPLEPROPERTYTEMPLATE('1oOGw6DKPBWvCi$8UNx12m',$,'RatedCapacitance','Capacitance value determined under specified conditions and declared by the manufacturer.',.P_SINGLEVALUE.,'IfcElectricCapacitanceMeasure',$,$,$,$,$,.READWRITE.); -#1631=IFCSIMPLEPROPERTYTEMPLATE('0qmY0bfEfEgPgGImcAM$Jw',$,'PowerCapacity','Power capacity of the equipment',.P_SINGLEVALUE.,'IfcElectricChargeMeasure',$,$,$,$,$,.READWRITE.); -#1632=IFCPROPERTYSETTEMPLATE('33$m_KRI91qfjC2YqStdue',$,'Pset_ElectricFlowStorageDeviceTypeInductor','Properties of inductors. The property set can be used by the predefined type INDUCTOR of IfcElectricFlowStorageDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice/INDUCTOR,IfcElectricFlowStorageDeviceType/INDUCTOR',(#1633,#1634)); -#1633=IFCSIMPLEPROPERTYTEMPLATE('3cTN7K$bPD08UC8f2qfoZl',$,'Inductance','Measure of the Inductance.',.P_SINGLEVALUE.,'IfcInductanceMeasure',$,$,$,$,$,.READWRITE.); -#1634=IFCSIMPLEPROPERTYTEMPLATE('2bNrszc4fF78SX1ioyZIFK',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1635=IFCPROPERTYSETTEMPLATE('1io2iJrS5AJ8xKjcPQTKHc',$,'Pset_ElectricFlowStorageDeviceTypeRecharger','Properties of battery rechargers. The property set can be used by the predefined type RECHARGER of IfcElectricFlowStorageDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice/RECHARGER,IfcElectricFlowStorageDeviceType/RECHARGER',(#1636)); -#1636=IFCSIMPLEPROPERTYTEMPLATE('1MofFPDg11kwj$UCy5EFeo',$,'NominalSupplyCurrent','The nominal current of the supply.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1637=IFCPROPERTYSETTEMPLATE('3iN5czMYT2mPH6F_mkDQJI',$,'Pset_ElectricFlowStorageDeviceTypeUPS','Properties of uninterruptible power supply equipment. The property set can be used by the predefined type UPS of IfcElectricFlowStorageDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice/UPS,IfcElectricFlowStorageDeviceType/UPS',(#1638,#1639,#1640,#1641)); -#1638=IFCSIMPLEPROPERTYTEMPLATE('0MuAMVmhTF89pxnonNXjBq',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#1639=IFCSIMPLEPROPERTYTEMPLATE('2T4o1KVEL6JAAtIJ3L8UnR',$,'CurrentRegulationRate','It shows the ability of DC regulated power supply to suppress the fluctuation of output voltage caused by the change of load current (output current) when the input voltage is constant.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#1640=IFCSIMPLEPROPERTYTEMPLATE('3qIHm7x6DDz8KjOVAjtm08',$,'NominalSupplyCurrent','The nominal current of the supply.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1641=IFCSIMPLEPROPERTYTEMPLATE('37loIyZx92Se_S0fSdahCD',$,'VoltageRegulationRate','When the input side voltage changes from the lowest allowable input value to the specified maximum value, the relative change value of the output voltage is the percentage of the rated output voltage.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#1642=IFCPROPERTYSETTEMPLATE('2X26Wea5jFTxfJXWYTxCxP',$,'Pset_ElectricFlowTreatmentDeviceTypeElectronicFilter','Properties associated to electronic filter.\X2\000A\X0\An electronic filter is a device designed to transmit spectral components of signals according to a specified law, generally in order to pass the components in certain frequency bands and to attenuate those in other bands (IEC702-09-17)',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowTreatmentDevice/ELECTRONICFILTER,IfcElectricFlowTreatmentDeviceType/ELECTRONICFILTER',(#1643,#1644,#1646,#1647,#1648,#1649)); -#1643=IFCSIMPLEPROPERTYTEMPLATE('1PjjPHqEH7k9$CL4M9vC2D',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1644=IFCSIMPLEPROPERTYTEMPLATE('3ZdCOprB92h8HDixZDS1MC',$,'ElectronicFilterType','Type of electronic filter.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1645,$,$,$,.READWRITE.); -#1645=IFCPROPERTYENUMERATION('PEnum_ElectronicFilterType',(IFCLABEL('BANDPASSFLITER'),IFCLABEL('BANDSTOPFILTER'),IFCLABEL('FILTERCAPACITOR'),IFCLABEL('HARMONICFILTER'),IFCLABEL('HIGHPASSFILTER'),IFCLABEL('LOWPASSFILTER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1646=IFCSIMPLEPROPERTYTEMPLATE('14t6UZMO15vBzaGxe34vLL',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1647=IFCSIMPLEPROPERTYTEMPLATE('1fVD4H46j6ggiy0CEQWuLQ',$,'PrimaryFrequency','The frequency that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#1648=IFCSIMPLEPROPERTYTEMPLATE('2yrR4bRhr2Yv27sIWp4Uo7',$,'SecondaryFrequency','The frequency that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#1649=IFCSIMPLEPROPERTYTEMPLATE('3U6y3PGUz6QBhQbSoQTLxX',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1650=IFCPROPERTYSETTEMPLATE('0nA3ojNiX4CeQrQJya0zUy',$,'Pset_ElectricGeneratorTypeCommon','Defines a particular type of engine that is a machine for converting mechanical energy into electrical energy.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricGenerator,IfcElectricGeneratorType',(#1651,#1652,#1654,#1655,#1656)); -#1651=IFCSIMPLEPROPERTYTEMPLATE('3eHs3Ud9L26RhgKp5Cileh',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1652=IFCSIMPLEPROPERTYTEMPLATE('0pOkR7mq50qBuoVsuRdlsj',$,'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',$,#1653,$,$,$,.READWRITE.); -#1653=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1654=IFCSIMPLEPROPERTYTEMPLATE('3MM3i_QXT7eQ9sZIHOzibi',$,'ElectricGeneratorEfficiency','The ratio of output capacity to intake capacity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1655=IFCSIMPLEPROPERTYTEMPLATE('1FZtqGR6rD6f$iJJ_enMV_',$,'StartCurrentFactor','IEC. Start current factor defines how large the peak starting current will become on the engine. StartCurrentFactor is multiplied to NominalCurrent and to give the start current.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1656=IFCSIMPLEPROPERTYTEMPLATE('0f_qXvb_L7aPU5RfXJS74G',$,'MaximumPowerOutput','The maximum output power rating of the engine.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1657=IFCPROPERTYSETTEMPLATE('3OpJmNxUv2W9ErNk8H3ty7',$,'Pset_ElectricMotorTypeCommon','Defines a particular type of engine that is a machine for converting electrical energy into mechanical energy. Note that in cases where a close coupled or monobloc pump or close coupled fan is being driven by the motor, the motor may itself be considered to be directly part of the pump or fan. In this case , motor information may need to be specified directly at the pump or fan and not througfh separate motor/motor connection entities. NOTE: StartingTime and TeTime added at IFC4',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricMotor,IfcElectricMotorType',(#1658,#1659,#1661,#1662,#1663,#1664,#1665,#1666,#1667,#1669,#1670,#1671)); -#1658=IFCSIMPLEPROPERTYTEMPLATE('0Fb0e5lsz3hBW1SziazgFY',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1659=IFCSIMPLEPROPERTYTEMPLATE('1ckOLnM5rFlhahtu_9b$5i',$,'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',$,#1660,$,$,$,.READWRITE.); -#1660=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1661=IFCSIMPLEPROPERTYTEMPLATE('3KtNsJxc1DMhGg$jgVtL$I',$,'MaximumPowerOutput','The maximum output power rating of the engine.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1662=IFCSIMPLEPROPERTYTEMPLATE('3Dxz4ub0X0a8ed1ztE67bA',$,'ElectricMotorEfficiency','The ratio of output capacity to intake capacity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1663=IFCSIMPLEPROPERTYTEMPLATE('045v6rA3H8VAeQtuo9732_',$,'StartCurrentFactor','IEC. Start current factor defines how large the peak starting current will become on the engine. StartCurrentFactor is multiplied to NominalCurrent and to give the start current.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1664=IFCSIMPLEPROPERTYTEMPLATE('2$Lwy89yf9RAWQbo3vPOTU',$,'StartingTime','The time (in s) needed for the motor to reach its rated speed with its driven equipment attached, starting from standstill and at the nominal voltage applied at its terminals.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#1665=IFCSIMPLEPROPERTYTEMPLATE('366akyPqP3RPCo4E6V4XZz',$,'TeTime','The maximum time (in s) at which the motor could run with locked rotor when the motor is used in an EX-environment. The time indicates that a protective device should trip before this time when the starting current of the motor is slowing through the device.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#1666=IFCSIMPLEPROPERTYTEMPLATE('3WlqfQC4TDg84zEfQculJ2',$,'LockedRotorCurrent','Input current when a motor armature is energized but not rotating.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1667=IFCSIMPLEPROPERTYTEMPLATE('2K5hs2PPv0Ev4QU26PupDf',$,'MotorEnclosureType','A list of the available types of motor enclosure from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1668,$,$,$,.READWRITE.); -#1668=IFCPROPERTYENUMERATION('PEnum_MotorEnclosureType',(IFCLABEL('OPENDRIPPROOF'),IFCLABEL('TOTALLYENCLOSEDAIROVER'),IFCLABEL('TOTALLYENCLOSEDFANCOOLED'),IFCLABEL('TOTALLYENCLOSEDNONVENTILATED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1669=IFCSIMPLEPROPERTYTEMPLATE('2lC1TKUefDDPNxp4Ql$fWk',$,'FrameSize','Designation of the frame size according to the named range of frame sizes designated at the place of use or according to a given standard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1670=IFCSIMPLEPROPERTYTEMPLATE('2AiXf8sKT3XAaqcqm_zHW4',$,'IsGuarded','Indication of whether the motor enclosure is guarded (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1671=IFCSIMPLEPROPERTYTEMPLATE('0ljscus658LgQedyuvZAN7',$,'HasPartWinding','Indication of whether the motor is single speed, i.e. has a single winding (= FALSE) or multi-speed i.e.has part winding (= TRUE) .',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1672=IFCPROPERTYSETTEMPLATE('19UUeQHC9FMOchefFE0$wk',$,'Pset_ElectricTimeControlTypeCommon','Common properties for electric time control devices. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricTimeControl,IfcElectricTimeControlType',(#1673,#1674)); -#1673=IFCSIMPLEPROPERTYTEMPLATE('2jZLswiyHDW8bhQ2IbYo2u',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1674=IFCSIMPLEPROPERTYTEMPLATE('0X5Z8cRu9CE9J1b8OL8jgb',$,'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',$,#1675,$,$,$,.READWRITE.); +#791=IFCSIMPLEPROPERTYTEMPLATE('3O0M5CPbvF89DADvDc8XsP',$,'OutputSignalType','The type of the output signal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#792,$,$,$,.READWRITE.); +#792=IFCPROPERTYENUMERATION('PEnum_InputOutputSignalType',(IFCLABEL('CURRENT'),IFCLABEL('VOLTAGE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#793=IFCPROPERTYSETTEMPLATE('3k4Nup931Bk8AqglP3JpAc',$,'Pset_CommunicationsApplianceTypeCommon','Common properties for communications appliances. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance,IfcCommunicationsApplianceType',(#794,#795)); +#794=IFCSIMPLEPROPERTYTEMPLATE('0Y45nBrNfDJA7Vt9SMksHx',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#795=IFCSIMPLEPROPERTYTEMPLATE('3_IF3H1Hz5bPrvXtxz8$4j',$,'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',$,#796,$,$,$,.READWRITE.); +#796=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#797=IFCPROPERTYSETTEMPLATE('1NGzGiyvT9Ag$kx2Ejorom',$,'Pset_CommunicationsApplianceTypeComputer','Properties common to a computer. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type of COMPUTER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/COMPUTER,IfcCommunicationsApplianceType/COMPUTER',(#798,#799)); +#798=IFCSIMPLEPROPERTYTEMPLATE('0omVqQYmHBwgLt07jjRDZy',$,'StorageCapacity','Indicates the total data storage capacity of the device. It is defined by bytes.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#799=IFCSIMPLEPROPERTYTEMPLATE('29hL1Xvj1DDe1bedhLT$FI',$,'UserInterfaceType','Indicates the user interface of the computer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#800,$,$,$,.READWRITE.); +#800=IFCPROPERTYENUMERATION('PEnum_ComputerUIType',(IFCLABEL('CLI'),IFCLABEL('GUI'),IFCLABEL('TOUCHSCREEN'),IFCLABEL('TOUCHTONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#801=IFCPROPERTYSETTEMPLATE('3$$XGp$bz6ZfsxjEItTtAP',$,'Pset_CommunicationsApplianceTypeGateway','Properties common to a gateway. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type of GATEWAY.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/GATEWAY,IfcCommunicationsApplianceType/GATEWAY',(#802)); +#802=IFCSIMPLEPROPERTYTEMPLATE('1x$6xB9G12f9Cb56IHl8_9',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#803=IFCPROPERTYSETTEMPLATE('3JNxq7NrD5iRKWzz2psuo7',$,'Pset_CommunicationsApplianceTypeIntelligentPeripheral','Properties common to a intelligent peripheral. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type of INTELLIGENT_PERIPHERAL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/INTELLIGENTPERIPHERAL,IfcCommunicationsApplianceType/INTELLIGENTPERIPHERAL',(#804)); +#804=IFCSIMPLEPROPERTYTEMPLATE('0UMS5rjnPFifnXqcRu1F7s',$,'UserCapacity','Indicates the user capacity of the device, defined as the maximum number of users that can be active at the same time.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#805=IFCPROPERTYSETTEMPLATE('1ze6g4AVX7ogQiYMXy4CWv',$,'Pset_CommunicationsApplianceTypeIpNetworkEquipment','Properties common to a IP network equipment. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type of IP_NETWORK_EQUIPMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/IPNETWORKEQUIPMENT,IfcCommunicationsApplianceType/IPNETWORKEQUIPMENT',(#806,#807,#808,#809,#810,#811)); +#806=IFCSIMPLEPROPERTYTEMPLATE('2d7rHfItXFDg0FBCIk2h7O',$,'NumberOfSlots','Indicates the number of slots.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#807=IFCSIMPLEPROPERTYTEMPLATE('07aoPZrTL2Ne47kk1R27h4',$,'EquipmentCapacity','Indicates the equipment capacity of the appliance. The value is defined in bits/s.',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); +#808=IFCSIMPLEPROPERTYTEMPLATE('0KrR2fh$XCsPVZ_w8qHAlN',$,'NumberOfCoolingFans','Indicates the number of cooling fans in the equipment.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#809=IFCSIMPLEPROPERTYTEMPLATE('02KX8S5C93WBpWZkO5gor5',$,'SupportedProtocol','Indicates the protocol supported by the IP network equipment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#810=IFCSIMPLEPROPERTYTEMPLATE('1LH_8DCHP5B8KR_vrMwsp4',$,'ManagingSoftware','Indicates the type of software responsible for managing the equipment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#811=IFCSIMPLEPROPERTYTEMPLATE('1afh3Hebf3KeJMYzXaZXPJ',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#812=IFCPROPERTYSETTEMPLATE('2qu$Fd25983OXVrbjzARL8',$,'Pset_CommunicationsApplianceTypeModem','Properties common to a modem. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type MODEM.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/MODEM,IfcCommunicationsApplianceType/MODEM',(#813,#814,#815,#817)); +#813=IFCSIMPLEPROPERTYTEMPLATE('0ge809KYHFTAxVfPLrT4aq',$,'NumberOfCommonInterfaces','Indicates the number of common interfaces on the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#814=IFCSIMPLEPROPERTYTEMPLATE('2B$HNSw417LPZ2AxrkGp0K',$,'NumberOfTrafficInterfaces','Indicates the number of traffic interfaces on the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#815=IFCSIMPLEPROPERTYTEMPLATE('2Qz_UpZuD9s9a8byeYbLqu',$,'CommonInterfaceType','Indicates the type of the device common interfaces.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#816,$,$,$,.READWRITE.); +#816=IFCPROPERTYENUMERATION('PEnum_CommonInterfaceType',(IFCLABEL('DRYCONTACTSINTERFACE'),IFCLABEL('MANAGEMENTINTERFACE'),IFCLABEL('OTHER_IO_INTERFACE'),IFCLABEL('SYNCHRONIZATIONINTERFACE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#817=IFCSIMPLEPROPERTYTEMPLATE('0UKLwCXbL7wRyE1BzijHMt',$,'TrafficInterfaceType','Indicates the type of the device traffic interfaces.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#818,$,$,$,.READWRITE.); +#818=IFCPROPERTYENUMERATION('PEnum_ModemTrafficInterfaceType',(IFCLABEL('E1'),IFCLABEL('FASTETHERNET'),IFCLABEL('XDSL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#819=IFCPROPERTYSETTEMPLATE('1NdrUqQJP3meF5kB9xrFXN',$,'Pset_CommunicationsApplianceTypeOpticalLineTerminal','Properties common to a optical line terminal. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type OPTICALLINETERMINAL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/OPTICALLINETERMINAL,IfcCommunicationsApplianceType/OPTICALLINETERMINAL',(#820,#821)); +#820=IFCSIMPLEPROPERTYTEMPLATE('3dB06b$I1CkvQOxFmX_$Ee',$,'NumberOfSlots','Indicates the number of slots.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#821=IFCSIMPLEPROPERTYTEMPLATE('2BLyRsWz9DnhKrD2uN6pTw',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#822=IFCPROPERTYSETTEMPLATE('1wuEM_xL9BSgtmvVO0kn7f',$,'Pset_CommunicationsApplianceTypeOpticalNetworkUnit','Properties common to a optical network unit. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type OPTICAL_NETWORK_UNIT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/OPTICALNETWORKUNIT,IfcCommunicationsApplianceType/OPTICALNETWORKUNIT',(#823,#825)); +#823=IFCSIMPLEPROPERTYTEMPLATE('0Pez2Fjkv9sun4rJUlFaDy',$,'OpticalNetworkUnitType','Indicates the type of the optical network unit equipment.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#824,$,$,$,.READWRITE.); +#824=IFCPROPERTYENUMERATION('PEnum_OpticalNetworkUnitType',(IFCLABEL('ACTIVE'),IFCLABEL('PASSIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#825=IFCSIMPLEPROPERTYTEMPLATE('2DvEcPgHTEtv6p5JDXtwwG',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#826=IFCPROPERTYSETTEMPLATE('17redGCiz2ePTuMTNsoWqI',$,'Pset_CommunicationsApplianceTypeTelecommand','Properties common to a telecommand. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type TELECOMMAND.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/TELECOMMAND,IfcCommunicationsApplianceType/TELECOMMAND',(#827,#828)); +#827=IFCSIMPLEPROPERTYTEMPLATE('1_Qvsp4oj1xhOcC7A4Njhg',$,'NumberOfWorkstations','Indicates the types or purposes of workstations and their number in the equipment. The defined purpose can be e.g. ''Diagnostic and maintenance'', ''Traffic and electric traction'', etc.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#828=IFCSIMPLEPROPERTYTEMPLATE('3j6vEMpzL4sR5ZupZDAy3s',$,'NumberOfCPUs','The number of CPUs used by the equipment.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#829=IFCPROPERTYSETTEMPLATE('0biefTfu93kP9ukeBN$g2y',$,'Pset_CommunicationsApplianceTypeTelephonyExchange','Properties common to a telephony exchange. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type TELEPHONYEXCHANGE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/TELEPHONYEXCHANGE,IfcCommunicationsApplianceType/TELEPHONYEXCHANGE',(#830)); +#830=IFCSIMPLEPROPERTYTEMPLATE('1$qk0kAwPBmRzhPQ8iLWrc',$,'UserCapacity','Indicates the user capacity of the device, defined as the maximum number of users that can be active at the same time.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#831=IFCPROPERTYSETTEMPLATE('37vrXiA$DCBeOmK9ojDwz8',$,'Pset_CommunicationsApplianceTypeTransportEquipment','Properties common to a transport equipment. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type TRANSPORTEQUIPMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/TRANSPORTEQUIPMENT,IfcCommunicationsApplianceType/TRANSPORTEQUIPMENT',(#832,#833,#834,#835,#837)); +#832=IFCSIMPLEPROPERTYTEMPLATE('3WMQPNjcP9HwOP8oPRTghA',$,'IsUpgradable','Indicates whether the transport equipment can be upgraded or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#833=IFCSIMPLEPROPERTYTEMPLATE('1VlbRew$nAseUtIkd2FU2t',$,'ElectricalCrossCapacity','Indicates the electrical cross capacity of the transport equipment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#834=IFCSIMPLEPROPERTYTEMPLATE('2iQQqi6jP7te69cscSIylp',$,'NumberOfSlots','Indicates the number of slots.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#835=IFCSIMPLEPROPERTYTEMPLATE('0BLo6cGoz90O8UAjnMpLeU',$,'TransportEquipmentType','Indicates the type of transport equipment.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#836,$,$,$,.READWRITE.); +#836=IFCPROPERTYENUMERATION('PEnum_TransportEquipmentType',(IFCLABEL('MPLS_TP'),IFCLABEL('OTN'),IFCLABEL('PDH'),IFCLABEL('SDH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#837=IFCSIMPLEPROPERTYTEMPLATE('2zEpzbGLHCtOhCNXLC6TBv',$,'TransportEquipmentAssemblyType','Indicates the type of transport equipment assembly.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#838,$,$,$,.READWRITE.); +#838=IFCPROPERTYENUMERATION('PEnum_TransportEquipmentAssemblyType',(IFCLABEL('FIXEDCONFIGURATION'),IFCLABEL('MODULARCONFIGURATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#839=IFCPROPERTYSETTEMPLATE('03gAHWm5TBS9wF_lQO0f5n',$,'Pset_CompressorPHistory','Compressor performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcCompressor',(#840,#841,#842,#843,#844,#845,#846,#847,#848,#849,#850,#851,#852,#853)); +#840=IFCSIMPLEPROPERTYTEMPLATE('3tmgbVunXEFx_OYAdU0c45',$,'CompressorCapacity','The product of the ideal capacity and the overall volumetric efficiency of the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#841=IFCSIMPLEPROPERTYTEMPLATE('1ARZCSDlr24e4lulHL7ZoJ',$,'EnergyEfficiencyRatio','Energy efficiency ratio (EER).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#842=IFCSIMPLEPROPERTYTEMPLATE('1oExYZgIHDYRqK5AmiIs30',$,'CoefficientOfPerformance','The Coefficient of performance (COP) is the ratio of heat removed to energy input.\X2\000A\X0\The energy input may be obtained by multiplying\X2\000A\X0\Pset_DistributionPortPHistoryGas.FlowRate on the ''Fuel'' port of the IfcChiller by Pset_MaterialFuel.LowerHeatingValue.\X2\000A\X0\The IfcDistributionPort for fuel has an associated IfcMaterial with fuel properties and is assigned to an IfcPerformanceHistory object nested within this IfcPerformanceHistory object.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#843=IFCSIMPLEPROPERTYTEMPLATE('32Dt8dPTf86uLXd4IVrzbA',$,'VolumetricEfficiency','Ratio of the actual volume of gas entering the compressor to the theoretical displacement of the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#844=IFCSIMPLEPROPERTYTEMPLATE('2HiB1oyJbEyR1okWy3lf0L',$,'CompressionEfficiency','Ratio of the work required for isentropic compression of the gas to the work delivered to the gas within the compression volume (as obtained by measurement).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#845=IFCSIMPLEPROPERTYTEMPLATE('2mVVmqqyjFzxSmfLNzC8HD',$,'MechanicalEfficiency','The objects operational mechanical efficiency.\X2\000A000A\X0\Ratio of the work (as measured) delivered to the gas to the work input to the compressor shaft.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#846=IFCSIMPLEPROPERTYTEMPLATE('2rWJeCfYnCYhC494H1DImD',$,'IsentropicEfficiency','Ratio of the work required for isentropic compression of the gas to work input to the compressor shaft.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#847=IFCSIMPLEPROPERTYTEMPLATE('2BIIRb3x58n8yrlKPeVdL5',$,'CompressorTotalEfficiency','Ratio of the thermal cooling capacity to electrical input.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#848=IFCSIMPLEPROPERTYTEMPLATE('3Xph$_qTb4ngzv0Q3Y$rLu',$,'ShaftPower','The actual shaft power input to the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#849=IFCSIMPLEPROPERTYTEMPLATE('3wN01MxCX1OPQOLPedMNbf',$,'InputPower','Input power to the compressor motor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#850=IFCSIMPLEPROPERTYTEMPLATE('3ibQFhXOrBjOnrQ73EceHa',$,'LubricantPumpHeatGain','Lubricant pump heat gain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#851=IFCSIMPLEPROPERTYTEMPLATE('0KtCPlcXn0khq67Umzg8uS',$,'FrictionHeatGain','Friction heat gain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#852=IFCSIMPLEPROPERTYTEMPLATE('1s1oneCFX8CAvlRnm4Ey_F',$,'CompressorTotalHeatGain','Compressor total heat gain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#853=IFCSIMPLEPROPERTYTEMPLATE('1TTgM5I4r2vAYu4uH4RUhM',$,'FullLoadRatio','Ratio of actual power to full load power as a quadratic function of part load, at certain condensing and evaporating temperature, FracFullLoadPower = f ( PartLoadRatio).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#854=IFCPROPERTYSETTEMPLATE('1cPskmZNX3VR_CRNUCPyOp',$,'Pset_CompressorTypeCommon','Compressor type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCompressor,IfcCompressorType',(#855,#856,#858,#860,#862,#863,#864,#865,#866,#867,#868,#869)); +#855=IFCSIMPLEPROPERTYTEMPLATE('0fzxhEvm5EoR5AaWKzFQ0G',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#856=IFCSIMPLEPROPERTYTEMPLATE('0ucwHUQSj7gQAZYJNheJPE',$,'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',$,#857,$,$,$,.READWRITE.); +#857=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#858=IFCSIMPLEPROPERTYTEMPLATE('2s9wpcDSD8NhZ0hOMLelSM',$,'PowerSource','Type of power driving the compressor.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#859,$,$,$,.READWRITE.); +#859=IFCPROPERTYENUMERATION('PEnum_CompressorTypePowerSource',(IFCLABEL('ENGINEDRIVEN'),IFCLABEL('GASTURBINE'),IFCLABEL('MOTORDRIVEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#860=IFCSIMPLEPROPERTYTEMPLATE('3oNNwfqNvEu9OaJ1ITTQrF',$,'RefrigerantClass','Refrigerant class used by the object.\X2\000A\X0\CFC: Chlorofluorocarbons.\X2\000A\X0\HCFC: Hydrochlorofluorocarbons.\X2\000A\X0\HFC: Hydrofluorocarbons.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#861,$,$,$,.READWRITE.); +#861=IFCPROPERTYENUMERATION('PEnum_RefrigerantClass',(IFCLABEL('AMMONIA'),IFCLABEL('CFC'),IFCLABEL('CO2'),IFCLABEL('H2O'),IFCLABEL('HCFC'),IFCLABEL('HFC'),IFCLABEL('HYDROCARBONS'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#862=IFCSIMPLEPROPERTYTEMPLATE('1_zIxySBHET9C6skPF1Szl',$,'MinimumPartLoadRatio','Minimum part load ratio as a fraction of nominal capacity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#863=IFCSIMPLEPROPERTYTEMPLATE('29v6IeMyr7JQiMPyFzEaAX',$,'MaximumPartLoadRatio','Maximum part load ratio as a fraction of nominal capacity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#864=IFCSIMPLEPROPERTYTEMPLATE('1NVDAgMPn7mxfjkeicvpEm',$,'CompressorSpeed','Compressor speed.',.P_SINGLEVALUE.,'IfcRotationalFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#865=IFCSIMPLEPROPERTYTEMPLATE('1wSFXvAO50qeu_3Gl2FkKZ',$,'NominalCapacity','The total nominal or volumetric capacity of the object.\X2\000A000A\X0\Compressor nameplate capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#866=IFCSIMPLEPROPERTYTEMPLATE('1xOubpRv14Og5aA0gyma7C',$,'IdealCapacity','Compressor capacity under ideal conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#867=IFCSIMPLEPROPERTYTEMPLATE('3P1u4VqX57ZAbtUFX2HIvS',$,'IdealShaftPower','Compressor shaft power under ideal conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#868=IFCSIMPLEPROPERTYTEMPLATE('3riKw9TYb70BQDKqhDw6Ht',$,'HasHotGasBypass','Whether or not hot gas bypass is provided for the compressor. TRUE = Yes, FALSE = No.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#869=IFCSIMPLEPROPERTYTEMPLATE('3IDW5EgGPBmwmGszPyrvh0',$,'ImpellerDiameter','Diameter of object - used to scale performance of geometrically similar objects.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#870=IFCPROPERTYSETTEMPLATE('2pkE$oqdj4hPcKhGff8SmM',$,'Pset_ConcreteElementGeneral','General properties common to different types of concrete elements, including reinforced concrete elements. The property set can be used by a number of subtypes of IfcBuiltElement, indicated that such element is designed or constructed using a concrete construction method.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBeam,IfcBuildingElementProxy,IfcChimney,IfcCivilElement,IfcColumn,IfcFooting,IfcMember,IfcPile,IfcPlate,IfcRailing,IfcRampFlight,IfcRamp,IfcRoof,IfcSlab,IfcStairFlight,IfcStair,IfcWall,IfcBeamType,IfcBuildingElementProxyType,IfcChimneyType,IfcCivilElementType,IfcColumnType,IfcFootingType,IfcMemberType,IfcPileType,IfcPlateType,IfcRailingType,IfcRampFlightType,IfcRampType,IfcRoofType,IfcSlabType,IfcStairFlightType,IfcStairType,IfcWallType',(#871,#873,#875,#876,#877,#878,#879,#880,#881,#882,#883,#884,#885)); +#871=IFCSIMPLEPROPERTYTEMPLATE('3pMxfX6ljCKQ4a4edKDx2p',$,'AssemblyPlace','Enumeration defining where the assembly is intended to take place, either in a factory, other offsite location or on the building site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#872,$,$,$,.READWRITE.); +#872=IFCPROPERTYENUMERATION('PEnum_AssemblyPlace',(IFCLABEL('FACTORY'),IFCLABEL('OFFSITE'),IFCLABEL('SITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#873=IFCSIMPLEPROPERTYTEMPLATE('130dhEByTEeOjbhszIO2Ss',$,'CastingMethod','The method of casting the concrete into its designed form.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#874,$,$,$,.READWRITE.); +#874=IFCPROPERTYENUMERATION('PEnum_ConcreteCastingMethod',(IFCLABEL('INSITU'),IFCLABEL('MIXED'),IFCLABEL('PRECAST'),IFCLABEL('PRINTED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#875=IFCSIMPLEPROPERTYTEMPLATE('1LCHsgRm9Ba8SrN8rQ_ZE_',$,'StructuralClass','The structural class defined for the concrete structure (e.g. ''1'').',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#876=IFCSIMPLEPROPERTYTEMPLATE('162UuKc6D1i8aM5NAdNYm4',$,'StrengthClass','Classification of the concrete strength in accordance with the concrete design code which is applied in the project.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#877=IFCSIMPLEPROPERTYTEMPLATE('1WrwMB_QD9MQVQUc6sppcq',$,'ExposureClass','Classification of exposure to environmental conditions, usually specified in accordance with the concrete design code which is applied in the project.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#878=IFCSIMPLEPROPERTYTEMPLATE('3L3GCZeCj7484nEsqcrNUl',$,'ReinforcementVolumeRatio','The required ratio of the effective mass of the reinforcement to the effective volume of the concrete of a reinforced concrete structural element.',.P_SINGLEVALUE.,'IfcMassDensityMeasure',$,$,$,$,$,.READWRITE.); +#879=IFCSIMPLEPROPERTYTEMPLATE('2GrnewJBD2pRehVzhyJ9T$',$,'ReinforcementAreaRatio','The required ratio of the effective area of the reinforcement to the effective area of the concrete At any section of a reinforced concrete structural element.',.P_SINGLEVALUE.,'IfcAreaDensityMeasure',$,$,$,$,$,.READWRITE.); +#880=IFCSIMPLEPROPERTYTEMPLATE('133nC0Ksr2GuG1s$UyT34k',$,'DimensionalAccuracyClass','Classification designation of the dimensional accuracy requirement according to local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#881=IFCSIMPLEPROPERTYTEMPLATE('0yb8g6lM1C5ARCfrg$Ptmh',$,'ConstructionToleranceClass','Classification designation of the on-site construction tolerances according to local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#882=IFCSIMPLEPROPERTYTEMPLATE('1kkjYTXyP779b53EI6Zu$r',$,'ConcreteCover','The protective concrete cover at the reinforcing bars according to local building regulations.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#883=IFCSIMPLEPROPERTYTEMPLATE('1wMSZZHynF0e2huxA9YFry',$,'ConcreteCoverAtMainBars','The protective concrete cover at the main reinforcing bars according to local building regulations.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#884=IFCSIMPLEPROPERTYTEMPLATE('2nseC3QUj43ObGNRNHZkMN',$,'ConcreteCoverAtLinks','The protective concrete cover at the reinforcement links according to local building regulations.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#885=IFCSIMPLEPROPERTYTEMPLATE('3G8rVbxnv7Sx$YWtF82rHn',$,'ReinforcementStrengthClass','Classification of the reinforcement strength in accordance with the concrete design code which is applied in the project. The reinforcing strength class often combines strength and ductility.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#886=IFCPROPERTYSETTEMPLATE('11YO69ZQvEIhqPowMKMtst',$,'Pset_CondenserPHistory','Condenser performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcCondenser',(#887,#888,#889,#890,#891,#892,#893,#894,#895,#896,#897)); +#887=IFCSIMPLEPROPERTYTEMPLATE('0P_LCSee174BfblllXvsMw',$,'HeatRejectionRate','Sum of the refrigeration effect and the heat equivalent of the power input to the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#888=IFCSIMPLEPROPERTYTEMPLATE('3rJxfABp17WvYZQDmZs4yB',$,'ExteriorHeatTransferCoefficient','Exterior heat transfer coefficient associated with exterior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#889=IFCSIMPLEPROPERTYTEMPLATE('0iaxqxtHj6Ifn6xoKRNCya',$,'InteriorHeatTransferCoefficient','Interior heat transfer coefficient associated with interior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#890=IFCSIMPLEPROPERTYTEMPLATE('3zww1dzg917ePwNvdOON2j',$,'RefrigerantFoulingResistance','Fouling resistance on the refrigerant side.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#891=IFCSIMPLEPROPERTYTEMPLATE('3$y4f5FjbFoe7kF3OtSj0j',$,'CondensingTemperature','Refrigerant condensing temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#892=IFCSIMPLEPROPERTYTEMPLATE('0iHnJG_Vn2cgbZG84yItAG',$,'LogarithmicMeanTemperatureDifference','Logarithmic mean temperature difference between refrigerant and water or air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#893=IFCSIMPLEPROPERTYTEMPLATE('20YeJpNND3OQgXQSmY$dLM',$,'UAcurves','UV = f (VExterior, VInterior), UV as a function of interior and exterior fluid flow velocity at the entrance.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#894=IFCSIMPLEPROPERTYTEMPLATE('0KVOEcv6P8$wlRTNxK9$0f',$,'CompressorCondenserHeatGain','Heat gain between condenser inlet to compressor outlet.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#895=IFCSIMPLEPROPERTYTEMPLATE('2aUGERC2P8JQnvL7udNMmi',$,'CompressorCondenserPressureDrop','Pressure drop between condenser inlet and compressor outlet.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#896=IFCSIMPLEPROPERTYTEMPLATE('28qEpa8FXEgh3Jw6iclSqk',$,'CondenserMeanVoidFraction','Mean void fraction in condenser.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#897=IFCSIMPLEPROPERTYTEMPLATE('1su5rv56vBFPmhqDAdtLyJ',$,'WaterFoulingResistance','Fouling resistance on water/air side.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#898=IFCPROPERTYSETTEMPLATE('12zUHl8Ef7ufxpGslJjPLi',$,'Pset_CondenserTypeCommon','Condenser type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCondenser,IfcCondenserType',(#899,#900,#902,#904,#905,#906,#907,#908,#909)); +#899=IFCSIMPLEPROPERTYTEMPLATE('2Np_3YHQb6c8VBhReVaHEQ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#900=IFCSIMPLEPROPERTYTEMPLATE('2drsGOmzT16vKru$aW5fZT',$,'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',$,#901,$,$,$,.READWRITE.); +#901=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#902=IFCSIMPLEPROPERTYTEMPLATE('0Xa2M2IxjFm8z9d67bBsz8',$,'RefrigerantClass','Refrigerant class used by the object.\X2\000A\X0\CFC: Chlorofluorocarbons.\X2\000A\X0\HCFC: Hydrochlorofluorocarbons.\X2\000A\X0\HFC: Hydrofluorocarbons.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#903,$,$,$,.READWRITE.); +#903=IFCPROPERTYENUMERATION('PEnum_RefrigerantClass',(IFCLABEL('AMMONIA'),IFCLABEL('CFC'),IFCLABEL('CO2'),IFCLABEL('H2O'),IFCLABEL('HCFC'),IFCLABEL('HFC'),IFCLABEL('HYDROCARBONS'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#904=IFCSIMPLEPROPERTYTEMPLATE('1WS0yfdYz3PAVnoK_gPIHC',$,'ExternalSurfaceArea','External surface area (both primary and secondary area).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#905=IFCSIMPLEPROPERTYTEMPLATE('3mFXZFEUn7nOI3GvEhn18I',$,'InternalSurfaceArea','Internal surface area.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#906=IFCSIMPLEPROPERTYTEMPLATE('2FHM1hvVP1q9f708cuUc8w',$,'InternalRefrigerantVolume','Internal volume of object (refrigerant side).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#907=IFCSIMPLEPROPERTYTEMPLATE('05vGwqK8rBDAGDaZd1fnYJ',$,'InternalWaterVolume','Internal volume of object (water side).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#908=IFCSIMPLEPROPERTYTEMPLATE('1HS6Kik9bAXeruptf4pbrM',$,'NominalHeatTransferArea','Nominal heat transfer surface area associated with nominal overall heat transfer coefficient.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#909=IFCSIMPLEPROPERTYTEMPLATE('3qZHq7kfnBHht8gHCY6RYH',$,'NominalHeatTransferCoefficient','Nominal overall heat transfer coefficient associated with nominal heat transfer area.',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#910=IFCPROPERTYSETTEMPLATE('3_fQWmexPEQhQnUAvmzxBh',$,'Pset_Condition','Determines the state or condition of an element at a particular point in time.',.PSET_TYPEDRIVENOVERRIDE.,'IfcAsset,IfcElement,IfcSystem,IfcElementType',(#911,#912,#913,#914,#915,#916,#917,#918)); +#911=IFCSIMPLEPROPERTYTEMPLATE('08LDzkui1D6x5kUD7xita5',$,'AssessmentDate','Date on which the overall condition is assessed',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#912=IFCSIMPLEPROPERTYTEMPLATE('17o8RnHnjFSwFfrvRD9WeR',$,'AssessmentCondition','The overall condition of a product based on an assessment of the contributions to the overall condition made by the various criteria considered. The meanings given to the values of assessed condition should be agreed and documented by local agreements. For instance, is overall condition measured on a scale of 1 - 10 or by assigning names such as Good, OK, Poor.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#913=IFCSIMPLEPROPERTYTEMPLATE('3oCSYj4K52pO7yPV$8GUwF',$,'AssessmentDescription','Qualitative description of the condition.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#914=IFCSIMPLEPROPERTYTEMPLATE('2Qg3dQeHf1LPljseF5o7bU',$,'AssessmentType','Category of latest condition assessment report of the asset.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#915=IFCSIMPLEPROPERTYTEMPLATE('1VLPyf9kz0pRtCR1L6xTqu',$,'AssessmentMethod','External reference to assessment method or application used to perform the assessment.',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); +#916=IFCSIMPLEPROPERTYTEMPLATE('2ZaccT6Rb6MRMkIwzlySfX',$,'LastAssessmentReport','Reference to latest condition (state of health) report.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#917=IFCSIMPLEPROPERTYTEMPLATE('0hqrk11UPFVeDTri1aTkvg',$,'NextAssessmentDate','Date of next condition inspection',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#918=IFCSIMPLEPROPERTYTEMPLATE('1O$TOKOMr2MPC2ceclbUP$',$,'AssessmentFrequency','Indicates how often the equipment should be assessed, to have a clear estimation on its working state, based on which the maintenance staff can decide whether it requires maintenance or requires to be updated or replaced.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#919=IFCPROPERTYSETTEMPLATE('0nS__xUbb52u9Uk28iIPTH',$,'Pset_ConstructionAdministration','Properties for Construction Administration. Often used for facility and asset management.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#920,#921,#922)); +#920=IFCSIMPLEPROPERTYTEMPLATE('1TU_Gx_4v1q9ocaZYGkDCK',$,'ProcurementMethod','The method by which an IfcProductType/IfcProduct is acquired and installed. The value provided shall be one of the following four character acronyms: \X2\201C\X0\CFCI\X2\201D\X0\ (meaning Contractor Furnished Contractor Installed), \X2\201C\X0\OFCI\X2\201D\X0\ (meaning Owner Furnished Contractor Installed), or \X2\201C\X0\OFOI\X2\201D\X0\ (meaning Owner Furnished Owner Installed).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#921=IFCSIMPLEPROPERTYTEMPLATE('3Vvaaz1R573Ri6jK4MSU$A',$,'SpecificationSectionNumber','A reference number to an external contract technical specification section describing either (a) minimum performance requirements of a given IfcProductType/IfcProduct or (b) a preselection for a specific IfcProductType/IfcProduct made for this project.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#922=IFCSIMPLEPROPERTYTEMPLATE('0tAgjK_tb8gQ2FyW4VMkuT',$,'SubmittalIdentifer','The reference number to an external construction administration submittal used by the construction contractor and/or subcontractor to verify that the referenced IfcProductType/IfcProduct selection conforms with the requirements found in the referenced SpecificationSectionNumber.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#923=IFCPROPERTYSETTEMPLATE('24n_eZtRH3sO5ookEBZDZa',$,'Pset_ConstructionOccurence','Property set for construction occurrence.',.PSET_OCCURRENCEDRIVEN.,'IfcElement',(#924,#925,#926,#927)); +#924=IFCSIMPLEPROPERTYTEMPLATE('1p_AeEvZbDUxU4$beehCN3',$,'InstallationDate','Date on which the element is installed.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#925=IFCSIMPLEPROPERTYTEMPLATE('2Dg0qCi7L7th53wlpVnJdW',$,'ModelNumber','The model number and/or unit designator assigned by the manufacturer of the manufactured item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#926=IFCSIMPLEPROPERTYTEMPLATE('3elu5y3wj8NggzzB_4UrU0',$,'TagNumber','Tag number.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#927=IFCSIMPLEPROPERTYTEMPLATE('0Ur7iEmGb1zuNl5FBi6NcG',$,'AssetIdentifier','A unique identification assigned to an asset that enables its differentiation from other assets.NOTE The asset identifier is unique within the asset register. It differs from the globally unique id assigned to the instance of an entity populating a database.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#928=IFCPROPERTYSETTEMPLATE('1BJMCnqcf3nA2vOsC8YZ7p',$,'Pset_ConstructionResource','Properties for tracking resource usage over time.',.PSET_TYPEDRIVENOVERRIDE.,'IfcConstructionResource,IfcConstructionResourceType',(#929,#930,#931,#932,#933,#934,#935,#936)); +#929=IFCSIMPLEPROPERTYTEMPLATE('3qWxNsJIXBbOLUemmgPljg',$,'ScheduleWorkProgression','The scheduled work on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#930=IFCSIMPLEPROPERTYTEMPLATE('3qoByc1BL0MPpnxNi108Ol',$,'ActualWorkTime','The actual work on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#931=IFCSIMPLEPROPERTYTEMPLATE('10BjuKx$993u21wRfn2Kfu',$,'RemainingWorkProgression','The remaining work on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#932=IFCSIMPLEPROPERTYTEMPLATE('1nyCfV29HBavNab1Qk3gZ2',$,'ScheduleCost','The budgeted cost on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#933=IFCSIMPLEPROPERTYTEMPLATE('1EoI3Ax$L6UAz7LEo_Hv8r',$,'ActualCost','The actual cost on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#934=IFCSIMPLEPROPERTYTEMPLATE('1ONcOhmyHBE8dI$Ks_Pwf7',$,'RemainingCost','The remaining cost on behalf of the resource allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#935=IFCSIMPLEPROPERTYTEMPLATE('2EUxMVdFP3Fuv9TrK4Yv_p',$,'ScheduleCompletion','The scheduled completion percentage of the allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#936=IFCSIMPLEPROPERTYTEMPLATE('3kRsIb4HP4F9tQHM85VzqN',$,'ActualCompletion','The actual completion percentage of the allocation.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#937=IFCPROPERTYSETTEMPLATE('2Go9zD6gbAyxr812NGvE9D',$,'Pset_ControllerPHistory','Properties for history of controller values. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcController',(#938,#939,#940)); +#938=IFCSIMPLEPROPERTYTEMPLATE('07j6DWm855ohmI4aJyAeek',$,'ValueHistory','Indicates values over time which may be recorded continuously or only when changed beyond a particular deadband. The range of possible values is defined by the Value property on the corresponding occurrence property set (Pset_ControllerTypeFloating, Pset_ControllerTypeProportional, Pset_ControllerTypeMultiPosition, or Pset_ControllerTypeTwoPosition).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#939=IFCSIMPLEPROPERTYTEMPLATE('0MDkM9YuP39B6qO_oCVBTi',$,'Quality','Indicates the quality of measurement or failure condition, which may be further qualified by the Status. True: measured values are considered reliable; False: measured values are considered not reliable (i.e. a fault has been detected); Unknown: reliability of values is uncertain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#940=IFCSIMPLEPROPERTYTEMPLATE('3wyEIoVkXFfAEPT5q2wIjN',$,'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).\X2\000A000A\X0\Indicates an error code or identifier, whose meaning is specific to the particular automation system. Example values include: ''ConfigurationError'', ''NotConnected'', ''DeviceFailure'', ''SensorFailure'', ''LastKnown, ''CommunicationsFailure'', ''OutOfService''.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#941=IFCPROPERTYSETTEMPLATE('2kIjeFbmf4n8pC_7D3GBpf',$,'Pset_ControllerTypeCommon','Controller type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController,IfcControllerType',(#942,#943)); +#942=IFCSIMPLEPROPERTYTEMPLATE('0bm2o3tAfAXALc9KoZ6_V9',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#943=IFCSIMPLEPROPERTYTEMPLATE('1lPn44ctPBZQi3TqfgxYiC',$,'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',$,#944,$,$,$,.READWRITE.); +#944=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#945=IFCPROPERTYSETTEMPLATE('0$7e_Sk9zBRuDqmCBGHPm9',$,'Pset_ControllerTypeFloating','Properties for signal handling for an analog controller taking disparate valued multiple inputs and creating a single valued output. HISTORY: IFC4 adapted from Pset_ControllerTypeCommon and applicable predefined type made specific to FLOATING; ACCUMULATOR and PULSECONVERTER types added; additional properties added to replace Pset_AnalogInput and Pset_AnalogOutput.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController/FLOATING,IfcControllerType/FLOATING',(#946,#948,#949,#950,#951,#952,#953)); +#946=IFCSIMPLEPROPERTYTEMPLATE('3DzU6uQwPC0fgln4DlBReo',$,'ControlType','The type controller, signal modification effected and applicable ports\X2\000A000A\X0\CONSTANT: No inputs; SignalOffset is written to the output value.\X2\000A\X0\MODIFIER: Single analog input is read, added to SignalOffset, multiplied by SignalFactor, and written to the output value.\X2\000A\X0\ABSOLUTE: Single analog input is read and absolute value is written to the output value.\X2\000A\X0\INVERSE: Single analog input is read, 1.0 is divided by the input value and written to the output value.\X2\000A\X0\HYSTERISIS: Single analog input is read, delayed according to SignalTime, and written to the output value.\X2\000A\X0\RUNNINGAVERAGE: Single analog input is read, averaged over SignalTime, and written to the output value.\X2\000A\X0\DERIVATIVE: Single analog input is read and the rate of change during the SignalTime is written to the output value.\X2\000A\X0\INTEGRAL: Single analog input is read and the average value during the SignalTime is written to the output value.\X2\000A\X0\BINARY: Single binary input is read and SignalOffset is written to the output value if True.\X2\000A\X0\ACCUMULATOR: Single binary input is read, and for each pulse the SignalOffset is added to the accumulator, and while the accumulator is greater than the SignalFactor, the accumulator is decremented by SignalFactor and the integer result is incremented by one.\X2\000A\X0\PULSECONVERTER: Single integer input is read, and for each increment the SignalMultiplier is added and written to the output value.\X2\000A\X0\SUM: Two analog inputs are read, added, and written to the output value.\X2\000A\X0\SUBTRACT: Two analog inputs are read, subtracted, and written to the output value.\X2\000A\X0\PRODUCT: Two analog inputs are read, multiplied, and written to the output value.\X2\000A\X0\DIVIDE: Two analog inputs are read, divided, and written to the output value.\X2\000A\X0\AVERAGE: Two analog inputs are read and the average is written to the output value.\X2\000A\X0\MAXIMUM: Two analog inputs are read and the maximum is written to the output value.\X2\000A\X0\MINIMUM: Two analog inputs are read and the minimum is written to the output value..\X2\000A\X0\INPUT: Controller element is a dedicated input.\X2\000A\X0\OUTPUT: Controller element is a dedicated output.\X2\000A\X0\VARIABLE: Controller element is an in-memory variable.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#947,$,$,$,.READWRITE.); +#947=IFCPROPERTYENUMERATION('PEnum_ControllerTypeFloating',(IFCLABEL('ABSOLUTE'),IFCLABEL('ACCUMULATOR'),IFCLABEL('AVERAGE'),IFCLABEL('BINARY'),IFCLABEL('CONSTANT'),IFCLABEL('DERIVATIVE'),IFCLABEL('DIVIDE'),IFCLABEL('HYSTERESIS'),IFCLABEL('INPUT'),IFCLABEL('INTEGRAL'),IFCLABEL('INVERSE'),IFCLABEL('LOWERLIMITCONTROL'),IFCLABEL('MAXIMUM'),IFCLABEL('MINIMUM'),IFCLABEL('MODIFIER'),IFCLABEL('OUTPUT'),IFCLABEL('PRODUCT'),IFCLABEL('PULSECONVERTER'),IFCLABEL('REPORT'),IFCLABEL('RUNNINGAVERAGE'),IFCLABEL('SPLIT'),IFCLABEL('SUBTRACT'),IFCLABEL('SUM'),IFCLABEL('UPPERLIMITCONTROL'),IFCLABEL('VARIABLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#948=IFCSIMPLEPROPERTYTEMPLATE('3_Gp0nsqTCrgqLTPenn8FP',$,'Labels','Table mapping values to labels\X2\000A000A\X0\Labels indicate transition points such as ''Hi'', ''Lo'', ''HiHi'', or ''LoLo''.',.P_TABLEVALUE.,'IfcReal','IfcLabel',$,$,$,$,.READWRITE.); +#949=IFCSIMPLEPROPERTYTEMPLATE('2ghK$twiP15A1zx1RP9_f7',$,'Range','The physical range of values supported by the device.',.P_BOUNDEDVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#950=IFCSIMPLEPROPERTYTEMPLATE('0v0QqBTSP7bOh7zbjDGiDG',$,'Value','The expected range and default value.\X2\000A000A\X0\The expected range and default value. While the property data type is IfcReal (to support all cases including when the units are unknown), a unit may optionally be provided to indicate the measure and unit. The LowerLimitValue and UpperLimitValue must fall within the physical Range and may be used to determine extents when charting Pset_ControllerPHistory.Value.',.P_BOUNDEDVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#951=IFCSIMPLEPROPERTYTEMPLATE('0zG9AyBrP3FAZypIskdgB1',$,'SignalOffset','Offset constant added to modified signal.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#952=IFCSIMPLEPROPERTYTEMPLATE('0k_heUqN134QklBskwqTIc',$,'SignalFactor','Factor multiplied onto offset signal.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#953=IFCSIMPLEPROPERTYTEMPLATE('2sR5xbyOz2aRhZnAPWn5cA',$,'SignalTime','Time factor used for integral and running average controllers.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#954=IFCPROPERTYSETTEMPLATE('3LqF6ibhr0jeVeogFw1475',$,'Pset_ControllerTypeMultiPosition','Properties for discrete inputs, outputs, and values within a programmable logic controller. HISTORY: New in IFC4, replaces Pset_MultiStateInput and Pset_MultiStateOutput.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController/MULTIPOSITION,IfcControllerType/MULTIPOSITION',(#955,#957,#958,#959)); +#955=IFCSIMPLEPROPERTYTEMPLATE('0v4Horp8b8Mgq42tbjAOVe',$,'ControlType','The type controller, signal modification effected and applicable ports\X2\000A000A\X0\INPUT: Controller element is a dedicated input.\X2\000A\X0\OUTPUT: Controller element is a dedicated output.\X2\000A\X0\VARIABLE: Controller element is an in-memory variable.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#956,$,$,$,.READWRITE.); +#956=IFCPROPERTYENUMERATION('PEnum_ControllerMultiPositionType',(IFCLABEL('INPUT'),IFCLABEL('OUTPUT'),IFCLABEL('VARIABLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#957=IFCSIMPLEPROPERTYTEMPLATE('1nQ9pcgT17TfB5d7n4XvKu',$,'Labels','Table mapping values to labels\X2\000A000A\X0\Each entry corresponds to an integer within the ValueRange.',.P_TABLEVALUE.,'IfcInteger','IfcLabel',$,$,$,$,.READWRITE.); +#958=IFCSIMPLEPROPERTYTEMPLATE('3tNVTO3VX5kOvuTKgIjbJ_',$,'IntegerRange','The physical range of values supported by the device.',.P_BOUNDEDVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#959=IFCSIMPLEPROPERTYTEMPLATE('0YIUey$tL1GgXtGIm7k_KS',$,'Value','The expected range and default value.\X2\000A000A\X0\The expected range and default value. The LowerLimitValue and UpperLimitValue must fall within the physical Range.',.P_BOUNDEDVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#960=IFCPROPERTYSETTEMPLATE('0lVhzaDT57rAqtiRqw6wez',$,'Pset_ControllerTypeProgrammable','Properties for Discrete Digital Control (DDC) or programmable logic controllers. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController/PROGRAMMABLE,IfcControllerType/PROGRAMMABLE',(#961,#963,#964,#965)); +#961=IFCSIMPLEPROPERTYTEMPLATE('0k0x_ni5T5wvMSOfCk6rWN',$,'ControlType','The type controller, signal modification effected and applicable ports\X2\000A000A\X0\PRIMARY: Controller has built-in communication interface for PC connection, may manage secondary controllers.\X2\000A\X0\SECONDARY: Controller communicates with primary controller and its own managed devices.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#962,$,$,$,.READWRITE.); +#962=IFCPROPERTYENUMERATION('PEnum_ControllerTypeProgrammable',(IFCLABEL('PRIMARY'),IFCLABEL('SECONDARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#963=IFCSIMPLEPROPERTYTEMPLATE('2qKt9cpaT4$uXqthVM7yPo',$,'FirmwareVersion','Indicates version of device firmware according to device manufacturer.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#964=IFCSIMPLEPROPERTYTEMPLATE('1zUFgaA9XAxfTiDE9YoC1J',$,'SoftwareVersion','Indicates version of application software according to systems integrator.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#965=IFCSIMPLEPROPERTYTEMPLATE('1BYs1WTYfDzfMMxQVxAr5m',$,'Application','Indicates application of controller.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#966,$,$,$,.READWRITE.); +#966=IFCPROPERTYENUMERATION('PEnum_ControllerApplication',(IFCLABEL('BOILERCONTROLLER'),IFCLABEL('CONSTANTLIGHTCONTROLLER'),IFCLABEL('DISCHARGEAIRCONTROLLER'),IFCLABEL('FANCOILUNITCONTROLLER'),IFCLABEL('LIGHTINGPANELCONTROLLER'),IFCLABEL('MODEMCONTROLLER'),IFCLABEL('OCCUPANCYCONTROLLER'),IFCLABEL('PARTITIONWALLCONTROLLER'),IFCLABEL('PUMPCONTROLLER'),IFCLABEL('REALTIMEBASEDSCHEDULER'),IFCLABEL('REALTIMEKEEPER'),IFCLABEL('ROOFTOPUNITCONTROLLER'),IFCLABEL('SCENECONTROLLER'),IFCLABEL('SPACECONFORTCONTROLLER'),IFCLABEL('SUNBLINDCONTROLLER'),IFCLABEL('TELEPHONEDIRECTORY'),IFCLABEL('UNITVENTILATORCONTROLLER'),IFCLABEL('VAV'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#967=IFCPROPERTYSETTEMPLATE('354HCnTr1A6AEDd0D7Md6K',$,'Pset_ControllerTypeProportional','Properties for signal handling for an proportional controller taking setpoint and feedback inputs and creating a single valued output. HISTORY: In IFC4, SignalFactor1, SignalFactor2 and SignalFactor3 changed to ProportionalConstant, IntegralConstant and DerivativeConstant. SignalTime1 and SignalTime2 changed to SignalTimeIncrease and SignalTimeDecrease.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController/PROPORTIONAL,IfcControllerType/PROPORTIONAL',(#968,#970,#971,#972,#973,#974,#975,#976,#977)); +#968=IFCSIMPLEPROPERTYTEMPLATE('0ikq8VHFr2PQosneKE7nnV',$,'ControlType','The type controller, signal modification effected and applicable ports\X2\000A000A\X0\PROPORTIONAL: Output is proportional to the control error. The gain of a proportional control (Kp) will have the effect of reducing the rise time and reducing , but never eliminating, the steady-state error of the variable controlled.\X2\000A\X0\PROPORTIONALINTEGRAL: Part of the output is proportional to the control error and part is proportional to the time integral of the control error. Adding the gain of an integral control (Ki) will have the effect of eliminating the steady-state error of the variable controlled, but it may make the transient response worse.\X2\000A\X0\PROPORTIONALINTEGRALDERIVATIVE: Part of the output is proportional to the control error, part is proportional to the time integral of the control error and part is proportional to the time derivative of the control error. Adding the gain of a derivative control (Kd) will have the effect of increasing the stability of the system, reducing the overshoot, and improving the transient response of the variable controlled.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#969,$,$,$,.READWRITE.); +#969=IFCPROPERTYENUMERATION('PEnum_ControllerProportionalType',(IFCLABEL('PROPORTIONAL'),IFCLABEL('PROPORTIONALINTEGRAL'),IFCLABEL('PROPORTIONALINTEGRALDERIVATIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#970=IFCSIMPLEPROPERTYTEMPLATE('3XIq3mLQf1hwEMp9kcDkUS',$,'Labels','Table mapping values to labels\X2\000A000A\X0\Labels indicate transition points such as ''Hi'', ''Lo'', ''HiHi'', or ''LoLo''.',.P_TABLEVALUE.,'IfcReal','IfcLabel',$,$,$,$,.READWRITE.); +#971=IFCSIMPLEPROPERTYTEMPLATE('2xUp1F8RL39P_V50bwCLp_',$,'Range','The physical range of values supported by the device.',.P_BOUNDEDVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#972=IFCSIMPLEPROPERTYTEMPLATE('2pEvQXxrf86hPTtVZLpHeY',$,'Value','The expected range and default value.\X2\000A000A\X0\The expected range and default value. While the property data type is IfcReal (to support all cases including when the units are unknown), a unit may optionally be provided to indicate the measure and unit.',.P_BOUNDEDVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#973=IFCSIMPLEPROPERTYTEMPLATE('1t0msdeNn36u7GABQnNk2w',$,'ProportionalConstant','The proportional gain factor of the controller (usually referred to as Kp).',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#974=IFCSIMPLEPROPERTYTEMPLATE('13ob5MaRL0dfJItnxryM06',$,'IntegralConstant','The integral gain factor of the controller (usually referred to as Ki). Asserted where ControlType is PROPORTIONALINTEGRAL or PROPORTIONALINTEGRALDERIVATIVE.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#975=IFCSIMPLEPROPERTYTEMPLATE('0Z6FefBoXBLAvpQXmtfl0G',$,'DerivativeConstant','The derivative gain factor of the controller (usually referred to as Kd). Asserted where ControlType is PROPORTIONALINTEGRALDERIVATIVE.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#976=IFCSIMPLEPROPERTYTEMPLATE('1RXI9rsG18l8rU6ed1VKWw',$,'SignalTimeIncrease','Time factor used for exponential increase.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#977=IFCSIMPLEPROPERTYTEMPLATE('3K$4HNy9f43udS5rDHPQoS',$,'SignalTimeDecrease','Time factor used for exponential decrease.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#978=IFCPROPERTYSETTEMPLATE('1Uz4_1vFTEpxfywqrN$wqv',$,'Pset_ControllerTypeTwoPosition','Properties for signal handling for an analog controller taking disparate valued multiple inputs and creating a single valued binary output. HISTORY: In IFC4, extended properties to replace Pset_BinaryInput and Pset_BinaryOutput.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController/TWOPOSITION,IfcControllerType/TWOPOSITION',(#979,#981,#982,#983)); +#979=IFCSIMPLEPROPERTYTEMPLATE('1CnJyi4ozCzv4tqJc1Hg1j',$,'ControlType','The type controller, signal modification effected and applicable ports\X2\000A000A\X0\LOWERLIMITSWITCH: Single analog input is read and if less than Value.LowerBound then True is written to the output value.\X2\000A\X0\UPPERLIMITSWITCH: Single analog input is read and if more than Value.UpperBound then True is written to the output value.\X2\000A\X0\LOWERBANDSWITCH: Single analog input is read and if less than Value.LowerBound+BandWidth then True is written to the output value.\X2\000A\X0\UPPERBANDSWITCH: Single analog input is read and if more than Value.UpperBound-BandWidth then True is written to the output value.\X2\000A\X0\NOT: Single binary input is read and the opposite value is written to the output value.\X2\000A\X0\AND: Two binary inputs are read and if both are True then True is written to the output value.\X2\000A\X0\OR: Two binary inputs are read and if either is True then True is written to the output value.\X2\000A\X0\XOR: Two binary inputs are read and if one is true then True is written to the output value.\X2\000A\X0\CALENDAR: No inputs; the current time is compared with an IfcWorkCalendar to which the IfcController is assigned and True is written if active.\X2\000A\X0\INPUT: Controller element is a dedicated input.\X2\000A\X0\OUTPUT: Controller element is a dedicated output.\X2\000A\X0\VARIABLE: Controller element is an in-memory variable.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#980,$,$,$,.READWRITE.); +#980=IFCPROPERTYENUMERATION('PEnum_ControllerTwoPositionType',(IFCLABEL('AND'),IFCLABEL('AVERAGE'),IFCLABEL('CALENDAR'),IFCLABEL('INPUT'),IFCLABEL('LOWERBANDSWITCH'),IFCLABEL('LOWERLIMITSWITCH'),IFCLABEL('NOT'),IFCLABEL('OR'),IFCLABEL('OUTPUT'),IFCLABEL('UPPERBANDSWITCH'),IFCLABEL('UPPERLIMITSWITCH'),IFCLABEL('VARIABLE'),IFCLABEL('XOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#981=IFCSIMPLEPROPERTYTEMPLATE('0vNQsjxPb8_hCnYK1tCvKR',$,'Labels','Table mapping values to labels\X2\000A000A\X0\Labels indicate the meanings of True and False, such as ''Open'' and ''Closed''',.P_TABLEVALUE.,'IfcBoolean','IfcLabel',$,$,$,$,.READWRITE.); +#982=IFCSIMPLEPROPERTYTEMPLATE('0rdMyhwzX9tPCNczlrkBeo',$,'Polarity','True indicates normal polarity; False indicates reverse polarity.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#983=IFCSIMPLEPROPERTYTEMPLATE('3BN9vGkmH9xQhxRJEaTAlb',$,'Value','The expected range and default value.\X2\000A000A\X0\The default value such as normally-closed or normally-open.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#984=IFCPROPERTYSETTEMPLATE('0G6zrvMaz6nuPrFOuMqCBw',$,'Pset_CooledBeamPHistory','Common performance history attributes for a cooled beam.',.PSET_PERFORMANCEDRIVEN.,'IfcCooledBeam',(#985,#986,#987,#988,#989,#990,#991,#992,#993,#994,#995,#996,#997)); +#985=IFCSIMPLEPROPERTYTEMPLATE('0GEYhWTw5BePsS7w1WEjKY',$,'TotalCoolingCapacity','Total cooling capacity. This includes cooling capacity of beam and cooling capacity of supply air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#986=IFCSIMPLEPROPERTYTEMPLATE('3rHMf7Tgj4bBxllHo5TOgR',$,'TotalHeatingCapacity','Total heating capacity. This includes heating capacity of beam and heating capacity of supply air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#987=IFCSIMPLEPROPERTYTEMPLATE('2ae6kVe550bvT0Pya_6fUr',$,'BeamCoolingCapacity','Cooling capacity of beam. This excludes cooling capacity of supply air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#988=IFCSIMPLEPROPERTYTEMPLATE('1PtbEp9VX32wYVrIVD07Ho',$,'BeamHeatingCapacity','Heating capacity of beam. This excludes heating capacity of supply air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#989=IFCSIMPLEPROPERTYTEMPLATE('36tWy10h1DlAEW9_O01s9Z',$,'CoolingWaterFlowRate','Water flow rate for cooling.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#990=IFCSIMPLEPROPERTYTEMPLATE('3C1C7lkt10burntSrtP69G',$,'HeatingWaterFlowRate','Water flow rate for heating.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#991=IFCSIMPLEPROPERTYTEMPLATE('3Is15DI790Ff24MOKBlrUU',$,'CorrectionFactorForCooling','Correction factor k as a function of water flow rate (used to calculate cooling capacity).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#992=IFCSIMPLEPROPERTYTEMPLATE('1WJMkYHLz2xu8A4eiEMn86',$,'CorrectionFactorForHeating','Correction factor k as a function of water flow rate (used to calculate heating capacity).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#993=IFCSIMPLEPROPERTYTEMPLATE('39FLn3$KTD_xAkcA9QEVhS',$,'WaterPressureDropCurves','Water pressure drop as function of water flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#994=IFCSIMPLEPROPERTYTEMPLATE('1fXZXljdP1SA0Yl6h4UPM6',$,'SupplyWaterTemperatureCooling','Supply water temperature in cooling mode.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#995=IFCSIMPLEPROPERTYTEMPLATE('0djTFsJpb1RPv5Sd2tcR$f',$,'ReturnWaterTemperatureCooling','Return water temperature in cooling mode.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#996=IFCSIMPLEPROPERTYTEMPLATE('3qEYuuYrLDOvMMc_8GQiom',$,'SupplyWaterTemperatureHeating','Supply water temperature in heating mode.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#997=IFCSIMPLEPROPERTYTEMPLATE('3F6qzHJB529RQVzpTs2sym',$,'ReturnWaterTemperatureHeating','Return water temperature in heating mode.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#998=IFCPROPERTYSETTEMPLATE('3jt2Ke3N5DvePFIWKADG04',$,'Pset_CooledBeamPHistoryActive','Performance history attributes for an active cooled beam.',.PSET_PERFORMANCEDRIVEN.,'IfcCooledBeam/ACTIVE',(#999,#1000,#1001)); +#999=IFCSIMPLEPROPERTYTEMPLATE('0GAABRwanC9hHwxzLwhKUi',$,'AirFlowRate','Air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1000=IFCSIMPLEPROPERTYTEMPLATE('2JM5nDGZjCNwwRTyXkB99Z',$,'Throw','Distance cooled beam throws the air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1001=IFCSIMPLEPROPERTYTEMPLATE('3U54teTd50GvjbRyWA0ZHM',$,'AirPressureDropCurves','Air pressure drop as function of air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1002=IFCPROPERTYSETTEMPLATE('2t1eFgLOLBbh$OjQwRy8cI',$,'Pset_CooledBeamTypeActive','Active (ventilated) cooled beam common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCooledBeam/ACTIVE,IfcCooledBeamType/ACTIVE',(#1003,#1005,#1006,#1008)); +#1003=IFCSIMPLEPROPERTYTEMPLATE('1AiMVNat14TRkAKs_peQ3d',$,'AirFlowConfiguration','Air flow configuration type of cooled beam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1004,$,$,$,.READWRITE.); +#1004=IFCPROPERTYENUMERATION('PEnum_CooledBeamActiveAirFlowConfigurationType',(IFCLABEL('BIDIRECTIONAL'),IFCLABEL('UNIDIRECTIONALLEFT'),IFCLABEL('UNIDIRECTIONALRIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1005=IFCSIMPLEPROPERTYTEMPLATE('0tswKcJajATP$BEVP6ESIQ',$,'AirFlowRateRange','Possible range of airflow that can be delivered.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1006=IFCSIMPLEPROPERTYTEMPLATE('1GP$d8jar2XfTe5$naKUZW',$,'SupplyAirConnectionType','The manner in which the pipe connection is made to the cooled beam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1007,$,$,$,.READWRITE.); +#1007=IFCPROPERTYENUMERATION('PEnum_CooledBeamSupplyAirConnectionType',(IFCLABEL('LEFT'),IFCLABEL('RIGHT'),IFCLABEL('STRAIGHT'),IFCLABEL('TOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1008=IFCSIMPLEPROPERTYTEMPLATE('2wpYCE4J90EO_iuk3HrM26',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\Duct connection diameter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1009=IFCPROPERTYSETTEMPLATE('315DRvQOj4OB7m_ke_wUTM',$,'Pset_CooledBeamTypeCommon','Cooled beam common attributes.\X2\000A\X0\SoundLevel and SoundAttenuation attributes deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCooledBeam,IfcCooledBeamType',(#1010,#1011,#1013,#1014,#1016,#1018,#1019,#1020,#1021,#1022,#1023,#1024,#1025,#1026,#1027,#1028,#1029,#1030,#1032,#1033,#1034)); +#1010=IFCSIMPLEPROPERTYTEMPLATE('0c3eX87nP5qONqUGQIbJRQ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1011=IFCSIMPLEPROPERTYTEMPLATE('1TRV1DrT5CiAq30_MryBYD',$,'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',$,#1012,$,$,$,.READWRITE.); +#1012=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1013=IFCSIMPLEPROPERTYTEMPLATE('3bLcIVX9bB2v$mkUwu9jxS',$,'IsFreeHanging','Is it free hanging type (not mounted in a false ceiling)?',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1014=IFCSIMPLEPROPERTYTEMPLATE('2ddcqNO4D5j92Eo9z4JPeG',$,'PipeConnection','The manner in which the pipe connection is made to the cooled beam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1015,$,$,$,.READWRITE.); +#1015=IFCPROPERTYENUMERATION('PEnum_CooledBeamPipeConnection',(IFCLABEL('LEFT'),IFCLABEL('RIGHT'),IFCLABEL('STRAIGHT'),IFCLABEL('TOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1016=IFCSIMPLEPROPERTYTEMPLATE('0HOWFzBnn7qhN_S2myUQPj',$,'WaterFlowControlSystemType','Factory fitted waterflow control system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1017,$,$,$,.READWRITE.); +#1017=IFCPROPERTYENUMERATION('PEnum_CooledBeamWaterFlowControlSystemType',(IFCLABEL('2WAYVALVE'),IFCLABEL('3WAYVALVE'),IFCLABEL('NONE'),IFCLABEL('ONOFFVALVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1018=IFCSIMPLEPROPERTYTEMPLATE('2u2rT0ptn678p9x_hO5mzA',$,'WaterPressureRange','Allowable water circuit working pressure range.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1019=IFCSIMPLEPROPERTYTEMPLATE('3QIgsJW9L1kg5o4AIjSV4J',$,'NominalCoolingCapacity','Nominal cooling capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1020=IFCSIMPLEPROPERTYTEMPLATE('3Ed8Qc0l1Fp8BCXXTfOYTd',$,'NominalSurroundingTemperatureCooling','Nominal surrounding temperature (refers to nominal cooling capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1021=IFCSIMPLEPROPERTYTEMPLATE('1W0B5zXfTBQuQ4Olt0WLOj',$,'NominalSurroundingHumidityCooling','Nominal surrounding humidity (refers to nominal cooling capacity).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1022=IFCSIMPLEPROPERTYTEMPLATE('1MGRJmByrEBxTEk_4U$6c1',$,'NominalSupplyWaterTemperatureCooling','Nominal supply water temperature (refers to nominal cooling capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1023=IFCSIMPLEPROPERTYTEMPLATE('3RF5XVoE11EB88wF_fMVmQ',$,'NominalReturnWaterTemperatureCooling','Nominal return water temperature (refers to nominal cooling capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1024=IFCSIMPLEPROPERTYTEMPLATE('2uk8PEplfEiu2IgSgC0LPG',$,'NominalWaterFlowCooling','Nominal water flow (refers to nominal cooling capacity).',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1025=IFCSIMPLEPROPERTYTEMPLATE('0ophSbCez8jBvouaJlOraU',$,'NominalHeatingCapacity','Nominal heating capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1026=IFCSIMPLEPROPERTYTEMPLATE('1RCM9YrMn6phjIxZ_52dFc',$,'NominalSurroundingTemperatureHeating','Nominal surrounding temperature (refers to nominal heating capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1027=IFCSIMPLEPROPERTYTEMPLATE('250$cN8Sf7XhFyV26T245d',$,'NominalSupplyWaterTemperatureHeating','Nominal supply water temperature (refers to nominal heating capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1028=IFCSIMPLEPROPERTYTEMPLATE('1xY7crw_T0Pu7TKsXNnLgq',$,'NominalReturnWaterTemperatureHeating','Nominal return water temperature (refers to nominal heating capacity).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1029=IFCSIMPLEPROPERTYTEMPLATE('1Mp1mY_NzCifTxPRGr9y9r',$,'NominalWaterFlowHeating','Nominal water flow (refers to nominal heating capacity).',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1030=IFCSIMPLEPROPERTYTEMPLATE('1scrh3OZz7Sg3EyjAARmY6',$,'IntegratedLightingType','Integrated lighting in cooled beam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1031,$,$,$,.READWRITE.); +#1031=IFCPROPERTYENUMERATION('PEnum_CooledBeamIntegratedLightingType',(IFCLABEL('DIRECT'),IFCLABEL('DIRECTANDINDIRECT'),IFCLABEL('INDIRECT'),IFCLABEL('NONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1032=IFCSIMPLEPROPERTYTEMPLATE('2cBZphpen5mh4Nxnm$hV20',$,'FinishColour','The finish colour of the object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1033=IFCSIMPLEPROPERTYTEMPLATE('3wUEzxvDnAMe5TDhEWn02r',$,'CoilLength','Length of coil.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1034=IFCSIMPLEPROPERTYTEMPLATE('3ftFFk_LPDefCJvQ6O5hv9',$,'CoilWidth','Width of coil.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1035=IFCPROPERTYSETTEMPLATE('0QBq$oFaL7FuV$f$GkkTg9',$,'Pset_CoolingTowerPHistory','Cooling tower performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcCoolingTower',(#1036,#1037,#1038,#1039,#1040)); +#1036=IFCSIMPLEPROPERTYTEMPLATE('0DrpcdbuT6av0hz_C7JdG_',$,'Capacity','The capacity of the element.\X2\000A000A\X0\Heat transfer rate of the cooling tower between air stream and water stream.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1037=IFCSIMPLEPROPERTYTEMPLATE('0wJiToxQPDw9Av5fn$Uf7S',$,'HeatTransferCoefficient','Heat transfer coefficient-area product.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1038=IFCSIMPLEPROPERTYTEMPLATE('1IYRQwf791DucDiEJpWhS$',$,'SumpHeaterPower','Electrical heat power of sump heater.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1039=IFCSIMPLEPROPERTYTEMPLATE('0uV3sByAv6Vv1t6CatxJsn',$,'UACurve','UA value.\X2\000A000A\X0\As a function of fan speed at certain water flow rate, UA = f ( fan speed).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1040=IFCSIMPLEPROPERTYTEMPLATE('2aHng$Nmj8m9OY0T8EhvXv',$,'Performance','Water temperature change as a function of wet-bulb temperature, water entering temperature, water flow rate, air flow rate, Tdiff = f ( Twet-bulb, Twater,in, mwater, mair).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1041=IFCPROPERTYSETTEMPLATE('0y9_7bRRf7SB11bwoWbRwL',$,'Pset_CoolingTowerTypeCommon','Cooling tower type common attributes.\X2\000A\X0\WaterRequirement attribute unit type modified in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCoolingTower,IfcCoolingTowerType',(#1042,#1043,#1045,#1046,#1048,#1050,#1052,#1054,#1056,#1057,#1058,#1059,#1060,#1061,#1062)); +#1042=IFCSIMPLEPROPERTYTEMPLATE('0xFeuqp0n7WBL$A8Q47xwo',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1043=IFCSIMPLEPROPERTYTEMPLATE('2jJ1PRaDbEuPej7$4aiic1',$,'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',$,#1044,$,$,$,.READWRITE.); +#1044=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1045=IFCSIMPLEPROPERTYTEMPLATE('2Q1otxWlXDVhwF4J7ur2tA',$,'NominalCapacity','The total nominal or volumetric capacity of the object.\X2\000A000A\X0\Nominal cooling tower capacity in terms of heat transfer rate of the cooling tower between air stream and water stream at nominal conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1046=IFCSIMPLEPROPERTYTEMPLATE('0mRooSa2jAUednFziv5elb',$,'CircuitType','OpenCircuit: Exposes water directly to the cooling atmosphere.\X2\000A\X0\CloseCircuit: The fluid is separated from the atmosphere by a heat exchanger.\X2\000A\X0\Wet: The air stream or the heat exchange surface is evaporatively cooled.\X2\000A\X0\Dry: No evaporation into the air stream.\X2\000A\X0\DryWet: A combination of a dry tower and a wet tower.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1047,$,$,$,.READWRITE.); +#1047=IFCPROPERTYENUMERATION('PEnum_CoolingTowerCircuitType',(IFCLABEL('CLOSEDCIRCUITDRY'),IFCLABEL('CLOSEDCIRCUITDRYWET'),IFCLABEL('CLOSEDCIRCUITWET'),IFCLABEL('OPENCIRCUIT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1048=IFCSIMPLEPROPERTYTEMPLATE('3ga_uOupr69PTZoYafN6Up',$,'FlowArrangement','Defines the basic flow arrangements for the heat exchanger or cooler tower:COUNTERFLOW: Air and water flow enter in different directions.\X2\000A\X0\CROSSFLOW: Air and water flow are perpendicular.\X2\000A\X0\PARALLELFLOW: Air and water flow enter in same directions.\X2\000A\X0\MULTIPASS: Multipass flow heat exchanger arrangement. \X2\000A\X0\OTHER: Other type of heat exchanger flow arrangement not defined above.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1049,$,$,$,.READWRITE.); +#1049=IFCPROPERTYENUMERATION('PEnum_CoolingTowerFlowArrangement',(IFCLABEL('COUNTERFLOW'),IFCLABEL('CROSSFLOW'),IFCLABEL('PARALLELFLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1050=IFCSIMPLEPROPERTYTEMPLATE('1R8$Rs$oL9kws_NGuXr1xg',$,'SprayType','SprayFilled: Water is sprayed into airflow.\X2\000A\X0\SplashTypeFill: water cascades over successive rows of splash bars.\X2\000A\X0\FilmTypeFill: water flows in a thin layer over closely spaced sheets.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1051,$,$,$,.READWRITE.); +#1051=IFCPROPERTYENUMERATION('PEnum_CoolingTowerSprayType',(IFCLABEL('FILMTYPEFILL'),IFCLABEL('SPLASHTYPEFILL'),IFCLABEL('SPRAYFILLED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1052=IFCSIMPLEPROPERTYTEMPLATE('1qBQA2jvPCNvK8a7qiadBJ',$,'CapacityControl','FanCycling: Fan is cycled on and off to control duty.\X2\000A\X0\TwoSpeedFan: Fan is switched between low and high speed to control duty.\X2\000A\X0\VariableSpeedFan: Fan speed is varied to control duty.\X2\000A\X0\DampersControl: Dampers modulate the air flow to control duty.\X2\000A\X0\BypassValveControl: Bypass valve modulates the water flow to control duty.\X2\000A\X0\MultipleSeriesPumps: Turn on/off multiple series pump to control duty.\X2\000A\X0\TwoSpeedPump: Switch between high/low pump speed to control duty.\X2\000A\X0\VariableSpeedPump: vary pump speed to control duty.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1053,$,$,$,.READWRITE.); +#1053=IFCPROPERTYENUMERATION('PEnum_CoolingTowerCapacityControl',(IFCLABEL('BYPASSVALVECONTROL'),IFCLABEL('DAMPERSCONTROL'),IFCLABEL('FANCYCLING'),IFCLABEL('MULTIPLESERIESPUMPS'),IFCLABEL('TWOSPEEDFAN'),IFCLABEL('TWOSPEEDPUMP'),IFCLABEL('VARIABLESPEEDFAN'),IFCLABEL('VARIABLESPEEDPUMP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1054=IFCSIMPLEPROPERTYTEMPLATE('1N2CGQ_6186elEpdfGoh5z',$,'ControlStrategy','FixedExitingWaterTemp: The capacity is controlled to maintain a fixed exiting water temperature.\X2\000A\X0\WetBulbTempReset: The set-point is reset based on the wet-bulb temperature.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1055,$,$,$,.READWRITE.); +#1055=IFCPROPERTYENUMERATION('PEnum_CoolingTowerControlStrategy',(IFCLABEL('FIXEDEXITINGWATERTEMP'),IFCLABEL('WETBULBTEMPRESET'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1056=IFCSIMPLEPROPERTYTEMPLATE('20saNk2JTFBuKAg$71AVwD',$,'NumberOfCells','Number of cells in one cooling tower unit.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1057=IFCSIMPLEPROPERTYTEMPLATE('1CIX1E6LT2_xyUnSIp8DYD',$,'BasinReserveVolume','Volume between operating and overflow levels in cooling tower basin.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#1058=IFCSIMPLEPROPERTYTEMPLATE('3c_qUdQGD2tx1l$wGhMtUD',$,'LiftElevationDifference','Elevation difference between cooling tower sump and the top of the tower.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1059=IFCSIMPLEPROPERTYTEMPLATE('1fQmrIoIvEU9tBxjGwYwNn',$,'WaterRequirement','Make-up water requirement.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1060=IFCSIMPLEPROPERTYTEMPLATE('1ZVvMDpWb8YBfoA4dVyw0M',$,'OperationTemperatureRange','Allowable operation ambient air temperature range.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1061=IFCSIMPLEPROPERTYTEMPLATE('0z6w1a3S5Fc8ZIbJXI7eHF',$,'AmbientDesignDryBulbTemperature','Ambient design dry bulb temperature used for selecting the cooling tower.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1062=IFCSIMPLEPROPERTYTEMPLATE('3Wj8uXVWD7cxgJC0djpwqa',$,'AmbientDesignWetBulbTemperature','Ambient design wet bulb temperature used for selecting the cooling tower.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1063=IFCPROPERTYSETTEMPLATE('3EivV3SoP6VgXcr5Gz4WYB',$,'Pset_CourseApplicationConditions','Properties regarding the conditions when applying a course.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCourse,IfcCourseType',(#1064,#1065)); +#1064=IFCSIMPLEPROPERTYTEMPLATE('01O61Gn9T9rQLjCKEBuOVL',$,'ApplicationTemperature','Indicates the ambient temperature at which the course is applied',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1065=IFCSIMPLEPROPERTYTEMPLATE('0nvnGaHKDDhOlXG7NeBxkZ',$,'WeatherConditions','Indicates the weather conditions during the application of the course',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#1066=IFCPROPERTYSETTEMPLATE('03FzAxkXbAgwPTWWyTuBF5',$,'Pset_CourseCommon','Common properties for courses.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCourse,IfcCourseType',(#1067,#1068,#1069)); +#1067=IFCSIMPLEPROPERTYTEMPLATE('1jBGLVSWj4sQpxyqnY6Fs1',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#1068=IFCSIMPLEPROPERTYTEMPLATE('1OT7MUOxzCt9nBQJCW_RXB',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#1069=IFCSIMPLEPROPERTYTEMPLATE('39$t6moV18ohrtnD9YizSU',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#1070=IFCPROPERTYSETTEMPLATE('20wRms9DH0XPrJUILL2ypk',$,'Pset_CoveringCommon','Properties common to the definition of all occurrence and type objects of covering',.PSET_TYPEDRIVENOVERRIDE.,'IfcCovering,IfcCoveringType',(#1071,#1072,#1074,#1075,#1076,#1077,#1078,#1079,#1080,#1081,#1082)); +#1071=IFCSIMPLEPROPERTYTEMPLATE('0VURV6RhT9TR46X3PLufC8',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1072=IFCSIMPLEPROPERTYTEMPLATE('3_mjNls2v0DOqGSJQFgiwD',$,'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',$,#1073,$,$,$,.READWRITE.); +#1073=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1074=IFCSIMPLEPROPERTYTEMPLATE('1622y1KwL2Ju1bElZBx6td',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1075=IFCSIMPLEPROPERTYTEMPLATE('265B30RZn3ugomQz5UL30J',$,'FlammabilityRating','Flammability Rating for this object.\X2\000A\X0\It is given according to the national building code that governs the rating of flammability for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1076=IFCSIMPLEPROPERTYTEMPLATE('0AZYzY2VD7WhxH2mFnAjPv',$,'FragilityRating','Indication on the fragility of the covering (e.g., under fire conditions). It is given according to the national building code that might provide a classification for fragility.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1077=IFCSIMPLEPROPERTYTEMPLATE('2LzWXBKCz82vUnXPLhF$IP',$,'Combustible','Indication whether the object is made from combustible material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1078=IFCSIMPLEPROPERTYTEMPLATE('3KKUZ7IAX5Lv93pI5LJFWd',$,'SurfaceSpreadOfFlame','Indication on how the flames spread around the surface,\X2\000A\X0\It is given according to the national building code that governs the fire behaviour for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1079=IFCSIMPLEPROPERTYTEMPLATE('0n5OECVfH5TuilgMuSW3X4',$,'Finish','Description of the (surface) finish of the object for informational purposes.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#1080=IFCSIMPLEPROPERTYTEMPLATE('2hITFIYHP5xgL21_pXjMNE',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1081=IFCSIMPLEPROPERTYTEMPLATE('3LrBWnCrD3T9u5IvUCUmy$',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#1082=IFCSIMPLEPROPERTYTEMPLATE('03yaDj8CP6ZO2VZc_ef9pP',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1083=IFCPROPERTYSETTEMPLATE('1Jghzr2zT2OxbVcvT9CRO6',$,'Pset_CoveringFlooring','Properties common to the definition of all occurrence and type objects of covering with the predefined type set to FLOORING.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCovering/FLOORING,IfcCoveringType/FLOORING',(#1084,#1085)); +#1084=IFCSIMPLEPROPERTYTEMPLATE('3HeXQZNXn11QJmtX1WuCcV',$,'HasNonSkidSurface','Indication whether the surface finish is designed to prevent slippery (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1085=IFCSIMPLEPROPERTYTEMPLATE('3$AfMkW_93Fwl31dX4$Pz2',$,'HasAntiStaticSurface','Indication whether the surface finish is designed to prevent electrostatic charge (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1086=IFCPROPERTYSETTEMPLATE('3OZCH947r4IRLpNChxZdB_',$,'Pset_CoveringTypeMembrane','Property set for overing Type Membrane.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCovering/MEMBRANE,IfcCoveringType/MEMBRANE',(#1087,#1088)); +#1087=IFCSIMPLEPROPERTYTEMPLATE('3GvEvEtHrBROnnwoc0Z2KC',$,'NominalInstallationDepth','Nominal installation depth underground.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1088=IFCSIMPLEPROPERTYTEMPLATE('2VnNE3y8rA3vvxVt6FHKda',$,'NominalTransverseInclination','Required nominal angle of transverse slope.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#1089=IFCPROPERTYSETTEMPLATE('36eOYUajLE9QC2m7tYJAM9',$,'Pset_CurrentInstrumentTransformer','Instrument transformers are high accuracy class electrical devices used to isolate or transform voltage or current levels. The main function of instrument transformers is to operate instruments or metering from high voltage or high current circuits, safely isolating secondary control circuitry from the high voltages or currents. Combination instrument transformers are metering current.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument/AMMETER,IfcFlowInstrument/COMBINED,IfcFlowInstrumentType/AMMETER,IfcFlowInstrumentType/COMBINED',(#1090,#1091,#1092,#1093,#1094,#1095,#1096,#1097,#1098,#1099)); +#1090=IFCSIMPLEPROPERTYTEMPLATE('0fRmbSoIP3$e8j4rNj4cWa',$,'AccuracyClass','A designation assigned to an instrument transformer the current (or voltage) error and phase displacement of which remain within specified limits under prescribed conditions of use (IEC 321-01-24).',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#1091=IFCSIMPLEPROPERTYTEMPLATE('1cYNDnM2D0cfcA1tTGpB4u',$,'AccuracyGrade','The grade of accuracy.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1092=IFCSIMPLEPROPERTYTEMPLATE('15vpGe6NH3rQ115c1fCebM',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1093=IFCSIMPLEPROPERTYTEMPLATE('1dzgotu7HDUel_lOcdW8gJ',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1094=IFCSIMPLEPROPERTYTEMPLATE('3qgdJkNyL6yhov41GrkT7W',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1095=IFCSIMPLEPROPERTYTEMPLATE('3EOwEZL9T7WhrEOcnRwrWc',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1096=IFCSIMPLEPROPERTYTEMPLATE('21fCkgXkv9QBXXLWi$Rxqz',$,'PrimaryFrequency','The frequency that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#1097=IFCSIMPLEPROPERTYTEMPLATE('2mxMeIAAP6ixoBu5aXmCFc',$,'PrimaryCurrent','The current that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1098=IFCSIMPLEPROPERTYTEMPLATE('1FmHIWcpv0Mepe1iSlmXjM',$,'SecondaryFrequency','The frequency that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#1099=IFCSIMPLEPROPERTYTEMPLATE('1s0zEyvEzDsQZ4P7RG4DXX',$,'SecondaryCurrent','The current that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1100=IFCPROPERTYSETTEMPLATE('3lioZ5GiDEVPgq7HcHEaWp',$,'Pset_CurtainWallCommon','Properties common to the definition of all occurrences of IfcCurtainWall.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCurtainWall,IfcCurtainWallType',(#1101,#1102,#1104,#1105,#1106,#1107,#1108,#1109)); +#1101=IFCSIMPLEPROPERTYTEMPLATE('1hG3DeF21CreothIY5kGt9',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1102=IFCSIMPLEPROPERTYTEMPLATE('0CpGab17XF6uscdgs4czte',$,'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',$,#1103,$,$,$,.READWRITE.); +#1103=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1104=IFCSIMPLEPROPERTYTEMPLATE('0LK2fB6dz7jw8p4xtbg_P0',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1105=IFCSIMPLEPROPERTYTEMPLATE('25R0AxsOb97OWNvBR0$fj9',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1106=IFCSIMPLEPROPERTYTEMPLATE('2PblTYmQv8m9xXFAV8FHV$',$,'Combustible','Indication whether the object is made from combustible material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1107=IFCSIMPLEPROPERTYTEMPLATE('3X8Rztrlr0yPQBDc48SeNe',$,'SurfaceSpreadOfFlame','Indication on how the flames spread around the surface,\X2\000A\X0\It is given according to the national building code that governs the fire behaviour for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1108=IFCSIMPLEPROPERTYTEMPLATE('0mOcusBv167vWOkENUN9rv',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#1109=IFCSIMPLEPROPERTYTEMPLATE('0phiCkW9z4tBc0MLPXs8m7',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1110=IFCPROPERTYSETTEMPLATE('2jMYGmhTP5dACuUpAVikEg',$,'Pset_DamperOccurrence','Damper occurrence attributes attached to an instance of IfcDamper',.PSET_OCCURRENCEDRIVEN.,'IfcDamper',(#1111)); +#1111=IFCSIMPLEPROPERTYTEMPLATE('39B1k8fzT0WwU14MDj6Opk',$,'SizingMethod','Identifies whether the damper is sized nominally or with exact measurements:NOMINAL: Nominal sizing method.\X2\000A\X0\EXACT: Exact sizing method.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1112,$,$,$,.READWRITE.); +#1112=IFCPROPERTYENUMERATION('PEnum_DamperSizingMethod',(IFCLABEL('EXACT'),IFCLABEL('NOMINAL'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1113=IFCPROPERTYSETTEMPLATE('2Ged6rPZLEzxWWnRUrfQXc',$,'Pset_DamperPHistory','Damper performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcDamper',(#1114,#1115,#1116,#1117,#1118,#1119)); +#1114=IFCSIMPLEPROPERTYTEMPLATE('3R$A2E4_5E1fm6jhAyljm0',$,'AirFlowRate','Air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1115=IFCSIMPLEPROPERTYTEMPLATE('2D2avGFVz8_vBoQcJ0pPbf',$,'Leakage','Air leakage rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1116=IFCSIMPLEPROPERTYTEMPLATE('0DYSv9WQvFpvdSVYJhwn26',$,'PressureDrop','Pressure drop.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1117=IFCSIMPLEPROPERTYTEMPLATE('3WrymTugP84AoU58pndN1v',$,'BladePositionAngle','Blade position angle; angle between the blade and flow direction ( 0 - 90).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1118=IFCSIMPLEPROPERTYTEMPLATE('073pjxJ3X4DvNdua4LQs_6',$,'DamperPosition','Control damper position, ranging from 0 to 1; damper position (0=closed=90deg position angle, 1=open=0deg position angle).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1119=IFCSIMPLEPROPERTYTEMPLATE('1mpYYeRtn2Ve0V1jkUIeSJ',$,'PressureLossCoefficient','Pressure loss coefficient.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1120=IFCPROPERTYSETTEMPLATE('2C4NtWAL1FOhbq5R9WcbaE',$,'Pset_DamperTypeCommon','Damper type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamper,IfcDamperType',(#1121,#1122,#1124,#1126,#1128,#1129,#1131,#1133,#1135,#1136,#1137,#1138,#1139,#1140,#1141,#1142,#1143,#1144,#1145,#1146,#1147,#1148,#1149,#1150)); +#1121=IFCSIMPLEPROPERTYTEMPLATE('1H0p3a$tHESu6ws1S7lnsE',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1122=IFCSIMPLEPROPERTYTEMPLATE('397D7GA6P3PBjgd8Q_WSF4',$,'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',$,#1123,$,$,$,.READWRITE.); +#1123=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1124=IFCSIMPLEPROPERTYTEMPLATE('2IYn1Ifd90MxOkyTz5Ir9e',$,'Operation','The operational mechanism for the damper operation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1125,$,$,$,.READWRITE.); +#1125=IFCPROPERTYENUMERATION('PEnum_DamperOperation',(IFCLABEL('AUTOMATIC'),IFCLABEL('MANUAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1126=IFCSIMPLEPROPERTYTEMPLATE('11H6SjMwf5ru_h34TWAVIQ',$,'Orientation','The intended orientation for the damper as specified by the manufacturer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1127,$,$,$,.READWRITE.); +#1127=IFCPROPERTYENUMERATION('PEnum_DamperOrientation',(IFCLABEL('HORIZONTAL'),IFCLABEL('VERTICAL'),IFCLABEL('VERTICALORHORIZONTAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1128=IFCSIMPLEPROPERTYTEMPLATE('3DYNkYG_T2xu0U0Nj6BnzS',$,'BladeThickness','The thickness of the damper blade.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1129=IFCSIMPLEPROPERTYTEMPLATE('3pNNkGN1vFbOQvXW_vEOTI',$,'BladeAction','Blade action.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1130,$,$,$,.READWRITE.); +#1130=IFCPROPERTYENUMERATION('PEnum_DamperBladeAction',(IFCLABEL('FOLDINGCURTAIN'),IFCLABEL('OPPOSED'),IFCLABEL('PARALLEL'),IFCLABEL('SINGLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1131=IFCSIMPLEPROPERTYTEMPLATE('0AMIoStHLE_gbYt$25bCVQ',$,'BladeShape','Blade shape. Flat means triple V-groove.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1132,$,$,$,.READWRITE.); +#1132=IFCPROPERTYENUMERATION('PEnum_DamperBladeShape',(IFCLABEL('EXTRUDEDAIRFOIL'),IFCLABEL('FABRICATEDAIRFOIL'),IFCLABEL('FLAT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1133=IFCSIMPLEPROPERTYTEMPLATE('0AaynzzObDCAvVTdlyECWF',$,'BladeEdge','Blade edge.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1134,$,$,$,.READWRITE.); +#1134=IFCPROPERTYENUMERATION('PEnum_DamperBladeEdge',(IFCLABEL('CRIMPED'),IFCLABEL('UNCRIMPED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1135=IFCSIMPLEPROPERTYTEMPLATE('3FU6zajSXDRAffkpuy7DuY',$,'NumberofBlades','Number of blades.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#1136=IFCSIMPLEPROPERTYTEMPLATE('1AMXx8NaT789D7W0bcZeFJ',$,'FaceArea','Face area open to the airstream.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#1137=IFCSIMPLEPROPERTYTEMPLATE('0tJY9tZ5j9A8ezVj4t2kWl',$,'MaximumAirFlowRate','Maximum allowable air flow rate.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1138=IFCSIMPLEPROPERTYTEMPLATE('1m5L1cerHC5QBK_sgjRufk',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1139=IFCSIMPLEPROPERTYTEMPLATE('2ujLieSvzFRukoPFGv9Ygz',$,'MaximumWorkingPressure','Maximum pressure that the object is manufactured to withstand.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1140=IFCSIMPLEPROPERTYTEMPLATE('30KYhNHZ56CuntelR4mRm9',$,'TemperatureRating','Temperature rating.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1141=IFCSIMPLEPROPERTYTEMPLATE('1r4ItZRXPFQwO2TwS3T2rI',$,'NominalAirFlowRate','Nominal air flow rate.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1142=IFCSIMPLEPROPERTYTEMPLATE('2PV69aKc944R2YVbiVBr6s',$,'OpenPressureDrop','Total pressure drop across damper.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1143=IFCSIMPLEPROPERTYTEMPLATE('2OCeMoJBHC9eswUh5djcDe',$,'LeakageFullyClosed','Leakage when fully closed.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1144=IFCSIMPLEPROPERTYTEMPLATE('3Homaf2qPAuQi$rME9XQ5M',$,'LossCoefficentCurve','Loss coefficient \X2\2013\X0\ blade position angle curve; ratio of pressure drop to velocity pressure versus blade angle; C = f (blade angle position).',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcReal',$,$,$,$,.READWRITE.); +#1145=IFCSIMPLEPROPERTYTEMPLATE('08QqhW8FTEYOftz9A_xmwC',$,'LeakageCurve','Leakage versus pressure drop; Leakage = f (pressure).',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#1146=IFCSIMPLEPROPERTYTEMPLATE('0ggpz4gAX1rgv49JjeAzya',$,'RegeneratedSoundCurve','Regenerated sound versus air flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcSoundPressureMeasure',$,$,$,$,.READWRITE.); +#1147=IFCSIMPLEPROPERTYTEMPLATE('3F3i9xDVHChBzTeSDye7$O',$,'FrameType','The type of frame used by the damper (e.g., Standard, Single Flange, Single Reversed Flange, Double Flange, etc.).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1148=IFCSIMPLEPROPERTYTEMPLATE('2qxnIF_Qr8zgqCrcBNjuQ0',$,'FrameDepth','The length (or depth) of the frame.\X2\000A000A\X0\For a damper, it is the length (or depth) of the damper frame.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1149=IFCSIMPLEPROPERTYTEMPLATE('2CYYPFkXnFsg$7cpYNQkac',$,'FrameThickness','The thickness of the frame.\X2\000A000A\X0\For a damper, it is the thickness of the damper frame material.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1150=IFCSIMPLEPROPERTYTEMPLATE('2WgCNEXK94DPb3z5l_PxDu',$,'CloseOffRating','Close off rating.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1151=IFCPROPERTYSETTEMPLATE('2ITWbSBkT1SOZACvd_BNr7',$,'Pset_DamperTypeControlDamper','Control damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeControl to Pset_DamperTypeControlDamper in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamper/CONTROLDAMPER,IfcDamperType/CONTROLDAMPER',(#1152,#1153)); +#1152=IFCSIMPLEPROPERTYTEMPLATE('3WUvF8bQz21up0Ecbx$uZe',$,'TorqueRange','Torque range: minimum operational torque to maximum allowable torque.',.P_BOUNDEDVALUE.,'IfcTorqueMeasure',$,$,$,$,$,.READWRITE.); +#1153=IFCSIMPLEPROPERTYTEMPLATE('3bQ4TxSFb9oR26AU7Lh29z',$,'ControlDamperOperation','The inherent characteristic of the control damper operation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1154,$,$,$,.READWRITE.); +#1154=IFCPROPERTYENUMERATION('PEnum_ControlDamperOperation',(IFCLABEL('EXPONENTIAL'),IFCLABEL('LINEAR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1155=IFCPROPERTYSETTEMPLATE('137pwHBRj5Rfd3dK4NTA3T',$,'Pset_DamperTypeFireDamper','Fire damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeFire to Pset_DamperTypeFireDamper in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamper/FIREDAMPER,IfcDamperType/FIREDAMPER',(#1156,#1158,#1160,#1161)); +#1156=IFCSIMPLEPROPERTYTEMPLATE('2BGv2rfTTCGx0Z83GuokOf',$,'ActuationType','Enumeration that identifies the different types of dampers.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1157,$,$,$,.READWRITE.); +#1157=IFCPROPERTYENUMERATION('PEnum_FireDamperActuationType',(IFCLABEL('GRAVITY'),IFCLABEL('SPRING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1158=IFCSIMPLEPROPERTYTEMPLATE('0TtB6RaDr8LRUhCukGOj2A',$,'ClosureRatingEnum','Enumeration that identifies the closure rating for the damper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1159,$,$,$,.READWRITE.); +#1159=IFCPROPERTYENUMERATION('PEnum_FireDamperClosureRating',(IFCLABEL('DYNAMIC'),IFCLABEL('STATIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1160=IFCSIMPLEPROPERTYTEMPLATE('2NvpnigTb5ZAlsuXDq6z3v',$,'FireResistanceRating','Measure of the fire resistance rating in hours (e.g., 1.5 hours, 2 hours, etc.).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1161=IFCSIMPLEPROPERTYTEMPLATE('0yfi6UMBP1cwF0F1oQav2B',$,'FusibleLinkTemperature','The temperature that the fusible link melts.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1162=IFCPROPERTYSETTEMPLATE('3K8VGux_v23AhfE3kHPHqR',$,'Pset_DamperTypeFireSmokeDamper','Combination Fire and Smoke damper type attributes.\X2\000A\X0\New Pset in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamper/FIRESMOKEDAMPER,IfcDamperType/FIRESMOKEDAMPER',(#1163,#1164,#1166,#1168,#1169)); +#1163=IFCSIMPLEPROPERTYTEMPLATE('27e8VgvQb34P9qEOTJdb6P',$,'DamperControlType','The type of control used to operate the damper (e.g., Open/Closed Indicator, Resettable Temperature Sensor, Temperature Override, etc.).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1164=IFCSIMPLEPROPERTYTEMPLATE('2HgMZXt1z7E9QIEdz7BAvi',$,'ActuationType','Enumeration that identifies the different types of dampers.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1165,$,$,$,.READWRITE.); +#1165=IFCPROPERTYENUMERATION('PEnum_FireDamperActuationType',(IFCLABEL('GRAVITY'),IFCLABEL('SPRING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1166=IFCSIMPLEPROPERTYTEMPLATE('1MuNPWG8nCEgGBqZELtksk',$,'ClosureRatingEnum','Enumeration that identifies the closure rating for the damper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1167,$,$,$,.READWRITE.); +#1167=IFCPROPERTYENUMERATION('PEnum_FireDamperClosureRating',(IFCLABEL('DYNAMIC'),IFCLABEL('STATIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1168=IFCSIMPLEPROPERTYTEMPLATE('3gy5OaMabDSgUqlNvIWhDI',$,'FireResistanceRating','Measure of the fire resistance rating in hours (e.g., 1.5 hours, 2 hours, etc.).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1169=IFCSIMPLEPROPERTYTEMPLATE('2t_NuRowX8Uhl8F7SF2DTg',$,'FusibleLinkTemperature','The temperature that the fusible link melts.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1170=IFCPROPERTYSETTEMPLATE('2QJGMgiZP9ru9w8ku_pHT8',$,'Pset_DamperTypeSmokeDamper','Smoke damper type attributes.\X2\000A\X0\Pset renamed from Pset_DamperTypeSmoke to Pset_DamperTypeSmokeDamper in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDamper/SMOKEDAMPER,IfcDamperType/SMOKEDAMPER',(#1171)); +#1171=IFCSIMPLEPROPERTYTEMPLATE('18P4E1JBTBkgoJkcpfLXLm',$,'ControlType','The type controller, signal modification effected and applicable ports',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1172=IFCPROPERTYSETTEMPLATE('2knW0fqL1CXwuB8jMcOYec',$,'Pset_DataTransmissionUnit','Properties common to a data transmission unit. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type MODEM.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/MODEM,IfcCommunicationsApplianceType/MODEM',(#1173,#1174,#1176)); +#1173=IFCSIMPLEPROPERTYTEMPLATE('0xyGOOsaj5aP_8rYVFrLyW',$,'WorkingState','Indicates the working state of device or system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1174=IFCSIMPLEPROPERTYTEMPLATE('1jt8Hlx$5AvffXKDfYb9HA',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1175,$,$,$,.READWRITE.); +#1175=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1176=IFCSIMPLEPROPERTYTEMPLATE('1IB6W4WFH4g9xdvOI58WwM',$,'DataTransmissionUnitUsage','Indicates the usage of the data transmission unit. It can be used to transmit data for different types of sensors.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1177,$,$,$,.READWRITE.); +#1177=IFCPROPERTYENUMERATION('PEnum_DataTransmissionUnitUsage',(IFCLABEL('EARTHQUAKE'),IFCLABEL('FOREIGNOBJECT'),IFCLABEL('WINDANDRAIN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1178=IFCPROPERTYSETTEMPLATE('2Pu7jjtVjAaxn3TUryxWLI',$,'Pset_DiscreteAccessoryColumnShoe','Shape properties common to column shoes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/SHOE,IfcDiscreteAccessoryType/SHOE',(#1179,#1180,#1181,#1182,#1183,#1184)); +#1179=IFCSIMPLEPROPERTYTEMPLATE('1FoWK2nLv7_hSWFAmEFGRp',$,'ColumnShoeBasePlateThickness','The thickness of the column shoe base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1180=IFCSIMPLEPROPERTYTEMPLATE('3rDhL7$VL4e8YJBew2z28G',$,'ColumnShoeBasePlateWidth','The width of the column shoe base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1181=IFCSIMPLEPROPERTYTEMPLATE('2W9A5asnD8wBFi$Jl9yKIJ',$,'ColumnShoeBasePlateDepth','The depth of the column shoe base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1182=IFCSIMPLEPROPERTYTEMPLATE('1qAkmEumr02AMwlDu5eMPb',$,'ColumnShoeCasingHeight','The height of the column shoe casing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1183=IFCSIMPLEPROPERTYTEMPLATE('00ovUUgdnFTv2ELJfjGEc$',$,'ColumnShoeCasingWidth','The width of the column shoe casing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1184=IFCSIMPLEPROPERTYTEMPLATE('3sX3tWxN5CDBgHLmZB5Yjm',$,'ColumnShoeCasingDepth','The depth of the column shoe casing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1185=IFCPROPERTYSETTEMPLATE('06fQVMIgH03Rlh7xykPrTQ',$,'Pset_DiscreteAccessoryCornerFixingPlate','Properties specific to corner fixing plates.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1186,#1187,#1188,#1189)); +#1186=IFCSIMPLEPROPERTYTEMPLATE('0nkJ9b50v4V90rpGPzHN3j',$,'CornerFixingPlateLength','The length of the L-shaped corner plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1187=IFCSIMPLEPROPERTYTEMPLATE('1scm2d_nn5cP7iFmg5oXe$',$,'CornerFixingPlateThickness','The thickness of the L-shaped corner plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1188=IFCSIMPLEPROPERTYTEMPLATE('389FDiDdPB1wdziUDTScxw',$,'CornerFixingPlateFlangeWidthInPlaneZ','The flange width of the L-shaped corner plate in plane Z.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1189=IFCSIMPLEPROPERTYTEMPLATE('3YrflYi497kxF7ESbzgwCe',$,'CornerFixingPlateFlangeWidthInPlaneX','The flange width of the L-shaped corner plate in plane X.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1190=IFCPROPERTYSETTEMPLATE('1mD_IkW2H66g4RJYNHQuIt',$,'Pset_DiscreteAccessoryDiagonalTrussConnector','Shape properties specific to connecting accessories in truss form with diagonal cross-bars.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1191,#1192,#1193,#1194,#1195,#1196)); +#1191=IFCSIMPLEPROPERTYTEMPLATE('1o8cGxi0bC3PnuuOpCRKJg',$,'DiagonalTrussHeight','The overall height of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1192=IFCSIMPLEPROPERTYTEMPLATE('3CUGTzjQ938R_ofXDESm_J',$,'DiagonalTrussLength','The overall length of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1193=IFCSIMPLEPROPERTYTEMPLATE('0aW_h4Obf6lReOrf0bsao1',$,'DiagonalTrussCrossBarSpacing','The spacing between diagonal cross-bar sections.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1194=IFCSIMPLEPROPERTYTEMPLATE('0iXZteVb16_Q9dYtDnMJgJ',$,'DiagonalTrussBaseBarDiameter','The nominal diameter of the base bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1195=IFCSIMPLEPROPERTYTEMPLATE('15r14GZar9kxdQfzGtOGfc',$,'DiagonalTrussSecondaryBarDiameter','The nominal diameter of the secondary bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1196=IFCSIMPLEPROPERTYTEMPLATE('3znKVZtr55$QuziHCpMEGR',$,'DiagonalTrussCrossBarDiameter','The nominal diameter of the diagonal cross-bars.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1197=IFCPROPERTYSETTEMPLATE('1h8SSCQKv6T98bxmPqL$Am',$,'Pset_DiscreteAccessoryEdgeFixingPlate','Properties specific to edge fixing plates.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1198,#1199,#1200,#1201)); +#1198=IFCSIMPLEPROPERTYTEMPLATE('1VamEd8j9Fx9Jnwq1ooxWQ',$,'EdgeFixingPlateLength','The length of the L-shaped edge plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1199=IFCSIMPLEPROPERTYTEMPLATE('0K4A3QLmL8kA65Qa9pUDTq',$,'EdgeFixingPlateThickness','The thickness of the L-shaped edge plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1200=IFCSIMPLEPROPERTYTEMPLATE('13J57OpBH7PAhifpiKQqJk',$,'EdgeFixingPlateFlangeWidthInPlaneZ','The flange width of the L-shaped edge plate in plane Z.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1201=IFCSIMPLEPROPERTYTEMPLATE('1xWsicWZn6GvoS1yxXUmSd',$,'EdgeFixingPlateFlangeWidthInPlaneX','The flange width of the L-shaped edge plate in plane X.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1202=IFCPROPERTYSETTEMPLATE('03f4XIDEn41uoxbAW9Yrsc',$,'Pset_DiscreteAccessoryFixingSocket','Properties common to fixing sockets.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1203,#1204,#1205,#1206)); +#1203=IFCSIMPLEPROPERTYTEMPLATE('2c4uPABzrDAx3SwqpuFvHe',$,'FixingSocketTypeReference','Type reference for the fixing socket according to local standards.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#1204=IFCSIMPLEPROPERTYTEMPLATE('1ndN64Uxv0LP2PW5D3kG2P',$,'FixingSocketHeight','The overall height of the fixing socket.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1205=IFCSIMPLEPROPERTYTEMPLATE('1IkRQ$5ND5Af4VJCV1q4HI',$,'FixingSocketThreadDiameter','The nominal diameter of the thread.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1206=IFCSIMPLEPROPERTYTEMPLATE('1ITlL88O56kOOs5a9L7SQx',$,'FixingSocketThreadLength','The length of the threaded part of the fixing socket.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1207=IFCPROPERTYSETTEMPLATE('1bqBRpdg5FxwIGHcGCPhiJ',$,'Pset_DiscreteAccessoryLadderTrussConnector','Shape properties specific to connecting accessories in truss form with straight cross-bars in ladder shape.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1208,#1209,#1210,#1211,#1212,#1213)); +#1208=IFCSIMPLEPROPERTYTEMPLATE('3siDmFfqrDYh728LFms0Mq',$,'LadderTrussHeight','The overall height of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1209=IFCSIMPLEPROPERTYTEMPLATE('1q0$yvqkLAPvfZgfKXdriJ',$,'LadderTrussLength','The overall length of the truss connector.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1210=IFCSIMPLEPROPERTYTEMPLATE('2$S95UBYLAp92ksYEnivXB',$,'LadderTrussCrossBarSpacing','The spacing between the straight cross-bars.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1211=IFCSIMPLEPROPERTYTEMPLATE('0oJm7P1yb4JBXaSoQsYuX1',$,'LadderTrussBaseBarDiameter','The nominal diameter of the base bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1212=IFCSIMPLEPROPERTYTEMPLATE('2wGsBOcKPCoeofnopXiCg1',$,'LadderTrussSecondaryBarDiameter','The nominal diameter of the secondary bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1213=IFCSIMPLEPROPERTYTEMPLATE('1G$3EihKn8XeJ5r_YmObwp',$,'LadderTrussCrossBarDiameter','The nominal diameter of the straight cross-bars.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1214=IFCPROPERTYSETTEMPLATE('20is0HT053bg8K9JYIvP4e',$,'Pset_DiscreteAccessoryStandardFixingPlate','Properties specific to standard fixing plates.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1215,#1216,#1217)); +#1215=IFCSIMPLEPROPERTYTEMPLATE('1mdKg_r_bDhBIjm2xXGQcq',$,'StandardFixingPlateWidth','The width of the standard fixing plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1216=IFCSIMPLEPROPERTYTEMPLATE('1TROubSSzFrhVmTy8TISYM',$,'StandardFixingPlateDepth','The depth of the standard fixing plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1217=IFCSIMPLEPROPERTYTEMPLATE('307I52HjTDChkcr3ramq_o',$,'StandardFixingPlateThickness','The thickness of the standard fixing plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1218=IFCPROPERTYSETTEMPLATE('3DPqoV$jv0WBwdJ9czIoQV',$,'Pset_DiscreteAccessoryTypeBracket','Properties of a bracket. The property set can be used by the predefined type BRACKET of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/BRACKET,IfcDiscreteAccessoryType/BRACKET',(#1219)); +#1219=IFCSIMPLEPROPERTYTEMPLATE('18LK9ksZH0GfqLG7hzHL51',$,'IsInsulated','Indicates whether the element is insulated or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1220=IFCPROPERTYSETTEMPLATE('0JKBtP5yD4hQOl5VFTYtyo',$,'Pset_DiscreteAccessoryTypeCableArranger','Properties used for a cable arranger. The property set can be used by the predefined type CABLEARRANGER of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/CABLEARRANGER,IfcDiscreteAccessoryType/CABLEARRANGER',(#1221)); +#1221=IFCSIMPLEPROPERTYTEMPLATE('3lWpSWP41B0e7Pd_YBE3Mw',$,'CableArrangerPosition','Indicates the directional position of the cable arranger: vertical, horizontal, front or rear. It is relative to the element (usually a cabinet) that the cable arranger is affiliated.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1222,$,$,$,.READWRITE.); +#1222=IFCPROPERTYENUMERATION('PEnum_ArrangerPositionEnum',(IFCLABEL('FRONTSIDE'),IFCLABEL('HORIZONTAL'),IFCLABEL('REARSIDE'),IFCLABEL('VERTICAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1223=IFCPROPERTYSETTEMPLATE('2vH6ktT2H8Hw2NQa$OFRnZ',$,'Pset_DiscreteAccessoryTypeInsulator','Properties of an insulator. The property set can be used by the predefined type INSULATOR of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/INSULATOR,IfcDiscreteAccessoryType/INSULATOR',(#1224,#1225,#1226,#1227,#1228,#1230,#1231,#1232,#1233,#1234,#1235,#1236)); +#1224=IFCSIMPLEPROPERTYTEMPLATE('1rse6D19D33O0hLeo1XEBN',$,'RatedCurrent','The current that a device is designed to handle.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1225=IFCSIMPLEPROPERTYTEMPLATE('065aGD3TT1JBWtARIJJrl9',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1226=IFCSIMPLEPROPERTYTEMPLATE('26mMD0ZbH8jgUDgKAYZPOU',$,'InsulationVoltage','The insulation voltage.\X2\000A000A\X0\The max voltage for normal insulation operation.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1227=IFCSIMPLEPROPERTYTEMPLATE('3jU6EDQaP2bRjXY_GaA0j8',$,'BreakdownVoltageTolerance','Nominal value of the spark gap breakdown voltage tolerance.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1228=IFCSIMPLEPROPERTYTEMPLATE('2Ut9648K19ehj82x$jrKgH',$,'InsulationMethod','The method used to insulate.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1229,$,$,$,.READWRITE.); +#1229=IFCPROPERTYENUMERATION('PEnum_InsulatorType',(IFCLABEL('LONGRODINSULATOR'),IFCLABEL('PININSULATOR'),IFCLABEL('POSTINSULATOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1230=IFCSIMPLEPROPERTYTEMPLATE('0iYNigMsb27Q6TvsBkGMM1',$,'OperationalTemperatureRange','The temperature range in which the device operates normally.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1231=IFCSIMPLEPROPERTYTEMPLATE('0Zorfmv1z3Nu8e7UBc9vUy',$,'CreepageDistance','Shortest distance or the sum of the shortest distances along the surface on an insulator between two conductive parts which normally have the operating voltage between them. (IEV ref 471-01-04)',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1232=IFCSIMPLEPROPERTYTEMPLATE('1OZZoKChz6pQuAtQeaRgrn',$,'InstallationMethod','Method of installation of cable/conductor. Installation methods are typically defined by reference in standards such as IEC 60364-5-52, table 52A-1 or BS7671 Appendix 4 Table 4A1 etc. Selection of the value to be used should be determined from such a standard according to local usage.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1233=IFCSIMPLEPROPERTYTEMPLATE('0wxdpX_pnBUhHCBrDFkg4Y',$,'LightningPeakVoltage','The peak lightning voltage that the insulator could withstand.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1234=IFCSIMPLEPROPERTYTEMPLATE('2yvb7J1Cb14AoKLLy1l6o6',$,'BendingStrength','Bending strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1235=IFCSIMPLEPROPERTYTEMPLATE('2na1UQFy12sh9ZEFJFKakc',$,'RMSWithstandVoltage','Rms value of sinusoidal power frequency voltage that the insulation of the given equipment can withstand during tests made under specified conditions and for a specified duration. (IEV ref 614-03-22\X2\FF09\X0\',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1236=IFCSIMPLEPROPERTYTEMPLATE('2I5$vYtBnDEvyOtAP1TAW5',$,'Voltage','The actual voltage and operable range.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1237=IFCPROPERTYSETTEMPLATE('3805pJu4T2dwQIQXVDLc$z',$,'Pset_DiscreteAccessoryTypeLock','Properties of locking equipment. The property set can be used by the predefined type LOCK of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/LOCK,IfcDiscreteAccessoryType/LOCK',(#1238,#1239)); +#1238=IFCSIMPLEPROPERTYTEMPLATE('0hLBxHda53ERGtghMjV9mQ',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#1239=IFCSIMPLEPROPERTYTEMPLATE('2bhZbwK1n7mvjgQRpmriFt',$,'RequiredClosureSpacing','Required length of the closure spacing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1240=IFCPROPERTYSETTEMPLATE('3_oKKv8cP62PfYSP2AfRwC',$,'Pset_DiscreteAccessoryTypeRailBrace','Properties of a rail brace. The property set can be used by the predefined type RAILBRACE of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/RAILBRACE,IfcDiscreteAccessoryType/RAILBRACE',(#1241)); +#1241=IFCSIMPLEPROPERTYTEMPLATE('047UDJ0gj1lRENoXIO374s',$,'IsTemporary','Indicates if the installation of the element is temporary or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1242=IFCPROPERTYSETTEMPLATE('2KgNBk8Yv0WfAd0QH1iKbI',$,'Pset_DiscreteAccessoryTypeRailLubrication','Properties of rail lubrication equipment. The property set can be used by the predefined type RAIL_LUBRICATION of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/RAIL_LUBRICATION,IfcDiscreteAccessoryType/RAIL_LUBRICATION',(#1243,#1245,#1246,#1248)); +#1243=IFCSIMPLEPROPERTYTEMPLATE('2wdN$DGnbByuprXi4eq6sI',$,'PositionInTrack','Indicates the relative position of the element in track, which lies to the left or right as facing in the direction of increasing stationing values.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1244,$,$,$,.READWRITE.); +#1244=IFCPROPERTYENUMERATION('PEnum_RelativePosition',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1245=IFCSIMPLEPROPERTYTEMPLATE('2izTEleH56IxZ97pEyUjGk',$,'MaximumNoiseEmissions','Maximum noise emissions limit at this location.',.P_SINGLEVALUE.,'IfcSoundPowerLevelMeasure',$,$,$,$,$,.READWRITE.); +#1246=IFCSIMPLEPROPERTYTEMPLATE('3vGZ4P5BHAJf3rIHlcLdyR',$,'LubricationSystemType','Design and type of lubricating system e.g. active, passive.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1247,$,$,$,.READWRITE.); +#1247=IFCPROPERTYENUMERATION('PEnum_LubricationSystemType',(IFCLABEL('ACTIVE_LUBRICATION'),IFCLABEL('PASSIVE_LUBRICATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1248=IFCSIMPLEPROPERTYTEMPLATE('1ytT1TuPfCOwdAGlJ3NrFR',$,'LubricationPowerSupplyType','Type of power supply method used by the rail lubrication.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1249,$,$,$,.READWRITE.); +#1249=IFCPROPERTYENUMERATION('PEnum_LubricationPowerSupply',(IFCLABEL('ELECTRIC'),IFCLABEL('PHOTOVOLTAIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1250=IFCPROPERTYSETTEMPLATE('1SeM2Lak973AT6QH6sbJTR',$,'Pset_DiscreteAccessoryTypeRailPad','Properties of rail pads. The property set can be used by the predefined type RAILPAD of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/RAILPAD,IfcDiscreteAccessoryType/RAILPAD',(#1251)); +#1251=IFCSIMPLEPROPERTYTEMPLATE('0lntKs1NTDlQ4sbvS36rzD',$,'RailPadStiffness','Indicates the stiffness of a rail pad.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1252,$,$,$,.READWRITE.); +#1252=IFCPROPERTYENUMERATION('PEnum_RailPadStiffness',(IFCLABEL('MEDIUM'),IFCLABEL('SOFT'),IFCLABEL('STIFF'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1253=IFCPROPERTYSETTEMPLATE('0YxzvTlrD0kx1OhFGY01Z1',$,'Pset_DiscreteAccessoryTypeSlidingChair','Properties of a sliding chair. The property set can be used by the predefined type SLIDINGCHAIR of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/SLIDINGCHAIR,IfcDiscreteAccessoryType/SLIDINGCHAIR',(#1254)); +#1254=IFCSIMPLEPROPERTYTEMPLATE('3y9DF8yNXANu59NmBQFUP1',$,'IsSelfLubricated','Indicates whether the element is self lubricated or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1255=IFCPROPERTYSETTEMPLATE('1H5Dd0ehLBLuyrQhan323l',$,'Pset_DiscreteAccessoryTypeSoundAbsorption','Properties of sound absorption equipment used in railway. The property set can be used by the predefined type SOUNDABSORPTION of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/SOUNDABSORPTION,IfcDiscreteAccessoryType/SOUNDABSORPTION',(#1256)); +#1256=IFCSIMPLEPROPERTYTEMPLATE('2yFjFmemf7IxnTjJuPy_sm',$,'SoundAbsorptionLimit','Mandatory limit values in sound absorption.',.P_SINGLEVALUE.,'IfcSoundPowerLevelMeasure',$,$,$,$,$,.READWRITE.); +#1257=IFCPROPERTYSETTEMPLATE('2aL1mmV4D0UeH6k_KKp9bl',$,'Pset_DiscreteAccessoryTypeTensioningEquipment','Properties of tensioning equipment used in railway. The property set can be used by the predefined type TENSIONINGEQUIPMENT of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/TENSIONINGEQUIPMENT,IfcDiscreteAccessoryType/TENSIONINGEQUIPMENT',(#1258,#1259,#1260,#1261,#1262,#1263)); +#1258=IFCSIMPLEPROPERTYTEMPLATE('21K8ZddfP80vKyINrG_MjG',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1259=IFCSIMPLEPROPERTYTEMPLATE('3lic5sl4DD2usPUWfBG2l4',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#1260=IFCSIMPLEPROPERTYTEMPLATE('1rgI5RXH993PtCf7Wxa4QC',$,'HasBreakLineLock','Indicates whether the equipment has the function of brake line lock or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1261=IFCSIMPLEPROPERTYTEMPLATE('21u61SEib0t89M_25RccuZ',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1262=IFCSIMPLEPROPERTYTEMPLATE('3tHkjsxKv7BRCIPeZ$6aKM',$,'RatioOfWireTension','The ratio of wire tension to tensioner weight.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1263=IFCSIMPLEPROPERTYTEMPLATE('1988awfJb0cBT13$drzWyl',$,'TransmissionEfficiency','Transmission efficiency of the tensioning equipment.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#1264=IFCPROPERTYSETTEMPLATE('1iYx_TL5P5axE2ZRss$tYk',$,'Pset_DiscreteAccessoryWireLoop','Shape properties common to wire loop joint connectors.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory,IfcDiscreteAccessoryType',(#1265,#1266,#1267,#1268,#1269,#1270)); +#1265=IFCSIMPLEPROPERTYTEMPLATE('00L5JCc$P74fw62JYK1Z0y',$,'WireLoopBasePlateThickness','The thickness of the base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1266=IFCSIMPLEPROPERTYTEMPLATE('3bMuB4RlX4GeTupCnwFyDy',$,'WireLoopBasePlateWidth','The width of the base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1267=IFCSIMPLEPROPERTYTEMPLATE('0fIPcoqp90huPZAB_84NF2',$,'WireLoopBasePlateLength','The length of the base plate.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1268=IFCSIMPLEPROPERTYTEMPLATE('25su$9cnz1chMXTleCflEs',$,'WireDiameter','The nominal diameter of the wire.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1269=IFCSIMPLEPROPERTYTEMPLATE('1dALuwemn1_wJvCAuMFLIu',$,'WireEmbeddingLength','The length of the part of wire which is embedded in the precast concrete element.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1270=IFCSIMPLEPROPERTYTEMPLATE('2HrBNfRdf3s9SB$bDZ4wWe',$,'WireLoopLength','The length of the fastening loop part of the wire.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1271=IFCPROPERTYSETTEMPLATE('1pXMj3AkvFvOinHxiPqJUk',$,'Pset_DistributionBoardOccurrence','Properties that may be applied to electric distribution board occurrences.',.PSET_OCCURRENCEDRIVEN.,'IfcElectricDistributionBoard',(#1272,#1273)); +#1272=IFCSIMPLEPROPERTYTEMPLATE('3hR8GZAoLDoAWoGcCo$MUh',$,'IsMain','Identifies if the current instance is a main distribution point or topmost level in an electrical distribution hierarchy (= TRUE) or a sub-main distribution point (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1273=IFCSIMPLEPROPERTYTEMPLATE('11$rvYBQn1IfOSKuSJLNAh',$,'IsSkilledOperator','Identifies if the current instance requires a skilled person or instructed person to perform operations on the distribution board (= TRUE) or whether operations may be performed by a person without appropriate skills or instruction (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1274=IFCPROPERTYSETTEMPLATE('2$wUqM3g9C6AebnnFmmjlo',$,'Pset_DistributionBoardTypeCommon','Properties that may be applied to electric distribution boards.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricDistributionBoard,IfcElectricDistributionBoardType',(#1275,#1276)); +#1275=IFCSIMPLEPROPERTYTEMPLATE('1N1gC5RTD4i9$LGVK8KiA4',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1276=IFCSIMPLEPROPERTYTEMPLATE('1FkKfJRN14M83jJxXUNgZw',$,'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',$,#1277,$,$,$,.READWRITE.); +#1277=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1278=IFCPROPERTYSETTEMPLATE('3xDmgFZZD7qv6mhunXYi0k',$,'Pset_DistributionBoardTypeDispatchingBoard','Properties for IfcDistributionBoard with PredefinedType DISPATCHINGBOARD.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionBoard/DISPATCHINGBOARD,IfcDistributionBoardType/DISPATCHINGBOARD',(#1279,#1280)); +#1279=IFCSIMPLEPROPERTYTEMPLATE('1wx3ikcSb7Tx7B$RT4yzAc',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#1280=IFCSIMPLEPROPERTYTEMPLATE('1ZqjdrjGf2fPIBDmq5nBxJ',$,'DispatchingBoardType','Indicates the type of dispatching board.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1281,$,$,$,.READWRITE.); +#1281=IFCPROPERTYENUMERATION('PEnum_DispatchingBoardType',(IFCLABEL('CENTER'),IFCLABEL('STATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1282=IFCPROPERTYSETTEMPLATE('0pXFVqj2j0dAJ4_jzPc4EM',$,'Pset_DistributionBoardTypeDistributionFrame','Properties for IfcDistributionBoard with PredefinedType DISTRIBUTIONFRAME.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionBoard/DISTRIBUTIONFRAME,IfcDistributionBoardType/DISTRIBUTIONFRAME',(#1283)); +#1283=IFCSIMPLEPROPERTYTEMPLATE('2tI37D7Dr1MxNNBq3A3FkS',$,'PortCapacity','Indicates the number of ports in the passive device that can be used to interconnect cables.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#1284=IFCPROPERTYSETTEMPLATE('1C5QwWnILEuArhsGPBVPE4',$,'Pset_DistributionChamberElementCommon','Common properties of all occurrences of IfcDistributionChamberElement.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement,IfcDistributionChamberElementType',(#1285,#1286)); +#1285=IFCSIMPLEPROPERTYTEMPLATE('0iOlGYMwXDvfz63xWMaJlz',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.\X2\000A000A\X0\E.g. ''WWS/VS1/400/001'', which indicates the occurrence belongs to system WWS, subsystems VSI/400, and has the component number 001.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1286=IFCSIMPLEPROPERTYTEMPLATE('35jjb2uCn9hfVoHS0wdP8T',$,'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',$,#1287,$,$,$,.READWRITE.); +#1287=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1288=IFCPROPERTYSETTEMPLATE('3QaDlc9h1CBhmFuLky0Nqb',$,'Pset_DistributionChamberElementTypeFormedDuct','Space formed in the ground for the passage of pipes, cables, ducts.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/FORMEDDUCT,IfcDistributionChamberElementType/FORMEDDUCT',(#1289,#1290,#1291,#1292,#1293,#1294)); +#1289=IFCSIMPLEPROPERTYTEMPLATE('10yoXIsrDFG8b5_wKGj9Ld',$,'ClearWidth','The clear width.\X2\000A000A\X0\It indicates the formed space in the duct.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1290=IFCSIMPLEPROPERTYTEMPLATE('3LwcmuFnX6GujOpcnsD14o',$,'ClearDepth','The clear depth.\X2\000A000A\X0\It indicates the formed space in the duct.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1291=IFCSIMPLEPROPERTYTEMPLATE('2n3gLV5FDD1whTzxqWCAKw',$,'WallThickness','The thickness of the wall construction.\X2\000A\X0\NOTE: It is assumed that walls will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1292=IFCSIMPLEPROPERTYTEMPLATE('2IQ_xlizX92u2t7Parl0YD',$,'BaseThickness','The thickness of the base construction, assumed to be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1293=IFCSIMPLEPROPERTYTEMPLATE('1gG21PJLL0ZPP0WynscknR',$,'AccessCoverLoadRating','The load rating of the access cover (which may be a value or an alphanumerically defined class rating).',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#1294=IFCSIMPLEPROPERTYTEMPLATE('1iVKstS_f0oOOQSWMMyod$',$,'CableDuctOccupancyRatio','Indicates the ratio between the number of cables in the duct and the maximum number of cables that the duct can contain.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1295=IFCPROPERTYSETTEMPLATE('3SrvZH0QHFTA7BZkevLH9s',$,'Pset_DistributionChamberElementTypeInspectionChamber','Chamber constructed on a drain, sewer or pipeline and with a removable cover, that permits visible inspection.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/INSPECTIONCHAMBER,IfcDistributionChamberElementType/INSPECTIONCHAMBER',(#1296,#1297,#1298,#1299,#1300,#1301,#1302,#1303,#1304,#1305,#1306,#1307,#1308)); +#1296=IFCSIMPLEPROPERTYTEMPLATE('2wNpEUcAv6WBwb$TqoPBpC',$,'ChamberLengthOrRadius','Length or, in the event of the shape being circular in plan, the radius of the chamber.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1297=IFCSIMPLEPROPERTYTEMPLATE('3ryYgC$WH4mAKZS_wGBihO',$,'ChamberWidth','Width, in the event of the shape being non circular in plan.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1298=IFCSIMPLEPROPERTYTEMPLATE('2KWdRJ67DDifAOQHfuoDMl',$,'InspectionChamberInvertLevel','Level of the lowest part of the cross section as measured from ground level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1299=IFCSIMPLEPROPERTYTEMPLATE('1MrpQ0hEzDkeWBBX9LMAIS',$,'SoffitLevel','Level of the highest internal part of the cross section as measured from ground level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1300=IFCSIMPLEPROPERTYTEMPLATE('2x6C0qlOjBwv04KTk_eoaj',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1301=IFCSIMPLEPROPERTYTEMPLATE('3gTAGUDfPDq90oUngZDzJs',$,'WallThickness','The thickness of the wall construction.\X2\000A\X0\NOTE: It is assumed that walls will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1302=IFCSIMPLEPROPERTYTEMPLATE('3QaHY1$8rE4e6jupGOTRWN',$,'BaseMaterial','The material from which the base of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1303=IFCSIMPLEPROPERTYTEMPLATE('0bOI2GKyT7RQkRiNkMzr6q',$,'BaseThickness','The thickness of the base construction, assumed to be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1304=IFCSIMPLEPROPERTYTEMPLATE('2BCPQCAlTCA9DTEDwjzU1S',$,'WithBackdrop','Indicates whether the chamber has a backdrop or tumbling bay (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1305=IFCSIMPLEPROPERTYTEMPLATE('2uWf8Qk394n8_9B8AifK0I',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1306=IFCSIMPLEPROPERTYTEMPLATE('36Juil$O9CBgR3fto$5UyJ',$,'AccessLengthOrRadius','The length of the chamber access cover or, where the plan shape of the cover is circular, the radius.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1307=IFCSIMPLEPROPERTYTEMPLATE('0xs$PLvnH98wp59_n6iEy3',$,'AccessWidth','The width of the chamber access cover where the plan shape of the cover is not circular.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1308=IFCSIMPLEPROPERTYTEMPLATE('0jDdbXm9PAR8SbLFyy0jvw',$,'AccessCoverLoadRating','The load rating of the access cover (which may be a value or an alphanumerically defined class rating).',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#1309=IFCPROPERTYSETTEMPLATE('0ut05cIEXELvxbA3SRIafj',$,'Pset_DistributionChamberElementTypeInspectionPit','Recess or chamber formed to permit access for inspection of substructure and services (definition modified from BS6100 221 4128).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/INSPECTIONPIT,IfcDistributionChamberElementType/INSPECTIONPIT',(#1310,#1311,#1312)); +#1310=IFCSIMPLEPROPERTYTEMPLATE('1Qt9hBI1DANPaGcvd23nk6',$,'Length','The length of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1311=IFCSIMPLEPROPERTYTEMPLATE('09aXuLhgv11Q8jOVZ_WpT$',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1312=IFCSIMPLEPROPERTYTEMPLATE('3kgHObXjv3b8gO7E_y2eGo',$,'Depth','The depth of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1313=IFCPROPERTYSETTEMPLATE('00n_4zNs1DXRMGuf4kVENB',$,'Pset_DistributionChamberElementTypeManhole','Chamber constructed on a drain, sewer or pipeline and with a removable cover, that permits the entry of a person.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/MANHOLE,IfcDistributionChamberElementType/MANHOLE',(#1314,#1315,#1316,#1317,#1318,#1319,#1320,#1321,#1322,#1323,#1324,#1325,#1326,#1327,#1328,#1329,#1330,#1331)); +#1314=IFCSIMPLEPROPERTYTEMPLATE('2KdIVbpPLAQvI1T_Y6wzdf',$,'InvertLevel','Level of the lowest part of the cross section as measured from ground level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1315=IFCSIMPLEPROPERTYTEMPLATE('2x3PCe01TA$uDZZ7eYwRfK',$,'SoffitLevel','Level of the highest internal part of the cross section as measured from ground level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1316=IFCSIMPLEPROPERTYTEMPLATE('1Zv2T1AJz7V9fmCVh73P36',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1317=IFCSIMPLEPROPERTYTEMPLATE('1Y8bQFuv570PV5oJp80Gct',$,'WallThickness','The thickness of the wall construction.\X2\000A\X0\NOTE: It is assumed that walls will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1318=IFCSIMPLEPROPERTYTEMPLATE('25VZwww$nEQvoJK2uCQVG6',$,'BaseMaterial','The material from which the base of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1319=IFCSIMPLEPROPERTYTEMPLATE('0wRsmxb5v8Te7_PCxw4TTF',$,'BaseThickness','The thickness of the base construction, assumed to be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1320=IFCSIMPLEPROPERTYTEMPLATE('2v$_TGojfDguFN8WqKWtni',$,'IsShallow','Indicates whether the chamber has been designed as being shallow (TRUE) or deep (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1321=IFCSIMPLEPROPERTYTEMPLATE('0OSCY73xz6ph0M37kKxZlV',$,'HasSteps','Indicates whether the chamber has steps (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1322=IFCSIMPLEPROPERTYTEMPLATE('0l$UX$xnT7jQlc87zV1228',$,'WithBackdrop','Indicates whether the chamber has a backdrop or tumbling bay (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1323=IFCSIMPLEPROPERTYTEMPLATE('1flUDfIY9AaOcKCmDEWPFU',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1324=IFCSIMPLEPROPERTYTEMPLATE('1OsvImAxvDoO9sx4kUTGFe',$,'AccessLengthOrRadius','The length of the chamber access cover or, where the plan shape of the cover is circular, the radius.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1325=IFCSIMPLEPROPERTYTEMPLATE('0qH9wQsHb1f9AjmycB4wJ8',$,'AccessWidth','The width of the chamber access cover where the plan shape of the cover is not circular.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1326=IFCSIMPLEPROPERTYTEMPLATE('2btnxYn9D4aANRrQ5wuA7X',$,'AccessCoverLoadRating','The load rating of the access cover (which may be a value or an alphanumerically defined class rating).',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#1327=IFCSIMPLEPROPERTYTEMPLATE('1ctJTpmbPBcAzVfcNNL9lb',$,'IsAccessibleOnFoot','Indicates whether the element is accessible on foot (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1328=IFCSIMPLEPROPERTYTEMPLATE('3LoyVWS6vCq9t_Pliu9evV',$,'IsLocked','Indicates whether the element is locked (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1329=IFCSIMPLEPROPERTYTEMPLATE('2kx1kfpdf1pPqBVyrRToJh',$,'NumberOfCableEntries','Indicates the number of cable entries in the manhole.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1330=IFCSIMPLEPROPERTYTEMPLATE('39Bm$fesD8PRcgBLtMBmyS',$,'NumberOfManholeCovers','Indicates the number of manhole covers.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1331=IFCSIMPLEPROPERTYTEMPLATE('2slD70Ak59P9$1k2k1VPwx',$,'TypeOfShaft','Additional information on the purpose of the shaft.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1332,$,$,$,.READWRITE.); +#1332=IFCPROPERTYENUMERATION('PEnum_TypeOfShaft',(IFCLABEL('DIVERSIONSHAFT'),IFCLABEL('FLUSHINGCHAMBER'),IFCLABEL('GATESHAFT'),IFCLABEL('GULLY'),IFCLABEL('INSPECTIONCHAMBER'),IFCLABEL('PUMPSHAFT'),IFCLABEL('ROOFWATERSHAFT'),IFCLABEL('SHAFTWITHCHECKVALVE'),IFCLABEL('SLURRYCOLLECTOR'),IFCLABEL('SOAKAWAY'),IFCLABEL('WELL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1333=IFCPROPERTYSETTEMPLATE('1eUBCt1mzAVuHku0Nidx5P',$,'Pset_DistributionChamberElementTypeMeterChamber','Chamber that houses a meter(s) (definition modified from BS6100 250 6224).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/METERCHAMBER,IfcDistributionChamberElementType/METERCHAMBER',(#1334,#1335,#1336,#1337,#1338,#1339,#1340)); +#1334=IFCSIMPLEPROPERTYTEMPLATE('1ZuLxRh7HBMQrKz5SYTsEq',$,'ChamberLengthOrRadius','Length or, in the event of the shape being circular in plan, the radius of the chamber.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1335=IFCSIMPLEPROPERTYTEMPLATE('1PqE8zxKX2weHbW8YW9Pcm',$,'ChamberWidth','Width, in the event of the shape being non circular in plan.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1336=IFCSIMPLEPROPERTYTEMPLATE('192FMF1Hz2selGTu8I8SdP',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1337=IFCSIMPLEPROPERTYTEMPLATE('2fi0IJriT8aQv2oM3kCM5E',$,'WallThickness','The thickness of the wall construction.\X2\000A\X0\NOTE: It is assumed that walls will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1338=IFCSIMPLEPROPERTYTEMPLATE('1iatYBAYr4MPWq6$OUDxPK',$,'BaseMaterial','The material from which the base of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1339=IFCSIMPLEPROPERTYTEMPLATE('2TSIJzSTb36u5SHMz3GukK',$,'BaseThickness','The thickness of the base construction, assumed to be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1340=IFCSIMPLEPROPERTYTEMPLATE('0iUrEttaX9APxjmOyohGda',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1341=IFCPROPERTYSETTEMPLATE('2dzrRYb89EiRqfDrH0$Rr8',$,'Pset_DistributionChamberElementTypeSump','Recess or small chamber into which liquid is drained to facilitate its removal.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/SUMP,IfcDistributionChamberElementType/SUMP',(#1342,#1343,#1344)); +#1342=IFCSIMPLEPROPERTYTEMPLATE('0UK7P3lED6bA13_0a7UNMB',$,'Length','The length of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1343=IFCSIMPLEPROPERTYTEMPLATE('1vtxucKJX1xufGrJOWJemb',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1344=IFCSIMPLEPROPERTYTEMPLATE('3u25ZkOd5B2xuvlxouLYY9',$,'SumpInvertLevel','The lowest point in the cross section of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1345=IFCPROPERTYSETTEMPLATE('30w82vFkL4pvIrc3UPl3jF',$,'Pset_DistributionChamberElementTypeTrench','Excavation, the length of which greatly exceeds the width.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/TRENCH,IfcDistributionChamberElementType/TRENCH',(#1346,#1347,#1348)); +#1346=IFCSIMPLEPROPERTYTEMPLATE('2h3dXmW_j2kBSoeCDjlnrd',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1347=IFCSIMPLEPROPERTYTEMPLATE('3LbpMnjPL7yhn2T4SeZRZx',$,'Depth','The depth of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1348=IFCSIMPLEPROPERTYTEMPLATE('1wjEFC5cn2Zwr87eRqDs0r',$,'InvertLevel','Level of the lowest part of the cross section as measured from ground level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1349=IFCPROPERTYSETTEMPLATE('0A7JEPAOv6NAi5yPV47IP1',$,'Pset_DistributionChamberElementTypeValveChamber','Chamber that houses a valve(s).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement/VALVECHAMBER,IfcDistributionChamberElementType/VALVECHAMBER',(#1350,#1351,#1352,#1353,#1354,#1355,#1356)); +#1350=IFCSIMPLEPROPERTYTEMPLATE('0GRyxaflr5wxEjM6tLi9zn',$,'ChamberLengthOrRadius','Length or, in the event of the shape being circular in plan, the radius of the chamber.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1351=IFCSIMPLEPROPERTYTEMPLATE('13S3swzFf8I9po8PV8V4yF',$,'ChamberWidth','Width, in the event of the shape being non circular in plan.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1352=IFCSIMPLEPROPERTYTEMPLATE('2J_MBiX4v5zP9qwT4fPqWx',$,'WallMaterial','The material from which the wall of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1353=IFCSIMPLEPROPERTYTEMPLATE('2U8HaR01r2fOYZbAOycr_L',$,'WallThickness','The thickness of the wall construction.\X2\000A\X0\NOTE: It is assumed that walls will be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1354=IFCSIMPLEPROPERTYTEMPLATE('3wifyTlpfD$835At9$$Zmo',$,'BaseMaterial','The material from which the base of the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber base will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1355=IFCSIMPLEPROPERTYTEMPLATE('1f415b39j4uuyX5dIdz6T_',$,'BaseThickness','The thickness of the base construction, assumed to be constructed at a single thickness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1356=IFCSIMPLEPROPERTYTEMPLATE('3dYHB59Y19eOqW8uhcGztX',$,'AccessCoverMaterial','The material from which the access cover to the chamber is constructed.\X2\000A\X0\NOTE: It is assumed that chamber walls will be constructed of a single material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1357=IFCPROPERTYSETTEMPLATE('0Lt6NDHBL5TeHAWYsnJd1G',$,'Pset_DistributionPortCommon','Common attributes attached to an instance of IfcDistributionPort.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort',(#1358,#1359)); +#1358=IFCSIMPLEPROPERTYTEMPLATE('39_7i1QyL3vfUgU_e3uTje',$,'PortNumber','The port index for logically ordering the port within the containing element or element type.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#1359=IFCSIMPLEPROPERTYTEMPLATE('3gm3TjJ4HAqfKKlQ4ZTyN8',$,'ColourCode','Name of a colour for identifying the connector, if applicable.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1360=IFCPROPERTYSETTEMPLATE('3GWEZtO_v9SxNg3CXVpkwT',$,'Pset_DistributionPortPHistoryCable','Log of electrical activity attached to an instance of IfcPerformanceHistory having an assigned IfcDistributionPort of type CABLE.',.PSET_PERFORMANCEDRIVEN.,'IfcDistributionPort/CABLE',(#1361,#1362,#1363,#1364,#1365,#1366,#1367,#1368)); +#1361=IFCSIMPLEPROPERTYTEMPLATE('1kcyPMIoL43xWGIWoCIqU9',$,'CurrentHistory','Log of electrical current.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1362=IFCSIMPLEPROPERTYTEMPLATE('076fiMx0j2ZexHOQ4oSek2',$,'VoltageHistory','Log of electrical voltage.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1363=IFCSIMPLEPROPERTYTEMPLATE('2kW5zcYwn90eXCCWJHrRmA',$,'RealPower','Real power.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1364=IFCSIMPLEPROPERTYTEMPLATE('1OWS5NaLT0WhqNtI6pBDdJ',$,'ReactivePower','Reactive power.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1365=IFCSIMPLEPROPERTYTEMPLATE('11NJHAQN55Sf_5a2iddmxr',$,'ApparentPower','Apparent power.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1366=IFCSIMPLEPROPERTYTEMPLATE('3zNgyNWM153922YzYN1Ovd',$,'PowerFactorHistory','Power factor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1367=IFCSIMPLEPROPERTYTEMPLATE('0IjeiIEVDB6e5eUkBobvbn',$,'DataTransmitted','For data ports, captures log of data transmitted. The LIST at IfcTimeSeriesValue.Values may split out data according to Pset_DistributionPortTypeCable.Protocols.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1368=IFCSIMPLEPROPERTYTEMPLATE('2JMEpgtknC_RaM2gvK$cOj',$,'DataReceived','For data ports, captures log of data received. The LIST at IfcTimeSeriesValue.Values may split out data according to Pset_DistributionPortTypeCable.Protocols.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1369=IFCPROPERTYSETTEMPLATE('02ipp5WjjCLul4cc7Fttt0',$,'Pset_DistributionPortPHistoryDuct','Fluid flow performance history attached to an instance of IfcPerformanceHistory assigned to IfcDistributionPort. This replaces the deprecated IfcFluidFlowProperties for performance values.',.PSET_PERFORMANCEDRIVEN.,'IfcDistributionPort/DUCT',(#1370,#1371,#1372,#1373,#1374,#1375,#1376)); +#1370=IFCSIMPLEPROPERTYTEMPLATE('3RDWJtzVXB9hkfvB0T_Zrs',$,'TemperatureHistory','Temperature of the fluid. For air this value represents the dry bulb temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1371=IFCSIMPLEPROPERTYTEMPLATE('1AU$nIsB1BiAGJBbqWazNM',$,'WetBulbTemperatureHistory','Wet bulb temperature of the fluid; only applicable if the fluid is air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1372=IFCSIMPLEPROPERTYTEMPLATE('3talPcB$r9R9Vi75fp4vuJ',$,'VolumetricFlowRateHistory','The volumetric flow rate of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1373=IFCSIMPLEPROPERTYTEMPLATE('15_VysnIn39fQbAAF4PrWH',$,'MassFlowRateHistory','The mass flow rate of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1374=IFCSIMPLEPROPERTYTEMPLATE('2OiwTQIj9B5Axonj8mZSP3',$,'FlowConditionHistory','Defines the flow condition as a percentage of the cross-sectional area.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1375=IFCSIMPLEPROPERTYTEMPLATE('0CI8r7jCH138aRvZA_mGHI',$,'VelocityHistory','The velocity of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1376=IFCSIMPLEPROPERTYTEMPLATE('3IM3g2bXz5h9LqXQJZBEKm',$,'PressureHisotry','The pressure of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1377=IFCPROPERTYSETTEMPLATE('13jCyXvV51A96zK1S2FmJe',$,'Pset_DistributionPortPHistoryPipe','Log of substance usage attached to an instance of IfcPerformanceHistory having an assigned IfcDistributionPort of type PIPE.',.PSET_PERFORMANCEDRIVEN.,'IfcDistributionPort/PIPE',(#1378,#1379,#1380)); +#1378=IFCSIMPLEPROPERTYTEMPLATE('3BeWfkRGvFJALb0Bqn9_P_',$,'Temperature','Temperature of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1379=IFCSIMPLEPROPERTYTEMPLATE('1qJ_yeh094UOZ4bBrox9FW',$,'Pressure','The pressure of fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1380=IFCSIMPLEPROPERTYTEMPLATE('1lHJ6OFrf7DQz2AZKtTvF1',$,'Flowrate','The flowrate of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1381=IFCPROPERTYSETTEMPLATE('3ZtYFVpPn1m8KX6VHbc1Sl',$,'Pset_DistributionPortTypeCable','Cable port occurrence attributes attached to an instance of IfcDistributionPort.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort/CABLE',(#1382,#1384,#1385,#1387,#1389,#1390,#1391,#1392,#1393,#1394,#1395)); +#1382=IFCSIMPLEPROPERTYTEMPLATE('3pDl4CCV167h38JUCJiJ8w',$,'ElectricalConnectionType','The physical port connection:ACPLUG: AC plug\X2\000A\X0\DCPLUG: DC plug\X2\000A\X0\CRIMP: bare wire',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1383,$,$,$,.READWRITE.); +#1383=IFCPROPERTYENUMERATION('PEnum_DistributionPortElectricalType',(IFCLABEL('ACPLUG'),IFCLABEL('COAXIAL'),IFCLABEL('CRIMP'),IFCLABEL('DCPLUG'),IFCLABEL('DIN'),IFCLABEL('DSUB'),IFCLABEL('DVI'),IFCLABEL('EIAJ'),IFCLABEL('HDMI'),IFCLABEL('RADIO'),IFCLABEL('RCA'),IFCLABEL('RJ'),IFCLABEL('SOCKET'),IFCLABEL('TRS'),IFCLABEL('USB'),IFCLABEL('XLR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1384=IFCSIMPLEPROPERTYTEMPLATE('35L_xOeyL9CPI_zFGpy7Wr',$,'ConnectionSubtype','The physical port connection subtype that further qualifies the ConnectionType. The following values are recommended:ACPLUG: A, B, C, D, E, F, EF, G, H, I, J, K, L, M\X2\000A\X0\DIN: Mini3P, Mini4P, Mini5P, Mini6P, Mini7P, Mini8P, Mini9P\X2\000A\X0\DSub: DA15, DB25, DC37, DD50, DE9, DE15\X2\000A\X0\EIAJ: RC5720\X2\000A\X0\HDMI: A, B, C\X2\000A\X0\RADIO: IEEE802.11g, IEEE802.11n\X2\000A\X0\RJ: 4P4C, 6P2C, 8P8C\X2\000A\X0\SOCKET: E-11, E-12, E-14, E-17, E-26, E-27, E-39, E-40\X2\000A\X0\TRS: TS_Mini, TS_SubMini, TRS_Mini, TRS_SubMini',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1385=IFCSIMPLEPROPERTYTEMPLATE('2n_fgPfAXENOs3P4QSOEZN',$,'ConnectionGender','The physical connection gender.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1386,$,$,$,.READWRITE.); +#1386=IFCPROPERTYENUMERATION('PEnum_DistributionPortGender',(IFCLABEL('FEMALE'),IFCLABEL('MALE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1387=IFCSIMPLEPROPERTYTEMPLATE('2PzY_anGj0tgCwCLgd6P32',$,'ConductorFunction','Indicates function of the conductors to which the load is connected. Where L1, L2 and L3 represent the phase lines according to IEC 60446 notation (sometimes phase lines may be referenced by color [Red, Blue, Yellow] or by number [1, 2, 3] etc). Protective Earth is sometimes also known as CPC or common protective conductor. Note that for an electrical device, a set of line conductor functions may be applied.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1388,$,$,$,.READWRITE.); +#1388=IFCPROPERTYENUMERATION('PEnum_ConductorFunctionEnum',(IFCLABEL('NEUTRAL'),IFCLABEL('PHASE_L1'),IFCLABEL('PHASE_L2'),IFCLABEL('PHASE_L3'),IFCLABEL('PROTECTIVEEARTH'),IFCLABEL('PROTECTIVEEARTHNEUTRAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1389=IFCSIMPLEPROPERTYTEMPLATE('1AQaEjcOj0mPN73WoPBeRc',$,'CurrentContent3rdHarmonic','The ratio between the third harmonic current and the phase current.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1390=IFCSIMPLEPROPERTYTEMPLATE('1LcP$WYWP7wuRiLK_0EtuG',$,'Current','The actual current and operable range.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1391=IFCSIMPLEPROPERTYTEMPLATE('10FWQ3vqH3Pueadvb6h2AR',$,'Voltage','The actual voltage and operable range.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1392=IFCSIMPLEPROPERTYTEMPLATE('0Npf3efH55_OVAdl$qBqPd',$,'Power','The actual power and operable range.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1393=IFCSIMPLEPROPERTYTEMPLATE('05a$pLyo5EcxxQW0Yq4x8y',$,'Protocols','For data ports, identifies the protocols used as defined by the Open System Interconnection (OSI) Basic Reference Model (ISO 7498). Layers include: 1. Physical; 2. DataLink; 3. Network; 4. Transport; 5. Session; 6. Presentation; 7. Application. Example: 3:IP, 4:TCP, 5:HTTP',.P_LISTVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1394=IFCSIMPLEPROPERTYTEMPLATE('3n3uUy0WT8rxax4jbSWpvX',$,'HasConnector','Indicate whether the wire pair end point is terminated with a connector or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1395=IFCSIMPLEPROPERTYTEMPLATE('0EJ20W3ujAFA0R9_rZy3GH',$,'IsWelded','Indicates whether the wire pair end point is joined to another wire pair end point by means of a welded junction.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1396=IFCPROPERTYSETTEMPLATE('1fLriByrH7rA$8PpLb7tb$',$,'Pset_DistributionPortTypeDuct','Duct port occurrence attributes attached to an instance of IfcDistributionPort.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort/DUCT',(#1397,#1399,#1400,#1401,#1402,#1403,#1404,#1405,#1406,#1407)); +#1397=IFCSIMPLEPROPERTYTEMPLATE('0DHsqe5Jv9OOGgdMuakeyH',$,'ConnectionType','The end-style treatment of the duct port:BEADEDSLEEVE: Beaded Sleeve.\X2\000A\X0\COMPRESSION: Compression.\X2\000A\X0\CRIMP: Crimp.\X2\000A\X0\DRAWBAND: Drawband.\X2\000A\X0\DRIVESLIP: Drive slip.\X2\000A\X0\FLANGED: Flanged.\X2\000A\X0\OUTSIDESLEEVE: Outside Sleeve.\X2\000A\X0\SLIPON: Slipon.\X2\000A\X0\SOLDERED: Soldered.\X2\000A\X0\SSLIP: S-Slip.\X2\000A\X0\STANDINGSEAM: Standing seam.\X2\000A\X0\SWEDGE: Swedge.\X2\000A\X0\WELDED: Welded.\X2\000A\X0\OTHER: Another type of end-style has been applied.\X2\000A\X0\NONE: No end-style has been applied.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1398,$,$,$,.READWRITE.); +#1398=IFCPROPERTYENUMERATION('PEnum_DuctConnectionType',(IFCLABEL('BEADEDSLEEVE'),IFCLABEL('COMPRESSION'),IFCLABEL('CRIMP'),IFCLABEL('DRAWBAND'),IFCLABEL('DRIVESLIP'),IFCLABEL('FLANGED'),IFCLABEL('NONE'),IFCLABEL('OUTSIDESLEEVE'),IFCLABEL('SLIPON'),IFCLABEL('SOLDERED'),IFCLABEL('SSLIP'),IFCLABEL('STANDINGSEAM'),IFCLABEL('SWEDGE'),IFCLABEL('WELDED'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); +#1399=IFCSIMPLEPROPERTYTEMPLATE('35KmYefzDBdP$FTk$_3r1u',$,'ConnectionSubtype','The physical port connection subtype that further qualifies the ConnectionType. The following values are recommended:ACPLUG: A, B, C, D, E, F, EF, G, H, I, J, K, L, M\X2\000A\X0\DIN: Mini3P, Mini4P, Mini5P, Mini6P, Mini7P, Mini8P, Mini9P\X2\000A\X0\DSub: DA15, DB25, DC37, DD50, DE9, DE15\X2\000A\X0\EIAJ: RC5720\X2\000A\X0\HDMI: A, B, C\X2\000A\X0\RADIO: IEEE802.11g, IEEE802.11n\X2\000A\X0\RJ: 4P4C, 6P2C, 8P8C\X2\000A\X0\SOCKET: E-11, E-12, E-14, E-17, E-26, E-27, E-39, E-40\X2\000A\X0\TRS: TS_Mini, TS_SubMini, TRS_Mini, TRS_SubMini',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1400=IFCSIMPLEPROPERTYTEMPLATE('0vjIjL6zf7SuajCDMrYgwo',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#1401=IFCSIMPLEPROPERTYTEMPLATE('0ti4qCOz18FxMqq8eSOF_I',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A000A\X0\The nominal height of the duct connection. Only provided for rectangular shaped ducts.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1402=IFCSIMPLEPROPERTYTEMPLATE('3kgYQyisXDBwKzvRKov4QQ',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#1403=IFCSIMPLEPROPERTYTEMPLATE('2UpE9GBjj0evj3oYA9gwAu',$,'DryBulbTemperature','Dry bulb temperature of the object.\X2\000A000A\X0\Indicates dry bulb temperature of the air.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1404=IFCSIMPLEPROPERTYTEMPLATE('1L6zqMUzf4Z9jSpXPJK5bu',$,'WetBulbTemperature','Wet bulb temperature of the air.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1405=IFCSIMPLEPROPERTYTEMPLATE('0M8_0xky1Cze0d2BhGF1MT',$,'VolumetricFlowRate','The volumetric flow rate of the fluid.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1406=IFCSIMPLEPROPERTYTEMPLATE('2shJnYuWD5BPSn1FbGqfbv',$,'Velocity','The velocity of the fluid.',.P_BOUNDEDVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#1407=IFCSIMPLEPROPERTYTEMPLATE('2TLmxLAXj10xyHT$T5A5zH',$,'Pressure','The pressure of fluid.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1408=IFCPROPERTYSETTEMPLATE('3FYiT6mRjCyQBYz2tjQcKT',$,'Pset_DistributionPortTypePipe','Pipe port occurrence attributes attached to an instance of IfcDistributionPort.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort/PIPE',(#1409,#1411,#1412,#1413,#1414,#1415,#1416,#1417,#1418,#1419,#1420)); +#1409=IFCSIMPLEPROPERTYTEMPLATE('2e9WmJUbL5guUVxRgQnJF7',$,'ConnectionType','The end-style treatment of the duct port:BEADEDSLEEVE: Beaded Sleeve.\X2\000A\X0\COMPRESSION: Compression.\X2\000A\X0\CRIMP: Crimp.\X2\000A\X0\DRAWBAND: Drawband.\X2\000A\X0\DRIVESLIP: Drive slip.\X2\000A\X0\FLANGED: Flanged.\X2\000A\X0\OUTSIDESLEEVE: Outside Sleeve.\X2\000A\X0\SLIPON: Slipon.\X2\000A\X0\SOLDERED: Soldered.\X2\000A\X0\SSLIP: S-Slip.\X2\000A\X0\STANDINGSEAM: Standing seam.\X2\000A\X0\SWEDGE: Swedge.\X2\000A\X0\WELDED: Welded.\X2\000A\X0\OTHER: Another type of end-style has been applied.\X2\000A\X0\NONE: No end-style has been applied.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1410,$,$,$,.READWRITE.); +#1410=IFCPROPERTYENUMERATION('PEnum_PipeEndStyleTreatment',(IFCLABEL('BRAZED'),IFCLABEL('COMPRESSION'),IFCLABEL('FLANGED'),IFCLABEL('GROOVED'),IFCLABEL('NONE'),IFCLABEL('OUTSIDESLEEVE'),IFCLABEL('SOLDERED'),IFCLABEL('SWEDGE'),IFCLABEL('THREADED'),IFCLABEL('WELDED'),IFCLABEL('OTHER'),IFCLABEL('UNSET')),$); +#1411=IFCSIMPLEPROPERTYTEMPLATE('0cabYBr5DBBec46n3tg0Re',$,'ConnectionSubtype','The physical port connection subtype that further qualifies the ConnectionType. The following values are recommended:ACPLUG: A, B, C, D, E, F, EF, G, H, I, J, K, L, M\X2\000A\X0\DIN: Mini3P, Mini4P, Mini5P, Mini6P, Mini7P, Mini8P, Mini9P\X2\000A\X0\DSub: DA15, DB25, DC37, DD50, DE9, DE15\X2\000A\X0\EIAJ: RC5720\X2\000A\X0\HDMI: A, B, C\X2\000A\X0\RADIO: IEEE802.11g, IEEE802.11n\X2\000A\X0\RJ: 4P4C, 6P2C, 8P8C\X2\000A\X0\SOCKET: E-11, E-12, E-14, E-17, E-26, E-27, E-39, E-40\X2\000A\X0\TRS: TS_Mini, TS_SubMini, TRS_Mini, TRS_SubMini',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1412=IFCSIMPLEPROPERTYTEMPLATE('3FFMya2KDFI83amO8O0OTg',$,'NominalDiameter','Nominal diameter or width of the object.\X2\000A000A\X0\The nominal diameter of the pipe connection.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1413=IFCSIMPLEPROPERTYTEMPLATE('13yJbe2O91MwcTnAzD0orD',$,'InnerDiameter','The actual inner diameter of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1414=IFCSIMPLEPROPERTYTEMPLATE('2791sU1WnELPx5bJcqOID1',$,'OuterDiameter','The actual outer diameter of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1415=IFCSIMPLEPROPERTYTEMPLATE('2ahba76lX2GvHe9zX6FPql',$,'Temperature','Temperature of the fluid.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1416=IFCSIMPLEPROPERTYTEMPLATE('3$SgwefOT9YhX7nd14H5c5',$,'VolumetricFlowRate','The volumetric flow rate of the fluid.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1417=IFCSIMPLEPROPERTYTEMPLATE('1ZibBcMaHBtwVSz5oecprQ',$,'MassFlowRate','The mass flow rate of the fluid.',.P_BOUNDEDVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1418=IFCSIMPLEPROPERTYTEMPLATE('025fz7rU52agZn8FMpU6et',$,'FlowCondition','Defines the flow condition as a percentage of the cross-sectional area.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1419=IFCSIMPLEPROPERTYTEMPLATE('3PsnJgzmrBth$5xoBFDGL4',$,'Velocity','The velocity of the fluid.',.P_BOUNDEDVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#1420=IFCSIMPLEPROPERTYTEMPLATE('0Rhq5bOf160OIMywTcSEvE',$,'Pressure','The pressure of fluid.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1421=IFCPROPERTYSETTEMPLATE('1c9n2q4h5FeQT_ZD3rezRQ',$,'Pset_DistributionSystemCommon','Distribution system occurrence attributes attached to an instance of IfcDistributionSystem.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem',(#1422)); +#1422=IFCSIMPLEPROPERTYTEMPLATE('1YTg_Oktn9Ng7640ydVt7L',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.\X2\000A000A\X0\E.g. ''WWS/VS1'', which indicates the system to be WWS, subsystems VSI/400.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1423=IFCPROPERTYSETTEMPLATE('2dMM7pZgDCRB60ZLySI4V0',$,'Pset_DistributionSystemTypeElectrical','Properties of electrical circuits.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem/ELECTRICAL',(#1424,#1426,#1428,#1429,#1430,#1431,#1432)); +#1424=IFCSIMPLEPROPERTYTEMPLATE('0RyjF2QmD26BLxRdJJUdSP',$,'ElectricalSystemType','For certain purposes of electrical regulations, IEC 60364 defines types of system using type identifiers. Assignment of identifiers depends upon the relationship of the source, and of exposed conductive parts of the installation, to Ground (Earth). Identifiers that may be assigned through IEC 60364 are:\X2\2022\X0\TN type system, a system having one or more points of the source of energy directly earthed, the exposed conductive parts of the installation being connected to that point by protective conductors,\X2\000A2022\X0\TN C type system, a TN type system in which neutral and protective functions are combined in a single conductor throughout the system,\X2\000A2022\X0\TN S type system, a TN type system having separate neutral and protective conductors throughout the system,\X2\000A2022\X0\TN C S type system, a TN type system in which neutral and protective functions are combined in a single conductor in part of the system,\X2\000A2022\X0\TT type system, a system having one point of the source of energy directly earthed, the exposed conductive parts of the installation being connected to earth electrodes electrically independent of the earth electrodes of the source,\X2\000A2022\X0\IT type system, a system having no direct connection between live parts and Earth, the exposed conductive parts of the electrical installation being earthed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1425,$,$,$,.READWRITE.); +#1425=IFCPROPERTYENUMERATION('PEnum_DistributionSystemElectricalType',(IFCLABEL('IT'),IFCLABEL('TN'),IFCLABEL('TN_C'),IFCLABEL('TN_C_S'),IFCLABEL('TN_S'),IFCLABEL('TT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1426=IFCSIMPLEPROPERTYTEMPLATE('2GctECpKT9qgu0$jOIpEdK',$,'ElectricalSystemCategory','Designates the voltage range of the circuit, according to IEC. HIGHVOLTAGE indicates >1000V AC or >1500V DV; LOWVOLTAGE indicates 50-1000V AC or 120-1500V DC; EXTRALOWVOLTAGE indicates <50V AC or <120V DC.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1427,$,$,$,.READWRITE.); +#1427=IFCPROPERTYENUMERATION('PEnum_DistributionSystemElectricalCategory',(IFCLABEL('EXTRALOWVOLTAGE'),IFCLABEL('HIGHVOLTAGE'),IFCLABEL('LOWVOLTAGE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1428=IFCSIMPLEPROPERTYTEMPLATE('2p1$7sApD45gdkVfYpNDaG',$,'Diversity','The ratio, expressed as a numerical\X2\000A\X0\value or as a percentage, of the\X2\000A\X0\simultaneous maximum demand of\X2\000A\X0\a group of electrical appliances or\X2\000A\X0\consumers within a specified period,\X2\000A\X0\to the sum of their individual maximum\X2\000A\X0\demands within the same\X2\000A\X0\period. The group of electrical appliances is in this case connected to this circuit. Definition from IEC 60050, IEV 691-10-04\X2\000A\X0\NOTE1: It is often not desirable to size each conductor in a distribution system to support the total connected load at that point in the network. Diversity is applied on the basis of the anticipated loadings that are likely to result from all loads not being connected at the same time.\X2\000A\X0\NOTE2: Diversity is applied to final circuits only, not to sub-main circuits supplying other DBs.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1429=IFCSIMPLEPROPERTYTEMPLATE('0u0sGoEUT5xhg0OKP2KA7y',$,'NumberOfLiveConductors','Number of live conductors within this circuit. Either this property or the ConductorFunction property (if only one) may be asserted.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1430=IFCSIMPLEPROPERTYTEMPLATE('32mCgzbJT1whDbcMEvs84a',$,'MaximumAllowedVoltageDrop','The maximum voltage drop across the circuit that must not be exceeded.\X2\000A\X0\There are two voltage drop limit settings that may be applied; one for sub-main circuits, and one in each Distribution Board or Consumer Unit for final circuits connected to that board. The settings should limit the overall voltage drop to the required level. Default settings of 1.5% for sub-main circuits and 2.5% for final circuits, giving an overall limit of 4% may be applied.\X2\000A\X0\NOTE: This value may also be specified as a constraint within an IFC model if required but is included within the property set at this stage pending implementation of the required capabilities within software applications.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1431=IFCSIMPLEPROPERTYTEMPLATE('09Ojz7Vd1DcQPcRAKTUyU_',$,'NetImpedance','The maximum earth loop impedance upstream of a circuit (typically stated as the variable Zs). This value is for 55o C (130oF) Celsius usage.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#1432=IFCSIMPLEPROPERTYTEMPLATE('35L0MnkXz6Nuaa930uDmKH',$,'RatedVoltageRange','Voltage range as declared by the manufacturer expressed by its lower and upper rated voltages [Source : IEC 62368-1:2010, 3.3.10.5].',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1433=IFCPROPERTYSETTEMPLATE('2293dKLK50Xvq0k9jqTjWE',$,'Pset_DistributionSystemTypeOverheadContactlineSystem','Properties of an overhead contact line system. The property set is associated with the predefined type OVERHEAD_CONTACT_LINE_SYSTEM of IfcDistributionSystem.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem/OVERHEAD_CONTACTLINE_SYSTEM',(#1434,#1435,#1436,#1437,#1438,#1439,#1440,#1441,#1442,#1443,#1444)); +#1434=IFCSIMPLEPROPERTYTEMPLATE('2OC03gSp1FZOxkutwaT8gZ',$,'SpanNominalLength','The length of span as a design parameter for the overhead contactline system.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1435=IFCSIMPLEPROPERTYTEMPLATE('1yNaoIImv3B9m8rRooxVj7',$,'ContactWireStagger','Lateral displacement of the contact wire to opposite sides of the track centre at successive supports.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1436=IFCSIMPLEPROPERTYTEMPLATE('09FNQvNqvFxAP8kMU1PMuu',$,'ContactWireNominalDrop','Vertical distance between the main catenary wire and the contact wire measured at a support point.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1437=IFCSIMPLEPROPERTYTEMPLATE('12Ad3hyfLCNQiCnhOLrU3i',$,'PressureRange','Allowable maximum and minimum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1438=IFCSIMPLEPROPERTYTEMPLATE('1XvZJGfIb4BuXkbNJEzd1$',$,'ContactWireNominalHeight','Nominal distance from the top of the rail to the lower face of the contact wire, measured perpendicular to the track.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1439=IFCSIMPLEPROPERTYTEMPLATE('0Cxg9ht01EegLS89EI6xHo',$,'ContactWireUplift','Vertical upward movement of the contact wire due to the force produced from the pantograph.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#1440=IFCSIMPLEPROPERTYTEMPLATE('2FB7NQ18jESfgm0sBMMalK',$,'ElectricalClearance','The recommended air clearances between earth and the live parts of the overhead contactline system.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1441=IFCSIMPLEPROPERTYTEMPLATE('0kRWTAN8fBOPpIG1wbTM6T',$,'NumberOfOverlappingSpans','Number of overlapping spans in the overhead contactline system.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1442=IFCSIMPLEPROPERTYTEMPLATE('1DKGjTrL9Fxg781e$0S9DG',$,'PantographType','Indicates the type of pantograph as a design parameter for the overhead contactline system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1443=IFCSIMPLEPROPERTYTEMPLATE('1atNkw7Tr5SuD4TCVUdeDa',$,'TensionLength','Length of overhead contactline between two terminating points. It is a design parameter for the overhead contactline system.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1444=IFCSIMPLEPROPERTYTEMPLATE('1wvNri4I90uPUO7OVKYF6R',$,'OCSType','Indicates the type of overhead contactline system (OCS).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1445,$,$,$,.READWRITE.); +#1445=IFCPROPERTYENUMERATION('PEnum_OverheadContactLineType',(IFCLABEL('COMPOUND_CATENARY_SUSPENSION'),IFCLABEL('OCL_WITH_CATENARY_SUSPENSION'),IFCLABEL('OCL_WITH_STITCHED_CATENARY_SUSPENSION'),IFCLABEL('RIGID_CATENARY'),IFCLABEL('TROLLY_TYPE_CONTACT_LINE'),IFCLABEL('TROLLY_TYPE_WITH_STITCHWIRE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1446=IFCPROPERTYSETTEMPLATE('1PZpE4dwD8u9ENBJXuLopz',$,'Pset_DistributionSystemTypeVentilation','This property set is used to define the general characteristics of the duct design parameters within a system.\X2\000A\X0\HISTORY: New property set in IFC Release 2.0. Renamed from Pset_DuctDesignCriteria in IFC4.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem/VENTILATION',(#1447,#1448,#1450,#1451,#1452,#1453,#1454,#1455,#1456,#1457,#1458)); +#1447=IFCSIMPLEPROPERTYTEMPLATE('0xYmNNrOf3E9dyBQ0XzHyI',$,'DesignName','A name for the design values.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1448=IFCSIMPLEPROPERTYTEMPLATE('33XN227Vj7CeX4suYpKoJG',$,'DuctSizingMethod','Enumeration that identifies the methodology to be used to size system components.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1449,$,$,$,.READWRITE.); +#1449=IFCPROPERTYENUMERATION('PEnum_DuctSizingMethod',(IFCLABEL('CONSTANTFRICTION'),IFCLABEL('CONSTANTPRESSURE'),IFCLABEL('STATICREGAIN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1450=IFCSIMPLEPROPERTYTEMPLATE('2Ac6adY2P6_O$QuNIf7cES',$,'PressureClass','Nominal pressure rating of the object.\X2\000A000A\X0\Nominal pressure rating of the system components.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1451=IFCSIMPLEPROPERTYTEMPLATE('2SNlVGcpnAqQzNziLCy2Ri',$,'LeakageClass','Nominal leakage rating for the system components.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1452=IFCSIMPLEPROPERTYTEMPLATE('1cfdauOrP19P2P6Ygp7_KT',$,'FrictionLoss','The pressure loss due to friction per unit length. (Data type = PressureMeasure/LengthMeasure)',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1453=IFCSIMPLEPROPERTYTEMPLATE('0VGJG2rn9DDvv7YGP_ek1L',$,'ScrapFactor','Sheet metal scrap factor.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1454=IFCSIMPLEPROPERTYTEMPLATE('1lrjy1iSf5OeA_YcZeIMMo',$,'DuctSealant','Type of sealant used on the duct and fittings.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#1455=IFCSIMPLEPROPERTYTEMPLATE('03WsdThXbBLvK7J6LnE3ZS',$,'MaximumVelocity','The maximum design velocity of the air in the duct or fitting.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#1456=IFCSIMPLEPROPERTYTEMPLATE('075hPZGFPB5x7aIxqxSJY_',$,'AspectRatio','The default aspect ratio.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1457=IFCSIMPLEPROPERTYTEMPLATE('1nUPKF8VH4qeqFbN8aGFZv',$,'MinimumHeight','The minimum duct height for rectangular, oval or round duct.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1458=IFCSIMPLEPROPERTYTEMPLATE('1USt$Gc5T1thJlaxOB_Ysj',$,'MinimumWidth','The minimum duct width for oval or rectangular duct.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1459=IFCPROPERTYSETTEMPLATE('1XSWOgWw9E6AfnD$TK1pzZ',$,'Pset_DoorCommon','Properties common to the definition of all occurrences of IfcDoor.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor,IfcDoorType',(#1460,#1461,#1463,#1464,#1465,#1466,#1467,#1468,#1469,#1470,#1471,#1472,#1473,#1474,#1475,#1476,#1477,#1478,#1479)); +#1460=IFCSIMPLEPROPERTYTEMPLATE('3TVJtZtOX0VxkKU0TBgyel',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1461=IFCSIMPLEPROPERTYTEMPLATE('3XXByCtOL5mhHXjZHH5xwr',$,'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',$,#1462,$,$,$,.READWRITE.); +#1462=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1463=IFCSIMPLEPROPERTYTEMPLATE('3Eq5vY2ZLCzvzz_xfd4Fsx',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1464=IFCSIMPLEPROPERTYTEMPLATE('3LEO1T6J509eCw$1sIyhUF',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1465=IFCSIMPLEPROPERTYTEMPLATE('3$X8YPNJjFN8e$zTSrYdQX',$,'SecurityRating','Index based rating system indicating security level.\X2\000A\X0\It is giving according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1466=IFCSIMPLEPROPERTYTEMPLATE('2B57Nv2Vn5ZwEE7lJ03z7R',$,'DurabilityRating','Durability against mechanical stress. It is given according to the national code or regulation.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1467=IFCSIMPLEPROPERTYTEMPLATE('3clKafSUzFqfq6XxI6Y9mj',$,'HygrothermalRating','Resistance against hygrothermal impact from different temperatures and humidities inside and outside. It is given according to the national code or regulation.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1468=IFCSIMPLEPROPERTYTEMPLATE('3M71IM7BL3cAxi3GEAuYkP',$,'WaterTightnessRating','Water tightness rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1469=IFCSIMPLEPROPERTYTEMPLATE('1ExSnzRDHC_BS3yUe4h1dY',$,'MechanicalLoadRating','Mechanical load rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1470=IFCSIMPLEPROPERTYTEMPLATE('0eTVyjfW9B5Bsx244aClTu',$,'WindLoadRating','Wind load resistance rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1471=IFCSIMPLEPROPERTYTEMPLATE('2khS_PYFH4F804__ekgBMi',$,'Infiltration','Infiltration flowrate of outside air for the filler object based on the area of the filler object at a pressure level of 50 Pascals. It shall be used, if the length of all joints is unknown.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1472=IFCSIMPLEPROPERTYTEMPLATE('1$bmJgKF1AZfdl7FMc$gJs',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1473=IFCSIMPLEPROPERTYTEMPLATE('3AvlVXdxT4_vC$l6JCTCBb',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#1474=IFCSIMPLEPROPERTYTEMPLATE('0m_KQc2nHEVBA_1oZfNQpc',$,'GlazingAreaFraction','Fraction of the glazing area relative to the total area of the filling element.\X2\000A\X0\It shall be used, if the glazing area is not given separately for all panels within the filling element.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1475=IFCSIMPLEPROPERTYTEMPLATE('0RiyilGEHBpxVeVUtMK370',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. Set to (TRUE) if this object is rated as handicap accessible according to the local building codes, otherwise (FALSE). It is giving according to the requirements of the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1476=IFCSIMPLEPROPERTYTEMPLATE('3BO75XS4v6m8XvrkUjkmKC',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here it defines an exit door in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1477=IFCSIMPLEPROPERTYTEMPLATE('3gSswOG1P5igBI$uGxOYRo',$,'HasDrive','Indication whether this object has an automatic drive to operate it (TRUE) or no drive (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1478=IFCSIMPLEPROPERTYTEMPLATE('0df9GIQxbEOfuv_IrSPvS5',$,'SelfClosing','Indication whether this object is designed to close automatically after use (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1479=IFCSIMPLEPROPERTYTEMPLATE('1knXvRk_52LAHGf6kGzx6E',$,'SmokeStop','Indication whether the object is designed to provide a smoke stop (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1480=IFCPROPERTYSETTEMPLATE('2uOov6CrfBUu4dmakNAwQn',$,'Pset_DoorLiningProperties','Properties of the door lining.HISTORY New property set in IFC4.3.2.0 to replace the entity IfcDoorLiningProperties',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor,IfcMember,IfcDoorType,IfcMemberType',(#1481,#1482,#1483,#1484,#1485,#1486,#1487,#1488,#1489,#1490,#1491,#1492)); +#1481=IFCSIMPLEPROPERTYTEMPLATE('3ifEsTj$XFJwYtHwjawZ$c',$,'LiningDepth','The depth of the lining.\X2\000A000A\X0\For a door, it is the depth of the door lining, measured perpendicular to the plane of the door lining. If omitted (and with a given value to lining thickness) it indicates an adjustable depth (i.e. a depth that adjusts to the thickness of the wall into which the occurrence of this door style is inserted).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1482=IFCSIMPLEPROPERTYTEMPLATE('3GYKwXHbb9agQF8udjICi1',$,'LiningThickness','Thickness of the lining.\X2\000A000A\X0\For a door, it is the thickness of the door lining as explained in the figure above. If LiningThickness value is 0. (zero) it denotes a door without a lining (all other lining parameters shall be set to NIL in this case). If the LiningThickness is NIL it denotes that the value is not available.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#1483=IFCSIMPLEPROPERTYTEMPLATE('2058MR1eX5Hvii9GTiP$Qx',$,'ThresholdDepth','Depth (dimension in plane perpendicular to door leaf) of the door threshold. Only given if the door lining includes a threshold. If omitted (and with a given value to threshold thickness) it indicates an adjustable depth (i.e. a depth that adjusts to the thickness of the wall into which the occurrence of this door style is inserted).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1484=IFCSIMPLEPROPERTYTEMPLATE('2MR$41Yh93_9G29HvclTWl',$,'ThresholdThickness','Thickness of the door threshold as explained in the figure above. If ThresholdThickness value is 0. (zero) it denotes a door without a threshold (ThresholdDepth shall be set to NIL in this case). If the ThresholdThickness is NIL it denotes that the information about a threshold is not available.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#1485=IFCSIMPLEPROPERTYTEMPLATE('3cGVkU88H5uQKEZHG3YlIp',$,'TransomThickness','Thickness of the transom.\X2\000A000A\X0\For a door, it is the thickness (width in plane parallel to door leaf) of the transom (if provided - that is, if the TransomOffset attribute is set), which divides the door leaf from a glazing (or window) above. If the TransomThickness is set to zero (and the TransomOffset set to a positive length), then the door is divided vertically into a leaf and transom window area without a physical frame.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#1486=IFCSIMPLEPROPERTYTEMPLATE('3wiQDr8Fn2YeZJLbg9DWag',$,'TransomOffset','Offset of the transom (if given) which divides the door leaf from a glazing (or window) above. The offset is given from the bottom of the door opening.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1487=IFCSIMPLEPROPERTYTEMPLATE('0G9Am_k_v5eBDiooLCabYs',$,'LiningOffset','Offset of the lining.\X2\000A000A\X0\For a door, it is the offset (dimension in plane perpendicular to door leaf) of the door lining. The offset is given as distance to the x axis of the local placement.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1488=IFCSIMPLEPROPERTYTEMPLATE('0GZFf2ExT6exuVC2HtsMRN',$,'ThresholdOffset','Offset (dimension in plane perpendicular to door leaf) of the door threshold. The offset is given as distance to the x axis of the local placement. Only given if the door lining includes a threshold and the parameter is known.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1489=IFCSIMPLEPROPERTYTEMPLATE('2o59Gtljj4MRJ4OjlzlIeT',$,'CasingThickness','Thickness of the casing.\X2\000A000A\X0\For a door, it is the dimension in plane of the door leaf. If given it is applied equally to all four sides of the adjacent wall.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1490=IFCSIMPLEPROPERTYTEMPLATE('1lAKRofuX2Ju22PFB2h$SD',$,'CasingDepth','Depth of the casing.\X2\000A000A\X0\For a door, it is the dimension in the plane perpendicular to door leaf. If given it is applied equally to all four sides of the adjacent wall.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1491=IFCSIMPLEPROPERTYTEMPLATE('2UUV5yDwXE4xQ4CwdRdbB1',$,'LiningToPanelOffsetX','Offset between the lining and the panel, measured along the x-axis of the local placement.\X2\000A000A\X0\For a door, it is the offset between the lining and the window panel.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1492=IFCSIMPLEPROPERTYTEMPLATE('0Zcotl2Ub0QAjchbr24MHh',$,'LiningToPanelOffsetY','Offset between the lining and the panel, measured along the y-axis of the local placement.\X2\000A000A\X0\For a door, it is the offset between the lining and the door panel.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1493=IFCPROPERTYSETTEMPLATE('3wP4RzE4L7JOoyg$HWZc9s',$,'Pset_DoorPanelProperties','Properties of the door panel.HISTORY New property set in IFC4.3.2.0 to replace the entity IfcDoorPanelProperties',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor,IfcPlate,IfcDoorType,IfcPlateType',(#1494,#1495,#1497,#1498)); +#1494=IFCSIMPLEPROPERTYTEMPLATE('3CHDSOHdDCXRacCkAE5M4$',$,'PanelDepth','Depth of the panel.\X2\000A000A\X0\For a door, it is the depth of the door panel, measured perpendicular to the plane of the door leaf.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1495=IFCSIMPLEPROPERTYTEMPLATE('23n7_43IX9vQmxQKYtxdDj',$,'PanelOperation','The way of operation of a panel.\X2\000A000A\X0\For a door, it is the way of operation of the panel. The PanelOperation of the door panel shall correspond to the OperationType of the IfcDoorType by which it is referenced.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1496,$,$,$,.READWRITE.); +#1496=IFCPROPERTYENUMERATION('PEnum_DoorPanelOperationEnum',(IFCLABEL('DOUBLE_ACTING'),IFCLABEL('FIXEDPANEL'),IFCLABEL('FOLDING'),IFCLABEL('REVOLVING'),IFCLABEL('ROLLINGUP'),IFCLABEL('SLIDING'),IFCLABEL('SWINGING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET'),IFCLABEL('NOTDEFINED')),$); +#1497=IFCSIMPLEPROPERTYTEMPLATE('3nojngG4zADxsNZMOCHpNA',$,'PanelWidth','Width of the panel.\X2\000A000A\X0\For a door, it is the width of the panel, given as ratio relative to the total clear opening width of the door. If omitted, it defaults to 1. A value shall be provided for all doors with OperationType''s at IfcDoorType defining a door with more then one panel.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1498=IFCSIMPLEPROPERTYTEMPLATE('2QBHMe2ePBaxsvu7JrdwWa',$,'PanelPosition','Position of the panel.\X2\000A000A\X0\For a door, it is the position of the panel within the door. The PanelPosition of the door panel shall correspond to the OperationType of the IfcDoorType by which it is referenced.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1499,$,$,$,.READWRITE.); +#1499=IFCPROPERTYENUMERATION('PEnum_DoorPanelPositionEnum',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1500=IFCPROPERTYSETTEMPLATE('2y8L$BoLX78x2MosT6ONoY',$,'Pset_DoorTypeTurnstile','Properties common to turnstiles or automatic gates used to control the flow of people or vehicles. This property set is applied to IfcDoor instances of predefined type TURNSTILE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor/TURNSTILE,IfcDoorType/TURNSTILE',(#1501,#1502,#1504,#1505)); +#1501=IFCSIMPLEPROPERTYTEMPLATE('2UQ1zKwuzAxwd4kr7_HTpJ',$,'IsBidirectional','Indicates whether the turnstile is bidirectional.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1502=IFCSIMPLEPROPERTYTEMPLATE('33WYkoLUv49vMYnWfKz5_i',$,'TurnstileType','Indicates the type of turnstile gate.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1503,$,$,$,.READWRITE.); +#1503=IFCPROPERTYENUMERATION('PEnum_TurnstileType',(IFCLABEL('SWINGGATEBRAKE'),IFCLABEL('THREEPOLEROTARYBRAKE'),IFCLABEL('WINGGATEBRAKE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1504=IFCSIMPLEPROPERTYTEMPLATE('3AswsRgcb2GwWaAuojX4yC',$,'NarrowChannelWidth','Indicates the width of the narrow channel.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1505=IFCSIMPLEPROPERTYTEMPLATE('2ZGRUUY_r7yRroZSnJ5ZzB',$,'WideChannelWidth','Indicates the width of the wide channel.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1506=IFCPROPERTYSETTEMPLATE('0spWeaKhHCnBFoAXlqvx$M',$,'Pset_DoorWindowGlazingType','Properties common to the definition of the glazing component of occurrences of IfcDoor and IfcWindow, used for thermal and lighting calculations.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor,IfcWindow,IfcDoorType,IfcWindowType',(#1507,#1508,#1509,#1510,#1511,#1512,#1513,#1514,#1515,#1516,#1517,#1518,#1519,#1520,#1521,#1522,#1523,#1524,#1525)); +#1507=IFCSIMPLEPROPERTYTEMPLATE('3e6S1FKdDD893HfU5qG06a',$,'GlassLayers','Number of glass layers within the frame. E.g. "2" for double glazing.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1508=IFCSIMPLEPROPERTYTEMPLATE('0cL06MFxX3bebe4kZpc23b',$,'GlassThickness1','Thickness of the first (inner) glass layer.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1509=IFCSIMPLEPROPERTYTEMPLATE('06$QI75Tr91vsOlv_hj0AE',$,'GlassThickness2','Thickness of the second (intermediate or outer) glass layer.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1510=IFCSIMPLEPROPERTYTEMPLATE('3CaKPz7jD8QwSyyOcsF8ka',$,'GlassThickness3','Thickness of the third (outer) glass layer.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1511=IFCSIMPLEPROPERTYTEMPLATE('38M3F0Ejb5suTVhkIfHSoL',$,'FillGas','Name of the gas by which the gap between two glass layers is filled. It is given for information purposes only.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1512=IFCSIMPLEPROPERTYTEMPLATE('0XQldKw1bCrh5x2BCSKd3N',$,'GlassColour','Colour (tint) selection for this glazing. It is given for information purposes only.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1513=IFCSIMPLEPROPERTYTEMPLATE('0d1QTURYP0nxor4wJgzBF_',$,'IsTempered','Indication whether the glass is tempered (TRUE) or not (FALSE) .',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1514=IFCSIMPLEPROPERTYTEMPLATE('2LvyRDMYn8ReScxw$G24ct',$,'IsLaminated','Indication whether the glass is layered with other materials (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1515=IFCSIMPLEPROPERTYTEMPLATE('2GdwKfCnv74vJKdJQ6Lvsl',$,'IsCoated','Indication whether the glass is coated with a material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1516=IFCSIMPLEPROPERTYTEMPLATE('03bZ9Jex13a8w_gHwjWwa_',$,'IsWired','Indication whether the glass includes a contained wire mesh to prevent break-in (TRUE) or not (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1517=IFCSIMPLEPROPERTYTEMPLATE('1r5joKJXvF18DSiytEwBMS',$,'VisibleLightReflectance','Fraction of the visible light that is reflected by the glazing at normal incidence. It is a value without unit.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1518=IFCSIMPLEPROPERTYTEMPLATE('2XvxGBoPf8rgNOKE6g13Zf',$,'VisibleLightTransmittance','Fraction of the visible light that passes the object at normal incidence. It is a value without unit.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1519=IFCSIMPLEPROPERTYTEMPLATE('0fZLlmK2n1P9Be5GZ4tRwV',$,'SolarAbsorption','(Asol) The ratio of incident solar radiation that is absorbed by a glazing system. It is the sum of the absorption distributed to the exterior (a) and to the interior (qi). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1520=IFCSIMPLEPROPERTYTEMPLATE('0wGVcH2h95cArts5vtNJL8',$,'SolarReflectance','(Rsol): The ratio of incident solar radiation that is reflected by a glazing system (also named \X2\03C1\X0\e). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1521=IFCSIMPLEPROPERTYTEMPLATE('3rkLZS$HX1B9qRPRaF82j4',$,'SolarTransmittance','The ratio of incident solar radiation that directly passes through a system (also named \X2\03C4\X0\e). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1522=IFCSIMPLEPROPERTYTEMPLATE('3749AedJz0iACioeH1yqjJ',$,'SolarHeatGainTransmittance','(SHGC): The ratio of incident solar radiation that contributes to the heat gain of the interior, it is the solar radiation that directly passes (Tsol or \X2\03C4\X0\e) plus the part of the absorbed radiation that is distributed to the interior (qi). The SHGC is referred to also as g-value (g = \X2\03C4\X0\e + qi).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1523=IFCSIMPLEPROPERTYTEMPLATE('1AMjbibjTAtBxKz03iNVed',$,'ShadingCoefficient','(SC): The measure of the ability of a glazing to transmit solar heat, relative to that ability for 3 mm (1/8-inch) clear, double-strength, single glass. Shading coefficient is being phased out in favor of the solar heat gain coefficient (SHGC), and is approximately equal to the SHGC multiplied by 1.15. The shading coefficient is expressed as a number without units between 0 and 1.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1524=IFCSIMPLEPROPERTYTEMPLATE('32oSzxu9XE6um4JkfnLjF$',$,'ThermalTransmittanceSummer','Thermal transmittance coefficient (U-Value) of a material.\X2\000A\X0\Summer thermal transmittance coefficient of the glazing only, often referred to as (U-value).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#1525=IFCSIMPLEPROPERTYTEMPLATE('00UpA9wOD6TfIFTJRR_FQd',$,'ThermalTransmittanceWinter','Thermal transmittance coefficient (U-Value) of a material.\X2\000A\X0\Winter thermal transmittance coefficient of the glazing only, often referred to as (U-value).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#1526=IFCPROPERTYSETTEMPLATE('2FFQuT0KTEgQVTHhv9LT85',$,'Pset_DuctFittingOccurrence','Duct fitting occurrence attributes.',.PSET_OCCURRENCEDRIVEN.,'IfcDuctFitting',(#1527,#1528,#1529)); +#1527=IFCSIMPLEPROPERTYTEMPLATE('3DbKDFizL62fVbwH6PCbVL',$,'InteriorRoughnessCoefficient','The interior roughness of the material of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1528=IFCSIMPLEPROPERTYTEMPLATE('34uz6xIYzCavOb16VIdg3P',$,'HasLiner','TRUE if the fitting has interior duct insulating lining, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1529=IFCSIMPLEPROPERTYTEMPLATE('1ctzLaD1fEmuB$cjlxzE5E',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1530=IFCPROPERTYSETTEMPLATE('0NfTeoVHb62O8ZF3j0Yy$j',$,'Pset_DuctFittingPHistory','Duct fitting performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcDuctFitting',(#1531,#1532,#1533)); +#1531=IFCSIMPLEPROPERTYTEMPLATE('0nvBs_$Db9hAM5WSNKPg3r',$,'LossCoefficient','Dimensionless loss coefficient used for calculating fluid resistance representing the ratio of total pressure loss to velocity pressure at a referenced cross-section.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1532=IFCSIMPLEPROPERTYTEMPLATE('1Kbr7W2MDDxuYqj9N56iqE',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1533=IFCSIMPLEPROPERTYTEMPLATE('3prIfYghvAXx8OFppCcAv9',$,'AirFlowLeakage','Volumetric leakage flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1534=IFCPROPERTYSETTEMPLATE('1Mf5z4klj1zwBOrsJdKSMz',$,'Pset_DuctFittingTypeCommon','Duct fitting type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDuctFitting,IfcDuctFittingType',(#1535,#1536,#1538,#1539,#1540)); +#1535=IFCSIMPLEPROPERTYTEMPLATE('00UtuIPgHEdQuZRfJXU4BN',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1536=IFCSIMPLEPROPERTYTEMPLATE('2xFdAfNRjENOBRbRONvflz',$,'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',$,#1537,$,$,$,.READWRITE.); +#1537=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1538=IFCSIMPLEPROPERTYTEMPLATE('1ru6GWBST0DuAylvUW6dur',$,'PressureClass','Nominal pressure rating of the object.\X2\000A000A\X0\Pressure classification as defined by the authority having jurisdiction (e.g., SMACNA, etc.).',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1539=IFCSIMPLEPROPERTYTEMPLATE('334hzecOf2yx6$IiQI0HgV',$,'PressureRange','Allowable maximum and minimum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1540=IFCSIMPLEPROPERTYTEMPLATE('1xy6Yz2wnBuPydiasn7XGP',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1541=IFCPROPERTYSETTEMPLATE('2ff8mMnFz4RO9VH$l7fr5W',$,'Pset_DuctSegmentOccurrence','Duct segment occurrence attributes attached to an instance of IfcDuctSegment.',.PSET_OCCURRENCEDRIVEN.,'IfcDuctSegment',(#1542,#1543,#1544)); +#1542=IFCSIMPLEPROPERTYTEMPLATE('1T44L0OvT95vyKfV03g_Sg',$,'InteriorRoughnessCoefficient','The interior roughness of the material of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1543=IFCSIMPLEPROPERTYTEMPLATE('3Vrv2HOp5Cq9GIDaLWdMzy',$,'HasLiner','TRUE if the fitting has interior duct insulating lining, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1544=IFCSIMPLEPROPERTYTEMPLATE('2utikyb7jFiOA8b31ou4TT',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1545=IFCPROPERTYSETTEMPLATE('3AOiEnuln5phdr956JogTX',$,'Pset_DuctSegmentPHistory','Duct segment performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcDuctSegment',(#1546,#1547,#1548,#1549)); +#1546=IFCSIMPLEPROPERTYTEMPLATE('2JlYogvFH6tAQ1_4iG1hlH',$,'LossCoefficient','Dimensionless loss coefficient used for calculating fluid resistance representing the ratio of total pressure loss to velocity pressure at a referenced cross-section.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1547=IFCSIMPLEPROPERTYTEMPLATE('0jxhnwb5XFXg2UUQQeWoiS',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1548=IFCSIMPLEPROPERTYTEMPLATE('1OaK6shnnABgtKT8iIX3P9',$,'LeakageCurveHistory','Leakage per unit length curve versus working pressure. If a scalar is expressed then it represents LeakageClass which is flowrate per unit area at a specified pressure rating (e.g., ASHRAE Fundamentals 2001 34.16.).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1549=IFCSIMPLEPROPERTYTEMPLATE('0c4q8g1CXBQQZ$1EzF0SoJ',$,'FluidFlowLeakage','Volumetric leakage flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1550=IFCPROPERTYSETTEMPLATE('3zNDgYxj9C9f1I8EKtq5nl',$,'Pset_DuctSegmentTypeCommon','Duct segment type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDuctSegment,IfcDuctSegmentType',(#1551,#1552,#1554,#1556,#1557,#1558,#1559,#1560,#1561,#1562,#1563)); +#1551=IFCSIMPLEPROPERTYTEMPLATE('0d48u7DJX0jexIENbmtxzx',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1552=IFCSIMPLEPROPERTYTEMPLATE('2h$rtny9L8IfyCSrZR4dxZ',$,'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',$,#1553,$,$,$,.READWRITE.); +#1553=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1554=IFCSIMPLEPROPERTYTEMPLATE('227e9uEC9AeONP_HVH9MTV',$,'CrossSectionShape','Cross sectional shape. Note that this shape is uniform throughout the length of the segment. For nonuniform shapes, a transition fitting should be used instead.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1555,$,$,$,.READWRITE.); +#1555=IFCPROPERTYENUMERATION('PEnum_DuctSegmentShape',(IFCLABEL('FLATOVAL'),IFCLABEL('RECTANGULAR'),IFCLABEL('ROUND'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1556=IFCSIMPLEPROPERTYTEMPLATE('2KDs3$jkb4$89P2GPnNMyU',$,'WorkingPressure','Working pressure.\X2\000A000A\X0\Pressure classification as defined by the authority having jurisdiction (e.g., SMACNA, etc.).',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1557=IFCSIMPLEPROPERTYTEMPLATE('0QwLP0KRv08wR$KYPSpRl8',$,'PressureRange','Allowable maximum and minimum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1558=IFCSIMPLEPROPERTYTEMPLATE('3RSxnZryfEzRvYxrb55Vxw',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1559=IFCSIMPLEPROPERTYTEMPLATE('3pqFWDXTfFywz3HMKFpahh',$,'LongitudinalSeam','The type of seam to be used along the longitudinal axis of the duct segment.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#1560=IFCSIMPLEPROPERTYTEMPLATE('2VR5zeaGH059UuRqwLsgHU',$,'NominalDiameterOrWidth','The nominal diameter or width of the duct segment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1561=IFCSIMPLEPROPERTYTEMPLATE('1IgJDZrD91xefZm8OPd4o4',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1562=IFCSIMPLEPROPERTYTEMPLATE('3dho2ZDLn1rBTm9xJvFvEU',$,'Reinforcement','The type of reinforcement, if any, used for the duct segment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1563=IFCSIMPLEPROPERTYTEMPLATE('2zwZe_xhzDXgQN9tRxARF5',$,'ReinforcementSpacing','The spacing between reinforcing elements.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1564=IFCPROPERTYSETTEMPLATE('1zNpnATpzB4QktoI47Gwm9',$,'Pset_DuctSilencerPHistory','Duct silencer performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcDuctSilencer',(#1565,#1566)); +#1565=IFCSIMPLEPROPERTYTEMPLATE('2NQdjL8sH5PADorlVDBHrv',$,'AirFlowRate','Air flow rate.\X2\000A000A\X0\Volumetric air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1566=IFCSIMPLEPROPERTYTEMPLATE('2X44sG6p10ru8yDumobKOj',$,'AirPressureDropCurve','Air pressure drop as a function of air flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1567=IFCPROPERTYSETTEMPLATE('21bWK288X5kvZX5KwrIFSv',$,'Pset_DuctSilencerTypeCommon','Duct silencer type common attributes.\X2\000A\X0\InsertionLoss and RegeneratedSound attributes deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDuctSilencer,IfcDuctSilencerType',(#1568,#1569,#1571,#1572,#1573,#1574,#1575,#1576,#1577)); +#1568=IFCSIMPLEPROPERTYTEMPLATE('0ijdXrqSnFiRrwZXNO$xUK',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1569=IFCSIMPLEPROPERTYTEMPLATE('0NfqtFGG16gwDxML7_XwE_',$,'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',$,#1570,$,$,$,.READWRITE.); +#1570=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1571=IFCSIMPLEPROPERTYTEMPLATE('2A7XVJy2z4xQNawrkohWDy',$,'HydraulicDiameter','Hydraulic diameter.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1572=IFCSIMPLEPROPERTYTEMPLATE('2sr$nBmSHAgxkaBfte8SFq',$,'Length','The length of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1573=IFCSIMPLEPROPERTYTEMPLATE('1om21pDU9CU98j8QyLLnrJ',$,'Weight','Total weight of object',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1574=IFCSIMPLEPROPERTYTEMPLATE('1pBxvaq7DFjg11ac56hKKh',$,'AirFlowRateRange','Possible range of airflow that can be delivered.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1575=IFCSIMPLEPROPERTYTEMPLATE('3rba7818v3hQ5WXdQyeHAP',$,'WorkingPressureRange','Allowable minimum and maximum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1576=IFCSIMPLEPROPERTYTEMPLATE('1pOjd6zA15FRcvPnHgaA8A',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1577=IFCSIMPLEPROPERTYTEMPLATE('18Ox2wu7H4iw3vFrtdIHUU',$,'HasExteriorInsulation','TRUE if the silencer has exterior insulation. FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1578=IFCPROPERTYSETTEMPLATE('3Y5g6EpCHDcRfI$FW8PfOk',$,'Pset_ElectricalDeviceCommon','A collection of properties that are commonly used by electrical device types.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionElement,IfcDistributionElementType',(#1579,#1580,#1581,#1582,#1583,#1585,#1586,#1587,#1589,#1590,#1591,#1592,#1593,#1594,#1595)); +#1579=IFCSIMPLEPROPERTYTEMPLATE('0NKyxOCPXDs9NuobAEbqCO',$,'RatedCurrent','The current that a device is designed to handle.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1580=IFCSIMPLEPROPERTYTEMPLATE('0U6_HlF$P2dw3qHFrxqBqZ',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1581=IFCSIMPLEPROPERTYTEMPLATE('0bOKKqQ3j4DBPY5OlrMU2v',$,'NominalFrequencyRange','The upper and lower limits of frequency for which the operation of the device is certified.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#1582=IFCSIMPLEPROPERTYTEMPLATE('2D_MONuOz9sPzmFDmHhZGf',$,'PowerFactor','Power factor; usually as ratio.\X2\000A000A\X0\The ratio between the rated electrical power and the product of the rated current and rated voltage',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1583=IFCSIMPLEPROPERTYTEMPLATE('2X4BBZBen2ou__SF8Xu6cJ',$,'ConductorFunction','Indicates function of the conductors to which the load is connected. Where L1, L2 and L3 represent the phase lines according to IEC 60446 notation (sometimes phase lines may be referenced by color [Red, Blue, Yellow] or by number [1, 2, 3] etc). Protective Earth is sometimes also known as CPC or common protective conductor. Note that for an electrical device, a set of line conductor functions may be applied.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1584,$,$,$,.READWRITE.); +#1584=IFCPROPERTYENUMERATION('PEnum_ConductorFunctionEnum',(IFCLABEL('NEUTRAL'),IFCLABEL('PHASE_L1'),IFCLABEL('PHASE_L2'),IFCLABEL('PHASE_L3'),IFCLABEL('PROTECTIVEEARTH'),IFCLABEL('PROTECTIVEEARTHNEUTRAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1585=IFCSIMPLEPROPERTYTEMPLATE('2qISl8DOL6VeqW$CyHJf$v',$,'NumberOfPoles','Number of poles that the object would affect.\X2\000A000A\X0\The number of live lines that is intended to be handled by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1586=IFCSIMPLEPROPERTYTEMPLATE('0JH$5dZnr8uw9Nz7rFGoeA',$,'HasProtectiveEarth','Indicates whether the object has a protective earth connection (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1587=IFCSIMPLEPROPERTYTEMPLATE('3heqP$KYXBRe4Wl77fd_2m',$,'InsulationStandardClass','Insulation standard classes provides basic protection information against electric shock. Defines levels of insulation required in terms of constructional requirements (creepage and clearance distances) and electrical requirements (compliance with electric strength tests). Basic insulation is considered to be shorted under single fault conditions. The actual values required depend on the working voltage to which the insulation is subjected, as well as other factors. Also indicates whether the electrical device has a protective earth connection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1588,$,$,$,.READWRITE.); +#1588=IFCPROPERTYENUMERATION('PEnum_InsulationStandardClass',(IFCLABEL('CLASS0APPLIANCE'),IFCLABEL('CLASS0IAPPLIANCE'),IFCLABEL('CLASSIAPPLIANCE'),IFCLABEL('CLASSIIAPPLIANCE'),IFCLABEL('CLASSIIIAPPLIANCE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1589=IFCSIMPLEPROPERTYTEMPLATE('19D2yR0nXEcwdkPIriN3tq',$,'IP_Code','IP Code, the International Protection Marking, IEC 60529), classifies and rates the degree of protection provided against intrusion.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1590=IFCSIMPLEPROPERTYTEMPLATE('2h30b9LLX8b9K14Q9NeCIT',$,'IK_Code','IK Code according to IEC 62262 (2002) is a numeric classification for the degree of protection provided by enclosures for electrical equipment against external mechanical impacts.NOTE In earlier labeling, the third numeral (1..) had been occasionally added to the closely related IP Code on ingress protection, to indicate the level of impact protection.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1591=IFCSIMPLEPROPERTYTEMPLATE('2v2EGGJXn5yhSuwd2QRJky',$,'EarthingStyle','Indicates the earthing style of the electric device.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1592=IFCSIMPLEPROPERTYTEMPLATE('05mJh0T152Sgz0oKIbH6ss',$,'HeatDissipation','Indicates the heat dissipation of the electric device measured in power.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1593=IFCSIMPLEPROPERTYTEMPLATE('2xT3MElrH3OOj0aEvx4xoS',$,'Power','The actual power and operable range.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1594=IFCSIMPLEPROPERTYTEMPLATE('0LFc$j36T0W8v5Y9JFvgR5',$,'NominalPowerConsumption','Nominal total power consumption.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1595=IFCSIMPLEPROPERTYTEMPLATE('2yIP01efP9Hwnu4v6ruueD',$,'NumberOfPowerSupplyPorts','Indicates the number of power supply ports of the electric device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#1596=IFCPROPERTYSETTEMPLATE('3lqBCmx6XDcBu35db1Jejg',$,'Pset_ElectricalDeviceCompliance','Properties related to information about compliance to standards or regulations of electric devices.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionElement,IfcDistributionElementType',(#1597,#1598,#1599,#1600)); +#1597=IFCSIMPLEPROPERTYTEMPLATE('3lhX6Lts9BDeoz6o1H$rbc',$,'ElectroMagneticStandardsCompliance','Information about compliance with regard to electro magnetic related standards.',.P_TABLEVALUE.,'IfcLabel','IfcBoolean',$,$,$,$,.READWRITE.); +#1598=IFCSIMPLEPROPERTYTEMPLATE('3Eo2EjcGvAxBIJJW1_gAAN',$,'ExplosiveAtmosphereStandardsCompliance','Information about compliance with regard to explosive atmosphere related standards.',.P_TABLEVALUE.,'IfcLabel','IfcBoolean',$,$,$,$,.READWRITE.); +#1599=IFCSIMPLEPROPERTYTEMPLATE('1tOWoyY4rC88GpsobxQ64C',$,'FireProofingStandardsCompliance','Information about compliance with regard to fire proofing related standards.',.P_TABLEVALUE.,'IfcLabel','IfcBoolean',$,$,$,$,.READWRITE.); +#1600=IFCSIMPLEPROPERTYTEMPLATE('3Ph9Hel9b0k8a7hKi821NN',$,'LightningProtectionStandardsCompliance','Information about compliance with regard to lightning protection related standards.',.P_TABLEVALUE.,'IfcLabel','IfcBoolean',$,$,$,$,.READWRITE.); +#1601=IFCPROPERTYSETTEMPLATE('3IZdp2s_f3BejbBapUHFd0',$,'Pset_ElectricalFeederLine','Properties of conductors used as feeder line. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type CONDUCTORSEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CONDUCTORSEGMENT,IfcCableSegmentType/CONDUCTORSEGMENT',(#1602,#1603,#1604,#1605)); +#1602=IFCSIMPLEPROPERTYTEMPLATE('0l5eO9d8r839nTsh_Lhxsh',$,'CurrentCarryingCapacity','Maximum value of electric current which can be carried continuously by a conductor, a device or an apparatus, under specified conditions without its steady-state temperature exceeding a specified value. Based on IEC60826-11-13. NOTE: The temperature specified value is maximum Design Ambient Temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1603=IFCSIMPLEPROPERTYTEMPLATE('140zZt5yD2wRhns4K15c27',$,'DesignAmbientTemperature','The highest and lowest local ambient temperature likely to be encountered.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1604=IFCSIMPLEPROPERTYTEMPLATE('3$4U5U5M9CffouCBV49_ZO',$,'ElectricalClearanceDistance','The distance between two conductive parts along a string stretched the shortest way between these conductive parts. (IEV ref 441-17-31)',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1605=IFCSIMPLEPROPERTYTEMPLATE('0IFWAfv_z3SgqrNp5pS096',$,'ElectricalFeederType','Type of electrical feeder.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1606,$,$,$,.READWRITE.); +#1606=IFCPROPERTYENUMERATION('PEnum_ElectricalFeederType',(IFCLABEL('ALONGTRACKFEEDER'),IFCLABEL('BYPASSFEEDER'),IFCLABEL('NEGATIVEFEEDER'),IFCLABEL('POSITIVEFEEDER'),IFCLABEL('REINFORCINGFEEDER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1607=IFCPROPERTYSETTEMPLATE('0ToZiVPKbBM8SPA0mQ3An1',$,'Pset_ElectricAppliancePHistory','Captures realtime information for electric appliances, such as for energy usage. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcElectricAppliance',(#1608)); +#1608=IFCSIMPLEPROPERTYTEMPLATE('2a7xhKVX54bgBH6g6cmXQb',$,'PowerState','Indicates the power state of the device where True is on and False is off.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1609=IFCPROPERTYSETTEMPLATE('3TjqDFSZ5BGxh8UdxpoArR',$,'Pset_ElectricApplianceTypeCommon','Common properties for electric appliances. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricAppliance,IfcElectricApplianceType',(#1610,#1611)); +#1610=IFCSIMPLEPROPERTYTEMPLATE('0DNx$4Dm12VfzGuBrgPHOL',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1611=IFCSIMPLEPROPERTYTEMPLATE('1ykDHrFnr1zParu04wd9bw',$,'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',$,#1612,$,$,$,.READWRITE.); +#1612=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1613=IFCPROPERTYSETTEMPLATE('2YDusATXf459q36jspzajP',$,'Pset_ElectricApplianceTypeDishwasher','Common properties for dishwasher appliances. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricAppliance/DISHWASHER,IfcElectricApplianceType/DISHWASHER',(#1614)); +#1614=IFCSIMPLEPROPERTYTEMPLATE('1$v27uyhT5e8Ib5SIYzM6d',$,'DishwasherType','Type of dishwasher.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1615,$,$,$,.READWRITE.); +#1615=IFCPROPERTYENUMERATION('PEnum_ElectricApplianceDishwasherType',(IFCLABEL('BOTTLEWASHER'),IFCLABEL('CUTLERYWASHER'),IFCLABEL('DISHWASHER'),IFCLABEL('POTWASHER'),IFCLABEL('TRAYWASHER'),IFCLABEL('UNKNOWN'),IFCLABEL('OTHER'),IFCLABEL('UNSET')),$); +#1616=IFCPROPERTYSETTEMPLATE('2a$uAl7kXCxO9_3EiKa7kL',$,'Pset_ElectricApplianceTypeElectricCooker','Common properties for electric cooker appliances. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricAppliance/ELECTRICCOOKER,IfcElectricApplianceType/ELECTRICCOOKER',(#1617)); +#1617=IFCSIMPLEPROPERTYTEMPLATE('00JHy2mZLA7fmeSb_Of7UJ',$,'ElectricCookerType','Type of electric cooker.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1618,$,$,$,.READWRITE.); +#1618=IFCPROPERTYENUMERATION('PEnum_ElectricApplianceElectricCookerType',(IFCLABEL('COOKINGKETTLE'),IFCLABEL('DEEPFRYER'),IFCLABEL('OVEN'),IFCLABEL('STEAMCOOKER'),IFCLABEL('STOVE'),IFCLABEL('TILTINGFRYINGPAN'),IFCLABEL('UNKNOWN'),IFCLABEL('OTHER'),IFCLABEL('UNSET')),$); +#1619=IFCPROPERTYSETTEMPLATE('1Sg5yKHNH4d9tU1mvjjQqA',$,'Pset_ElectricFlowStorageDeviceTypeBattery','Properties of batteries. The property set can be used by the predefined type BATTERY of IfcElectricFlowStorageDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice/BATTERY,IfcElectricFlowStorageDeviceType/BATTERY',(#1620,#1621,#1622,#1623,#1624,#1626,#1627)); +#1620=IFCSIMPLEPROPERTYTEMPLATE('371LE8qUf2duUebk0uEwqi',$,'CurrentRegulationRate','It shows the ability of DC regulated power supply to suppress the fluctuation of output voltage caused by the change of load current (output current) when the input voltage is constant.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#1621=IFCSIMPLEPROPERTYTEMPLATE('21o8VSwd59rwFdxrF1LI0b',$,'NominalSupplyCurrent','The nominal current of the supply.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1622=IFCSIMPLEPROPERTYTEMPLATE('1u3b7$_sP7N9hILbn1B0Tt',$,'VoltageRegulationRate','When the input side voltage changes from the lowest allowable input value to the specified maximum value, the relative change value of the output voltage is the percentage of the rated output voltage.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#1623=IFCSIMPLEPROPERTYTEMPLATE('0fV6iy5eT9qQjjntO$oqVW',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#1624=IFCSIMPLEPROPERTYTEMPLATE('2Z23LoKQfA58rmRUV_KJ_r',$,'BatteryChargingType','Identifies the predefined types of battery charging.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1625,$,$,$,.READWRITE.); +#1625=IFCPROPERTYENUMERATION('PEnum_BatteryChargingType',(IFCLABEL('RECHARGEABLE'),IFCLABEL('SINGLECHARGE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1626=IFCSIMPLEPROPERTYTEMPLATE('2blunbngn3Lg2p9hK$St1v',$,'EncapsulationTechnologyCode','Code indicating the encapsulation technology which has been applied in an electric, electronic or electromechanical component.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1627=IFCSIMPLEPROPERTYTEMPLATE('0Ac37t2eL2ERn6AbgkckTw',$,'OpenCircuitVoltage','Voltage of a cell or battery when the discharge current is zero [Source IEC 482-03-32]',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1628=IFCPROPERTYSETTEMPLATE('2pLhi4qfP5DwJjM5swXRYd',$,'Pset_ElectricFlowStorageDeviceTypeCapacitor','Properties of capacitors. The property set can be used by the predefined type CAPACITOR of IfcElectricFlowStorageDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice/CAPACITOR,IfcElectricFlowStorageDeviceType/CAPACITOR',(#1629)); +#1629=IFCSIMPLEPROPERTYTEMPLATE('2kB6ftJCzEoBycW508ZhoO',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1630=IFCPROPERTYSETTEMPLATE('0i_1GNcEzAcOhRtZprcuHa',$,'Pset_ElectricFlowStorageDeviceTypeCommon','The characteristics of the supply associated with an electrical device occurrence acting as a source of supply to an electrical distribution system NOTE: Properties within this property set should ONLY be used in circumstances when an electrical supply is applied. The property set, the properties contained and their values are not applicable to a circumstance where the sypply is not being applied to the eletrical system or is temporarily disconnected. All properties within this property set are considered to represent a steady state situation.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice,IfcElectricFlowStorageDeviceType',(#1631,#1632,#1634,#1635,#1636,#1637,#1639,#1640,#1641,#1642,#1643,#1644,#1645,#1646,#1647,#1648,#1649,#1650,#1651,#1652,#1653)); +#1631=IFCSIMPLEPROPERTYTEMPLATE('1b19VkPhv1fhIskPzQEC5U',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1632=IFCSIMPLEPROPERTYTEMPLATE('0rPpq0OM9AvRsqLdOAoHR_',$,'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',$,#1633,$,$,$,.READWRITE.); +#1633=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1634=IFCSIMPLEPROPERTYTEMPLATE('1IGd3rzCbAYBNpiE0CH$$j',$,'NominalSupplyVoltage','The nominal voltage of the supply.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1635=IFCSIMPLEPROPERTYTEMPLATE('3VtNrSQSD4Zes5Yc9oFPge',$,'NominalSupplyVoltageOffset','The maximum and minimum allowed voltage of the supply e.g. boundaries of 380V/440V may be applied for a nominal voltage of 400V.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1636=IFCSIMPLEPROPERTYTEMPLATE('0evZ7hxtf4$OnycByLCIDx',$,'NominalFrequency','The nominal frequency of the supply.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#1637=IFCSIMPLEPROPERTYTEMPLATE('3fvvRotUzAofCgSzmcL3bS',$,'ConnectedConductorFunction','Function of the conductors to which the load is connected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1638,$,$,$,.READWRITE.); +#1638=IFCPROPERTYENUMERATION('PEnum_ConductorFunctionEnum',(IFCLABEL('NEUTRAL'),IFCLABEL('PHASE_L1'),IFCLABEL('PHASE_L2'),IFCLABEL('PHASE_L3'),IFCLABEL('PROTECTIVEEARTH'),IFCLABEL('PROTECTIVEEARTHNEUTRAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1639=IFCSIMPLEPROPERTYTEMPLATE('0NGkeQPP18nx2mYDbZm8tE',$,'ShortCircuit3PoleMaximumState','Maximum 3 pole short circuit current provided at the point of supply.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1640=IFCSIMPLEPROPERTYTEMPLATE('2f9vycmKz3lBRrLOm1ziQz',$,'ShortCircuit3PolePowerFactorMaximumState','Power factor of the maximum 3 pole short circuit current provided at the point of supply.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1641=IFCSIMPLEPROPERTYTEMPLATE('0j0gCk7JHDaRQzwGNEjeFF',$,'ShortCircuit2PoleMinimumState','Minimum 2 pole short circuit current provided at the point of supply.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1642=IFCSIMPLEPROPERTYTEMPLATE('1veF0LubTEUxR8dcoI8XfR',$,'ShortCircuit2PolePowerFactorMinimumState','Power factor of the minimum 2 pole short circuit current provided at the point of supply.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1643=IFCSIMPLEPROPERTYTEMPLATE('2fyjHrxAf4IhIdohk$lt19',$,'ShortCircuit1PoleMaximumState','Maximum 1 pole short circuit current provided at the point of supply i.e. the fault between 1 phase and N.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1644=IFCSIMPLEPROPERTYTEMPLATE('2mKviIS0r87egy50BMA5b9',$,'ShortCircuit1PolePowerFactorMaximumState','Power factor of the maximum 1 pole short circuit current provided at the point of supply i.e. the fault between 1 phase and N.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1645=IFCSIMPLEPROPERTYTEMPLATE('3PLGF4mpbC6BFrE48wKnJ3',$,'ShortCircuit1PoleMinimumState','Minimum 1 pole short circuit current provided at the point of supply i.e. the fault between 1 phase and N.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1646=IFCSIMPLEPROPERTYTEMPLATE('39jp7yFInCh9NO5RV3L_h7',$,'ShortCircuit1PolePowerFactorMinimumState','Power factor of the minimum 1 pole short circuit current provided at the point of supply i.e. the fault between 1 phase and N.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1647=IFCSIMPLEPROPERTYTEMPLATE('0d22VaT9LBiemGN5FkwbSw',$,'EarthFault1PoleMaximumState','Maximum 1 pole earth fault current provided at the point of supply i.e. the fault between 1 phase and PE/PEN.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1648=IFCSIMPLEPROPERTYTEMPLATE('3ycAgVqdzFzurx4DRrQl8v',$,'EarthFault1PolePowerFactorMaximumState','Power factor of the maximum 1 pole earth fault current provided at the point of supply i.e. the fault between 1 phase and PE/PEN.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1649=IFCSIMPLEPROPERTYTEMPLATE('3_IG7f68r5DBNA_mB2RHu8',$,'EarthFault1PoleMinimumState','Minimum 1 pole earth fault current provided at the point of supply i.e. the fault between 1 phase and PE/PEN.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1650=IFCSIMPLEPROPERTYTEMPLATE('2mHXQThMv7$OuYWj90EkKX',$,'EarthFault1PolePowerFactorMinimumState','Power factor of the minimum 1 pole earth fault current provided at the point of supply i.e. the fault between 1 phase and PE/PEN.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1651=IFCSIMPLEPROPERTYTEMPLATE('2$JhnUJfTDbQnWjWh2kGSf',$,'MaximumInsulatedVoltage','The max voltage that the insulation would operate normally',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1652=IFCSIMPLEPROPERTYTEMPLATE('1oOGw6DKPBWvCi$8UNx12m',$,'RatedCapacitance','Capacitance value determined under specified conditions and declared by the manufacturer.',.P_SINGLEVALUE.,'IfcElectricCapacitanceMeasure',$,$,$,$,$,.READWRITE.); +#1653=IFCSIMPLEPROPERTYTEMPLATE('0qmY0bfEfEgPgGImcAM$Jw',$,'PowerCapacity','Power capacity of the equipment',.P_SINGLEVALUE.,'IfcElectricChargeMeasure',$,$,$,$,$,.READWRITE.); +#1654=IFCPROPERTYSETTEMPLATE('33$m_KRI91qfjC2YqStdue',$,'Pset_ElectricFlowStorageDeviceTypeInductor','Properties of inductors. The property set can be used by the predefined type INDUCTOR of IfcElectricFlowStorageDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice/INDUCTOR,IfcElectricFlowStorageDeviceType/INDUCTOR',(#1655,#1656)); +#1655=IFCSIMPLEPROPERTYTEMPLATE('3cTN7K$bPD08UC8f2qfoZl',$,'Inductance','Measure of the Inductance.',.P_SINGLEVALUE.,'IfcInductanceMeasure',$,$,$,$,$,.READWRITE.); +#1656=IFCSIMPLEPROPERTYTEMPLATE('2bNrszc4fF78SX1ioyZIFK',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1657=IFCPROPERTYSETTEMPLATE('1io2iJrS5AJ8xKjcPQTKHc',$,'Pset_ElectricFlowStorageDeviceTypeRecharger','Properties of battery rechargers. The property set can be used by the predefined type RECHARGER of IfcElectricFlowStorageDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice/RECHARGER,IfcElectricFlowStorageDeviceType/RECHARGER',(#1658)); +#1658=IFCSIMPLEPROPERTYTEMPLATE('1MofFPDg11kwj$UCy5EFeo',$,'NominalSupplyCurrent','The nominal current of the supply.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1659=IFCPROPERTYSETTEMPLATE('3iN5czMYT2mPH6F_mkDQJI',$,'Pset_ElectricFlowStorageDeviceTypeUPS','Properties of uninterruptible power supply equipment. The property set can be used by the predefined type UPS of IfcElectricFlowStorageDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice/UPS,IfcElectricFlowStorageDeviceType/UPS',(#1660,#1661,#1662,#1663)); +#1660=IFCSIMPLEPROPERTYTEMPLATE('0MuAMVmhTF89pxnonNXjBq',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#1661=IFCSIMPLEPROPERTYTEMPLATE('2T4o1KVEL6JAAtIJ3L8UnR',$,'CurrentRegulationRate','It shows the ability of DC regulated power supply to suppress the fluctuation of output voltage caused by the change of load current (output current) when the input voltage is constant.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#1662=IFCSIMPLEPROPERTYTEMPLATE('3qIHm7x6DDz8KjOVAjtm08',$,'NominalSupplyCurrent','The nominal current of the supply.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1663=IFCSIMPLEPROPERTYTEMPLATE('37loIyZx92Se_S0fSdahCD',$,'VoltageRegulationRate','When the input side voltage changes from the lowest allowable input value to the specified maximum value, the relative change value of the output voltage is the percentage of the rated output voltage.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#1664=IFCPROPERTYSETTEMPLATE('2X26Wea5jFTxfJXWYTxCxP',$,'Pset_ElectricFlowTreatmentDeviceTypeElectronicFilter','Properties associated to electronic filter.\X2\000A\X0\An electronic filter is a device designed to transmit spectral components of signals according to a specified law, generally in order to pass the components in certain frequency bands and to attenuate those in other bands (IEC702-09-17)',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricFlowTreatmentDevice/ELECTRONICFILTER,IfcElectricFlowTreatmentDeviceType/ELECTRONICFILTER',(#1665,#1666,#1668,#1669,#1670,#1671)); +#1665=IFCSIMPLEPROPERTYTEMPLATE('1PjjPHqEH7k9$CL4M9vC2D',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1666=IFCSIMPLEPROPERTYTEMPLATE('3ZdCOprB92h8HDixZDS1MC',$,'ElectronicFilterType','Type of electronic filter.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1667,$,$,$,.READWRITE.); +#1667=IFCPROPERTYENUMERATION('PEnum_ElectronicFilterType',(IFCLABEL('BANDPASSFLITER'),IFCLABEL('BANDSTOPFILTER'),IFCLABEL('FILTERCAPACITOR'),IFCLABEL('HARMONICFILTER'),IFCLABEL('HIGHPASSFILTER'),IFCLABEL('LOWPASSFILTER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1668=IFCSIMPLEPROPERTYTEMPLATE('14t6UZMO15vBzaGxe34vLL',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1669=IFCSIMPLEPROPERTYTEMPLATE('1fVD4H46j6ggiy0CEQWuLQ',$,'PrimaryFrequency','The frequency that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#1670=IFCSIMPLEPROPERTYTEMPLATE('2yrR4bRhr2Yv27sIWp4Uo7',$,'SecondaryFrequency','The frequency that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#1671=IFCSIMPLEPROPERTYTEMPLATE('3U6y3PGUz6QBhQbSoQTLxX',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1672=IFCPROPERTYSETTEMPLATE('0nA3ojNiX4CeQrQJya0zUy',$,'Pset_ElectricGeneratorTypeCommon','Defines a particular type of engine that is a machine for converting mechanical energy into electrical energy.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricGenerator,IfcElectricGeneratorType',(#1673,#1674,#1676,#1677,#1678)); +#1673=IFCSIMPLEPROPERTYTEMPLATE('3eHs3Ud9L26RhgKp5Cileh',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1674=IFCSIMPLEPROPERTYTEMPLATE('0pOkR7mq50qBuoVsuRdlsj',$,'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',$,#1675,$,$,$,.READWRITE.); #1675=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1676=IFCPROPERTYSETTEMPLATE('3iGWhbv7r2PBD4l282Nl0S',$,'Pset_ElementAssemblyCommon','Properties common to the definition of all occurrence and type objects of element assembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly,IfcElementAssemblyType',(#1677,#1678)); -#1677=IFCSIMPLEPROPERTYTEMPLATE('35yvy7crz8qB3EPaROEAO7',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1678=IFCSIMPLEPROPERTYTEMPLATE('37QgLoaSX4p8w9agN2v$e9',$,'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',$,#1679,$,$,$,.READWRITE.); -#1679=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1680=IFCPROPERTYSETTEMPLATE('26ZorsJm50b9vnC48I8nZX',$,'Pset_ElementAssemblyTypeCantilever','Energy cantilever properties used in railway. The property set can be used by the predefined type SUSPENSION_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUSPENSIONASSEMBLY,IfcElementAssemblyType/SUSPENSIONASSEMBLY',(#1681,#1682,#1683,#1684)); -#1681=IFCSIMPLEPROPERTYTEMPLATE('1cUzwWjnD6UQmJ60G$c0NU',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#1682=IFCSIMPLEPROPERTYTEMPLATE('3wJzdT1tP8Wx9mfgjZBxwk',$,'ContactWireStagger','Lateral displacement of the contact wire to opposite sides of the track centre at successive supports.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1683=IFCSIMPLEPROPERTYTEMPLATE('0UfNqv3Rv4t86yoKWf6pPY',$,'SystemHeight','Vertical distance between the main catenary wire and the contact wire measured at a support point.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1684=IFCSIMPLEPROPERTYTEMPLATE('0BhyZfGLrAzwoAsrg7bNhM',$,'CantileverType','Type of cantilever assembly.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1685,$,$,$,.READWRITE.); -#1685=IFCPROPERTYENUMERATION('PEnum_CantileverAssemblyType',(IFCLABEL('CENTER_CANTILEVER'),IFCLABEL('DIRECT_SUSPENSION'),IFCLABEL('INSULATED_OVERLAP_CANTILEVER'),IFCLABEL('INSULATED_SUSPENSION_SET'),IFCLABEL('MECHANICAL_OVERLAP_CANTILEVER'),IFCLABEL('MIDPOINT_CANTILEVER'),IFCLABEL('MULTIPLE_TRACK_CANTILEVER'),IFCLABEL('OUT_OF_RUNNING_CANTILEVER'),IFCLABEL('PHASE_SEPARATION_CANTILEVER'),IFCLABEL('SINGLE'),IFCLABEL('SYSTEM_SEPARATION_CANTILEVER'),IFCLABEL('TRANSITION_CANTILEVER'),IFCLABEL('TURNOUT_CANTILEVER'),IFCLABEL('UNDERBRIDGE_CANTILEVER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1686=IFCPROPERTYSETTEMPLATE('1bN6XDvnH11BX$lexfZW$1',$,'Pset_ElementAssemblyTypeDilatationPanel','Adjustment switch panel properties used in railway. The property set can be used by the predefined type DILATATION_PANEL of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/DILATATIONPANEL,IfcElementAssemblyType/DILATATIONPANEL',(#1687,#1688,#1689,#1691,#1692)); -#1687=IFCSIMPLEPROPERTYTEMPLATE('2wcpZd_GPA6xmooPbFC57U',$,'TechnicalStandard','The technical standard which the element should comply with.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#1688=IFCSIMPLEPROPERTYTEMPLATE('1jcPSWlrz7ThmjorDUZD0Z',$,'DilatationLength','Length dilatation admitted by the element.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1689=IFCSIMPLEPROPERTYTEMPLATE('2nyb5kVo5DGf7HaikBpONj',$,'ExpansionDirection','The expansion direction, e.g. single direction, bi-direction',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1690,$,$,$,.READWRITE.); -#1690=IFCPROPERTYENUMERATION('PEnum_ExpansionDirection',(IFCLABEL('BI_DIRECTION'),IFCLABEL('SINGLE_DIRECTION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1691=IFCSIMPLEPROPERTYTEMPLATE('2VdLG874v4_x3Qn0B4MSFC',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); -#1692=IFCSIMPLEPROPERTYTEMPLATE('0wCbQDpUr3WRh9bHjuAfpm',$,'BladesOrientation','Orientation of internal blades.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1693,$,$,$,.READWRITE.); -#1693=IFCPROPERTYENUMERATION('PEnum_BladesOrientation',(IFCLABEL('BLADESINSIDE'),IFCLABEL('BLADESOUTSIDE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1694=IFCPROPERTYSETTEMPLATE('0TD9Ykjgv38Bl$ND9kTxif',$,'Pset_ElementAssemblyTypeHeadSpan','Energy Head Span properties used in railway. The property set can be used by the predefined type SUSPENSION_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUPPORTINGASSEMBLY,IfcElementAssemblyType/SUPPORTINGASSEMBLY',(#1695,#1696,#1697)); -#1695=IFCSIMPLEPROPERTYTEMPLATE('359G2McKr8LvAcujqbRH5Y',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#1696=IFCSIMPLEPROPERTYTEMPLATE('1XcfP$Q7D5Nuqamzfv9b48',$,'NumberOfTracksCrossed','Indicates the number of tracks which OCS supporting system crosses.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1697=IFCSIMPLEPROPERTYTEMPLATE('2isqkZ$ZTFYQlBjQH1FpSE',$,'Span','Clear span for this object.The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1698=IFCPROPERTYSETTEMPLATE('0gaddRUpz7ZAWXR1BIJUSe',$,'Pset_ElementAssemblyTypeMast','Telecom Tower properties used in railway. The property set can be used by the predefined type MAST of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/MAST,IfcElementAssemblyType/MAST',(#1699)); -#1699=IFCSIMPLEPROPERTYTEMPLATE('0qEL65P498vxXbD3cKy6Tb',$,'WithLightningRod','Indicates whether the element is equipped with a lightning rod (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1700=IFCPROPERTYSETTEMPLATE('1tkuH65Gj8$f0u2nE1K9P7',$,'Pset_ElementAssemblyTypeOCSSuspension','Common energy suspension properties used in railway. The property set can be used by the predefined type SUSPENSION_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUSPENSIONASSEMBLY,IfcElementAssemblyType/SUSPENSIONASSEMBLY',(#1701,#1702)); -#1701=IFCSIMPLEPROPERTYTEMPLATE('0suKkJ9CHEaQoFjjEMdS1d',$,'ContactWireStagger','Lateral displacement of the contact wire to opposite sides of the track centre at successive supports.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1702=IFCSIMPLEPROPERTYTEMPLATE('1Q73z4lfzBLw_fJdQ3snPa',$,'ContactWireHeight','Distance from the top of the rail to the lower face of the contact wire, measured perpendicular to the track.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1703=IFCPROPERTYSETTEMPLATE('28AkWzuwjAeP4gr13kTPM9',$,'Pset_ElementAssemblyTypeRigidFrame','Energy Cross Beam properties used in railway. The property set can be used by the predefined type RIGID_FRAME of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/RIGID_FRAME,IfcElementAssemblyType/RIGID_FRAME',(#1704,#1705,#1706,#1707)); -#1704=IFCSIMPLEPROPERTYTEMPLATE('0Dpx5y5Wz2LwEC3j3wadkW',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#1705=IFCSIMPLEPROPERTYTEMPLATE('0ui5ZzqHTBiffXFsEHKM3w',$,'LoadCapacity','Indicates the highest permissible load capacity.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#1706=IFCSIMPLEPROPERTYTEMPLATE('1bHANQyV99RBO6uKsFdSHK',$,'NumberOfTracksCrossed','Indicates the number of tracks which OCS supporting system crosses.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1707=IFCSIMPLEPROPERTYTEMPLATE('2mgfQihGr6fB5Wl9HPcj1p',$,'Span','Clear span for this object.The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1708=IFCPROPERTYSETTEMPLATE('2LxtKwfh92O8XO32a_26X0',$,'Pset_ElementAssemblyTypeSteadyDevice','Energy steady device properties used in railway. The property set can be used by the predefined type SUSPENSION_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUSPENSIONASSEMBLY,IfcElementAssemblyType/SUSPENSIONASSEMBLY',(#1709,#1710,#1711,#1712)); -#1709=IFCSIMPLEPROPERTYTEMPLATE('2cb2N66C5D2BcG7TSLIk7j',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#1710=IFCSIMPLEPROPERTYTEMPLATE('3IqQVcx5n8EApFbYFvsWf_',$,'ContactWireStagger','Lateral displacement of the contact wire to opposite sides of the track centre at successive supports.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1711=IFCSIMPLEPROPERTYTEMPLATE('2gHZZZ1Mn7_xNs3mkUJwHu',$,'IsSetOnWorkingWire','Indicates whether the steady device is set on the working wire.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1712=IFCSIMPLEPROPERTYTEMPLATE('1cg2qO51f0zepEZczE7Z0H',$,'SteadyDeviceType','Type of Steady Device: To indicate the mode of registration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1713,$,$,$,.READWRITE.); -#1713=IFCPROPERTYENUMERATION('PEnum_SteadyDeviceType',(IFCLABEL('PULL_OFF'),IFCLABEL('PUSH_OFF'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1714=IFCPROPERTYSETTEMPLATE('0AyWPLwq11jQiu4hhISH96',$,'Pset_ElementAssemblyTypeSupportingAssembly','Energy supporting assembly properties used in railway. The property set can be used by the predefined type SUPPORTING_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUPPORTINGASSEMBLY,IfcElementAssemblyType/SUPPORTINGASSEMBLY',(#1715,#1716)); -#1715=IFCSIMPLEPROPERTYTEMPLATE('1BT0uNsGD8gAmsh6NJfvcz',$,'NumberOfCantilevers','Indicates the number of cantilevers in the OCS supporting system.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1716=IFCSIMPLEPROPERTYTEMPLATE('11Ja$_nl9BHwJd1E2HfGhl',$,'TypeOfSupportingSystem','Type of foundation in the OCS supporting system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1717,$,$,$,.READWRITE.); -#1717=IFCPROPERTYENUMERATION('PEnum_SupportingSystemType',(IFCLABEL('ENDCATENARYSUPPORT'),IFCLABEL('HEADSPANSUPPORT'),IFCLABEL('HERSE'),IFCLABEL('MULTITRACKSUPPORT'),IFCLABEL('RIGIDGANTRY'),IFCLABEL('SIMPLESUPPORT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1718=IFCPROPERTYSETTEMPLATE('13$ILt_pv7TBYDir7j1079',$,'Pset_ElementAssemblyTypeTrackPanel','Track panel properties used in railway. The property set can be used by the predefined type TRACK_PANEL of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/TRACKPANEL,IfcElementAssemblyType/TRACKPANEL',(#1719,#1720,#1721)); -#1719=IFCSIMPLEPROPERTYTEMPLATE('0UOHelVg9DJ8xtGoF9K2P2',$,'IsAccessibleByVehicle','Indicates whether the element is accessible by a vehicle or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1720=IFCSIMPLEPROPERTYTEMPLATE('1GadovWV98iQ9A0L$hfYev',$,'TrackExpansion','In curvature context, bounded value of the expansion distance that can be added to rail gauge.',.P_BOUNDEDVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1721=IFCSIMPLEPROPERTYTEMPLATE('1QCCOTDO94ah6QuOzXu3UE',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); -#1722=IFCPROPERTYSETTEMPLATE('13gLYfshPFoPf3SfYcf6tz',$,'Pset_ElementAssemblyTypeTractionSwitchingAssembly','Energy switching assembly properties used in railway. The property set can be used by the predefined type TRACTION_SWITCHING_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/TRACTION_SWITCHING_ASSEMBLY,IfcElementAssemblyType/TRACTION_SWITCHING_ASSEMBLY',(#1723,#1724,#1725,#1726)); -#1723=IFCSIMPLEPROPERTYTEMPLATE('1$s5GE511BOhleYshjUlin',$,'NominalCurrent','The nominal current that is designed to be measured.\X2\000A000A\X0\A set of nominal currents in [A] for which the data of this instance is valid. At least one value shall be provided. Any value in the set shall not exceed the value of the\X2\000A\X0\UltimateRatedCurrent associated with the same breaker unit.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#1724=IFCSIMPLEPROPERTYTEMPLATE('0APkWM1an0_RBknF8F9zbl',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1725=IFCSIMPLEPROPERTYTEMPLATE('0e415sucj7v9mHS033lL3a',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#1726=IFCSIMPLEPROPERTYTEMPLATE('1tLB91OYP9whvTecsxX8ue',$,'DesignAmbientTemperature','The highest and lowest local ambient temperature likely to be encountered.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1727=IFCPROPERTYSETTEMPLATE('3diZ47eSf4BRcoY8i8XAu7',$,'Pset_ElementAssemblyTypeTurnoutPanel','Turnout panel properties used in railway. The property set can be used by the predefined type TURNOUT_PANEL of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/TURNOUTPANEL,IfcElementAssemblyType/TURNOUTPANEL',(#1728,#1729,#1731,#1732,#1733,#1735,#1736,#1737,#1738,#1740,#1742,#1743,#1744,#1745,#1747,#1749)); -#1728=IFCSIMPLEPROPERTYTEMPLATE('1pDbFUnw53S8WT67Xdre00',$,'IsAccessibleByVehicle','Indicates whether the element is accessible by a vehicle or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1729=IFCSIMPLEPROPERTYTEMPLATE('3nIxSzBX5Bk8rs3NChfkIE',$,'BranchLineDirection','Describes the direction associated to the branch line of the turnout (deviated branch).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1730,$,$,$,.READWRITE.); -#1730=IFCPROPERTYENUMERATION('PEnum_BranchLineDirection',(IFCLABEL('LEFTDEVIATION'),IFCLABEL('LEFT_LEFTDEVIATION'),IFCLABEL('LEFT_RIGHTDEVIATION'),IFCLABEL('RIGHTDEVIATION'),IFCLABEL('RIGHT_LEFTDEVIATION'),IFCLABEL('RIGHT_RIGHTDEVIATION'),IFCLABEL('SYMETRIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1731=IFCSIMPLEPROPERTYTEMPLATE('10QSd2Wuf3uv0ytHMCQQum',$,'TrackExpansion','In curvature context, bounded value of the expansion distance that can be added to rail gauge.',.P_BOUNDEDVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1732=IFCSIMPLEPROPERTYTEMPLATE('1XeuImua5D0u$ANYy_KmXm',$,'TurnoutCurvedRadius','If turnout is curved, the main branch radius of curvature.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#1733=IFCSIMPLEPROPERTYTEMPLATE('03XLEfR1v8Y8QnuKKIlyrw',$,'TypeOfCurvedTurnout','Turnouts that are positioned in the curved part of the alignment.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1734,$,$,$,.READWRITE.); -#1734=IFCPROPERTYENUMERATION('PEnum_TypeOfCurvedTurnout',(IFCLABEL('CIRCULAR_ARC'),IFCLABEL('STRAIGHT'),IFCLABEL('TRANSITION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1735=IFCSIMPLEPROPERTYTEMPLATE('29r76BO2H3xRScFBcTX$Pe',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); -#1736=IFCSIMPLEPROPERTYTEMPLATE('2jaXqQEcH1hQjHpdmHfYj1',$,'IsSharedTurnout','Indicates if the turnout makes a connection to another infrastructure owner (for sharing costs).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1737=IFCSIMPLEPROPERTYTEMPLATE('0rT8wE3xbD6hI9sPu1YmVi',$,'MaximumSpeedLimitOfDivergingLine','Maximum speed for diverging line that corresponds to the type of turnout and design constraints.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#1738=IFCSIMPLEPROPERTYTEMPLATE('0nd2L7_Fz19Pmm44nbPriP',$,'TypeOfDrivingDevice','Type of the driving device used for the turnout.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1739,$,$,$,.READWRITE.); -#1739=IFCPROPERTYENUMERATION('PEnum_TypeOfDrivingDevice',(IFCLABEL('ELECTRIC'),IFCLABEL('HYDRAULIC'),IFCLABEL('MANUAL'),IFCLABEL('MIXED'),IFCLABEL('MOTORISED'),IFCLABEL('PNEUMATIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1740=IFCSIMPLEPROPERTYTEMPLATE('1t5yFJ7Oz6OPHaFU7WYPb0',$,'TrackElementOrientation','Turnout panels can be placed in 2 mirror-symmetric directions in the field. To distinguish both ends of the turnout panel, a definition of an orientation system with respect to the panel is necessary. The orientation defines, if the panel is oriented in a way or opposite with respect to the direction of the alignment/stationing.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1741,$,$,$,.READWRITE.); -#1741=IFCPROPERTYENUMERATION('PEnum_TurnoutPanelOrientation',(IFCLABEL('BACK'),IFCLABEL('FRONT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1742=IFCSIMPLEPROPERTYTEMPLATE('3lBAxicw5BTehq2vAsxmm3',$,'PercentShared','Percent of costs paid by the other infrastructure owner.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1743=IFCSIMPLEPROPERTYTEMPLATE('2KYcgWzpr7COmd$nDgxPjN',$,'TrackGaugeLength','Basic track gauge of permanent way.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1744=IFCSIMPLEPROPERTYTEMPLATE('0cmMTg0MzDXw6eev395Ibu',$,'TurnoutPointMachineCount','Count of point machines inside turnout panel.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1745=IFCSIMPLEPROPERTYTEMPLATE('34uyyuFGL0Cgg4fQ0QMXoH',$,'TurnoutHeaterType','Defines the kind of turnout heater installed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1746,$,$,$,.READWRITE.); -#1746=IFCPROPERTYENUMERATION('PEnum_TurnoutHeaterType',(IFCLABEL('ELECTRIC'),IFCLABEL('GAS'),IFCLABEL('GEOTHERMAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1747=IFCSIMPLEPROPERTYTEMPLATE('3mnPuBdW58Sfxd5qiOj7oA',$,'TypeOfJunction','The turnout part of the continuous welded rail.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1748,$,$,$,.READWRITE.); -#1748=IFCPROPERTYENUMERATION('PEnum_TypeOfJunction',(IFCLABEL('ISOLATED_JOINT'),IFCLABEL('JOINTED'),IFCLABEL('WELDED_AND_INSERTABLE'),IFCLABEL('WELDED_AND_NOT_INSERTABLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1749=IFCSIMPLEPROPERTYTEMPLATE('1hIdiY_kHEkuoTxL4UDrKY',$,'TypeOfTurnout','Type of turnout.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1750,$,$,$,.READWRITE.); -#1750=IFCPROPERTYENUMERATION('PEnum_TypeOfTurnout',(IFCLABEL('DERAILMENT_TURNOUT'),IFCLABEL('DIAMOND_CROSSING'),IFCLABEL('DOUBLE_SLIP_CROSSING'),IFCLABEL('SCISSOR_CROSSOVER'),IFCLABEL('SINGLE_SLIP_CROSSING'),IFCLABEL('SLIP_TURNOUT_AND_SCISSORS_CROSSING'),IFCLABEL('SYMMETRIC_TURNOUT'),IFCLABEL('THREE_WAYS_TURNOUT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1751=IFCPROPERTYSETTEMPLATE('0aaKFhMOP89B5fOulyeoWk',$,'Pset_ElementComponentCommon','Set of common properties of component elements (especially discrete accessories, but also fasteners, reinforcement elements, or other types of components).',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementComponent,IfcElementComponentType',(#1752,#1753,#1755,#1757)); -#1752=IFCSIMPLEPROPERTYTEMPLATE('3l3YaYlt1FOeaKF87onB52',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1753=IFCSIMPLEPROPERTYTEMPLATE('2_XZiYF9n67QjeiEW6h6Tg',$,'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',$,#1754,$,$,$,.READWRITE.); -#1754=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1755=IFCSIMPLEPROPERTYTEMPLATE('0mLuNr3JrBKeCSnBbnQ4FB',$,'DeliveryType','Determines how the accessory will be delivered to the site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1756,$,$,$,.READWRITE.); -#1756=IFCPROPERTYENUMERATION('PEnum_ElementComponentDeliveryType',(IFCLABEL('ATTACHED_FOR_DELIVERY'),IFCLABEL('CAST_IN_PLACE'),IFCLABEL('LOOSE'),IFCLABEL('PRECAST'),IFCLABEL('WELDED_TO_STRUCTURE'),IFCLABEL('NOTDEFINED')),$); -#1757=IFCSIMPLEPROPERTYTEMPLATE('17FN1YvrL02fDOlPyzneHb',$,'CorrosionTreatment','Determines corrosion treatment for metal components. This property is provided if the requirement needs to be expressed (a) independently of a material specification and (b) as a mere requirements statement rather than a workshop design/ processing feature.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1758,$,$,$,.READWRITE.); -#1758=IFCPROPERTYENUMERATION('PEnum_ElementComponentCorrosionTreatment',(IFCLABEL('EPOXYCOATED'),IFCLABEL('GALVANISED'),IFCLABEL('NONE'),IFCLABEL('PAINTED'),IFCLABEL('STAINLESS'),IFCLABEL('NOTDEFINED')),$); -#1759=IFCPROPERTYSETTEMPLATE('36zZX4FkPA1gagogPremcB',$,'Pset_ElementKinematics','Information confirming that the element has cyclic and/or pathed kinematic behaviour. The resulting envelope may be available as a ''clearance'' shape representation.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#1760,#1761,#1762,#1763,#1764,#1765,#1766)); -#1760=IFCSIMPLEPROPERTYTEMPLATE('0b01UaFzb1tBAf23w5j4_e',$,'CyclicPath','Represents the time:angle table of the kinematic behaviour.',.P_TABLEVALUE.,'IfcTimeMeasure','IfcPlaneAngleMeasure',$,$,$,$,.READWRITE.); -#1761=IFCSIMPLEPROPERTYTEMPLATE('0paKEDOn9BTv6uobh6TeH_',$,'CyclicRange','Identifies the angular range of the kinematic behaviour',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#1762=IFCSIMPLEPROPERTYTEMPLATE('093EJsYevEjPUe17BCudvJ',$,'LinearPath','Represents the time:distance table of the kinematic behaviour.',.P_TABLEVALUE.,'IfcTimeMeasure','IfcLengthMeasure',$,$,$,$,.READWRITE.); -#1763=IFCSIMPLEPROPERTYTEMPLATE('334yWkFI134e_u1tTA1PgD',$,'LinearRange','Identifies the linear range of the kinematic behaviour.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1764=IFCSIMPLEPROPERTYTEMPLATE('1cdXQS4i92M9tvzr6Mya9W',$,'MaximumAngularVelocity','Identifies the maximum angular velocity of the kinematic behaviour.',.P_SINGLEVALUE.,'IfcAngularVelocityMeasure',$,$,$,$,$,.READWRITE.); -#1765=IFCSIMPLEPROPERTYTEMPLATE('2KP4cDCGXFoBoc_YT3E9ZI',$,'MaximumConstantSpeed','Identifies the maximum constant speed over the kinematic path.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#1766=IFCSIMPLEPROPERTYTEMPLATE('1gH94t2SP4SRHj0dqyhhOZ',$,'MinimumTime','Identifies the minimum time for the kinematic behaviour.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#1767=IFCPROPERTYSETTEMPLATE('09DuYfAlf1xgMCl11mBYaa',$,'Pset_ElementSize','Property set with properties about size of the element.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement,IfcEnergyConversionDevice,IfcFlowController,IfcFlowMovingDevice,IfcFlowStorageDevice,IfcFlowTerminal,IfcFlowTreatmentDevice,IfcDistributionChamberElementType,IfcEnergyConversionDeviceType,IfcFlowControllerType,IfcFlowMovingDeviceType,IfcFlowStorageDeviceType,IfcFlowTerminalType,IfcFlowTreatmentDeviceType',(#1768,#1769,#1770)); -#1768=IFCSIMPLEPROPERTYTEMPLATE('3SxFdUtwX1OuDtqnkLaqWe',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1769=IFCSIMPLEPROPERTYTEMPLATE('1BySTu8tH3VfdGUe3wqv8p',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1770=IFCSIMPLEPROPERTYTEMPLATE('2K0Fu2rFn1RvEr2nmU1Vyh',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1771=IFCPROPERTYSETTEMPLATE('086pcJEpn3NOsfb3mhu3JX',$,'Pset_EmbeddedTrack','Properties for track slab that have embedded tracks recessed into road surface.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab/TRACKSLAB,IfcSlabType/TRACKSLAB',(#1772,#1773,#1774)); -#1772=IFCSIMPLEPROPERTYTEMPLATE('1Y6B24GEbAG9v0Xnv$KkSu',$,'IsAccessibleByVehicle','Indicates whether the element is accessible by a vehicle or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1773=IFCSIMPLEPROPERTYTEMPLATE('1lr0vVnx96pO5g4bNEY2rs',$,'HasDrainage','Indicates whether the infrastructure element has drainage embedded or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1774=IFCSIMPLEPROPERTYTEMPLATE('0rl4ImHJX0Of1sD4pyCy3l',$,'PermissibleRoadLoad','Permissible traffic load for the road design.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1775=IFCPROPERTYSETTEMPLATE('3XJcXj34LB$BV7CKpeCR2i',$,'Pset_EnergyRequirements','Property set for the application of energy requirements to facility and physical elements',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionElement,IfcTransportationDevice,IfcDistributionElementType,IfcTransportationDeviceType',(#1776,#1777,#1778,#1779)); -#1776=IFCSIMPLEPROPERTYTEMPLATE('3KJfnTW3vECBUUBhHxjnjt',$,'EnergyConsumption','Annual energy consumption requirement',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); -#1777=IFCSIMPLEPROPERTYTEMPLATE('0EeefxVnzCaQP3thLJu4Fp',$,'PowerDemand','Power demand of the element',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1778=IFCSIMPLEPROPERTYTEMPLATE('0qRfZmLAX0tQJgVxMGRUCo',$,'EnergySourceLabel','Type of energy source e.g. Electricity, Diesel, LPG etc. utilised by the element.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1779=IFCSIMPLEPROPERTYTEMPLATE('1PMV04HqDBmPXsfLodZheE',$,'EnergyConversionEfficiency','Measure of the efficiency of conversion of fuel energy to mechanical energy',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#1780=IFCPROPERTYSETTEMPLATE('1kvsBq51PC38qkPQdtyxd6',$,'Pset_EngineTypeCommon','Engine type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcEngine,IfcEngineType',(#1781,#1782,#1784)); -#1781=IFCSIMPLEPROPERTYTEMPLATE('2nGBWCVtf2Me3sPxXcIwuf',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1782=IFCSIMPLEPROPERTYTEMPLATE('2TxlArg4j70O5Reg3uTmFe',$,'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',$,#1783,$,$,$,.READWRITE.); -#1783=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1784=IFCSIMPLEPROPERTYTEMPLATE('3NpB_l79P0eezIellp6gYZ',$,'EnergySource','Enumeration defining the energy source or fuel cumbusted.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1785,$,$,$,.READWRITE.); -#1785=IFCPROPERTYENUMERATION('PEnum_EngineEnergySource',(IFCLABEL('BIFUEL'),IFCLABEL('BIODIESEL'),IFCLABEL('DIESEL'),IFCLABEL('GASOLINE'),IFCLABEL('HYDROGEN'),IFCLABEL('NATURALGAS'),IFCLABEL('PROPANE'),IFCLABEL('SEWAGEGAS'),IFCLABEL('UNKNOWN'),IFCLABEL('OTHER'),IFCLABEL('UNSET')),$); -#1786=IFCPROPERTYSETTEMPLATE('2k1YxGaIL5$wFDwQDZxib_',$,'Pset_EnvironmentalCondition','Properties defining environment conditions required by the element.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#1787,#1788,#1789,#1790,#1791,#1792,#1793,#1794,#1795,#1796,#1797)); -#1787=IFCSIMPLEPROPERTYTEMPLATE('0cvfOQTkP8x9LFFmeobNBE',$,'ReferenceAirRelativeHumidity','Measurement of the ratio of water vapor in the air.',.P_BOUNDEDVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1788=IFCSIMPLEPROPERTYTEMPLATE('3nZMisef96C9$OK1kztWL5',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1789=IFCSIMPLEPROPERTYTEMPLATE('0zw8aHHbj3nRYeD2RY4423',$,'MaximumAtmosphericPressure','Maximum level of atmospheric pressure that the equipment can operate effectively in.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1790=IFCSIMPLEPROPERTYTEMPLATE('1R_F14zSX6VOdd_GD5WLZv',$,'StorageTemperatureRange','Allowed storage temperature range that the element complies with.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1791=IFCSIMPLEPROPERTYTEMPLATE('2RJ0wmVRD1wODgan3k4XIP',$,'MaximumWindSpeed','Maximum resistance to wind load exposure.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#1792=IFCSIMPLEPROPERTYTEMPLATE('2T8hv0nIr8NQCgIFV3vCP4',$,'OperationalTemperatureRange','The temperature range in which the device operates normally.\X2\000A000A\X0\Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1793=IFCSIMPLEPROPERTYTEMPLATE('1rWT4pLHH9Ph5Tn4ZY9sfe',$,'MaximumRainIntensity','Maximum level of rain intensity that the equipment can operate effectively in. It is usually measured in millimeter per hour (mm/h).',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1794=IFCSIMPLEPROPERTYTEMPLATE('1lFCW_Nof35Bh7D88ul664',$,'SaltMistLevel','Maximum level of salt mist that the equipment can operate effectively in. It is provided according to an international or national standard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1795=IFCSIMPLEPROPERTYTEMPLATE('1tiQ4n$hHFQQbBUXpnOfvX',$,'SeismicResistance','Maximum magnitude of earthquake that the equipment complies with. The value indicates earthquake intensity measured in Richter scale.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1796=IFCSIMPLEPROPERTYTEMPLATE('08rvcYKM9F6P1_VK1wcCGS',$,'SmokeLevel','Maximum level of smoke that the equipment complies with. It is provided according to an international or national standard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1797=IFCSIMPLEPROPERTYTEMPLATE('1cPNaHczvDhe3MNPMDrEbz',$,'MaximumSolarRadiation','Maximum level of solar irradiance that the equipment can operate effectively in. This is usually tested and measured by a national or international standard. The value indicates power density measured in watt per square meter (w/m2).',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1798=IFCPROPERTYSETTEMPLATE('1FsWvs4rf0gx2$8BfDvvrJ',$,'Pset_EnvironmentalEmissions','Property set for the application of energy emissions produced by facility and physical elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionElement,IfcTransportationDevice,IfcDistributionElementType,IfcTransportationDeviceType',(#1799,#1800,#1801,#1802,#1803)); -#1799=IFCSIMPLEPROPERTYTEMPLATE('3pswOOkrjAeem3put1u2jo',$,'CarbonDioxideEmissions','Rate of emission of carbon dioxide',.P_SINGLEVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1800=IFCSIMPLEPROPERTYTEMPLATE('2HNck7HJ11oeO4OKhMRGG8',$,'SulphurDioxideEmissions','Rate of emission of sulphur dioxide',.P_SINGLEVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1801=IFCSIMPLEPROPERTYTEMPLATE('0LiL12YCf4QOz0pcEtGUeE',$,'NitrogenOxidesEmissions','Rate of emission of nitrogen oxides',.P_SINGLEVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1802=IFCSIMPLEPROPERTYTEMPLATE('1Qu_iIQ392qQ9GUTV7$UtG',$,'ParticulateMatterEmissions','Rate of emission of particulate matter',.P_SINGLEVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1803=IFCSIMPLEPROPERTYTEMPLATE('33n0Za6Zf8984dksOREqgf',$,'NoiseEmissions','Level of sound emission',.P_SINGLEVALUE.,'IfcSoundPowerLevelMeasure',$,$,$,$,$,.READWRITE.); -#1804=IFCPROPERTYSETTEMPLATE('3meYrRtlf2Af_I4dERiK0n',$,'Pset_EnvironmentalImpactIndicators','Environmental impact indicators are related to a given \X2\201C\X0\functional unit\X2\201D\X0\ (ISO 14040 concept). An example of functional unit is a "Double glazing window with PVC frame" and the unit to consider is "one square meter of opening elements filled by this product\X2\201D\X0\.\X2\000A\X0\Indicators values are valid for the whole life cycle or only a specific phase (see LifeCyclePhase property). Values of all the indicators are expressed per year according to the expected service life. The first five properties capture the characteristics of the functional unit. The following properties are related to environmental indicators.\X2\000A\X0\There is a consensus agreement international for the five one. Last ones are not yet fully and formally agreed at the international level.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#1805,#1806,#1807,#1808,#1810,#1811,#1812,#1813,#1814,#1815,#1816,#1817,#1818,#1819,#1820,#1821,#1822,#1823,#1824)); -#1805=IFCSIMPLEPROPERTYTEMPLATE('3Fn$DgpFT6JRDuCDybDSEi',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1806=IFCSIMPLEPROPERTYTEMPLATE('14uzBTpXLAEQG9hNsGdrai',$,'FunctionalUnitReference','Reference to a database or a classification',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1807=IFCSIMPLEPROPERTYTEMPLATE('3S8_cqAjj7RfjnYVLVMTJE',$,'IndicatorsUnit','The unit of the quantity the environmental indicators values are related with.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#1808=IFCSIMPLEPROPERTYTEMPLATE('2pWLtuR6XFeB$5s6o$wRSF',$,'LifeCyclePhase','The whole life cycle or only a given phase from which environmental data are valid.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1809,$,$,$,.READWRITE.); -#1809=IFCPROPERTYENUMERATION('PEnum_LifeCyclePhase',(IFCLABEL('ACQUISITION'),IFCLABEL('CRADLETOSITE'),IFCLABEL('DECONSTRUCTION'),IFCLABEL('DISPOSAL'),IFCLABEL('DISPOSALTRANSPORT'),IFCLABEL('GROWTH'),IFCLABEL('INSTALLATION'),IFCLABEL('MAINTENANCE'),IFCLABEL('MANUFACTURE'),IFCLABEL('OCCUPANCY'),IFCLABEL('OPERATION'),IFCLABEL('PROCUREMENT'),IFCLABEL('PRODUCTION'),IFCLABEL('PRODUCTIONTRANSPORT'),IFCLABEL('RECOVERY'),IFCLABEL('REFURBISHMENT'),IFCLABEL('REPAIR'),IFCLABEL('REPLACEMENT'),IFCLABEL('TRANSPORT'),IFCLABEL('USAGE'),IFCLABEL('WASTE'),IFCLABEL('WHOLELIFECYCLE'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); -#1810=IFCSIMPLEPROPERTYTEMPLATE('3Fg55OTkT5JPnEW$POfjxk',$,'ExpectedServiceLife','Expected service life in years.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#1811=IFCSIMPLEPROPERTYTEMPLATE('01uk89R218kxQK6EumiT3I',$,'TotalPrimaryEnergyConsumptionPerUnit','Quantity of energy used as defined in ISO21930:2007.',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); -#1812=IFCSIMPLEPROPERTYTEMPLATE('02C7JSjU9AQvi1YHsJl7aF',$,'WaterConsumptionPerUnit','Quantity of water used.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#1813=IFCSIMPLEPROPERTYTEMPLATE('2ks2p4hErD8QMz35pm5epb',$,'HazardousWastePerUnit','Quantity of hazardous waste generated',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1814=IFCSIMPLEPROPERTYTEMPLATE('1tUw$GZOX4_eDJQlt5txwH',$,'NonHazardousWastePerUnit','Quantity of non hazardous waste generated',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1815=IFCSIMPLEPROPERTYTEMPLATE('1slXsO5mrFq8QzX$nonnpC',$,'ClimateChangePerUnit','Quantity of greenhouse gases emitted calculated in equivalent CO2',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1816=IFCSIMPLEPROPERTYTEMPLATE('00YOwqBSz1VhjUpgWPZmQv',$,'AtmosphericAcidificationPerUnit','Quantity of gases responsible for the atmospheric acidification calculated in equivalent SO2',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1817=IFCSIMPLEPROPERTYTEMPLATE('3xtwjz4kb5tgjbtOV2cVI3',$,'RenewableEnergyConsumptionPerUnit','Quantity of renewable energy used as defined in ISO21930:2007',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); -#1818=IFCSIMPLEPROPERTYTEMPLATE('06Lmnt31HAngU_QkIRiTH1',$,'NonRenewableEnergyConsumptionPerUnit','Quantity of non-renewable energy used as defined in ISO21930:2007',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); -#1819=IFCSIMPLEPROPERTYTEMPLATE('2Vog$boFT7NfCAkHnJz5S3',$,'ResourceDepletionPerUnit','Quantity of resources used calculated in equivalent antimony',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1820=IFCSIMPLEPROPERTYTEMPLATE('1YMmeXrXn86hLzVeKhejKp',$,'InertWastePerUnit','Quantity of inert waste generated',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1821=IFCSIMPLEPROPERTYTEMPLATE('1UZtyJB556BQHRTs7CLcf0',$,'RadioactiveWastePerUnit','Quantity of radioactive waste generated',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1822=IFCSIMPLEPROPERTYTEMPLATE('2DGRK1As19vQNUU8TGO9iS',$,'StratosphericOzoneLayerDestructionPerUnit','Quantity of gases destroying the stratospheric ozone layer calculated in equivalent CFC-R11',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1823=IFCSIMPLEPROPERTYTEMPLATE('1KdlcZhs9B9fQO1T0jcpwb',$,'PhotochemicalOzoneFormationPerUnit','Quantity of gases creating the photochemical ozone calculated in equivalent ethylene',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1824=IFCSIMPLEPROPERTYTEMPLATE('0ZR9411vHEvR$QUVc2cXvc',$,'EutrophicationPerUnit','Quantity of eutrophicating compounds calculated in equivalent PO4',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1825=IFCPROPERTYSETTEMPLATE('04NLZ0vjf1jwFjBzC1Aqf0',$,'Pset_EnvironmentalImpactValues','The following properties capture environmental impact values of an element. They correspond to the indicators defined into Pset_EnvironmentalImpactIndicators.\X2\000A\X0\Environmental impact values are obtained multiplying indicator value per unit by the relevant quantity of the element.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#1826,#1827,#1828,#1829,#1830,#1831,#1832,#1833,#1834,#1835,#1836,#1837,#1838,#1839,#1840,#1841,#1842)); -#1826=IFCSIMPLEPROPERTYTEMPLATE('11Mqy4kY19rfcvKgtwE4lF',$,'TotalPrimaryEnergyConsumption','Quantity of energy used as defined in ISO21930:2007.',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); -#1827=IFCSIMPLEPROPERTYTEMPLATE('1MQpNDJbbE$940XiAc19xj',$,'WaterConsumption','Quantity of water used.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#1828=IFCSIMPLEPROPERTYTEMPLATE('3flerDyRT8sPaevC12Cq$Y',$,'HazardousWaste','Quantity of hazardous waste generated.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1829=IFCSIMPLEPROPERTYTEMPLATE('2OXphV6R9Es8P0a6eZeL6O',$,'NonHazardousWaste','Quantity of non hazardous waste generated.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1830=IFCSIMPLEPROPERTYTEMPLATE('3FMFUUHKL4dfeYw0ghIQfs',$,'ClimateChange','Quantity of greenhouse gases emitted calculated in equivalent CO2.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1831=IFCSIMPLEPROPERTYTEMPLATE('3gtMNRztX8bOS0sdZMjU9R',$,'AtmosphericAcidification','Quantity of gases responsible for the atmospheric acidification calculated in equivalent SO2.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1832=IFCSIMPLEPROPERTYTEMPLATE('1EXl4YQyT78BgzUoIFeBp$',$,'RenewableEnergyConsumption','Quantity of renewable energy used as defined in ISO21930:2007',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); -#1833=IFCSIMPLEPROPERTYTEMPLATE('16kBxxSoz5eQXCVLXlImh7',$,'NonRenewableEnergyConsumption','Quantity of non-renewable energy used as defined in ISO21930:2007',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); -#1834=IFCSIMPLEPROPERTYTEMPLATE('2wOmh08b9C19C9PdA9pv12',$,'ResourceDepletion','Quantity of resources used calculated in equivalent antimony.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1835=IFCSIMPLEPROPERTYTEMPLATE('3PZvpFeK5B2gETlbaJqWpo',$,'InertWaste','Quantity of inert waste generated .',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1836=IFCSIMPLEPROPERTYTEMPLATE('27Yn_RnuvBHwLqLSlaAW3o',$,'RadioactiveWaste','Quantity of radioactive waste generated.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1837=IFCSIMPLEPROPERTYTEMPLATE('1YsBFWhMLEfwhaosplY37Z',$,'StratosphericOzoneLayerDestruction','Quantity of gases destroying the stratospheric ozone layer calculated in equivalent CFC-R11.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1838=IFCSIMPLEPROPERTYTEMPLATE('3kP3B00xD1SfLM0GKxuK4_',$,'PhotochemicalOzoneFormation','Quantity of gases creating the photochemical ozone calculated in equivalent ethylene.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1839=IFCSIMPLEPROPERTYTEMPLATE('2rsCnXq1DB$994tsjr9MJY',$,'Eutrophication','Quantity of eutrophicating compounds calculated in equivalent PO4.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1840=IFCSIMPLEPROPERTYTEMPLATE('24Ksrlfe18UOHCmQOeSrBf',$,'LeadInTime','Lead in time before start of process.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#1841=IFCSIMPLEPROPERTYTEMPLATE('3Zyjxg6GTEMB0EBAEE2HMg',$,'Duration','Duration.\X2\000A000A\X0\Duration of process.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#1842=IFCSIMPLEPROPERTYTEMPLATE('2mie1rHUn89e9Sw1s8P4eF',$,'LeadOutTime','Lead out time after end of process.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#1843=IFCPROPERTYSETTEMPLATE('3350SNquPC49JEYFfkcs6O',$,'Pset_EvaporativeCoolerPHistory','Evaporative cooler performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcEvaporativeCooler',(#1844,#1845,#1846,#1847,#1848)); -#1844=IFCSIMPLEPROPERTYTEMPLATE('0r3Ayws2X2SfnJz138UTn3',$,'WaterSumpTemperature','Water sump temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1845=IFCSIMPLEPROPERTYTEMPLATE('2W_TrZIbjDyxLVDznv_gnG',$,'Effectiveness','Effectiveness, represented as ratio.\X2\000A000A\X0\Ratio of the change in dry bulb temperature of the (primary) air stream to the difference between the entering dry bulb temperature of the (primary) air and the wet-bulb temperature of the (secondary) air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1846=IFCSIMPLEPROPERTYTEMPLATE('2P_tFNhrTEPQ68UME3l5Md',$,'SensibleHeatTransferRate','Sensible heat transfer rate.\X2\000A000A\X0\Sensible heat transfer rate to primary air flow.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1847=IFCSIMPLEPROPERTYTEMPLATE('0dHVsnHjT7pBYBjYH5Xh6u',$,'LatentHeatTransferRate','Latent heat transfer rate.\X2\000A000A\X0\To primary air flow.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1848=IFCSIMPLEPROPERTYTEMPLATE('1ghrWT$X12F8YrGLWFfSES',$,'TotalHeatTransferRate','Total heat transfer rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1849=IFCPROPERTYSETTEMPLATE('23oEauuV9FQBT7L67rMxQu',$,'Pset_EvaporativeCoolerTypeCommon','Evaporative cooler type common attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead. WaterRequirement attribute unit type modified in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcEvaporativeCooler,IfcEvaporativeCoolerType',(#1850,#1851,#1853,#1855,#1856,#1857,#1858,#1859,#1860)); -#1850=IFCSIMPLEPROPERTYTEMPLATE('1W98_TC4HF$93ntFw0JEVc',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1851=IFCSIMPLEPROPERTYTEMPLATE('2S6t63cbz1P83xEbrnLP72',$,'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',$,#1852,$,$,$,.READWRITE.); -#1852=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1853=IFCSIMPLEPROPERTYTEMPLATE('1BhoK8qkz0hwbLwQ58FQJp',$,'FlowArrangement','Defines the basic flow arrangements for the heat exchanger or cooler tower:COUNTERFLOW: Air and water flow enter in different directions.\X2\000A\X0\CROSSFLOW: Air and water flow are perpendicular.\X2\000A\X0\PARALLELFLOW: Air and water flow enter in same directions.\X2\000A\X0\MULTIPASS: Multipass flow heat exchanger arrangement. \X2\000A\X0\OTHER: Other type of heat exchanger flow arrangement not defined above.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1854,$,$,$,.READWRITE.); -#1854=IFCPROPERTYENUMERATION('PEnum_EvaporativeCoolerFlowArrangement',(IFCLABEL('COUNTERFLOW'),IFCLABEL('CROSSFLOW'),IFCLABEL('PARALLELFLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1855=IFCSIMPLEPROPERTYTEMPLATE('1Y0qpGuInF3v2bHHXVKb9Q',$,'HeatExchangeArea','Heat exchange area.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1856=IFCSIMPLEPROPERTYTEMPLATE('1LCAWBnBLBpQxJOJ4gj665',$,'OperationTemperatureRange','Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1857=IFCSIMPLEPROPERTYTEMPLATE('0ArB51O8b1ThR3ysLMdQCP',$,'WaterRequirement','Make-up water requirement.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1858=IFCSIMPLEPROPERTYTEMPLATE('2EqEAuVlz9PArS23MzXDvk',$,'EffectivenessTable','Total heat transfer effectiveness curve as a function of the primary air flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcReal',$,$,$,$,.READWRITE.); -#1859=IFCSIMPLEPROPERTYTEMPLATE('3B6Qs2eb973PiuHWRCadIG',$,'AirPressureDropCurve','Air pressure drop as a function of air flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#1860=IFCSIMPLEPROPERTYTEMPLATE('0SVY7ITe9Bd9$$whXuZdnM',$,'WaterPressDropCurve','Water pressure drop as function of water flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#1861=IFCPROPERTYSETTEMPLATE('1JP92ulZ199eB9$7QvEcqX',$,'Pset_EvaporatorPHistory','Evaporator performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcEvaporator',(#1862,#1863,#1864,#1865,#1866,#1867,#1868,#1869,#1870,#1871,#1872)); -#1862=IFCSIMPLEPROPERTYTEMPLATE('1MkyRru$z2mxcfmXfyEcYy',$,'HeatRejectionRate','Sum of the refrigeration effect and the heat equivalent of the power input to the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1863=IFCSIMPLEPROPERTYTEMPLATE('3lce58eMTBPeLSkhNDnYiA',$,'ExteriorHeatTransferCoefficient','Exterior heat transfer coefficient associated with exterior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1864=IFCSIMPLEPROPERTYTEMPLATE('1e_wH8j9XDyvI8XNpF9QF5',$,'InteriorHeatTransferCoefficient','Interior heat transfer coefficient associated with interior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1865=IFCSIMPLEPROPERTYTEMPLATE('0lJly8Kwf2MvrQMKKi3ZI5',$,'RefrigerantFoulingResistance','Fouling resistance on the refrigerant side.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1866=IFCSIMPLEPROPERTYTEMPLATE('2f2jWF3w96rg$pktDpMMj3',$,'EvaporatingTemperature','Refrigerant evaporating temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1867=IFCSIMPLEPROPERTYTEMPLATE('1gxcMvCqP4Jxx7uTv0_eUT',$,'LogarithmicMeanTemperatureDifference','Logarithmic mean temperature difference between refrigerant and water or air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1868=IFCSIMPLEPROPERTYTEMPLATE('1EJv2L4wH5Aunw_okYEjs4',$,'UAcurves','UV = f (VExterior, VInterior), UV as a function of interior and exterior fluid flow velocity at the entrance.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1869=IFCSIMPLEPROPERTYTEMPLATE('07JA555qnCDPGaEqZ8dLEH',$,'CompressorEvaporatorHeatGain','Heat gain between the evaporator outlet and the compressor inlet.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1870=IFCSIMPLEPROPERTYTEMPLATE('0VQKeYO3XErRQZsvYaUL9Q',$,'CompressorEvaporatorPressureDrop','Pressure drop between the evaporator outlet and the compressor inlet.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1871=IFCSIMPLEPROPERTYTEMPLATE('0g1sYOqvT3E9r9deIhqRpE',$,'EvaporatorMeanVoidFraction','Mean void fraction in evaporator.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1872=IFCSIMPLEPROPERTYTEMPLATE('26CbHFz$H47Q9q8v$ti2iE',$,'WaterFoulingResistance','Fouling resistance on water/air side.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1873=IFCPROPERTYSETTEMPLATE('0rA7HYeT58KxGQ6juDh7HI',$,'Pset_EvaporatorTypeCommon','Evaporator type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcEvaporator,IfcEvaporatorType',(#1874,#1875,#1877,#1879,#1881,#1883,#1884,#1885,#1886,#1887,#1888)); -#1874=IFCSIMPLEPROPERTYTEMPLATE('3ueKnC_ZLDJxKnp3WSE7qo',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1875=IFCSIMPLEPROPERTYTEMPLATE('1mwq2BjWH1LhhM2wXC7KZn',$,'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',$,#1876,$,$,$,.READWRITE.); -#1876=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1877=IFCSIMPLEPROPERTYTEMPLATE('0zzxSvWy524wwWseeqj9Dq',$,'EvaporatorMediumType','ColdLiquid: Evaporator is using liquid type of fluid to exchange heat with refrigerant.\X2\000A\X0\ColdAir: Evaporator is using air to exchange heat with refrigerant.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1878,$,$,$,.READWRITE.); -#1878=IFCPROPERTYENUMERATION('PEnum_EvaporatorMediumType',(IFCLABEL('COLDAIR'),IFCLABEL('COLDLIQUID'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1879=IFCSIMPLEPROPERTYTEMPLATE('2rMupPQ7z2ZP3wFJ4wTgcu',$,'EvaporatorCoolant','The fluid used for the coolant in the evaporator.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1880,$,$,$,.READWRITE.); -#1880=IFCPROPERTYENUMERATION('PEnum_EvaporatorCoolant',(IFCLABEL('BRINE'),IFCLABEL('GLYCOL'),IFCLABEL('WATER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1881=IFCSIMPLEPROPERTYTEMPLATE('0ZWJCmwYj2gQr9h1ZMHUtr',$,'RefrigerantClass','Refrigerant class used by the object.\X2\000A\X0\CFC: Chlorofluorocarbons.\X2\000A\X0\HCFC: Hydrochlorofluorocarbons.\X2\000A\X0\HFC: Hydrofluorocarbons.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1882,$,$,$,.READWRITE.); -#1882=IFCPROPERTYENUMERATION('PEnum_RefrigerantClass',(IFCLABEL('AMMONIA'),IFCLABEL('CFC'),IFCLABEL('CO2'),IFCLABEL('H2O'),IFCLABEL('HCFC'),IFCLABEL('HFC'),IFCLABEL('HYDROCARBONS'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1883=IFCSIMPLEPROPERTYTEMPLATE('0f_8hQMBj7D9HWtQvOa2Fu',$,'ExternalSurfaceArea','External surface area (both primary and secondary area).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1884=IFCSIMPLEPROPERTYTEMPLATE('0Gu5JGnf9A7Ai2njxLUVqr',$,'InternalSurfaceArea','Internal surface area.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1885=IFCSIMPLEPROPERTYTEMPLATE('1MNiMF0GP4jPioxY65c6of',$,'InternalRefrigerantVolume','Internal volume of object (refrigerant side).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#1886=IFCSIMPLEPROPERTYTEMPLATE('1hASADmQP4fhxPorimyCUt',$,'InternalWaterVolume','Internal volume of object (water side).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#1887=IFCSIMPLEPROPERTYTEMPLATE('3uc762Af9BSBtEYc2HxHWa',$,'NominalHeatTransferArea','Nominal heat transfer surface area associated with nominal overall heat transfer coefficient.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1888=IFCSIMPLEPROPERTYTEMPLATE('0YLIkqzCP3cxyKWMkAi1j2',$,'NominalHeatTransferCoefficient','Nominal overall heat transfer coefficient associated with nominal heat transfer area.',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#1889=IFCPROPERTYSETTEMPLATE('2Vva1A6NT1K8vVEFRM3ypT',$,'Pset_FanCentrifugal','Centrifugal fan occurrence attributes attached to an instance of IfcFan.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFan/CENTRIFUGALAIRFOIL,IfcFan/CENTRIFUGALBACKWARDINCLINEDCURVED,IfcFan/CENTRIFUGALFORWARDCURVED,IfcFan/CENTRIFUGALRADIAL,IfcFanType/CENTRIFUGALAIRFOIL,IfcFanType/CENTRIFUGALBACKWARDINCLINEDCURVED,IfcFanType/CENTRIFUGALFORWARDCURVED,IfcFanType/CENTRIFUGALRADIAL',(#1890,#1892,#1894)); -#1890=IFCSIMPLEPROPERTYTEMPLATE('1kSAfZNQH18R5ddOGWhz9Z',$,'DischargePosition','Centrifugal fan discharge position.TOPHORIZONTAL: Top horizontal discharge.\X2\000A\X0\TOPANGULARDOWN: Top angular down discharge.\X2\000A\X0\DOWNBLAST: Downblast discharge.\X2\000A\X0\BOTTOMANGULARDOWN: Bottom angular down discharge.\X2\000A\X0\BOTTOMHORIZONTAL: Bottom horizontal discharge.\X2\000A\X0\BOTTOMANGULARUP: Bottom angular up discharge.\X2\000A\X0\UPBLAST: Upblast discharge.\X2\000A\X0\TOPANGULARUP: Top angular up discharge.\X2\000A\X0\OTHER: Other type of fan arrangement.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1891,$,$,$,.READWRITE.); -#1891=IFCPROPERTYENUMERATION('PEnum_CentrifugalFanDischargePosition',(IFCLABEL('BOTTOMANGULARDOWN'),IFCLABEL('BOTTOMANGULARUP'),IFCLABEL('BOTTOMHORIZONTAL'),IFCLABEL('DOWNBLAST'),IFCLABEL('TOPANGULARDOWN'),IFCLABEL('TOPANGULARUP'),IFCLABEL('TOPHORIZONTAL'),IFCLABEL('UPBLAST'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1892=IFCSIMPLEPROPERTYTEMPLATE('2Nkfi13HXBT92trJvgSHmp',$,'DirectionOfRotation','The direction of the centrifugal fan wheel rotation when viewed from the drive side of the fan.CLOCKWISE: Clockwise.\X2\000A\X0\COUNTERCLOCKWISE: Counter-clockwise.\X2\000A\X0\OTHER: Other type of fan rotation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1893,$,$,$,.READWRITE.); -#1893=IFCPROPERTYENUMERATION('PEnum_CentrifugalFanRotation',(IFCLABEL('CLOCKWISE'),IFCLABEL('COUNTERCLOCKWISE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1894=IFCSIMPLEPROPERTYTEMPLATE('2vJrZPbM9BL87Dgwn85VIz',$,'FanArrangement','Defines the fan and motor drive arrangement as defined by AMCA.ARRANGEMENT1: Arrangement 1.\X2\000A\X0\ARRANGEMENT2: Arrangement 2.\X2\000A\X0\ARRANGEMENT3: Arrangement 3.\X2\000A\X0\ARRANGEMENT4: Arrangement 4.\X2\000A\X0\ARRANGEMENT7: Arrangement 7.\X2\000A\X0\ARRANGEMENT8: Arrangement 8.\X2\000A\X0\ARRANGEMENT9: Arrangement 9.\X2\000A\X0\ARRANGEMENT10: Arrangement 10.\X2\000A\X0\OTHER: Other type of fan drive arrangement.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1895,$,$,$,.READWRITE.); -#1895=IFCPROPERTYENUMERATION('PEnum_CentrifugalFanArrangement',(IFCLABEL('ARRANGEMENT1'),IFCLABEL('ARRANGEMENT10'),IFCLABEL('ARRANGEMENT2'),IFCLABEL('ARRANGEMENT3'),IFCLABEL('ARRANGEMENT4'),IFCLABEL('ARRANGEMENT7'),IFCLABEL('ARRANGEMENT8'),IFCLABEL('ARRANGEMENT9'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1896=IFCPROPERTYSETTEMPLATE('3bdH28BS184RZt58kQ0b3I',$,'Pset_FanOccurrence','Fan occurrence attributes attached to an instance of IfcFan.',.PSET_OCCURRENCEDRIVEN.,'IfcFan',(#1897,#1899,#1901,#1903,#1905,#1907,#1908)); -#1897=IFCSIMPLEPROPERTYTEMPLATE('0KUdEnjQb7ZO63n9s9iCRu',$,'DischargeType','Defines the type of connection at the fan discharge.Duct: Discharge into ductwork.\X2\000A\X0\Screen: Discharge into screen outlet.\X2\000A\X0\Louver: Discharge into a louver.\X2\000A\X0\Damper: Discharge into a damper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1898,$,$,$,.READWRITE.); -#1898=IFCPROPERTYENUMERATION('PEnum_FanDischargeType',(IFCLABEL('DAMPER'),IFCLABEL('DUCT'),IFCLABEL('LOUVER'),IFCLABEL('SCREEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1899=IFCSIMPLEPROPERTYTEMPLATE('1atzczalr3bezD1jlLxv_R',$,'ApplicationOfFan','The functional application of the fan.SupplyAir: Supply air fan.\X2\000A\X0\ReturnAir: Return air fan.\X2\000A\X0\ExhaustAir: Exhaust air fan.\X2\000A\X0\Other: Other type of application not defined above.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1900,$,$,$,.READWRITE.); -#1900=IFCPROPERTYENUMERATION('PEnum_FanApplicationType',(IFCLABEL('COOLINGTOWER'),IFCLABEL('EXHAUSTAIR'),IFCLABEL('RETURNAIR'),IFCLABEL('SUPPLYAIR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1901=IFCSIMPLEPROPERTYTEMPLATE('2eaqGCGYf9_AfcH2qtPoe8',$,'CoilPosition','Defines the relationship between a fan and a coil.DrawThrough: Fan located downstream of the coil.\X2\000A\X0\BlowThrough: Fan located upstream of the coil.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1902,$,$,$,.READWRITE.); -#1902=IFCPROPERTYENUMERATION('PEnum_FanCoilPosition',(IFCLABEL('BLOWTHROUGH'),IFCLABEL('DRAWTHROUGH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1903=IFCSIMPLEPROPERTYTEMPLATE('2hEbHhD0H1K9FPGaBc5pt0',$,'MotorPosition','Defines the location of the motor relative to the air stream.InAirStream: Fan motor is in the air stream.\X2\000A\X0\OutOfAirStream: Fan motor is out of the air stream.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1904,$,$,$,.READWRITE.); -#1904=IFCPROPERTYENUMERATION('PEnum_FanMotorPosition',(IFCLABEL('INAIRSTREAM'),IFCLABEL('OUTOFAIRSTREAM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1905=IFCSIMPLEPROPERTYTEMPLATE('3RutRnnSn5SfS09HVMz1Fi',$,'FanMountingType','Defines the method of mounting the fan in the building.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1906,$,$,$,.READWRITE.); -#1906=IFCPROPERTYENUMERATION('PEnum_FanMountingType',(IFCLABEL('CONCRETEPAD'),IFCLABEL('DUCTMOUNTED'),IFCLABEL('FIELDERECTEDCURB'),IFCLABEL('MANUFACTUREDCURB'),IFCLABEL('SUSPENDED'),IFCLABEL('WALLMOUNTED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1907=IFCSIMPLEPROPERTYTEMPLATE('3pHgqtVFzAQBud6AgHuWRG',$,'FractionOfMotorHeatToAirStream','Fraction of the motor heat released into the fluid flow.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#1908=IFCSIMPLEPROPERTYTEMPLATE('3SwaoJA9nF4f86VIe8KnXS',$,'ImpellerDiameter','Diameter of object - used to scale performance of geometrically similar objects.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1909=IFCPROPERTYSETTEMPLATE('04_6NxFDH4RQXb3fQ2R3pB',$,'Pset_FanPHistory','Fan performance history attributes.IFC2X2 CHANGE Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcFan',(#1910,#1911,#1912,#1913,#1914,#1915,#1916,#1917,#1918)); -#1910=IFCSIMPLEPROPERTYTEMPLATE('3jgQLTo19EuOIzs83jxbew',$,'FanRotationSpeed','Fan rotation speed.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1911=IFCSIMPLEPROPERTYTEMPLATE('2H0$zLRarEfQPh5UVlgMWz',$,'WheelTipSpeed','Fan blade tip speed, typically defined as the linear speed of the tip of the fan blade furthest from the shaft.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1912=IFCSIMPLEPROPERTYTEMPLATE('1hrDcdW6HA2OJapVjmBIhO',$,'FanEfficiency','Fan mechanical efficiency.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1913=IFCSIMPLEPROPERTYTEMPLATE('0O9JOSfbv2zvlzxgX6trnE',$,'OverallEfficiency','Total efficiency of object.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1914=IFCSIMPLEPROPERTYTEMPLATE('2w9ONCky98CQUD29vCc2SN',$,'FanPowerRate','Fan power consumption.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1915=IFCSIMPLEPROPERTYTEMPLATE('1Dk$5eADz3kwUBMJUeCwOL',$,'ShaftPowerRate','Fan shaft power.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1916=IFCSIMPLEPROPERTYTEMPLATE('2zEUK$xnbC3Q4ewuevwHqi',$,'DischargeVelocity','The speed at which air discharges from the fan through the fan housing discharge opening.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1917=IFCSIMPLEPROPERTYTEMPLATE('0OCwMaGgH8HBeH6Gex2sq8',$,'DischargePressureLoss','Fan discharge pressure loss associated with the discharge arrangement.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1918=IFCSIMPLEPROPERTYTEMPLATE('0AtghS2uT5j8c7CUU1jS$C',$,'DrivePowerLoss','Fan drive power losses associated with the type of connection between the motor and the fan wheel.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1919=IFCPROPERTYSETTEMPLATE('3e_unfBDz2awUzUcsP8G8Z',$,'Pset_FanTypeCommon','Fan type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFan,IfcFanType',(#1920,#1921,#1923,#1925,#1927,#1928,#1929,#1930,#1931,#1932,#1933,#1934,#1935)); -#1920=IFCSIMPLEPROPERTYTEMPLATE('2nkDgksfj7nePgn9ZckIca',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#1921=IFCSIMPLEPROPERTYTEMPLATE('38gDA8mhL2ZhEwZrjzBVQV',$,'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',$,#1922,$,$,$,.READWRITE.); -#1922=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1923=IFCSIMPLEPROPERTYTEMPLATE('0DTVfxtFHBJvBSZh4XaYdm',$,'MotorDriveType','Motor drive type:\X2\000A\X0\DIRECTDRIVE: Direct drive.\X2\000A\X0\BELTDRIVE: Belt drive.\X2\000A\X0\COUPLING: Coupling.\X2\000A\X0\OTHER: Other type of motor drive.\X2\000A\X0\UNKNOWN: Unknown motor drive type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1924,$,$,$,.READWRITE.); -#1924=IFCPROPERTYENUMERATION('PEnum_FanMotorConnectionType',(IFCLABEL('BELTDRIVE'),IFCLABEL('COUPLING'),IFCLABEL('DIRECTDRIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1925=IFCSIMPLEPROPERTYTEMPLATE('2EO_A3Fpb7kPMfgVyIgj2H',$,'CapacityControlType','InletVane: Control by adjusting inlet vane.\X2\000A\X0\VariableSpeedDrive: Control by variable speed drive.\X2\000A\X0\BladePitchAngle: Control by adjusting blade pitch angle.\X2\000A\X0\TwoSpeed: Control by switch between high and low speed.\X2\000A\X0\DischargeDamper: Control by modulating discharge damper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1926,$,$,$,.READWRITE.); -#1926=IFCPROPERTYENUMERATION('PEnum_FanCapacityControlType',(IFCLABEL('BLADEPITCHANGLE'),IFCLABEL('DISCHARGEDAMPER'),IFCLABEL('INLETVANE'),IFCLABEL('TWOSPEED'),IFCLABEL('VARIABLESPEEDDRIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1927=IFCSIMPLEPROPERTYTEMPLATE('2kvKQ7FXvFTeuoIPxL8YH1',$,'OperationTemperatureRange','Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1928=IFCSIMPLEPROPERTYTEMPLATE('19aC07GFHA2xUNOwNG2ODC',$,'NominalAirFlowRate','Nominal air flow rate.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#1929=IFCSIMPLEPROPERTYTEMPLATE('2Ckxzhm650bgxolr4_JeCS',$,'NominalTotalPressure','Nominal total pressure rise across the fan.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1930=IFCSIMPLEPROPERTYTEMPLATE('1q1cXk1X1D8BomMb9UEZRQ',$,'NominalStaticPressure','The static pressure within the air stream that the fan must overcome to insure designed circulation of air.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#1931=IFCSIMPLEPROPERTYTEMPLATE('1jSO3ny_T29AgISU22Rtdz',$,'NominalRotationSpeed','Rotational speed of the object under nominal conditions.\X2\000A000A\X0\Nominal fan wheel speed.',.P_SINGLEVALUE.,'IfcRotationalFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#1932=IFCSIMPLEPROPERTYTEMPLATE('0U5O31wvzEWRpQetTPDVJV',$,'NominalPowerRate','Nominal fan power rate.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#1933=IFCSIMPLEPROPERTYTEMPLATE('3cloBUcunEu91$ks3nqs$j',$,'OperationalCriteria','Time of operation at maximum operational ambient air temperature.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#1934=IFCSIMPLEPROPERTYTEMPLATE('0U6zzwtb56phjUjkR2QbJ3',$,'PressureCurve','Pressure rise = f (flow rate).',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#1935=IFCSIMPLEPROPERTYTEMPLATE('2v4Nd6l4j13AezmUPf1NlL',$,'EfficiencyCurve','Fan efficiency =f (flow rate).',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); -#1936=IFCPROPERTYSETTEMPLATE('0zpccvgjn3oxVEbvYCK$hC',$,'Pset_FastenerRailWeld','Properties of Welded rail joint used in railway. The property set can be used by the predefined type WELD of IfcFastener.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFastener/WELD,IfcFastenerType/WELD',(#1937,#1938,#1939,#1941)); -#1937=IFCSIMPLEPROPERTYTEMPLATE('3Upe5ks3n6G9Ldplhz$7N$',$,'IsLiftingBracket','Indicates whether the connection is done between rail with different height (TRUE) or with same height (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1938=IFCSIMPLEPROPERTYTEMPLATE('22CBRDhhrAHQv2KSvlllEw',$,'TemperatureDuringInstallation','Normalised working temperature.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#1939=IFCSIMPLEPROPERTYTEMPLATE('0Ooe241DP3pPormuLDt2cU',$,'JointRelativePosition','Indicates the relative position of the joint, which lies in the left or right rail or in the middle, or in combination. The left rail is to the left as facing in the direction of increasing stationing values, and the right rail is to the right.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1940,$,$,$,.READWRITE.); -#1940=IFCPROPERTYENUMERATION('PEnum_RelativePosition',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1941=IFCSIMPLEPROPERTYTEMPLATE('3CStajacf7UBP3d$uq3fYr',$,'AssemblyPlace','Enumeration defining where the assembly is intended to take place, either in a factory, other offsite location or on the building site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1942,$,$,$,.READWRITE.); -#1942=IFCPROPERTYENUMERATION('PEnum_AssemblyPlace',(IFCLABEL('FACTORY'),IFCLABEL('OFFSITE'),IFCLABEL('SITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1943=IFCPROPERTYSETTEMPLATE('35ipstEPj2Rxo4aAUoeGpv',$,'Pset_FastenerWeld','Properties related to welded connections.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFastener/WELD,IfcFastenerType/WELD',(#1944,#1945,#1946,#1947,#1948,#1949,#1950,#1951,#1952,#1953,#1954,#1955,#1956,#1957,#1958,#1959)); -#1944=IFCSIMPLEPROPERTYTEMPLATE('06Lzfe$UjDfeniPbY$4J11',$,'Type1','Type of weld seam according to ISO 2553. Note, combined welds are given by two corresponding symbols in the direction of the normal axis of the coordinate system. For example, an X weld is specified by Type1 = ''V'' and Type2 = ''V''.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1945=IFCSIMPLEPROPERTYTEMPLATE('0frMBEAmvF_fHQKC$BwzQn',$,'Type2','See Type1.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1946=IFCSIMPLEPROPERTYTEMPLATE('1Q_1P7dVzDk9$FeZ8kGFJP',$,'Surface1','Aspect of weld seam surface, i.e. ''plane'', ''curved'' or ''hollow''. Combined welds are given by two corresponding symbols analogous to Type1 and Type2.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1947=IFCSIMPLEPROPERTYTEMPLATE('14hwLeMxbDzg$oNMErehVx',$,'Surface2','See Surface1.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1948=IFCSIMPLEPROPERTYTEMPLATE('1EpzPXcSzFngmAJZX8koMc',$,'Process','Reference number of the welding process according to ISO 4063, an up to three digits long code',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#1949=IFCSIMPLEPROPERTYTEMPLATE('2PD_PPgBr6i8tvuwV4gdQd',$,'ProcessName','Name of the welding process. Alternative to the numeric Process property.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#1950=IFCSIMPLEPROPERTYTEMPLATE('2zHYeHXKD62v3_Rgp8tnoI',$,'NominalThroatThickness','Design value of the height of the largest isosceles triangle that can be inscribed in the section of a fillet weld.REFERENCE Symbol a according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1951=IFCSIMPLEPROPERTYTEMPLATE('2yjqyluKzBQwmKf5gb2MzM',$,'WeldWidth','Required elongated hole width at the faying surface or seam weld width at the faying surface.REFERENCE Symbol c according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1952=IFCSIMPLEPROPERTYTEMPLATE('3VQ8GwC0nAou8Q75B8odiP',$,'WeldDiameter','Dimension of the required hole diameter at the faying surface, or required spot weld diameter at the faying surface, or required stud diameter.REFERENCE Symbol d according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1953=IFCSIMPLEPROPERTYTEMPLATE('0kvbuUplz7C88MDP58osXO',$,'WeldElementSpacing','Spacing between weld elements (centre to centre)REFERENCE Symbol e according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1954=IFCSIMPLEPROPERTYTEMPLATE('0F3xSd3LXBdg$u3pUANFf4',$,'WeldElementLength','Length of each weld element.REFERENCE Symbol l according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1955=IFCSIMPLEPROPERTYTEMPLATE('32CqU3b7DF4gBorXDBsNUT',$,'NumberOfWeldElements','Number of weld elements.REFERENCE Symbol n according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#1956=IFCSIMPLEPROPERTYTEMPLATE('0NqQHKTG9AY9mkmGRhrvCm',$,'DeepPenetrationThroatThickness','Nominal throat thickness or effective throat thickness to which a certain amount of fusion penetration is added.REFERENCE Symbol s according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1957=IFCSIMPLEPROPERTYTEMPLATE('3QTP_KeYPCuhIq$dawL1a0',$,'WeldLegLength','Distance from the actual or projected intersection of the fusion faces and the toe of a fillet weld, measured across the fusion face.REFERENCE Symbol z according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1958=IFCSIMPLEPROPERTYTEMPLATE('0PhWl$Gvn60eRrlbTMKnwK',$,'Intermittent','If fillet weld, intermittent or not',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1959=IFCSIMPLEPROPERTYTEMPLATE('2yt0YxsrDBiAy4ekFnrnHx',$,'Staggered','If intermittent weld, staggered or not',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#1960=IFCPROPERTYSETTEMPLATE('0FLRH__T9Ew8smVD$svort',$,'Pset_FenderCommon','Properties common to the definition of all occurrences of IfcImpactProtectionDevice and types of IfcImpactProtectionDeviceType with the predefined type set to FENDER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcImpactProtectionDevice/FENDER,IfcImpactProtectionDeviceType/FENDER',(#1961,#1963,#1964,#1965,#1966,#1967,#1968,#1969,#1970,#1971)); -#1961=IFCSIMPLEPROPERTYTEMPLATE('2tp81hX_f7t8MCkN0Wq1uS',$,'FenderType','The type of fender',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1962,$,$,$,.READWRITE.); -#1962=IFCPROPERTYENUMERATION('PEnum_FenderType',(IFCLABEL('ARCH'),IFCLABEL('CELL'),IFCLABEL('CONE'),IFCLABEL('CYLINDER'),IFCLABEL('PNEUMATIC')),$); -#1963=IFCSIMPLEPROPERTYTEMPLATE('3JfLc0VL91guzHI0NbsI$z',$,'CoefficientOfFriction','Coefficient of friction value for the fender',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1964=IFCSIMPLEPROPERTYTEMPLATE('0bP6wI9zH40O6vDoEA64uS',$,'EnergyAbsorptionTolerance','Manufacturing tolerance on energy absorption',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1965=IFCSIMPLEPROPERTYTEMPLATE('0cvEWM2or4Zx38OVW02b$E',$,'MaxReactionTolerance','Manufacturing tolerance on maximum reaction at fender support.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1966=IFCSIMPLEPROPERTYTEMPLATE('05enMRokH2vwqaEa6uqWX1',$,'MaximumTemperatureFactor','Deviation in performance due to maximum design temperature',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1967=IFCSIMPLEPROPERTYTEMPLATE('0EshjjgefF9OybiBvfWNz0',$,'MinimumTemperatureFactor','Deviation in performance due to minimum design temperature',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1968=IFCSIMPLEPROPERTYTEMPLATE('28oa6$Uhf8ERY4wlxkqIET',$,'VelocityFactorEnergy','Deviation in energy absorption performance due to strain rate',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1969=IFCSIMPLEPROPERTYTEMPLATE('0SEEwBkhL9LQ2qwchlEbpz',$,'VelocityFactorReaction','Deviation in reaction due to strain rate',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1970=IFCSIMPLEPROPERTYTEMPLATE('14iHnGy1n6JBX7M8z6ob6j',$,'EnergyAbsorption','Energy absorption capacity of the element.',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); -#1971=IFCSIMPLEPROPERTYTEMPLATE('1CYePoxM59SQ5SM5HrQTwI',$,'MaxReaction','Maximum reaction from the element',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#1972=IFCPROPERTYSETTEMPLATE('2W0opSCD53cAPw_9fCz8uO',$,'Pset_FenderDesignCriteria','Properties common to the definition of design criteria of all occurrences of IfcImpactProtectionDevice and types of IfcImpactProtectionDeviceType with the predefined type set to FENDER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpace/BERTH,IfcSpaceType/BERTH',(#1973,#1974,#1975,#1976,#1977,#1978,#1979,#1980,#1981,#1982,#1983)); -#1973=IFCSIMPLEPROPERTYTEMPLATE('1Ew8fXKUXAwv2dL1_r2COV',$,'CoefficientOfFriction','Coefficient of friction value for the fender',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1974=IFCSIMPLEPROPERTYTEMPLATE('23P368VqDFkgEt0i3T7Fb5',$,'EnergyAbsorptionTolerance','Manufacturing tolerance on energy absorption',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1975=IFCSIMPLEPROPERTYTEMPLATE('1EBNqxtaH378d2NMeH75W5',$,'MaxReactionTolerance','Manufacturing tolerance on maximum reaction at fender support.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1976=IFCSIMPLEPROPERTYTEMPLATE('0$oX0nFU52J8qnJW0Hqqh8',$,'MaximumTemperatureFactor','Deviation in performance due to maximum design temperature',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1977=IFCSIMPLEPROPERTYTEMPLATE('08aoOZIk17qv140yS_rYXV',$,'MinimumTemperatureFactor','Deviation in performance due to minimum design temperature',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1978=IFCSIMPLEPROPERTYTEMPLATE('0bzvPjfXP36xjLb7T2tQ$T',$,'VelocityFactorEnergy','Deviation in energy absorption performance due to strain rate',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1979=IFCSIMPLEPROPERTYTEMPLATE('2JhfA5OWn479AQ2MPNPttt',$,'VelocityFactorReaction','Deviation in reaction due to strain rate',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#1980=IFCSIMPLEPROPERTYTEMPLATE('3w9UZGtZT4mPSdNHbz4xWx',$,'EnergyAbsorption','Energy absorption capacity of the element.',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); -#1981=IFCSIMPLEPROPERTYTEMPLATE('2K9vL62w1FqO$_pwUj99aR',$,'MaxReaction','Maximum reaction from the element',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#1982=IFCSIMPLEPROPERTYTEMPLATE('1AN_YAZUL6_udIRZrSaEY2',$,'MinCompressedFenderHeight','Minimum height required for a compressed fender to prevent vessels striking the structure',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#1983=IFCSIMPLEPROPERTYTEMPLATE('1ve95UBeLD_fDzpX2_maxS',$,'AddedMassCoefficientMethod','Method used to determine the Added Mass Coefficient used for design',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1984,$,$,$,.READWRITE.); -#1984=IFCPROPERTYENUMERATION('PEnum_AddedMassCoefficientMethod',(IFCLABEL('PIANC'),IFCLABEL('SHIGERU_UEDA'),IFCLABEL('VASCO_COSTA')),$); -#1985=IFCPROPERTYSETTEMPLATE('3ENf_xq719AguXa9Ojkot2',$,'Pset_FilterPHistory','Filter performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcFilter',(#1986,#1987,#1988)); -#1986=IFCSIMPLEPROPERTYTEMPLATE('2viyIk$Z1DmhohhexjT9bl',$,'CountedEfficiency','Filter efficiency based the particle counts concentration before and after filter against particles with certain size distribution.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1987=IFCSIMPLEPROPERTYTEMPLATE('1S1trnqc9DAg5ujfc_EL$f',$,'WeightedEfficiency','Filter efficiency based the particle weight concentration before and after filter against particles with certain size distribution.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1988=IFCSIMPLEPROPERTYTEMPLATE('2mMhLmpw906hrFxfoA0025',$,'ParticleMassHolding','Mass of particle holding in the filter.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#1989=IFCPROPERTYSETTEMPLATE('3YDdFr8RTDY8IwB7$bfm4C',$,'Pset_FilterTypeAirParticleFilter','Air particle filter type attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFilter/AIRPARTICLEFILTER,IfcFilterType/AIRPARTICLEFILTER',(#1990,#1992,#1993,#1995,#1996,#1997,#1998,#1999,#2000,#2001,#2002)); -#1990=IFCSIMPLEPROPERTYTEMPLATE('34BOfHao1BYhqaR7VTRGD9',$,'AirParticleFilterType','A panel dry type extended surface filter is a dry-type air filter with random fiber mats or blankets in the forms of pockets, V-shaped or radial pleats, and include the following:CoarseFilter: Filter with a efficiency lower than 30% for atmosphere dust-spot.\X2\000A\X0\CoarseMetalScreen: Filter made of metal screen.\X2\000A\X0\CoarseCellFoams: Filter made of cell foams.\X2\000A\X0\CoarseSpunGlass: Filter made of spun glass.\X2\000A\X0\MediumFilter: Filter with an efficiency between 30-98% for atmosphere dust-spot.\X2\000A\X0\MediumElectretFilter: Filter with fine electret synthetic fibers.\X2\000A\X0\MediumNaturalFiberFilter: Filter with natural fibers.\X2\000A\X0\HEPAFilter: High efficiency particulate air filter.\X2\000A\X0\ULPAFilter: Ultra low penetration air filter.\X2\000A\X0\MembraneFilters: Filter made of membrane for certain pore diameters in flat sheet and pleated form.\X2\000A\X0\A renewable media with a moving curtain viscous filter are random-fiber media coated with viscous substance in roll form or curtain where fresh media is fed across the face of the filter and the dirty media is rewound onto a roll at the bottom or to into a reservoir:\X2\000A\X0\RollForm: Viscous filter used in roll form.\X2\000A\X0\AdhesiveReservoir: Viscous filter used in moving curtain form.\X2\000A\X0\A renewable moving curtain dry media filter is a random-fiber dry media of relatively high porosity used in moving-curtain(roll) filters.\X2\000A\X0\An electrical filter uses electrostatic precipitation to remove and collect particulate contaminants.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1991,$,$,$,.READWRITE.); -#1991=IFCPROPERTYENUMERATION('PEnum_FilterAirParticleFilterType',(IFCLABEL('ADHESIVERESERVOIR'),IFCLABEL('COARSECELLFOAMS'),IFCLABEL('COARSEMETALSCREEN'),IFCLABEL('COARSESPUNGLASS'),IFCLABEL('ELECTRICALFILTER'),IFCLABEL('HEPAFILTER'),IFCLABEL('MEDIUMELECTRETFILTER'),IFCLABEL('MEDIUMNATURALFIBERFILTER'),IFCLABEL('MEMBRANEFILTERS'),IFCLABEL('RENEWABLEMOVINGCURTIANDRYMEDIAFILTER'),IFCLABEL('ROLLFORM'),IFCLABEL('ULPAFILTER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1992=IFCSIMPLEPROPERTYTEMPLATE('3QpM9mfDjCeQnib2jy74hV',$,'FrameMaterial','Filter frame material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#1993=IFCSIMPLEPROPERTYTEMPLATE('3ViNfD3Oj4tuNq24b2XsNZ',$,'SeparationType','Air particulate filter media separation type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1994,$,$,$,.READWRITE.); -#1994=IFCPROPERTYENUMERATION('PEnum_FilterAirParticleFilterSeparationType',(IFCLABEL('BAG'),IFCLABEL('PLEAT'),IFCLABEL('TREADSEPARATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#1995=IFCSIMPLEPROPERTYTEMPLATE('0zA4kcQFz0ZwgL0lbDe6t0',$,'DustHoldingCapacity','Maximum filter dust holding capacity.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#1996=IFCSIMPLEPROPERTYTEMPLATE('2m9sGgZKr9AhSckT$8UuBw',$,'FaceSurfaceArea','Face area of filter frame.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1997=IFCSIMPLEPROPERTYTEMPLATE('3gb0Svrdb1ABF4vlw0sGT8',$,'MediaExtendedArea','Total extended media area.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#1998=IFCSIMPLEPROPERTYTEMPLATE('3CInfr2X16WAgt96TCZAkN',$,'NominalCountedEfficiency','Nominal filter efficiency based the particle count concentration before and after the filter against particles with a certain size distribution.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#1999=IFCSIMPLEPROPERTYTEMPLATE('1OSKIadAj8kRir3vfZhkPG',$,'NominalWeightedEfficiency','Nominal filter efficiency based the particle weight concentration before and after the filter against particles with a certain size distribution.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2000=IFCSIMPLEPROPERTYTEMPLATE('33B1vOAM92ExJ2vc$ghZEq',$,'PressureDropCurve','Under certain dust holding weight, DelPressure = f (fluidflowRate)',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2001=IFCSIMPLEPROPERTYTEMPLATE('34gvm3YJD8SwMw1s0uPz$t',$,'CountedEfficiencyCurve','Counted efficiency curve as a function of dust holding weight, efficiency = f (dust holding weight).',.P_TABLEVALUE.,'IfcMassMeasure','IfcReal',$,$,$,$,.READWRITE.); -#2002=IFCSIMPLEPROPERTYTEMPLATE('1U_QVOSDz9bQBxevqrKro4',$,'WeightedEfficiencyCurve','Weighted efficiency curve as a function of dust holding weight, efficiency = f (dust holding weight).',.P_TABLEVALUE.,'IfcMassMeasure','IfcReal',$,$,$,$,.READWRITE.); -#2003=IFCPROPERTYSETTEMPLATE('3REXpGfRPCvQZLMk6mWbvf',$,'Pset_FilterTypeCommon','Filter type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFilter,IfcFilterType',(#2004,#2005,#2007,#2008,#2009,#2010,#2011,#2012,#2013,#2014,#2015,#2016,#2017)); -#2004=IFCSIMPLEPROPERTYTEMPLATE('3atAy7saPB5fNEYsZ6GlPi',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2005=IFCSIMPLEPROPERTYTEMPLATE('1JZSlCaL11eR3WAX5gLPHQ',$,'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',$,#2006,$,$,$,.READWRITE.); -#2006=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2007=IFCSIMPLEPROPERTYTEMPLATE('3H5gU0toPBtPc4Xve9l8dm',$,'Weight','Total weight of object',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#2008=IFCSIMPLEPROPERTYTEMPLATE('1X7JFFFd92eAixFfj3iTOs',$,'InitialResistance','Initial new filter fluid resistance (i.e., pressure drop at the maximum air flowrate across the filter when the filter is new per ASHRAE Standard 52.1).',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2009=IFCSIMPLEPROPERTYTEMPLATE('28dnukXdPF0u$p1pJR6VLj',$,'FinalResistance','Filter fluid resistance when replacement is required (i.e., Pressure drop at the maximum air flowrate across the filter when the filter needs replacement per ASHRAE Standard 52.1).',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2010=IFCSIMPLEPROPERTYTEMPLATE('3YwUT$$lXBJO5Gi7Xta0Lz',$,'OperationTemperatureRange','Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2011=IFCSIMPLEPROPERTYTEMPLATE('0rqrPoAsXB_heDfnXrgDow',$,'FlowRateRange','Allowable range of volume of fluid being pumped against the resistance specified.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2012=IFCSIMPLEPROPERTYTEMPLATE('37IFfLq79Fq8GmlN$MHLnZ',$,'NominalFilterFaceVelocity','Filter face velocity.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#2013=IFCSIMPLEPROPERTYTEMPLATE('1AnEMjhljAyASC2Z6WSxhu',$,'NominalMediaSurfaceVelocity','Average fluid velocity at the media surface.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#2014=IFCSIMPLEPROPERTYTEMPLATE('0L6e7I6_T3xhoX9ErIbBDP',$,'NominalPressureDrop','Total pressure drop across the filter.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2015=IFCSIMPLEPROPERTYTEMPLATE('219GTjU0DCbPrEKF7nKA$Q',$,'NominalFlowrate','Nominal fluid flow rate through the filter.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2016=IFCSIMPLEPROPERTYTEMPLATE('2BiyQmGen8Y90OSzjtCiNT',$,'NominalParticleGeometricMeanDiameter','Particle geometric mean diameter associated with nominal efficiency.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2017=IFCSIMPLEPROPERTYTEMPLATE('2rOTZ2oAD46OdheGPuPD5s',$,'NominalParticleGeometricStandardDeviation','Particle geometric standard deviation associated with nominal efficiency.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2018=IFCPROPERTYSETTEMPLATE('0TOtEEf5X2MwcVBzAS2ZV8',$,'Pset_FilterTypeCompressedAirFilter','Compressed air filter type attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFilter/COMPRESSEDAIRFILTER,IfcFilterType/COMPRESSEDAIRFILTER',(#2019,#2021,#2022,#2023,#2024)); -#2019=IFCSIMPLEPROPERTYTEMPLATE('0tv$2drgD6fOc17f1RvAFw',$,'CompressedAirFilterType','ACTIVATEDCARBON: absorbs oil vapor and odor; PARTICLE_FILTER: used to absorb solid particles of medium size; COALESCENSE_FILTER: used to absorb fine solid, oil, and water particles, also called micro filter',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2020,$,$,$,.READWRITE.); -#2020=IFCPROPERTYENUMERATION('PEnum_CompressedAirFilterType',(IFCLABEL('ACTIVATEDCARBON'),IFCLABEL('COALESCENSE_FILTER'),IFCLABEL('PARTICLE_FILTER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2021=IFCSIMPLEPROPERTYTEMPLATE('1AezDKdTb7pvVAv31kLzBk',$,'OperationPressureMax','Maximum pressure under normal operating conditions.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2022=IFCSIMPLEPROPERTYTEMPLATE('2AXXkaMLHC_g5efys32mU_',$,'ParticleAbsorptionCurve','Ratio of particles that are removed by the filter. Each entry describes the ratio of particles absorbed greater than equal to the specified size and less than the next specified size. For example, given for 3 significant particle sizes >= 0,1 micro m, >= 1 micro m, >= 5 micro m',.P_TABLEVALUE.,'IfcPositiveLengthMeasure','IfcPositiveRatioMeasure',$,$,$,$,.READWRITE.); -#2023=IFCSIMPLEPROPERTYTEMPLATE('2wiqVJBcjAXOR0tqrpdkGs',$,'AutomaticCondensateDischarge','Whether or not the condensing water or oil is discharged automatically from the filter.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2024=IFCSIMPLEPROPERTYTEMPLATE('1DKDbnzVLF3gpAB7JtPObk',$,'CloggingIndicator','Whether the filter has an indicator to display the degree of clogging of the filter.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2025=IFCPROPERTYSETTEMPLATE('3_0OhATiLC3xtiInzL8dXy',$,'Pset_FilterTypeWaterFilter','Water filter type attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFilter/WATERFILTER,IfcFilterType/WATERFILTER',(#2026)); -#2026=IFCSIMPLEPROPERTYTEMPLATE('2_07GLcjH0PgUGXfft6e6e',$,'WaterFilterType','Further qualifies the type of water filter. Filtration removes undissolved matter; Purification removes dissolved matter; Softening replaces dissolved matter.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2027,$,$,$,.READWRITE.); -#2027=IFCPROPERTYENUMERATION('PEnum_FilterWaterFilterType',(IFCLABEL('FILTRATION_DIATOMACEOUSEARTH'),IFCLABEL('FILTRATION_SAND'),IFCLABEL('PURIFICATION_DEIONIZING'),IFCLABEL('PURIFICATION_REVERSEOSMOSIS'),IFCLABEL('SOFTENING_ZEOLITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2028=IFCPROPERTYSETTEMPLATE('0ikKwtyTz4MwcHU6FPl08R',$,'Pset_FireSuppressionTerminalTypeBreechingInlet','Symmetrical pipe fitting that unites two or more inlets into a single pipe (BS6100 330 114 adapted).',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal/BREECHINGINLET,IfcFireSuppressionTerminalType/BREECHINGINLET',(#2029,#2031,#2032,#2033,#2035)); -#2029=IFCSIMPLEPROPERTYTEMPLATE('2153JShYX7A8SMhyfKoDmx',$,'BreechingInletType','Defines the type of breeching inlet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2030,$,$,$,.READWRITE.); -#2030=IFCPROPERTYENUMERATION('PEnum_BreechingInletType',(IFCLABEL('FOURWAY'),IFCLABEL('TWOWAY'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); -#2031=IFCSIMPLEPROPERTYTEMPLATE('24ZGwfGS51_BSD7aIwRFEL',$,'InletDiameter','The inlet diameter of the breeching inlet.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2032=IFCSIMPLEPROPERTYTEMPLATE('3ozChBnH92KvkTACCWv9Zs',$,'OutletDiameter','The outlet diameter of the breeching inlet.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2033=IFCSIMPLEPROPERTYTEMPLATE('3kjEeglvLAZBEPIr2nju5h',$,'CouplingType','Defines the type coupling on the inlet of the breeching inlet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2034,$,$,$,.READWRITE.); -#2034=IFCPROPERTYENUMERATION('PEnum_BreechingInletCouplingType',(IFCLABEL('INSTANTANEOUS_FEMALE'),IFCLABEL('INSTANTANEOUS_MALE'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); -#2035=IFCSIMPLEPROPERTYTEMPLATE('2MBGkFyWfEce3P360tGaPb',$,'HasCaps','Does the inlet connection have protective caps.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2036=IFCPROPERTYSETTEMPLATE('0rNU3BRvP0Uukxd4$70yib',$,'Pset_FireSuppressionTerminalTypeCommon','Common properties for fire suppression terminals.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal,IfcFireSuppressionTerminalType',(#2037,#2038)); -#2037=IFCSIMPLEPROPERTYTEMPLATE('27ApJzbJr3Iu62faLeTikc',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2038=IFCSIMPLEPROPERTYTEMPLATE('1oP_CTEfjCT8M9cCEF9b$v',$,'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',$,#2039,$,$,$,.READWRITE.); -#2039=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2040=IFCPROPERTYSETTEMPLATE('3r_TjIIMb7Q8fI0GOjvinl',$,'Pset_FireSuppressionTerminalTypeFireHydrant','Device, fitted to a pipe, through which a temporary supply of water may be provided (BS6100 330 6107)For further details on fire hydrants, see www.firehydrant.org',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal/FIREHYDRANT,IfcFireSuppressionTerminalType/FIREHYDRANT',(#2041,#2043,#2044,#2045,#2046,#2047,#2048,#2049,#2050,#2051)); -#2041=IFCSIMPLEPROPERTYTEMPLATE('3hMkgfRkb9Jg48I$TdhfCJ',$,'FireHydrantType','Defines the range of hydrant types from which the required type can be selected where.DryBarrel: A hydrant that has isolating valves fitted below ground and that may be used where the possibility of water freezing is a consideration.\X2\000A\X0\WetBarrel: A hydrant that has isolating valves fitted above ground and that may be used where there is no possibility of water freezing.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2042,$,$,$,.READWRITE.); -#2042=IFCPROPERTYENUMERATION('PEnum_FireHydrantType',(IFCLABEL('DRYBARREL'),IFCLABEL('WETBARREL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2043=IFCSIMPLEPROPERTYTEMPLATE('35a63wNQn81e$zAfQnee6V',$,'PumperConnectionSize','The size of a connection to which a fire hose may be connected that is then linked to a pumping unit.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2044=IFCSIMPLEPROPERTYTEMPLATE('212I8uZJv40Atf$88OhyXB',$,'NumberOfHoseConnections','The number of hose connections on the hydrant (excluding the pumper connection).',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2045=IFCSIMPLEPROPERTYTEMPLATE('2sMoyhwb99EPOGM8yFV987',$,'HoseConnectionSize','The size of connections to which a hose may be connected (other than that to be linked to a pumping unit).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2046=IFCSIMPLEPROPERTYTEMPLATE('11IrtnVCf8GfbfiL1J3snQ',$,'DischargeFlowRate','The volumetric rate of fluid discharge.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2047=IFCSIMPLEPROPERTYTEMPLATE('2opHYh7$D0mffNUY5jp5nj',$,'FlowClass','Alphanumeric indication of the flow class of a hydrant (may be used in connection with or instead of the FlowRate property).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2048=IFCSIMPLEPROPERTYTEMPLATE('26AsYKCvXBigB5wjkmhvlf',$,'WaterIsPotable','Indication of whether the water flow from the hydrant is potable (set TRUE) or non potable (set FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2049=IFCSIMPLEPROPERTYTEMPLATE('191d7ovn1AGQoMeIBr4HWM',$,'PressureRating','Pressure rating of the object.\X2\000A000A\X0\Maximum pressure that the hydrant is manufactured to withstand.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2050=IFCSIMPLEPROPERTYTEMPLATE('3cMIqybEn0B9bYXpTbO8Rk',$,'BodyColour','Colour of the body of the hydrant.Note: Consult local fire regulations for statutory colours that may be required for hydrant bodies in particular circumstances.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2051=IFCSIMPLEPROPERTYTEMPLATE('3Zn00m5onCjQ1Grh7LzVP$',$,'CapColour','Colour of the caps of the hydrant.Note: Consult local fire regulations for statutory colours that may be required for hydrant caps in particular circumstances.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2052=IFCPROPERTYSETTEMPLATE('0MBF_D4Xj6jAmPeMBNzb8a',$,'Pset_FireSuppressionTerminalTypeHoseReel','A supporting framework on which a hose may be wound (BS6100 155 8201).Note that the service provided by the hose (water/foam) is determined by the context of the system onto which the hose reel is connected.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal/HOSEREEL,IfcFireSuppressionTerminalType/HOSEREEL',(#2053,#2055,#2057,#2058,#2059,#2060,#2062,#2063)); -#2053=IFCSIMPLEPROPERTYTEMPLATE('2ZJNItcoH5tvCZJ3feS5og',$,'HoseReelType','Identifies the predefined types of hose arrangement from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2054,$,$,$,.READWRITE.); -#2054=IFCPROPERTYENUMERATION('PEnum_HoseReelType',(IFCLABEL('RACK'),IFCLABEL('REEL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2055=IFCSIMPLEPROPERTYTEMPLATE('0ADPLWLVP0avZuJWlIprJh',$,'HoseReelMountingType','Identifies the predefined types of hose reel mounting from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2056,$,$,$,.READWRITE.); -#2056=IFCPROPERTYENUMERATION('PEnum_HoseReelMountingType',(IFCLABEL('CABINET_RECESSED'),IFCLABEL('CABINET_SEMIRECESSED'),IFCLABEL('SURFACE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2057=IFCSIMPLEPROPERTYTEMPLATE('1T$dUY$ZP2bP7OAMDwwpri',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.\X2\000A000A\X0\Connection to the hose reel.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2058=IFCSIMPLEPROPERTYTEMPLATE('1cfqv$WZb7beXrB3$JUFk4',$,'HoseDiameter','Notional diameter (bore) of the hose.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2059=IFCSIMPLEPROPERTYTEMPLATE('0GJhe_gPz7KfV4YHULOGmC',$,'HoseLength','Notional length of the hose fitted to the hose reel when fully extended.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2060=IFCSIMPLEPROPERTYTEMPLATE('0s8i7BAtXD2OcRiG2e2i$$',$,'HoseNozzleType','Identifies the predefined types of nozzle (in terms of spray pattern) fitted to the end of the hose from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2061,$,$,$,.READWRITE.); -#2061=IFCPROPERTYENUMERATION('PEnum_HoseNozzleType',(IFCLABEL('FOG'),IFCLABEL('STRAIGHTSTREAM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2062=IFCSIMPLEPROPERTYTEMPLATE('03_xAAu_vFp8Tit8kUgCjf',$,'ClassOfService','A classification of usage of the hose reel that may be applied.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2063=IFCSIMPLEPROPERTYTEMPLATE('2oMMrS4tr7Oh6XVpn9032F',$,'ClassificationAuthority','The name of the authority that applies the classification of service to the hose reel (e.g. NFPA/FEMA).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2064=IFCPROPERTYSETTEMPLATE('3kCqeuHnXFiAqJPskCDGjN',$,'Pset_FireSuppressionTerminalTypeSprinkler','Device for sprinkling water from a pipe under pressure over an area (BS6100 100 3432)',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal/SPRINKLER,IfcFireSuppressionTerminalType/SPRINKLER',(#2065,#2067,#2069,#2071,#2072,#2073,#2074,#2076,#2077,#2078,#2079,#2080)); -#2065=IFCSIMPLEPROPERTYTEMPLATE('2BbWILCc18lv1SDe_ED0a9',$,'SprinklerType','Identifies the predefined types of sprinkler from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2066,$,$,$,.READWRITE.); -#2066=IFCPROPERTYENUMERATION('PEnum_SprinklerType',(IFCLABEL('CEILING'),IFCLABEL('CONCEALED'),IFCLABEL('CUTOFF'),IFCLABEL('PENDANT'),IFCLABEL('RECESSEDPENDANT'),IFCLABEL('SIDEWALL'),IFCLABEL('UPRIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2067=IFCSIMPLEPROPERTYTEMPLATE('15Jj1pnIzDFwrPKy5j7Fpd',$,'Activation','Identifies the predefined methods of sprinkler activation from which that required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2068,$,$,$,.READWRITE.); -#2068=IFCPROPERTYENUMERATION('PEnum_SprinklerActivation',(IFCLABEL('BULB'),IFCLABEL('FUSIBLESOLDER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2069=IFCSIMPLEPROPERTYTEMPLATE('0KQmhjRVT4JRBwJPRpqmjX',$,'Response','Identifies the predefined methods of sprinkler response from which that required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2070,$,$,$,.READWRITE.); -#2070=IFCPROPERTYENUMERATION('PEnum_SprinklerResponse',(IFCLABEL('QUICK'),IFCLABEL('STANDARD'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2071=IFCSIMPLEPROPERTYTEMPLATE('3TIzhhtejFcfWULNzMtyYo',$,'ActivationTemperature','The temperature at which the object is designed to activate.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2072=IFCSIMPLEPROPERTYTEMPLATE('3U6UwnC3zFwu1WYkUurLAN',$,'CoverageArea','The area that is covered by the object.\X2\000A000A\X0\Indicates the area that the sprinkler is designed to protect.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#2073=IFCSIMPLEPROPERTYTEMPLATE('17sPGgz_DACOTq3een9iE2',$,'HasDeflector','Indication of whether the sprinkler has a deflector (baffle) fitted to diffuse the discharge on activation (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2074=IFCSIMPLEPROPERTYTEMPLATE('1Z8DyK61f5uwMt86NmrFrh',$,'BulbLiquidColour','The colour of the liquid in the bulb for a bulb activated sprinkler. Note that the liquid colour varies according to the activation temperature requirement of the sprinkler head. Note also that this property does not need to be asserted for quick response activated sprinklers.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2075,$,$,$,.READWRITE.); -#2075=IFCPROPERTYENUMERATION('PEnum_SprinklerBulbLiquidColour',(IFCLABEL('BLUE'),IFCLABEL('GREEN'),IFCLABEL('MAUVE'),IFCLABEL('ORANGE'),IFCLABEL('RED'),IFCLABEL('YELLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2076=IFCSIMPLEPROPERTYTEMPLATE('3yOTsWa7b5GuBOQICjZLGt',$,'DischargeFlowRate','The volumetric rate of fluid discharge.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2077=IFCSIMPLEPROPERTYTEMPLATE('1Ktoyz8zb2bgimY3ICPuOk',$,'ResidualFlowingPressure','The residual flowing pressure in the pipeline at which the discharge flow rate is determined.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2078=IFCSIMPLEPROPERTYTEMPLATE('2AXnNqYsnFJxOXN$lHSMRE',$,'DischargeCoefficient','The coefficient of flow at the sprinkler.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2079=IFCSIMPLEPROPERTYTEMPLATE('1hGw0XwXXA9gyE3hp8sawb',$,'MaximumWorkingPressure','Maximum pressure that the object is manufactured to withstand.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2080=IFCSIMPLEPROPERTYTEMPLATE('00LT98clT9wvvag3Kp9BMm',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\Inlet connection to sprinkler.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2081=IFCPROPERTYSETTEMPLATE('1XdUj4Bjv8qffB7gCCS_GR',$,'Pset_FittingBend','Properties about the bend angles.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierFitting/BEND,IfcDuctFitting/BEND,IfcPipeFitting/BEND,IfcCableCarrierFittingType/BEND,IfcDuctFittingType/BEND,IfcPipeFittingType/BEND',(#2082,#2083)); -#2082=IFCSIMPLEPROPERTYTEMPLATE('1LQ_kokRXFkODuIoSoXEKq',$,'BendAngle','The change of direction of flow.',.P_SINGLEVALUE.,'IfcPositivePlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2083=IFCSIMPLEPROPERTYTEMPLATE('3XXE3bqXT1PPD3Q1XfJKMh',$,'BendRadius','The radius of bending if circular arc or zero if sharp bend.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2084=IFCPROPERTYSETTEMPLATE('3P81xZHxr598NrdP0LW2Y$',$,'Pset_FittingJunction','Properties about Fitting Junction.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting/JUNCTION,IfcDuctFitting/JUNCTION,IfcPipeFitting/JUNCTION,IfcCableCarrierFitting/JUNCTION,IfcCableFittingType/JUNCTION,IfcDuctFittingType/JUNCTION,IfcPipeFittingType/JUNCTION,IfcCableCarrierFittingType/JUNCTION',(#2085,#2087,#2088,#2089,#2090)); -#2085=IFCSIMPLEPROPERTYTEMPLATE('0FnddESV9ARArEKhqw9zt5',$,'JunctionType','The type of junction. TEE=3 ports, CROSS = 4 ports.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2086,$,$,$,.READWRITE.); -#2086=IFCPROPERTYENUMERATION('PEnum_FittingJunctionType',(IFCLABEL('CROSS'),IFCLABEL('TEE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2087=IFCSIMPLEPROPERTYTEMPLATE('0mnTD7s5jBnQGFwsgfA16R',$,'JunctionLeftAngle','The change of direction of flow for the left junction.',.P_SINGLEVALUE.,'IfcPositivePlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2088=IFCSIMPLEPROPERTYTEMPLATE('3$dfKCgv14ffRRL6Rw31V_',$,'JunctionLeftRadius','The radius of bending for the left junction.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2089=IFCSIMPLEPROPERTYTEMPLATE('3xHs9ma7T75xOMSexI$oLo',$,'JunctionRightAngle','The change of direction of flow for the right junction where 0 indicates straight segment.',.P_SINGLEVALUE.,'IfcPositivePlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2090=IFCSIMPLEPROPERTYTEMPLATE('2y2qGDYGf7YxdOeY5iyPBy',$,'JunctionRightRadius','The radius of bending for the right junction where 0 indicates sharp bend.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2091=IFCPROPERTYSETTEMPLATE('1p3YoR18P6WgFF3Y4rqauc',$,'Pset_FittingTransition','Properties about Fitting Transition.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting/TRANSITION,IfcDuctFitting/TRANSITION,IfcPipeFitting/TRANSITION,IfcCableCarrierFitting/TRANSITION,IfcCableFittingType/TRANSITION,IfcDuctFittingType/TRANSITION,IfcPipeFittingType/TRANSITION,IfcCableCarrierFittingType/TRANSITION',(#2092,#2093,#2094)); -#2092=IFCSIMPLEPROPERTYTEMPLATE('1aCHC3j7r0DxeujtA$Qz3U',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2093=IFCSIMPLEPROPERTYTEMPLATE('1ik8ewEznAEBr4zXgeTt3Z',$,'EccentricityInY','Distance in y direction between the two points (or vertex points) engaged in the point connection.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2094=IFCSIMPLEPROPERTYTEMPLATE('1GzLZa8p153ebEgTIaPZDc',$,'EccentricityInZ','Distance in z direction between the two points (or vertex points) engaged in the point connection.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2095=IFCPROPERTYSETTEMPLATE('2P23y6D6L8IO_NjsahPai5',$,'Pset_FlowInstrumentPHistory','Properties for history of flow instrument values. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcFlowInstrument',(#2096,#2097,#2098)); -#2096=IFCSIMPLEPROPERTYTEMPLATE('1I$4_deHvCLxr$BVgBM_te',$,'Value','The expected range and default value.\X2\000A000A\X0\Indicates measured values over time which may be recorded continuously or only when changed beyond a particular deadband.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#2097=IFCSIMPLEPROPERTYTEMPLATE('0z0yXeh5P6TQTk6es4mUDZ',$,'Quality','Indicates the quality of measurement or failure condition, which may be further qualified by the Status. True: measured values are considered reliable; False: measured values are considered not reliable (i.e. a fault has been detected); Unknown: reliability of values is uncertain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#2098=IFCSIMPLEPROPERTYTEMPLATE('2yP7mXbPP5_hEcH_Kf7Vnt',$,'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).\X2\000A000A\X0\Indicates an error code or identifier, whose meaning is specific to the particular automation system. Example values include: ''ConfigurationError'', ''NotConnected'', ''DeviceFailure'', ''SensorFailure'', ''LastKnown, ''CommunicationsFailure'', ''OutOfService''.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#2099=IFCPROPERTYSETTEMPLATE('0vOh57DejEBgyuXWFuEj0f',$,'Pset_FlowInstrumentTypeCommon','Flow Instrument type common attributes. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument,IfcFlowInstrumentType',(#2100,#2101)); -#2100=IFCSIMPLEPROPERTYTEMPLATE('1lzXzHcv1BewGm6g3XjHUB',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2101=IFCSIMPLEPROPERTYTEMPLATE('3pMTvDVQ5ERfVvpEzruWoq',$,'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',$,#2102,$,$,$,.READWRITE.); -#2102=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2103=IFCPROPERTYSETTEMPLATE('3frtNgLUj9NwzpiRzkr4DI',$,'Pset_FlowInstrumentTypePressureGauge','A device that reads and displays a pressure value at a point or the pressure difference between two points.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument/PRESSUREGAUGE,IfcFlowInstrumentType/PRESSUREGAUGE',(#2104,#2106)); -#2104=IFCSIMPLEPROPERTYTEMPLATE('2YFy5klML3FRa7jYKDXurW',$,'PressureGaugeType','Identifies the means by which pressure is displayed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2105,$,$,$,.READWRITE.); -#2105=IFCPROPERTYENUMERATION('PEnum_PressureGaugeType',(IFCLABEL('DIAL'),IFCLABEL('DIGITAL'),IFCLABEL('MANOMETER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2106=IFCSIMPLEPROPERTYTEMPLATE('31DL4$rKnC3Q2hKbie0Fo1',$,'DisplaySize','The physical size of the display.\X2\000A000A\X0\For a dial pressure gauge it will be the diameter of the dial.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2107=IFCPROPERTYSETTEMPLATE('1fmYk1iUn8bup$_dKIe0uF',$,'Pset_FlowInstrumentTypeThermometer','A device that reads and displays a temperature value at a point.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument/THERMOMETER,IfcFlowInstrumentType/THERMOMETER',(#2108,#2110)); -#2108=IFCSIMPLEPROPERTYTEMPLATE('1Ikakqh$H8q8Bbswv_1s_U',$,'ThermometerType','Identifies the means by which temperature is displayed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2109,$,$,$,.READWRITE.); -#2109=IFCPROPERTYENUMERATION('PEnum_ThermometerType',(IFCLABEL('DIAL'),IFCLABEL('DIGITAL'),IFCLABEL('STEM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2110=IFCSIMPLEPROPERTYTEMPLATE('2VMLFYf1P4ohpFQGiwXRDs',$,'DisplaySize','The physical size of the display.\X2\000A000A\X0\In the case of a stem thermometer, this will be the length of the stem. For a dial thermometer, it will be the diameter of the dial.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2111=IFCPROPERTYSETTEMPLATE('0DaLlt9NjC9PlpPfjLhZwC',$,'Pset_FlowMeterOccurrence','Flow meter occurrence common attributes.',.PSET_OCCURRENCEDRIVEN.,'IfcFlowMeter',(#2112)); -#2112=IFCSIMPLEPROPERTYTEMPLATE('1p7A9x7KX90gTQeh_wtoQ4',$,'FlowMeterOurpose','Enumeration defining the purpose of the flow meter occurrence.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2113,$,$,$,.READWRITE.); -#2113=IFCPROPERTYENUMERATION('PEnum_FlowMeterPurpose',(IFCLABEL('MASTER'),IFCLABEL('SUBMASTER'),IFCLABEL('SUBMETER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2114=IFCPROPERTYSETTEMPLATE('3H9_K_c799NedyQiYw0X$p',$,'Pset_FlowMeterTypeCommon','Common attributes of a flow meter type',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeter,IfcFlowMeterType',(#2115,#2116,#2118,#2120)); -#2115=IFCSIMPLEPROPERTYTEMPLATE('3PeLLLTMf7$Bh0vG5c2Uye',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2116=IFCSIMPLEPROPERTYTEMPLATE('1xKdoUVff3vwIqn3p8YpOZ',$,'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',$,#2117,$,$,$,.READWRITE.); -#2117=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2118=IFCSIMPLEPROPERTYTEMPLATE('3F_C4pkWzBIO5tT53Jyo6V',$,'ReadOutType','Indication of the form that readout from the meter takes. In the case of a dial read out, this may comprise multiple dials that give a cumulative reading and/or a mechanical odometer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2119,$,$,$,.READWRITE.); -#2119=IFCPROPERTYENUMERATION('PEnum_MeterReadOutType',(IFCLABEL('DIAL'),IFCLABEL('DIGITAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2120=IFCSIMPLEPROPERTYTEMPLATE('0NQSV3fp95g8EuP8cmwR_x',$,'RemoteReading','Indicates whether the meter has a connection for remote reading through connection of a communication device (set TRUE) or not (set FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2121=IFCPROPERTYSETTEMPLATE('3ZCOu2zb903xovpTDIdUR$',$,'Pset_FlowMeterTypeEnergyMeter','Device that measures, indicates and sometimes records, the energy usage in a system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeter/ENERGYMETER,IfcFlowMeterType/ENERGYMETER',(#2122,#2123,#2124)); -#2122=IFCSIMPLEPROPERTYTEMPLATE('2Toq8pIULAZfGjP5I6JXsE',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#2123=IFCSIMPLEPROPERTYTEMPLATE('0djjTg_GrFrPFQRyutdoGG',$,'MaximumCurrent','The maximum allowed current that a device is certified to handle.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#2124=IFCSIMPLEPROPERTYTEMPLATE('0U_xE2TIX2JxZZGY54sXKD',$,'MultipleTarriff','Indicates whether meter has built-in support for multiple tarriffs (variable energy cost rates).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2125=IFCPROPERTYSETTEMPLATE('2x4PCEXY92gwV1H42aXIFL',$,'Pset_FlowMeterTypeGasMeter','Device that measures, indicates and sometimes records, the volume of gas that passes through it without interrupting the flow.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeter/GASMETER,IfcFlowMeterType/GASMETER',(#2126,#2128,#2129,#2130)); -#2126=IFCSIMPLEPROPERTYTEMPLATE('03i5FmJZjEzOYanXNyVc1m',$,'GasType','Defines the types of gas that may be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2127,$,$,$,.READWRITE.); -#2127=IFCPROPERTYENUMERATION('PEnum_GasType',(IFCLABEL('COMMERCIALBUTANE'),IFCLABEL('COMMERCIALPROPANE'),IFCLABEL('LIQUEFIEDPETROLEUMGAS'),IFCLABEL('NATURALGAS'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2128=IFCSIMPLEPROPERTYTEMPLATE('15YaKGLof5AQurJOdMwWhk',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\Inlet and outlet pipe connections to the meter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2129=IFCSIMPLEPROPERTYTEMPLATE('3_L$dPFR57ghiYT4UhaMdr',$,'MaximumFlowRate','Maximum rate of flow which the meter is expected to pass.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2130=IFCSIMPLEPROPERTYTEMPLATE('0y3krufQj9ChonbC61Bq3s',$,'MaximumPressureLoss','Pressure loss expected across the meter under conditions of maximum flow.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2131=IFCPROPERTYSETTEMPLATE('1Uo_ikwcj9Bu22$gqTH4LJ',$,'Pset_FlowMeterTypeOilMeter','Device that measures, indicates and sometimes records, the volume of oil that passes through it without interrupting the flow.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeter/OILMETER,IfcFlowMeterType/OILMETER',(#2132,#2133)); -#2132=IFCSIMPLEPROPERTYTEMPLATE('2I11PM3hb9cPmPPTMjWWTw',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\Inlet and outlet pipe connections to the meter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2133=IFCSIMPLEPROPERTYTEMPLATE('11VYQJDhr0l9JfspvZdMo3',$,'MaximumFlowRate','Maximum rate of flow which the meter is expected to pass.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2134=IFCPROPERTYSETTEMPLATE('11xpA4LEz4MAQCxLp07tOU',$,'Pset_FlowMeterTypeWaterMeter','Device that measures, indicates and sometimes records, the volume of water that passes through it without interrupting the flow.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeter/WATERMETER,IfcFlowMeterType/WATERMETER',(#2135,#2137,#2138,#2139,#2140)); -#2135=IFCSIMPLEPROPERTYTEMPLATE('0G_n2MrRD95frUEWKJ70kv',$,'Type','Defines the allowed values for selection of the flow meter operation type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2136,$,$,$,.READWRITE.); -#2136=IFCPROPERTYENUMERATION('PEnum_WaterMeterType',(IFCLABEL('COMPOUND'),IFCLABEL('INFERENTIAL'),IFCLABEL('PISTON'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2137=IFCSIMPLEPROPERTYTEMPLATE('20kM4Been6yueT2QM$hNAR',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\Inlet and outlet pipe connections to the meter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2138=IFCSIMPLEPROPERTYTEMPLATE('06mOKwnRPCpB6JVGIQuBfm',$,'MaximumFlowRate','Maximum rate of flow which the meter is expected to pass.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2139=IFCSIMPLEPROPERTYTEMPLATE('1yHpPuVWn2tedQIiEQVeVz',$,'MaximumPressureLoss','Pressure loss expected across the meter under conditions of maximum flow.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2140=IFCSIMPLEPROPERTYTEMPLATE('3d5dnQZTPEBhplmjU2r45y',$,'BackflowPreventerType','Identifies the type of backflow preventer installed to prevent the backflow of contaminated or polluted water from an irrigation/reticulation system to a potable water supply.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2141,$,$,$,.READWRITE.); -#2141=IFCPROPERTYENUMERATION('PEnum_BackflowPreventerType',(IFCLABEL('ANTISIPHONVALVE'),IFCLABEL('ATMOSPHERICVACUUMBREAKER'),IFCLABEL('DOUBLECHECKBACKFLOWPREVENTER'),IFCLABEL('NONE'),IFCLABEL('PRESSUREVACUUMBREAKER'),IFCLABEL('REDUCEDPRESSUREBACKFLOWPREVENTER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2142=IFCPROPERTYSETTEMPLATE('1BeoZJhmvDkwqkvt_MyPyi',$,'Pset_FootingCommon','Properties common to the definition of all occurrences of IfcFooting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFooting,IfcFootingType',(#2143,#2144,#2146)); -#2143=IFCSIMPLEPROPERTYTEMPLATE('2GQFYF41H3UvwflpgxSlXU',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2144=IFCSIMPLEPROPERTYTEMPLATE('0FE7ZHMtn3fgVJdghcXmTU',$,'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',$,#2145,$,$,$,.READWRITE.); -#2145=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2146=IFCSIMPLEPROPERTYTEMPLATE('3A5jC3LePBlRw89LyqXkKn',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2147=IFCPROPERTYSETTEMPLATE('0teUoSgaj52BHUv65I_biU',$,'Pset_FootingTypePadFooting','Properties of footing. The property set can be used by the predefined type PAD_FOOTING of IfcFooting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFooting/PAD_FOOTING,IfcFootingType/PAD_FOOTING',(#2148,#2149)); -#2148=IFCSIMPLEPROPERTYTEMPLATE('3RudtpMczBlhxIYHHFTctt',$,'LoadBearingCapacity','Maximum load bearing capacity of the floor structure throughtout the storey as designed.',.P_SINGLEVALUE.,'IfcPlanarForceMeasure',$,$,$,$,$,.READWRITE.); -#2149=IFCSIMPLEPROPERTYTEMPLATE('2$Wn2gx2L71PQfUC2ZZTqg',$,'IsReinforced','Indicates whether the foundation is reinforced (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2150=IFCPROPERTYSETTEMPLATE('3e8eAIvF15jvqC5oAIJuMp',$,'Pset_FurnitureTypeChair','A set of specific properties for furniture type chair. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Chair',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurniture/CHAIR,IfcFurnitureType/CHAIR',(#2151,#2152,#2153)); -#2151=IFCSIMPLEPROPERTYTEMPLATE('0zVmvf3iHEohAIu225RftZ',$,'SeatingHeight','The value of seating height if the chair height is not adjustable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2152=IFCSIMPLEPROPERTYTEMPLATE('2m5vy7CVbCswCEYfk59vzr',$,'HighestSeatingHeight','The value of seating height of high level if the chair height is adjustable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2153=IFCSIMPLEPROPERTYTEMPLATE('1UCHIA2hDA1eqK_lJ9FwUE',$,'LowestSeatingHeight','The value of seating height of low level if the chair height is adjustable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2154=IFCPROPERTYSETTEMPLATE('3$LION5qz8o8mkJw8PKMkb',$,'Pset_FurnitureTypeCommon','Common properties for all types of furniture such as chair, desk, table, and file cabinet. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FurnitureCommon. IFC 2x4: ''IsBuiltIn'' property added',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurniture,IfcFurnitureType',(#2155,#2156,#2158,#2159,#2160,#2161,#2162,#2163)); -#2155=IFCSIMPLEPROPERTYTEMPLATE('0gWIzmqXvCv9CT0bVzoA55',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2156=IFCSIMPLEPROPERTYTEMPLATE('21NDpkkNL6qRwbr0M5yRp0',$,'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',$,#2157,$,$,$,.READWRITE.); -#2157=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2158=IFCSIMPLEPROPERTYTEMPLATE('3Fr3rSIb994O1I8PxBMyKG',$,'Style','Description of the furniture style.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2159=IFCSIMPLEPROPERTYTEMPLATE('2susfy7hj6uxQwfw6jYID$',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A000A\X0\The nominal height of the furniture of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2160=IFCSIMPLEPROPERTYTEMPLATE('2dZrU8XbTAKuG6FXd5Qsaq',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2161=IFCSIMPLEPROPERTYTEMPLATE('0XVLg3_GT7$PhSBKUDJW68',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2162=IFCSIMPLEPROPERTYTEMPLATE('3Q6hrwZBzFbxp2sgLA5FCb',$,'MainColour','The main colour of the furniture of this type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2163=IFCSIMPLEPROPERTYTEMPLATE('1VljsszWz7xOmMLdUP3Lai',$,'IsBuiltIn','Indicates whether the furniture type is intended to be ''built in'' i.e. physically attached to a building or facility (= TRUE) or not i.e. Loose and movable (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2164=IFCPROPERTYSETTEMPLATE('2VpjUyNSvFHvtuHCYcjeqo',$,'Pset_FurnitureTypeDesk','A set of specific properties for furniture type desk. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Desk',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurniture/DESK,IfcFurnitureType/DESK',(#2165)); -#2165=IFCSIMPLEPROPERTYTEMPLATE('3DDBTCY1TFr8dSirinufaE',$,'WorksurfaceArea','The value of the work surface area of the desk.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#2166=IFCPROPERTYSETTEMPLATE('1FaBnjQfHEDAOpLK0keVrr',$,'Pset_FurnitureTypeFileCabinet','A set of specific properties for furniture type file cabinet HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FileCabinet',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurniture/FILECABINET,IfcFurnitureType/FILECABINET',(#2167)); -#2167=IFCSIMPLEPROPERTYTEMPLATE('2TLwu5f992De8vphxlFczs',$,'WithLock','Indicates whether the file cabinet is lockable (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2168=IFCPROPERTYSETTEMPLATE('0Gg$KIC$14Kw7Jm5NfesVv',$,'Pset_FurnitureTypeTable','HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Table',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurniture/TABLE,IfcFurnitureType/TABLE',(#2169,#2170)); -#2169=IFCSIMPLEPROPERTYTEMPLATE('0Fz1CF1MDDhxO3dRNA$zIp',$,'WorksurfaceArea','The value of the work surface area of the desk.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#2170=IFCSIMPLEPROPERTYTEMPLATE('2dCqY8syzAo8HFtKg1muKw',$,'NumberOfChairs','Maximum number of chairs that can fit with the table for normal use.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2171=IFCPROPERTYSETTEMPLATE('181qm7DnHB$vMP$nytaz11',$,'Pset_GateHeadCommon','Properties common to the definition of all occurrences of IfcMarinePart with the predefined type set to GATEHEAD.',.PSET_OCCURRENCEDRIVEN.,'IfcMarinePart/GATEHEAD',(#2172)); -#2172=IFCSIMPLEPROPERTYTEMPLATE('0h6InSAPj9i9OBS6a$DAEN',$,'StructuralType','Structural type of the object',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2173=IFCPROPERTYSETTEMPLATE('2AhQJgEmDEku_hIh_jBEFv',$,'Pset_GeotechnicalAssemblyCommon','Properties describing the characteristics of any geotechnical model. A Status of "New" should not be associated to a IfcGeotechnicalAssembly or IfcGeotechnicalStratum, as other entities are used for earthworks and courses.',.PSET_OCCURRENCEDRIVEN.,'IfcGeotechnicalAssembly',(#2174,#2175,#2176,#2178)); -#2174=IFCSIMPLEPROPERTYTEMPLATE('3b$jFeHmz6AgUmX66CPjdX',$,'Limitations','Limitations on usage.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2175=IFCSIMPLEPROPERTYTEMPLATE('32_bNLJb91khJWP12MPyH5',$,'Methodology','Methodology used to prepare the contents of the geotechnical assembly.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2176=IFCSIMPLEPROPERTYTEMPLATE('3XvQ5nKInFnRG7tMI7fjQV',$,'BoreHolePurpose','Purpose for which the borehole, section or volumetric model was created. (EU Inspire, boreholeML)',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2177,$,$,$,.READWRITE.); -#2177=IFCPROPERTYENUMERATION('PEnum_StrataAssemblyPurpose',(IFCLABEL('DEPOSIT'),IFCLABEL('ENVIRONMENTAL'),IFCLABEL('FEEDSTOCK'),IFCLABEL('GEOLOGICAL'),IFCLABEL('GEOTHERMAL'),IFCLABEL('HYDROCARBON'),IFCLABEL('HYDROGEOLOGICAL'),IFCLABEL('MINERAL'),IFCLABEL('PEDOLOGICAL'),IFCLABEL('SITE_INVESTIGATION'),IFCLABEL('STORAGE'),IFCLABEL('NOTKNOWN'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); -#2178=IFCSIMPLEPROPERTYTEMPLATE('2HhT2j56f6rulsg4DPBjpH',$,'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',$,#2179,$,$,$,.READWRITE.); +#1676=IFCSIMPLEPROPERTYTEMPLATE('3MM3i_QXT7eQ9sZIHOzibi',$,'ElectricGeneratorEfficiency','The ratio of output capacity to intake capacity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1677=IFCSIMPLEPROPERTYTEMPLATE('1FZtqGR6rD6f$iJJ_enMV_',$,'StartCurrentFactor','IEC. Start current factor defines how large the peak starting current will become on the engine. StartCurrentFactor is multiplied to NominalCurrent and to give the start current.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1678=IFCSIMPLEPROPERTYTEMPLATE('0f_qXvb_L7aPU5RfXJS74G',$,'MaximumPowerOutput','The maximum output power rating of the engine.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1679=IFCPROPERTYSETTEMPLATE('3OpJmNxUv2W9ErNk8H3ty7',$,'Pset_ElectricMotorTypeCommon','Defines a particular type of engine that is a machine for converting electrical energy into mechanical energy. Note that in cases where a close coupled or monobloc pump or close coupled fan is being driven by the motor, the motor may itself be considered to be directly part of the pump or fan. In this case , motor information may need to be specified directly at the pump or fan and not througfh separate motor/motor connection entities. NOTE: StartingTime and TeTime added at IFC4',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricMotor,IfcElectricMotorType',(#1680,#1681,#1683,#1684,#1685,#1686,#1687,#1688,#1689,#1691,#1692,#1693)); +#1680=IFCSIMPLEPROPERTYTEMPLATE('0Fb0e5lsz3hBW1SziazgFY',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1681=IFCSIMPLEPROPERTYTEMPLATE('1ckOLnM5rFlhahtu_9b$5i',$,'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',$,#1682,$,$,$,.READWRITE.); +#1682=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1683=IFCSIMPLEPROPERTYTEMPLATE('3KtNsJxc1DMhGg$jgVtL$I',$,'MaximumPowerOutput','The maximum output power rating of the engine.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1684=IFCSIMPLEPROPERTYTEMPLATE('3Dxz4ub0X0a8ed1ztE67bA',$,'ElectricMotorEfficiency','The ratio of output capacity to intake capacity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1685=IFCSIMPLEPROPERTYTEMPLATE('045v6rA3H8VAeQtuo9732_',$,'StartCurrentFactor','IEC. Start current factor defines how large the peak starting current will become on the engine. StartCurrentFactor is multiplied to NominalCurrent and to give the start current.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1686=IFCSIMPLEPROPERTYTEMPLATE('2$Lwy89yf9RAWQbo3vPOTU',$,'StartingTime','The time (in s) needed for the motor to reach its rated speed with its driven equipment attached, starting from standstill and at the nominal voltage applied at its terminals.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#1687=IFCSIMPLEPROPERTYTEMPLATE('366akyPqP3RPCo4E6V4XZz',$,'TeTime','The maximum time (in s) at which the motor could run with locked rotor when the motor is used in an EX-environment. The time indicates that a protective device should trip before this time when the starting current of the motor is slowing through the device.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#1688=IFCSIMPLEPROPERTYTEMPLATE('3WlqfQC4TDg84zEfQculJ2',$,'LockedRotorCurrent','Input current when a motor armature is energized but not rotating.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1689=IFCSIMPLEPROPERTYTEMPLATE('2K5hs2PPv0Ev4QU26PupDf',$,'MotorEnclosureType','A list of the available types of motor enclosure from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1690,$,$,$,.READWRITE.); +#1690=IFCPROPERTYENUMERATION('PEnum_MotorEnclosureType',(IFCLABEL('OPENDRIPPROOF'),IFCLABEL('TOTALLYENCLOSEDAIROVER'),IFCLABEL('TOTALLYENCLOSEDFANCOOLED'),IFCLABEL('TOTALLYENCLOSEDNONVENTILATED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1691=IFCSIMPLEPROPERTYTEMPLATE('2lC1TKUefDDPNxp4Ql$fWk',$,'FrameSize','Designation of the frame size according to the named range of frame sizes designated at the place of use or according to a given standard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1692=IFCSIMPLEPROPERTYTEMPLATE('2AiXf8sKT3XAaqcqm_zHW4',$,'IsGuarded','Indication of whether the motor enclosure is guarded (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1693=IFCSIMPLEPROPERTYTEMPLATE('0ljscus658LgQedyuvZAN7',$,'HasPartWinding','Indication of whether the motor is single speed, i.e. has a single winding (= FALSE) or multi-speed i.e.has part winding (= TRUE) .',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1694=IFCPROPERTYSETTEMPLATE('19UUeQHC9FMOchefFE0$wk',$,'Pset_ElectricTimeControlTypeCommon','Common properties for electric time control devices. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricTimeControl,IfcElectricTimeControlType',(#1695,#1696)); +#1695=IFCSIMPLEPROPERTYTEMPLATE('2jZLswiyHDW8bhQ2IbYo2u',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1696=IFCSIMPLEPROPERTYTEMPLATE('0X5Z8cRu9CE9J1b8OL8jgb',$,'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',$,#1697,$,$,$,.READWRITE.); +#1697=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1698=IFCPROPERTYSETTEMPLATE('3iGWhbv7r2PBD4l282Nl0S',$,'Pset_ElementAssemblyCommon','Properties common to the definition of all occurrence and type objects of element assembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly,IfcElementAssemblyType',(#1699,#1700)); +#1699=IFCSIMPLEPROPERTYTEMPLATE('35yvy7crz8qB3EPaROEAO7',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1700=IFCSIMPLEPROPERTYTEMPLATE('37QgLoaSX4p8w9agN2v$e9',$,'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',$,#1701,$,$,$,.READWRITE.); +#1701=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1702=IFCPROPERTYSETTEMPLATE('26ZorsJm50b9vnC48I8nZX',$,'Pset_ElementAssemblyTypeCantilever','Energy cantilever properties used in railway. The property set can be used by the predefined type SUSPENSION_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUSPENSIONASSEMBLY,IfcElementAssemblyType/SUSPENSIONASSEMBLY',(#1703,#1704,#1705,#1706)); +#1703=IFCSIMPLEPROPERTYTEMPLATE('1cUzwWjnD6UQmJ60G$c0NU',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#1704=IFCSIMPLEPROPERTYTEMPLATE('3wJzdT1tP8Wx9mfgjZBxwk',$,'ContactWireStagger','Lateral displacement of the contact wire to opposite sides of the track centre at successive supports.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1705=IFCSIMPLEPROPERTYTEMPLATE('0UfNqv3Rv4t86yoKWf6pPY',$,'SystemHeight','Vertical distance between the main catenary wire and the contact wire measured at a support point.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1706=IFCSIMPLEPROPERTYTEMPLATE('0BhyZfGLrAzwoAsrg7bNhM',$,'CantileverType','Type of cantilever assembly.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1707,$,$,$,.READWRITE.); +#1707=IFCPROPERTYENUMERATION('PEnum_CantileverAssemblyType',(IFCLABEL('CENTER_CANTILEVER'),IFCLABEL('DIRECT_SUSPENSION'),IFCLABEL('INSULATED_OVERLAP_CANTILEVER'),IFCLABEL('INSULATED_SUSPENSION_SET'),IFCLABEL('MECHANICAL_OVERLAP_CANTILEVER'),IFCLABEL('MIDPOINT_CANTILEVER'),IFCLABEL('MULTIPLE_TRACK_CANTILEVER'),IFCLABEL('OUT_OF_RUNNING_CANTILEVER'),IFCLABEL('PHASE_SEPARATION_CANTILEVER'),IFCLABEL('SINGLE'),IFCLABEL('SYSTEM_SEPARATION_CANTILEVER'),IFCLABEL('TRANSITION_CANTILEVER'),IFCLABEL('TURNOUT_CANTILEVER'),IFCLABEL('UNDERBRIDGE_CANTILEVER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1708=IFCPROPERTYSETTEMPLATE('1bN6XDvnH11BX$lexfZW$1',$,'Pset_ElementAssemblyTypeDilatationPanel','Adjustment switch panel properties used in railway. The property set can be used by the predefined type DILATATION_PANEL of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/DILATATIONPANEL,IfcElementAssemblyType/DILATATIONPANEL',(#1709,#1710,#1711,#1713,#1714)); +#1709=IFCSIMPLEPROPERTYTEMPLATE('2wcpZd_GPA6xmooPbFC57U',$,'TechnicalStandard','The technical standard which the element should comply with.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#1710=IFCSIMPLEPROPERTYTEMPLATE('1jcPSWlrz7ThmjorDUZD0Z',$,'DilatationLength','Length dilatation admitted by the element.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1711=IFCSIMPLEPROPERTYTEMPLATE('2nyb5kVo5DGf7HaikBpONj',$,'ExpansionDirection','The expansion direction, e.g. single direction, bi-direction',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1712,$,$,$,.READWRITE.); +#1712=IFCPROPERTYENUMERATION('PEnum_ExpansionDirection',(IFCLABEL('BI_DIRECTION'),IFCLABEL('SINGLE_DIRECTION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1713=IFCSIMPLEPROPERTYTEMPLATE('2VdLG874v4_x3Qn0B4MSFC',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); +#1714=IFCSIMPLEPROPERTYTEMPLATE('0wCbQDpUr3WRh9bHjuAfpm',$,'BladesOrientation','Orientation of internal blades.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1715,$,$,$,.READWRITE.); +#1715=IFCPROPERTYENUMERATION('PEnum_BladesOrientation',(IFCLABEL('BLADESINSIDE'),IFCLABEL('BLADESOUTSIDE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1716=IFCPROPERTYSETTEMPLATE('0TD9Ykjgv38Bl$ND9kTxif',$,'Pset_ElementAssemblyTypeHeadSpan','Energy Head Span properties used in railway. The property set can be used by the predefined type SUSPENSION_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUPPORTINGASSEMBLY,IfcElementAssemblyType/SUPPORTINGASSEMBLY',(#1717,#1718,#1719)); +#1717=IFCSIMPLEPROPERTYTEMPLATE('359G2McKr8LvAcujqbRH5Y',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#1718=IFCSIMPLEPROPERTYTEMPLATE('1XcfP$Q7D5Nuqamzfv9b48',$,'NumberOfTracksCrossed','Indicates the number of tracks which OCS supporting system crosses.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1719=IFCSIMPLEPROPERTYTEMPLATE('2isqkZ$ZTFYQlBjQH1FpSE',$,'Span','Clear span for this object.The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1720=IFCPROPERTYSETTEMPLATE('0gaddRUpz7ZAWXR1BIJUSe',$,'Pset_ElementAssemblyTypeMast','Telecom Tower properties used in railway. The property set can be used by the predefined type MAST of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/MAST,IfcElementAssemblyType/MAST',(#1721)); +#1721=IFCSIMPLEPROPERTYTEMPLATE('0qEL65P498vxXbD3cKy6Tb',$,'WithLightningRod','Indicates whether the element is equipped with a lightning rod (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1722=IFCPROPERTYSETTEMPLATE('1tkuH65Gj8$f0u2nE1K9P7',$,'Pset_ElementAssemblyTypeOCSSuspension','Common energy suspension properties used in railway. The property set can be used by the predefined type SUSPENSION_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUSPENSIONASSEMBLY,IfcElementAssemblyType/SUSPENSIONASSEMBLY',(#1723,#1724)); +#1723=IFCSIMPLEPROPERTYTEMPLATE('0suKkJ9CHEaQoFjjEMdS1d',$,'ContactWireStagger','Lateral displacement of the contact wire to opposite sides of the track centre at successive supports.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1724=IFCSIMPLEPROPERTYTEMPLATE('1Q73z4lfzBLw_fJdQ3snPa',$,'ContactWireHeight','Distance from the top of the rail to the lower face of the contact wire, measured perpendicular to the track.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1725=IFCPROPERTYSETTEMPLATE('28AkWzuwjAeP4gr13kTPM9',$,'Pset_ElementAssemblyTypeRigidFrame','Energy Cross Beam properties used in railway. The property set can be used by the predefined type RIGID_FRAME of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/RIGID_FRAME,IfcElementAssemblyType/RIGID_FRAME',(#1726,#1727,#1728,#1729)); +#1726=IFCSIMPLEPROPERTYTEMPLATE('0Dpx5y5Wz2LwEC3j3wadkW',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#1727=IFCSIMPLEPROPERTYTEMPLATE('0ui5ZzqHTBiffXFsEHKM3w',$,'LoadCapacity','Indicates the highest permissible load capacity.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#1728=IFCSIMPLEPROPERTYTEMPLATE('1bHANQyV99RBO6uKsFdSHK',$,'NumberOfTracksCrossed','Indicates the number of tracks which OCS supporting system crosses.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1729=IFCSIMPLEPROPERTYTEMPLATE('2mgfQihGr6fB5Wl9HPcj1p',$,'Span','Clear span for this object.The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1730=IFCPROPERTYSETTEMPLATE('2LxtKwfh92O8XO32a_26X0',$,'Pset_ElementAssemblyTypeSteadyDevice','Energy steady device properties used in railway. The property set can be used by the predefined type SUSPENSION_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUSPENSIONASSEMBLY,IfcElementAssemblyType/SUSPENSIONASSEMBLY',(#1731,#1732,#1733,#1734)); +#1731=IFCSIMPLEPROPERTYTEMPLATE('2cb2N66C5D2BcG7TSLIk7j',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#1732=IFCSIMPLEPROPERTYTEMPLATE('3IqQVcx5n8EApFbYFvsWf_',$,'ContactWireStagger','Lateral displacement of the contact wire to opposite sides of the track centre at successive supports.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1733=IFCSIMPLEPROPERTYTEMPLATE('2gHZZZ1Mn7_xNs3mkUJwHu',$,'IsSetOnWorkingWire','Indicates whether the steady device is set on the working wire.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1734=IFCSIMPLEPROPERTYTEMPLATE('1cg2qO51f0zepEZczE7Z0H',$,'SteadyDeviceType','Type of Steady Device: To indicate the mode of registration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1735,$,$,$,.READWRITE.); +#1735=IFCPROPERTYENUMERATION('PEnum_SteadyDeviceType',(IFCLABEL('PULL_OFF'),IFCLABEL('PUSH_OFF'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1736=IFCPROPERTYSETTEMPLATE('0AyWPLwq11jQiu4hhISH96',$,'Pset_ElementAssemblyTypeSupportingAssembly','Energy supporting assembly properties used in railway. The property set can be used by the predefined type SUPPORTING_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUPPORTINGASSEMBLY,IfcElementAssemblyType/SUPPORTINGASSEMBLY',(#1737,#1738)); +#1737=IFCSIMPLEPROPERTYTEMPLATE('1BT0uNsGD8gAmsh6NJfvcz',$,'NumberOfCantilevers','Indicates the number of cantilevers in the OCS supporting system.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1738=IFCSIMPLEPROPERTYTEMPLATE('11Ja$_nl9BHwJd1E2HfGhl',$,'TypeOfSupportingSystem','Type of foundation in the OCS supporting system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1739,$,$,$,.READWRITE.); +#1739=IFCPROPERTYENUMERATION('PEnum_SupportingSystemType',(IFCLABEL('ENDCATENARYSUPPORT'),IFCLABEL('HEADSPANSUPPORT'),IFCLABEL('HERSE'),IFCLABEL('MULTITRACKSUPPORT'),IFCLABEL('RIGIDGANTRY'),IFCLABEL('SIMPLESUPPORT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1740=IFCPROPERTYSETTEMPLATE('13$ILt_pv7TBYDir7j1079',$,'Pset_ElementAssemblyTypeTrackPanel','Track panel properties used in railway. The property set can be used by the predefined type TRACK_PANEL of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/TRACKPANEL,IfcElementAssemblyType/TRACKPANEL',(#1741,#1742,#1743)); +#1741=IFCSIMPLEPROPERTYTEMPLATE('0UOHelVg9DJ8xtGoF9K2P2',$,'IsAccessibleByVehicle','Indicates whether the element is accessible by a vehicle or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1742=IFCSIMPLEPROPERTYTEMPLATE('1GadovWV98iQ9A0L$hfYev',$,'TrackExpansion','In curvature context, bounded value of the expansion distance that can be added to rail gauge.',.P_BOUNDEDVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1743=IFCSIMPLEPROPERTYTEMPLATE('1QCCOTDO94ah6QuOzXu3UE',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); +#1744=IFCPROPERTYSETTEMPLATE('13gLYfshPFoPf3SfYcf6tz',$,'Pset_ElementAssemblyTypeTractionSwitchingAssembly','Energy switching assembly properties used in railway. The property set can be used by the predefined type TRACTION_SWITCHING_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/TRACTION_SWITCHING_ASSEMBLY,IfcElementAssemblyType/TRACTION_SWITCHING_ASSEMBLY',(#1745,#1746,#1747,#1748)); +#1745=IFCSIMPLEPROPERTYTEMPLATE('1$s5GE511BOhleYshjUlin',$,'NominalCurrent','The nominal current that is designed to be measured.\X2\000A000A\X0\A set of nominal currents in [A] for which the data of this instance is valid. At least one value shall be provided. Any value in the set shall not exceed the value of the\X2\000A\X0\UltimateRatedCurrent associated with the same breaker unit.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#1746=IFCSIMPLEPROPERTYTEMPLATE('0APkWM1an0_RBknF8F9zbl',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1747=IFCSIMPLEPROPERTYTEMPLATE('0e415sucj7v9mHS033lL3a',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#1748=IFCSIMPLEPROPERTYTEMPLATE('1tLB91OYP9whvTecsxX8ue',$,'DesignAmbientTemperature','The highest and lowest local ambient temperature likely to be encountered.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1749=IFCPROPERTYSETTEMPLATE('3diZ47eSf4BRcoY8i8XAu7',$,'Pset_ElementAssemblyTypeTurnoutPanel','Turnout panel properties used in railway. The property set can be used by the predefined type TURNOUT_PANEL of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/TURNOUTPANEL,IfcElementAssemblyType/TURNOUTPANEL',(#1750,#1751,#1753,#1754,#1755,#1757,#1758,#1759,#1760,#1762,#1764,#1765,#1766,#1767,#1769,#1771)); +#1750=IFCSIMPLEPROPERTYTEMPLATE('1pDbFUnw53S8WT67Xdre00',$,'IsAccessibleByVehicle','Indicates whether the element is accessible by a vehicle or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1751=IFCSIMPLEPROPERTYTEMPLATE('3nIxSzBX5Bk8rs3NChfkIE',$,'BranchLineDirection','Describes the direction associated to the branch line of the turnout (deviated branch).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1752,$,$,$,.READWRITE.); +#1752=IFCPROPERTYENUMERATION('PEnum_BranchLineDirection',(IFCLABEL('LEFTDEVIATION'),IFCLABEL('LEFT_LEFTDEVIATION'),IFCLABEL('LEFT_RIGHTDEVIATION'),IFCLABEL('RIGHTDEVIATION'),IFCLABEL('RIGHT_LEFTDEVIATION'),IFCLABEL('RIGHT_RIGHTDEVIATION'),IFCLABEL('SYMETRIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1753=IFCSIMPLEPROPERTYTEMPLATE('10QSd2Wuf3uv0ytHMCQQum',$,'TrackExpansion','In curvature context, bounded value of the expansion distance that can be added to rail gauge.',.P_BOUNDEDVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1754=IFCSIMPLEPROPERTYTEMPLATE('1XeuImua5D0u$ANYy_KmXm',$,'TurnoutCurvedRadius','If turnout is curved, the main branch radius of curvature.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#1755=IFCSIMPLEPROPERTYTEMPLATE('03XLEfR1v8Y8QnuKKIlyrw',$,'TypeOfCurvedTurnout','Turnouts that are positioned in the curved part of the alignment.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1756,$,$,$,.READWRITE.); +#1756=IFCPROPERTYENUMERATION('PEnum_TypeOfCurvedTurnout',(IFCLABEL('CIRCULAR_ARC'),IFCLABEL('STRAIGHT'),IFCLABEL('TRANSITION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1757=IFCSIMPLEPROPERTYTEMPLATE('29r76BO2H3xRScFBcTX$Pe',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); +#1758=IFCSIMPLEPROPERTYTEMPLATE('2jaXqQEcH1hQjHpdmHfYj1',$,'IsSharedTurnout','Indicates if the turnout makes a connection to another infrastructure owner (for sharing costs).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1759=IFCSIMPLEPROPERTYTEMPLATE('0rT8wE3xbD6hI9sPu1YmVi',$,'MaximumSpeedLimitOfDivergingLine','Maximum speed for diverging line that corresponds to the type of turnout and design constraints.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#1760=IFCSIMPLEPROPERTYTEMPLATE('0nd2L7_Fz19Pmm44nbPriP',$,'TypeOfDrivingDevice','Type of the driving device used for the turnout.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1761,$,$,$,.READWRITE.); +#1761=IFCPROPERTYENUMERATION('PEnum_TypeOfDrivingDevice',(IFCLABEL('ELECTRIC'),IFCLABEL('HYDRAULIC'),IFCLABEL('MANUAL'),IFCLABEL('MIXED'),IFCLABEL('MOTORISED'),IFCLABEL('PNEUMATIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1762=IFCSIMPLEPROPERTYTEMPLATE('1t5yFJ7Oz6OPHaFU7WYPb0',$,'TrackElementOrientation','Turnout panels can be placed in 2 mirror-symmetric directions in the field. To distinguish both ends of the turnout panel, a definition of an orientation system with respect to the panel is necessary. The orientation defines, if the panel is oriented in a way or opposite with respect to the direction of the alignment/stationing.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1763,$,$,$,.READWRITE.); +#1763=IFCPROPERTYENUMERATION('PEnum_TurnoutPanelOrientation',(IFCLABEL('BACK'),IFCLABEL('FRONT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1764=IFCSIMPLEPROPERTYTEMPLATE('3lBAxicw5BTehq2vAsxmm3',$,'PercentShared','Percent of costs paid by the other infrastructure owner.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1765=IFCSIMPLEPROPERTYTEMPLATE('2KYcgWzpr7COmd$nDgxPjN',$,'TrackGaugeLength','Basic track gauge of permanent way.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1766=IFCSIMPLEPROPERTYTEMPLATE('0cmMTg0MzDXw6eev395Ibu',$,'TurnoutPointMachineCount','Count of point machines inside turnout panel.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1767=IFCSIMPLEPROPERTYTEMPLATE('34uyyuFGL0Cgg4fQ0QMXoH',$,'TurnoutHeaterType','Defines the kind of turnout heater installed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1768,$,$,$,.READWRITE.); +#1768=IFCPROPERTYENUMERATION('PEnum_TurnoutHeaterType',(IFCLABEL('ELECTRIC'),IFCLABEL('GAS'),IFCLABEL('GEOTHERMAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1769=IFCSIMPLEPROPERTYTEMPLATE('3mnPuBdW58Sfxd5qiOj7oA',$,'TypeOfJunction','The turnout part of the continuous welded rail.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1770,$,$,$,.READWRITE.); +#1770=IFCPROPERTYENUMERATION('PEnum_TypeOfJunction',(IFCLABEL('ISOLATED_JOINT'),IFCLABEL('JOINTED'),IFCLABEL('WELDED_AND_INSERTABLE'),IFCLABEL('WELDED_AND_NOT_INSERTABLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1771=IFCSIMPLEPROPERTYTEMPLATE('1hIdiY_kHEkuoTxL4UDrKY',$,'TypeOfTurnout','Type of turnout.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1772,$,$,$,.READWRITE.); +#1772=IFCPROPERTYENUMERATION('PEnum_TypeOfTurnout',(IFCLABEL('DERAILMENT_TURNOUT'),IFCLABEL('DIAMOND_CROSSING'),IFCLABEL('DOUBLE_SLIP_CROSSING'),IFCLABEL('SCISSOR_CROSSOVER'),IFCLABEL('SINGLE_SLIP_CROSSING'),IFCLABEL('SLIP_TURNOUT_AND_SCISSORS_CROSSING'),IFCLABEL('SYMMETRIC_TURNOUT'),IFCLABEL('THREE_WAYS_TURNOUT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1773=IFCPROPERTYSETTEMPLATE('0aaKFhMOP89B5fOulyeoWk',$,'Pset_ElementComponentCommon','Set of common properties of component elements (especially discrete accessories, but also fasteners, reinforcement elements, or other types of components).',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementComponent,IfcElementComponentType',(#1774,#1775,#1777,#1779)); +#1774=IFCSIMPLEPROPERTYTEMPLATE('3l3YaYlt1FOeaKF87onB52',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1775=IFCSIMPLEPROPERTYTEMPLATE('2_XZiYF9n67QjeiEW6h6Tg',$,'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',$,#1776,$,$,$,.READWRITE.); +#1776=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1777=IFCSIMPLEPROPERTYTEMPLATE('0mLuNr3JrBKeCSnBbnQ4FB',$,'DeliveryType','Determines how the accessory will be delivered to the site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1778,$,$,$,.READWRITE.); +#1778=IFCPROPERTYENUMERATION('PEnum_ElementComponentDeliveryType',(IFCLABEL('ATTACHED_FOR_DELIVERY'),IFCLABEL('CAST_IN_PLACE'),IFCLABEL('LOOSE'),IFCLABEL('PRECAST'),IFCLABEL('WELDED_TO_STRUCTURE'),IFCLABEL('NOTDEFINED')),$); +#1779=IFCSIMPLEPROPERTYTEMPLATE('17FN1YvrL02fDOlPyzneHb',$,'CorrosionTreatment','Determines corrosion treatment for metal components. This property is provided if the requirement needs to be expressed (a) independently of a material specification and (b) as a mere requirements statement rather than a workshop design/ processing feature.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1780,$,$,$,.READWRITE.); +#1780=IFCPROPERTYENUMERATION('PEnum_ElementComponentCorrosionTreatment',(IFCLABEL('EPOXYCOATED'),IFCLABEL('GALVANISED'),IFCLABEL('NONE'),IFCLABEL('PAINTED'),IFCLABEL('STAINLESS'),IFCLABEL('NOTDEFINED')),$); +#1781=IFCPROPERTYSETTEMPLATE('36zZX4FkPA1gagogPremcB',$,'Pset_ElementKinematics','Information confirming that the element has cyclic and/or pathed kinematic behaviour. The resulting envelope may be available as a ''clearance'' shape representation.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#1782,#1783,#1784,#1785,#1786,#1787,#1788)); +#1782=IFCSIMPLEPROPERTYTEMPLATE('0b01UaFzb1tBAf23w5j4_e',$,'CyclicPath','Represents the time:angle table of the kinematic behaviour.',.P_TABLEVALUE.,'IfcTimeMeasure','IfcPlaneAngleMeasure',$,$,$,$,.READWRITE.); +#1783=IFCSIMPLEPROPERTYTEMPLATE('0paKEDOn9BTv6uobh6TeH_',$,'CyclicRange','Identifies the angular range of the kinematic behaviour',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#1784=IFCSIMPLEPROPERTYTEMPLATE('093EJsYevEjPUe17BCudvJ',$,'LinearPath','Represents the time:distance table of the kinematic behaviour.',.P_TABLEVALUE.,'IfcTimeMeasure','IfcLengthMeasure',$,$,$,$,.READWRITE.); +#1785=IFCSIMPLEPROPERTYTEMPLATE('334yWkFI134e_u1tTA1PgD',$,'LinearRange','Identifies the linear range of the kinematic behaviour.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1786=IFCSIMPLEPROPERTYTEMPLATE('1cdXQS4i92M9tvzr6Mya9W',$,'MaximumAngularVelocity','Identifies the maximum angular velocity of the kinematic behaviour.',.P_SINGLEVALUE.,'IfcAngularVelocityMeasure',$,$,$,$,$,.READWRITE.); +#1787=IFCSIMPLEPROPERTYTEMPLATE('2KP4cDCGXFoBoc_YT3E9ZI',$,'MaximumConstantSpeed','Identifies the maximum constant speed over the kinematic path.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#1788=IFCSIMPLEPROPERTYTEMPLATE('1gH94t2SP4SRHj0dqyhhOZ',$,'MinimumTime','Identifies the minimum time for the kinematic behaviour.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#1789=IFCPROPERTYSETTEMPLATE('09DuYfAlf1xgMCl11mBYaa',$,'Pset_ElementSize','Property set with properties about size of the element.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement,IfcEnergyConversionDevice,IfcFlowController,IfcFlowMovingDevice,IfcFlowStorageDevice,IfcFlowTerminal,IfcFlowTreatmentDevice,IfcDistributionChamberElementType,IfcEnergyConversionDeviceType,IfcFlowControllerType,IfcFlowMovingDeviceType,IfcFlowStorageDeviceType,IfcFlowTerminalType,IfcFlowTreatmentDeviceType',(#1790,#1791,#1792)); +#1790=IFCSIMPLEPROPERTYTEMPLATE('3SxFdUtwX1OuDtqnkLaqWe',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1791=IFCSIMPLEPROPERTYTEMPLATE('1BySTu8tH3VfdGUe3wqv8p',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1792=IFCSIMPLEPROPERTYTEMPLATE('2K0Fu2rFn1RvEr2nmU1Vyh',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1793=IFCPROPERTYSETTEMPLATE('086pcJEpn3NOsfb3mhu3JX',$,'Pset_EmbeddedTrack','Properties for track slab that have embedded tracks recessed into road surface.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab/TRACKSLAB,IfcSlabType/TRACKSLAB',(#1794,#1795,#1796)); +#1794=IFCSIMPLEPROPERTYTEMPLATE('1Y6B24GEbAG9v0Xnv$KkSu',$,'IsAccessibleByVehicle','Indicates whether the element is accessible by a vehicle or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1795=IFCSIMPLEPROPERTYTEMPLATE('1lr0vVnx96pO5g4bNEY2rs',$,'HasDrainage','Indicates whether the infrastructure element has drainage embedded or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1796=IFCSIMPLEPROPERTYTEMPLATE('0rl4ImHJX0Of1sD4pyCy3l',$,'PermissibleRoadLoad','Permissible traffic load for the road design.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1797=IFCPROPERTYSETTEMPLATE('3XJcXj34LB$BV7CKpeCR2i',$,'Pset_EnergyRequirements','Property set for the application of energy requirements to facility and physical elements',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionElement,IfcTransportationDevice,IfcDistributionElementType,IfcTransportationDeviceType',(#1798,#1799,#1800,#1801)); +#1798=IFCSIMPLEPROPERTYTEMPLATE('3KJfnTW3vECBUUBhHxjnjt',$,'EnergyConsumption','Annual energy consumption requirement',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); +#1799=IFCSIMPLEPROPERTYTEMPLATE('0EeefxVnzCaQP3thLJu4Fp',$,'PowerDemand','Power demand of the element',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1800=IFCSIMPLEPROPERTYTEMPLATE('0qRfZmLAX0tQJgVxMGRUCo',$,'EnergySourceLabel','Type of energy source e.g. Electricity, Diesel, LPG etc. utilised by the element.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1801=IFCSIMPLEPROPERTYTEMPLATE('1PMV04HqDBmPXsfLodZheE',$,'EnergyConversionEfficiency','Measure of the efficiency of conversion of fuel energy to mechanical energy',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#1802=IFCPROPERTYSETTEMPLATE('1kvsBq51PC38qkPQdtyxd6',$,'Pset_EngineTypeCommon','Engine type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcEngine,IfcEngineType',(#1803,#1804,#1806)); +#1803=IFCSIMPLEPROPERTYTEMPLATE('2nGBWCVtf2Me3sPxXcIwuf',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1804=IFCSIMPLEPROPERTYTEMPLATE('2TxlArg4j70O5Reg3uTmFe',$,'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',$,#1805,$,$,$,.READWRITE.); +#1805=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1806=IFCSIMPLEPROPERTYTEMPLATE('3NpB_l79P0eezIellp6gYZ',$,'EnergySource','Enumeration defining the energy source or fuel cumbusted.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1807,$,$,$,.READWRITE.); +#1807=IFCPROPERTYENUMERATION('PEnum_EngineEnergySource',(IFCLABEL('BIFUEL'),IFCLABEL('BIODIESEL'),IFCLABEL('DIESEL'),IFCLABEL('GASOLINE'),IFCLABEL('HYDROGEN'),IFCLABEL('NATURALGAS'),IFCLABEL('PROPANE'),IFCLABEL('SEWAGEGAS'),IFCLABEL('UNKNOWN'),IFCLABEL('OTHER'),IFCLABEL('UNSET')),$); +#1808=IFCPROPERTYSETTEMPLATE('2k1YxGaIL5$wFDwQDZxib_',$,'Pset_EnvironmentalCondition','Properties defining environment conditions required by the element.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#1809,#1810,#1811,#1812,#1813,#1814,#1815,#1816,#1817,#1818,#1819)); +#1809=IFCSIMPLEPROPERTYTEMPLATE('0cvfOQTkP8x9LFFmeobNBE',$,'ReferenceAirRelativeHumidity','Measurement of the ratio of water vapor in the air.',.P_BOUNDEDVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1810=IFCSIMPLEPROPERTYTEMPLATE('3nZMisef96C9$OK1kztWL5',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1811=IFCSIMPLEPROPERTYTEMPLATE('0zw8aHHbj3nRYeD2RY4423',$,'MaximumAtmosphericPressure','Maximum level of atmospheric pressure that the equipment can operate effectively in.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1812=IFCSIMPLEPROPERTYTEMPLATE('1R_F14zSX6VOdd_GD5WLZv',$,'StorageTemperatureRange','Allowed storage temperature range that the element complies with.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1813=IFCSIMPLEPROPERTYTEMPLATE('2RJ0wmVRD1wODgan3k4XIP',$,'MaximumWindSpeed','Maximum resistance to wind load exposure.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#1814=IFCSIMPLEPROPERTYTEMPLATE('2T8hv0nIr8NQCgIFV3vCP4',$,'OperationalTemperatureRange','The temperature range in which the device operates normally.\X2\000A000A\X0\Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1815=IFCSIMPLEPROPERTYTEMPLATE('1rWT4pLHH9Ph5Tn4ZY9sfe',$,'MaximumRainIntensity','Maximum level of rain intensity that the equipment can operate effectively in. It is usually measured in millimeter per hour (mm/h).',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1816=IFCSIMPLEPROPERTYTEMPLATE('1lFCW_Nof35Bh7D88ul664',$,'SaltMistLevel','Maximum level of salt mist that the equipment can operate effectively in. It is provided according to an international or national standard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1817=IFCSIMPLEPROPERTYTEMPLATE('1tiQ4n$hHFQQbBUXpnOfvX',$,'SeismicResistance','Maximum magnitude of earthquake that the equipment complies with. The value indicates earthquake intensity measured in Richter scale.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1818=IFCSIMPLEPROPERTYTEMPLATE('08rvcYKM9F6P1_VK1wcCGS',$,'SmokeLevel','Maximum level of smoke that the equipment complies with. It is provided according to an international or national standard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1819=IFCSIMPLEPROPERTYTEMPLATE('1cPNaHczvDhe3MNPMDrEbz',$,'MaximumSolarRadiation','Maximum level of solar irradiance that the equipment can operate effectively in. This is usually tested and measured by a national or international standard. The value indicates power density measured in watt per square meter (w/m2).',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#1820=IFCPROPERTYSETTEMPLATE('1FsWvs4rf0gx2$8BfDvvrJ',$,'Pset_EnvironmentalEmissions','Property set for the application of energy emissions produced by facility and physical elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionElement,IfcTransportationDevice,IfcDistributionElementType,IfcTransportationDeviceType',(#1821,#1822,#1823,#1824,#1825)); +#1821=IFCSIMPLEPROPERTYTEMPLATE('3pswOOkrjAeem3put1u2jo',$,'CarbonDioxideEmissions','Rate of emission of carbon dioxide',.P_SINGLEVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1822=IFCSIMPLEPROPERTYTEMPLATE('2HNck7HJ11oeO4OKhMRGG8',$,'SulphurDioxideEmissions','Rate of emission of sulphur dioxide',.P_SINGLEVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1823=IFCSIMPLEPROPERTYTEMPLATE('0LiL12YCf4QOz0pcEtGUeE',$,'NitrogenOxidesEmissions','Rate of emission of nitrogen oxides',.P_SINGLEVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1824=IFCSIMPLEPROPERTYTEMPLATE('1Qu_iIQ392qQ9GUTV7$UtG',$,'ParticulateMatterEmissions','Rate of emission of particulate matter',.P_SINGLEVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1825=IFCSIMPLEPROPERTYTEMPLATE('33n0Za6Zf8984dksOREqgf',$,'NoiseEmissions','Level of sound emission',.P_SINGLEVALUE.,'IfcSoundPowerLevelMeasure',$,$,$,$,$,.READWRITE.); +#1826=IFCPROPERTYSETTEMPLATE('3meYrRtlf2Af_I4dERiK0n',$,'Pset_EnvironmentalImpactIndicators','Environmental impact indicators are related to a given \X2\201C\X0\functional unit\X2\201D\X0\ (ISO 14040 concept). An example of functional unit is a "Double glazing window with PVC frame" and the unit to consider is "one square meter of opening elements filled by this product\X2\201D\X0\.\X2\000A\X0\Indicators values are valid for the whole life cycle or only a specific phase (see LifeCyclePhase property). Values of all the indicators are expressed per year according to the expected service life. The first five properties capture the characteristics of the functional unit. The following properties are related to environmental indicators.\X2\000A\X0\There is a consensus agreement international for the five one. Last ones are not yet fully and formally agreed at the international level.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#1827,#1828,#1829,#1830,#1832,#1833,#1834,#1835,#1836,#1837,#1838,#1839,#1840,#1841,#1842,#1843,#1844,#1845,#1846)); +#1827=IFCSIMPLEPROPERTYTEMPLATE('3Fn$DgpFT6JRDuCDybDSEi',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1828=IFCSIMPLEPROPERTYTEMPLATE('14uzBTpXLAEQG9hNsGdrai',$,'FunctionalUnitReference','Reference to a database or a classification',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1829=IFCSIMPLEPROPERTYTEMPLATE('3S8_cqAjj7RfjnYVLVMTJE',$,'IndicatorsUnit','The unit of the quantity the environmental indicators values are related with.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#1830=IFCSIMPLEPROPERTYTEMPLATE('2pWLtuR6XFeB$5s6o$wRSF',$,'LifeCyclePhase','The whole life cycle or only a given phase from which environmental data are valid.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1831,$,$,$,.READWRITE.); +#1831=IFCPROPERTYENUMERATION('PEnum_LifeCyclePhase',(IFCLABEL('ACQUISITION'),IFCLABEL('CRADLETOSITE'),IFCLABEL('DECONSTRUCTION'),IFCLABEL('DISPOSAL'),IFCLABEL('DISPOSALTRANSPORT'),IFCLABEL('GROWTH'),IFCLABEL('INSTALLATION'),IFCLABEL('MAINTENANCE'),IFCLABEL('MANUFACTURE'),IFCLABEL('OCCUPANCY'),IFCLABEL('OPERATION'),IFCLABEL('PROCUREMENT'),IFCLABEL('PRODUCTION'),IFCLABEL('PRODUCTIONTRANSPORT'),IFCLABEL('RECOVERY'),IFCLABEL('REFURBISHMENT'),IFCLABEL('REPAIR'),IFCLABEL('REPLACEMENT'),IFCLABEL('TRANSPORT'),IFCLABEL('USAGE'),IFCLABEL('WASTE'),IFCLABEL('WHOLELIFECYCLE'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); +#1832=IFCSIMPLEPROPERTYTEMPLATE('3Fg55OTkT5JPnEW$POfjxk',$,'ExpectedServiceLife','Expected service life in years.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#1833=IFCSIMPLEPROPERTYTEMPLATE('01uk89R218kxQK6EumiT3I',$,'TotalPrimaryEnergyConsumptionPerUnit','Quantity of energy used as defined in ISO21930:2007.',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); +#1834=IFCSIMPLEPROPERTYTEMPLATE('02C7JSjU9AQvi1YHsJl7aF',$,'WaterConsumptionPerUnit','Quantity of water used.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#1835=IFCSIMPLEPROPERTYTEMPLATE('2ks2p4hErD8QMz35pm5epb',$,'HazardousWastePerUnit','Quantity of hazardous waste generated',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1836=IFCSIMPLEPROPERTYTEMPLATE('1tUw$GZOX4_eDJQlt5txwH',$,'NonHazardousWastePerUnit','Quantity of non hazardous waste generated',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1837=IFCSIMPLEPROPERTYTEMPLATE('1slXsO5mrFq8QzX$nonnpC',$,'ClimateChangePerUnit','Quantity of greenhouse gases emitted calculated in equivalent CO2',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1838=IFCSIMPLEPROPERTYTEMPLATE('00YOwqBSz1VhjUpgWPZmQv',$,'AtmosphericAcidificationPerUnit','Quantity of gases responsible for the atmospheric acidification calculated in equivalent SO2',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1839=IFCSIMPLEPROPERTYTEMPLATE('3xtwjz4kb5tgjbtOV2cVI3',$,'RenewableEnergyConsumptionPerUnit','Quantity of renewable energy used as defined in ISO21930:2007',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); +#1840=IFCSIMPLEPROPERTYTEMPLATE('06Lmnt31HAngU_QkIRiTH1',$,'NonRenewableEnergyConsumptionPerUnit','Quantity of non-renewable energy used as defined in ISO21930:2007',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); +#1841=IFCSIMPLEPROPERTYTEMPLATE('2Vog$boFT7NfCAkHnJz5S3',$,'ResourceDepletionPerUnit','Quantity of resources used calculated in equivalent antimony',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1842=IFCSIMPLEPROPERTYTEMPLATE('1YMmeXrXn86hLzVeKhejKp',$,'InertWastePerUnit','Quantity of inert waste generated',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1843=IFCSIMPLEPROPERTYTEMPLATE('1UZtyJB556BQHRTs7CLcf0',$,'RadioactiveWastePerUnit','Quantity of radioactive waste generated',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1844=IFCSIMPLEPROPERTYTEMPLATE('2DGRK1As19vQNUU8TGO9iS',$,'StratosphericOzoneLayerDestructionPerUnit','Quantity of gases destroying the stratospheric ozone layer calculated in equivalent CFC-R11',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1845=IFCSIMPLEPROPERTYTEMPLATE('1KdlcZhs9B9fQO1T0jcpwb',$,'PhotochemicalOzoneFormationPerUnit','Quantity of gases creating the photochemical ozone calculated in equivalent ethylene',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1846=IFCSIMPLEPROPERTYTEMPLATE('0ZR9411vHEvR$QUVc2cXvc',$,'EutrophicationPerUnit','Quantity of eutrophicating compounds calculated in equivalent PO4',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1847=IFCPROPERTYSETTEMPLATE('04NLZ0vjf1jwFjBzC1Aqf0',$,'Pset_EnvironmentalImpactValues','The following properties capture environmental impact values of an element. They correspond to the indicators defined into Pset_EnvironmentalImpactIndicators.\X2\000A\X0\Environmental impact values are obtained multiplying indicator value per unit by the relevant quantity of the element.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#1848,#1849,#1850,#1851,#1852,#1853,#1854,#1855,#1856,#1857,#1858,#1859,#1860,#1861,#1862,#1863,#1864)); +#1848=IFCSIMPLEPROPERTYTEMPLATE('11Mqy4kY19rfcvKgtwE4lF',$,'TotalPrimaryEnergyConsumption','Quantity of energy used as defined in ISO21930:2007.',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); +#1849=IFCSIMPLEPROPERTYTEMPLATE('1MQpNDJbbE$940XiAc19xj',$,'WaterConsumption','Quantity of water used.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#1850=IFCSIMPLEPROPERTYTEMPLATE('3flerDyRT8sPaevC12Cq$Y',$,'HazardousWaste','Quantity of hazardous waste generated.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1851=IFCSIMPLEPROPERTYTEMPLATE('2OXphV6R9Es8P0a6eZeL6O',$,'NonHazardousWaste','Quantity of non hazardous waste generated.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1852=IFCSIMPLEPROPERTYTEMPLATE('3FMFUUHKL4dfeYw0ghIQfs',$,'ClimateChange','Quantity of greenhouse gases emitted calculated in equivalent CO2.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1853=IFCSIMPLEPROPERTYTEMPLATE('3gtMNRztX8bOS0sdZMjU9R',$,'AtmosphericAcidification','Quantity of gases responsible for the atmospheric acidification calculated in equivalent SO2.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1854=IFCSIMPLEPROPERTYTEMPLATE('1EXl4YQyT78BgzUoIFeBp$',$,'RenewableEnergyConsumption','Quantity of renewable energy used as defined in ISO21930:2007',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); +#1855=IFCSIMPLEPROPERTYTEMPLATE('16kBxxSoz5eQXCVLXlImh7',$,'NonRenewableEnergyConsumption','Quantity of non-renewable energy used as defined in ISO21930:2007',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); +#1856=IFCSIMPLEPROPERTYTEMPLATE('2wOmh08b9C19C9PdA9pv12',$,'ResourceDepletion','Quantity of resources used calculated in equivalent antimony.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1857=IFCSIMPLEPROPERTYTEMPLATE('3PZvpFeK5B2gETlbaJqWpo',$,'InertWaste','Quantity of inert waste generated .',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1858=IFCSIMPLEPROPERTYTEMPLATE('27Yn_RnuvBHwLqLSlaAW3o',$,'RadioactiveWaste','Quantity of radioactive waste generated.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1859=IFCSIMPLEPROPERTYTEMPLATE('1YsBFWhMLEfwhaosplY37Z',$,'StratosphericOzoneLayerDestruction','Quantity of gases destroying the stratospheric ozone layer calculated in equivalent CFC-R11.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1860=IFCSIMPLEPROPERTYTEMPLATE('3kP3B00xD1SfLM0GKxuK4_',$,'PhotochemicalOzoneFormation','Quantity of gases creating the photochemical ozone calculated in equivalent ethylene.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1861=IFCSIMPLEPROPERTYTEMPLATE('2rsCnXq1DB$994tsjr9MJY',$,'Eutrophication','Quantity of eutrophicating compounds calculated in equivalent PO4.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#1862=IFCSIMPLEPROPERTYTEMPLATE('24Ksrlfe18UOHCmQOeSrBf',$,'LeadInTime','Lead in time before start of process.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#1863=IFCSIMPLEPROPERTYTEMPLATE('3Zyjxg6GTEMB0EBAEE2HMg',$,'Duration','Duration.\X2\000A000A\X0\Duration of process.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#1864=IFCSIMPLEPROPERTYTEMPLATE('2mie1rHUn89e9Sw1s8P4eF',$,'LeadOutTime','Lead out time after end of process.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#1865=IFCPROPERTYSETTEMPLATE('3350SNquPC49JEYFfkcs6O',$,'Pset_EvaporativeCoolerPHistory','Evaporative cooler performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcEvaporativeCooler',(#1866,#1867,#1868,#1869,#1870)); +#1866=IFCSIMPLEPROPERTYTEMPLATE('0r3Ayws2X2SfnJz138UTn3',$,'WaterSumpTemperature','Water sump temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1867=IFCSIMPLEPROPERTYTEMPLATE('2W_TrZIbjDyxLVDznv_gnG',$,'Effectiveness','Effectiveness, represented as ratio.\X2\000A000A\X0\Ratio of the change in dry bulb temperature of the (primary) air stream to the difference between the entering dry bulb temperature of the (primary) air and the wet-bulb temperature of the (secondary) air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1868=IFCSIMPLEPROPERTYTEMPLATE('2P_tFNhrTEPQ68UME3l5Md',$,'SensibleHeatTransferRate','Sensible heat transfer rate.\X2\000A000A\X0\Sensible heat transfer rate to primary air flow.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1869=IFCSIMPLEPROPERTYTEMPLATE('0dHVsnHjT7pBYBjYH5Xh6u',$,'LatentHeatTransferRate','Latent heat transfer rate.\X2\000A000A\X0\To primary air flow.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1870=IFCSIMPLEPROPERTYTEMPLATE('1ghrWT$X12F8YrGLWFfSES',$,'TotalHeatTransferRate','Total heat transfer rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1871=IFCPROPERTYSETTEMPLATE('23oEauuV9FQBT7L67rMxQu',$,'Pset_EvaporativeCoolerTypeCommon','Evaporative cooler type common attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead. WaterRequirement attribute unit type modified in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcEvaporativeCooler,IfcEvaporativeCoolerType',(#1872,#1873,#1875,#1877,#1878,#1879,#1880,#1881,#1882)); +#1872=IFCSIMPLEPROPERTYTEMPLATE('1W98_TC4HF$93ntFw0JEVc',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1873=IFCSIMPLEPROPERTYTEMPLATE('2S6t63cbz1P83xEbrnLP72',$,'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',$,#1874,$,$,$,.READWRITE.); +#1874=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1875=IFCSIMPLEPROPERTYTEMPLATE('1BhoK8qkz0hwbLwQ58FQJp',$,'FlowArrangement','Defines the basic flow arrangements for the heat exchanger or cooler tower:COUNTERFLOW: Air and water flow enter in different directions.\X2\000A\X0\CROSSFLOW: Air and water flow are perpendicular.\X2\000A\X0\PARALLELFLOW: Air and water flow enter in same directions.\X2\000A\X0\MULTIPASS: Multipass flow heat exchanger arrangement. \X2\000A\X0\OTHER: Other type of heat exchanger flow arrangement not defined above.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1876,$,$,$,.READWRITE.); +#1876=IFCPROPERTYENUMERATION('PEnum_EvaporativeCoolerFlowArrangement',(IFCLABEL('COUNTERFLOW'),IFCLABEL('CROSSFLOW'),IFCLABEL('PARALLELFLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1877=IFCSIMPLEPROPERTYTEMPLATE('1Y0qpGuInF3v2bHHXVKb9Q',$,'HeatExchangeArea','Heat exchange area.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#1878=IFCSIMPLEPROPERTYTEMPLATE('1LCAWBnBLBpQxJOJ4gj665',$,'OperationTemperatureRange','Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1879=IFCSIMPLEPROPERTYTEMPLATE('0ArB51O8b1ThR3ysLMdQCP',$,'WaterRequirement','Make-up water requirement.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1880=IFCSIMPLEPROPERTYTEMPLATE('2EqEAuVlz9PArS23MzXDvk',$,'EffectivenessTable','Total heat transfer effectiveness curve as a function of the primary air flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcReal',$,$,$,$,.READWRITE.); +#1881=IFCSIMPLEPROPERTYTEMPLATE('3B6Qs2eb973PiuHWRCadIG',$,'AirPressureDropCurve','Air pressure drop as a function of air flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#1882=IFCSIMPLEPROPERTYTEMPLATE('0SVY7ITe9Bd9$$whXuZdnM',$,'WaterPressDropCurve','Water pressure drop as function of water flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#1883=IFCPROPERTYSETTEMPLATE('1JP92ulZ199eB9$7QvEcqX',$,'Pset_EvaporatorPHistory','Evaporator performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcEvaporator',(#1884,#1885,#1886,#1887,#1888,#1889,#1890,#1891,#1892,#1893,#1894)); +#1884=IFCSIMPLEPROPERTYTEMPLATE('1MkyRru$z2mxcfmXfyEcYy',$,'HeatRejectionRate','Sum of the refrigeration effect and the heat equivalent of the power input to the compressor.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1885=IFCSIMPLEPROPERTYTEMPLATE('3lce58eMTBPeLSkhNDnYiA',$,'ExteriorHeatTransferCoefficient','Exterior heat transfer coefficient associated with exterior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1886=IFCSIMPLEPROPERTYTEMPLATE('1e_wH8j9XDyvI8XNpF9QF5',$,'InteriorHeatTransferCoefficient','Interior heat transfer coefficient associated with interior surface area.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1887=IFCSIMPLEPROPERTYTEMPLATE('0lJly8Kwf2MvrQMKKi3ZI5',$,'RefrigerantFoulingResistance','Fouling resistance on the refrigerant side.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1888=IFCSIMPLEPROPERTYTEMPLATE('2f2jWF3w96rg$pktDpMMj3',$,'EvaporatingTemperature','Refrigerant evaporating temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1889=IFCSIMPLEPROPERTYTEMPLATE('1gxcMvCqP4Jxx7uTv0_eUT',$,'LogarithmicMeanTemperatureDifference','Logarithmic mean temperature difference between refrigerant and water or air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1890=IFCSIMPLEPROPERTYTEMPLATE('1EJv2L4wH5Aunw_okYEjs4',$,'UAcurves','UV = f (VExterior, VInterior), UV as a function of interior and exterior fluid flow velocity at the entrance.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1891=IFCSIMPLEPROPERTYTEMPLATE('07JA555qnCDPGaEqZ8dLEH',$,'CompressorEvaporatorHeatGain','Heat gain between the evaporator outlet and the compressor inlet.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1892=IFCSIMPLEPROPERTYTEMPLATE('0VQKeYO3XErRQZsvYaUL9Q',$,'CompressorEvaporatorPressureDrop','Pressure drop between the evaporator outlet and the compressor inlet.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1893=IFCSIMPLEPROPERTYTEMPLATE('0g1sYOqvT3E9r9deIhqRpE',$,'EvaporatorMeanVoidFraction','Mean void fraction in evaporator.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1894=IFCSIMPLEPROPERTYTEMPLATE('26CbHFz$H47Q9q8v$ti2iE',$,'WaterFoulingResistance','Fouling resistance on water/air side.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1895=IFCPROPERTYSETTEMPLATE('0rA7HYeT58KxGQ6juDh7HI',$,'Pset_EvaporatorTypeCommon','Evaporator type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcEvaporator,IfcEvaporatorType',(#1896,#1897,#1899,#1901,#1903,#1905,#1906,#1907,#1908,#1909,#1910)); +#1896=IFCSIMPLEPROPERTYTEMPLATE('3ueKnC_ZLDJxKnp3WSE7qo',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1897=IFCSIMPLEPROPERTYTEMPLATE('1mwq2BjWH1LhhM2wXC7KZn',$,'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',$,#1898,$,$,$,.READWRITE.); +#1898=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1899=IFCSIMPLEPROPERTYTEMPLATE('0zzxSvWy524wwWseeqj9Dq',$,'EvaporatorMediumType','ColdLiquid: Evaporator is using liquid type of fluid to exchange heat with refrigerant.\X2\000A\X0\ColdAir: Evaporator is using air to exchange heat with refrigerant.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1900,$,$,$,.READWRITE.); +#1900=IFCPROPERTYENUMERATION('PEnum_EvaporatorMediumType',(IFCLABEL('COLDAIR'),IFCLABEL('COLDLIQUID'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1901=IFCSIMPLEPROPERTYTEMPLATE('2rMupPQ7z2ZP3wFJ4wTgcu',$,'EvaporatorCoolant','The fluid used for the coolant in the evaporator.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1902,$,$,$,.READWRITE.); +#1902=IFCPROPERTYENUMERATION('PEnum_EvaporatorCoolant',(IFCLABEL('BRINE'),IFCLABEL('GLYCOL'),IFCLABEL('WATER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1903=IFCSIMPLEPROPERTYTEMPLATE('0ZWJCmwYj2gQr9h1ZMHUtr',$,'RefrigerantClass','Refrigerant class used by the object.\X2\000A\X0\CFC: Chlorofluorocarbons.\X2\000A\X0\HCFC: Hydrochlorofluorocarbons.\X2\000A\X0\HFC: Hydrofluorocarbons.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1904,$,$,$,.READWRITE.); +#1904=IFCPROPERTYENUMERATION('PEnum_RefrigerantClass',(IFCLABEL('AMMONIA'),IFCLABEL('CFC'),IFCLABEL('CO2'),IFCLABEL('H2O'),IFCLABEL('HCFC'),IFCLABEL('HFC'),IFCLABEL('HYDROCARBONS'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1905=IFCSIMPLEPROPERTYTEMPLATE('0f_8hQMBj7D9HWtQvOa2Fu',$,'ExternalSurfaceArea','External surface area (both primary and secondary area).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#1906=IFCSIMPLEPROPERTYTEMPLATE('0Gu5JGnf9A7Ai2njxLUVqr',$,'InternalSurfaceArea','Internal surface area.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#1907=IFCSIMPLEPROPERTYTEMPLATE('1MNiMF0GP4jPioxY65c6of',$,'InternalRefrigerantVolume','Internal volume of object (refrigerant side).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#1908=IFCSIMPLEPROPERTYTEMPLATE('1hASADmQP4fhxPorimyCUt',$,'InternalWaterVolume','Internal volume of object (water side).',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#1909=IFCSIMPLEPROPERTYTEMPLATE('3uc762Af9BSBtEYc2HxHWa',$,'NominalHeatTransferArea','Nominal heat transfer surface area associated with nominal overall heat transfer coefficient.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#1910=IFCSIMPLEPROPERTYTEMPLATE('0YLIkqzCP3cxyKWMkAi1j2',$,'NominalHeatTransferCoefficient','Nominal overall heat transfer coefficient associated with nominal heat transfer area.',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#1911=IFCPROPERTYSETTEMPLATE('2Vva1A6NT1K8vVEFRM3ypT',$,'Pset_FanCentrifugal','Centrifugal fan occurrence attributes attached to an instance of IfcFan.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFan/CENTRIFUGALAIRFOIL,IfcFan/CENTRIFUGALBACKWARDINCLINEDCURVED,IfcFan/CENTRIFUGALFORWARDCURVED,IfcFan/CENTRIFUGALRADIAL,IfcFanType/CENTRIFUGALAIRFOIL,IfcFanType/CENTRIFUGALBACKWARDINCLINEDCURVED,IfcFanType/CENTRIFUGALFORWARDCURVED,IfcFanType/CENTRIFUGALRADIAL',(#1912,#1914,#1916)); +#1912=IFCSIMPLEPROPERTYTEMPLATE('1kSAfZNQH18R5ddOGWhz9Z',$,'DischargePosition','Centrifugal fan discharge position.TOPHORIZONTAL: Top horizontal discharge.\X2\000A\X0\TOPANGULARDOWN: Top angular down discharge.\X2\000A\X0\DOWNBLAST: Downblast discharge.\X2\000A\X0\BOTTOMANGULARDOWN: Bottom angular down discharge.\X2\000A\X0\BOTTOMHORIZONTAL: Bottom horizontal discharge.\X2\000A\X0\BOTTOMANGULARUP: Bottom angular up discharge.\X2\000A\X0\UPBLAST: Upblast discharge.\X2\000A\X0\TOPANGULARUP: Top angular up discharge.\X2\000A\X0\OTHER: Other type of fan arrangement.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1913,$,$,$,.READWRITE.); +#1913=IFCPROPERTYENUMERATION('PEnum_CentrifugalFanDischargePosition',(IFCLABEL('BOTTOMANGULARDOWN'),IFCLABEL('BOTTOMANGULARUP'),IFCLABEL('BOTTOMHORIZONTAL'),IFCLABEL('DOWNBLAST'),IFCLABEL('TOPANGULARDOWN'),IFCLABEL('TOPANGULARUP'),IFCLABEL('TOPHORIZONTAL'),IFCLABEL('UPBLAST'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1914=IFCSIMPLEPROPERTYTEMPLATE('2Nkfi13HXBT92trJvgSHmp',$,'DirectionOfRotation','The direction of the centrifugal fan wheel rotation when viewed from the drive side of the fan.CLOCKWISE: Clockwise.\X2\000A\X0\COUNTERCLOCKWISE: Counter-clockwise.\X2\000A\X0\OTHER: Other type of fan rotation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1915,$,$,$,.READWRITE.); +#1915=IFCPROPERTYENUMERATION('PEnum_CentrifugalFanRotation',(IFCLABEL('CLOCKWISE'),IFCLABEL('COUNTERCLOCKWISE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1916=IFCSIMPLEPROPERTYTEMPLATE('2vJrZPbM9BL87Dgwn85VIz',$,'FanArrangement','Defines the fan and motor drive arrangement as defined by AMCA.ARRANGEMENT1: Arrangement 1.\X2\000A\X0\ARRANGEMENT2: Arrangement 2.\X2\000A\X0\ARRANGEMENT3: Arrangement 3.\X2\000A\X0\ARRANGEMENT4: Arrangement 4.\X2\000A\X0\ARRANGEMENT7: Arrangement 7.\X2\000A\X0\ARRANGEMENT8: Arrangement 8.\X2\000A\X0\ARRANGEMENT9: Arrangement 9.\X2\000A\X0\ARRANGEMENT10: Arrangement 10.\X2\000A\X0\OTHER: Other type of fan drive arrangement.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1917,$,$,$,.READWRITE.); +#1917=IFCPROPERTYENUMERATION('PEnum_CentrifugalFanArrangement',(IFCLABEL('ARRANGEMENT1'),IFCLABEL('ARRANGEMENT10'),IFCLABEL('ARRANGEMENT2'),IFCLABEL('ARRANGEMENT3'),IFCLABEL('ARRANGEMENT4'),IFCLABEL('ARRANGEMENT7'),IFCLABEL('ARRANGEMENT8'),IFCLABEL('ARRANGEMENT9'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1918=IFCPROPERTYSETTEMPLATE('3bdH28BS184RZt58kQ0b3I',$,'Pset_FanOccurrence','Fan occurrence attributes attached to an instance of IfcFan.',.PSET_OCCURRENCEDRIVEN.,'IfcFan',(#1919,#1921,#1923,#1925,#1927,#1929,#1930)); +#1919=IFCSIMPLEPROPERTYTEMPLATE('0KUdEnjQb7ZO63n9s9iCRu',$,'DischargeType','Defines the type of connection at the fan discharge.Duct: Discharge into ductwork.\X2\000A\X0\Screen: Discharge into screen outlet.\X2\000A\X0\Louver: Discharge into a louver.\X2\000A\X0\Damper: Discharge into a damper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1920,$,$,$,.READWRITE.); +#1920=IFCPROPERTYENUMERATION('PEnum_FanDischargeType',(IFCLABEL('DAMPER'),IFCLABEL('DUCT'),IFCLABEL('LOUVER'),IFCLABEL('SCREEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1921=IFCSIMPLEPROPERTYTEMPLATE('1atzczalr3bezD1jlLxv_R',$,'ApplicationOfFan','The functional application of the fan.SupplyAir: Supply air fan.\X2\000A\X0\ReturnAir: Return air fan.\X2\000A\X0\ExhaustAir: Exhaust air fan.\X2\000A\X0\Other: Other type of application not defined above.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1922,$,$,$,.READWRITE.); +#1922=IFCPROPERTYENUMERATION('PEnum_FanApplicationType',(IFCLABEL('COOLINGTOWER'),IFCLABEL('EXHAUSTAIR'),IFCLABEL('RETURNAIR'),IFCLABEL('SUPPLYAIR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1923=IFCSIMPLEPROPERTYTEMPLATE('2eaqGCGYf9_AfcH2qtPoe8',$,'CoilPosition','Defines the relationship between a fan and a coil.DrawThrough: Fan located downstream of the coil.\X2\000A\X0\BlowThrough: Fan located upstream of the coil.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1924,$,$,$,.READWRITE.); +#1924=IFCPROPERTYENUMERATION('PEnum_FanCoilPosition',(IFCLABEL('BLOWTHROUGH'),IFCLABEL('DRAWTHROUGH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1925=IFCSIMPLEPROPERTYTEMPLATE('2hEbHhD0H1K9FPGaBc5pt0',$,'MotorPosition','Defines the location of the motor relative to the air stream.InAirStream: Fan motor is in the air stream.\X2\000A\X0\OutOfAirStream: Fan motor is out of the air stream.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1926,$,$,$,.READWRITE.); +#1926=IFCPROPERTYENUMERATION('PEnum_FanMotorPosition',(IFCLABEL('INAIRSTREAM'),IFCLABEL('OUTOFAIRSTREAM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1927=IFCSIMPLEPROPERTYTEMPLATE('3RutRnnSn5SfS09HVMz1Fi',$,'FanMountingType','Defines the method of mounting the fan in the building.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1928,$,$,$,.READWRITE.); +#1928=IFCPROPERTYENUMERATION('PEnum_FanMountingType',(IFCLABEL('CONCRETEPAD'),IFCLABEL('DUCTMOUNTED'),IFCLABEL('FIELDERECTEDCURB'),IFCLABEL('MANUFACTUREDCURB'),IFCLABEL('SUSPENDED'),IFCLABEL('WALLMOUNTED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1929=IFCSIMPLEPROPERTYTEMPLATE('3pHgqtVFzAQBud6AgHuWRG',$,'FractionOfMotorHeatToAirStream','Fraction of the motor heat released into the fluid flow.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#1930=IFCSIMPLEPROPERTYTEMPLATE('3SwaoJA9nF4f86VIe8KnXS',$,'ImpellerDiameter','Diameter of object - used to scale performance of geometrically similar objects.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1931=IFCPROPERTYSETTEMPLATE('04_6NxFDH4RQXb3fQ2R3pB',$,'Pset_FanPHistory','Fan performance history attributes.IFC2X2 CHANGE Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcFan',(#1932,#1933,#1934,#1935,#1936,#1937,#1938,#1939,#1940)); +#1932=IFCSIMPLEPROPERTYTEMPLATE('3jgQLTo19EuOIzs83jxbew',$,'FanRotationSpeed','Fan rotation speed.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1933=IFCSIMPLEPROPERTYTEMPLATE('2H0$zLRarEfQPh5UVlgMWz',$,'WheelTipSpeed','Fan blade tip speed, typically defined as the linear speed of the tip of the fan blade furthest from the shaft.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1934=IFCSIMPLEPROPERTYTEMPLATE('1hrDcdW6HA2OJapVjmBIhO',$,'FanEfficiency','Fan mechanical efficiency.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1935=IFCSIMPLEPROPERTYTEMPLATE('0O9JOSfbv2zvlzxgX6trnE',$,'OverallEfficiency','Total efficiency of object.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1936=IFCSIMPLEPROPERTYTEMPLATE('2w9ONCky98CQUD29vCc2SN',$,'FanPowerRate','Fan power consumption.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1937=IFCSIMPLEPROPERTYTEMPLATE('1Dk$5eADz3kwUBMJUeCwOL',$,'ShaftPowerRate','Fan shaft power.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1938=IFCSIMPLEPROPERTYTEMPLATE('2zEUK$xnbC3Q4ewuevwHqi',$,'DischargeVelocity','The speed at which air discharges from the fan through the fan housing discharge opening.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1939=IFCSIMPLEPROPERTYTEMPLATE('0OCwMaGgH8HBeH6Gex2sq8',$,'DischargePressureLoss','Fan discharge pressure loss associated with the discharge arrangement.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1940=IFCSIMPLEPROPERTYTEMPLATE('0AtghS2uT5j8c7CUU1jS$C',$,'DrivePowerLoss','Fan drive power losses associated with the type of connection between the motor and the fan wheel.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#1941=IFCPROPERTYSETTEMPLATE('3e_unfBDz2awUzUcsP8G8Z',$,'Pset_FanTypeCommon','Fan type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFan,IfcFanType',(#1942,#1943,#1945,#1947,#1949,#1950,#1951,#1952,#1953,#1954,#1955,#1956,#1957)); +#1942=IFCSIMPLEPROPERTYTEMPLATE('2nkDgksfj7nePgn9ZckIca',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#1943=IFCSIMPLEPROPERTYTEMPLATE('38gDA8mhL2ZhEwZrjzBVQV',$,'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',$,#1944,$,$,$,.READWRITE.); +#1944=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1945=IFCSIMPLEPROPERTYTEMPLATE('0DTVfxtFHBJvBSZh4XaYdm',$,'MotorDriveType','Motor drive type:\X2\000A\X0\DIRECTDRIVE: Direct drive.\X2\000A\X0\BELTDRIVE: Belt drive.\X2\000A\X0\COUPLING: Coupling.\X2\000A\X0\OTHER: Other type of motor drive.\X2\000A\X0\UNKNOWN: Unknown motor drive type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1946,$,$,$,.READWRITE.); +#1946=IFCPROPERTYENUMERATION('PEnum_FanMotorConnectionType',(IFCLABEL('BELTDRIVE'),IFCLABEL('COUPLING'),IFCLABEL('DIRECTDRIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1947=IFCSIMPLEPROPERTYTEMPLATE('2EO_A3Fpb7kPMfgVyIgj2H',$,'CapacityControlType','InletVane: Control by adjusting inlet vane.\X2\000A\X0\VariableSpeedDrive: Control by variable speed drive.\X2\000A\X0\BladePitchAngle: Control by adjusting blade pitch angle.\X2\000A\X0\TwoSpeed: Control by switch between high and low speed.\X2\000A\X0\DischargeDamper: Control by modulating discharge damper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1948,$,$,$,.READWRITE.); +#1948=IFCPROPERTYENUMERATION('PEnum_FanCapacityControlType',(IFCLABEL('BLADEPITCHANGLE'),IFCLABEL('DISCHARGEDAMPER'),IFCLABEL('INLETVANE'),IFCLABEL('TWOSPEED'),IFCLABEL('VARIABLESPEEDDRIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1949=IFCSIMPLEPROPERTYTEMPLATE('2kvKQ7FXvFTeuoIPxL8YH1',$,'OperationTemperatureRange','Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1950=IFCSIMPLEPROPERTYTEMPLATE('19aC07GFHA2xUNOwNG2ODC',$,'NominalAirFlowRate','Nominal air flow rate.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#1951=IFCSIMPLEPROPERTYTEMPLATE('2Ckxzhm650bgxolr4_JeCS',$,'NominalTotalPressure','Nominal total pressure rise across the fan.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1952=IFCSIMPLEPROPERTYTEMPLATE('1q1cXk1X1D8BomMb9UEZRQ',$,'NominalStaticPressure','The static pressure within the air stream that the fan must overcome to insure designed circulation of air.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#1953=IFCSIMPLEPROPERTYTEMPLATE('1jSO3ny_T29AgISU22Rtdz',$,'NominalRotationSpeed','Rotational speed of the object under nominal conditions.\X2\000A000A\X0\Nominal fan wheel speed.',.P_SINGLEVALUE.,'IfcRotationalFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#1954=IFCSIMPLEPROPERTYTEMPLATE('0U5O31wvzEWRpQetTPDVJV',$,'NominalPowerRate','Nominal fan power rate.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#1955=IFCSIMPLEPROPERTYTEMPLATE('3cloBUcunEu91$ks3nqs$j',$,'OperationalCriteria','Time of operation at maximum operational ambient air temperature.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#1956=IFCSIMPLEPROPERTYTEMPLATE('0U6zzwtb56phjUjkR2QbJ3',$,'PressureCurve','Pressure rise = f (flow rate).',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#1957=IFCSIMPLEPROPERTYTEMPLATE('2v4Nd6l4j13AezmUPf1NlL',$,'EfficiencyCurve','Fan efficiency =f (flow rate).',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); +#1958=IFCPROPERTYSETTEMPLATE('0zpccvgjn3oxVEbvYCK$hC',$,'Pset_FastenerRailWeld','Properties of Welded rail joint used in railway. The property set can be used by the predefined type WELD of IfcFastener.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFastener/WELD,IfcFastenerType/WELD',(#1959,#1960,#1961,#1963)); +#1959=IFCSIMPLEPROPERTYTEMPLATE('3Upe5ks3n6G9Ldplhz$7N$',$,'IsLiftingBracket','Indicates whether the connection is done between rail with different height (TRUE) or with same height (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1960=IFCSIMPLEPROPERTYTEMPLATE('22CBRDhhrAHQv2KSvlllEw',$,'TemperatureDuringInstallation','Normalised working temperature.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#1961=IFCSIMPLEPROPERTYTEMPLATE('0Ooe241DP3pPormuLDt2cU',$,'JointRelativePosition','Indicates the relative position of the joint, which lies in the left or right rail or in the middle, or in combination. The left rail is to the left as facing in the direction of increasing stationing values, and the right rail is to the right.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1962,$,$,$,.READWRITE.); +#1962=IFCPROPERTYENUMERATION('PEnum_RelativePosition',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1963=IFCSIMPLEPROPERTYTEMPLATE('3CStajacf7UBP3d$uq3fYr',$,'AssemblyPlace','Enumeration defining where the assembly is intended to take place, either in a factory, other offsite location or on the building site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1964,$,$,$,.READWRITE.); +#1964=IFCPROPERTYENUMERATION('PEnum_AssemblyPlace',(IFCLABEL('FACTORY'),IFCLABEL('OFFSITE'),IFCLABEL('SITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#1965=IFCPROPERTYSETTEMPLATE('35ipstEPj2Rxo4aAUoeGpv',$,'Pset_FastenerWeld','Properties related to welded connections.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFastener/WELD,IfcFastenerType/WELD',(#1966,#1967,#1968,#1969,#1970,#1971,#1972,#1973,#1974,#1975,#1976,#1977,#1978,#1979,#1980,#1981)); +#1966=IFCSIMPLEPROPERTYTEMPLATE('06Lzfe$UjDfeniPbY$4J11',$,'Type1','Type of weld seam according to ISO 2553. Note, combined welds are given by two corresponding symbols in the direction of the normal axis of the coordinate system. For example, an X weld is specified by Type1 = ''V'' and Type2 = ''V''.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1967=IFCSIMPLEPROPERTYTEMPLATE('0frMBEAmvF_fHQKC$BwzQn',$,'Type2','See Type1.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1968=IFCSIMPLEPROPERTYTEMPLATE('1Q_1P7dVzDk9$FeZ8kGFJP',$,'Surface1','Aspect of weld seam surface, i.e. ''plane'', ''curved'' or ''hollow''. Combined welds are given by two corresponding symbols analogous to Type1 and Type2.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1969=IFCSIMPLEPROPERTYTEMPLATE('14hwLeMxbDzg$oNMErehVx',$,'Surface2','See Surface1.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1970=IFCSIMPLEPROPERTYTEMPLATE('1EpzPXcSzFngmAJZX8koMc',$,'Process','Reference number of the welding process according to ISO 4063, an up to three digits long code',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#1971=IFCSIMPLEPROPERTYTEMPLATE('2PD_PPgBr6i8tvuwV4gdQd',$,'ProcessName','Name of the welding process. Alternative to the numeric Process property.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#1972=IFCSIMPLEPROPERTYTEMPLATE('2zHYeHXKD62v3_Rgp8tnoI',$,'NominalThroatThickness','Design value of the height of the largest isosceles triangle that can be inscribed in the section of a fillet weld.REFERENCE Symbol a according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1973=IFCSIMPLEPROPERTYTEMPLATE('2yjqyluKzBQwmKf5gb2MzM',$,'WeldWidth','Required elongated hole width at the faying surface or seam weld width at the faying surface.REFERENCE Symbol c according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1974=IFCSIMPLEPROPERTYTEMPLATE('3VQ8GwC0nAou8Q75B8odiP',$,'WeldDiameter','Dimension of the required hole diameter at the faying surface, or required spot weld diameter at the faying surface, or required stud diameter.REFERENCE Symbol d according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1975=IFCSIMPLEPROPERTYTEMPLATE('0kvbuUplz7C88MDP58osXO',$,'WeldElementSpacing','Spacing between weld elements (centre to centre)REFERENCE Symbol e according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1976=IFCSIMPLEPROPERTYTEMPLATE('0F3xSd3LXBdg$u3pUANFf4',$,'WeldElementLength','Length of each weld element.REFERENCE Symbol l according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1977=IFCSIMPLEPROPERTYTEMPLATE('32CqU3b7DF4gBorXDBsNUT',$,'NumberOfWeldElements','Number of weld elements.REFERENCE Symbol n according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#1978=IFCSIMPLEPROPERTYTEMPLATE('0NqQHKTG9AY9mkmGRhrvCm',$,'DeepPenetrationThroatThickness','Nominal throat thickness or effective throat thickness to which a certain amount of fusion penetration is added.REFERENCE Symbol s according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1979=IFCSIMPLEPROPERTYTEMPLATE('3QTP_KeYPCuhIq$dawL1a0',$,'WeldLegLength','Distance from the actual or projected intersection of the fusion faces and the toe of a fillet weld, measured across the fusion face.REFERENCE Symbol z according to ISO 2553:2019.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#1980=IFCSIMPLEPROPERTYTEMPLATE('0PhWl$Gvn60eRrlbTMKnwK',$,'Intermittent','If fillet weld, intermittent or not',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1981=IFCSIMPLEPROPERTYTEMPLATE('2yt0YxsrDBiAy4ekFnrnHx',$,'Staggered','If intermittent weld, staggered or not',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#1982=IFCPROPERTYSETTEMPLATE('0FLRH__T9Ew8smVD$svort',$,'Pset_FenderCommon','Properties common to the definition of all occurrences of IfcImpactProtectionDevice and types of IfcImpactProtectionDeviceType with the predefined type set to FENDER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcImpactProtectionDevice/FENDER,IfcImpactProtectionDeviceType/FENDER',(#1983,#1985,#1986,#1987,#1988,#1989,#1990,#1991,#1992,#1993)); +#1983=IFCSIMPLEPROPERTYTEMPLATE('2tp81hX_f7t8MCkN0Wq1uS',$,'FenderType','The type of fender',.P_ENUMERATEDVALUE.,'IfcLabel',$,#1984,$,$,$,.READWRITE.); +#1984=IFCPROPERTYENUMERATION('PEnum_FenderType',(IFCLABEL('ARCH'),IFCLABEL('CELL'),IFCLABEL('CONE'),IFCLABEL('CYLINDER'),IFCLABEL('PNEUMATIC')),$); +#1985=IFCSIMPLEPROPERTYTEMPLATE('3JfLc0VL91guzHI0NbsI$z',$,'CoefficientOfFriction','Coefficient of friction value for the fender',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1986=IFCSIMPLEPROPERTYTEMPLATE('0bP6wI9zH40O6vDoEA64uS',$,'EnergyAbsorptionTolerance','Manufacturing tolerance on energy absorption',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1987=IFCSIMPLEPROPERTYTEMPLATE('0cvEWM2or4Zx38OVW02b$E',$,'MaxReactionTolerance','Manufacturing tolerance on maximum reaction at fender support.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1988=IFCSIMPLEPROPERTYTEMPLATE('05enMRokH2vwqaEa6uqWX1',$,'MaximumTemperatureFactor','Deviation in performance due to maximum design temperature',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1989=IFCSIMPLEPROPERTYTEMPLATE('0EshjjgefF9OybiBvfWNz0',$,'MinimumTemperatureFactor','Deviation in performance due to minimum design temperature',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1990=IFCSIMPLEPROPERTYTEMPLATE('28oa6$Uhf8ERY4wlxkqIET',$,'VelocityFactorEnergy','Deviation in energy absorption performance due to strain rate',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1991=IFCSIMPLEPROPERTYTEMPLATE('0SEEwBkhL9LQ2qwchlEbpz',$,'VelocityFactorReaction','Deviation in reaction due to strain rate',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1992=IFCSIMPLEPROPERTYTEMPLATE('14iHnGy1n6JBX7M8z6ob6j',$,'EnergyAbsorption','Energy absorption capacity of the element.',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); +#1993=IFCSIMPLEPROPERTYTEMPLATE('1CYePoxM59SQ5SM5HrQTwI',$,'MaxReaction','Maximum reaction from the element',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#1994=IFCPROPERTYSETTEMPLATE('2W0opSCD53cAPw_9fCz8uO',$,'Pset_FenderDesignCriteria','Properties common to the definition of design criteria of all occurrences of IfcImpactProtectionDevice and types of IfcImpactProtectionDeviceType with the predefined type set to FENDER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpace/BERTH,IfcSpaceType/BERTH',(#1995,#1996,#1997,#1998,#1999,#2000,#2001,#2002,#2003,#2004,#2005)); +#1995=IFCSIMPLEPROPERTYTEMPLATE('1Ew8fXKUXAwv2dL1_r2COV',$,'CoefficientOfFriction','Coefficient of friction value for the fender',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1996=IFCSIMPLEPROPERTYTEMPLATE('23P368VqDFkgEt0i3T7Fb5',$,'EnergyAbsorptionTolerance','Manufacturing tolerance on energy absorption',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1997=IFCSIMPLEPROPERTYTEMPLATE('1EBNqxtaH378d2NMeH75W5',$,'MaxReactionTolerance','Manufacturing tolerance on maximum reaction at fender support.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1998=IFCSIMPLEPROPERTYTEMPLATE('0$oX0nFU52J8qnJW0Hqqh8',$,'MaximumTemperatureFactor','Deviation in performance due to maximum design temperature',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#1999=IFCSIMPLEPROPERTYTEMPLATE('08aoOZIk17qv140yS_rYXV',$,'MinimumTemperatureFactor','Deviation in performance due to minimum design temperature',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2000=IFCSIMPLEPROPERTYTEMPLATE('0bzvPjfXP36xjLb7T2tQ$T',$,'VelocityFactorEnergy','Deviation in energy absorption performance due to strain rate',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2001=IFCSIMPLEPROPERTYTEMPLATE('2JhfA5OWn479AQ2MPNPttt',$,'VelocityFactorReaction','Deviation in reaction due to strain rate',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2002=IFCSIMPLEPROPERTYTEMPLATE('3w9UZGtZT4mPSdNHbz4xWx',$,'EnergyAbsorption','Energy absorption capacity of the element.',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); +#2003=IFCSIMPLEPROPERTYTEMPLATE('2K9vL62w1FqO$_pwUj99aR',$,'MaxReaction','Maximum reaction from the element',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#2004=IFCSIMPLEPROPERTYTEMPLATE('1AN_YAZUL6_udIRZrSaEY2',$,'MinCompressedFenderHeight','Minimum height required for a compressed fender to prevent vessels striking the structure',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2005=IFCSIMPLEPROPERTYTEMPLATE('1ve95UBeLD_fDzpX2_maxS',$,'AddedMassCoefficientMethod','Method used to determine the Added Mass Coefficient used for design',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2006,$,$,$,.READWRITE.); +#2006=IFCPROPERTYENUMERATION('PEnum_AddedMassCoefficientMethod',(IFCLABEL('PIANC'),IFCLABEL('SHIGERU_UEDA'),IFCLABEL('VASCO_COSTA')),$); +#2007=IFCPROPERTYSETTEMPLATE('3ENf_xq719AguXa9Ojkot2',$,'Pset_FilterPHistory','Filter performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcFilter',(#2008,#2009,#2010)); +#2008=IFCSIMPLEPROPERTYTEMPLATE('2viyIk$Z1DmhohhexjT9bl',$,'CountedEfficiency','Filter efficiency based the particle counts concentration before and after filter against particles with certain size distribution.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2009=IFCSIMPLEPROPERTYTEMPLATE('1S1trnqc9DAg5ujfc_EL$f',$,'WeightedEfficiency','Filter efficiency based the particle weight concentration before and after filter against particles with certain size distribution.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2010=IFCSIMPLEPROPERTYTEMPLATE('2mMhLmpw906hrFxfoA0025',$,'ParticleMassHolding','Mass of particle holding in the filter.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2011=IFCPROPERTYSETTEMPLATE('3YDdFr8RTDY8IwB7$bfm4C',$,'Pset_FilterTypeAirParticleFilter','Air particle filter type attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFilter/AIRPARTICLEFILTER,IfcFilterType/AIRPARTICLEFILTER',(#2012,#2014,#2015,#2017,#2018,#2019,#2020,#2021,#2022,#2023,#2024)); +#2012=IFCSIMPLEPROPERTYTEMPLATE('34BOfHao1BYhqaR7VTRGD9',$,'AirParticleFilterType','A panel dry type extended surface filter is a dry-type air filter with random fiber mats or blankets in the forms of pockets, V-shaped or radial pleats, and include the following:CoarseFilter: Filter with a efficiency lower than 30% for atmosphere dust-spot.\X2\000A\X0\CoarseMetalScreen: Filter made of metal screen.\X2\000A\X0\CoarseCellFoams: Filter made of cell foams.\X2\000A\X0\CoarseSpunGlass: Filter made of spun glass.\X2\000A\X0\MediumFilter: Filter with an efficiency between 30-98% for atmosphere dust-spot.\X2\000A\X0\MediumElectretFilter: Filter with fine electret synthetic fibers.\X2\000A\X0\MediumNaturalFiberFilter: Filter with natural fibers.\X2\000A\X0\HEPAFilter: High efficiency particulate air filter.\X2\000A\X0\ULPAFilter: Ultra low penetration air filter.\X2\000A\X0\MembraneFilters: Filter made of membrane for certain pore diameters in flat sheet and pleated form.\X2\000A\X0\A renewable media with a moving curtain viscous filter are random-fiber media coated with viscous substance in roll form or curtain where fresh media is fed across the face of the filter and the dirty media is rewound onto a roll at the bottom or to into a reservoir:\X2\000A\X0\RollForm: Viscous filter used in roll form.\X2\000A\X0\AdhesiveReservoir: Viscous filter used in moving curtain form.\X2\000A\X0\A renewable moving curtain dry media filter is a random-fiber dry media of relatively high porosity used in moving-curtain(roll) filters.\X2\000A\X0\An electrical filter uses electrostatic precipitation to remove and collect particulate contaminants.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2013,$,$,$,.READWRITE.); +#2013=IFCPROPERTYENUMERATION('PEnum_FilterAirParticleFilterType',(IFCLABEL('ADHESIVERESERVOIR'),IFCLABEL('COARSECELLFOAMS'),IFCLABEL('COARSEMETALSCREEN'),IFCLABEL('COARSESPUNGLASS'),IFCLABEL('ELECTRICALFILTER'),IFCLABEL('HEPAFILTER'),IFCLABEL('MEDIUMELECTRETFILTER'),IFCLABEL('MEDIUMNATURALFIBERFILTER'),IFCLABEL('MEMBRANEFILTERS'),IFCLABEL('RENEWABLEMOVINGCURTIANDRYMEDIAFILTER'),IFCLABEL('ROLLFORM'),IFCLABEL('ULPAFILTER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2014=IFCSIMPLEPROPERTYTEMPLATE('3QpM9mfDjCeQnib2jy74hV',$,'FrameMaterial','Filter frame material.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#2015=IFCSIMPLEPROPERTYTEMPLATE('3ViNfD3Oj4tuNq24b2XsNZ',$,'SeparationType','Air particulate filter media separation type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2016,$,$,$,.READWRITE.); +#2016=IFCPROPERTYENUMERATION('PEnum_FilterAirParticleFilterSeparationType',(IFCLABEL('BAG'),IFCLABEL('PLEAT'),IFCLABEL('TREADSEPARATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2017=IFCSIMPLEPROPERTYTEMPLATE('0zA4kcQFz0ZwgL0lbDe6t0',$,'DustHoldingCapacity','Maximum filter dust holding capacity.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#2018=IFCSIMPLEPROPERTYTEMPLATE('2m9sGgZKr9AhSckT$8UuBw',$,'FaceSurfaceArea','Face area of filter frame.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#2019=IFCSIMPLEPROPERTYTEMPLATE('3gb0Svrdb1ABF4vlw0sGT8',$,'MediaExtendedArea','Total extended media area.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#2020=IFCSIMPLEPROPERTYTEMPLATE('3CInfr2X16WAgt96TCZAkN',$,'NominalCountedEfficiency','Nominal filter efficiency based the particle count concentration before and after the filter against particles with a certain size distribution.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2021=IFCSIMPLEPROPERTYTEMPLATE('1OSKIadAj8kRir3vfZhkPG',$,'NominalWeightedEfficiency','Nominal filter efficiency based the particle weight concentration before and after the filter against particles with a certain size distribution.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2022=IFCSIMPLEPROPERTYTEMPLATE('33B1vOAM92ExJ2vc$ghZEq',$,'PressureDropCurve','Under certain dust holding weight, DelPressure = f (fluidflowRate)',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2023=IFCSIMPLEPROPERTYTEMPLATE('34gvm3YJD8SwMw1s0uPz$t',$,'CountedEfficiencyCurve','Counted efficiency curve as a function of dust holding weight, efficiency = f (dust holding weight).',.P_TABLEVALUE.,'IfcMassMeasure','IfcReal',$,$,$,$,.READWRITE.); +#2024=IFCSIMPLEPROPERTYTEMPLATE('1U_QVOSDz9bQBxevqrKro4',$,'WeightedEfficiencyCurve','Weighted efficiency curve as a function of dust holding weight, efficiency = f (dust holding weight).',.P_TABLEVALUE.,'IfcMassMeasure','IfcReal',$,$,$,$,.READWRITE.); +#2025=IFCPROPERTYSETTEMPLATE('3REXpGfRPCvQZLMk6mWbvf',$,'Pset_FilterTypeCommon','Filter type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFilter,IfcFilterType',(#2026,#2027,#2029,#2030,#2031,#2032,#2033,#2034,#2035,#2036,#2037,#2038,#2039)); +#2026=IFCSIMPLEPROPERTYTEMPLATE('3atAy7saPB5fNEYsZ6GlPi',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2027=IFCSIMPLEPROPERTYTEMPLATE('1JZSlCaL11eR3WAX5gLPHQ',$,'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',$,#2028,$,$,$,.READWRITE.); +#2028=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2029=IFCSIMPLEPROPERTYTEMPLATE('3H5gU0toPBtPc4Xve9l8dm',$,'Weight','Total weight of object',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#2030=IFCSIMPLEPROPERTYTEMPLATE('1X7JFFFd92eAixFfj3iTOs',$,'InitialResistance','Initial new filter fluid resistance (i.e., pressure drop at the maximum air flowrate across the filter when the filter is new per ASHRAE Standard 52.1).',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2031=IFCSIMPLEPROPERTYTEMPLATE('28dnukXdPF0u$p1pJR6VLj',$,'FinalResistance','Filter fluid resistance when replacement is required (i.e., Pressure drop at the maximum air flowrate across the filter when the filter needs replacement per ASHRAE Standard 52.1).',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2032=IFCSIMPLEPROPERTYTEMPLATE('3YwUT$$lXBJO5Gi7Xta0Lz',$,'OperationTemperatureRange','Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2033=IFCSIMPLEPROPERTYTEMPLATE('0rqrPoAsXB_heDfnXrgDow',$,'FlowRateRange','Allowable range of volume of fluid being pumped against the resistance specified.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2034=IFCSIMPLEPROPERTYTEMPLATE('37IFfLq79Fq8GmlN$MHLnZ',$,'NominalFilterFaceVelocity','Filter face velocity.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#2035=IFCSIMPLEPROPERTYTEMPLATE('1AnEMjhljAyASC2Z6WSxhu',$,'NominalMediaSurfaceVelocity','Average fluid velocity at the media surface.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#2036=IFCSIMPLEPROPERTYTEMPLATE('0L6e7I6_T3xhoX9ErIbBDP',$,'NominalPressureDrop','Total pressure drop across the filter.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2037=IFCSIMPLEPROPERTYTEMPLATE('219GTjU0DCbPrEKF7nKA$Q',$,'NominalFlowrate','Nominal fluid flow rate through the filter.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2038=IFCSIMPLEPROPERTYTEMPLATE('2BiyQmGen8Y90OSzjtCiNT',$,'NominalParticleGeometricMeanDiameter','Particle geometric mean diameter associated with nominal efficiency.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2039=IFCSIMPLEPROPERTYTEMPLATE('2rOTZ2oAD46OdheGPuPD5s',$,'NominalParticleGeometricStandardDeviation','Particle geometric standard deviation associated with nominal efficiency.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2040=IFCPROPERTYSETTEMPLATE('0TOtEEf5X2MwcVBzAS2ZV8',$,'Pset_FilterTypeCompressedAirFilter','Compressed air filter type attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFilter/COMPRESSEDAIRFILTER,IfcFilterType/COMPRESSEDAIRFILTER',(#2041,#2043,#2044,#2045,#2046)); +#2041=IFCSIMPLEPROPERTYTEMPLATE('0tv$2drgD6fOc17f1RvAFw',$,'CompressedAirFilterType','ACTIVATEDCARBON: absorbs oil vapor and odor; PARTICLE_FILTER: used to absorb solid particles of medium size; COALESCENSE_FILTER: used to absorb fine solid, oil, and water particles, also called micro filter',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2042,$,$,$,.READWRITE.); +#2042=IFCPROPERTYENUMERATION('PEnum_CompressedAirFilterType',(IFCLABEL('ACTIVATEDCARBON'),IFCLABEL('COALESCENSE_FILTER'),IFCLABEL('PARTICLE_FILTER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2043=IFCSIMPLEPROPERTYTEMPLATE('1AezDKdTb7pvVAv31kLzBk',$,'OperationPressureMax','Maximum pressure under normal operating conditions.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2044=IFCSIMPLEPROPERTYTEMPLATE('2AXXkaMLHC_g5efys32mU_',$,'ParticleAbsorptionCurve','Ratio of particles that are removed by the filter. Each entry describes the ratio of particles absorbed greater than equal to the specified size and less than the next specified size. For example, given for 3 significant particle sizes >= 0,1 micro m, >= 1 micro m, >= 5 micro m',.P_TABLEVALUE.,'IfcPositiveLengthMeasure','IfcPositiveRatioMeasure',$,$,$,$,.READWRITE.); +#2045=IFCSIMPLEPROPERTYTEMPLATE('2wiqVJBcjAXOR0tqrpdkGs',$,'AutomaticCondensateDischarge','Whether or not the condensing water or oil is discharged automatically from the filter.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2046=IFCSIMPLEPROPERTYTEMPLATE('1DKDbnzVLF3gpAB7JtPObk',$,'CloggingIndicator','Whether the filter has an indicator to display the degree of clogging of the filter.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2047=IFCPROPERTYSETTEMPLATE('3_0OhATiLC3xtiInzL8dXy',$,'Pset_FilterTypeWaterFilter','Water filter type attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFilter/WATERFILTER,IfcFilterType/WATERFILTER',(#2048)); +#2048=IFCSIMPLEPROPERTYTEMPLATE('2_07GLcjH0PgUGXfft6e6e',$,'WaterFilterType','Further qualifies the type of water filter. Filtration removes undissolved matter; Purification removes dissolved matter; Softening replaces dissolved matter.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2049,$,$,$,.READWRITE.); +#2049=IFCPROPERTYENUMERATION('PEnum_FilterWaterFilterType',(IFCLABEL('FILTRATION_DIATOMACEOUSEARTH'),IFCLABEL('FILTRATION_SAND'),IFCLABEL('PURIFICATION_DEIONIZING'),IFCLABEL('PURIFICATION_REVERSEOSMOSIS'),IFCLABEL('SOFTENING_ZEOLITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2050=IFCPROPERTYSETTEMPLATE('0ikKwtyTz4MwcHU6FPl08R',$,'Pset_FireSuppressionTerminalTypeBreechingInlet','Symmetrical pipe fitting that unites two or more inlets into a single pipe (BS6100 330 114 adapted).',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal/BREECHINGINLET,IfcFireSuppressionTerminalType/BREECHINGINLET',(#2051,#2053,#2054,#2055,#2057)); +#2051=IFCSIMPLEPROPERTYTEMPLATE('2153JShYX7A8SMhyfKoDmx',$,'BreechingInletType','Defines the type of breeching inlet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2052,$,$,$,.READWRITE.); +#2052=IFCPROPERTYENUMERATION('PEnum_BreechingInletType',(IFCLABEL('FOURWAY'),IFCLABEL('TWOWAY'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); +#2053=IFCSIMPLEPROPERTYTEMPLATE('24ZGwfGS51_BSD7aIwRFEL',$,'InletDiameter','The inlet diameter of the breeching inlet.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2054=IFCSIMPLEPROPERTYTEMPLATE('3ozChBnH92KvkTACCWv9Zs',$,'OutletDiameter','The outlet diameter of the breeching inlet.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2055=IFCSIMPLEPROPERTYTEMPLATE('3kjEeglvLAZBEPIr2nju5h',$,'CouplingType','Defines the type coupling on the inlet of the breeching inlet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2056,$,$,$,.READWRITE.); +#2056=IFCPROPERTYENUMERATION('PEnum_BreechingInletCouplingType',(IFCLABEL('INSTANTANEOUS_FEMALE'),IFCLABEL('INSTANTANEOUS_MALE'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); +#2057=IFCSIMPLEPROPERTYTEMPLATE('2MBGkFyWfEce3P360tGaPb',$,'HasCaps','Does the inlet connection have protective caps.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2058=IFCPROPERTYSETTEMPLATE('0rNU3BRvP0Uukxd4$70yib',$,'Pset_FireSuppressionTerminalTypeCommon','Common properties for fire suppression terminals.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal,IfcFireSuppressionTerminalType',(#2059,#2060)); +#2059=IFCSIMPLEPROPERTYTEMPLATE('27ApJzbJr3Iu62faLeTikc',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2060=IFCSIMPLEPROPERTYTEMPLATE('1oP_CTEfjCT8M9cCEF9b$v',$,'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',$,#2061,$,$,$,.READWRITE.); +#2061=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2062=IFCPROPERTYSETTEMPLATE('3r_TjIIMb7Q8fI0GOjvinl',$,'Pset_FireSuppressionTerminalTypeFireHydrant','Device, fitted to a pipe, through which a temporary supply of water may be provided (BS6100 330 6107)For further details on fire hydrants, see www.firehydrant.org',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal/FIREHYDRANT,IfcFireSuppressionTerminalType/FIREHYDRANT',(#2063,#2065,#2066,#2067,#2068,#2069,#2070,#2071,#2072,#2073)); +#2063=IFCSIMPLEPROPERTYTEMPLATE('3hMkgfRkb9Jg48I$TdhfCJ',$,'FireHydrantType','Defines the range of hydrant types from which the required type can be selected where.DryBarrel: A hydrant that has isolating valves fitted below ground and that may be used where the possibility of water freezing is a consideration.\X2\000A\X0\WetBarrel: A hydrant that has isolating valves fitted above ground and that may be used where there is no possibility of water freezing.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2064,$,$,$,.READWRITE.); +#2064=IFCPROPERTYENUMERATION('PEnum_FireHydrantType',(IFCLABEL('DRYBARREL'),IFCLABEL('WETBARREL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2065=IFCSIMPLEPROPERTYTEMPLATE('35a63wNQn81e$zAfQnee6V',$,'PumperConnectionSize','The size of a connection to which a fire hose may be connected that is then linked to a pumping unit.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2066=IFCSIMPLEPROPERTYTEMPLATE('212I8uZJv40Atf$88OhyXB',$,'NumberOfHoseConnections','The number of hose connections on the hydrant (excluding the pumper connection).',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2067=IFCSIMPLEPROPERTYTEMPLATE('2sMoyhwb99EPOGM8yFV987',$,'HoseConnectionSize','The size of connections to which a hose may be connected (other than that to be linked to a pumping unit).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2068=IFCSIMPLEPROPERTYTEMPLATE('11IrtnVCf8GfbfiL1J3snQ',$,'DischargeFlowRate','The volumetric rate of fluid discharge.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2069=IFCSIMPLEPROPERTYTEMPLATE('2opHYh7$D0mffNUY5jp5nj',$,'FlowClass','Alphanumeric indication of the flow class of a hydrant (may be used in connection with or instead of the FlowRate property).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2070=IFCSIMPLEPROPERTYTEMPLATE('26AsYKCvXBigB5wjkmhvlf',$,'WaterIsPotable','Indication of whether the water flow from the hydrant is potable (set TRUE) or non potable (set FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2071=IFCSIMPLEPROPERTYTEMPLATE('191d7ovn1AGQoMeIBr4HWM',$,'PressureRating','Pressure rating of the object.\X2\000A000A\X0\Maximum pressure that the hydrant is manufactured to withstand.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2072=IFCSIMPLEPROPERTYTEMPLATE('3cMIqybEn0B9bYXpTbO8Rk',$,'BodyColour','Colour of the body of the hydrant.Note: Consult local fire regulations for statutory colours that may be required for hydrant bodies in particular circumstances.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2073=IFCSIMPLEPROPERTYTEMPLATE('3Zn00m5onCjQ1Grh7LzVP$',$,'CapColour','Colour of the caps of the hydrant.Note: Consult local fire regulations for statutory colours that may be required for hydrant caps in particular circumstances.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2074=IFCPROPERTYSETTEMPLATE('0MBF_D4Xj6jAmPeMBNzb8a',$,'Pset_FireSuppressionTerminalTypeHoseReel','A supporting framework on which a hose may be wound (BS6100 155 8201).Note that the service provided by the hose (water/foam) is determined by the context of the system onto which the hose reel is connected.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal/HOSEREEL,IfcFireSuppressionTerminalType/HOSEREEL',(#2075,#2077,#2079,#2080,#2081,#2082,#2084,#2085)); +#2075=IFCSIMPLEPROPERTYTEMPLATE('2ZJNItcoH5tvCZJ3feS5og',$,'HoseReelType','Identifies the predefined types of hose arrangement from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2076,$,$,$,.READWRITE.); +#2076=IFCPROPERTYENUMERATION('PEnum_HoseReelType',(IFCLABEL('RACK'),IFCLABEL('REEL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2077=IFCSIMPLEPROPERTYTEMPLATE('0ADPLWLVP0avZuJWlIprJh',$,'HoseReelMountingType','Identifies the predefined types of hose reel mounting from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2078,$,$,$,.READWRITE.); +#2078=IFCPROPERTYENUMERATION('PEnum_HoseReelMountingType',(IFCLABEL('CABINET_RECESSED'),IFCLABEL('CABINET_SEMIRECESSED'),IFCLABEL('SURFACE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2079=IFCSIMPLEPROPERTYTEMPLATE('1T$dUY$ZP2bP7OAMDwwpri',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.\X2\000A000A\X0\Connection to the hose reel.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2080=IFCSIMPLEPROPERTYTEMPLATE('1cfqv$WZb7beXrB3$JUFk4',$,'HoseDiameter','Notional diameter (bore) of the hose.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2081=IFCSIMPLEPROPERTYTEMPLATE('0GJhe_gPz7KfV4YHULOGmC',$,'HoseLength','Notional length of the hose fitted to the hose reel when fully extended.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2082=IFCSIMPLEPROPERTYTEMPLATE('0s8i7BAtXD2OcRiG2e2i$$',$,'HoseNozzleType','Identifies the predefined types of nozzle (in terms of spray pattern) fitted to the end of the hose from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2083,$,$,$,.READWRITE.); +#2083=IFCPROPERTYENUMERATION('PEnum_HoseNozzleType',(IFCLABEL('FOG'),IFCLABEL('STRAIGHTSTREAM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2084=IFCSIMPLEPROPERTYTEMPLATE('03_xAAu_vFp8Tit8kUgCjf',$,'ClassOfService','A classification of usage of the hose reel that may be applied.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2085=IFCSIMPLEPROPERTYTEMPLATE('2oMMrS4tr7Oh6XVpn9032F',$,'ClassificationAuthority','The name of the authority that applies the classification of service to the hose reel (e.g. NFPA/FEMA).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2086=IFCPROPERTYSETTEMPLATE('3kCqeuHnXFiAqJPskCDGjN',$,'Pset_FireSuppressionTerminalTypeSprinkler','Device for sprinkling water from a pipe under pressure over an area (BS6100 100 3432)',.PSET_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal/SPRINKLER,IfcFireSuppressionTerminalType/SPRINKLER',(#2087,#2089,#2091,#2093,#2094,#2095,#2096,#2098,#2099,#2100,#2101,#2102)); +#2087=IFCSIMPLEPROPERTYTEMPLATE('2BbWILCc18lv1SDe_ED0a9',$,'SprinklerType','Identifies the predefined types of sprinkler from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2088,$,$,$,.READWRITE.); +#2088=IFCPROPERTYENUMERATION('PEnum_SprinklerType',(IFCLABEL('CEILING'),IFCLABEL('CONCEALED'),IFCLABEL('CUTOFF'),IFCLABEL('PENDANT'),IFCLABEL('RECESSEDPENDANT'),IFCLABEL('SIDEWALL'),IFCLABEL('UPRIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2089=IFCSIMPLEPROPERTYTEMPLATE('15Jj1pnIzDFwrPKy5j7Fpd',$,'Activation','Identifies the predefined methods of sprinkler activation from which that required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2090,$,$,$,.READWRITE.); +#2090=IFCPROPERTYENUMERATION('PEnum_SprinklerActivation',(IFCLABEL('BULB'),IFCLABEL('FUSIBLESOLDER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2091=IFCSIMPLEPROPERTYTEMPLATE('0KQmhjRVT4JRBwJPRpqmjX',$,'Response','Identifies the predefined methods of sprinkler response from which that required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2092,$,$,$,.READWRITE.); +#2092=IFCPROPERTYENUMERATION('PEnum_SprinklerResponse',(IFCLABEL('QUICK'),IFCLABEL('STANDARD'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2093=IFCSIMPLEPROPERTYTEMPLATE('3TIzhhtejFcfWULNzMtyYo',$,'ActivationTemperature','The temperature at which the object is designed to activate.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2094=IFCSIMPLEPROPERTYTEMPLATE('3U6UwnC3zFwu1WYkUurLAN',$,'CoverageArea','The area that is covered by the object.\X2\000A000A\X0\Indicates the area that the sprinkler is designed to protect.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#2095=IFCSIMPLEPROPERTYTEMPLATE('17sPGgz_DACOTq3een9iE2',$,'HasDeflector','Indication of whether the sprinkler has a deflector (baffle) fitted to diffuse the discharge on activation (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2096=IFCSIMPLEPROPERTYTEMPLATE('1Z8DyK61f5uwMt86NmrFrh',$,'BulbLiquidColour','The colour of the liquid in the bulb for a bulb activated sprinkler. Note that the liquid colour varies according to the activation temperature requirement of the sprinkler head. Note also that this property does not need to be asserted for quick response activated sprinklers.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2097,$,$,$,.READWRITE.); +#2097=IFCPROPERTYENUMERATION('PEnum_SprinklerBulbLiquidColour',(IFCLABEL('BLUE'),IFCLABEL('GREEN'),IFCLABEL('MAUVE'),IFCLABEL('ORANGE'),IFCLABEL('RED'),IFCLABEL('YELLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2098=IFCSIMPLEPROPERTYTEMPLATE('3yOTsWa7b5GuBOQICjZLGt',$,'DischargeFlowRate','The volumetric rate of fluid discharge.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2099=IFCSIMPLEPROPERTYTEMPLATE('1Ktoyz8zb2bgimY3ICPuOk',$,'ResidualFlowingPressure','The residual flowing pressure in the pipeline at which the discharge flow rate is determined.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2100=IFCSIMPLEPROPERTYTEMPLATE('2AXnNqYsnFJxOXN$lHSMRE',$,'DischargeCoefficient','The coefficient of flow at the sprinkler.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2101=IFCSIMPLEPROPERTYTEMPLATE('1hGw0XwXXA9gyE3hp8sawb',$,'MaximumWorkingPressure','Maximum pressure that the object is manufactured to withstand.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2102=IFCSIMPLEPROPERTYTEMPLATE('00LT98clT9wvvag3Kp9BMm',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\Inlet connection to sprinkler.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2103=IFCPROPERTYSETTEMPLATE('1XdUj4Bjv8qffB7gCCS_GR',$,'Pset_FittingBend','Properties about the bend angles.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableCarrierFitting/BEND,IfcDuctFitting/BEND,IfcPipeFitting/BEND,IfcCableCarrierFittingType/BEND,IfcDuctFittingType/BEND,IfcPipeFittingType/BEND',(#2104,#2105)); +#2104=IFCSIMPLEPROPERTYTEMPLATE('1LQ_kokRXFkODuIoSoXEKq',$,'BendAngle','The change of direction of flow.',.P_SINGLEVALUE.,'IfcPositivePlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2105=IFCSIMPLEPROPERTYTEMPLATE('3XXE3bqXT1PPD3Q1XfJKMh',$,'BendRadius','The radius of bending if circular arc or zero if sharp bend.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2106=IFCPROPERTYSETTEMPLATE('3P81xZHxr598NrdP0LW2Y$',$,'Pset_FittingJunction','Properties about Fitting Junction.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting/JUNCTION,IfcDuctFitting/JUNCTION,IfcPipeFitting/JUNCTION,IfcCableCarrierFitting/JUNCTION,IfcCableFittingType/JUNCTION,IfcDuctFittingType/JUNCTION,IfcPipeFittingType/JUNCTION,IfcCableCarrierFittingType/JUNCTION',(#2107,#2109,#2110,#2111,#2112)); +#2107=IFCSIMPLEPROPERTYTEMPLATE('0FnddESV9ARArEKhqw9zt5',$,'JunctionType','The type of junction. TEE=3 ports, CROSS = 4 ports.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2108,$,$,$,.READWRITE.); +#2108=IFCPROPERTYENUMERATION('PEnum_FittingJunctionType',(IFCLABEL('CROSS'),IFCLABEL('TEE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2109=IFCSIMPLEPROPERTYTEMPLATE('0mnTD7s5jBnQGFwsgfA16R',$,'JunctionLeftAngle','The change of direction of flow for the left junction.',.P_SINGLEVALUE.,'IfcPositivePlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2110=IFCSIMPLEPROPERTYTEMPLATE('3$dfKCgv14ffRRL6Rw31V_',$,'JunctionLeftRadius','The radius of bending for the left junction.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2111=IFCSIMPLEPROPERTYTEMPLATE('3xHs9ma7T75xOMSexI$oLo',$,'JunctionRightAngle','The change of direction of flow for the right junction where 0 indicates straight segment.',.P_SINGLEVALUE.,'IfcPositivePlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2112=IFCSIMPLEPROPERTYTEMPLATE('2y2qGDYGf7YxdOeY5iyPBy',$,'JunctionRightRadius','The radius of bending for the right junction where 0 indicates sharp bend.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2113=IFCPROPERTYSETTEMPLATE('1p3YoR18P6WgFF3Y4rqauc',$,'Pset_FittingTransition','Properties about Fitting Transition.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting/TRANSITION,IfcDuctFitting/TRANSITION,IfcPipeFitting/TRANSITION,IfcCableCarrierFitting/TRANSITION,IfcCableFittingType/TRANSITION,IfcDuctFittingType/TRANSITION,IfcPipeFittingType/TRANSITION,IfcCableCarrierFittingType/TRANSITION',(#2114,#2115,#2116)); +#2114=IFCSIMPLEPROPERTYTEMPLATE('1aCHC3j7r0DxeujtA$Qz3U',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2115=IFCSIMPLEPROPERTYTEMPLATE('1ik8ewEznAEBr4zXgeTt3Z',$,'EccentricityInY','Distance in y direction between the two points (or vertex points) engaged in the point connection.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2116=IFCSIMPLEPROPERTYTEMPLATE('1GzLZa8p153ebEgTIaPZDc',$,'EccentricityInZ','Distance in z direction between the two points (or vertex points) engaged in the point connection.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2117=IFCPROPERTYSETTEMPLATE('2P23y6D6L8IO_NjsahPai5',$,'Pset_FlowInstrumentPHistory','Properties for history of flow instrument values. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcFlowInstrument',(#2118,#2119,#2120)); +#2118=IFCSIMPLEPROPERTYTEMPLATE('1I$4_deHvCLxr$BVgBM_te',$,'Value','The expected range and default value.\X2\000A000A\X0\Indicates measured values over time which may be recorded continuously or only when changed beyond a particular deadband.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2119=IFCSIMPLEPROPERTYTEMPLATE('0z0yXeh5P6TQTk6es4mUDZ',$,'Quality','Indicates the quality of measurement or failure condition, which may be further qualified by the Status. True: measured values are considered reliable; False: measured values are considered not reliable (i.e. a fault has been detected); Unknown: reliability of values is uncertain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2120=IFCSIMPLEPROPERTYTEMPLATE('2yP7mXbPP5_hEcH_Kf7Vnt',$,'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).\X2\000A000A\X0\Indicates an error code or identifier, whose meaning is specific to the particular automation system. Example values include: ''ConfigurationError'', ''NotConnected'', ''DeviceFailure'', ''SensorFailure'', ''LastKnown, ''CommunicationsFailure'', ''OutOfService''.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2121=IFCPROPERTYSETTEMPLATE('0vOh57DejEBgyuXWFuEj0f',$,'Pset_FlowInstrumentTypeCommon','Flow Instrument type common attributes. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument,IfcFlowInstrumentType',(#2122,#2123)); +#2122=IFCSIMPLEPROPERTYTEMPLATE('1lzXzHcv1BewGm6g3XjHUB',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2123=IFCSIMPLEPROPERTYTEMPLATE('3pMTvDVQ5ERfVvpEzruWoq',$,'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',$,#2124,$,$,$,.READWRITE.); +#2124=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2125=IFCPROPERTYSETTEMPLATE('3frtNgLUj9NwzpiRzkr4DI',$,'Pset_FlowInstrumentTypePressureGauge','A device that reads and displays a pressure value at a point or the pressure difference between two points.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument/PRESSUREGAUGE,IfcFlowInstrumentType/PRESSUREGAUGE',(#2126,#2128)); +#2126=IFCSIMPLEPROPERTYTEMPLATE('2YFy5klML3FRa7jYKDXurW',$,'PressureGaugeType','Identifies the means by which pressure is displayed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2127,$,$,$,.READWRITE.); +#2127=IFCPROPERTYENUMERATION('PEnum_PressureGaugeType',(IFCLABEL('DIAL'),IFCLABEL('DIGITAL'),IFCLABEL('MANOMETER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2128=IFCSIMPLEPROPERTYTEMPLATE('31DL4$rKnC3Q2hKbie0Fo1',$,'DisplaySize','The physical size of the display.\X2\000A000A\X0\For a dial pressure gauge it will be the diameter of the dial.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2129=IFCPROPERTYSETTEMPLATE('1fmYk1iUn8bup$_dKIe0uF',$,'Pset_FlowInstrumentTypeThermometer','A device that reads and displays a temperature value at a point.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument/THERMOMETER,IfcFlowInstrumentType/THERMOMETER',(#2130,#2132)); +#2130=IFCSIMPLEPROPERTYTEMPLATE('1Ikakqh$H8q8Bbswv_1s_U',$,'ThermometerType','Identifies the means by which temperature is displayed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2131,$,$,$,.READWRITE.); +#2131=IFCPROPERTYENUMERATION('PEnum_ThermometerType',(IFCLABEL('DIAL'),IFCLABEL('DIGITAL'),IFCLABEL('STEM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2132=IFCSIMPLEPROPERTYTEMPLATE('2VMLFYf1P4ohpFQGiwXRDs',$,'DisplaySize','The physical size of the display.\X2\000A000A\X0\In the case of a stem thermometer, this will be the length of the stem. For a dial thermometer, it will be the diameter of the dial.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2133=IFCPROPERTYSETTEMPLATE('0DaLlt9NjC9PlpPfjLhZwC',$,'Pset_FlowMeterOccurrence','Flow meter occurrence common attributes.',.PSET_OCCURRENCEDRIVEN.,'IfcFlowMeter',(#2134)); +#2134=IFCSIMPLEPROPERTYTEMPLATE('1p7A9x7KX90gTQeh_wtoQ4',$,'FlowMeterOurpose','Enumeration defining the purpose of the flow meter occurrence.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2135,$,$,$,.READWRITE.); +#2135=IFCPROPERTYENUMERATION('PEnum_FlowMeterPurpose',(IFCLABEL('MASTER'),IFCLABEL('SUBMASTER'),IFCLABEL('SUBMETER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2136=IFCPROPERTYSETTEMPLATE('3H9_K_c799NedyQiYw0X$p',$,'Pset_FlowMeterTypeCommon','Common attributes of a flow meter type',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeter,IfcFlowMeterType',(#2137,#2138,#2140,#2142)); +#2137=IFCSIMPLEPROPERTYTEMPLATE('3PeLLLTMf7$Bh0vG5c2Uye',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2138=IFCSIMPLEPROPERTYTEMPLATE('1xKdoUVff3vwIqn3p8YpOZ',$,'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',$,#2139,$,$,$,.READWRITE.); +#2139=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2140=IFCSIMPLEPROPERTYTEMPLATE('3F_C4pkWzBIO5tT53Jyo6V',$,'ReadOutType','Indication of the form that readout from the meter takes. In the case of a dial read out, this may comprise multiple dials that give a cumulative reading and/or a mechanical odometer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2141,$,$,$,.READWRITE.); +#2141=IFCPROPERTYENUMERATION('PEnum_MeterReadOutType',(IFCLABEL('DIAL'),IFCLABEL('DIGITAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2142=IFCSIMPLEPROPERTYTEMPLATE('0NQSV3fp95g8EuP8cmwR_x',$,'RemoteReading','Indicates whether the meter has a connection for remote reading through connection of a communication device (set TRUE) or not (set FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2143=IFCPROPERTYSETTEMPLATE('3ZCOu2zb903xovpTDIdUR$',$,'Pset_FlowMeterTypeEnergyMeter','Device that measures, indicates and sometimes records, the energy usage in a system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeter/ENERGYMETER,IfcFlowMeterType/ENERGYMETER',(#2144,#2145,#2146)); +#2144=IFCSIMPLEPROPERTYTEMPLATE('2Toq8pIULAZfGjP5I6JXsE',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#2145=IFCSIMPLEPROPERTYTEMPLATE('0djjTg_GrFrPFQRyutdoGG',$,'MaximumCurrent','The maximum allowed current that a device is certified to handle.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#2146=IFCSIMPLEPROPERTYTEMPLATE('0U_xE2TIX2JxZZGY54sXKD',$,'MultipleTarriff','Indicates whether meter has built-in support for multiple tarriffs (variable energy cost rates).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2147=IFCPROPERTYSETTEMPLATE('2x4PCEXY92gwV1H42aXIFL',$,'Pset_FlowMeterTypeGasMeter','Device that measures, indicates and sometimes records, the volume of gas that passes through it without interrupting the flow.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeter/GASMETER,IfcFlowMeterType/GASMETER',(#2148,#2150,#2151,#2152)); +#2148=IFCSIMPLEPROPERTYTEMPLATE('03i5FmJZjEzOYanXNyVc1m',$,'GasType','Defines the types of gas that may be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2149,$,$,$,.READWRITE.); +#2149=IFCPROPERTYENUMERATION('PEnum_GasType',(IFCLABEL('COMMERCIALBUTANE'),IFCLABEL('COMMERCIALPROPANE'),IFCLABEL('LIQUEFIEDPETROLEUMGAS'),IFCLABEL('NATURALGAS'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2150=IFCSIMPLEPROPERTYTEMPLATE('15YaKGLof5AQurJOdMwWhk',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\Inlet and outlet pipe connections to the meter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2151=IFCSIMPLEPROPERTYTEMPLATE('3_L$dPFR57ghiYT4UhaMdr',$,'MaximumFlowRate','Maximum rate of flow which the meter is expected to pass.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2152=IFCSIMPLEPROPERTYTEMPLATE('0y3krufQj9ChonbC61Bq3s',$,'MaximumPressureLoss','Pressure loss expected across the meter under conditions of maximum flow.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2153=IFCPROPERTYSETTEMPLATE('1Uo_ikwcj9Bu22$gqTH4LJ',$,'Pset_FlowMeterTypeOilMeter','Device that measures, indicates and sometimes records, the volume of oil that passes through it without interrupting the flow.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeter/OILMETER,IfcFlowMeterType/OILMETER',(#2154,#2155)); +#2154=IFCSIMPLEPROPERTYTEMPLATE('2I11PM3hb9cPmPPTMjWWTw',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\Inlet and outlet pipe connections to the meter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2155=IFCSIMPLEPROPERTYTEMPLATE('11VYQJDhr0l9JfspvZdMo3',$,'MaximumFlowRate','Maximum rate of flow which the meter is expected to pass.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2156=IFCPROPERTYSETTEMPLATE('11xpA4LEz4MAQCxLp07tOU',$,'Pset_FlowMeterTypeWaterMeter','Device that measures, indicates and sometimes records, the volume of water that passes through it without interrupting the flow.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowMeter/WATERMETER,IfcFlowMeterType/WATERMETER',(#2157,#2159,#2160,#2161,#2162)); +#2157=IFCSIMPLEPROPERTYTEMPLATE('0G_n2MrRD95frUEWKJ70kv',$,'Type','Defines the allowed values for selection of the flow meter operation type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2158,$,$,$,.READWRITE.); +#2158=IFCPROPERTYENUMERATION('PEnum_WaterMeterType',(IFCLABEL('COMPOUND'),IFCLABEL('INFERENTIAL'),IFCLABEL('PISTON'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2159=IFCSIMPLEPROPERTYTEMPLATE('20kM4Been6yueT2QM$hNAR',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\Inlet and outlet pipe connections to the meter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2160=IFCSIMPLEPROPERTYTEMPLATE('06mOKwnRPCpB6JVGIQuBfm',$,'MaximumFlowRate','Maximum rate of flow which the meter is expected to pass.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2161=IFCSIMPLEPROPERTYTEMPLATE('1yHpPuVWn2tedQIiEQVeVz',$,'MaximumPressureLoss','Pressure loss expected across the meter under conditions of maximum flow.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2162=IFCSIMPLEPROPERTYTEMPLATE('3d5dnQZTPEBhplmjU2r45y',$,'BackflowPreventerType','Identifies the type of backflow preventer installed to prevent the backflow of contaminated or polluted water from an irrigation/reticulation system to a potable water supply.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2163,$,$,$,.READWRITE.); +#2163=IFCPROPERTYENUMERATION('PEnum_BackflowPreventerType',(IFCLABEL('ANTISIPHONVALVE'),IFCLABEL('ATMOSPHERICVACUUMBREAKER'),IFCLABEL('DOUBLECHECKBACKFLOWPREVENTER'),IFCLABEL('NONE'),IFCLABEL('PRESSUREVACUUMBREAKER'),IFCLABEL('REDUCEDPRESSUREBACKFLOWPREVENTER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2164=IFCPROPERTYSETTEMPLATE('1BeoZJhmvDkwqkvt_MyPyi',$,'Pset_FootingCommon','Properties common to the definition of all occurrences of IfcFooting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFooting,IfcFootingType',(#2165,#2166,#2168)); +#2165=IFCSIMPLEPROPERTYTEMPLATE('2GQFYF41H3UvwflpgxSlXU',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2166=IFCSIMPLEPROPERTYTEMPLATE('0FE7ZHMtn3fgVJdghcXmTU',$,'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',$,#2167,$,$,$,.READWRITE.); +#2167=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2168=IFCSIMPLEPROPERTYTEMPLATE('3A5jC3LePBlRw89LyqXkKn',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2169=IFCPROPERTYSETTEMPLATE('0teUoSgaj52BHUv65I_biU',$,'Pset_FootingTypePadFooting','Properties of footing. The property set can be used by the predefined type PAD_FOOTING of IfcFooting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFooting/PAD_FOOTING,IfcFootingType/PAD_FOOTING',(#2170,#2171)); +#2170=IFCSIMPLEPROPERTYTEMPLATE('3RudtpMczBlhxIYHHFTctt',$,'LoadBearingCapacity','Maximum load bearing capacity of the floor structure throughtout the storey as designed.',.P_SINGLEVALUE.,'IfcPlanarForceMeasure',$,$,$,$,$,.READWRITE.); +#2171=IFCSIMPLEPROPERTYTEMPLATE('2$Wn2gx2L71PQfUC2ZZTqg',$,'IsReinforced','Indicates whether the foundation is reinforced (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2172=IFCPROPERTYSETTEMPLATE('3e8eAIvF15jvqC5oAIJuMp',$,'Pset_FurnitureTypeChair','A set of specific properties for furniture type chair. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Chair',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurniture/CHAIR,IfcFurnitureType/CHAIR',(#2173,#2174,#2175)); +#2173=IFCSIMPLEPROPERTYTEMPLATE('0zVmvf3iHEohAIu225RftZ',$,'SeatingHeight','The value of seating height if the chair height is not adjustable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2174=IFCSIMPLEPROPERTYTEMPLATE('2m5vy7CVbCswCEYfk59vzr',$,'HighestSeatingHeight','The value of seating height of high level if the chair height is adjustable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2175=IFCSIMPLEPROPERTYTEMPLATE('1UCHIA2hDA1eqK_lJ9FwUE',$,'LowestSeatingHeight','The value of seating height of low level if the chair height is adjustable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2176=IFCPROPERTYSETTEMPLATE('3$LION5qz8o8mkJw8PKMkb',$,'Pset_FurnitureTypeCommon','Common properties for all types of furniture such as chair, desk, table, and file cabinet. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FurnitureCommon. IFC 2x4: ''IsBuiltIn'' property added',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurniture,IfcFurnitureType',(#2177,#2178,#2180,#2181,#2182,#2183,#2184,#2185)); +#2177=IFCSIMPLEPROPERTYTEMPLATE('0gWIzmqXvCv9CT0bVzoA55',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2178=IFCSIMPLEPROPERTYTEMPLATE('21NDpkkNL6qRwbr0M5yRp0',$,'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',$,#2179,$,$,$,.READWRITE.); #2179=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2180=IFCPROPERTYSETTEMPLATE('2ur3iqGjXDV98qE_vkXimA',$,'Pset_GeotechnicalStratumCommon','Properties describing the characteristics of any solid, water or void stratum. A status of "New" should not be associated to a IfcGeotechnicalAssembly or IfcSolidStratum, as other entities are used for earthworks and courses.',.PSET_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum',(#2181,#2182,#2183,#2184,#2185,#2187)); -#2181=IFCSIMPLEPROPERTYTEMPLATE('20DJQZdM5FeeYHNDqqNIAf',$,'StratumColour','Stratum colour',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2182=IFCSIMPLEPROPERTYTEMPLATE('0vsn4awz92DvYIPHoA84DP',$,'IsTopographic','Is the stratum ever topmost and so a visible topographic feature',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); -#2183=IFCSIMPLEPROPERTYTEMPLATE('3GQwodkN9Ah9v_qUKYbCIX',$,'PiezometricHead','Pressure head of water content.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2184=IFCSIMPLEPROPERTYTEMPLATE('2trqF5OO1DRBlvHNsw9duV',$,'PiezometricPressure','Pressure of water content.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2185=IFCSIMPLEPROPERTYTEMPLATE('0jEgY1WpX5xxoFlOviBfAl',$,'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',$,#2186,$,$,$,.READWRITE.); -#2186=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2187=IFCSIMPLEPROPERTYTEMPLATE('1f4D5Zr6vFTxD9ORWgtrNy',$,'Texture','Stratum texture',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2188=IFCPROPERTYSETTEMPLATE('0xEjXjeD91mBevrWkb6eQv',$,'Pset_HeatExchangerTypeCommon','Heat exchanger type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcHeatExchanger,IfcHeatExchangerType',(#2189,#2190,#2192)); -#2189=IFCSIMPLEPROPERTYTEMPLATE('1I$7Dwq0fATB4BIU3jrhvk',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2190=IFCSIMPLEPROPERTYTEMPLATE('3fKcPs7bDBg93ewr0pv4H9',$,'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',$,#2191,$,$,$,.READWRITE.); -#2191=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2192=IFCSIMPLEPROPERTYTEMPLATE('2TJOtc7vT9uBxX4xoyPPNo',$,'FlowArrangement','Defines the basic flow arrangements for the heat exchanger or cooler tower:COUNTERFLOW: Air and water flow enter in different directions.\X2\000A\X0\CROSSFLOW: Air and water flow are perpendicular.\X2\000A\X0\PARALLELFLOW: Air and water flow enter in same directions.\X2\000A\X0\MULTIPASS: Multipass flow heat exchanger arrangement. \X2\000A\X0\OTHER: Other type of heat exchanger flow arrangement not defined above.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2193,$,$,$,.READWRITE.); -#2193=IFCPROPERTYENUMERATION('PEnum_HeatExchangerArrangement',(IFCLABEL('COUNTERFLOW'),IFCLABEL('CROSSFLOW'),IFCLABEL('MULTIPASS'),IFCLABEL('PARALLELFLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2194=IFCPROPERTYSETTEMPLATE('2B9cJ9XN9CTvn_TX8ADfUU',$,'Pset_HeatExchangerTypePlate','Plate heat exchanger type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcHeatExchanger/PLATE,IfcHeatExchangerType/PLATE',(#2195)); -#2195=IFCSIMPLEPROPERTYTEMPLATE('0qt$4ZHU52jxGg9ifneMf7',$,'NumberOfPlates','Number of plates used by the plate heat exchanger.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2196=IFCPROPERTYSETTEMPLATE('2LUy$n_NX4Q9znjTbIWUNp',$,'Pset_HumidifierPHistory','Humidifier performance history attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcHumidifier',(#2197,#2198)); -#2197=IFCSIMPLEPROPERTYTEMPLATE('1ZJQcmnrP4D9Ia2z37wSx6',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#2198=IFCSIMPLEPROPERTYTEMPLATE('1z2vHp3NTD7AqYcOEccsg7',$,'SaturationEfficiency','Saturation efficiency: Ratio of leaving air absolute humidity to the maximum absolute humidity.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#2199=IFCPROPERTYSETTEMPLATE('2XJV_YwMHFPPOMmilbgn9U',$,'Pset_HumidifierTypeCommon','Humidifier type common attributes.\X2\000A\X0\WaterProperties attribute renamed to WaterRequirement and unit type modified in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcHumidifier,IfcHumidifierType',(#2200,#2201,#2203,#2205,#2206,#2207,#2208,#2210,#2211,#2212)); -#2200=IFCSIMPLEPROPERTYTEMPLATE('0X0nl8wvb1_hivFBAC5McM',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2201=IFCSIMPLEPROPERTYTEMPLATE('3qF3sqGRj3pu5vls8DvUNx',$,'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',$,#2202,$,$,$,.READWRITE.); -#2202=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2203=IFCSIMPLEPROPERTYTEMPLATE('1cVwHyeQrB3xAdCdEkwNnF',$,'HumidifierApplication','Humidifier application.Fixed: Humidifier installed in a ducted flow distribution system.\X2\000A\X0\Portable: Humidifier is not installed in a ducted flow distribution system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2204,$,$,$,.READWRITE.); -#2204=IFCPROPERTYENUMERATION('PEnum_HumidifierApplication',(IFCLABEL('FIXED'),IFCLABEL('PORTABLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2205=IFCSIMPLEPROPERTYTEMPLATE('1mtsRjRXr1GP92JOjTLkVm',$,'Weight','Total weight of object',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#2206=IFCSIMPLEPROPERTYTEMPLATE('1YBFG1OzXEBfu9j0HlgkP2',$,'NominalMoistureGain','Nominal rate of water vapor added into the airstream.',.P_SINGLEVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2207=IFCSIMPLEPROPERTYTEMPLATE('2s65wfVs99$R_aNZkDYZ8N',$,'NominalAirFlowRate','Nominal air flow rate.\X2\000A000A\X0\Nominal rate of air flow into which water vapor is added.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2208=IFCSIMPLEPROPERTYTEMPLATE('1tgckiHmX5mekcR4_1NVmv',$,'InternalControl','Internal modulation control.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2209,$,$,$,.READWRITE.); -#2209=IFCPROPERTYENUMERATION('PEnum_HumidifierInternalControl',(IFCLABEL('MODULATING'),IFCLABEL('NONE'),IFCLABEL('ONOFF'),IFCLABEL('STEPPED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2210=IFCSIMPLEPROPERTYTEMPLATE('2uksc3ufr1CBnQ0FbK73sO',$,'WaterRequirement','Make-up water requirement.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2211=IFCSIMPLEPROPERTYTEMPLATE('0wj9voNh17sg30JmJvfAG2',$,'SaturationEfficiencyCurve','Saturation efficiency as a function of the air flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); -#2212=IFCSIMPLEPROPERTYTEMPLATE('3hthgdBIj6Qx9vSZ_pj$8z',$,'AirPressureDropCurve','Air pressure drop as a function of air flow rate.\X2\000A000A\X0\Air pressure drop versus air-flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2213=IFCPROPERTYSETTEMPLATE('3oEqMWIWXBpR8Ao416NxAF',$,'Pset_ImpactProtectionDeviceOccurrenceBumper','Properties common to all occurrences of IfcImpactProtectionDevice with PredefinedType set to BUMPER.',.PSET_OCCURRENCEDRIVEN.,'IfcImpactProtectionDevice/BUMPER',(#2214,#2215,#2216)); -#2214=IFCSIMPLEPROPERTYTEMPLATE('3pWOvsM5j0SQnYvLkxd8cR',$,'BrakingLength','Length of the braking distance as a design parameter of the bumper occurrence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2215=IFCSIMPLEPROPERTYTEMPLATE('3Swel65VT6iQ72SH1FafVc',$,'IsRemovableBumper','Indicates if the bumper is removable or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2216=IFCSIMPLEPROPERTYTEMPLATE('3GkGvHi8TFDut488kSSpxp',$,'BumperOrientation','Direction in which the bumper is aligned, e.g. same direction as increasing stationing values or opposite.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2217,$,$,$,.READWRITE.); -#2217=IFCPROPERTYENUMERATION('PEnum_BumperOrientation',(IFCLABEL('OPPOSITETOSTATIONDIRECTION'),IFCLABEL('STATIONDIRECTION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2218=IFCPROPERTYSETTEMPLATE('1zuTmPrzj2vwm05DJcJXw1',$,'Pset_ImpactProtectionDeviceTypeBumper','Properties common to all occurrences and types of IfcImpactProtectionDevice with PredefinedType set to BUMPER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcImpactProtectionDevice/BUMPER,IfcImpactProtectionDeviceType/BUMPER',(#2219,#2220,#2221)); -#2219=IFCSIMPLEPROPERTYTEMPLATE('0CJvxlZY1BPuRe4ebVIfzo',$,'IsAbsorbingEnergy','Indicates whether the bumper absorbs energy or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2220=IFCSIMPLEPROPERTYTEMPLATE('2XlWeslvz7weTfqxiKoa0M',$,'MaximumLoadRetention','Maximum possible impact load retention.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#2221=IFCSIMPLEPROPERTYTEMPLATE('0zcpvWEdP4keRq41bBx0Qj',$,'EnergyAbsorption','Energy absorption capacity of the element.',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); -#2222=IFCPROPERTYSETTEMPLATE('2VgHIiJFn6YeiWEUy2Fpwp',$,'Pset_InstallationOccurrence','Properties defining installation information for occurrences of element, asset or system.',.PSET_OCCURRENCEDRIVEN.,'IfcAsset,IfcElement,IfcSystem',(#2223,#2224,#2225)); -#2223=IFCSIMPLEPROPERTYTEMPLATE('1QiYaSW3D6Z9NJhiTo_jAQ',$,'InstallationDate','Date on which the element is installed.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#2224=IFCSIMPLEPROPERTYTEMPLATE('1sxstu81P7ShAxlAlBqndq',$,'AcceptanceDate','Date on which the element is accepted by the manager or administrator.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#2225=IFCSIMPLEPROPERTYTEMPLATE('3YhMMj53nCsOYl88GxJ47Q',$,'PutIntoOperationDate','Date on which the element is put into operation.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#2226=IFCPROPERTYSETTEMPLATE('3Buju5QeD6vA5Z1By2DO_9',$,'Pset_InterceptorTypeCommon','Common properties for interceptors.',.PSET_TYPEDRIVENOVERRIDE.,'IfcInterceptor,IfcInterceptorType',(#2227,#2228,#2230,#2231,#2232,#2233,#2234,#2235,#2236,#2237)); -#2227=IFCSIMPLEPROPERTYTEMPLATE('3zWofP$rj2VAqalZKvCogf',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2228=IFCSIMPLEPROPERTYTEMPLATE('1b6XUTMYX0iuUdcsn1wJJS',$,'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',$,#2229,$,$,$,.READWRITE.); -#2229=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2230=IFCSIMPLEPROPERTYTEMPLATE('0gbN6n6bn7jOhiIuUfpnb9',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2231=IFCSIMPLEPROPERTYTEMPLATE('1uMNsJKlbCRwkAedi2oHth',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2232=IFCSIMPLEPROPERTYTEMPLATE('3IgvzayO151fxZbVH2kL51',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2233=IFCSIMPLEPROPERTYTEMPLATE('1CR7hQ8ZT8KPtifW01RKTP',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2234=IFCSIMPLEPROPERTYTEMPLATE('3U2idoj8D0dxHCHBIktzbN',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2235=IFCSIMPLEPROPERTYTEMPLATE('2YaFJXS0T489t$hHczLblz',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2236=IFCSIMPLEPROPERTYTEMPLATE('3SVrTRnrvDax887T4j61Kq',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2237=IFCSIMPLEPROPERTYTEMPLATE('2HXKYgUwX9qeM0ZwLaMdNz',$,'VentilatingPipeSize','Size of the ventilating pipe(s).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2238=IFCPROPERTYSETTEMPLATE('0bWKSBsTf46gPF5ZD3vs8T',$,'Pset_IpNetworkEquipmentPHistory','Properties defining performance information for IP network equipment.',.PSET_PERFORMANCEDRIVEN.,'IfcCommunicationsAppliance/IPNETWORKEQUIPMENT',(#2239)); -#2239=IFCSIMPLEPROPERTYTEMPLATE('1UtaowXvn0zA086iJd_M3h',$,'NumberOfPackets','Indicates the number of packets of the IP network equipment.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#2240=IFCPROPERTYSETTEMPLATE('1$Gt0FPBH6fBpKwQi6ktDT',$,'Pset_JettyCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to JETTY.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/JETTY',(#2241,#2242,#2243,#2245)); -#2241=IFCSIMPLEPROPERTYTEMPLATE('1pTxVttt54bvl52_61eV8p',$,'StructuralType','Structural type of the object',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2242=IFCSIMPLEPROPERTYTEMPLATE('1kawwMfQD6jhvgt6j$ONeM',$,'BentSpacing','Bent (upright) spacing',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2243=IFCSIMPLEPROPERTYTEMPLATE('3f4_9JZxTAd9Gs8QjWq2NZ',$,'PierSectionType','Whether the structure presents a solid/closed barrier to the passage of water or is open.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2244,$,$,$,.READWRITE.); -#2244=IFCPROPERTYENUMERATION('PEnum_SectionType',(IFCLABEL('CLOSED'),IFCLABEL('OPEN')),$); -#2245=IFCSIMPLEPROPERTYTEMPLATE('1xkLzVoNz9Xu0zYQQcDGd9',$,'Elevation','Elevation of the entity',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2246=IFCPROPERTYSETTEMPLATE('1kem7nkNj688ET754iMkNk',$,'Pset_JettyDesignCriteria','Properties common to the definition of design criteria of all occurrences of IfcMarineFacility with the predefined type set to JETTY.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/JETTY',(#2247,#2248,#2249,#2250,#2251,#2252,#2253,#2254,#2255)); -#2247=IFCSIMPLEPROPERTYTEMPLATE('09obYAQU9BUAMYSe0nxnxN',$,'HighWaterLevel','High water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2248=IFCSIMPLEPROPERTYTEMPLATE('1$h2mt2w54HQDxqOAeGCaE',$,'LowWaterLevel','Low water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2249=IFCSIMPLEPROPERTYTEMPLATE('0gl3uZO_184A4grNR0veHQ',$,'ExtremeHighWaterLevel','Extreme high water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2250=IFCSIMPLEPROPERTYTEMPLATE('20J4QnowP7ERBQm60UYN8X',$,'ExtremeLowWaterLevel','Extreme low water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2251=IFCSIMPLEPROPERTYTEMPLATE('2zqlwC0WjARwLd3kLZ9gkB',$,'ShipLoading','Ship loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#2252=IFCSIMPLEPROPERTYTEMPLATE('2yUiz0F_H6eA10dK_IzvLg',$,'WaveLoading','Wave loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#2253=IFCSIMPLEPROPERTYTEMPLATE('1w$cf0D915yBdGMMLnzPJM',$,'FlowLoading','Flow loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#2254=IFCSIMPLEPROPERTYTEMPLATE('1qAk4l5qv84fEVQLPw5p5i',$,'UniformlyDistributedLoad','Uniformly Distributed Load',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#2255=IFCSIMPLEPROPERTYTEMPLATE('0tSWpW$qvA3w1kffbLdFhi',$,'EquipmentLoading','Loading from equipment',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#2256=IFCPROPERTYSETTEMPLATE('2cjlyZdDnD5xxG4$AbPPw4',$,'Pset_JunctionBoxTypeCommon','A junction box is an enclosure within which cables are connected.History: New in IFC4',.PSET_TYPEDRIVENOVERRIDE.,'IfcJunctionBox,IfcJunctionBoxType',(#2257,#2258,#2260,#2261,#2262,#2264,#2266,#2268,#2269,#2270,#2271,#2272)); -#2257=IFCSIMPLEPROPERTYTEMPLATE('2wqNUH$OrBuBAv94FFjzBX',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2258=IFCSIMPLEPROPERTYTEMPLATE('2_NqQ3HeP7EhLExCyanCCF',$,'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',$,#2259,$,$,$,.READWRITE.); -#2259=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2260=IFCSIMPLEPROPERTYTEMPLATE('05Mu1qNSPBJQENTHcaN2Sg',$,'NumberOfGangs','Number of gangs in the object.\X2\000A000A\X0\Number of slots available for switches/outlets (most commonly 1, 2, 3, or 4).',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2261=IFCSIMPLEPROPERTYTEMPLATE('3QjkNCFsf9ze47EFx8ntkg',$,'ClearDepth','The clear depth.\X2\000A000A\X0\It indicates the unobstructed depth available for cable inclusion within the junction box.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2262=IFCSIMPLEPROPERTYTEMPLATE('01Oyz1BUD9cxPY13XD9hfp',$,'ShapeType','Shape of the junction box.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2263,$,$,$,.READWRITE.); -#2263=IFCPROPERTYENUMERATION('PEnum_JunctionBoxShapeType',(IFCLABEL('RECTANGULAR'),IFCLABEL('ROUND'),IFCLABEL('SLOT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2264=IFCSIMPLEPROPERTYTEMPLATE('1s78WT9eL11hM_e6pAA2NA',$,'PlacingType','Location at which the type of junction box can be located.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2265,$,$,$,.READWRITE.); -#2265=IFCPROPERTYENUMERATION('PEnum_JunctionBoxPlacingType',(IFCLABEL('CEILING'),IFCLABEL('FLOOR'),IFCLABEL('WALL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2266=IFCSIMPLEPROPERTYTEMPLATE('1QooHklTr1UQqdSjg1TiWy',$,'JunctionBoxMountingType','Method of mounting to be adopted for the type of junction box.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2267,$,$,$,.READWRITE.); -#2267=IFCPROPERTYENUMERATION('PEnum_JunctionBoxMountingType',(IFCLABEL('CUT_IN'),IFCLABEL('FACENAIL'),IFCLABEL('SIDENAIL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2268=IFCSIMPLEPROPERTYTEMPLATE('3FaqMKtaT4SAfzl1y$BO6p',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2269=IFCSIMPLEPROPERTYTEMPLATE('0t5BjVMpn7Lhai5o1JaqyH',$,'IP_Code','IP Code, the International Protection Marking, IEC 60529), classifies and rates the degree of protection provided against intrusion.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2270=IFCSIMPLEPROPERTYTEMPLATE('0vW1MKGN102xhUTOIbomjr',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2271=IFCSIMPLEPROPERTYTEMPLATE('0cn166ILDBtfSpmF_En3Q9',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2272=IFCSIMPLEPROPERTYTEMPLATE('3JgxxZTlTBcOe$0SVPavno',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2273=IFCPROPERTYSETTEMPLATE('0HIiG1YLzD2wcQJNV1dJ0C',$,'Pset_JunctionBoxTypeData','The property set can be used by the predefined type DATA of IfcJunctionBox.',.PSET_TYPEDRIVENOVERRIDE.,'IfcJunctionBox/DATA,IfcJunctionBoxType/DATA',(#2274)); -#2274=IFCSIMPLEPROPERTYTEMPLATE('1lr2xlPb1EP8SoYkyfxjqg',$,'DataConnectionType','Indicates the data connection type of the junction box e.g. copper pair, fiber or others.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2275,$,$,$,.READWRITE.); -#2275=IFCPROPERTYENUMERATION('PEnum_DataConnectionType',(IFCLABEL('COPPER'),IFCLABEL('FIBER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2276=IFCPROPERTYSETTEMPLATE('2VWJ7CBaT9iQySTzGhh3bF',$,'Pset_KerbCommon','Properties for a kerb.',.PSET_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#2277,#2278,#2279)); -#2277=IFCSIMPLEPROPERTYTEMPLATE('2M0sYMfaH2YQSBmILu$7BY',$,'CombinedKerbGutter','Indicating the use of a combined kerb and gutter.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2278=IFCSIMPLEPROPERTYTEMPLATE('0lQ_3OjUDD08pFwCD1RjuE',$,'Upstand','The height difference between the two separated surfaces.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2279=IFCSIMPLEPROPERTYTEMPLATE('3FBeMj0BP6c9NcsKWy8F3C',$,'Mountable','Specifies whether the kerb can be readily climbed by a vehicle or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2280=IFCPROPERTYSETTEMPLATE('31Ca1q3w9EGvRnHZrGeub5',$,'Pset_KerbStone','Properties for kerb stones.',.PSET_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#2281,#2282,#2283,#2284,#2285)); -#2281=IFCSIMPLEPROPERTYTEMPLATE('3WxhnPBN16RhZcSmrYEqrs',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2282=IFCSIMPLEPROPERTYTEMPLATE('2YqooBuXX1ZB2kNtPRi4Db',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2283=IFCSIMPLEPROPERTYTEMPLATE('2OMx59onj6XBMd8p2dKQOv',$,'StoneFinishes','Eg. ''Polished'', ''Bush Hammered'', ''Split'', ''Sawn'', ''Flamed''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2284=IFCSIMPLEPROPERTYTEMPLATE('0HWpRUTPvFUvL8IEG1UcdB',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2285=IFCSIMPLEPROPERTYTEMPLATE('3lDAF9pVr14Q6zMd$9xv9Y',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2286=IFCPROPERTYSETTEMPLATE('3uXrYmtWn1LuOjtronheiq',$,'Pset_LampTypeCommon','A lamp is a component within a light fixture that is designed to emit light.History: Name changed from Pset_LampEmitterTypeCommon in IFC 2x3.',.PSET_TYPEDRIVENOVERRIDE.,'IfcLamp,IfcLampType',(#2287,#2288,#2290,#2291,#2292,#2293,#2295,#2297,#2298,#2299,#2300)); -#2287=IFCSIMPLEPROPERTYTEMPLATE('1oKK37b3r09xN5QxM9yZ3X',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2288=IFCSIMPLEPROPERTYTEMPLATE('3xPaNySorBZOlsvB1128iU',$,'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',$,#2289,$,$,$,.READWRITE.); -#2289=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2290=IFCSIMPLEPROPERTYTEMPLATE('1K4am6fLz6eeVMTHw0JkZU',$,'ContributedLuminousFlux','Luminous flux is a photometric measure of radiant flux, i.e. the volume of light emitted from a light source. Luminous flux is measured either for the interior as a whole or for a part of the interior (partial luminous flux for a solid angle). All other photometric parameters are derivatives of luminous flux. Luminous flux is measured in lumens (lm). The luminous flux is given as a nominal value for each lamp.',.P_SINGLEVALUE.,'IfcLuminousFluxMeasure',$,$,$,$,$,.READWRITE.); -#2291=IFCSIMPLEPROPERTYTEMPLATE('3Xc5FhtYH92wCgReNgsJ7a',$,'LightEmitterNominalPower','Light emitter nominal power.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#2292=IFCSIMPLEPROPERTYTEMPLATE('3HB0hEMuf2_B4mET$hIK5X',$,'LampMaintenanceFactor','Non recoverable losses of luminous flux of a lamp due to lamp depreciation; i.e. the decreasing of light output of a luminaire due to aging and dirt.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2293=IFCSIMPLEPROPERTYTEMPLATE('1QiSe$dDf47Aq6tTZUhSbD',$,'LampBallastType','The type of ballast used to stabilise gas discharge by limiting the current during operation and to deliver the necessary striking voltage for starting. Ballasts are needed to operate Discharge Lamps such as Fluorescent, Compact Fluorescent, High-pressure Mercury, Metal Halide and High-pressure Sodium Lamps.\X2\000A\X0\Magnetic ballasts are chokes which limit the current passing through a lamp connected in series on the principle of self-induction. The resultant current and power are decisive for the efficient operation of the lamp. A specially designed ballast is required for every type of lamp to comply with lamp rating in terms of Luminous Flux, Color Appearance and service life. The two types of magnetic ballasts for fluorescent lamps are KVG Conventional (EC-A series) and VVG Low-loss ballasts (EC-B series). Low-loss ballasts have a higher efficiency, which means reduced ballast losses and a lower thermal load. Electronic ballasts are used to run fluorescent lamps at high frequencies (approx. 35 - 40 kHz).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2294,$,$,$,.READWRITE.); -#2294=IFCPROPERTYENUMERATION('PEnum_LampBallastType',(IFCLABEL('CONVENTIONAL'),IFCLABEL('ELECTRONIC'),IFCLABEL('LOWLOSS'),IFCLABEL('RESISTOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2295=IFCSIMPLEPROPERTYTEMPLATE('1tiksuwdTDNxtkv8hm4WHq',$,'LampCompensationType','Identifies the form of compensation used for power factor correction and radio suppression.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2296,$,$,$,.READWRITE.); -#2296=IFCPROPERTYENUMERATION('PEnum_LampCompensationType',(IFCLABEL('CAPACITIVE'),IFCLABEL('INDUCTIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2297=IFCSIMPLEPROPERTYTEMPLATE('3buvu9iuD5LOtnzX0Rs785',$,'ColourAppearance','In both the DIN and CIE standards, artificial light sources are classified in terms of their colour appearance. To the human eye they all appear to be white; the difference can only be detected by direct comparison. Visual performance is not directly affected by differences in colour appearance.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2298=IFCSIMPLEPROPERTYTEMPLATE('3YH2w6Hx176ADZ7n2w66Tf',$,'Spectrum','The spectrum of radiation describes its composition with regard to wavelength. Light, for example, as the portion of electromagnetic radiation that is visible to the human eye, is radiation with wavelengths in the range of approx. 380 to 780 nm (1 nm = 10 m). The corresponding range of colours varies from violet to indigo, blue, green, yellow, orange, and red. These colours form a continuous spectrum, in which the various spectral sectors merge into each other.',.P_TABLEVALUE.,'IfcNumericMeasure','IfcNumericMeasure',$,$,$,$,.READWRITE.); -#2299=IFCSIMPLEPROPERTYTEMPLATE('1O9bqnHmzBFOmLFzvKE2A2',$,'ColourTemperature','The colour temperature of any source of radiation is defined as the temperature (in Kelvin) of a black-body or Planckian radiator whose radiation has the same chromaticity as the source of radiation. Often the values are only approximate colour temperatures as the black-body radiator cannot emit radiation of every chromaticity value. The colour temperatures of the commonest artificial light sources range from less than 3000K (warm white) to 4000K (intermediate) and over 5000K (daylight).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2300=IFCSIMPLEPROPERTYTEMPLATE('1lqCTW4SnCMRmDAksBYDOS',$,'ColourRenderingIndex','The CRI indicates how well a light source renders eight standard colours compared to perfect reference lamp with the same colour temperature. The CRI scale ranges from 1 to 100, with 100 representing perfect rendering properties.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2301=IFCPROPERTYSETTEMPLATE('3aci5SoQ1AZQxy7rTBNKMQ',$,'Pset_LandRegistration','Specifies the identity of land within a statutory registration system. NOTE: The property LandTitleID is to be used in preference to deprecated attribute LandTitleNumber in IfcSite.',.PSET_OCCURRENCEDRIVEN.,'IfcSite',(#2302,#2303,#2304)); -#2302=IFCSIMPLEPROPERTYTEMPLATE('0Ew9Gkh4L1FRQojUxLfmBx',$,'LandID','Identification number assigned by the statutory registration authority to a land parcel.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2303=IFCSIMPLEPROPERTYTEMPLATE('1hOLWlLm912fP9B2WD94Su',$,'IsPermanentID','Indicates whether the identity assigned to the object is permanent (= TRUE) or temporary (=FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2304=IFCSIMPLEPROPERTYTEMPLATE('2xWOA0LP1AbeVBqTB5IjE9',$,'LandTitleID','Identification number assigned by the statutory registration authority to the title to a land parcel.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2305=IFCPROPERTYSETTEMPLATE('3w7E9sVtXF59C2u3cB3dxj',$,'Pset_LightFixtureTypeCommon','Common data for light fixtures.\X2\000A\X0\History: IFC4 - Article number and manufacturer specific information deleted. Use Pset_ManufacturerTypeInformation. ArticleNumber instead. Load properties moved from Pset_LightFixtureTypeThermal (deleted).',.PSET_TYPEDRIVENOVERRIDE.,'IfcLightFixture,IfcLightFixtureType',(#2306,#2307,#2309,#2310,#2311,#2313,#2315,#2316,#2317,#2318)); -#2306=IFCSIMPLEPROPERTYTEMPLATE('2A8Utmg1T6cfUXrYl9VNOu',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2307=IFCSIMPLEPROPERTYTEMPLATE('2YiiDSHwn1GuLuh575XT_F',$,'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',$,#2308,$,$,$,.READWRITE.); -#2308=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2309=IFCSIMPLEPROPERTYTEMPLATE('2m_RDJey979hBx3lL0nz9v',$,'NumberOfSources','Number of sources .',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2310=IFCSIMPLEPROPERTYTEMPLATE('1DoHsNBbnEE8RzPJE43nit',$,'TotalWattage','Wattage on whole lightfitting device with all sources intact.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#2311=IFCSIMPLEPROPERTYTEMPLATE('1eQN8CN5r29ROPsXtDZqU9',$,'LightFixtureMountingType','A list of the available types of mounting for light fixtures from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2312,$,$,$,.READWRITE.); -#2312=IFCPROPERTYENUMERATION('PEnum_LightFixtureMountingType',(IFCLABEL('CABLESPANNED'),IFCLABEL('FREESTANDING'),IFCLABEL('POLE_SIDE'),IFCLABEL('POLE_TOP'),IFCLABEL('RECESSED'),IFCLABEL('SURFACE'),IFCLABEL('SUSPENDED'),IFCLABEL('TRACKMOUNTED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2313=IFCSIMPLEPROPERTYTEMPLATE('0laP9nq19FdvqBi7elFDBb',$,'LightFixturePlacingType','A list of the available types of placing specification for light fixtures from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2314,$,$,$,.READWRITE.); -#2314=IFCPROPERTYENUMERATION('PEnum_LightFixturePlacingType',(IFCLABEL('CEILING'),IFCLABEL('FLOOR'),IFCLABEL('FURNITURE'),IFCLABEL('POLE'),IFCLABEL('WALL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2315=IFCSIMPLEPROPERTYTEMPLATE('2f2sfr4LLB9BvaDlQ5Qx7s',$,'MaintenanceFactor','The arithmetical allowance made for depreciation of lamps and reflective equipment from their initial values due to dirt, fumes, or age.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2316=IFCSIMPLEPROPERTYTEMPLATE('2xJ5cGD1997he6N6evT$YE',$,'MaximumPlenumSensibleLoad','Maximum or Peak sensible thermal load contributed to return air plenum by the light fixture.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#2317=IFCSIMPLEPROPERTYTEMPLATE('1z90m643T6dBwNwPqr5KtL',$,'MaximumSpaceSensibleLoad','Maximum or Peak sensible thermal load contributed to the conditioned space by the light fixture.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#2318=IFCSIMPLEPROPERTYTEMPLATE('1BJKhigD95$PexIJCSF81c',$,'SensibleLoadToRadiant','Percent of sensible thermal load to radiant heat.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2319=IFCPROPERTYSETTEMPLATE('0$1dM5teL3_g73BF3uyFcX',$,'Pset_LightFixtureTypeSecurityLighting','Properties that characterize security lighting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcLightFixture/SECURITYLIGHTING,IfcLightFixtureType/SECURITYLIGHTING',(#2320,#2322,#2323,#2325,#2327,#2329)); -#2320=IFCSIMPLEPROPERTYTEMPLATE('2jB2$DS5zEmvotE5gC3yAA',$,'SecurityLightingType','The type of security lighting.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2321,$,$,$,.READWRITE.); -#2321=IFCPROPERTYENUMERATION('PEnum_LightFixtureSecurityLightingType',(IFCLABEL('BLUEILLUMINATION'),IFCLABEL('EMERGENCYEXITLIGHT'),IFCLABEL('SAFETYLIGHT'),IFCLABEL('WARNINGLIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2322=IFCSIMPLEPROPERTYTEMPLATE('1efmnrbrnESBLRMr6eNwST',$,'FixtureHeight','The height of the fixture, such as the text height of an exit sign.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2323=IFCSIMPLEPROPERTYTEMPLATE('08Z6G50f9FP8xFxW1uy235',$,'SelfTestFunction','The type of self test function.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2324,$,$,$,.READWRITE.); -#2324=IFCPROPERTYENUMERATION('PEnum_SelfTestType',(IFCLABEL('CENTRAL'),IFCLABEL('LOCAL'),IFCLABEL('NONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2325=IFCSIMPLEPROPERTYTEMPLATE('3YrMQ7J_1BCB3q9XATzPBx',$,'BackupSupplySystem','The type of backup supply system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2326,$,$,$,.READWRITE.); -#2326=IFCPROPERTYENUMERATION('PEnum_BackupSupplySystemType',(IFCLABEL('CENTRALBATTERY'),IFCLABEL('LOCALBATTERY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2327=IFCSIMPLEPROPERTYTEMPLATE('2$3WsEzJ55RBnFFFbjT2uU',$,'PictogramEscapeDirection','The direction of escape pictogram.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2328,$,$,$,.READWRITE.); -#2328=IFCPROPERTYENUMERATION('PEnum_PictogramEscapeDirectionType',(IFCLABEL('DOWNARROW'),IFCLABEL('LEFTARROW'),IFCLABEL('RIGHTARROW'),IFCLABEL('UPARROW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2329=IFCSIMPLEPROPERTYTEMPLATE('1CRgxiyfX8qBgXqIv0hpxp',$,'Addressablility','The type of addressability.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2330,$,$,$,.READWRITE.); -#2330=IFCPROPERTYENUMERATION('PEnum_AddressabilityType',(IFCLABEL('IMPLEMENTED'),IFCLABEL('NOTIMPLEMENTED'),IFCLABEL('UPGRADEABLETO'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2331=IFCPROPERTYSETTEMPLATE('2sv6B2j8LBgxoSsxmq87$9',$,'Pset_LinearReferencingMethod','Describes the manner in which measurements are made along (and optionally offset from) a linear element.NOTE Definition according to ISO 19148:2021',.PSET_OCCURRENCEDRIVEN.,'IfcAlignment,IfcReferent/POSITION',(#2332,#2333,#2335,#2336,#2337)); -#2332=IFCSIMPLEPROPERTYTEMPLATE('1y2w3DEBz6POBy6OD68FS2',$,'LRMName','Gives the name of this Linear Referencing Method, such as \X2\201C\X0\kilometre-point\X2\201D\X0\.NOTE Definition according to ISO 19148:2021.\X2\000A\X0\NOTE Names of commonly used Linear Referencing Methods are included in ISO 19148, Annex C, along with recognized name aliases.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2333=IFCSIMPLEPROPERTYTEMPLATE('1El38J8vD9ABqwIXwqjGO0',$,'LRMType','Gives the type of this Linear Referencing Method.NOTE Definition according to ISO 19148:2021, LRMType.\X2\000A\X0\NOTE Since the definition in ISO 19148:2021, LRMType is stereotyped as a CodeList it is open for user defined extensions. In this Pset this is handled by adding the enumeration constant LRM_USERDEFINED and the additional property UserDefinedLRMType',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2334,$,$,$,.READWRITE.); -#2334=IFCPROPERTYENUMERATION('PEnum_LRMType',(IFCLABEL('LRM_ABSOLUTE'),IFCLABEL('LRM_INTERPOLATIVE'),IFCLABEL('LRM_RELATIVE'),IFCLABEL('LRM_USERDEFINED')),$); -#2335=IFCSIMPLEPROPERTYTEMPLATE('2B2ozmF896bwmUUU09x65$',$,'UserDefinedLRMType','Gives the user defined type of this Linear Referencing Method when property LRMType is LRM_USERDEFINED.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2336=IFCSIMPLEPROPERTYTEMPLATE('0bqXDQZFn0IxKOKEOrVQvp',$,'LRMUnit','Specifies the units of measure used by this Linear Referencing Method for measures along the linear element being measured.NOTE Definition according to ISO 19148:2021.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2337=IFCSIMPLEPROPERTYTEMPLATE('1mrjrYt9LC0QTWIhMHUqjA',$,'LRMConstraint','Allows for the specification of constraints imposed by this Linear Referencing Method. For example, a Reference Post Linear Referencing Method may specify that referents be of type \X2\201C\X0\reference marker\X2\201D\X0\.NOTE definition according to ISO 19148:2021',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2338=IFCPROPERTYSETTEMPLATE('0ghY2Mh$1Euu6sWiYnbwU8',$,'Pset_MaintenanceStrategy','Property set for the association of a maintenance strategy to an element, asset of system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcAsset,IfcElement,IfcSystem,IfcElementType',(#2339,#2341,#2343,#2345,#2347)); -#2339=IFCSIMPLEPROPERTYTEMPLATE('2NrKt$UhLBiuZtVqMhmu_g',$,'AssetCriticality','Rating of the asset''s criticality to the operation of the facility',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2340,$,$,$,.READWRITE.); -#2340=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); -#2341=IFCSIMPLEPROPERTYTEMPLATE('3XZKxUbuzA4RtiJMNHpSOO',$,'AssetFrailty','Rating of the asset''s frailty to breakage or deterioration',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2342,$,$,$,.READWRITE.); -#2342=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); -#2343=IFCSIMPLEPROPERTYTEMPLATE('1WybEW9nX4UwmoPGiV2kOq',$,'AssetPriority','Combined criticality and frailty rating indicating the operational and maintenance priority of the asset',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2344,$,$,$,.READWRITE.); -#2344=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); -#2345=IFCSIMPLEPROPERTYTEMPLATE('23BCJs88L8JvFUUuOyRwRg',$,'MonitoringType','Monitoring strategy chosen for the asset',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2346,$,$,$,.READWRITE.); -#2346=IFCPROPERTYENUMERATION('PEnum_MonitoringType',(IFCLABEL('FEEDBACK'),IFCLABEL('INSPECTION'),IFCLABEL('IOT'),IFCLABEL('PPM'),IFCLABEL('SENSORS')),$); -#2347=IFCSIMPLEPROPERTYTEMPLATE('34FgXnIBr89AtX2$_39A6U',$,'AccidentResponse','Accident response chosen for the asset',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2348,$,$,$,.READWRITE.); -#2348=IFCPROPERTYENUMERATION('PEnum_AccidentResponse',(IFCLABEL('EMERGENCYINSPECTION'),IFCLABEL('EMERGENCYPROCEDURE'),IFCLABEL('REACTIVE'),IFCLABEL('URGENTINSPECTION'),IFCLABEL('URGENTPROCEDURE')),$); -#2349=IFCPROPERTYSETTEMPLATE('3PLZfMYY9FNh85_Oiu49O6',$,'Pset_MaintenanceTriggerCondition','Trigger levels for an asset that has an inspection-based maintenance strategy',.PSET_TYPEDRIVENOVERRIDE.,'IfcAsset,IfcElement,IfcSystem,IfcElementType',(#2350,#2352,#2354,#2356)); -#2350=IFCSIMPLEPROPERTYTEMPLATE('3s7gl1k7z7IhnDGLT1eVgC',$,'ConditionTargetPerformance','Target condition of the asset',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2351,$,$,$,.READWRITE.); -#2351=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); -#2352=IFCSIMPLEPROPERTYTEMPLATE('2237tVtFH7Vv4HlC9XnUIY',$,'ConditionMaintenanceLevel','Condition that will trigger maintenance',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2353,$,$,$,.READWRITE.); -#2353=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); -#2354=IFCSIMPLEPROPERTYTEMPLATE('3gI_u4p714HhEmMGNjeK81',$,'ConditionReplacementLevel','Condition that will trigger a replacement process',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2355,$,$,$,.READWRITE.); -#2355=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); -#2356=IFCSIMPLEPROPERTYTEMPLATE('2f7CCPLa19URQhAxwX2zr_',$,'ConditionDisposalLevel','Condition that will trigger a disposal process',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2357,$,$,$,.READWRITE.); -#2357=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); -#2358=IFCPROPERTYSETTEMPLATE('1hcJSSZjzEbwBLVQ8Mfqj2',$,'Pset_MaintenanceTriggerDuration','Trigger levels for an asset that has an PPM based maintenance strategy.',.PSET_TYPEDRIVENOVERRIDE.,'IfcAsset,IfcElement,IfcSystem,IfcElementType',(#2359,#2360,#2361,#2362)); -#2359=IFCSIMPLEPROPERTYTEMPLATE('0NC0DZIf19P9n9Xiu6ljEL',$,'DurationTargetPerformance','Target time to failure of the asset',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#2360=IFCSIMPLEPROPERTYTEMPLATE('1UrhBVwO5AX92mgixtCkqe',$,'DurationMaintenanceLevel','Duration interval at which maintenance is performed',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#2361=IFCSIMPLEPROPERTYTEMPLATE('1Yt4OsQcDDEflvnGVPRRG3',$,'DurationReplacementLevel','Duration interval at which replacement is performed',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#2362=IFCSIMPLEPROPERTYTEMPLATE('28cgL8YZD9JwoKhGDbmKg$',$,'DurationDisposalLevel','Duration interval at which disposal is performed',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#2363=IFCPROPERTYSETTEMPLATE('0HQ3syDOD1Outs0sfuxTfI',$,'Pset_MaintenanceTriggerPerformance','Properties for performance based maintenance policies',.PSET_TYPEDRIVENOVERRIDE.,'IfcAsset,IfcElement,IfcSystem,IfcElementType',(#2364,#2365,#2366,#2367)); -#2364=IFCSIMPLEPROPERTYTEMPLATE('3rybDZIGj0P85ti8vOOO7q',$,'TargetPerformance','Target capacity or performance of the asset. Units of the performance value are specified through the propertyValue units attribute.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2365=IFCSIMPLEPROPERTYTEMPLATE('3zZIxUQO968utqzZsVgF4L',$,'PerformanceMaintenanceLevel','Performance level at which maintenance takes place',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2366=IFCSIMPLEPROPERTYTEMPLATE('0ijJ5m4b99WQVis9bOR6RK',$,'ReplacementLevel','Performance level at which replacement takes place',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2367=IFCSIMPLEPROPERTYTEMPLATE('0yV7Up93b989VfHj78$PTT',$,'DisposalLevel','Performance level at which disposal takes place',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2368=IFCPROPERTYSETTEMPLATE('160pWhRgDF58okYZb$WVeg',$,'Pset_ManufacturerOccurrence','Defines properties of individual instances of manufactured products that may be given by the manufacturer.\X2\000A\X0\HISTORY: IFC 2x4: AssemblyPlace property added. This property does not need to be asserted if Pset_ManufacturerTypeInformation is allocated to the type and the AssemblyPlace property is asserted there.',.PSET_OCCURRENCEDRIVEN.,'IfcElement',(#2369,#2370,#2371,#2372,#2373,#2375)); -#2369=IFCSIMPLEPROPERTYTEMPLATE('14B7aU2eHFUw50qFmQB_q0',$,'AcquisitionDate','The date that the manufactured item was purchased.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#2370=IFCSIMPLEPROPERTYTEMPLATE('3Y8nUu44f1pPi2EO2eUnlv',$,'BarCode','The identity of the bar code given to an occurrence of the product.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2371=IFCSIMPLEPROPERTYTEMPLATE('1o0I19rFvBcO_haqmFiJWK',$,'SerialNumber','The manufacturer''s serial number assigned to an occurrence of a product.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2372=IFCSIMPLEPROPERTYTEMPLATE('0qOO5hFgzAWfr0pyJwueLA',$,'BatchReference','The identity of the batch reference from which an occurrence of a product is taken.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2373=IFCSIMPLEPROPERTYTEMPLATE('0IOV_luVj7h9KDcvww5ZUA',$,'AssemblyPlace','Enumeration defining where the assembly is intended to take place, either in a factory, other offsite location or on the building site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2374,$,$,$,.READWRITE.); -#2374=IFCPROPERTYENUMERATION('PEnum_AssemblyPlace',(IFCLABEL('FACTORY'),IFCLABEL('OFFSITE'),IFCLABEL('SITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2375=IFCSIMPLEPROPERTYTEMPLATE('019038XQXCOw7cBG653eGz',$,'ManufacturingDate','Date on which the element was manufactured.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#2376=IFCPROPERTYSETTEMPLATE('00j$QKnO1FNODcBZPbxfx9',$,'Pset_ManufacturerTypeInformation','Defines characteristics of types (ranges) of manufactured products that may be given by the manufacturer. Note that the term ''manufactured'' may also be used to refer to products that are supplied and identified by the supplier or that are assembled off site by a third party provider.\X2\000A\X0\HISTORY: This property set replaces the entity IfcManufacturerInformation from previous IFC releases. IFC 2x4: AssemblyPlace property added.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#2377,#2378,#2379,#2380,#2381,#2382,#2383,#2385,#2386,#2387)); -#2377=IFCSIMPLEPROPERTYTEMPLATE('2nzyDLBMD2xAy$bLkKya_4',$,'GlobalTradeItemNumber','The Global Trade Item Number (GTIN) is an identifier for trade items developed by GS1 (www.gs1.org).',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2378=IFCSIMPLEPROPERTYTEMPLATE('3QYYAAAYnBGhsEK1qZ7OKz',$,'ArticleNumber','Article number or reference that is be applied to a configured product according to a standard scheme for article number definition as defined by the manufacturer. It is often used as the purchasing number.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2379=IFCSIMPLEPROPERTYTEMPLATE('3VLLb_Gn13v9Xk77lovicj',$,'ModelReference','The model number or designator of the product model (or product line) as assigned by the manufacturer of the manufactured item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2380=IFCSIMPLEPROPERTYTEMPLATE('1Xg8oAb3b87hb5acyNT5rX',$,'ModelLabel','The descriptive model name of the product model (or product line) as assigned by the manufacturer of the manufactured item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2381=IFCSIMPLEPROPERTYTEMPLATE('0cN9fTpcfDaBuTs0iS_DFj',$,'Manufacturer','The organization that manufactured and/or assembled the item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2382=IFCSIMPLEPROPERTYTEMPLATE('32WeoI05n9ifiBjwMrI9Y9',$,'ProductionYear','The year of production of the manufactured item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2383=IFCSIMPLEPROPERTYTEMPLATE('3q1bMn1KXD5gwHKSPzyG7d',$,'AssemblyPlace','Enumeration defining where the assembly is intended to take place, either in a factory, other offsite location or on the building site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2384,$,$,$,.READWRITE.); -#2384=IFCPROPERTYENUMERATION('PEnum_AssemblyPlace',(IFCLABEL('FACTORY'),IFCLABEL('OFFSITE'),IFCLABEL('SITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2385=IFCSIMPLEPROPERTYTEMPLATE('3kYHL403DCTfHokBQ4$$3f',$,'OperationalDocument','Manufacturer''s operational document',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#2386=IFCSIMPLEPROPERTYTEMPLATE('08Wov4YvT5VuJjGltYiKAS',$,'SafetyDocument','Manufacturer''s safety document',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); -#2387=IFCSIMPLEPROPERTYTEMPLATE('0CBhm5UATBZg1USYUX7KTI',$,'PerformanceCertificate','Manufacturer''s performance certificate',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); -#2388=IFCPROPERTYSETTEMPLATE('2iB7SPlTr5Aeoglndbndnz',$,'Pset_MarineFacilityTransportation','Properties common to the definition of all occurrences of IfcMarineFacility which are catagorised as transportation facilities such as Ports, marinas etc.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility',(#2389,#2390,#2391)); -#2389=IFCSIMPLEPROPERTYTEMPLATE('2TV6FKsg95AxB1NE44EzJE',$,'Berths','Number of standard berths within the facility',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2390=IFCSIMPLEPROPERTYTEMPLATE('3cgztQgfD16fCqKWdiuouN',$,'BerthGrade','Berth grade',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2391=IFCSIMPLEPROPERTYTEMPLATE('0AKelyWZjFwxZRY3NBcYb_',$,'BerthCargoWeight','Total cargo weight of berths within the facility',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#2392=IFCPROPERTYSETTEMPLATE('0GJjhxpZn3SxV4gOWA0jjV',$,'Pset_MarinePartChamberCommon','Properties common to the definition of all occurrences of IfcMarinePart with the predefined type set to CHAMBER.',.PSET_OCCURRENCEDRIVEN.,'IfcMarinePart/CHAMBER',(#2393,#2394)); -#2393=IFCSIMPLEPROPERTYTEMPLATE('0PMe0xKVTB0ANKz3dxwNhw',$,'EffectiveChamberSize','Volumetric measure defining the effective chamber size for operational and design activities.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#2394=IFCSIMPLEPROPERTYTEMPLATE('3Hsoz08ibEnQheCm3Me0vn',$,'StructuralType','Structural type of the object',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2395=IFCPROPERTYSETTEMPLATE('2YwwTOtIH2wOl2iYiXsU6s',$,'Pset_MarineVehicleCommon','Properties common to the definition of all occurrences of IfcTransportElement and types of IfcTransportElementType with the predefined type set to VEHICLEMARINE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcVehicle/VEHICLEMARINE,IfcVehicleType/VEHICLEMARINE',(#2396,#2397,#2398,#2399,#2400,#2401,#2402,#2403)); -#2396=IFCSIMPLEPROPERTYTEMPLATE('2EW84ZQoX0afJqyvm_aVWd',$,'LengthBetweenPerpendiculars','Length of vessel from rudder shaft to crossing point of the bow and the loaded waterline.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2397=IFCSIMPLEPROPERTYTEMPLATE('2vXgbvhdnDMhKHzbymm35Z',$,'VesselDepth','Depth of the vessel from the main deck to the keel.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2398=IFCSIMPLEPROPERTYTEMPLATE('2z8$9ilib2YhY1GM4_HH4d',$,'VesselDraft','Depth of vessel from the waterline to the keel (LightShip, Ballasted, Maximum)',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2399=IFCSIMPLEPROPERTYTEMPLATE('3BZkx5rBX6PhOpM8xDeJrC',$,'AboveDeckProjectedWindEnd','End on projected windage area above the main deck',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#2400=IFCSIMPLEPROPERTYTEMPLATE('3DzE8oIZvA$PFzI66BxxeJ',$,'AboveDeckProjectedWindSide','Side on projected windage area above the main deck',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#2401=IFCSIMPLEPROPERTYTEMPLATE('2bj7jhqGTB$8$waFjwZeau',$,'Displacement','Weight of water displaced by the vessel',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#2402=IFCSIMPLEPROPERTYTEMPLATE('1ByMzcAlH9bOGhYZ$5HKPb',$,'CargoDeadWeight','Weight of (bulk) cargo carried',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#2403=IFCSIMPLEPROPERTYTEMPLATE('11a4v7IcbBzQXtGtB$qoH3',$,'LaneMeters','Length of lanes accommodating vehicles on roll-on, roll-off vessels',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2404=IFCPROPERTYSETTEMPLATE('2QUlkej1b5iQeiRPhEnWIl',$,'Pset_MarineVehicleDesignCriteria','Properties common to the definition of design criteria of all occurrences of IfcTransportElement and types of IfcTransportElementType with the predefined type set to MARINEVEHICLE',.PSET_TYPEDRIVENOVERRIDE.,'IfcVehicle/VEHICLEMARINE,IfcVehicleType/VEHICLEMARINE',(#2405,#2406)); -#2405=IFCSIMPLEPROPERTYTEMPLATE('0Wde_nqVX29vZxWDfMreQc',$,'AllowableHullPressure','Allowable contact pressure between fender and hull',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2406=IFCSIMPLEPROPERTYTEMPLATE('1i4X5B4jb00u20m2Ah$29n',$,'SoftnessCoefficient','Vessel flexibility factor - proportion of impact energy absorbed by the hull.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2407=IFCPROPERTYSETTEMPLATE('2vcIr2UuD4E9MrNEVHsA39',$,'Pset_MarkerGeneral','Properties common to a signalling marker made as an assembly of elements. The property set can be used by the predefined type SIGNAL_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SIGNALASSEMBLY,IfcElementAssemblyType/SIGNALASSEMBLY',(#2408,#2409,#2411,#2412,#2413)); -#2408=IFCSIMPLEPROPERTYTEMPLATE('0$AChl37v33whgARF3hdZc',$,'ApproachSpeed','The design speed of trains approaching the signal if different from the line speed.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#2409=IFCSIMPLEPROPERTYTEMPLATE('1wui3rCGv2Bh7lww7F3bVX',$,'MarkerType','The type of marker (sign) e.g. stop signal, restriction signal, track circuit tuning zone sign or others specified in PEnum_MarkerType.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2410,$,$,$,.READWRITE.); -#2410=IFCPROPERTYENUMERATION('PEnum_MarkerType',(IFCLABEL('APPROACHING_MARKER'),IFCLABEL('CABLE_POST_MARKER'),IFCLABEL('COMMUNICATION_MODE_CONVERSION_MARKER'),IFCLABEL('EMU_STOP_POSITION_SIGN'),IFCLABEL('FOUR_ASPECT_CAB_SIGNAL_CONNECT_SIGN'),IFCLABEL('FOUR_ASPECT_CAB_SIGNAL_DISCONNECT_SIGN'),IFCLABEL('LEVEL_CONVERSION_SIGN'),IFCLABEL('LOCOMOTIVE_STOP_POSITION_SIGN'),IFCLABEL('RELAY_STATION_SIGN'),IFCLABEL('RESTRICTION_PLACE_SIGN'),IFCLABEL('RESTRICTION_PROTECTION_AREA_TERMINAL_SIGN'),IFCLABEL('RESTRICTION_SIGN'),IFCLABEL('SECTION_SIGNAL_MARKER'),IFCLABEL('STOP_SIGN'),IFCLABEL('TRACK_CIRCUIT_TUNING_ZONE_SIGN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2411=IFCSIMPLEPROPERTYTEMPLATE('2c0nf$m753$fnFdvhj0LLt',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A000A\X0\The nominal height of the furniture of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2412=IFCSIMPLEPROPERTYTEMPLATE('3I$FYDPMP2HuIbNlDL4_XX',$,'Symbol','Content which is shown on the sign, e.g. text, number, arrow or icon. The string can also be a pointer to a symbol catalog.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#2413=IFCSIMPLEPROPERTYTEMPLATE('2p5hnXcrP0uOg$y8Hm6eRm',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2414=IFCPROPERTYSETTEMPLATE('0dX5YhXrP3mxtSoIzmije1',$,'Pset_MarkingLinesCommon','Properties for line markings.',.PSET_OCCURRENCEDRIVEN.,'IfcSurfaceFeature/LINEMARKING',(#2415,#2416,#2417)); -#2415=IFCSIMPLEPROPERTYTEMPLATE('0SMRL1Lp9FNhKWjqBzydlM',$,'DashedLine','State if the line is dashed or continuous',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2416=IFCSIMPLEPROPERTYTEMPLATE('3v7yyq7DL1hexBrVwCHSIg',$,'DashedLinePattern','Indicates the pattern for dashed line types e.g. ''3+9''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2417=IFCSIMPLEPROPERTYTEMPLATE('03PUAYNBH08vBJG9e_pJsi',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2418=IFCPROPERTYSETTEMPLATE('3OvVeSbqPAjeAJlD2vzngz',$,'Pset_MaterialCombustion','A set of extended material properties of products of combustion generated by elements typically used within the context of building services and flow distribution systems.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2419,#2420,#2421,#2422)); -#2419=IFCSIMPLEPROPERTYTEMPLATE('1kS5_PDfPF3BPbPK39P8KY',$,'SpecificHeatCapacity','Defines the specific heat capacity of a material.\X2\000A000A\X0\Specific heat of the products of combustion: heat energy absorbed per temperature unit.',.P_SINGLEVALUE.,'IfcSpecificHeatCapacityMeasure',$,$,$,$,$,.READWRITE.); -#2420=IFCSIMPLEPROPERTYTEMPLATE('3_TQt72wr4sfwdinvCnhen',$,'N20Content','Nitrous oxide (N2O) content of the products of combustion. This is measured in weight of N2O per unit weight and is therefore unitless.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2421=IFCSIMPLEPROPERTYTEMPLATE('1kVUzKwDPC7gcYnlom1XAH',$,'COContent','Carbon monoxide (CO) content of the products of combustion. This is measured in weight of CO per unit weight and is therefore unitless.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2422=IFCSIMPLEPROPERTYTEMPLATE('0Xep6Ap7f9oBrYRK_HO2fM',$,'CO2Content','Carbon dioxide (CO2) content of the products of combustion. This is measured in weight of CO2 per unit weight and is therefore unitless.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2423=IFCPROPERTYSETTEMPLATE('0vnh5fZl5438uzTWYKqtcz',$,'Pset_MaterialCommon','A set of general material properties.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2424,#2425,#2426)); -#2424=IFCSIMPLEPROPERTYTEMPLATE('2JRpTxIWrA9eS_btjGnGIy',$,'MolecularWeight','Molecular weight of material (typically gas).',.P_SINGLEVALUE.,'IfcMolecularWeightMeasure',$,$,$,$,$,.READWRITE.); -#2425=IFCSIMPLEPROPERTYTEMPLATE('16GGDM7MTDS8pxPizYs$wS',$,'Porosity','The void fraction of the total volume occupied by material (Vbr - Vnet)/Vbr.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2426=IFCSIMPLEPROPERTYTEMPLATE('1pyytcgRv0U85QoDoCEgRm',$,'MassDensity','Material mass density.',.P_SINGLEVALUE.,'IfcMassDensityMeasure',$,$,$,$,$,.READWRITE.); -#2427=IFCPROPERTYSETTEMPLATE('2YevSUwLn3HOqNv6GH95mx',$,'Pset_MaterialConcrete','A set of extended mechanical properties related to concrete materials.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2428,#2429,#2430,#2431,#2432,#2433)); -#2428=IFCSIMPLEPROPERTYTEMPLATE('1_vZsymXrELB7OsEOkaOm5',$,'CompressiveStrength','The compressive strength of the object or material.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2429=IFCSIMPLEPROPERTYTEMPLATE('1HAcJvQU53nOYaKuG2Q2fd',$,'MaxAggregateSize','The maximum aggregate size of the concrete.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2430=IFCSIMPLEPROPERTYTEMPLATE('0qd0c6va91NeTQbWbNOP0Q',$,'AdmixturesDescription','Description of the admixtures added to the concrete mix.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2431=IFCSIMPLEPROPERTYTEMPLATE('1fszDt0Sr9P89wM2f6$2Df',$,'Workability','Description of the workability of the fresh concrete defined according to local standards.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2432=IFCSIMPLEPROPERTYTEMPLATE('1_evCRUbT4jOI23p$zRRdj',$,'WaterImpermeability','Description of the water impermeability denoting the water repelling properties.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2433=IFCSIMPLEPROPERTYTEMPLATE('3nNNMa0AHCFud$qG8p162E',$,'ProtectivePoreRatio','The protective pore ratio indicating the frost-resistance of the concrete.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2434=IFCPROPERTYSETTEMPLATE('1xsXt$6Nr0n9a60VBqlpR7',$,'Pset_MaterialEnergy','A set of extended material properties for energy calculation purposes.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2435,#2436,#2437,#2438,#2439,#2440,#2441)); -#2435=IFCSIMPLEPROPERTYTEMPLATE('19Dvp9vdL2jfxngwiuhj4c',$,'ViscosityTemperatureDerivative','Viscosity temperature derivative.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2436=IFCSIMPLEPROPERTYTEMPLATE('24JG_cpIT7_f$9TUamAEnm',$,'MoistureCapacityThermalGradient','Thermal gradient coefficient for moisture capacity. Based on water vapor density.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2437=IFCSIMPLEPROPERTYTEMPLATE('2IG7x3_LDAWuO782j1$Gky',$,'ThermalConductivityTemperatureDerivative','Thermal conductivity temperature derivative.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2438=IFCSIMPLEPROPERTYTEMPLATE('2rIJ8ICPb1IxJGhNAOSM2s',$,'SpecificHeatTemperatureDerivative','Specific heat temperature derivative.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2439=IFCSIMPLEPROPERTYTEMPLATE('1V0H6uR112QBF7NgeAu8TJ',$,'VisibleRefractionIndex','Index of refraction (visible) defines the "bending" of the sola! r ray in the visible spectrum when it passes from one medium into another.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2440=IFCSIMPLEPROPERTYTEMPLATE('1QZuA_dfH6VxJQLaLD8MmN',$,'SolarRefractionIndex','Index of refraction (solar) defines the "bending" of the solar ray when it passes from one medium into another.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2441=IFCSIMPLEPROPERTYTEMPLATE('1oyOBFx8r8EvKSyfYmyhNE',$,'GasPressure','Fill pressure (e.g. for between-pane gas fills): the pressure exerted by a mass of gas confined in a constant volume.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2442=IFCPROPERTYSETTEMPLATE('3cFt$p$JvEGw_CVG$vrOQX',$,'Pset_MaterialFuel','A set of extended material properties of fuel energy typically used within the context of building services and flow distribution systems.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2443,#2444,#2445,#2446)); -#2443=IFCSIMPLEPROPERTYTEMPLATE('24cYkjAf94BvNXaw6cTwh0',$,'CombustionTemperature','Combustion temperature.\X2\000A000A\X0\Combustion temperature of the material when air is at 298 K and 100 kPa.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2444=IFCSIMPLEPROPERTYTEMPLATE('0CgWhCBE9DOx8w5DDeBzNq',$,'CarbonContent','The carbon content in the fuel. This is measured in weight of carbon per unit weight of fuel and is therefore unitless.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2445=IFCSIMPLEPROPERTYTEMPLATE('3JC0$xDiD70uYWYHEkret2',$,'LowerHeatingValue','Lower Heating Value is defined as the amount of energy released (MJ/kg) when a fuel is burned completely, and H2O is in vapor form in the combustion products.',.P_SINGLEVALUE.,'IfcHeatingValueMeasure',$,$,$,$,$,.READWRITE.); -#2446=IFCSIMPLEPROPERTYTEMPLATE('2xErrIPFvFE8sy5GWVzgpR',$,'HigherHeatingValue','Higher Heating Value is defined as the amount of energy released (MJ/kg) when a fuel is burned completely, and H2O is in liquid form in the combustion products.',.P_SINGLEVALUE.,'IfcHeatingValueMeasure',$,$,$,$,$,.READWRITE.); -#2447=IFCPROPERTYSETTEMPLATE('2OkhjvH7PBAh5fubUx4Ysv',$,'Pset_MaterialHygroscopic','A set of hygroscopic properties of materials.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2448,#2449,#2450,#2451,#2452)); -#2448=IFCSIMPLEPROPERTYTEMPLATE('0TMETMxcD4FRBD0XE1nQ2z',$,'UpperVaporResistanceFactor','The vapor permeability relationship of air/material (typically value > 1), measured in high relative humidity (typically in 95/50 % RH).',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2449=IFCSIMPLEPROPERTYTEMPLATE('26ehO4Ou94hxxqeXVHVQij',$,'LowerVaporResistanceFactor','The vapor permeability relationship of air/material (typically value > 1), measured in low relative humidity (typically in 0/50 % RH).',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2450=IFCSIMPLEPROPERTYTEMPLATE('3uYllFeTj31Pvz_6RCKLlr',$,'IsothermalMoistureCapacity','Based on water vapor density.',.P_SINGLEVALUE.,'IfcIsothermalMoistureCapacityMeasure',$,$,$,$,$,.READWRITE.); -#2451=IFCSIMPLEPROPERTYTEMPLATE('24wFzBbCr0mub9ERzgVsbe',$,'VaporPermeability','The rate of water vapor transmission per unit area per unit of vapor pressure differential under test conditions.',.P_SINGLEVALUE.,'IfcVaporPermeabilityMeasure',$,$,$,$,$,.READWRITE.); -#2452=IFCSIMPLEPROPERTYTEMPLATE('3WYseYV1zDbPXRHc3pYsgx',$,'MoistureDiffusivity','Moisture diffusivity is a transport property that is frequently used in the hygrothermal analysis of building envelope components.',.P_SINGLEVALUE.,'IfcMoistureDiffusivityMeasure',$,$,$,$,$,.READWRITE.); -#2453=IFCPROPERTYSETTEMPLATE('2CY1XJcWjC9Q7Dxo2$tdLX',$,'Pset_MaterialMechanical','A set of mechanical material properties normally used for structural analysis purpose. It contains all properties which are independent of the actual material type.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2454,#2455,#2456,#2457,#2458)); -#2454=IFCSIMPLEPROPERTYTEMPLATE('3doAUPBeP7SuDr6kC5uwQf',$,'DynamicViscosity','A measure of the viscous resistance of the material.',.P_SINGLEVALUE.,'IfcDynamicViscosityMeasure',$,$,$,$,$,.READWRITE.); -#2455=IFCSIMPLEPROPERTYTEMPLATE('3n38QUglb9nhl5Gkdqlm1B',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2456=IFCSIMPLEPROPERTYTEMPLATE('2fzT5ap_95ThJ5Z0siBRFk',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2457=IFCSIMPLEPROPERTYTEMPLATE('2oaOpiXtbDUen77Ck8fprw',$,'PoissonRatio','A measure of the lateral deformations in the elastic range.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2458=IFCSIMPLEPROPERTYTEMPLATE('2tahvEf$z0xOhOqx9BVqHU',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); -#2459=IFCPROPERTYSETTEMPLATE('3_NRkiNOfF7RA8pv1sjrCx',$,'Pset_MaterialOptical','A set of optical properties of materials.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2460,#2461,#2462,#2463,#2464,#2465,#2466,#2467,#2468)); -#2460=IFCSIMPLEPROPERTYTEMPLATE('3AEtF9eVj9rPUfcHkdI5g0',$,'VisibleTransmittance','Transmittance at normal incidence (visible). Defines the fraction of the visible spectrum of solar radiation that passes through per unit area, perpendicular to the surface.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2461=IFCSIMPLEPROPERTYTEMPLATE('3NpfY5L990pejXn3Z5z3mc',$,'SolarTransmittance','The ratio of incident solar radiation that directly passes through a system (also named \X2\03C4\X0\e). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2462=IFCSIMPLEPROPERTYTEMPLATE('3b_TcQESvBseYfswf76cSp',$,'ThermalIrTransmittance','Thermal IR transmittance at normal incidence. Defines the fraction of thermal energy that passes through per unit area, perpendicular to the surface.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2463=IFCSIMPLEPROPERTYTEMPLATE('1wWZPR5Dz3oBGbddwBCUoB',$,'ThermalIrEmissivityBack','Thermal IR emissivity: back side. Defines the fraction of thermal energy emitted per unit area to "blackbody" at the same temperature, through the "back" side of the material.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2464=IFCSIMPLEPROPERTYTEMPLATE('00bTtMPnr04f2sLp6_kJ2_',$,'ThermalIrEmissivityFront','Thermal IR emissivity: front side. Defines the fraction of thermal energy emitted per unit area to "blackbody" at the same temperature, through the "front" side of the material.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2465=IFCSIMPLEPROPERTYTEMPLATE('2CW61Ga590zOproIx5M3jR',$,'VisibleReflectanceBack','Reflectance at normal incidence (visible): back side. Defines the fraction of the solar ray in the visible spectrum that is reflected and not transmitted when the ray passes from one medium into another, at the "back" side of the other material, perpendicular to the surface. Dependent on material and surface characteristics.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2466=IFCSIMPLEPROPERTYTEMPLATE('3iq4rLcDPACQDL$KkFjxWj',$,'VisibleReflectanceFront','Reflectance at normal incidence (visible): front side. Defines the fraction of the solar ray in the visible spectrum that is reflected and not transmitted when the ray passes from one medium into another, at the "front" side of the other material, perpendicular to the surface. Dependent on material and surface characteristics.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2467=IFCSIMPLEPROPERTYTEMPLATE('2IoCQzPMnAOhuk7Hb8DZVZ',$,'SolarReflectanceBack','Reflectance at normal incidence (solar): back side. Defines the fraction of the solar ray that is reflected and not transmitted when the ray passes from one medium into another, at the "back" side of the other material, perpendicular to the surface. Dependent on material and surface characteristics.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2468=IFCSIMPLEPROPERTYTEMPLATE('3la1TWjofEV9jHa4rEOBH0',$,'SolarReflectanceFront','Reflectance at normal incidence (solar): front side. Defines the fraction of the solar ray that is reflected and not transmitted when the ray passes from one medium into another, at the "front" side of the other material, perpendicular to the surface. Dependent on material and surface characteristics.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2469=IFCPROPERTYSETTEMPLATE('0i3qtkTUv2IQrtMoY2hxHb',$,'Pset_MaterialSteel','A set of extended mechanical properties related to steel (or other metallic and isotropic) materials.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2470,#2471,#2472,#2473,#2474,#2475,#2476,#2477)); -#2470=IFCSIMPLEPROPERTYTEMPLATE('0OQS1WX_1FfR8t5pBqz12A',$,'YieldStress','A measure of the yield stress (or characteristic 0.2 percent proof stress) of the material.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2471=IFCSIMPLEPROPERTYTEMPLATE('0G98n2PHj2688YagMyDFpO',$,'UltimateStress','A measure of the ultimate stress of the material.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2472=IFCSIMPLEPROPERTYTEMPLATE('1PPS4VcpbDMf8kq9sPDkV0',$,'UltimateStrain','A measure of the (engineering) strain at the state of ultimate stress of the material.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2473=IFCSIMPLEPROPERTYTEMPLATE('2pgLCLx8D3bgXrzqSLA6SN',$,'HardeningModule','A measure of the hardening module of the material (slope of stress versus strain curve after yield range).',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2474=IFCSIMPLEPROPERTYTEMPLATE('2uvaOwTb11S8EDcZtxXJOM',$,'ProportionalStress','A measure of the proportional stress of the material. It describes the stress before the first plastic deformation occurs and is commonly measured at a deformation of 0.01%.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2475=IFCSIMPLEPROPERTYTEMPLATE('3YxL1R_M98IfXxzcIgyb1Y',$,'PlasticStrain','A measure of the permanent displacement, as in slip or twinning, which remains after the stress has been removed. Currently applied to a strain of 0.2% proportional stress of the material.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2476=IFCSIMPLEPROPERTYTEMPLATE('3ILapWV6951RIrHi4hNG7G',$,'Relaxations','Measures of decrease in stress over long time intervals resulting from plastic flow. Different relaxation values for different initial stress levels for a material may be given. It describes the time dependent relative relaxation value for a given initial stress level at constant strain.\X2\000A\X0\Relating values are the "RelaxationValue". Related values are the "InitialStress"',.P_TABLEVALUE.,'IfcNormalisedRatioMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); -#2477=IFCSIMPLEPROPERTYTEMPLATE('3a22kU71HDrP$jtDiA4vi1',$,'StructuralGrade','Classification label to define mechanical properties according to structural grades defined in published standards; designated by numbers, letters, or a combination of both.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2478=IFCPROPERTYSETTEMPLATE('1$LJ$QAHH6FApL7aHLdzqq',$,'Pset_MaterialThermal','A set of thermal material properties.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2479,#2480,#2481,#2482)); -#2479=IFCSIMPLEPROPERTYTEMPLATE('35ppn26ffCuPwuoAnOqk1j',$,'SpecificHeatCapacity','Defines the specific heat capacity of a material.\X2\000A000A\X0\Defines the specific heat of the material: heat energy absorbed per temperature unit.',.P_SINGLEVALUE.,'IfcSpecificHeatCapacityMeasure',$,$,$,$,$,.READWRITE.); -#2480=IFCSIMPLEPROPERTYTEMPLATE('3Upe5ycdTD5fNy2H8Ti7LG',$,'BoilingPoint','The boiling point of the material (fluid).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2481=IFCSIMPLEPROPERTYTEMPLATE('3z7IohmTPDiO$TfntnPRdc',$,'FreezingPoint','The freezing point of the material (fluid).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2482=IFCSIMPLEPROPERTYTEMPLATE('11ISsO0grEyeBdGclbP2L_',$,'ThermalConductivity','The thermal conductivity of the object.\X2\000A000A\X0\The rate at which thermal energy is transmitted through the material.',.P_SINGLEVALUE.,'IfcThermalConductivityMeasure',$,$,$,$,$,.READWRITE.); -#2483=IFCPROPERTYSETTEMPLATE('1bXSNwIkf0FvvPJ9k2lggD',$,'Pset_MaterialWater','A set of extended material properties for of water typically used within the context of building services and flow distribution systems.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2484,#2485,#2486,#2487,#2488,#2489,#2490)); -#2484=IFCSIMPLEPROPERTYTEMPLATE('0JVjK$cnTDJg2GUEoiMO8E',$,'IsPotable','If TRUE, then the water is considered potable.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2485=IFCSIMPLEPROPERTYTEMPLATE('2ONklesojBqgRQcgxXtwjk',$,'Hardness','Water hardness as positive, multivalent ion concentration in the water (usually concentrations of calcium and magnesium ions in terms of calcium carbonate).',.P_SINGLEVALUE.,'IfcIonConcentrationMeasure',$,$,$,$,$,.READWRITE.); -#2486=IFCSIMPLEPROPERTYTEMPLATE('3f83ZIKqj3IOSqsvWiYP8L',$,'AlkalinityConcentration','Maximum alkalinity concentration (maximum sum of concentrations of each of the negative ions substances measured as CaCO3).',.P_SINGLEVALUE.,'IfcIonConcentrationMeasure',$,$,$,$,$,.READWRITE.); -#2487=IFCSIMPLEPROPERTYTEMPLATE('0lIcI4XFr5jQMJRPZKelgv',$,'AcidityConcentration','Maximum CaCO3 equivalent that would neutralize the acid.',.P_SINGLEVALUE.,'IfcIonConcentrationMeasure',$,$,$,$,$,.READWRITE.); -#2488=IFCSIMPLEPROPERTYTEMPLATE('2i7eYB7Rj3gQd5wPsDoLWe',$,'ImpuritiesContent','Fraction of impurities such as dust to the total amount of water. This is measured in weight of impurities per weight of water and is therefore unitless.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2489=IFCSIMPLEPROPERTYTEMPLATE('0hyoiqQGrFIhNSgeMBWsxH',$,'DissolvedSolidsContent','Fraction of the dissolved solids to the total amount of water. This is measured in weight of dissolved solids per weight of water and is therefore unitless.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#2490=IFCSIMPLEPROPERTYTEMPLATE('1sNd08OdL38BwpK8APMwt2',$,'PHLevel','Maximum water PH in a range from 0-14.',.P_SINGLEVALUE.,'IfcPHMeasure',$,$,$,$,$,.READWRITE.); -#2491=IFCPROPERTYSETTEMPLATE('3y8o2Reo52sfUG1YjXoD$H',$,'Pset_MaterialWood','This is a collection of properties applicable to wood-based materials that specify kind and grade of material as well as moisture related parameters.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2492,#2493,#2494,#2495,#2496,#2497,#2498,#2499,#2500)); -#2492=IFCSIMPLEPROPERTYTEMPLATE('1OiwyZd$jFTeAFqRFnEB62',$,'Species','Wood species of a solid wood or laminated wood product.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2493=IFCSIMPLEPROPERTYTEMPLATE('0KcLaluQHBtQOH7HNoeuMQ',$,'StrengthGrade','Grade with respect to mechanical strength and stiffness.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2494=IFCSIMPLEPROPERTYTEMPLATE('101E887AvEJhEN4nHmzeQ1',$,'AppearanceGrade','Grade with respect to visual quality.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2495=IFCSIMPLEPROPERTYTEMPLATE('1jSwhn7u90OOio66wfkK63',$,'Layup','Configuration of the lamination.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2496=IFCSIMPLEPROPERTYTEMPLATE('3zFrfLDn5AHwr4jjYsrkeX',$,'Layers','Number of layers.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2497=IFCSIMPLEPROPERTYTEMPLATE('1rvioeKzD0dRJHqDpPQ4xe',$,'Plies','Number of plies.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2498=IFCSIMPLEPROPERTYTEMPLATE('1iexdIADvD0QZc91KvNcAN',$,'MoistureContent','Total weight of moisture relative to oven-dried weight of the wood.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2499=IFCSIMPLEPROPERTYTEMPLATE('1bNhUlHL18P8aNTmcseUnu',$,'DimensionalChangeCoefficient','Weighted dimensional change coefficient, relative to 1% change in moisture content.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2500=IFCSIMPLEPROPERTYTEMPLATE('1DsNocvHz0RgfTUDFesQ5W',$,'ThicknessSwelling','Swelling ratio relative to board depth.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2501=IFCPROPERTYSETTEMPLATE('0o4oHG_DX2bQQ_mNyTGCIw',$,'Pset_MaterialWoodBasedStructure','Properties about Material of Wood Based Structure.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2502)); -#2502=IFCSIMPLEPROPERTYTEMPLATE('3GsJ2MS4T44Pf4BQTH3roA',$,'ApplicableStructuralDesignMethod','Determines whether mechanical material properties are applicable to ''ASD'' = allowable stress design (working stress design), ''LSD'' = limit state design, or ''LRFD'' = load and resistance factor design.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2503=IFCPROPERTYSETTEMPLATE('2bUqHgD4TApQSxZ7__B00z',$,'Pset_MechanicalBeamInPlane','Properties about Mechanical Beam in Plane.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2504,#2505,#2506,#2507,#2508,#2509,#2510,#2511,#2512,#2513,#2514,#2515,#2516,#2517,#2518,#2519)); -#2504=IFCSIMPLEPROPERTYTEMPLATE('0lLANa0Of5BeQqYCi89pwh',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2505=IFCSIMPLEPROPERTYTEMPLATE('3md3l8NB97hg9xmRJeOsFZ',$,'YoungModulusMin','Elastic modulus, minimal value, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2506=IFCSIMPLEPROPERTYTEMPLATE('2q5WJl3Nf9rhOR7gDQyVcM',$,'YoungModulusPerp','Elastic modulus, mean value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2507=IFCSIMPLEPROPERTYTEMPLATE('3_ZhC2B49FTOGTE2F_Cyv3',$,'YoungModulusPerpMin','Elastic modulus, minimal value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2508=IFCSIMPLEPROPERTYTEMPLATE('0VyGrmV2XFshALSi8_oe9i',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2509=IFCSIMPLEPROPERTYTEMPLATE('3aWULsQdPC3uRH8pNk3_rt',$,'ShearModulusMin','Shear modulus, minimal value.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2510=IFCSIMPLEPROPERTYTEMPLATE('31hP15Bp9E5QAdWjEzkX9P',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2511=IFCSIMPLEPROPERTYTEMPLATE('18BM7dORv7Q8gLBJKer9H1',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2512=IFCSIMPLEPROPERTYTEMPLATE('35TdQ_RWn6$BT7HIX3DXCx',$,'TensileStrengthPerp','Tensile strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2513=IFCSIMPLEPROPERTYTEMPLATE('2vN$MQuMvEmQo0nBA1jRVE',$,'CompStrength','Compressive strength, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2514=IFCSIMPLEPROPERTYTEMPLATE('3xWGmOYW5D9POKKPUcgzh0',$,'CompStrengthPerp','Compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2515=IFCSIMPLEPROPERTYTEMPLATE('0jLEe4pHn1nxvkGPWRPrkI',$,'RaisedCompStrengthPerp','Alternative value for compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\, which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2516=IFCSIMPLEPROPERTYTEMPLATE('2LDY6MyuTDe9xyrMwXJE5n',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2517=IFCSIMPLEPROPERTYTEMPLATE('2Pl8ZCttPESAd1cp_whz6j',$,'TorsionalStrength','Shear strength in torsion.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2518=IFCSIMPLEPROPERTYTEMPLATE('25dSeiafv4B8Ym1kUoEulB',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2519=IFCSIMPLEPROPERTYTEMPLATE('3sgsLm735FmA5INr0dGlTo',$,'InstabilityFactors','Defining values: slenderness ratios; defined values: either factors or divisors of the strength, depending on the design method (if <1: factors, if >1: divisors).',.P_TABLEVALUE.,'IfcPositiveRatioMeasure','IfcPositiveRatioMeasure',$,$,$,$,.READWRITE.); -#2520=IFCPROPERTYSETTEMPLATE('1W_181x4P93vGuyWv8qL1v',$,'Pset_MechanicalBeamInPlaneNegative','Properties about Mechanical Beam in Plane Negative.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2521,#2522,#2523,#2524,#2525,#2526,#2527,#2528,#2529,#2530,#2531,#2532,#2533,#2534,#2535,#2536)); -#2521=IFCSIMPLEPROPERTYTEMPLATE('11TndYRF9A2vG3Pb9NjNr4',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2522=IFCSIMPLEPROPERTYTEMPLATE('1vDLe0K4n84x2bATFlsaW7',$,'YoungModulusMin','Elastic modulus, minimal value, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2523=IFCSIMPLEPROPERTYTEMPLATE('3_628eennFThNDoKy27OGE',$,'YoungModulusPerp','Elastic modulus, mean value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2524=IFCSIMPLEPROPERTYTEMPLATE('1L4KayOaDCN8$c4EFrsnNA',$,'YoungModulusPerpMin','Elastic modulus, minimal value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2525=IFCSIMPLEPROPERTYTEMPLATE('0VcGN2OALCcfV5s0ByI7Ol',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2526=IFCSIMPLEPROPERTYTEMPLATE('2LZLqJS797yuSsczMlTjxy',$,'ShearModulusMin','Shear modulus, minimal value.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2527=IFCSIMPLEPROPERTYTEMPLATE('29p$mNSurCS9kTUc9Fo18V',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2528=IFCSIMPLEPROPERTYTEMPLATE('3RUlY5flP1$BHZb_et59h7',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2529=IFCSIMPLEPROPERTYTEMPLATE('3OIsx$Kj96txow_FEVoCn9',$,'TensileStrengthPerp','Tensile strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2530=IFCSIMPLEPROPERTYTEMPLATE('0j4P0n3Q5EEB3Skil_ytVD',$,'CompStrength','Compressive strength, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2531=IFCSIMPLEPROPERTYTEMPLATE('3vigswGS1B$8V$Tw7gU2Az',$,'CompStrengthPerp','Compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2532=IFCSIMPLEPROPERTYTEMPLATE('03RaO9AsXAFABlYrL0cZXT',$,'RaisedCompStrengthPerp','Alternative value for compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\, which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2533=IFCSIMPLEPROPERTYTEMPLATE('00neLXDpf6exrxWUWIk7iF',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2534=IFCSIMPLEPROPERTYTEMPLATE('2ekRpGXljCX85Qrl5j7tMF',$,'TorsionalStrength','Shear strength in torsion.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2535=IFCSIMPLEPROPERTYTEMPLATE('2_N7H4ij50CQwzmSvJrNj8',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2536=IFCSIMPLEPROPERTYTEMPLATE('2fjzRZOeH5zBCMJcFtNyCh',$,'InstabilityFactors','Defining values: slenderness ratios; defined values: either factors or divisors of the strength, depending on the design method (if <1: factors, if >1: divisors).',.P_TABLEVALUE.,'IfcPositiveRatioMeasure','IfcPositiveRatioMeasure',$,$,$,$,.READWRITE.); -#2537=IFCPROPERTYSETTEMPLATE('35s5ZjmJX14vyLRmbEKOah',$,'Pset_MechanicalBeamOutOfPlane','Properties about Mechanical Beam Out Of Plane.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2538,#2539,#2540,#2541,#2542,#2543,#2544,#2545,#2546,#2547,#2548,#2549,#2550,#2551,#2552,#2553)); -#2538=IFCSIMPLEPROPERTYTEMPLATE('2HOGklrmf71vdYX$EyfjDX',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2539=IFCSIMPLEPROPERTYTEMPLATE('1F4K$AzsD11OEmF_nIt2_Z',$,'YoungModulusMin','Elastic modulus, minimal value, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2540=IFCSIMPLEPROPERTYTEMPLATE('02FxLQNyP8A8EpeyqQtqnk',$,'YoungModulusPerp','Elastic modulus, mean value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2541=IFCSIMPLEPROPERTYTEMPLATE('3Np_6M3uj0zOWp97_NFpQB',$,'YoungModulusPerpMin','Elastic modulus, minimal value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2542=IFCSIMPLEPROPERTYTEMPLATE('2dv7d3uYTEnO2ZAdnS31fG',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2543=IFCSIMPLEPROPERTYTEMPLATE('0mH0CxVdz3Jw7RdklmOsnv',$,'ShearModulusMin','Shear modulus, minimal value.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2544=IFCSIMPLEPROPERTYTEMPLATE('1T85oZyAvELuevQ7KcLoDw',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2545=IFCSIMPLEPROPERTYTEMPLATE('2Rcmqb0vf5LRPPEEDbQ8t7',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2546=IFCSIMPLEPROPERTYTEMPLATE('1mZraJCqnBSv87fD7JzCBe',$,'TensileStrengthPerp','Tensile strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2547=IFCSIMPLEPROPERTYTEMPLATE('0H9WkIzaz5LfObPSX4g7xi',$,'CompStrength','Compressive strength, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2548=IFCSIMPLEPROPERTYTEMPLATE('1XyA1$cg10d9l1$bnc$xHa',$,'CompStrengthPerp','Compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2549=IFCSIMPLEPROPERTYTEMPLATE('2FpvAzpJzDtQSIaaCwevwT',$,'RaisedCompStrengthPerp','Alternative value for compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\, which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2550=IFCSIMPLEPROPERTYTEMPLATE('1kMcKxh_r53RsBSE07YvqF',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2551=IFCSIMPLEPROPERTYTEMPLATE('0PXnZCEDXESPwZb1LHj2uR',$,'TorsionalStrength','Shear strength in torsion.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2552=IFCSIMPLEPROPERTYTEMPLATE('0EfoakbyP1mBi7R0Iyzrq1',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2553=IFCSIMPLEPROPERTYTEMPLATE('10fU7W61nC3vOwcMK2IOfw',$,'InstabilityFactors','Defining values: slenderness ratios; defined values: either factors or divisors of the strength, depending on the design method (if <1: factors, if >1: divisors).',.P_TABLEVALUE.,'IfcPositiveRatioMeasure','IfcPositiveRatioMeasure',$,$,$,$,.READWRITE.); -#2554=IFCPROPERTYSETTEMPLATE('0wVI7$oY18W8szucUql8nS',$,'Pset_MechanicalFastenerAnchorBolt','Properties common to different types of anchor bolts.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/ANCHORBOLT,IfcMechanicalFastenerType/ANCHORBOLT',(#2555,#2556,#2557,#2558)); -#2555=IFCSIMPLEPROPERTYTEMPLATE('38ZIuHpK9DKh7CXTpTRvai',$,'AnchorBoltLength','The length of the anchor bolt.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2556=IFCSIMPLEPROPERTYTEMPLATE('0M0RW6GkvEBADfwGOs1Rnv',$,'AnchorBoltDiameter','The nominal diameter of the anchor bolt bar(s).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2557=IFCSIMPLEPROPERTYTEMPLATE('1DzaEUjobBceC3p_vyUeuF',$,'AnchorBoltThreadLength','The length of the threaded part of the anchor bolt.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2558=IFCSIMPLEPROPERTYTEMPLATE('2o9kQIEA17U8CwqMozbr4e',$,'AnchorBoltProtrusionLength','The length of the protruding part of the anchor bolt.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2559=IFCPROPERTYSETTEMPLATE('1ZBAa_1bX88h3wHx1SSu2y',$,'Pset_MechanicalFastenerBolt','Properties related to bolt-type fasteners. The properties of a whole set with bolt, washers and nut may be provided. Note, it is usually not necessary to transmit these properties in case of standardized bolts. Instead, the standard is referred to.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/BOLT,IfcMechanicalFastenerType/BOLT',(#2560,#2561,#2562,#2563,#2564,#2565,#2566,#2567)); -#2560=IFCSIMPLEPROPERTYTEMPLATE('1udR1iNkr2ge57rzSLhNtC',$,'ThreadDiameter','Nominal diameter of the thread, if different from the bolt''s overall nominal diameter',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2561=IFCSIMPLEPROPERTYTEMPLATE('0YHCrrWfz8tuRtPtimiLZi',$,'ThreadLength','Nominal length of the thread',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2562=IFCSIMPLEPROPERTYTEMPLATE('3Cr3zyOX9FIwhTNVkirzAJ',$,'NutsCount','Count of nuts to be mounted on one bolt',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2563=IFCSIMPLEPROPERTYTEMPLATE('0WCZLjE856eOMVmxfyVut9',$,'WashersCount','Count of washers to be mounted on one bolt',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2564=IFCSIMPLEPROPERTYTEMPLATE('01OtM_VffCwPcZrFKWKMRN',$,'HeadShape','Shape of the bolt''s head, e.g. ''Hexagon'', ''Countersunk'', ''Cheese''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2565=IFCSIMPLEPROPERTYTEMPLATE('0zzI3axGj0fR6gyP9GIHy_',$,'KeyShape','If applicable, shape of the head''s slot, e.g. ''Slot'', ''Allen''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2566=IFCSIMPLEPROPERTYTEMPLATE('3dA3WMX2z4wQ2YjTcjEOUP',$,'NutShape','Shape of the nut, e.g. ''Hexagon'', ''Cap'', ''Castle'', ''Wing''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2567=IFCSIMPLEPROPERTYTEMPLATE('1rqnmRHFnFteFyMt1KGjfG',$,'WasherShape','Shape of the washers, e.g. ''Standard'', ''Square''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2568=IFCPROPERTYSETTEMPLATE('1fKABPBGP92h5z4Mq9s8tt',$,'Pset_MechanicalFastenerOCSFitting','Common properties of clamps and fittings used in railway overhead contact system (OCS).',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/COUPLER,IfcMechanicalFastenerType/COUPLER',(#2569,#2570)); -#2569=IFCSIMPLEPROPERTYTEMPLATE('1fivOiPdz09hJ_ml33xmmv',$,'ManufacturingTechnology','The method / technology used to produce the equipment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2570=IFCSIMPLEPROPERTYTEMPLATE('0IQHrh9TP3a8uX6USIa5n0',$,'OCSFasteningType','Indicates the type of the overhead contact system (OCS) mechanical fastener.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2571,$,$,$,.READWRITE.); -#2571=IFCPROPERTYENUMERATION('PEnum_OCSFasteningType',(IFCLABEL('EARTHING_FITTING'),IFCLABEL('JOINT_FITTING'),IFCLABEL('REGISTRATION_FITTING'),IFCLABEL('SUPPORT_FITTING'),IFCLABEL('SUSPENSION_FITTING'),IFCLABEL('TENSIONING_FITTING'),IFCLABEL('TERMINATION_FITTING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2572=IFCPROPERTYSETTEMPLATE('064J9m9xT9L8LYVlAoUbBO',$,'Pset_MechanicalFastenerTypeRailFastening','Properties of rail fastening used in railway track system. The property set can be used by the predefined type RAILFASTENING of IfcMechanicalFastener.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/RAILFASTENING,IfcMechanicalFastenerType/RAILFASTENING',(#2573,#2574,#2575)); -#2573=IFCSIMPLEPROPERTYTEMPLATE('3AyN1iOFr6mOZl3ZcrE4QU',$,'TechnicalStandard','The technical standard which the element should comply with.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#2574=IFCSIMPLEPROPERTYTEMPLATE('1OUlFIoMfBOeEjZ0vj_emV',$,'IsReducedResistanceFastening','Indicates whether the rail fastening is a reduced resistance fastening (YES) or not (NO).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2575=IFCSIMPLEPROPERTYTEMPLATE('3pTxJRroL0ZxUk$VrjeApq',$,'TrackFasteningElasticityType','Track fastening elasticity type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2576,$,$,$,.READWRITE.); -#2576=IFCPROPERTYENUMERATION('PEnum_TrackFasteningElasticityType',(IFCLABEL('ELASTIC_FASTENING'),IFCLABEL('RIGID_FASTENING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2577=IFCPROPERTYSETTEMPLATE('0$bna1CDj4_O4KoBiPVE4x',$,'Pset_MechanicalFastenerTypeRailJoint','Properties common to a rail joint of a railway track system. The property set can be used by the predefined type RAILJOINT of IfcMechanicalFastener.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/RAILJOINT,IfcMechanicalFastenerType/RAILJOINT',(#2578,#2580,#2581,#2582,#2583,#2584,#2585,#2586)); -#2578=IFCSIMPLEPROPERTYTEMPLATE('3l0Hz5vnvC5fvAbz5wdbh2',$,'SleeperArrangement','Define the rail joint sleeper method of assembly ("twin sleeper" type or "between sleepers" type).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2579,$,$,$,.READWRITE.); -#2579=IFCPROPERTYENUMERATION('PEnum_SleeperArrangement',(IFCLABEL('BETWEENSLEEPERS'),IFCLABEL('TWINSLEEPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2580=IFCSIMPLEPROPERTYTEMPLATE('2YtCHF9q5EwPM9Rs0eAND_',$,'IsCWRJoint','Indicates if the rail joint is associated to a continuous welded rail.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2581=IFCSIMPLEPROPERTYTEMPLATE('3HdIiUlTPAXerzj0BeIsSR',$,'IsJointInsulated','Indicates if the rail joint is insulated.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2582=IFCSIMPLEPROPERTYTEMPLATE('158kZybFvCtvXDrQ$DYZVx',$,'IsLiftingBracketConnection','Indicates if the connection is between two different heights (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2583=IFCSIMPLEPROPERTYTEMPLATE('2UaX_6Px5DU84h1WYp$ZO0',$,'NumberOfScrews','Number of screws/bolts/connections.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2584=IFCSIMPLEPROPERTYTEMPLATE('0EfIxa4WnANAkzBBRUn076',$,'RailGap','The gap between the rail profiles.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2585=IFCSIMPLEPROPERTYTEMPLATE('1Ti1P3n4f5mxwshdFgl5Sv',$,'IsJointControlEquipment','Indicates whether security equipment is checking the mechanical functionality of the rail joint.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2586=IFCSIMPLEPROPERTYTEMPLATE('3yscZQCa9DgOQmBMThd1gi',$,'AssemblyPlace','Enumeration defining where the assembly is intended to take place, either in a factory, other offsite location or on the building site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2587,$,$,$,.READWRITE.); -#2587=IFCPROPERTYENUMERATION('PEnum_AssemblyPlace',(IFCLABEL('FACTORY'),IFCLABEL('OFFSITE'),IFCLABEL('SITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2588=IFCPROPERTYSETTEMPLATE('3_5j8E6KLDPvHL7FtCQ2tn',$,'Pset_MechanicalPanelInPlane','Properties for Mechanical Panels In Plane.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2589,#2590,#2591,#2592,#2593,#2594,#2595,#2596,#2597,#2598,#2599)); -#2589=IFCSIMPLEPROPERTYTEMPLATE('3gY_aBtAn30fESXA2GWz2U',$,'YoungModulusBending','Defining values: \X2\03B1\X0\; defined values: elastic modulus in bending.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); -#2590=IFCSIMPLEPROPERTYTEMPLATE('305HJfxiz3TfoDPxllrkuz',$,'YoungModulusTension','Defining values: \X2\03B1\X0\; defined values: elastic modulus in tension.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); -#2591=IFCSIMPLEPROPERTYTEMPLATE('2pwcujLL58IQXWBmim9QIu',$,'YoungModulusCompression','Elastic modulus in compression.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2592=IFCSIMPLEPROPERTYTEMPLATE('3uOs6qRg5FnuiKOW6lG5Jy',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2593=IFCSIMPLEPROPERTYTEMPLATE('19tIJdEWP18RzKSpqST_Dz',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2594=IFCSIMPLEPROPERTYTEMPLATE('0uR8F70vXAe84loehx2Ogi',$,'CompressiveStrength','The compressive strength of the object or material.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: compressive strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2595=IFCSIMPLEPROPERTYTEMPLATE('0jMUEoJ0zETeObJ3nqn8f4',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2596=IFCSIMPLEPROPERTYTEMPLATE('14UlPugGn1ZBOAY5_rTLAd',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2597=IFCSIMPLEPROPERTYTEMPLATE('1abZy0uzP6_htNv_oyrQ99',$,'BearingStrength','Defining values: \X2\03B1\X0\; defined values: bearing strength of bolt holes, i.e. intrados pressure.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2598=IFCSIMPLEPROPERTYTEMPLATE('28PGHa0FLELuDnZ9tMmXZl',$,'RaisedCompressiveStrength','Alternative value for compressive strength which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2599=IFCSIMPLEPROPERTYTEMPLATE('1fn5VQpR58WRCYk3_gp$3$',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2600=IFCPROPERTYSETTEMPLATE('3YtQrQAb5AIQ72Z24iZcGn',$,'Pset_MechanicalPanelOutOfPlane','Properties for Mechanica lPanels Out Of Plane.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2601,#2602,#2603,#2604,#2605,#2606,#2607,#2608,#2609,#2610,#2611)); -#2601=IFCSIMPLEPROPERTYTEMPLATE('3vtBUxUpz2HxelLdRBUzAB',$,'YoungModulusBending','Defining values: \X2\03B1\X0\; defined values: elastic modulus in bending.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); -#2602=IFCSIMPLEPROPERTYTEMPLATE('3X59ceTuf60wtMbKIxqd_j',$,'YoungModulusTension','Defining values: \X2\03B1\X0\; defined values: elastic modulus in tension.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); -#2603=IFCSIMPLEPROPERTYTEMPLATE('3TkGwRX$P6_Rs0CPGhkOwg',$,'YoungModulusCompression','Elastic modulus in compression.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2604=IFCSIMPLEPROPERTYTEMPLATE('2fb9Lw7X55ZQjIETWmG9hP',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2605=IFCSIMPLEPROPERTYTEMPLATE('3Sw5djkjD59h5Dx$PiSUp3',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2606=IFCSIMPLEPROPERTYTEMPLATE('0rTG9eFaT42x3d2wsDS8Tr',$,'CompressiveStrength','The compressive strength of the object or material.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: compressive strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2607=IFCSIMPLEPROPERTYTEMPLATE('0Pvh9TKG51OwTxvGECY3dA',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2608=IFCSIMPLEPROPERTYTEMPLATE('1V6W5oQan0ofob6mrYTvXv',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2609=IFCSIMPLEPROPERTYTEMPLATE('0S_YZ_BH5BKwmSCeKxwlm0',$,'BearingStrength','Defining values: \X2\03B1\X0\; defined values: bearing strength of bolt holes, i.e. intrados pressure.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2610=IFCSIMPLEPROPERTYTEMPLATE('39oSgrMJ52BfQWy7k9wTmh',$,'RaisedCompressiveStrength','Alternative value for compressive strength which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2611=IFCSIMPLEPROPERTYTEMPLATE('1V$MSK3z53QQWJbIQBzcm9',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2612=IFCPROPERTYSETTEMPLATE('3OqIjRdgf4C8ccm4YTq4YH',$,'Pset_MechanicalPanelOutOfPlaneNegative','Properties for Mechanical Panels Out Of Plane Negative.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2613,#2614,#2615,#2616,#2617,#2618,#2619,#2620,#2621,#2622,#2623)); -#2613=IFCSIMPLEPROPERTYTEMPLATE('2Ewi71qSbErO_R7MhzdqSJ',$,'YoungModulusBending','Defining values: \X2\03B1\X0\; defined values: elastic modulus in bending.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); -#2614=IFCSIMPLEPROPERTYTEMPLATE('1ifHNqWsn6aQEYKSbKjkyq',$,'YoungModulusTension','Defining values: \X2\03B1\X0\; defined values: elastic modulus in tension.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); -#2615=IFCSIMPLEPROPERTYTEMPLATE('2OUcmOUATFGxISA0Zh$tJ5',$,'YoungModulusCompression','Elastic modulus in compression.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2616=IFCSIMPLEPROPERTYTEMPLATE('1oGVrw25v8$QIjE3$LpnDs',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); -#2617=IFCSIMPLEPROPERTYTEMPLATE('1rQddTiwb1Rhc2HFwsSGGJ',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2618=IFCSIMPLEPROPERTYTEMPLATE('2I_60Diov0MRH1Ej3Gf4f7',$,'CompressiveStrength','The compressive strength of the object or material.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: compressive strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2619=IFCSIMPLEPROPERTYTEMPLATE('05XhHGX4zBiuc5jfE428YQ',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2620=IFCSIMPLEPROPERTYTEMPLATE('3Kdw0W3fDBpwwItj$VZHZM',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2621=IFCSIMPLEPROPERTYTEMPLATE('1QSie9mg91wAZxxNlqQIe_',$,'BearingStrength','Defining values: \X2\03B1\X0\; defined values: bearing strength of bolt holes, i.e. intrados pressure.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); -#2622=IFCSIMPLEPROPERTYTEMPLATE('20ql9BYobCXu4asV9NDGcc',$,'RaisedCompressiveStrength','Alternative value for compressive strength which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2623=IFCSIMPLEPROPERTYTEMPLATE('3c$jacrED1SgR0PsIxeqtp',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2624=IFCPROPERTYSETTEMPLATE('3N_yNJDP1ErRBkw2BdO4Ap',$,'Pset_MedicalDeviceTypeCommon','Medical device type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMedicalDevice,IfcMedicalDeviceType',(#2625,#2626)); -#2625=IFCSIMPLEPROPERTYTEMPLATE('2hLjzRk2z03Pikirmf8VJY',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2626=IFCSIMPLEPROPERTYTEMPLATE('2O0nRFNA90MOZ_cvJsettB',$,'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',$,#2627,$,$,$,.READWRITE.); -#2627=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2628=IFCPROPERTYSETTEMPLATE('1zRwD4HyfCo80voOh0UR8M',$,'Pset_MemberCommon','Properties common to the definition of all occurrences of IfcMember.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember,IfcMemberType',(#2629,#2630,#2632,#2633,#2634,#2635,#2636,#2637,#2638)); -#2629=IFCSIMPLEPROPERTYTEMPLATE('31Gfw7zeH0YA4J5Znw3gvE',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2630=IFCSIMPLEPROPERTYTEMPLATE('39Ls3J7q9D7QjMQS9jlC$s',$,'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',$,#2631,$,$,$,.READWRITE.); -#2631=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2632=IFCSIMPLEPROPERTYTEMPLATE('3LTarVkm96OgIinMh43Wrt',$,'Span','Clear span for this object.The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2633=IFCSIMPLEPROPERTYTEMPLATE('01AqpM5ITAexaFTTRTfOgL',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2634=IFCSIMPLEPROPERTYTEMPLATE('2qKye5M$H8y8M8Q7dpj18O',$,'Roll','Rotation against the longitudinal axis.\X2\000A000A\X0\Relative to the global Z direction for all members that are non-vertical in regard to the global coordinate system (Profile direction equals global Z is Roll = 0.)\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.\X2\000A\X0\Note: new property in IFC4.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2635=IFCSIMPLEPROPERTYTEMPLATE('2nbP0XhHz0Pfwm7iGjJqN2',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2636=IFCSIMPLEPROPERTYTEMPLATE('0TFSWvpgbEduoGPrFWzhtC',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#2637=IFCSIMPLEPROPERTYTEMPLATE('0teX2TF8r9RfYV3_D$eVXE',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2638=IFCSIMPLEPROPERTYTEMPLATE('22kVa3vSH1Dg1S8UJV$Ur5',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2639=IFCPROPERTYSETTEMPLATE('2xuKanKyX9DPsELNpFXdHP',$,'Pset_MemberTypeAnchoringBar','Properties of anchoring bar. The anchoring bar is used to connect stay from pole to the foundation.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember/BRACE,IfcMemberType/BRACE',(#2640,#2642)); -#2640=IFCSIMPLEPROPERTYTEMPLATE('1mu88n23v20uflkGioQ28u',$,'MechanicalStressType','Indicates which type of stress is applied to the element.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2641,$,$,$,.READWRITE.); -#2641=IFCPROPERTYENUMERATION('PEnum_MechanicalStressType',(IFCLABEL('MECHANICAL_COMPRESSION'),IFCLABEL('MECHANICAL_TRACTION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2642=IFCSIMPLEPROPERTYTEMPLATE('1cYvrara18wAzyMFGmM7SP',$,'HasLightningRod','Indicates whether the element is equipped with a lightning rod (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2643=IFCPROPERTYSETTEMPLATE('3JY7jQjvr6OPoPd5QMWy5y',$,'Pset_MemberTypeCatenaryStay','Properties of catenary stay used in railway. The property set can be used by the predefined type STAY_CABLE of IfcMember.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember/STAY_CABLE,IfcMemberType/STAY_CABLE',(#2644,#2645,#2646,#2648)); -#2644=IFCSIMPLEPROPERTYTEMPLATE('2e4Pb63An1yBxSRGInQ93r',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#2645=IFCSIMPLEPROPERTYTEMPLATE('0UJK$7b3rDa8XeI1idHWmI',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2646=IFCSIMPLEPROPERTYTEMPLATE('0tWKf_E05EdBSQGBkW2Ae2',$,'CatenaryStayType','Indicates the type of catenary stay used.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2647,$,$,$,.READWRITE.); -#2647=IFCPROPERTYENUMERATION('PEnum_CatenaryStayType',(IFCLABEL('DOUBLE_STAY'),IFCLABEL('SINGLE_STAY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2648=IFCSIMPLEPROPERTYTEMPLATE('0hq8sRXJX6Ogq0ko_Z69Fx',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2649=IFCPROPERTYSETTEMPLATE('1figKRzN97BQzVjBw2FhQK',$,'Pset_MemberTypeOCSRigidSupport','Properties of rigid catenary support used in railway overhead contact system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember/MEMBER,IfcMemberType/MEMBER',(#2650,#2651)); -#2650=IFCSIMPLEPROPERTYTEMPLATE('0RMR8Lfzz3QAsRioOxfhpE',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#2651=IFCSIMPLEPROPERTYTEMPLATE('1gZk15EIX198PeSSFMuJph',$,'ContactWireStagger','Lateral displacement of the contact wire to opposite sides of the track centre at successive supports.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2652=IFCPROPERTYSETTEMPLATE('0W223gdvTDqvhmvJBNsvmV',$,'Pset_MemberTypePost','Properties of a post. A post is a linear (usually vertical) member used to support something or to mark a point.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember/POST,IfcMemberType/POST',(#2653,#2654,#2655,#2656,#2657,#2658)); -#2653=IFCSIMPLEPROPERTYTEMPLATE('3fEukz9k970OzBDN1BzebX',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2654=IFCSIMPLEPROPERTYTEMPLATE('1VoRUlXev9U8f9k7gbOtAP',$,'ConicityRatio','The ratio of the diameter of the cone bottom surface to the height of the pole.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#2655=IFCSIMPLEPROPERTYTEMPLATE('1u4f4Tv$jBLelrux3mUJ6j',$,'LoadBearingCapacity','Maximum load bearing capacity of the floor structure throughtout the storey as designed.',.P_SINGLEVALUE.,'IfcPlanarForceMeasure',$,$,$,$,$,.READWRITE.); -#2656=IFCSIMPLEPROPERTYTEMPLATE('3noG5G6Aj5H9LOG7cKGuZY',$,'WindLoadRating','Wind load resistance rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2657=IFCSIMPLEPROPERTYTEMPLATE('0mI5RAjy17aeMx5Ma55zC8',$,'TorsionalStrength','Shear strength in torsion.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2658=IFCSIMPLEPROPERTYTEMPLATE('3aho$oaxn9DQI9MS8tfX0d',$,'BendingStrength','Bending strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2659=IFCPROPERTYSETTEMPLATE('04a9P6BYb88ReEZiPpeHA5',$,'Pset_MemberTypeTieBar','Properties of tie bar. A tie bar is a linear bar element used to secure or stabilise a structure by resisting lateral and longitudinal loading through tension and or compression. usually formed by a solid bar.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember/TIEBAR,IfcMemberType/TIEBAR',(#2660)); -#2660=IFCSIMPLEPROPERTYTEMPLATE('2sKobyTivCHvm3tLPa70_Z',$,'IsTemporaryInstallation','Indicates whether the installation (in the construction stage) is permanent (TRUE) or temporary (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2661=IFCPROPERTYSETTEMPLATE('3UEcxitCb2kQat9LleJt2V',$,'Pset_MobileTelecommunicationsApplianceTypeAccessPoint','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to ACCESSPOINT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/ACCESSPOINT,IfcMobileTelecommunicationsApplianceType/ACCESSPOINT',(#2662,#2663,#2664,#2665,#2666,#2667)); -#2662=IFCSIMPLEPROPERTYTEMPLATE('3PpDKnWQ59pQ8mdtKfu2My',$,'BandWidth','Indicates the bandwidth for telecommunication of the device.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#2663=IFCSIMPLEPROPERTYTEMPLATE('2YYHKoWpPFngxgVN3q3Eik',$,'DataEncryptionType','Indicates the type of security protocols that can be used in the access point to protect the wireless network.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2664=IFCSIMPLEPROPERTYTEMPLATE('3l3sjaWQD6RAteQNBEo5tG',$,'DataExchangeRate','Indicates the data transfer rate of the access point in bit per second (bps).',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); -#2665=IFCSIMPLEPROPERTYTEMPLATE('3xVigWhr1Ebwa8PvJeZxR$',$,'NumberOfAntennas','Indicates the number of antennas integrated in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2666=IFCSIMPLEPROPERTYTEMPLATE('06YmB6I7L5bAgKLPW9IjdL',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2667=IFCSIMPLEPROPERTYTEMPLATE('0vtM4dx8nAU8NbzrewDqNz',$,'UserCapacity','Indicates the user capacity of the device, defined as the maximum number of users that can be active at the same time.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2668=IFCPROPERTYSETTEMPLATE('1hx6ryp2z52B9VYC2i2Pje',$,'Pset_MobileTelecommunicationsApplianceTypeBasebandUnit','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to BASEBANDUNIT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/BASEBANDUNIT,IfcMobileTelecommunicationsApplianceType/BASEBANDUNIT',(#2669,#2670,#2671,#2672)); -#2669=IFCSIMPLEPROPERTYTEMPLATE('2Go$h48a5Eo9xj5A1dUt7O',$,'NumberOfCarriers','Indicates how many carrier frequencies can be managed by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2670=IFCSIMPLEPROPERTYTEMPLATE('25tA6688v3$9V2hdd48_2t',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2671=IFCSIMPLEPROPERTYTEMPLATE('2YV3a_Ye555eRWOJu3XkJw',$,'NumberOfEmergencyTransceivers','Indicates the number of emergency transceivers in the base band unit.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2672=IFCSIMPLEPROPERTYTEMPLATE('1P8Xbk1W9BMOLcRLnNzVmh',$,'MaximumNumberOfRRUs','Indicates the maximum number of remote radio units (RRU) which can be connected to the baseband unit.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2673=IFCPROPERTYSETTEMPLATE('1EtoWZOwXFux$mKoFKL2Ni',$,'Pset_MobileTelecommunicationsApplianceTypeBaseTransceiverStation','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to BASETRANSCEIVERSTATION.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/BASETRANSCEIVERSTATION,IfcMobileTelecommunicationsApplianceType/BASETRANSCEIVERSTATION',(#2674,#2675,#2676,#2677,#2678,#2679,#2680,#2681,#2682)); -#2674=IFCSIMPLEPROPERTYTEMPLATE('1lP8ASWuXFThnXU5O_2g51',$,'DownlinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for downlink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#2675=IFCSIMPLEPROPERTYTEMPLATE('2N1QJONoX1SO1djYf3LQdH',$,'NumberOfCarriers','Indicates how many carrier frequencies can be managed by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2676=IFCSIMPLEPROPERTYTEMPLATE('23WB6oI$DDCuiKZgyPCknO',$,'NumberOfAntennas','Indicates the number of antennas integrated in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2677=IFCSIMPLEPROPERTYTEMPLATE('3yy_$cPEr5IO4x85W0n0pv',$,'UplinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for uplink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#2678=IFCSIMPLEPROPERTYTEMPLATE('0uqhfLf4f48RlGocpkowEL',$,'ExchangeCapacity','Indicates how many simultaneous calls the base transceiver station can handle.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2679=IFCSIMPLEPROPERTYTEMPLATE('1EDQHCreb95QCldnCo3$qg',$,'NumberOfEmergencyTransceivers','Indicates the number of emergency transceivers in the base band unit.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2680=IFCSIMPLEPROPERTYTEMPLATE('2WXARdvSbAbBIAf8i9w0m$',$,'NumberOfTransceiversPerAntenna','Indicates the number of transceivers per antenna.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2681=IFCSIMPLEPROPERTYTEMPLATE('3qTLD915P7dg8iddaww1FW',$,'RadiatedOutputPowerPerAntenna','Indicates the power of radio waves emitted by each antenna of the base transceiver station.',.P_TABLEVALUE.,'IfcLabel','IfcPowerMeasure',$,$,$,$,.READWRITE.); -#2682=IFCSIMPLEPROPERTYTEMPLATE('1G02$XaV56FRhscpBImmNe',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2683=IFCPROPERTYSETTEMPLATE('2ZdITY6YH0GhQB3v_CVzQq',$,'Pset_MobileTelecommunicationsApplianceTypeCommon','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance,IfcMobileTelecommunicationsApplianceType',(#2684,#2685)); -#2684=IFCSIMPLEPROPERTYTEMPLATE('2CtnXwa$X2FxJkRV1eKYee',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2685=IFCSIMPLEPROPERTYTEMPLATE('3oP0Klr_L7YPIexSzbib_F',$,'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',$,#2686,$,$,$,.READWRITE.); -#2686=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2687=IFCPROPERTYSETTEMPLATE('3LBWcyyhn3bPpOQririWZz',$,'Pset_MobileTelecommunicationsApplianceTypeEUtranNodeB','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to E_UTRAN_NODE_B.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/E_UTRAN_NODE_B,IfcMobileTelecommunicationsApplianceType/E_UTRAN_NODE_B',(#2688,#2689,#2690,#2691,#2692,#2693)); -#2688=IFCSIMPLEPROPERTYTEMPLATE('0ND$MyvFf2xxX$kH9GkhSg',$,'DownlinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for downlink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#2689=IFCSIMPLEPROPERTYTEMPLATE('2zpzzdqUv4SgD3xVq40MP6',$,'NumberOfCarriers','Indicates how many carrier frequencies can be managed by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2690=IFCSIMPLEPROPERTYTEMPLATE('3M394Dczr86P$wzgsPzzl_',$,'RadiatedOutputPowerPerAntenna','Indicates the power of radio waves emitted by each antenna of the base transceiver station.',.P_TABLEVALUE.,'IfcLabel','IfcPowerMeasure',$,$,$,$,.READWRITE.); -#2691=IFCSIMPLEPROPERTYTEMPLATE('2eGLWIwyL3QulD8r7w4I5_',$,'NumberOfAntennas','Indicates the number of antennas integrated in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2692=IFCSIMPLEPROPERTYTEMPLATE('3QYqAoU4r5pRuTEm0xEb2Y',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2693=IFCSIMPLEPROPERTYTEMPLATE('3IAATBa3LFMucO1XvfZjUf',$,'UplinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for uplink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#2694=IFCPROPERTYSETTEMPLATE('3AJtGMkdz4LuqnDhfW2N_a',$,'Pset_MobileTelecommunicationsApplianceTypeMasterUnit','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to MASTERUNIT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/MASTERUNIT,IfcMobileTelecommunicationsApplianceType/MASTERUNIT',(#2695,#2696,#2697,#2699,#2700,#2701,#2703)); -#2695=IFCSIMPLEPROPERTYTEMPLATE('3S88h2Th9BcPd$5EN9baEj',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2696=IFCSIMPLEPROPERTYTEMPLATE('1_v9OqpYj72ORedmcCHOKI',$,'MaximumNumberOfConnectedRUs','Indicates the maximum number of remote units (RUs) which can be connected to the master unit.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2697=IFCSIMPLEPROPERTYTEMPLATE('303dMp3V56KAT07W2wHYNH',$,'TransmissionType','Indicates the data transmission type of the master unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2698,$,$,$,.READWRITE.); -#2698=IFCPROPERTYENUMERATION('PEnum_TransmissionType',(IFCLABEL('FIBER'),IFCLABEL('RADIO'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2699=IFCSIMPLEPROPERTYTEMPLATE('2Va1JZSoL03v5ZnZrLD$dr',$,'TransmittedBandwidth','Indicates the transmitted bandwidth of the master unit.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#2700=IFCSIMPLEPROPERTYTEMPLATE('08xHJ33O18MhbgxxblW1ZX',$,'TransmittedFrequency','Indicates the transmitted frequency used by the master unit.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#2701=IFCSIMPLEPROPERTYTEMPLATE('3$hAcla3b2EwEEQkoT69rW',$,'TransmittedSignal','Indicates the type or standard of signal transmitted by the master unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2702,$,$,$,.READWRITE.); -#2702=IFCPROPERTYENUMERATION('PEnum_TransmittedSignal',(IFCLABEL('CDMA'),IFCLABEL('GSM'),IFCLABEL('LTE'),IFCLABEL('TD_SCDMA'),IFCLABEL('WCDMA'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2703=IFCSIMPLEPROPERTYTEMPLATE('0B2crXWYz5kBBCKaSTqK2o',$,'MasterUnitType','Indicates the master unit type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2704,$,$,$,.READWRITE.); -#2704=IFCPROPERTYENUMERATION('PEnum_MasterUnitType',(IFCLABEL('ANALOG'),IFCLABEL('DIGITAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2705=IFCPROPERTYSETTEMPLATE('32F5VLzrjDUB2FCNG76bP5',$,'Pset_MobileTelecommunicationsApplianceTypeMobileSwitchingCenter','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to MOBILESWITCHINGCENTER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/MOBILESWITCHINGCENTER,IfcMobileTelecommunicationsApplianceType/MOBILESWITCHINGCENTER',(#2706,#2707,#2708)); -#2706=IFCSIMPLEPROPERTYTEMPLATE('39mrGzfUD5nO_uMC2i4Hwy',$,'UserCapacity','Indicates the user capacity of the device, defined as the maximum number of users that can be active at the same time.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2707=IFCSIMPLEPROPERTYTEMPLATE('0lpkp6Sbr9mwHAjlzy5qvX',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2708=IFCSIMPLEPROPERTYTEMPLATE('3PnjYTU9P6D8IN7KnIIRzY',$,'MaximumNumberOfManagedBSCs','Indicates the maximum number of base station controller (BSC) that can be managed simultaneously by the mobile switching center (MSC).',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2709=IFCPROPERTYSETTEMPLATE('2YmCtxFw56D8eGea3gtvCv',$,'Pset_MobileTelecommunicationsApplianceTypeMSCServer','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to MSCSERVER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/MSCSERVER,IfcMobileTelecommunicationsApplianceType/MSCSERVER',(#2710,#2711)); -#2710=IFCSIMPLEPROPERTYTEMPLATE('3Axs0ooj9D5ukQ1510MpO5',$,'UserCapacity','Indicates the user capacity of the device, defined as the maximum number of users that can be active at the same time.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#2711=IFCSIMPLEPROPERTYTEMPLATE('1eK8EcRVn3gwN9kWHAvozs',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2712=IFCPROPERTYSETTEMPLATE('2jMOoev6L0tu16yMpJIc9f',$,'Pset_MobileTeleCommunicationsApplianceTypeRemoteRadioUnit','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to REMOTERADIOUNIT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/REMOTERADIOUNIT,IfcMobileTelecommunicationsApplianceType/REMOTERADIOUNIT',(#2713,#2714,#2715,#2716,#2717,#2718,#2719,#2720)); -#2713=IFCSIMPLEPROPERTYTEMPLATE('1akFNmbWjFkveMMk6324aq',$,'DownlinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for downlink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#2714=IFCSIMPLEPROPERTYTEMPLATE('3BRYNUUg5FvQMNOBLWSyxt',$,'NumberOfCarriers','Indicates how many carrier frequencies can be managed by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2715=IFCSIMPLEPROPERTYTEMPLATE('2F9v$_gfr7OORIv3UI7cb3',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2716=IFCSIMPLEPROPERTYTEMPLATE('0xgcnmTaL3qe8NaqEcze_I',$,'UplinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for uplink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#2717=IFCSIMPLEPROPERTYTEMPLATE('1dithd9jj1Wvc9dr5cxPf5',$,'NumberOfTransceiversPerAntenna','Indicates the number of transceivers per antenna.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2718=IFCSIMPLEPROPERTYTEMPLATE('3uCVjgrpTDzPgG95CEo2ML',$,'RadiatedOutputPowerPerAntenna','Indicates the power of radio waves emitted by each antenna of the base transceiver station.',.P_TABLEVALUE.,'IfcLabel','IfcPowerMeasure',$,$,$,$,.READWRITE.); -#2719=IFCSIMPLEPROPERTYTEMPLATE('1B01vsbgD1RPDKvzfq7ODS',$,'AntennaType','Indicates the type of antenna.\X2\000A000A\X0\Indicates the type of antenna integrated in the device.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2720=IFCSIMPLEPROPERTYTEMPLATE('1d$nPj4eL2IR9aySe5B3_X',$,'RRUConnectionType','Indicates the connection type between the remote radio unit and baseband unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2721,$,$,$,.READWRITE.); -#2721=IFCPROPERTYENUMERATION('PEnum_UnitConnectionType',(IFCLABEL('CHAIN'),IFCLABEL('MIXED'),IFCLABEL('RING'),IFCLABEL('STAR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2722=IFCPROPERTYSETTEMPLATE('0kGZtjMizDNfP2jx6N6gFk',$,'Pset_MobileTelecommunicationsApplianceTypeRemoteUnit','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to REMOTEUNIT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/REMOTEUNIT,IfcMobileTelecommunicationsApplianceType/REMOTEUNIT',(#2723,#2724,#2725)); -#2723=IFCSIMPLEPROPERTYTEMPLATE('26S6oKx3HFgwc_FJnZAEEg',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2724=IFCSIMPLEPROPERTYTEMPLATE('1d2nJQ9ff2DAmuDqRaFjch',$,'NumberOfAntennas','Indicates the number of antennas integrated in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2725=IFCSIMPLEPROPERTYTEMPLATE('04EMztP7DFbfeSOjnXN959',$,'RUConnectionType','Indicate the connection type between the remote unit and the master unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2726,$,$,$,.READWRITE.); -#2726=IFCPROPERTYENUMERATION('PEnum_UnitConnectionType',(IFCLABEL('CHAIN'),IFCLABEL('MIXED'),IFCLABEL('RING'),IFCLABEL('STAR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2727=IFCPROPERTYSETTEMPLATE('0V33wUk4b57wSDNTIboH29',$,'Pset_MooringDeviceCommon','Properties common to the definition of all occurrences of IfcMooringDevice and types of IfcMooringDeviceType.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMooringDevice,IfcMooringDeviceType',(#2728,#2730,#2731,#2733,#2734,#2735)); -#2728=IFCSIMPLEPROPERTYTEMPLATE('2lCpcql2X7BO2LGfMdD07n',$,'DeviceType','Mooring device type',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2729,$,$,$,.READWRITE.); -#2729=IFCPROPERTYENUMERATION('PEnum_MooringDeviceType',(IFCLABEL('CLEAT'),IFCLABEL('DOUBLEBUTT'),IFCLABEL('HORN'),IFCLABEL('KIDNEY'),IFCLABEL('PILLAR'),IFCLABEL('RING'),IFCLABEL('SINGLEBUTT'),IFCLABEL('THEAD')),$); -#2730=IFCSIMPLEPROPERTYTEMPLATE('14yQvlYOf4CO9lTQl5l3LR',$,'DeviceCapacity','Mooring device force capacity',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#2731=IFCSIMPLEPROPERTYTEMPLATE('0lBOtuueH0kfWzgbAfdEo8',$,'AnchorageType','Mooring device anchorage type',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2732,$,$,$,.READWRITE.); -#2732=IFCPROPERTYENUMERATION('PEnum_AnchorageType',(IFCLABEL('CASTIN'),IFCLABEL('DRILLEDANDFIXED'),IFCLABEL('THROUGHBOLTED')),$); -#2733=IFCSIMPLEPROPERTYTEMPLATE('34PawIITj4he8a6KmJFw6g',$,'MinumumLineSlope','Minimum allowable line angle in degrees (negative if below horizontal from quay)',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2734=IFCSIMPLEPROPERTYTEMPLATE('0_1JX8ntj3SuVrBJq8FwXp',$,'MaximumLineSlope','Maximum allowable line angle in degrees (negative if below horizontal from quay)',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2735=IFCSIMPLEPROPERTYTEMPLATE('3LoD1Hk1TCCPhR_LVm4cTd',$,'MaximumLineCount','Maximum number of lines that may be secured to the mooring device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2736=IFCPROPERTYSETTEMPLATE('2asyMpZDj4rxxr$q9G5HWk',$,'Pset_MotorConnectionTypeCommon','Common properties for motor connections. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMotorConnection,IfcMotorConnectionType',(#2737,#2738)); -#2737=IFCSIMPLEPROPERTYTEMPLATE('35gvw6CCLB$hd77rBEA4Nn',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2738=IFCSIMPLEPROPERTYTEMPLATE('2ROZCT3evBEw3E68jviWHd',$,'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',$,#2739,$,$,$,.READWRITE.); -#2739=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2740=IFCPROPERTYSETTEMPLATE('2zH$Q4$X1DDe55eI1y73Ky',$,'Pset_OnSiteCastKerb','Properties for an on site cast kerb.',.PSET_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#2741,#2742)); -#2741=IFCSIMPLEPROPERTYTEMPLATE('1M6jm0lX5AOvBi7q8t9XL9',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2742=IFCSIMPLEPROPERTYTEMPLATE('1Rb2whf3z7xRP85DYiyuhF',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2743=IFCPROPERTYSETTEMPLATE('02$MN5h2z3sBJbkfwLSSdh',$,'Pset_OnSiteTelecomControlUnit','Properties for on-site telecom control unit used for railway.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController,IfcControllerType',(#2744,#2745,#2746,#2747,#2749,#2750,#2751,#2752)); -#2744=IFCSIMPLEPROPERTYTEMPLATE('00w2yZ0XDFUft9YLd3hS0C',$,'HasEarthquakeAlarm','Indicates whether the on-site control unit includes earthquake alarm function.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2745=IFCSIMPLEPROPERTYTEMPLATE('1jqk4qE6HCFvoxuKUOWSXj',$,'HasEarthquakeCollection','Indicates whether the on-site control unit collects earthquake information.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2746=IFCSIMPLEPROPERTYTEMPLATE('3tXDcIw$DEvOYBo7y2UBNw',$,'HasForeignObjectCollection','Indicates whether the on-site control unit collects foreign object information.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2747=IFCSIMPLEPROPERTYTEMPLATE('17ZRsfU3nDnhRZk3ED5g1v',$,'ControllerInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2748,$,$,$,.READWRITE.); -#2748=IFCPROPERTYENUMERATION('PEnum_ControllerInterfaceType',(IFCLABEL('EARTHQUAKERELAYINTERFACE'),IFCLABEL('FOREIGNOBJECTRELAYINTERFACE'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2749=IFCSIMPLEPROPERTYTEMPLATE('3yaK_BCDr55vSCPQUGU9I9',$,'HasOutputFunction','Indicates whether the on-site control unit includes an output function.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2750=IFCSIMPLEPROPERTYTEMPLATE('1Me8D$ROr4mPrpAWlHm936',$,'HasRainCollection','Indicates whether the on-site control unit collects information on rain.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2751=IFCSIMPLEPROPERTYTEMPLATE('0r0TEpiPb2Oud3n$pibHsF',$,'HasSnowCollection','Indicates whether the on-site control unit collects information on snow depth.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2752=IFCSIMPLEPROPERTYTEMPLATE('10YXDYB4n7cwfhgodvF_Gb',$,'HasWindCollection','Indicates whether the on-site control unit collects information on wind.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2753=IFCPROPERTYSETTEMPLATE('3gJkHupDPA5goBtj2B4PQR',$,'Pset_OpeningElementCommon','Properties common to the definition of all instances of IfcOpeningElement.',.PSET_OCCURRENCEDRIVEN.,'IfcOpeningElement',(#2754,#2755,#2757,#2758,#2759,#2760)); -#2754=IFCSIMPLEPROPERTYTEMPLATE('3pDBIuMvD3kA477Q3heC47',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2755=IFCSIMPLEPROPERTYTEMPLATE('0kLkTRNRD6BBsz20Aiqw$f',$,'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',$,#2756,$,$,$,.READWRITE.); -#2756=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2757=IFCSIMPLEPROPERTYTEMPLATE('3x8l6XDnjFMANatCaAQCrH',$,'Purpose','Indication of the purpose of this object\X2\000A000A\X0\E.g. ''ventilation'' or ''access''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2758=IFCSIMPLEPROPERTYTEMPLATE('3CczHyZJv1zRF5ayL9xlRw',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here whether the space (in case of e.g., a corridor) is designed to serve as an exit space, e.g., for fire escape purposes.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2759=IFCSIMPLEPROPERTYTEMPLATE('1qIvvdFqjE59kN7nMHgLbT',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.\X2\000A000A\X0\Requirement for the element filling the opening.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2760=IFCSIMPLEPROPERTYTEMPLATE('3hdGuVtaT4yxWcsIM4BgNX',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).\X2\000A000A\X0\Requirement for the element filling the opening.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2761=IFCPROPERTYSETTEMPLATE('26y566sLHC3vsA8Hlwmy9T',$,'Pset_OpticalAdapter','Properties in this property set are applicable to the transition type of cable fitting. Indicated that such transition is an optical adapter.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting/TRANSITION,IfcCableFittingType/TRANSITION',(#2762)); -#2762=IFCSIMPLEPROPERTYTEMPLATE('37x$77CQfEDvMHaENyIdjA',$,'FiberType','Indicates the type of the single fiber.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2763,$,$,$,.READWRITE.); -#2763=IFCPROPERTYENUMERATION('PEnum_FiberType',(IFCLABEL('BEND_INSENSITIVEFIBER'),IFCLABEL('CUTOFFSHIFTEDFIBER'),IFCLABEL('DISPERSIONSHIFTEDFIBER'),IFCLABEL('LOWWATERPEAKFIBER'),IFCLABEL('NON_ZERODISPERSIONSHIFTEDFIBER'),IFCLABEL('OM1'),IFCLABEL('OM2'),IFCLABEL('OM3'),IFCLABEL('OM4'),IFCLABEL('OM5'),IFCLABEL('STANDARDSINGLEMODEFIBER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2764=IFCPROPERTYSETTEMPLATE('0cSVVmNKb6dvpYsQ0PY93I',$,'Pset_OpticalPigtail','Property set for optical pigtail. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type OPTICALCABLESEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/OPTICALCABLESEGMENT,IfcCableSegmentType/OPTICALCABLESEGMENT',(#2765,#2766,#2768)); -#2765=IFCSIMPLEPROPERTYTEMPLATE('23A3k51SPDPvO1R0QDfA9e',$,'JacketColour','Indicates the colour of the cable or fitting jacket.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2766=IFCSIMPLEPROPERTYTEMPLATE('227Q_4i5b1Ge57b2uDOA2R',$,'FiberType','Indicates the type of the single fiber.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2767,$,$,$,.READWRITE.); -#2767=IFCPROPERTYENUMERATION('PEnum_FiberType',(IFCLABEL('BEND_INSENSITIVEFIBER'),IFCLABEL('CUTOFFSHIFTEDFIBER'),IFCLABEL('DISPERSIONSHIFTEDFIBER'),IFCLABEL('LOWWATERPEAKFIBER'),IFCLABEL('NON_ZERODISPERSIONSHIFTEDFIBER'),IFCLABEL('OM1'),IFCLABEL('OM2'),IFCLABEL('OM3'),IFCLABEL('OM4'),IFCLABEL('OM5'),IFCLABEL('STANDARDSINGLEMODEFIBER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2768=IFCSIMPLEPROPERTYTEMPLATE('1ifu9MksH14ufZUIWqvGqN',$,'ConnectorType','Indicates the type of connector.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2769=IFCPROPERTYSETTEMPLATE('0K6sgOax920x_H47JV4MoL',$,'Pset_OpticalSplitter','Properties of optical splitter used in the telecommunication domain. This property set can be used by the predefined type DATA of IfcJunctionBox.',.PSET_TYPEDRIVENOVERRIDE.,'IfcJunctionBox/DATA,IfcJunctionBoxType/DATA',(#2770,#2771,#2773)); -#2770=IFCSIMPLEPROPERTYTEMPLATE('2EnOgk8qX5Iwb5Jt20PS7a',$,'NumberOfBranches','Indicates the number of branches that can be supported by the optical splitter.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2771=IFCSIMPLEPROPERTYTEMPLATE('1LG3ZqYmD5$fGmi6tVYm6i',$,'OpticalSplitterType','Indicates the type of optical splitter, single mode or multi-mode.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2772,$,$,$,.READWRITE.); -#2772=IFCPROPERTYENUMERATION('PEnum_OpticalSplitterType',(IFCLABEL('MULTIMODE'),IFCLABEL('SINGLEMODE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2773=IFCSIMPLEPROPERTYTEMPLATE('3U_YxS7Er7cQgmL_qggUya',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#2774=IFCPROPERTYSETTEMPLATE('0UNgKs3bfCuPpgEXsnGPcr',$,'Pset_OutletTypeCommon','Common properties for different outlet types.',.PSET_TYPEDRIVENOVERRIDE.,'IfcOutlet,IfcOutletType',(#2775,#2776,#2778,#2779)); -#2775=IFCSIMPLEPROPERTYTEMPLATE('1nfcH5SaTAvQpUbKl3sUw9',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2776=IFCSIMPLEPROPERTYTEMPLATE('0WE4LBxE18Px$y8xA1n3Tc',$,'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',$,#2777,$,$,$,.READWRITE.); -#2777=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2778=IFCSIMPLEPROPERTYTEMPLATE('3wlSUWoY58ifJ87NdoQV8S',$,'IsPluggableOutlet','Indication of whether the outlet accepts a loose plug connection (= TRUE) or whether it is directly connected (= FALSE) or whether the form of connection has not yet been determined (= UNKNOWN).',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); -#2779=IFCSIMPLEPROPERTYTEMPLATE('2CJAQTPzz5UwY7T_K_rTHQ',$,'NumberOfSockets','The number of sockets that may be connected. In case of inconsistency, sockets defined on ports take precedence.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2780=IFCPROPERTYSETTEMPLATE('3TgSJlVcvCTO9ZcyGEpoLc',$,'Pset_OutsideDesignCriteria','Outside air conditions used as the basis for calculating thermal loads at peak conditions, as well as the weather data location from which these conditions were obtained. HISTORY: New property set in IFC Release 1.0.',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#2781,#2782,#2783,#2784,#2785,#2786,#2787,#2788,#2789,#2791,#2792)); -#2781=IFCSIMPLEPROPERTYTEMPLATE('2Vsf2czwv4tOIXb5grk3Xg',$,'HeatingDryBulb','Dry bulb temperature for heating design.\X2\000A000A\X0\At outside.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2782=IFCSIMPLEPROPERTYTEMPLATE('0YeqHDm$n4g8Ce2VKDG9Km',$,'HeatingWetBulb','Outside wet bulb temperature for heating design.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2783=IFCSIMPLEPROPERTYTEMPLATE('1mlhWY00r0Vx7ZI6tB1DaP',$,'HeatingDesignDay','The month, day and time that has been selected for the heating design calculations.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); -#2784=IFCSIMPLEPROPERTYTEMPLATE('3_fuOxM8v6iR6MYeOG0hzv',$,'CoolingDryBulb','Dry bulb temperature, usually for for cooling design.\X2\000A000A\X0\Outside dry bulb temperature',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2785=IFCSIMPLEPROPERTYTEMPLATE('1hS1rk9HLBxPwEqdEqYB$P',$,'CoolingWetBulb','Outside wet bulb temperature for cooling design.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2786=IFCSIMPLEPROPERTYTEMPLATE('3_1MnZi794hOaQDcU6wNoR',$,'CoolingDesignDay','The month, day and time that has been selected for the cooling design calculations.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); -#2787=IFCSIMPLEPROPERTYTEMPLATE('1K42byUt98dOEIAZ$GL8Bv',$,'WeatherDataStation','The site weather data station description or reference to the data source from which weather data was obtained for use in calculations.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2788=IFCSIMPLEPROPERTYTEMPLATE('0VPFhwULf8Vvpidsokrb_y',$,'WeatherDataDate','The date for which the weather data was gathered.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); -#2789=IFCSIMPLEPROPERTYTEMPLATE('3YyX7uODL1jPKVbPRLf7Mu',$,'BuildingThermalExposure','The thermal exposure expected by the building based on surrounding site conditions.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2790,$,$,$,.READWRITE.); -#2790=IFCPROPERTYENUMERATION('PEnum_BuildingThermalExposure',(IFCLABEL('HEAVY'),IFCLABEL('LIGHT'),IFCLABEL('MEDIUM'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2791=IFCSIMPLEPROPERTYTEMPLATE('2GMBiOTeL5Tw7LkhVSu1a2',$,'PrevailingWindDirection','The prevailing wind angle direction measured from True North (0 degrees) in a clockwise direction.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2792=IFCSIMPLEPROPERTYTEMPLATE('3kX6L9odLE88UqsUEA7j0z',$,'PrevailingWindVelocity','The design wind velocity coming from the direction specified by the PrevailingWindDirection attribute.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#2793=IFCPROPERTYSETTEMPLATE('0SfL9xann43h3Zc4YwXzPs',$,'Pset_PackingInstructions','Packing instructions are specific instructions relating to the packing that is required for an artifact in the event of a move (or transport).',.PSET_TYPEDRIVENOVERRIDE.,'IfcTask/MOVE,IfcTaskType/MOVE',(#2794,#2796,#2797,#2798)); -#2794=IFCSIMPLEPROPERTYTEMPLATE('0uRQesK_L46Ou$m4pPw9VT',$,'PackingCareType','Identifies the predefined types of care that may be required when handling the artefact during a move where:Fragile: artefact may be broken during a move through careless handling.\X2\000A\X0\HandleWithCare: artefact may be damaged during a move through careless handling.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2795,$,$,$,.READWRITE.); -#2795=IFCPROPERTYENUMERATION('PEnum_PackingCareType',(IFCLABEL('FRAGILE'),IFCLABEL('HANDLEWITHCARE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2796=IFCSIMPLEPROPERTYTEMPLATE('2LwMA1JSH4mh96Z7LENKlE',$,'WrappingMaterial','Special requirements for material used to wrap an artefact.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#2797=IFCSIMPLEPROPERTYTEMPLATE('2vaPbpbHT7rvhuCNvthihW',$,'ContainerMaterial','Special requirements for material used to contain an artefact.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#2798=IFCSIMPLEPROPERTYTEMPLATE('1rprLu1p96wAYNNZeKWMzK',$,'SpecialInstructions','Special instructions.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2799=IFCPROPERTYSETTEMPLATE('3VOVS$Cx5939d4cTFeF0OK',$,'Pset_PatchCordCable','This property set has properties that are applicable to cable segment and optical cable segment, indicated that the cable is a patch cord cable, which is fitted with connectors at both ends, allowing it to be rapidly and conveniently connected to other cables or to distribution panels.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CABLESEGMENT,IfcCableSegment/OPTICALCABLESEGMENT,IfcCableSegmentType/CABLESEGMENT,IfcCableSegmentType/OPTICALCABLESEGMENT',(#2800)); -#2800=IFCSIMPLEPROPERTYTEMPLATE('0CJlbza6HDPhcKq4cC6Ycz',$,'JacketColour','Indicates the colour of the cable or fitting jacket.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2801=IFCPROPERTYSETTEMPLATE('0wIwld$Pv9eRePu5s0BQ2V',$,'Pset_PavementCommon','Describes the common properties and nominal dimensions of pavement.Property use clarification\X2\000A\X0\The nominal thickness of the pavement remains constant with the value from NominalThickness, unless the property NominalThicknessEnd is provided. In which case NominalThickness is the value at the beginning of a transition (usually at the object placement location). e.g. a (road) transition segment where the pavement object''s linear placement along an alignment denotes the beginning location and NominalThicknessEnd is the value at the end as indicated by the property NominalLength. In the case of local placements, it is user defined along which axis lengths and widths are measured.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPavement,IfcPavementType',(#2802,#2803,#2805,#2806,#2807,#2808,#2809,#2810)); -#2802=IFCSIMPLEPROPERTYTEMPLATE('1UV38ckQ92de1Rk5ngKcxR',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2803=IFCSIMPLEPROPERTYTEMPLATE('1QDfho0$T9_w2qT6_TLL0C',$,'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',$,#2804,$,$,$,.READWRITE.); -#2804=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2805=IFCSIMPLEPROPERTYTEMPLATE('2QVHz2NBXAvv3Ib30nbmHK',$,'NominalThicknessEnd','The nominal thickness of the object after a transition from its original value. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2806=IFCSIMPLEPROPERTYTEMPLATE('2o_vyoOkX8mw_TJOjGrRlk',$,'StructuralSlope','The nominal side slope (allowable steepness) of the pavement structure (not including side slope fill) as a positive ratio measure. The slope information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters take precedence. Value is typically less than 1.0 (1:1) but may be greater than that for steeper slopes.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2807=IFCSIMPLEPROPERTYTEMPLATE('0j1zFsd4j7TArGGGrvLoot',$,'StructuralSlopeType','User defined description on the type of slope used for the pavement structure (not including side slope fill) . Examples are "Even" or "Stepped".',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2808=IFCSIMPLEPROPERTYTEMPLATE('0AubfDB_P7cu0XmrQXdpdy',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2809=IFCSIMPLEPROPERTYTEMPLATE('3xf2cGtCr0tA6icHf2QebA',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2810=IFCSIMPLEPROPERTYTEMPLATE('320YMJ9ZbCmhLNi35T9DyX',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2811=IFCPROPERTYSETTEMPLATE('0tyFrC41vEMgCVa0sUpkTs',$,'Pset_PavementMillingCommon','Properties for pavement milling.',.PSET_OCCURRENCEDRIVEN.,'IfcEarthworksCut/PAVEMENTMILLING',(#2812,#2813)); -#2812=IFCSIMPLEPROPERTYTEMPLATE('39qKI7b7DEDPoLofu3kWZQ',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2813=IFCSIMPLEPROPERTYTEMPLATE('0JT4DZ7bf1yAFUDT2YIwsp',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2814=IFCPROPERTYSETTEMPLATE('0BkV8WI1f1mxiZZO9TFBqX',$,'Pset_PavementSurfaceCommon','Properties for a pavement surface.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPavement,IfcPavementType',(#2815,#2816)); -#2815=IFCSIMPLEPROPERTYTEMPLATE('2Qqi7Uohf57Q7cqEDMDD_U',$,'PavementRoughness','An assessment of the functional condition of the pavement surface indicated as an index according to the International Roughness Index (IRI).',.P_SINGLEVALUE.,'IfcNumericMeasure',$,$,$,$,$,.READWRITE.); -#2816=IFCSIMPLEPROPERTYTEMPLATE('2oNnjvXrj8WBhGUPXGh5_3',$,'PavementTexture','Characterization of pavement texture by mean profile depthNOTE Definition according to ISO 13473-1:2019',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2817=IFCPROPERTYSETTEMPLATE('3cq_oH3Fr7fPPfSgK3B5Rn',$,'Pset_Permit','A permit is a document that allows permission to gain access to an area or carry out work in a situation where security or other access restrictions apply.\X2\000A\X0\HISTORY: IFC4 EndDate added. PermitType, PermitDuration, StartTime and EndTime are deleted.',.PSET_OCCURRENCEDRIVEN.,'IfcPermit',(#2818,#2819,#2820,#2821)); -#2818=IFCSIMPLEPROPERTYTEMPLATE('1HkbKUe6v6FfR8QHM5bMWV',$,'EscortRequirement','Indicates whether or not an escort is required to accompany persons carrying out a work order at or to/from the place of work (= TRUE) or not (= FALSE).NOTE - There are many instances where escorting is required, particularly in a facility that has a high security rating. Escorting may require that persons are escorted to and from the place of work. Alternatively, it may involve the escort remaining at the place of work at all times.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2819=IFCSIMPLEPROPERTYTEMPLATE('2myWQRXxXE29tc5I5Ilex_',$,'StartDate','Date and time from which the permit becomes valid.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); -#2820=IFCSIMPLEPROPERTYTEMPLATE('1wZMT7TFzEHOnEYhc2WXJ2',$,'EndDate','Date and time at which the permit ceases to be valid.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); -#2821=IFCSIMPLEPROPERTYTEMPLATE('0m32Nr1Nr5WxuRoTV_Wli5',$,'SpecialRequirements','Any additional special requirements that need to be included in the permit to work.NOTE - Additional permit requirements may be imposed according to the nature of the facility at which the work is carried out. For instance, in clean areas, special clothing may be required whilst in corrective institutions, it may be necessary to check in and check out tools that will be used for work as a safety precaution.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2822=IFCPROPERTYSETTEMPLATE('33XVCl1S9DX8iAodaFJbpE',$,'Pset_PileCommon','Properties common to the definition of all occurrences of IfcPile.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPile,IfcPileType',(#2823,#2824,#2826)); -#2823=IFCSIMPLEPROPERTYTEMPLATE('0npqEM3jjDdusV2QHmubqv',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2824=IFCSIMPLEPROPERTYTEMPLATE('1KFGCk4Pb7tBgblyJAm0D7',$,'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',$,#2825,$,$,$,.READWRITE.); -#2825=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2826=IFCSIMPLEPROPERTYTEMPLATE('1no$h$VQn6s91ShidPz0ly',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2827=IFCPROPERTYSETTEMPLATE('3RwL_t0S59YwhRa3Nl6w8R',$,'Pset_PipeConnectionFlanged','This property set is used to define the specifics of a flanged pipe connection used between occurrences of pipe segments and fittings.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeSegment,IfcPipeSegmentType',(#2828,#2829,#2830,#2831,#2832,#2833,#2834,#2835)); -#2828=IFCSIMPLEPROPERTYTEMPLATE('3MnTpb3rb9ggxeHqrlQ0Jl',$,'FlangeTable','Designation of the standard table to which the flange conforms.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2829=IFCSIMPLEPROPERTYTEMPLATE('1lhbJbgDf4RxQgZEhBvuw5',$,'FlangeStandard','Designation of the standard describing the flange table.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2830=IFCSIMPLEPROPERTYTEMPLATE('3nQBbd35XA5BmmmgSUb$Rx',$,'BoreSize','The nominal bore of the pipe flange.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2831=IFCSIMPLEPROPERTYTEMPLATE('2MZWi6X6z3nfgCoNesUYu6',$,'FlangeDiameter','Overall diameter of the flange.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2832=IFCSIMPLEPROPERTYTEMPLATE('2bu1O5YyD0zf1VpB1w6sNz',$,'FlangeThickness','Thickness of the material from which the pipe bend is constructed.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2833=IFCSIMPLEPROPERTYTEMPLATE('2IOWbMvnf4Sw7won8eS5zq',$,'NumberOfBoltholes','Number of boltholes in the flange.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2834=IFCSIMPLEPROPERTYTEMPLATE('1tNQ96Dw5DxApqfPfRPcJl',$,'BoltSize','Size of the bolts securing the flange.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2835=IFCSIMPLEPROPERTYTEMPLATE('1w4cSgZEz8BewjDB7uMzzy',$,'BoltholePitch','Diameter of the circle along which the boltholes are placed.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2836=IFCPROPERTYSETTEMPLATE('1ejz3b_LL5pwDk$yKAi$OP',$,'Pset_PipeFittingOccurrence','Pipe segment occurrence attributes attached to an instance of IfcPipeSegment.',.PSET_OCCURRENCEDRIVEN.,'IfcPipeFitting',(#2837,#2838)); -#2837=IFCSIMPLEPROPERTYTEMPLATE('1U5sfcUQH9aB0FnjhJhHjh',$,'InteriorRoughnessCoefficient','The interior roughness of the material of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2838=IFCSIMPLEPROPERTYTEMPLATE('1IeCX_sFrDSBxoYlDk46gI',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2839=IFCPROPERTYSETTEMPLATE('0418zACrfFiOaVIm$_rlyE',$,'Pset_PipeFittingPHistory','Pipe fitting performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcPipeFitting',(#2840,#2841)); -#2840=IFCSIMPLEPROPERTYTEMPLATE('20HvaaECvA39j2pQQkIfBG',$,'LossCoefficient','Dimensionless loss coefficient used for calculating fluid resistance representing the ratio of total pressure loss to velocity pressure at a referenced cross-section.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#2841=IFCSIMPLEPROPERTYTEMPLATE('1aRkjHz5TD7ufHHy5j2pHZ',$,'FlowrateLeakage','Leakage flowrate versus pressure difference.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#2842=IFCPROPERTYSETTEMPLATE('35cOaOlffBsBQo1$05wzs7',$,'Pset_PipeFittingTypeCommon','Pipe fitting type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeFitting,IfcPipeFittingType',(#2843,#2844,#2846,#2847,#2848,#2849)); -#2843=IFCSIMPLEPROPERTYTEMPLATE('3ceOHUpab1SBYZJWybPkhQ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2844=IFCSIMPLEPROPERTYTEMPLATE('22NrKmh_r0Owv7pGIfmNUX',$,'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',$,#2845,$,$,$,.READWRITE.); -#2845=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2846=IFCSIMPLEPROPERTYTEMPLATE('0T2kJxywX048aLzjVOr1zM',$,'PressureClass','Nominal pressure rating of the object.\X2\000A000A\X0\The test or rated pressure classification of the fitting.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2847=IFCSIMPLEPROPERTYTEMPLATE('3OLXKoyDbFiBAvs5kb6Bq2',$,'PressureRange','Allowable maximum and minimum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2848=IFCSIMPLEPROPERTYTEMPLATE('37qRFXpA92sP7PrS7NkZD5',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2849=IFCSIMPLEPROPERTYTEMPLATE('26LvdA96b0Mvxnn23MLxgq',$,'FittingLossFactor','A factor that determines the pressure loss due to friction through the fitting.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#2850=IFCPROPERTYSETTEMPLATE('2DdpmBfKH5cuysXs9OYwqb',$,'Pset_PipeSegmentOccurrence','Pipe segment occurrence attributes attached to an instance of IfcPipeSegment.',.PSET_OCCURRENCEDRIVEN.,'IfcPipeSegment',(#2851,#2852,#2853,#2854)); -#2851=IFCSIMPLEPROPERTYTEMPLATE('0p1q84IpzDnAHtzrWrK4qA',$,'InteriorRoughnessCoefficient','The interior roughness of the material of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2852=IFCSIMPLEPROPERTYTEMPLATE('3_vL_LPsb3l9$OnXM0CEHL',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2853=IFCSIMPLEPROPERTYTEMPLATE('36SR1rcMHDWAqBc4ZFthmC',$,'Gradient','The gradient of the pipe segment.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2854=IFCSIMPLEPROPERTYTEMPLATE('3aMumq9EX1dumAdnO2TlHq',$,'InvertElevation','The invert elevation relative to the datum established for the project.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2855=IFCPROPERTYSETTEMPLATE('1fL1gPALnD$96cj$Kjr98j',$,'Pset_PipeSegmentPHistory','Pipe segment performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcPipeSegment',(#2856,#2857)); -#2856=IFCSIMPLEPROPERTYTEMPLATE('1FGfU4kIL6FBqvMJOek90O',$,'LeakageCurve','Leakage versus pressure drop; Leakage = f (pressure).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#2857=IFCSIMPLEPROPERTYTEMPLATE('0b7Mp$OIb0lgcNvA2Pq6kK',$,'FluidFlowLeakage','Volumetric leakage flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#2858=IFCPROPERTYSETTEMPLATE('0AJyVWxvz2ivByYplm4PgS',$,'Pset_PipeSegmentTypeCommon','Pipe segment type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeSegment,IfcPipeSegmentType',(#2859,#2860,#2862,#2863,#2864,#2865,#2866,#2867,#2868)); -#2859=IFCSIMPLEPROPERTYTEMPLATE('0tKJwtGvj4mupotB9ZahGP',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2860=IFCSIMPLEPROPERTYTEMPLATE('0CFFWCRLrBdwpzZb$45SNN',$,'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',$,#2861,$,$,$,.READWRITE.); -#2861=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2862=IFCSIMPLEPROPERTYTEMPLATE('0GCByH1VXFqPMw_tRwbc5W',$,'WorkingPressure','Working pressure.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2863=IFCSIMPLEPROPERTYTEMPLATE('16Hagjp4T1nwhEza7jcVxH',$,'PressureRange','Allowable maximum and minimum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2864=IFCSIMPLEPROPERTYTEMPLATE('38BaPWWcbBLwcg27PhRcBF',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#2865=IFCSIMPLEPROPERTYTEMPLATE('0bRkZ1L1PEpRWXN30jpxGO',$,'NominalDiameter','Nominal diameter or width of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2866=IFCSIMPLEPROPERTYTEMPLATE('0qRHaLl3D1A87qOdFcRu8z',$,'InnerDiameter','The actual inner diameter of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2867=IFCSIMPLEPROPERTYTEMPLATE('3GuG69K$L4D8x1TTg6lK9O',$,'OuterDiameter','The actual outer diameter of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2868=IFCSIMPLEPROPERTYTEMPLATE('0wEDLoJXvFUBme6jKXYdK6',$,'Length','The length of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2869=IFCPROPERTYSETTEMPLATE('3omFtXMOT5vudQRSX_qXR$',$,'Pset_PipeSegmentTypeCulvert','Covered channel or large pipe that forms a watercourse below ground level, usually under a road or railway (BS6100).',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeSegment/CULVERT,IfcPipeSegmentType/CULVERT',(#2870,#2871)); -#2870=IFCSIMPLEPROPERTYTEMPLATE('2ZUu4IozPC1Odj0buhDdDv',$,'InternalWidth','The internal width of the culvert.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2871=IFCSIMPLEPROPERTYTEMPLATE('0E2SnGpe1DBRYNFNEzQmwL',$,'ClearDepth','The clear depth.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2872=IFCPROPERTYSETTEMPLATE('0oju1mO$f3xApV3Q02_1C0',$,'Pset_PipeSegmentTypeGutter','Gutter segment type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeSegment/GUTTER,IfcPipeSegmentType/GUTTER',(#2873,#2874,#2875,#2877,#2878,#2879)); -#2873=IFCSIMPLEPROPERTYTEMPLATE('25BfmOQlXCKfDFwewDHSdE',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.\X2\000A000A\X0\Angle of the gutter to allow for drainage.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2874=IFCSIMPLEPROPERTYTEMPLATE('3wRfyhKVbBjBKSSkHP8OJ2',$,'FlowRating','Actual flow capacity for the gutter. Value of 0.00 means this value has not been set.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#2875=IFCSIMPLEPROPERTYTEMPLATE('1Hy0qCyov9seFFhc73jAxD',$,'Complementaryfunction','Indicates the complementary function of the drain channel.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2876,$,$,$,.READWRITE.); -#2876=IFCPROPERTYENUMERATION('PEnum_ComplementaryWorks',(IFCLABEL('DISPERSING_WELLS'),IFCLABEL('LIFTING_WATER_WELLS'),IFCLABEL('TRANSVERSAL_WATER_REMOVAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('NOTDEFINED')),$); -#2877=IFCSIMPLEPROPERTYTEMPLATE('3O2VEzYLLAO9Yz3FvUlsCq',$,'OrthometricHeight','The orthometric height is the vertical distance H along the plumb line from a point of interest to a reference surface known as the geoid, the vertical datum that approximates mean sea level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2878=IFCSIMPLEPROPERTYTEMPLATE('0KH9i5t_LE3fyV0KZndzfy',$,'IsCovered','This property defines if the drain channel has a cover (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2879=IFCSIMPLEPROPERTYTEMPLATE('0hAsR7Xtj9zf5ahLzLjkXy',$,'IsMonitored','This property defines if the Drain Channel is monitored (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2880=IFCPROPERTYSETTEMPLATE('02i_efQgDFP9DHAFtNlUGj',$,'Pset_PlateCommon','Properties common to the definition of all occurrences of IfcPlate.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPlate,IfcPlateType',(#2881,#2882,#2884,#2885,#2886,#2887,#2888)); -#2881=IFCSIMPLEPROPERTYTEMPLATE('3vbc4dSZv5n9YnsSGLGvge',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2882=IFCSIMPLEPROPERTYTEMPLATE('0OzQM$T41F49g$pOl9LxVN',$,'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',$,#2883,$,$,$,.READWRITE.); -#2883=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2884=IFCSIMPLEPROPERTYTEMPLATE('1YmRkioy1B$gSXJPlU5Cbt',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2885=IFCSIMPLEPROPERTYTEMPLATE('37f0NqE_vCGvRPOv5uf8lw',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2886=IFCSIMPLEPROPERTYTEMPLATE('3zs_ESpcX9e9Rox8EM27mw',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#2887=IFCSIMPLEPROPERTYTEMPLATE('0sfnEEFU10I9c7f108w6$0',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2888=IFCSIMPLEPROPERTYTEMPLATE('0NXneVU3z9jfprx3QwzwO3',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2889=IFCPROPERTYSETTEMPLATE('2DyiGSdo95xfDxq5iTvHip',$,'Pset_PointMachine','Properties of point machine used in railway. The property set can be used by IfcActuator with predefined type set to ELECTRICACTUATOR, HYDRAULICACTUATOR, HANDOPERATEDACTUATOR, or PNEUMATICACTUATOR, indicated that such actuator is a point machine that can switch and lock the track turnout.',.PSET_TYPEDRIVENOVERRIDE.,'IfcActuator/ELECTRICACTUATOR,IfcActuator/HANDOPERATEDACTUATOR,IfcActuator/HYDRAULICACTUATOR,IfcActuator/PNEUMATICACTUATOR,IfcActuatorType/ELECTRICACTUATOR,IfcActuatorType/HANDOPERATEDACTUATOR,IfcActuatorType/HYDRAULICACTUATOR,IfcActuatorType/PNEUMATICACTUATOR',(#2890,#2891,#2892,#2893,#2894,#2895,#2896,#2897,#2898)); -#2890=IFCSIMPLEPROPERTYTEMPLATE('3Vw7Rk95f8zf4sxw$r37vh',$,'ActionBarMovementLength','The movement of the bar that pulls the point of a turnout.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2891=IFCSIMPLEPROPERTYTEMPLATE('0c3_vif$f2NA_8pQ5TbmvT',$,'TractionForce','Traction force of the point machine in turnout conversion.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#2892=IFCSIMPLEPROPERTYTEMPLATE('1L4eEkQWH9sBC3yF17HP4S',$,'ConversionTime','Turnout conversion completion time.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#2893=IFCSIMPLEPROPERTYTEMPLATE('1haiTE5rn8WPlsZIbKWcbK',$,'LockingForce','Locking force of the point machine motor.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#2894=IFCSIMPLEPROPERTYTEMPLATE('1S5$9nfEH7rhKG$vtwNbOz',$,'HasLockInside','Indicates whether the locking is inside (TRUE) or outside (FALSE) of the point machine.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#2895=IFCSIMPLEPROPERTYTEMPLATE('3ZQ$C$m0TB7epKl6s5pbZb',$,'MarkingRodMovementLength','The length of the movement bar which indicates the turnout position.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2896=IFCSIMPLEPROPERTYTEMPLATE('15zEkMHzL6qRXf0gVtoWtX',$,'MaximumOperatingTime','The maximum duration of the turnout movement before the interlocking turns to out of control status.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#2897=IFCSIMPLEPROPERTYTEMPLATE('1d6OUvhbz3lg5syFuoiYfk',$,'MinimumOperatingSpeed','Minimum operating speed of the point machine.',.P_SINGLEVALUE.,'IfcAngularVelocityMeasure',$,$,$,$,$,.READWRITE.); -#2898=IFCSIMPLEPROPERTYTEMPLATE('035q$gfGr8pAXU6y2eU0SC',$,'Current','The actual current and operable range.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#2899=IFCPROPERTYSETTEMPLATE('0BHZp6GjvBaP0XO5nnue8R',$,'Pset_PowerControlSystem','Properties of power control system. The property set can be used by the predefined type ELECTRICAL of IfcDistributionSystem. The property set can be used to characterize the system that controls the railway energy network.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem/ELECTRICAL',(#2900)); -#2900=IFCSIMPLEPROPERTYTEMPLATE('1QJeO_EwjEXOpiWGST0_sa',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#2901=IFCPROPERTYSETTEMPLATE('2_14cagqLFGuvkEzauuKD3',$,'Pset_PrecastConcreteElementFabrication','Production and manufacturing related properties common to different types of precast concrete elements. The Pset applies to manufactured pieces. It can be used by a number of subtypes of IfcBuildingElement. If the precast concrete ele',.PSET_TYPEDRIVENOVERRIDE.,'IfcBeam,IfcBuildingElementProxy,IfcChimney,IfcCivilElement,IfcColumn,IfcFooting,IfcMember,IfcPile,IfcPlate,IfcRampFlight,IfcRamp,IfcRoof,IfcSlab,IfcStairFlight,IfcStair,IfcWall,IfcBeamType,IfcBuildingElementProxyType,IfcChimneyType,IfcCivilElementType,IfcColumnType,IfcFootingType,IfcMemberType,IfcPileType,IfcPlateType,IfcRampFlightType,IfcRampType,IfcRoofType,IfcSlabType,IfcStairFlightType,IfcStairType,IfcWallType',(#2902,#2903,#2904,#2905,#2906,#2907,#2908)); -#2902=IFCSIMPLEPROPERTYTEMPLATE('1rQG6NNgj3Ku50rcERu5cT',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2903=IFCSIMPLEPROPERTYTEMPLATE('14iXbtW$PFtf3tG5gyqiaa',$,'ProductionLotId','The manufacturer''s production lot identifier.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2904=IFCSIMPLEPROPERTYTEMPLATE('3jsJphCljBLOayYrcvNhCq',$,'SerialNumber','The manufacturer''s serial number assigned to an occurrence of a product.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#2905=IFCSIMPLEPROPERTYTEMPLATE('3WepZGOe9CaeXSiZh4Fkyr',$,'PieceMark','Defines a unique piece for production purposes. All pieces with the same piece mark value are identical and interchangeable. The piece mark may be composed of sub-parts that have specific locally defined meaning (e.g. B-1A may denote a beam, of generic type \X2\2018\X0\1\X2\2019\X0\ and specific shape \X2\2018\X0\A\X2\2019\X0\).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2906=IFCSIMPLEPROPERTYTEMPLATE('01b2_ebD57weCVcdj1Zjck',$,'AsBuiltLocationNumber','Defines a unique location within a structure, the \X2\2018\X0\slot\X2\2019\X0\ into which the piece was installed. Where pieces share the same piece mark, they can be interchanged. The value is only known after erection.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2907=IFCSIMPLEPROPERTYTEMPLATE('02IYqwOXf85fzzAIsj0iFo',$,'ActualProductionDate','Production date (stripped from form).',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); -#2908=IFCSIMPLEPROPERTYTEMPLATE('2rUDirMUbDBOBFNQjNQNRG',$,'ActualErectionDate','Date erected.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); -#2909=IFCPROPERTYSETTEMPLATE('23kocPHov4SR3NeJsUVHfK',$,'Pset_PrecastConcreteElementGeneral','Production and manufacturing related properties common to different types of precast concrete elements. The Pset can be used by a number of subtypes of IfcBuildingElement. If the precast concrete element is a sandwich wall panel each structural layer or shell represented by an IfcBuildingElementPart may be attached to a separate Pset of this type, if needed. Some of the properties apply only for specific types of precast concrete elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBeam,IfcBuildingElementProxy,IfcChimney,IfcCivilElement,IfcColumn,IfcFooting,IfcMember,IfcPile,IfcPlate,IfcRampFlight,IfcRamp,IfcRoof,IfcSlab,IfcStairFlight,IfcStair,IfcWall,IfcBeamType,IfcBuildingElementProxyType,IfcChimneyType,IfcCivilElementType,IfcColumnType,IfcFootingType,IfcMemberType,IfcPileType,IfcPlateType,IfcRampFlightType,IfcRampType,IfcRoofType,IfcSlabType,IfcStairFlightType,IfcStairType,IfcWallType',(#2910,#2911,#2912,#2913,#2914,#2915,#2916,#2917,#2918,#2919,#2920,#2921,#2922,#2923,#2924,#2925,#2926,#2927,#2928,#2929)); -#2910=IFCSIMPLEPROPERTYTEMPLATE('1zXSHyAEnDaOrqq3KIcvxH',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2911=IFCSIMPLEPROPERTYTEMPLATE('1fC820PV1C2hobIaLPZxr2',$,'CornerChamfer','The chamfer in the corners of the precast element. The chamfer is presumed to be equal in both directions.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2912=IFCSIMPLEPROPERTYTEMPLATE('28WCdqpvvBZ9cdR8iNn6jt',$,'ManufacturingToleranceClass','Classification designation of the manufacturing tolerances according to local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2913=IFCSIMPLEPROPERTYTEMPLATE('11VZujYDP0yRTFP$iyhoVZ',$,'FormStrippingStrength','The minimum required compressive strength of the concrete at form stripping time.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2914=IFCSIMPLEPROPERTYTEMPLATE('1SRl_o8RLEmhYzqwlSj0BY',$,'LiftingStrength','The minimum required compressive strength of the concrete when the concrete element is lifted.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2915=IFCSIMPLEPROPERTYTEMPLATE('04SsIVbH9FK82hdm1WEUuu',$,'ReleaseStrength','The minimum required compressive strength of the concrete when the tendon stress is released. This property applies to prestressed concrete elements only.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2916=IFCSIMPLEPROPERTYTEMPLATE('2zwXe_V7n6mRPXKqzBdWrs',$,'MinimumAllowableSupportLength','The minimum allowable support length.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2917=IFCSIMPLEPROPERTYTEMPLATE('2KrohKpzv18h3NWmAYsgC8',$,'InitialTension','The initial stress of the tendon. This property applies to prestressed concrete elements only.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2918=IFCSIMPLEPROPERTYTEMPLATE('0dbPixVVrCsxGokqP4Lpps',$,'TendonRelaxation','The maximum allowable relaxation of the tendon (usually expressed as %/1000 h).This property applies to prestressed concrete elements only.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#2919=IFCSIMPLEPROPERTYTEMPLATE('3OVGwN72b2DOSyh2V_qvAP',$,'TransportationStrength','The minimum required compressive strength of the concrete required for transportation.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#2920=IFCSIMPLEPROPERTYTEMPLATE('3sqB8lUDvFuQlG0ji1p3kp',$,'SupportDuringTransportDescription','Textual description of how the concrete element is supported during transportation.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#2921=IFCSIMPLEPROPERTYTEMPLATE('2vNsKhAyD5HxRN6vZ0I19l',$,'SupportDuringTransportDocReference','Reference to an external document defining how the concrete element is supported during transportation.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#2922=IFCSIMPLEPROPERTYTEMPLATE('2a1MgIGPzB5QVbKMYE3gSP',$,'HollowCorePlugging','A descriptive label for how the hollow core ends are treated: they may be left open, closed with a plug, or sealed with cast concrete. Values would be, for example: ''Unplugged'', ''Plugged'', ''SealedWithConcrete''. This property applies to hollow core slabs only.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2923=IFCSIMPLEPROPERTYTEMPLATE('2QnB_rt$vBC9OcdQ7PzBDp',$,'CamberAtMidspan','The camber deflection, measured from the midpoint of a cambered face of a piece to the midpoint of the chord joining the ends of the same face, as shown in the figure below, divided by the original (nominal) straight length of the face of the piece.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#2924=IFCSIMPLEPROPERTYTEMPLATE('0FS2czwOT1YfKjxFPkV_NG',$,'BatterAtStart','The angle, in radians, by which the formwork at the starting face of a piece is to be rotated from the vertical in order to compensate for the rotation of the face that will occur once the piece is stripped from its form, inducing camber due to eccentric prestressing.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2925=IFCSIMPLEPROPERTYTEMPLATE('2hnY_MIu53k8NIu1BW44aD',$,'BatterAtEnd','The angle, in radians, by which the formwork at the ending face of a piece is to be rotated from the vertical in order to compensate for the rotation of the face that will occur once the piece is stripped from its form, inducing camber due to eccentric prestressing.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2926=IFCSIMPLEPROPERTYTEMPLATE('3Ym$WhJPXCgf7f_eyZzsuG',$,'Twisting','The angle, in radians, through which the end face of a precast piece is rotated with respect to its starting face, along its longitudinal axis, as a result of non-aligned supports. This measure is also termed the \X2\2018\X0\warping\X2\2019\X0\ angle.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2927=IFCSIMPLEPROPERTYTEMPLATE('2CO70oYUD23PyRm9VFoJ1X',$,'Shortening','The ratio of the distance by which a precast piece is shortened after release from its form (due to compression induced by prestressing) to its original (nominal) length.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#2928=IFCSIMPLEPROPERTYTEMPLATE('2LuNPJz_r2TQF04zhmAppy',$,'PieceMark','Defines a unique piece for production purposes. All pieces with the same piece mark value are identical and interchangeable. The piece mark may be composed of sub-parts that have specific locally defined meaning (e.g. B-1A may denote a beam, of generic type \X2\2018\X0\1\X2\2019\X0\ and specific shape \X2\2018\X0\A\X2\2019\X0\).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2929=IFCSIMPLEPROPERTYTEMPLATE('3BmOgQOinEMgvPQhW3IK8G',$,'DesignLocationNumber','Defines a unique location within a structure, the \X2\2018\X0\slot\X2\2019\X0\ for which the piece was designed.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2930=IFCPROPERTYSETTEMPLATE('0mCPLvA7X2rAPq0B9KQjZh',$,'Pset_PrecastKerbStone','Properties for precast kerb stone.',.PSET_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#2931,#2932,#2933,#2934)); -#2931=IFCSIMPLEPROPERTYTEMPLATE('1mONsE0eDA$Bd_Io6g$4Gu',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2932=IFCSIMPLEPROPERTYTEMPLATE('1Yywmgyjb948OPDgJ1mlB9',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2933=IFCSIMPLEPROPERTYTEMPLATE('3zHH0setP8jAXlOUvivRZA',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2934=IFCSIMPLEPROPERTYTEMPLATE('26F$hVle5819pf6Rm039Vk',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2935=IFCPROPERTYSETTEMPLATE('0blcIVYsnFzw4Io7hIVjWd',$,'Pset_PrecastSlab','Layout and component information defining how prestressed slab components are laid out in a precast slab assembly. The values are global defaults for the slab as a whole, but can be overridden by local placements of the individual com',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab,IfcSlabType',(#2936,#2937,#2938,#2939,#2940,#2941,#2942,#2943)); -#2936=IFCSIMPLEPROPERTYTEMPLATE('1zdh$IxYD8vxj5f$eV_0Vu',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2937=IFCSIMPLEPROPERTYTEMPLATE('3j3olrvOnANA7FvLqccNFY',$,'ToppingType','Defines if a topping is applied and what kind. Values are \X2\201C\X0\Full topping\X2\201D\X0\, \X2\201C\X0\Perimeter Wash\X2\201D\X0\, \X2\201C\X0\None\X2\201D\X0\',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2938=IFCSIMPLEPROPERTYTEMPLATE('3pHyQ187XACPzlSA8FrnvK',$,'EdgeDistanceToFirstAxis','The distance from the left (\X2\2018\X0\West\X2\2019\X0\) edge of the slab (in the direction of span of the components) to the axis of the first component.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2939=IFCSIMPLEPROPERTYTEMPLATE('3FXcu_hwHDhepiEHRGhHgN',$,'DistanceBetweenComponentAxes','The distance between the axes of the components, measured along the \X2\2018\X0\South\X2\2019\X0\ edge of the slab.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2940=IFCSIMPLEPROPERTYTEMPLATE('3wjCFKNM19VhBzJKaU1JFv',$,'AngleToFirstAxis','The angle of rotation of the axis of the first component relative to the \X2\2018\X0\West\X2\2019\X0\ edge of the slab.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2941=IFCSIMPLEPROPERTYTEMPLATE('0bv5uWp$z2_grYkNSnOJVt',$,'AngleBetweenComponentAxes','The angle between the axes of each pair of components.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#2942=IFCSIMPLEPROPERTYTEMPLATE('0hLwJ_ADP8$PH8BCO2tUy0',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2943=IFCSIMPLEPROPERTYTEMPLATE('0V2XOvD0v1tgrKmXPZPmxK',$,'NominalToppingThickness','The nominal thickness of the topping.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2944=IFCPROPERTYSETTEMPLATE('3VOWzqt$PFqQk8lrI_I92l',$,'Pset_ProcessCapacity','Property set for the application of process data to spatial elements and transport assets',.PSET_TYPEDRIVENOVERRIDE.,'IfcBuiltSystem,IfcDistributionSystem,IfcDoor,IfcSpace,IfcTransportationDevice,IfcZone,IfcDoorType,IfcSpaceType,IfcTransportationDeviceType',(#2945,#2947,#2948,#2949,#2950)); -#2945=IFCSIMPLEPROPERTYTEMPLATE('3Mr1uD0trDUAZTMQ_gr_zA',$,'ProcessItem','The type of item (and its measurement method) being modelled within a process. This can be cargo, passengers or vehicles that pass through the system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2946,$,$,$,.READWRITE.); -#2946=IFCPROPERTYENUMERATION('PEnum_ProcessItem',(IFCLABEL('BARREL'),IFCLABEL('CGT'),IFCLABEL('PASSENGER'),IFCLABEL('TEU'),IFCLABEL('TONNE'),IFCLABEL('VEHICLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#2947=IFCSIMPLEPROPERTYTEMPLATE('0i00UIoVj13B0955pxuSAV',$,'ProcessCapacity','The number of units that can be processed in the time defined in ProcessPerformance',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2948=IFCSIMPLEPROPERTYTEMPLATE('2_Pp2AdwHDguIxtxgGEdiP',$,'ProcessPerformance','Minimum time to accept or dispatch the entire item capacity.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#2949=IFCSIMPLEPROPERTYTEMPLATE('2Bq55z7g92jgGq590GCF_i',$,'DownstreamConnections','Names of downstream connected equipment and spaces (comma-separated), if not otherwise represented',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2950=IFCSIMPLEPROPERTYTEMPLATE('3Pb0aP5zX4HPg9_sem9o4t',$,'UpstreamConnections','Names of upstream connected equipment and spaces (comma-separated), if not otherwise represented',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#2951=IFCPROPERTYSETTEMPLATE('2dAr26LZ9AsvaUNoWWsn_o',$,'Pset_ProfileArbitraryDoubleT','This is a collection of geometric properties of double-T section profiles of precast concrete elements, to be used in conjunction with IfcArbitraryProfileDef when profile designation alone does not fulfill the information requirements.',.PSET_PROFILEDRIVEN.,'IfcArbitraryClosedProfileDef',(#2952,#2953,#2954,#2955,#2956,#2957,#2958,#2959,#2960,#2961,#2962,#2963,#2964,#2965,#2966)); -#2952=IFCSIMPLEPROPERTYTEMPLATE('1PoJHbS$51FAuyw0sn9l82',$,'OverallWidth','Overall width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2953=IFCSIMPLEPROPERTYTEMPLATE('2UqB5l6M99zhgV0S$Bipge',$,'LeftFlangeWidth','Left flange width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2954=IFCSIMPLEPROPERTYTEMPLATE('30JJXo$519WA9R0mGAxfOm',$,'RightFlangeWidth','Right flange width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2955=IFCSIMPLEPROPERTYTEMPLATE('3gjlaD43n1xeK07aTXTrtW',$,'OverallDepth','Overall depth of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2956=IFCSIMPLEPROPERTYTEMPLATE('379Oriog94yv6R2793gXiH',$,'FlangeDepth','Flange depth of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2957=IFCSIMPLEPROPERTYTEMPLATE('3arHFutXj0e9S8NZJdslEt',$,'FlangeDraft','Flange draft of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2958=IFCSIMPLEPROPERTYTEMPLATE('1ee$EDElH948g0bDi_z5_V',$,'FlangeChamfer','Flange chamfer of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2959=IFCSIMPLEPROPERTYTEMPLATE('0KobIMUJT0wP5z9tRTFUOW',$,'FlangeBaseFillet','Flange base fillet of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2960=IFCSIMPLEPROPERTYTEMPLATE('1Wx3sdP1r94et1UGwdHx6U',$,'FlangeTopFillet','Flange top fillet of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2961=IFCSIMPLEPROPERTYTEMPLATE('0T32NyNifFygEZl$7yHHIT',$,'StemBaseWidth','Stem base width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2962=IFCSIMPLEPROPERTYTEMPLATE('0vXeZGXdvFMgOgz6wT0REL',$,'StemTopWidth','Stem top width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2963=IFCSIMPLEPROPERTYTEMPLATE('2TM5P557TDpwodBj0yAuAw',$,'StemBaseChamfer','Stem base chamfer of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2964=IFCSIMPLEPROPERTYTEMPLATE('2r$ft0HmTF39OiUnr6sITs',$,'StemTopChamfer','Stem top chamfer of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2965=IFCSIMPLEPROPERTYTEMPLATE('0ybNz_Dnf3zBKqxTDMEkhL',$,'StemBaseFillet','Stem base fillet of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2966=IFCSIMPLEPROPERTYTEMPLATE('2sthGqZMT0seevehfguMB7',$,'StemTopFillet','Stem top fillet of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2967=IFCPROPERTYSETTEMPLATE('37uuCegwHDB9MT4t74dPIE',$,'Pset_ProfileArbitraryHollowCore','This is a collection of geometric properties of hollow core section profiles of precast concrete elements, to be used in conjunction with IfcArbitraryProfileDefWithVoids when profile designation alone does not fulfill the information requirements.In all cases, the cores are symmetrically distributed on either side of the plank center line, irrespective of whether the number of cores is odd or even. For planks with a center core with different geometry to that of the other cores, provide the property CenterCoreSpacing. When the number of cores is even, no Center Core properties shall be asserted.Key chamfers and draft chamfer are all 45 degree chamfers.The CoreTopRadius and CoreBaseRadius parameters can be derived and are therefore not listed in the property set. They are shown to define that the curves are arcs. The parameters for the center core are the same as above, but with the prefix "Center".',.PSET_PROFILEDRIVEN.,'IfcArbitraryProfileDefWithVoids',(#2968,#2969,#2970,#2971,#2972,#2973,#2974,#2975,#2976,#2977,#2978,#2979,#2980,#2981,#2982,#2983,#2984,#2985,#2986,#2987,#2988,#2989,#2990)); -#2968=IFCSIMPLEPROPERTYTEMPLATE('3sGygQnm94k9BLLmydTqcc',$,'OverallWidth','Overall width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2969=IFCSIMPLEPROPERTYTEMPLATE('3qUhDv9B16sOO6n$aljbhd',$,'OverallDepth','Overall depth of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2970=IFCSIMPLEPROPERTYTEMPLATE('0qRXnOp3f1TekAJhVpBg6S',$,'EdgeDraft','Edge draft of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2971=IFCSIMPLEPROPERTYTEMPLATE('2Elfh9Fx18r87cGtf8EmwQ',$,'DraftBaseOffset','Draft base offset of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2972=IFCSIMPLEPROPERTYTEMPLATE('0qABI31prFnvlnX9FWRs_l',$,'DraftSideOffset','Draft side offset of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2973=IFCSIMPLEPROPERTYTEMPLATE('3kYj3YlKP08heE8_Mdhn2s',$,'BaseChamfer','Base chamfer of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2974=IFCSIMPLEPROPERTYTEMPLATE('3FZaUA08538AoKItQc$SiZ',$,'KeyDepth','Key depth of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2975=IFCSIMPLEPROPERTYTEMPLATE('2PIMBwQTP2Q8eoGeUWWjhv',$,'KeyHeight','Key height of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2976=IFCSIMPLEPROPERTYTEMPLATE('2wCVK6oST1afh8lA1CcTBI',$,'KeyOffset','Key offset of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#2977=IFCSIMPLEPROPERTYTEMPLATE('0LPnafAU9BchESBixLhhhy',$,'BottomCover','Bottom cover of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2978=IFCSIMPLEPROPERTYTEMPLATE('0Jnq8K1D5EJeg5fSe4lJ2X',$,'CoreSpacing','Core spacing of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2979=IFCSIMPLEPROPERTYTEMPLATE('3VzL_GCen7LBACo9oth7z$',$,'CoreBaseHeight','Core base height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2980=IFCSIMPLEPROPERTYTEMPLATE('3SmyshQp91Px06hppuTGxy',$,'CoreMiddleHeight','Core middle height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2981=IFCSIMPLEPROPERTYTEMPLATE('2MQrBuLDPD5eHxMswAjurm',$,'CoreTopHeight','Core top height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2982=IFCSIMPLEPROPERTYTEMPLATE('2gDFQ9ShLBP98cymhuGL9M',$,'CoreBaseWidth','Core base width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2983=IFCSIMPLEPROPERTYTEMPLATE('284pV1A6jAGgD7Wzk3lzv6',$,'CoreTopWidth','Core top width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2984=IFCSIMPLEPROPERTYTEMPLATE('0y407D3pL4RAVlTNLNI803',$,'CenterCoreSpacing','Center core spacing of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2985=IFCSIMPLEPROPERTYTEMPLATE('3IuUs9Q4z6dPyjCi$f7Rr1',$,'CenterCoreBaseHeight','Center core base height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2986=IFCSIMPLEPROPERTYTEMPLATE('0w2Euz1ynA3ej4CS_vXuzg',$,'CenterCoreMiddleHeight','Center core middle height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2987=IFCSIMPLEPROPERTYTEMPLATE('2ARUWPcuHFCfTpy5W9knGG',$,'CenterCoreTopHeight','Center core top height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2988=IFCSIMPLEPROPERTYTEMPLATE('32LYNh8gP5RP483ycfWbni',$,'CenterCoreBaseWidth','Center core base width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2989=IFCSIMPLEPROPERTYTEMPLATE('1e2SYeua56buz01Knd5shT',$,'CenterCoreTopWidth','Center core top width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2990=IFCSIMPLEPROPERTYTEMPLATE('0P_zNpEfnBS9j8hyVXloJU',$,'NumberOfCores','The number of cores.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#2991=IFCPROPERTYSETTEMPLATE('21q_8nrpr9QRF2S9dJBimS',$,'Pset_ProfileMechanical','This is a collection of mechanical properties that are applicable to virtually all profile classes. Most of these properties are especially used in structural analysis.',.PSET_PROFILEDRIVEN.,'IfcProfileDef',(#2992,#2993,#2994,#2995,#2996,#2997,#2998,#2999,#3000,#3001,#3002,#3003,#3004,#3005,#3006,#3007,#3008,#3009,#3010,#3011,#3012,#3013,#3014,#3015,#3016)); -#2992=IFCSIMPLEPROPERTYTEMPLATE('1qYBmVxuz4uvpqqywIAW_J',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); -#2993=IFCSIMPLEPROPERTYTEMPLATE('0jjTw3VAXDxRe4z7VR8oGi',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#2994=IFCSIMPLEPROPERTYTEMPLATE('3_3OAKIXvFfeooU5NJYVhL',$,'Perimeter','Perimeter of the object.\X2\000A000A\X0\Perimeter of the profile for calculating the surface area. For example measured in mm.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2995=IFCSIMPLEPROPERTYTEMPLATE('1DFTje3zHFAvhT_PRDcwyk',$,'MinimumPlateThickness','This value may be needed for stress analysis and to handle buckling problems. It can also be derived from the given profile geometry or classification and therefore it is only an optional feature allowing for an explicit description. For example measured in mm.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2996=IFCSIMPLEPROPERTYTEMPLATE('3FEiJKh_b6u9jCaALUq8Ur',$,'MaximumPlateThickness','This value may be needed for stress analysis and to handle buckling problems. It can also be derived from the given profile geometry or classification and therefore it is only an optional feature allowing for an explicit description. For example measured in mm.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#2997=IFCSIMPLEPROPERTYTEMPLATE('02EurVPvn7uw$If51AbIXq',$,'CentreOfGravityInX','Location of the profile''s centre of gravity (geometric centroid), measured along xp.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2998=IFCSIMPLEPROPERTYTEMPLATE('0malakSxD08gv_dlMLtyAY',$,'CentreOfGravityInY','Location of the profile''s centre of gravity (geometric centroid), measured along yp.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#2999=IFCSIMPLEPROPERTYTEMPLATE('0RRn6_h2H9LwTasvixPQ3q',$,'ShearCentreZ','Location of the profile''s shear centre, measured along zs.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3000=IFCSIMPLEPROPERTYTEMPLATE('3ox0opMMD9DwVtsPH0U3Ai',$,'ShearCentreY','Location of the profile''s shear centre, measured along ys.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3001=IFCSIMPLEPROPERTYTEMPLATE('22uUe270n77O6XTZY$GrNu',$,'MomentOfInertiaY','Moment of inertia about ys (second moment of area, about ys). For example measured in mm4.',.P_SINGLEVALUE.,'IfcMomentOfInertiaMeasure',$,$,$,$,$,.READWRITE.); -#3002=IFCSIMPLEPROPERTYTEMPLATE('2keuDn7gnBiBR953qd6TT_',$,'MomentOfInertiaZ','Moment of inertia about zs (second moment of area, about zs). For example measured in mm4',.P_SINGLEVALUE.,'IfcMomentOfInertiaMeasure',$,$,$,$,$,.READWRITE.); -#3003=IFCSIMPLEPROPERTYTEMPLATE('3p0VHyUGLBmPusb2B235M_',$,'MomentOfInertiaYZ','Moment of inertia about ys and zs (product moment of area). For example measured in mm4.',.P_SINGLEVALUE.,'IfcMomentOfInertiaMeasure',$,$,$,$,$,.READWRITE.); -#3004=IFCSIMPLEPROPERTYTEMPLATE('0RC0w2qFrFHOy6voa2bpVi',$,'TorsionalConstantX','Torsional constant about xs. For example measured in mm4.',.P_SINGLEVALUE.,'IfcMomentOfInertiaMeasure',$,$,$,$,$,.READWRITE.); -#3005=IFCSIMPLEPROPERTYTEMPLATE('1Qx1xecOv8xRfjNGILKQ2b',$,'WarpingConstant','Warping constant of the profile for torsional action. For example measured in mm6.',.P_SINGLEVALUE.,'IfcWarpingConstantMeasure',$,$,$,$,$,.READWRITE.); -#3006=IFCSIMPLEPROPERTYTEMPLATE('1uCZV2tBr8$h16dWJaedRH',$,'ShearDeformationAreaZ','Area of the profile for calculating the shear deformation due to a shear force parallel to zs. For example measured in mm\X2\00B2\X0\. If given, the shear deformation area zs shall be non-negative.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3007=IFCSIMPLEPROPERTYTEMPLATE('1HgI28hOjEBfLJ5Hp2D8mp',$,'ShearDeformationAreaY','Area of the profile for calculating the shear deformation due to a shear force parallel to ys. For example measured in mm\X2\00B2\X0\. If given, the shear deformation area ys shall be non-negative.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3008=IFCSIMPLEPROPERTYTEMPLATE('03ZDzbdjTCguMEGwS3D0sh',$,'MaximumSectionModulusY','Bending resistance about the ys axis at the point with maximum zs ordinate. For example measured in mm\X2\00B3\X0\.',.P_SINGLEVALUE.,'IfcSectionModulusMeasure',$,$,$,$,$,.READWRITE.); -#3009=IFCSIMPLEPROPERTYTEMPLATE('2TUJSrUJ58ePAaMy66lIKO',$,'MinimumSectionModulusY','Bending resistance about the ys axis at the point with minimum zs ordinate. For example measured in mm\X2\00B3\X0\.',.P_SINGLEVALUE.,'IfcSectionModulusMeasure',$,$,$,$,$,.READWRITE.); -#3010=IFCSIMPLEPROPERTYTEMPLATE('372yF2zi52YuL2xuM3zeWF',$,'MaximumSectionModulusZ','Bending resistance about the zs axis at the point with maximum ys ordinate. For example measured in mm\X2\00B3\X0\.',.P_SINGLEVALUE.,'IfcSectionModulusMeasure',$,$,$,$,$,.READWRITE.); -#3011=IFCSIMPLEPROPERTYTEMPLATE('3tFPqrDDz6cgX9hN1gcbDD',$,'MinimumSectionModulusZ','Bending resistance about the zs axis at the point with minimum ys ordinate. For example measured in mm\X2\00B3\X0\.',.P_SINGLEVALUE.,'IfcSectionModulusMeasure',$,$,$,$,$,.READWRITE.); -#3012=IFCSIMPLEPROPERTYTEMPLATE('00iHVDxhX2cBPbxe8lrF_5',$,'TorsionalSectionModulus','Torsional resistance (about xs). For example measured in mm\X2\00B3\X0\.',.P_SINGLEVALUE.,'IfcSectionModulusMeasure',$,$,$,$,$,.READWRITE.); -#3013=IFCSIMPLEPROPERTYTEMPLATE('3_tYpZNWHE4h_nzMhGSAlq',$,'ShearAreaZ','Area of the profile for calculating the shear stress due to shear force parallel to the section analysis axis zs. For example measured in mm\X2\00B2\X0\. If given, the shear area zs shall be non-negative.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3014=IFCSIMPLEPROPERTYTEMPLATE('2HIigsTRT8$vl5ivTPLGtO',$,'ShearAreaY','Area of the profile for calculating the shear stress due to shear force parallel to the section analysis axis ys. For example measured in mm\X2\00B2\X0\. If given, the shear area ys shall be non-negative.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3015=IFCSIMPLEPROPERTYTEMPLATE('1sGNxaF$D6Dwe8KueJByUK',$,'PlasticShapeFactorY','Ratio of plastic versus elastic bending moment capacity about the section analysis axis ys. A dimensionless value.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3016=IFCSIMPLEPROPERTYTEMPLATE('1KCBoQteXBTPf7heDUCM$k',$,'PlasticShapeFactorZ','Ratio of plastic versus elastic bending moment capacity about the section analysis axis zs. A dimensionless value.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3017=IFCPROPERTYSETTEMPLATE('2Te6itKQ90FBkFBwiTJ29h',$,'Pset_ProjectCommon','Property set for the application of high level project information to all occurrences of IfcProject',.PSET_OCCURRENCEDRIVEN.,'IfcProject',(#3018,#3020,#3021,#3022,#3023,#3024)); -#3018=IFCSIMPLEPROPERTYTEMPLATE('29f8ekrfzBaAFd13wcP1rT',$,'ProjectType','Additional typing of a project',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3019,$,$,$,.READWRITE.); -#3019=IFCPROPERTYENUMERATION('PEnum_ProjectType',(IFCLABEL('MODIFICATION'),IFCLABEL('NEWBUILD'),IFCLABEL('OPERATIONMAINTENANCE'),IFCLABEL('RENOVATION'),IFCLABEL('REPAIR')),$); -#3020=IFCSIMPLEPROPERTYTEMPLATE('3zPf2Q8qvE8wCqu7a_nBiw',$,'ProjectInvestmentEstimate','Estimate of investment cost',.P_REFERENCEVALUE.,'IfcCostValue',$,$,$,$,$,.READWRITE.); -#3021=IFCSIMPLEPROPERTYTEMPLATE('26kyjxq09DohiSYQBb5AMF',$,'FundingSource','Investment funding source',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3022=IFCSIMPLEPROPERTYTEMPLATE('11KN6pyBPCyen0pELloqR5',$,'ROI','Return on Investment',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3023=IFCSIMPLEPROPERTYTEMPLATE('1ASZHJG$HF8fRWPgm09$go',$,'NetEarnedValue','Net earned value',.P_REFERENCEVALUE.,'IfcCostValue',$,$,$,$,$,.READWRITE.); -#3024=IFCSIMPLEPROPERTYTEMPLATE('1u5k6UuUnC_Qx17qGSOKMr',$,'PaybackPeriod','Payback period of investment',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#3025=IFCPROPERTYSETTEMPLATE('2wl5hGyF1E$PwPMLVwoF_R',$,'Pset_ProjectOrderChangeOrder','A change order is an instruction to make a change to a product or work being undertake. Note that the change order status is defined in the same way as a work order status since a change order implies a work requirement.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder/CHANGEORDER',(#3026,#3027)); -#3026=IFCSIMPLEPROPERTYTEMPLATE('29QCWQw9H77Q8HFf_Fi2QE',$,'ReasonForChange','A description of the problem for why a change is needed.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3027=IFCSIMPLEPROPERTYTEMPLATE('1U8m_rNmf52gTx0qCJDAmz',$,'BudgetSource','The budget source requested.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3028=IFCPROPERTYSETTEMPLATE('3WUlkizM18YgKjBBohvikt',$,'Pset_ProjectOrderMaintenanceWorkOrder','A MaintenanceWorkOrder is a detailed description of maintenance work that is to be performed. Note that the Scheduled Frequency property of the maintenance work order is used when the order is required as an instance of a scheduled work order.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder/MAINTENANCEWORKORDER',(#3029,#3030,#3031,#3032,#3033,#3035,#3037,#3039)); -#3029=IFCSIMPLEPROPERTYTEMPLATE('2FSdMt8_nDoQDNQAR7PhyK',$,'ProductDescription','A textual description of the products that require the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3030=IFCSIMPLEPROPERTYTEMPLATE('3IjWfv2lL1le1E0rh$3usS',$,'WorkTypeRequested','Work type requested in circumstances where there are categorizations of types of work task. It could be used to identify a remedial task, minor work task, electrical task etc.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3031=IFCSIMPLEPROPERTYTEMPLATE('0w9c8ylzb5Lg6DYg1cKC28',$,'ContractualType','The contractual type of the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3032=IFCSIMPLEPROPERTYTEMPLATE('1ue1zVWyf35OU5AtRvAgKe',$,'IfNotAccomplished','Comments if the job is not accomplished.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3033=IFCSIMPLEPROPERTYTEMPLATE('0AHecM6OzFlAwYh4QZZits',$,'MaintenanceType','Identifies the predefined types of maintenance that can be done from which the type that generates the maintenance work order may be set where:ConditionBased: generated as a result of the condition of an asset or artefact being less than a determined value.\X2\000A\X0\Corrective: generated as a result of an immediate and urgent need for maintenance action.\X2\000A\X0\PlannedCorrective: generated as a result of immediate corrective action being needed but with sufficient time available for the work order to be included in maintenance planning.\X2\000A\X0\Scheduled: generated as a result of a fixed, periodic maintenance requirement.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3034,$,$,$,.READWRITE.); -#3034=IFCPROPERTYENUMERATION('PEnum_MaintenanceType',(IFCLABEL('CONDITIONBASED'),IFCLABEL('CORRECTIVE'),IFCLABEL('PLANNEDCORRECTIVE'),IFCLABEL('SCHEDULED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3035=IFCSIMPLEPROPERTYTEMPLATE('2rnt3UXtD7ARgkUx8bxlbQ',$,'FaultPriorityType','Identifies the predefined types of priority that can be assigned from which the type may be set where:High: action is required urgently.\X2\000A\X0\Medium: action can occur within a reasonable period of time.\X2\000A\X0\Low: action can occur when convenient.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3036,$,$,$,.READWRITE.); -#3036=IFCPROPERTYENUMERATION('PEnum_PriorityType',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MEDIUM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3037=IFCSIMPLEPROPERTYTEMPLATE('3y0tJBCpn0NAC2ooinsGbX',$,'LocationPriorityType','Identifies the predefined types of priority that can be assigned from which the type may be set where:High: action is required urgently.\X2\000A\X0\Medium: action can occur within a reasonable period of time.\X2\000A\X0\Low: action can occur when convenient.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3038,$,$,$,.READWRITE.); -#3038=IFCPROPERTYENUMERATION('PEnum_PriorityType',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MEDIUM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3039=IFCSIMPLEPROPERTYTEMPLATE('1gGjEXXoD7bwRORqk2IcL9',$,'ScheduledFrequency','The period of time between expected instantiations of a work order that may have been predefined.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3040=IFCPROPERTYSETTEMPLATE('3Azz3nf6PDPul0U2oWYWSQ',$,'Pset_ProjectOrderMoveOrder','Defines the requirements for move orders. Note that the move order status is defined in the same way as a work order status since a move order implies a work requirement.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder/MOVEORDER',(#3041)); -#3041=IFCSIMPLEPROPERTYTEMPLATE('1BJldLpXb67uA13N1pfDl3',$,'SpecialInstructions','Special instructions.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3042=IFCPROPERTYSETTEMPLATE('1FTAYxts90i9Esg9M6Nv0k',$,'Pset_ProjectOrderPurchaseOrder','Defines the requirements for purchase orders in a project.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder/PURCHASEORDER',(#3043,#3044)); -#3043=IFCSIMPLEPROPERTYTEMPLATE('27HRqPmR16eRGp$API0r92',$,'IsFOB','Indication of whether contents of the purchase order are delivered ''Free on Board'' (= True) or not (= False). FOB is a shipping term which indicates that the supplier pays the shipping costs (and usually also the insurance costs) from the point of manufacture to a specified destination, at which point the buyer takes responsibility.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3044=IFCSIMPLEPROPERTYTEMPLATE('23ZYXNUyvEve0$_BdSk812',$,'ShipMethod','Method of shipping that will be used for goods or services.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3045=IFCPROPERTYSETTEMPLATE('0FnjpWWFPA2uWQeTVMeygu',$,'Pset_ProjectOrderWorkOrder','Defines the requirements for purchase orders in a project.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder/WORKORDER',(#3046,#3047,#3048,#3049)); -#3046=IFCSIMPLEPROPERTYTEMPLATE('1WMdjULvv0z8WAq6Ao_vHP',$,'ProductDescription','A textual description of the products that require the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3047=IFCSIMPLEPROPERTYTEMPLATE('1khoDTH$P0LOSYJ8$53FuP',$,'WorkTypeRequested','Work type requested in circumstances where there are categorizations of types of work task. It could be used to identify a remedial task, minor work task, electrical task etc.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3048=IFCSIMPLEPROPERTYTEMPLATE('0_svavPRL4fvyeFdx9JAg_',$,'ContractualType','The contractual type of the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3049=IFCSIMPLEPROPERTYTEMPLATE('1VsfWCz3r14O3J1oNIoAjE',$,'IfNotAccomplished','Comments if the job is not accomplished.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3050=IFCPROPERTYSETTEMPLATE('1$3sIR2IL968BsVMtxXZGQ',$,'Pset_PropertyAgreement','A property agreement is an agreement that enables the occupation of a property for a period of time.The objective is to capture the information within an agreement that is relevant to a facilities manager. Design and construction information associated with the property is not considered. A property agreement may be applied to an instance of IfcSpatialStructureElement including to compositions defined through the IfcSpatialStructureElement.Element.CompositionEnum.Note that the associated actors are captured by the IfcOccupant class.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialStructureElement,IfcSpatialStructureElementType',(#3051,#3053,#3054,#3055,#3056,#3057,#3058,#3059,#3060,#3061,#3062,#3063)); -#3051=IFCSIMPLEPROPERTYTEMPLATE('1lYTlAcVr6bfulBrkI2wxb',$,'AgreementType','Identifies the predefined types of property agreement from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3052,$,$,$,.READWRITE.); -#3052=IFCPROPERTYENUMERATION('PEnum_PropertyAgreementType',(IFCLABEL('ASSIGNMENT'),IFCLABEL('LEASE'),IFCLABEL('TENANT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3053=IFCSIMPLEPROPERTYTEMPLATE('1dIAva7uTCIfEQbNr1tyI5',$,'TrackingIdentifier','The identifier assigned to the agreement for the purposes of tracking.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3054=IFCSIMPLEPROPERTYTEMPLATE('0MeIVg$n95y9C_gcmNRB0R',$,'AgreementVersion','The version number of the agreement that is identified.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3055=IFCSIMPLEPROPERTYTEMPLATE('3na6bz271FJvr61i$TyHlg',$,'AgreementDate','The date on which the version of the agreement became applicable.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#3056=IFCSIMPLEPROPERTYTEMPLATE('1RlgAdSbnA3fnV6i1m7NKQ',$,'PropertyName','Addressing details of the property as stated within the agreement.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3057=IFCSIMPLEPROPERTYTEMPLATE('2m$66QJmH2QAe5$9iq6ju8',$,'CommencementDate','Date on which the agreement commences.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#3058=IFCSIMPLEPROPERTYTEMPLATE('3Ffw0zrUH5N8l7h04YaY4E',$,'TerminationDate','Date on which the agreement terminates.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#3059=IFCSIMPLEPROPERTYTEMPLATE('3SCH4UcHn7PQ8V5Y6aT4ri',$,'Duration','Duration.\X2\000A000A\X0\The period of time for the lease.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#3060=IFCSIMPLEPROPERTYTEMPLATE('2oy4qypob7DPXUIbFX743H',$,'Options','A statement of the options available in the agreement.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3061=IFCSIMPLEPROPERTYTEMPLATE('2NjGkQSrn6yPPMptycj_1x',$,'ConditionCommencement','Condition of property provided on commencement of the agreement e.g. cold shell, warm lit shell, broom clean, turn-key.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3062=IFCSIMPLEPROPERTYTEMPLATE('2XCflBbq566QXsXP1iDylk',$,'Restrictions','Restrictions that may be placed by a competent authority.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3063=IFCSIMPLEPROPERTYTEMPLATE('3tNL8r3lf0g8hLiv0mCHCR',$,'ConditionTermination','Condition of property required on termination of the agreement e.g. cold shell, warm lit shell, broom clean, turn-key.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3064=IFCPROPERTYSETTEMPLATE('3foU1Rlyj4cQUOmZtVSon8',$,'Pset_ProtectiveDeviceBreakerUnitI2TCurve','A coherent set of attributes representing a curve for let-through energy of a protective device. Note - A protective device may be associated with different instances of this pSet providing information related to different basic characteristics',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3065,#3067,#3068)); -#3065=IFCSIMPLEPROPERTYTEMPLATE('0rqe1Kz_j9Gv5UEAptIfHT',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3066,$,$,$,.READWRITE.); -#3066=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3067=IFCSIMPLEPROPERTYTEMPLATE('3JozPgMYb42OOwzdNzty1s',$,'NominalCurrent','The nominal current that is designed to be measured.\X2\000A000A\X0\A set of nominal currents in [A] for which the data of this instance is valid. At least one value shall be provided. Any value in the set shall not exceed the value of the\X2\000A\X0\UltimateRatedCurrent associated with the same breaker unit.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3068=IFCSIMPLEPROPERTYTEMPLATE('1rIo5NpwvDHPt2bevZaqbM',$,'BreakerUnitCurve','A curve that establishes the let through energy of a breaker unit when a particular prospective current is applied. Note that the breaker unit curve is defined within a Cartesian coordinate system and this fact must be asserted within the property set:(1) Defining value: ProspectiveCurrent: A list of minimum 2 and maximum 16 numbers providing the currents in [A] for points in the current/I2t log/log coordinate space. The curve is drawn as a straight line between two consecutive points.\X2\000A\X0\(2) Defined value: LetThroughEnergy: A list of minimum 2 and maximum 16 numbers providing the let-through energy, I2t, in [A2s] for points in the current/I2t log/log coordinate space. The curve is drawn as a straight line between two consecutive points.',.P_TABLEVALUE.,'IfcElectricCurrentMeasure','IfcReal',$,$,$,$,.READWRITE.); -#3069=IFCPROPERTYSETTEMPLATE('3PNms2QJj22vF9Hq_HxkAq',$,'Pset_ProtectiveDeviceBreakerUnitI2TFuseCurve','A coherent set of attributes representing curves for melting- and breaking-energy of a fuse. Note - A fuse may be associated with different instances of this property set providing information related to different basic characteristics.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3070,#3072,#3073)); -#3070=IFCSIMPLEPROPERTYTEMPLATE('1GS9dZ_3b8JhCiwrBh9SlF',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3071,$,$,$,.READWRITE.); -#3071=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3072=IFCSIMPLEPROPERTYTEMPLATE('3ohpTRLvDBHAe_loZEw5oA',$,'BreakerUnitFuseMeltingCurve','A curve that establishes the energy required to melt the fuse of a breaker unit when a particular prospective melting current is applied. Note that the breaker unit fuse melting curve is defined within a Cartesian coordinate system and this fact must be:(1) Defining value: ProspectiveCurrentMelting :A list of minimum 2 and maximum 8 numbers providing the currents in [A] for points in the\X2\000A\X0\current/melting_energy log/log coordinate space. The curve is drawn as a straight line between two consecutive points.\X2\000A\X0\(2) Defined value: MeltingEnergy: A list of minimum 2 and maximum 8 numbers providing the energy whereby the fuse is starting to melt, I2t, in [A2s] for points in the current/melting_energy log/log coordinate space. The curve is drawn as a straight line between two consecutive points.',.P_TABLEVALUE.,'IfcElectricCurrentMeasure','IfcReal',$,$,$,$,.READWRITE.); -#3073=IFCSIMPLEPROPERTYTEMPLATE('3veQa2kkX6WfZj6d2mbJD2',$,'BreakerUnitFuseBreakingingCurve','A curve that establishes the let through breaking energy of a breaker unit when a particular prospective breaking current is applied. Note that the breaker unit fuse breaking curve is defined within a Cartesian coordinate system and this fact must be:(1) Defining value: ProspectiveCurrentBreaking: A list of minimum 2 and maximum 8 numbers providing the currents in [A] for points in the\X2\000A\X0\current/breaking energy log/log coordinate space. The curve is drawn as a straight line between two consecutive points.\X2\000A\X0\(2) Defined value: LetThroughBreakingEnergy: A list of minimum 2 and maximum 8 numbers providing the breaking energy whereby the fuse has provided a break, I2t, in [A2s] for points in the current/breakting_energy log/log coordinate space. The curve is drawn as a straight line between two consecutive.',.P_TABLEVALUE.,'IfcElectricCurrentMeasure','IfcReal',$,$,$,$,.READWRITE.); -#3074=IFCPROPERTYSETTEMPLATE('0558On3BH8ZgvcuKUzdWp9',$,'Pset_ProtectiveDeviceBreakerUnitIPICurve','A coherent set of attributes representing curves for let-through currents of a protective device. Note - A protective device may be associated with different instances of this pSet providing information related to different basic characteristics.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3075,#3077,#3078)); -#3075=IFCSIMPLEPROPERTYTEMPLATE('2PqBbyPRL5UgbJ76oBPfFm',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3076,$,$,$,.READWRITE.); -#3076=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3077=IFCSIMPLEPROPERTYTEMPLATE('0M7BGiHIL21ut25KtgHQ_C',$,'NominalCurrent','The nominal current that is designed to be measured.\X2\000A000A\X0\A set of nominal currents in [A] for which the data of this instance is valid. At least one value shall be provided. Any value in the set shall not exceed the value of the\X2\000A\X0\UltimateRatedCurrent associated with the same breaker unit.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3078=IFCSIMPLEPROPERTYTEMPLATE('1O0SiJRzHDCeidQRgq9qmK',$,'BreakerUnitIPICurve','A curve that establishes the let through peak current of a breaker unit when a particular prospective current is applied. Note that the breaker unit IPI curve is defined within a Cartesian coordinate system and this fact must be asserted within the property set:(1) Defining value: A list of minimum 2 and maximum 16 numbers providing the currents in [A] for points in the I/\X2\00CE\X0\ log/log coordinate space. The curve is drawn as a straight line between two consecutive points.\X2\000A\X0\(2) Defined value: A list of minimum 2 and maximum 16 numbers providing the let-through peak currents, \X2\00CE\X0\, in [A] for points in the I/\X2\00CE\X0\ log/log coordinate space. The curve is drawn as a straight line between two consecutive points.',.P_TABLEVALUE.,'IfcElectricCurrentMeasure','IfcElectricCurrentMeasure',$,$,$,$,.READWRITE.); -#3079=IFCPROPERTYSETTEMPLATE('3vDXt7KpX1yQ2hmkNjB49P',$,'Pset_ProtectiveDeviceBreakerUnitTypeMCB','A coherent set of attributes representing the breaking capacities of an MCB. Note - A protective device may be associated with different instances of this property set providing information related to different basic characteristics.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/CIRCUITBREAKER,IfcProtectiveDeviceType/CIRCUITBREAKER',(#3080,#3081,#3083,#3084,#3085,#3086,#3087)); -#3080=IFCSIMPLEPROPERTYTEMPLATE('25HhxbvmL8leQUe9Kvi4N2',$,'PowerLoss','The power loss in [W].\X2\000A000A\X0\The power loss in [W] per pole of the MCB when the nominal current is flowing through the MCB.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#3081=IFCSIMPLEPROPERTYTEMPLATE('02T_ftVyHEAujuNt5pEzLe',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3082,$,$,$,.READWRITE.); -#3082=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3083=IFCSIMPLEPROPERTYTEMPLATE('357hUIbTH4tRtmEHXlbBmr',$,'NominalCurrents','A set of values providing information on available modules (chips) for setting the nominal current of the protective device.\X2\000A000A\X0\A set of nominal currents in [A] for which the data of this instance is valid. At least one value shall be provided. Any value in the set shall not exceed the value of the\X2\000A\X0\UltimateRatedCurrent associated with the same breaker unit.',.P_LISTVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3084=IFCSIMPLEPROPERTYTEMPLATE('2hBsr4Kbn7ixSSIdFA3h5t',$,'ICU60947','The ultimate breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3085=IFCSIMPLEPROPERTYTEMPLATE('334EaskC19d8_rcFhMRoUr',$,'ICS60947','The service breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3086=IFCSIMPLEPROPERTYTEMPLATE('2XeXgnXQ90XPq6JIGoEVBD',$,'ICN60898','The nominal breaking capacity in [A] for an MCB tested in accordance with the IEC 60898 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3087=IFCSIMPLEPROPERTYTEMPLATE('3MlnQq4APDbPN$Fb1T306I',$,'ICS60898','The service breaking capacity in [A] for an MCB tested in accordance with the IEC 60898 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3088=IFCPROPERTYSETTEMPLATE('1q$T7qI7X8thR9jY8ODblZ',$,'Pset_ProtectiveDeviceBreakerUnitTypeMotorProtection','A coherent set of attributes representing different capacities of a a motor protection device, defined in accordance with IEC 60947. Note - A protective device may be associated with different instances of this Pset.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3089,#3090,#3092,#3093,#3094,#3095)); -#3089=IFCSIMPLEPROPERTYTEMPLATE('1n$VmyPgT6481o3$wDlX1h',$,'PerformanceClasses','A set of designations of performance classes for the breaker unit for which the data of this instance is valid.\X2\000A000A\X0\A set of designations of performance classes for the breaker unit for which the data of this instance is valid. A breaker unit being a motor protection device may be\X2\000A\X0\constructed for different levels of breaking capacities. A maximum of 7 different\X2\000A\X0\performance classes may be provided. Examples of performance classes that may be specified include B, C, N, S, H, L, V.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3090=IFCSIMPLEPROPERTYTEMPLATE('3bgTLfKS96jR8fCLqyak5d',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3091,$,$,$,.READWRITE.); -#3091=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3092=IFCSIMPLEPROPERTYTEMPLATE('0mreCxRmzBuA9zhzwQQSwk',$,'ICU60947','The ultimate breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3093=IFCSIMPLEPROPERTYTEMPLATE('1MkGcGdRH5nPHxkwWIaw4s',$,'ICS60947','The service breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3094=IFCSIMPLEPROPERTYTEMPLATE('2kbtgn2wH1Nvb92zj0Nsut',$,'ICW60947','The thermal withstand current in [A] for a circuit breaker or motor protection device tested in accordance with the IEC 60947 series. The value shall be related to 1 s.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3095=IFCSIMPLEPROPERTYTEMPLATE('0olDsRgEfDnfrKcj7l4WgM',$,'ICM60947','The making capacity in [A] for a circuit breaker or motor protection device tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3096=IFCPROPERTYSETTEMPLATE('1oIEDHFB120OnjGrqlpMRP',$,'Pset_ProtectiveDeviceOccurrence','Properties that are applied to an occurrence of a protective device.',.PSET_OCCURRENCEDRIVEN.,'IfcProtectiveDevice',(#3097,#3099,#3100,#3101,#3102,#3103,#3104,#3105,#3106,#3107,#3108,#3109,#3110,#3111)); -#3097=IFCSIMPLEPROPERTYTEMPLATE('1uPs5MogzFNPmBascYzGx9',$,'PoleUsage','Pole usage.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3098,$,$,$,.READWRITE.); -#3098=IFCPROPERTYENUMERATION('PEnum_PoleUsage',(IFCLABEL('1P'),IFCLABEL('1PN'),IFCLABEL('2P'),IFCLABEL('3P'),IFCLABEL('3PN'),IFCLABEL('4P'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3099=IFCSIMPLEPROPERTYTEMPLATE('2AJ_5fGXf97vvhFOFsK$EE',$,'LongTimeFunction','Applying long time function\X2\000A\X0\A flag indicating that the long time function (i.e. the thermal tripping) of the device is used. The value should be set to TRUE for all devices except those that allows the Long time function of the device not to be used.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3100=IFCSIMPLEPROPERTYTEMPLATE('0S0JFfWe1DWh1mfhj191vq',$,'ShortTimeFunction','Applying short time function A flag indicating that the short time function of the device is used. The value should be set to FALSE for devices not having a short time function, or if the short time function is not selected to be used.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3101=IFCSIMPLEPROPERTYTEMPLATE('0VrezfxN56FxNEhg3cdiQn',$,'ShortTimei2tFunction','Applying short time i2t function. A flag indicating that the I2t short time function of the device is used. The value should be set to TRUE only if the I2t function \X2\00A0\X0\is explicitly selected for the device.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3102=IFCSIMPLEPROPERTYTEMPLATE('0BHYIxWO9FCfeeZYC5E6Vb',$,'GroundFaultFunction','Applying ground fault function. A flag indicating that the ground fault function of the device is used. The value should be set to FALSE for devices not having a ground fault function, or if the ground fault function is not selected to be used.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3103=IFCSIMPLEPROPERTYTEMPLATE('1r_ZGe2QHDff0IW$toCYhF',$,'GroundFaulti2tFunction','Applying ground fault i2t function. A flag indicating that the I2t ground fault function of the device is used. The value should be set to TRUE only if the I2t function is explicitly selected for the device.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3104=IFCSIMPLEPROPERTYTEMPLATE('0dprqSbR19dRxLJTo38_ng',$,'LongTimeCurrentSetValue','Long time current set value. The set value of the long time tripping current if adjustable.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3105=IFCSIMPLEPROPERTYTEMPLATE('1V7gh2obn1xhlYl75Dc178',$,'ShortTimeCurrentSetValue','Short time current set value. The set value of the long time tripping current if adjustable.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3106=IFCSIMPLEPROPERTYTEMPLATE('2sQRI3XGHDQe8iH9GJBpvV',$,'InstantaneousCurrentSetValue','Instantaneous current set value. The set value of the instantaneous tripping current if adjustable.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3107=IFCSIMPLEPROPERTYTEMPLATE('0yA9mYm8D1xu4Jau7dPTIR',$,'GroundFaultCurrentSetValue','Ground fault current set value. The set value of the ground tripping current if adjustable.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3108=IFCSIMPLEPROPERTYTEMPLATE('0UoEYNBBPFGuqyaLKmQxS6',$,'LongTimeDelay','Long time delay. The set value of the long time time-delay if adjustable.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3109=IFCSIMPLEPROPERTYTEMPLATE('13p7iDDLfELBWp1BjH7gSY',$,'ShortTimeTrippingTime','Short time tripping time. The set value of the short time tripping time if adjustable.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3110=IFCSIMPLEPROPERTYTEMPLATE('2D67WTGo90rRWwoU0JTtUo',$,'InstantaneousTrippingTime','Instantaneous tripping time. The set value of the instantaneous tripping time if adjustable.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3111=IFCSIMPLEPROPERTYTEMPLATE('0aXjb0w$51Fxu8WM9SGF3o',$,'GroundFaultTrippingTime','Ground fault tripping time. The set value of the ground fault tripping current if adjustable.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3112=IFCPROPERTYSETTEMPLATE('0roSrFDab5uxjwQ7Cvxs$l',$,'Pset_ProtectiveDeviceTrippingCurve','Tripping curves are applied to thermal, thermal magnetic or MCB_RCD tripping units (i.e. tripping units having type property sets for thermal, thermal magnetic or MCB_RCD tripping defined). They are not applied to electronic tripping units.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3113,#3115)); -#3113=IFCSIMPLEPROPERTYTEMPLATE('1$CqZb_$z9Cusq55AGbn3u',$,'TrippingCurveType','The type of tripping curve that is represented by the property set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3114,$,$,$,.READWRITE.); -#3114=IFCPROPERTYENUMERATION('PEnum_TrippingCurveType',(IFCLABEL('LOWER'),IFCLABEL('UPPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3115=IFCSIMPLEPROPERTYTEMPLATE('3GPYOWQrH1AvIa65TycUic',$,'TrippingCurve','A curve that establishes the release time of a tripping unit when a particular prospective current is applied. Note that the tripping curve is defined within a Cartesian coordinate system and this fact must be asserted within the property set:(1) Defining value is the Prospective Current which is a list of minimum 2 and maximum 16 numbers providing the currents in [x In] for points in the current/time log/log coordinate space. The curve is drawn as a straight line between two consecutive points.\X2\000A\X0\(2) Defined value is a list of minimum 2 and maximum 16 numbers providing the release_time in [s] for points in the current/time log/log coordinate space. The curve is drawn as a straight line between two consecutive points. Note that a defined interpolation.',.P_TABLEVALUE.,'IfcElectricCurrentMeasure','IfcTimeMeasure',$,$,$,$,.READWRITE.); -#3116=IFCPROPERTYSETTEMPLATE('1jhN8mU6X1rxozTyjEOPnN',$,'Pset_ProtectiveDeviceTrippingFunctionGCurve','Tripping functions are applied to electronic tripping units (i.e. tripping units having type property sets for electronic tripping defined). They are not applied to thermal, thermal magnetic or RCD tripping units.\X2\000A\X0\This property set represent the ground fault protection (G-curve) of an electronic protection device',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3117,#3118,#3119,#3120,#3121,#3122,#3123,#3124,#3125,#3126,#3127,#3128,#3129,#3130,#3131,#3132,#3133)); -#3117=IFCSIMPLEPROPERTYTEMPLATE('2ALizJxXP92QywAphWszen',$,'IsSelectable','Indication whether something can be switched off or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3118=IFCSIMPLEPROPERTYTEMPLATE('1y_a2ysWb1JOUBjMk5Ipa5',$,'NominalCurrentAdjusted','An indication if the tripping currents of the short time protection is related to the nominal current multiplied with the actual setting of the current adjustment, if any, of the long time protection part of the protective device, or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3119=IFCSIMPLEPROPERTYTEMPLATE('2pP3jCHjj8PhHxzguSRK6h',$,'ExternalAdjusted','An indication if the ground fault protection may be adjusted according to an external current coil or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3120=IFCSIMPLEPROPERTYTEMPLATE('3EfwQdtHj9yBSfATsiv2ta',$,'ReleaseCurrent','The release current in [x In] for the initial tripping of the S-function.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3121=IFCSIMPLEPROPERTYTEMPLATE('3QvS8gFTDAQvG0MVAOaMaW',$,'ReleaseTime','The release time in [s] for the initial tripping of the relevant part. This time indicates that for current lower than the indicated release current, the tripping time will be longer than the indicated release time. The value is given as a mean value.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3122=IFCSIMPLEPROPERTYTEMPLATE('1MpgNGaUj5EvCjXkQ1x2X7',$,'CurrentTolerance1','The tolerance for the current of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3123=IFCSIMPLEPROPERTYTEMPLATE('1noSVSlK97xfvajKCFc7cj',$,'CurrentToleranceLimit1','The time limit in [s] limiting the application of CurrentTolerance1, if any. If the value is set to 0, the value of the CurrentTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3124=IFCSIMPLEPROPERTYTEMPLATE('3FHv9jtQD5wgu8KakCqj3T',$,'CurrentTolerance2','The tolerance for the current of time/current-curve in [%] valid for times above CurrentTolereanceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3125=IFCSIMPLEPROPERTYTEMPLATE('1yc762Zj101wm$LPldW7Gl',$,'IsCurrentTolerancePositiveOnly','Indication whether the value of CurrentTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3126=IFCSIMPLEPROPERTYTEMPLATE('3Qaz4sHFDCUeab3w_NTQLi',$,'TimeTolerance1','The tolerance for the time of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3127=IFCSIMPLEPROPERTYTEMPLATE('0M8kD5r_v2BQOo_ZKisNYo',$,'TimeToleranceLimit1','The current limit in [x In] limiting the application of TimeTolerance1, if any. If the value is set to 0, the value of the TimeTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3128=IFCSIMPLEPROPERTYTEMPLATE('1lWJr68Er8vAwKiyS0uRyk',$,'TimeTolerance2','The tolerance for the time of the time/current-curve in [%] valid for currents above TimeToleranceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3129=IFCSIMPLEPROPERTYTEMPLATE('3HTL7LNRnFSRAekrfC6j13',$,'IsTimeTolerancePositiveOnly','Indication whether the value of TimeTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3130=IFCSIMPLEPROPERTYTEMPLATE('0YSl9aHpf9eQ8IsptKTcbU',$,'ReleaseCurrentI2tStart','The release current in [x In].\X2\000A000A\X0\For the start point of the I2t tripping curve of the G-function, if any.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3131=IFCSIMPLEPROPERTYTEMPLATE('1A0kBo8Pb7of3FAd_FEKT8',$,'ReleaseTimeI2tStart','The release time in [s].\X2\000A000A\X0\For the start point of the I2t tripping curve of the G-function, if any.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3132=IFCSIMPLEPROPERTYTEMPLATE('2o9Nz6z7LF9AcZrSbbWcj3',$,'ReleaseCurrentI2tEnd','The release current in [x In].\X2\000A000A\X0\For the end point of the I2t tripping curve of the G-function, if any. The value of ReleaseCurrentI2tEnd shall be larger than ReleaseCurrentI2tStart.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3133=IFCSIMPLEPROPERTYTEMPLATE('1D1Zxv6b1DpOa1c9HDIIxE',$,'ReleaseTimeI2tEnd','The release time in [s].\X2\000A000A\X0\For the end point of the I2 tripping curve of the G-function, if any. The value of ReleaseTimeI2tEnd shall be lower than ReleaseTimeI2tStart.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3134=IFCPROPERTYSETTEMPLATE('151Neo5on4dB2x9Kqic0BE',$,'Pset_ProtectiveDeviceTrippingFunctionICurve','Tripping functions are applied to electronic tripping units (i.e. tripping units having type property sets for electronic tripping defined). They are not applied to thermal, thermal magnetic or RCD tripping units.\X2\000A\X0\This property set represent the instantaneous time protection (I-curve) of an electronic protection device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3135,#3136,#3137,#3138,#3139,#3140,#3141,#3142,#3143,#3144,#3145,#3146,#3147,#3148)); -#3135=IFCSIMPLEPROPERTYTEMPLATE('3ZbiU24CDCJhfXhZ61A8FU',$,'IsSelectable','Indication whether something can be switched off or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3136=IFCSIMPLEPROPERTYTEMPLATE('3tGCdyvbjCFQbE913aGLEC',$,'NominalCurrentAdjusted','An indication if the tripping currents of the short time protection is related to the nominal current multiplied with the actual setting of the current adjustment, if any, of the long time protection part of the protective device, or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3137=IFCSIMPLEPROPERTYTEMPLATE('3CRp2gkOD92fL823qUma3d',$,'ReleaseCurrent','The release current in [x In] for the initial tripping of the S-function.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3138=IFCSIMPLEPROPERTYTEMPLATE('1QArrPO3rC6BEK9_AJc0eh',$,'ReleaseTime','The release time in [s] for the initial tripping of the relevant part. This time indicates that for current lower than the indicated release current, the tripping time will be longer than the indicated release time. The value is given as a mean value.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3139=IFCSIMPLEPROPERTYTEMPLATE('16EF8KStLD88r2uJxR2QR4',$,'CurrentTolerance1','The tolerance for the current of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3140=IFCSIMPLEPROPERTYTEMPLATE('1PzhXwOof61f4R8xtE2jLm',$,'CurrentToleranceLimit1','The time limit in [s] limiting the application of CurrentTolerance1, if any. If the value is set to 0, the value of the CurrentTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3141=IFCSIMPLEPROPERTYTEMPLATE('07JdMJug16lPu1sj_fGiIL',$,'CurrentTolerance2','The tolerance for the current of time/current-curve in [%] valid for times above CurrentTolereanceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3142=IFCSIMPLEPROPERTYTEMPLATE('3uMF7XLNLEsAoH_vJEyPzI',$,'IsCurrentTolerancePositiveOnly','Indication whether the value of CurrentTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3143=IFCSIMPLEPROPERTYTEMPLATE('2B91LAJRP6UO_vdXYFyrPv',$,'TimeTolerance1','The tolerance for the time of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3144=IFCSIMPLEPROPERTYTEMPLATE('3aaVnzW5b91RgsZ0OlFSoe',$,'TimeToleranceLimit1','The current limit in [x In] limiting the application of TimeTolerance1, if any. If the value is set to 0, the value of the TimeTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3145=IFCSIMPLEPROPERTYTEMPLATE('19WVZb7rf2wfoc0JbgHzPa',$,'TimeTolerance2','The tolerance for the time of the time/current-curve in [%] valid for currents above TimeToleranceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3146=IFCSIMPLEPROPERTYTEMPLATE('27wQgrj4f0YuYJ4TnURIDi',$,'IsTimeTolerancePositiveOnly','Indication whether the value of TimeTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3147=IFCSIMPLEPROPERTYTEMPLATE('2AwDctD3rEC81eyoIAJK5V',$,'MaxAdjustmentX_ICS','Provides the maximum setting value for the available current adjustment in relation to the Ics breaking capacity of the protection device of which the actual tripping unit is a part of. The value is not asserted unless the instantaneous time protection is.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3148=IFCSIMPLEPROPERTYTEMPLATE('2_WWmVG_nAb8JJR9_J22om',$,'IsOffWhenSFunctionOn','Indication whether the I-function is automatically switched off when the S-function is switched on.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3149=IFCPROPERTYSETTEMPLATE('3gcSC38yr0Bf7xRfUmWHO3',$,'Pset_ProtectiveDeviceTrippingFunctionLCurve','Tripping functions are applied to electronic tripping units (i.e. tripping units having type property sets for electronic tripping defined). They are not applied to thermal, thermal magnetic or RCD tripping units.\X2\000A\X0\This property set represent the long time protection (L-curve) of an electronic protection device',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3150,#3151,#3152,#3153,#3154,#3155,#3156,#3157,#3158)); -#3150=IFCSIMPLEPROPERTYTEMPLATE('3xzmWl95vAQBXT6Wnw1w50',$,'IsSelectable','Indication whether something can be switched off or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3151=IFCSIMPLEPROPERTYTEMPLATE('200JjNEpf9VP3S1AJe7D$g',$,'UpperCurrent1','The current in [x In], indicating that for currents larger than UpperCurrent1 the I2t part of the L-function will trip the current.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3152=IFCSIMPLEPROPERTYTEMPLATE('0ouIIaT_n4vR_J$XqwpqOO',$,'UpperCurrent2','The current in [x In], indicating the upper current limit of the upper time/current curve of the I2t part of the L-function.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3153=IFCSIMPLEPROPERTYTEMPLATE('1Olnncg392meclph53fUel',$,'UpperTime1','The time in [s], indicating that tripping times of the upper time/current curve lower than UpperTime1 is determined by the I2t part of the L-function.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3154=IFCSIMPLEPROPERTYTEMPLATE('36h0_XShTCC9ju7PFdizjW',$,'UpperTime2','The time in [s], indicating the tripping times of the upper time/current curve at the UpperCurrent2.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3155=IFCSIMPLEPROPERTYTEMPLATE('03zXSDgEP4zOmagd5Jzl71',$,'LowerCurrent1','The current in [x In], indicating that for currents smaller than LowerCurrent1 the I2t part of the L-function will not trip the current,',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3156=IFCSIMPLEPROPERTYTEMPLATE('13lYjNO5r7BBTFLz780p3I',$,'LowerCurrent2','The current in [x In], indicating the upper current limit of the lower time/current curve of the I2t part of the L-function.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3157=IFCSIMPLEPROPERTYTEMPLATE('3226X6vdD3KOqxvd2vbh15',$,'LowerTime1','The time in [s], indicating that tripping times of the lower time/current curve lower than LowerTime1 is determined by the I2t part of the L-function.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3158=IFCSIMPLEPROPERTYTEMPLATE('1iqtSj4bvBPgDTvL6AnpFQ',$,'LowerTime2','The time in [s], indicating the tripping times of the upper time/current curve at the LowerCurrent2.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3159=IFCPROPERTYSETTEMPLATE('2uRpqtQDD6fQujTtM7ZUUn',$,'Pset_ProtectiveDeviceTrippingFunctionSCurve','Tripping functions are applied to electronic tripping units (i.e. tripping units having type property sets for electronic tripping defined). They are not applied to thermal, thermal magnetic or RCD tripping units.\X2\000A\X0\This property set represent the short time protection (S-curve) of an electronic protection device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3160,#3161,#3162,#3163,#3164,#3165,#3166,#3167,#3168,#3169,#3170,#3171,#3172,#3173,#3174,#3175,#3176)); -#3160=IFCSIMPLEPROPERTYTEMPLATE('2NSf1EJEj8uPMTG_jxRyaY',$,'IsSelectable','Indication whether something can be switched off or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3161=IFCSIMPLEPROPERTYTEMPLATE('1MZ$CeSiz3fQBpc7kjUdtA',$,'NominalCurrentAdjusted','An indication if the tripping currents of the short time protection is related to the nominal current multiplied with the actual setting of the current adjustment, if any, of the long time protection part of the protective device, or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3162=IFCSIMPLEPROPERTYTEMPLATE('01Lik7Jh16AvEqBk5ROaKG',$,'ReleaseCurrent','The release current in [x In] for the initial tripping of the S-function.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3163=IFCSIMPLEPROPERTYTEMPLATE('23c6fXk9rDqezy_6p3P6F8',$,'ReleaseTime','The release time in [s] for the initial tripping of the relevant part. This time indicates that for current lower than the indicated release current, the tripping time will be longer than the indicated release time. The value is given as a mean value.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3164=IFCSIMPLEPROPERTYTEMPLATE('1IE8k4ecDFPP7sixCFgmpz',$,'CurrentTolerance1','The tolerance for the current of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3165=IFCSIMPLEPROPERTYTEMPLATE('2Vkmj9SSD3BvBWgr61o3_e',$,'CurrentToleranceLimit1','The time limit in [s] limiting the application of CurrentTolerance1, if any. If the value is set to 0, the value of the CurrentTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3166=IFCSIMPLEPROPERTYTEMPLATE('1yVz7sHkD0ThO11W6J9mHt',$,'CurrentTolerance2','The tolerance for the current of time/current-curve in [%] valid for times above CurrentTolereanceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3167=IFCSIMPLEPROPERTYTEMPLATE('07tkNF1lz3$R43tF46nH4u',$,'IsCurrentTolerancePositiveOnly','Indication whether the value of CurrentTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3168=IFCSIMPLEPROPERTYTEMPLATE('3Uep4u1kzAM8hAi9fqahXO',$,'TimeTolerance1','The tolerance for the time of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3169=IFCSIMPLEPROPERTYTEMPLATE('2LTRE_36f4uwvW04hDtXSX',$,'TimeToleranceLimit1','The current limit in [x In] limiting the application of TimeTolerance1, if any. If the value is set to 0, the value of the TimeTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3170=IFCSIMPLEPROPERTYTEMPLATE('3MUGKfPU5Dsh3q9gFT3jUb',$,'TimeTolerance2','The tolerance for the time of the time/current-curve in [%] valid for currents above TimeToleranceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3171=IFCSIMPLEPROPERTYTEMPLATE('1FU0Of$$X3E8TQNkkL5FAA',$,'IsTimeTolerancePositiveOnly','Indication whether the value of TimeTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3172=IFCSIMPLEPROPERTYTEMPLATE('3hhLMxHVXDxxCVa6Sjr3av',$,'ReleaseCurrentI2tStart','The release current in [x In].\X2\000A000A\X0\For the start point of the I2t tripping curve of the S-function, if any.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3173=IFCSIMPLEPROPERTYTEMPLATE('0fgyc$9JX9cxUFJejLWHjn',$,'ReleaseTimeI2tStart','The release time in [s].\X2\000A000A\X0\For the start point of the I2t tripping curve of the S-function, if any',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3174=IFCSIMPLEPROPERTYTEMPLATE('22XMLJi359rQlyZR$MConB',$,'ReleaseCurrentI2tEnd','The release current in [x In].\X2\000A000A\X0\For the end point of the I2t tripping curve of the S-function, if any. The value of ReleaseCurrentI2tEnd shall be larger than ReleaseCurrentI2tStart.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3175=IFCSIMPLEPROPERTYTEMPLATE('3ZuvHQ5m9DZA8XFTAgxCNP',$,'ReleaseTimeI2tEnd','The release time in [s].\X2\000A000A\X0\For the end point of the I2 tripping curve of the S-function, if any. The value of ReleaseTimeI2tEnd shall be lower than ReleaseTimeI2tStart.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3176=IFCSIMPLEPROPERTYTEMPLATE('3ueq3LXAjAVPRAN3pDWX1x',$,'IsOffWhenLfunctionOn','Indication whether the S-function is automatically switched off when the I-function is switched on.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3177=IFCPROPERTYSETTEMPLATE('1h59n$2EH4KhVwewxeNYiE',$,'Pset_ProtectiveDeviceTrippingUnitCurrentAdjustment','A set of current adjustment values that may be applied to an electronic or thermal tripping unit type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3178,#3180,#3181,#3182,#3183)); -#3178=IFCSIMPLEPROPERTYTEMPLATE('2xekW7zoD5bgXqH4$MZoa6',$,'AdjustmentValueType','The type of adjustment value that is applied through the property set. This determines the properties that should be asserted (see below).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3179,$,$,$,.READWRITE.); -#3179=IFCPROPERTYENUMERATION('PEnum_AdjustmentValueType',(IFCLABEL('LIST'),IFCLABEL('RANGE')),$); -#3180=IFCSIMPLEPROPERTYTEMPLATE('3WOKp624r088Gwv_hZWE3p',$,'CurrentAdjustmentRange','Upper and lower current adjustment limits for an AdjustmentValueType = RANGE. Note that this property should not have a value for an AdjustmentValueType = LIST.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3181=IFCSIMPLEPROPERTYTEMPLATE('0NH6H9fVf0A9HsJpnITGWe',$,'CurrentAdjustmentRangeStepValue','Step value of current adjustment for an AdjustmentValueType = RANGE. Note that this property should not have a value for an AdjustmentValueType = LIST.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3182=IFCSIMPLEPROPERTYTEMPLATE('1rRGDJ9M1DXgVweSa_OE8J',$,'CurrentAdjustmentValues','A list of current adjustment values that may be applied to a tripping unit for an AdjustmentValueType = LIST. A minimum of 1 and a maximum of 16 adjustment values may be specified. Note that this property should not have a value for an AdjustmentValueType = RANGE.',.P_LISTVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3183=IFCSIMPLEPROPERTYTEMPLATE('3VPI6WGuv1_9NMkPPq9ao8',$,'AdjustmentDesignation','The desgnation on the device for the adjustment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3184=IFCPROPERTYSETTEMPLATE('0FubKx7cr2R9DdaQz1qZTg',$,'Pset_ProtectiveDeviceTrippingUnitTimeAdjustment','A set of time adjustment values that may be applied to an electronic or thermal tripping unit type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3185,#3187,#3188,#3189,#3190,#3191,#3192)); -#3185=IFCSIMPLEPROPERTYTEMPLATE('31CqSf6En59vs2SWvInk9m',$,'AdjustmentValueType','The type of adjustment value that is applied through the property set. This determines the properties that should be asserted (see below).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3186,$,$,$,.READWRITE.); -#3186=IFCPROPERTYENUMERATION('PEnum_AdjustmentValueType',(IFCLABEL('LIST'),IFCLABEL('RANGE')),$); -#3187=IFCSIMPLEPROPERTYTEMPLATE('033AhwH5H41xEh3R5j9QIr',$,'TimeAdjustmentRange','Upper and lower time adjustment limits for an AdjustmentValueType = RANGE. Note that this property should not have a value for an AdjustmentValueType = LIST.',.P_BOUNDEDVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3188=IFCSIMPLEPROPERTYTEMPLATE('3yF0PtoIHAkQF5c4xIKm2P',$,'TimeAdjustmentRangeStepValue','Step value of time adjustment for an AdjustmentValueType = RANGE. Note that this property should not have a value for an AdjustmentValueType = LIST.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3189=IFCSIMPLEPROPERTYTEMPLATE('3mu$XM4XD1QOmhweG6EoEU',$,'TimeAdjustmentValues','A list of time adjustment values that may be applied to a tripping unit for an AdjustmentValueType = LIST. A minimum of 1 and a maximum of 16 adjustment values may be specified. Note that this property should not have a value for an AdjustmentValueType = RANGE.',.P_LISTVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3190=IFCSIMPLEPROPERTYTEMPLATE('0HuOkK4fH5EusMahNcncwf',$,'AdjustmentDesignation','The desgnation on the device for the adjustment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3191=IFCSIMPLEPROPERTYTEMPLATE('2CNUXKWSf6AhZMRF7CjfWt',$,'CurrentForTimeDelay','The tripping current in [x In] at which the time delay is specified. A value for this property should only be asserted for time delay of L-function, and for I2t of the S and G function.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3192=IFCSIMPLEPROPERTYTEMPLATE('2I6X_nOwn7IuSKpHlQHqNJ',$,'I2TApplicability','The applicability of the time adjustment related to the tripping function.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3193,$,$,$,.READWRITE.); -#3193=IFCPROPERTYENUMERATION('PEnum_AdjustmentValueType',(IFCLABEL('LIST'),IFCLABEL('RANGE')),$); -#3194=IFCPROPERTYSETTEMPLATE('0LrpxG3h10a9OxY1w1MLjt',$,'Pset_ProtectiveDeviceTrippingUnitTypeCommon','Common information concerning tripping units that area associated with protective devices',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3195,#3196,#3198,#3199,#3200,#3201,#3202)); -#3195=IFCSIMPLEPROPERTYTEMPLATE('0Coc9CHWnEpPVk8QgZg1PK',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3196=IFCSIMPLEPROPERTYTEMPLATE('13zFXYHFLBWQ7MxC_V1x8s',$,'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',$,#3197,$,$,$,.READWRITE.); -#3197=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3198=IFCSIMPLEPROPERTYTEMPLATE('3ztmOn5iXAUPPiXjYwklPd',$,'Standard','The designation of the standard applicable for the definition of the object used.\X2\000A000A\X0\The designation of the standard applicable for the definition of the characteristics of the\X2\000A\X0\tripping_unit.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3199=IFCSIMPLEPROPERTYTEMPLATE('2EI0ypsNf6KfVNrIB4Ae$F',$,'UseInDiscrimination','An indication whether the time/current tripping information can be applied in a discrimination\X2\000A\X0\analysis or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3200=IFCSIMPLEPROPERTYTEMPLATE('0TiV2Nmb59reNLIhKbgC_C',$,'AtexVerified','An indication whether the tripping_unit is verified to be applied in EX-environment or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3201=IFCSIMPLEPROPERTYTEMPLATE('12oFouDyHC$ONf5FLaldGF',$,'OldDevice','Indication whether the protection_ unit is out-dated or not. If not out-dated, the device is still for sale.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3202=IFCSIMPLEPROPERTYTEMPLATE('1PJgcUxej0dQ91mppojors',$,'LimitingTerminalSize','The maximum terminal size capacity of the device.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3203=IFCPROPERTYSETTEMPLATE('28UleKzv5C$Rt7HIieCAqA',$,'Pset_ProtectiveDeviceTrippingUnitTypeElectroMagnetic','Information on tripping units that are electrically or magnetically tripped.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit/ELECTROMAGNETIC,IfcProtectiveDeviceTrippingUnitType/ELECTROMAGNETIC',(#3204,#3206,#3207,#3208,#3209,#3210,#3211,#3212,#3213,#3214)); -#3204=IFCSIMPLEPROPERTYTEMPLATE('2zJJw8d616sBFDaIFZlfq2',$,'ElectroMagneticTrippingUnitType','A list of the available types of electric magnetic tripping unit from which that required may be selected. These cover overload, none special, short circuit, motor protection and bi-metal tripping.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3205,$,$,$,.READWRITE.); -#3205=IFCPROPERTYENUMERATION('PEnum_ElectroMagneticTrippingUnitType',(IFCLABEL('OL'),IFCLABEL('TMP_BM'),IFCLABEL('TMP_MP'),IFCLABEL('TMP_SC'),IFCLABEL('TMP_STD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3206=IFCSIMPLEPROPERTYTEMPLATE('3rwMRWwPrABhRuuBwuATcx',$,'I1','The (thermal) lower testing current limit in [x In], indicating that for currents lower than I1, the tripping time shall be longer than the associated tripping time, T2.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#3207=IFCSIMPLEPROPERTYTEMPLATE('00ls$dqWj7nObEm0W9SZB8',$,'I2','The (thermal) upper testing current limit in [x In], indicating that for currents larger than I2, the tripping time shall be shorter than the associated tripping time, T2.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#3208=IFCSIMPLEPROPERTYTEMPLATE('2Bvu_SWfX2rvJzH7YKhpq8',$,'T2','The (thermal) testing time in [s] associated with the testing currents I1 and I2.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3209=IFCSIMPLEPROPERTYTEMPLATE('3qtO0acnT5BeA28uNP98Re',$,'DefinedTemperature','The ambient temperature at which the thermal current/time-curve associated with this protection device is defined.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3210=IFCSIMPLEPROPERTYTEMPLATE('0NmBoQusr6C9_aohXAUIzC',$,'TemperatureFactor','The correction factor (typically measured as %/deg K) for adjusting the thermal current/time to an ambient temperature different from the value given by the defined temperature.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3211=IFCSIMPLEPROPERTYTEMPLATE('2TqFdFM2r8yvWZy4iTMyU2',$,'I4','The lower electromagnetic testing current limit in [x In], indicating that for currents lower than I4, the tripping time shall be longer than the associated tripping time, T5, i.e. the device shall not trip instantaneous.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#3212=IFCSIMPLEPROPERTYTEMPLATE('3_652hZ7H5EeaDLSupvA5p',$,'I5','The upper electromagnetic testing current limit in [x In], indicating that for currents larger than I5, the tripping time shall be shorter than or equal to the associated tripping time, T5, i.e. the device shall trip instantaneous.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#3213=IFCSIMPLEPROPERTYTEMPLATE('0SP5qsv2P3OAuO1nh1vR5s',$,'T5','The electromagnetic testing time in [s] associated with the testing currents I4 and I5, i.e. electromagnetic tripping time',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3214=IFCSIMPLEPROPERTYTEMPLATE('0a6ImfC9H7CRHEOFhCxd7i',$,'CurveDesignation','The designation of the trippingcurve given by the manufacturer. For a MCB the designation should be in accordance with the designations given in IEC 60898.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3215=IFCPROPERTYSETTEMPLATE('0F4_qz$jjALh70e_VI$6GH',$,'Pset_ProtectiveDeviceTrippingUnitTypeElectronic','Information on tripping units that are electronically tripped.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit/ELECTRONIC,IfcProtectiveDeviceTrippingUnitType/ELECTRONIC',(#3216,#3218,#3219,#3220,#3221,#3222)); -#3216=IFCSIMPLEPROPERTYTEMPLATE('21HzPRWlb2dhnpN_9fEi3a',$,'ElectronicTrippingUnitType','A list of the available types of electronic tripping unit from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3217,$,$,$,.READWRITE.); -#3217=IFCPROPERTYENUMERATION('PEnum_ElectronicTrippingUnitType',(IFCLABEL('EP_BM'),IFCLABEL('EP_MP'),IFCLABEL('EP_SC'),IFCLABEL('EP_STD'),IFCLABEL('EP_TIMEDELAYED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3218=IFCSIMPLEPROPERTYTEMPLATE('1z2zOBW9D1CQ5ELkXyf5P_',$,'NominalCurrents','A set of values providing information on available modules (chips) for setting the nominal current of the protective device.\X2\000A000A\X0\A set of values providing information on available modules (chips) for setting the nominal current of the protective device. If\X2\000A\X0\the set is empty, no nominal current modules are available for the tripping unit.',.P_LISTVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3219=IFCSIMPLEPROPERTYTEMPLATE('2Na1uX401C5PoMwZanRz4v',$,'N_Protection','An indication whether the electronic tripping unit has separate protection for the N conductor, or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3220=IFCSIMPLEPROPERTYTEMPLATE('3M3NVxUtTFD8$rbAOq8CpR',$,'N_Protection_50','An indication whether the electronic tripping unit is tripping if the current in the N conductor is more than 50% of that of the phase conductors. The property is only asserted if the property N_Protection is asserted.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3221=IFCSIMPLEPROPERTYTEMPLATE('0JRm8aEHL7m8dG40Uueh4S',$,'N_Protection_100','An indication whether the electronic tripping unit is tripping if the current in the N conductor is more than 100% of that of the phase conductors. The property is only asserted if the property N_Protection is asserted.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3222=IFCSIMPLEPROPERTYTEMPLATE('0ctuC1uWT77fnnfOt4cWlG',$,'N_Protection_Select','An indication whether the use of the N_Protection can be selected by the user or not. If both the properties N_Protection_50 and N_Protection_100 are asserted, the value of N_Protection_Select property is set to TRUE. The property is only asserted if the property N_Protection is asserted.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3223=IFCPROPERTYSETTEMPLATE('0UBbYW1IP3nwahyKcX8XR3',$,'Pset_ProtectiveDeviceTrippingUnitTypeResidualCurrent','Information on tripping units that are activated by residual current.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit/RESIDUALCURRENT,IfcProtectiveDeviceTrippingUnitType/RESIDUALCURRENT',(#3224)); -#3224=IFCSIMPLEPROPERTYTEMPLATE('1RqvksBu16Jer$R8uWvP8K',$,'TrippingUnitReleaseCurrent','The value of tripping or residual current for which the device has the possibility to be equipped. The values are given in mA.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3225,$,$,$,.READWRITE.); -#3225=IFCPROPERTYENUMERATION('PEnum_TrippingUnitReleaseCurrent',(IFCLABEL('10'),IFCLABEL('100'),IFCLABEL('1000'),IFCLABEL('30'),IFCLABEL('300'),IFCLABEL('500'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3226=IFCPROPERTYSETTEMPLATE('3oIO_pTG57UeRkHtLlOXH8',$,'Pset_ProtectiveDeviceTrippingUnitTypeThermal','Information on tripping units that are thermally tripped.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit/THERMAL,IfcProtectiveDeviceTrippingUnitType/THERMAL',(#3227,#3229,#3230,#3231,#3232,#3233,#3234)); -#3227=IFCSIMPLEPROPERTYTEMPLATE('1wiheaZrb5uxmUxNd1qsQX',$,'ThermalTrippingUnitType','A list of the available types of thermal tripping unit from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3228,$,$,$,.READWRITE.); -#3228=IFCPROPERTYENUMERATION('PEnum_ThermalTrippingUnitType',(IFCLABEL('DIAZED'),IFCLABEL('MINIZED'),IFCLABEL('NEOZED'),IFCLABEL('NH_FUSE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3229=IFCSIMPLEPROPERTYTEMPLATE('1kupzJk3j93O5d__W8SvuZ',$,'I1','The (thermal) lower testing current limit in [x In], indicating that for currents lower than I1, the tripping time shall be longer than the associated tripping time, T2.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#3230=IFCSIMPLEPROPERTYTEMPLATE('036_UrtTT7XhloSSHPvZ8X',$,'I2','The (thermal) upper testing current limit in [x In], indicating that for currents larger than I2, the tripping time shall be shorter than the associated tripping time, T2.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#3231=IFCSIMPLEPROPERTYTEMPLATE('3xeVxZmsv4sPbKoYkANcQG',$,'T2','The (thermal) testing time in [s] associated with the testing currents I1 and I2.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3232=IFCSIMPLEPROPERTYTEMPLATE('24Z1qzNqv8rgEVhd2Yli9e',$,'DefinedTemperature','The ambient temperature at which the thermal current/time-curve associated with this protection device is defined.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3233=IFCSIMPLEPROPERTYTEMPLATE('3Tvb_pd$X3r8befPXnCufT',$,'TemperatureFactor','The correction factor (typically measured as %/deg K) for adjusting the thermal current/time to an ambient temperature different from the value given by the defined temperature.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3234=IFCSIMPLEPROPERTYTEMPLATE('37zr_l22D3hAoS9ah$FJXs',$,'CurveDesignation','The designation of the trippingcurve given by the manufacturer. For a MCB the designation should be in accordance with the designations given in IEC 60898.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3235=IFCPROPERTYSETTEMPLATE('3MT4AzSRHBYhdJncyGQcRA',$,'Pset_ProtectiveDeviceTypeAntiArcingDevice','Anti arcing device properties used in energy domain. The property set can be used by the predefined type ANTI_ARCING_DEVICE of IfcProtectiveDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/ANTI_ARCING_DEVICE,IfcProtectiveDeviceType/ANTI_ARCING_DEVICE',(#3236,#3237)); -#3236=IFCSIMPLEPROPERTYTEMPLATE('1uDsnqe7DFdfIQbshBe2vr',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#3237=IFCSIMPLEPROPERTYTEMPLATE('1TUYNsNar1K9N2rYVrdFJo',$,'GroundingType','The type of grounding connection.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3238=IFCPROPERTYSETTEMPLATE('3kgUseP8XFMRixZS6KFOOp',$,'Pset_ProtectiveDeviceTypeCircuitBreaker','A coherent set of attributes representing different capacities of a circuit breaker or of a motor protection device, defined in accordance with IEC 60947. Note - A protective device may be associated with different instances of this property set providing information related to different basic characteristics.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/CIRCUITBREAKER,IfcProtectiveDeviceType/CIRCUITBREAKER',(#3239,#3240,#3242,#3243,#3244,#3245)); -#3239=IFCSIMPLEPROPERTYTEMPLATE('21Eau$yMnAMPVAeNxqFkDr',$,'PerformanceClasses','A set of designations of performance classes for the breaker unit for which the data of this instance is valid.\X2\000A000A\X0\A set of designations of performance classes for the breaker unit for which the data of this instance is valid. A breaker unit being a circuit breaker may be\X2\000A\X0\constructed for different levels of breaking capacities. A maximum of 7 different\X2\000A\X0\performance classes may be provided. Examples of performance classes that may be specified include B, C, N, S, H, L, V.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3240=IFCSIMPLEPROPERTYTEMPLATE('39DHUVQ3n0Z91VnLk32I77',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3241,$,$,$,.READWRITE.); -#3241=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3242=IFCSIMPLEPROPERTYTEMPLATE('3jvbe56QP1_8dlTiuf2mt8',$,'ICU60947','The ultimate breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3243=IFCSIMPLEPROPERTYTEMPLATE('3gGB6yPNj7F82K6i8hVwCf',$,'ICS60947','The service breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3244=IFCSIMPLEPROPERTYTEMPLATE('18tCIXWq15wAraZUs9OwO2',$,'ICW60947','The thermal withstand current in [A] for a circuit breaker or motor protection device tested in accordance with the IEC 60947 series. The value shall be related to 1 s.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3245=IFCSIMPLEPROPERTYTEMPLATE('14QTa8YyX0ngVk4sQ1Phrx',$,'ICM60947','The making capacity in [A] for a circuit breaker or motor protection device tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3246=IFCPROPERTYSETTEMPLATE('2$OgGJSDHDcuUivlnK8C_B',$,'Pset_ProtectiveDeviceTypeCommon','Properties that are applied to a definition of a protective device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3247,#3248)); -#3247=IFCSIMPLEPROPERTYTEMPLATE('05uIFQZ7H1zuUX6X$kE52j',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3248=IFCSIMPLEPROPERTYTEMPLATE('0AB51clUj2yQf01D4FroAe',$,'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',$,#3249,$,$,$,.READWRITE.); -#3249=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3250=IFCPROPERTYSETTEMPLATE('1BNihxef9CfeDzPFdQLsyj',$,'Pset_ProtectiveDeviceTypeEarthLeakageCircuitBreaker','An earth failure device acts to protect people and equipment from the effects of current leakage.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/EARTHLEAKAGECIRCUITBREAKER,IfcProtectiveDeviceType/EARTHLEAKAGECIRCUITBREAKER',(#3251,#3253)); -#3251=IFCSIMPLEPROPERTYTEMPLATE('0Ht7DmZSH2neSBjgAJODtc',$,'EarthFailureDeviceType','A list of the available types of circuit breaker from which that required may be selected where:Standard: Device that operates without a time delay.\X2\000A\X0\TimeDelayed: Device that operates after a time delay.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3252,$,$,$,.READWRITE.); -#3252=IFCPROPERTYENUMERATION('PEnum_EarthFailureDeviceType',(IFCLABEL('STANDARD'),IFCLABEL('TIMEDELAYED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3253=IFCSIMPLEPROPERTYTEMPLATE('0UXMeNPin42xr12EDrVN7P',$,'Sensitivity','Sensitivity.\X2\000A000A\X0\The rated rms value of the vector sum of the instantaneous currents flowing in the main circuits of the device which causes the device to operate under specified conditions. (IEC 61008-1).',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3254=IFCPROPERTYSETTEMPLATE('2$$$B9sKX8AAwS3NuB43GC',$,'Pset_ProtectiveDeviceTypeFuseDisconnector','A coherent set of attributes representing the breaking capacity of a fuse, defined in accordance with IEC 60269. Note - A protective device may be associated with different instances of this pSet providing information related to different basic characteristics.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/FUSEDISCONNECTOR,IfcProtectiveDeviceType/FUSEDISCONNECTOR',(#3255,#3257,#3259,#3260,#3261,#3262,#3263,#3264,#3265,#3266,#3267,#3268,#3269)); -#3255=IFCSIMPLEPROPERTYTEMPLATE('3bLyw2twz3VOO6bl2BGVAG',$,'FuseDisconnectorType','A list of the available types of fuse disconnector from which that required may be selected where:EngineProtectionDevice: A fuse whose characteristic is specifically designed for the protection of a motor or generator.\X2\000A\X0\FuseSwitchDisconnector: A switch disconnector in which a fuse link or a fuse carrier with fuse link forms the moving contact,\X2\000A\X0\HRC: A standard fuse (High Rupturing Capacity)\X2\000A\X0\OverloadProtectionDevice: A device that disconnects the supply when the operating conditions in an electrically undamaged circuit causes an overcurrent,\X2\000A\X0\SemiconductorFuse: A fuse whose characteristic is specifically designed for the protection of sem-conductor devices.\X2\000A\X0\SwitchDisconnectorFuse: A switch disconnector in which one or more poles have a fuse in series in a composite unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3256,$,$,$,.READWRITE.); -#3256=IFCPROPERTYENUMERATION('PEnum_FuseDisconnectorType',(IFCLABEL('ENGINEPROTECTIONDEVICE'),IFCLABEL('FUSEDSWITCH'),IFCLABEL('HRC'),IFCLABEL('OVERLOADPROTECTIONDEVICE'),IFCLABEL('SWITCHDISCONNECTORFUSE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3257=IFCSIMPLEPROPERTYTEMPLATE('12VDOZePL5ewDQbQ$el36w',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3258,$,$,$,.READWRITE.); -#3258=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3259=IFCSIMPLEPROPERTYTEMPLATE('3Zx$BNXuLEe9KGDPYbgWTb',$,'IC60269','The breaking capacity in [A] for fuses in accordance with the IEC 60269 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3260=IFCSIMPLEPROPERTYTEMPLATE('36dsYLofX7ORbx8kSNNSfz',$,'PowerLoss','The power loss in [W].\X2\000A000A\X0\The power loss in [W] of the fuse when the nominal current is flowing through the fuse.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#3261=IFCSIMPLEPROPERTYTEMPLATE('3clwxNLGn1CwAKllcVPuxe',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3262=IFCSIMPLEPROPERTYTEMPLATE('3ohfp3$xf79AKpPjOv3Zfu',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3263=IFCSIMPLEPROPERTYTEMPLATE('3VkYNv9nr7i8JsRxsTp0o3',$,'BreakingCapacity','The current that a fuse, circuit breaker, or other electrical apparatus is able to interrupt without being destroyed or causing an electric arc with unacceptable duration.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3264=IFCSIMPLEPROPERTYTEMPLATE('3E0rEVCND65xxh0Wvf5wGB',$,'ArcExtinctionType','Type of arc extinction used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3265=IFCSIMPLEPROPERTYTEMPLATE('0OKcUmEBPDzv5OBh$0DRBP',$,'NumberOfPoles','Number of poles that the object would affect.\X2\000A000A\X0\Number of poles that the equipment would affect.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3266=IFCSIMPLEPROPERTYTEMPLATE('0rcveU0dnFcRF$OJaGJnIh',$,'TransformationRatio','The ratio of the actual primary current or voltage to the actual secondary current or voltage.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3267=IFCSIMPLEPROPERTYTEMPLATE('3hgwHpMfH3tf3aJ81Ey0c5',$,'NominalFrequency','The nominal frequency of the supply.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#3268=IFCSIMPLEPROPERTYTEMPLATE('3CCmlNoZr2HQp2hEWozg2K',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3269=IFCSIMPLEPROPERTYTEMPLATE('2zWZXUYG9CfR67ajfUsNgO',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#3270=IFCPROPERTYSETTEMPLATE('39DDcdL1P8EhWSipEfRXUS',$,'Pset_ProtectiveDeviceTypeResidualCurrentCircuitBreaker','A residual current circuit breaker opens, closes or isolates a circuit and has short circuit and overload protection.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/RESIDUALCURRENTCIRCUITBREAKER,IfcProtectiveDeviceType/RESIDUALCURRENTCIRCUITBREAKER',(#3271)); -#3271=IFCSIMPLEPROPERTYTEMPLATE('1gorDrSTX8_fmHUhdNkb1l',$,'Sensitivity','Sensitivity.\X2\000A000A\X0\Current leakage to an unwanted leading path during normal operation (IEC 151-14-49).',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3272=IFCPROPERTYSETTEMPLATE('0VptKghmz1uBVEfvZlpCQa',$,'Pset_ProtectiveDeviceTypeResidualCurrentSwitch','A residual current switch opens, closes or isolates a circuit and has no short circuit or overload protection.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/RESIDUALCURRENTSWITCH,IfcProtectiveDeviceType/RESIDUALCURRENTSWITCH',(#3273)); -#3273=IFCSIMPLEPROPERTYTEMPLATE('2yztY0YaLDWvPhIEvYj3OK',$,'Sensitivity','Sensitivity.\X2\000A000A\X0\Current leakage to an unwanted leading path during normal operation (IEC 151-14-49).',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3274=IFCPROPERTYSETTEMPLATE('2Ii19NwuD8r9Vd4ShJ7Ctz',$,'Pset_ProtectiveDeviceTypeSparkGap','Spark gap properties used in energy domain. The property set can be used by the predefined type SPARKGAP and VOLTAGELIMITER of IfcProtectiveDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/SPARKGAP,IfcProtectiveDevice/VOLTAGELIMITER,IfcProtectiveDeviceType/SPARKGAP,IfcProtectiveDeviceType/VOLTAGELIMITER',(#3275,#3276,#3277,#3278,#3279,#3281)); -#3275=IFCSIMPLEPROPERTYTEMPLATE('0IPQPggYHAIvro5UCzIvvP',$,'BreakdownVoltageTolerance','Nominal value of the spark gap breakdown voltage tolerance.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#3276=IFCSIMPLEPROPERTYTEMPLATE('3enJps6Vz9kwbR4F_Fsucp',$,'Capacitance','Maximum value of the capacitance between the electrodes at specified frequency and temperature.',.P_SINGLEVALUE.,'IfcElectricCapacitanceMeasure',$,$,$,$,$,.READWRITE.); -#3277=IFCSIMPLEPROPERTYTEMPLATE('0yyJxxVKH0Yx55KqcLVOsy',$,'CurrentRMS','Maximum rms (root mean square) current of an electric-electronic or electromechanical component at specified ambient temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#3278=IFCSIMPLEPROPERTYTEMPLATE('1LOpaYyBL0P8I1Iihx6p7_',$,'PowerDissipation','Permissible power which may be dissipated continuously, at specified conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#3279=IFCSIMPLEPROPERTYTEMPLATE('1sr3OFrMD44x4$Vo6McyRF',$,'SparkGapType','Type of Spark gap.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3280,$,$,$,.READWRITE.); -#3280=IFCPROPERTYENUMERATION('PEnum_SparkGapType',(IFCLABEL('AIRSPARKGAP'),IFCLABEL('GASFILLEDSPARKGAP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3281=IFCSIMPLEPROPERTYTEMPLATE('38AaIzFO17zg$s$ssjtE_6',$,'Resistivity','Electrical resistivity of a rock or soil (Ohm-m).',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#3282=IFCPROPERTYSETTEMPLATE('0QErJJd5X7MA_HtjVMJH8Q',$,'Pset_ProtectiveDeviceTypeVaristor','A high voltage surge protection device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/VARISTOR,IfcProtectiveDeviceType/VARISTOR',(#3283,#3285)); -#3283=IFCSIMPLEPROPERTYTEMPLATE('2$OlRAtsP3AOOiuSRom5Kk',$,'VaristorType','A list of the available types of varistor from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3284,$,$,$,.READWRITE.); -#3284=IFCPROPERTYENUMERATION('PEnum_VaristorType',(IFCLABEL('METALOXIDE'),IFCLABEL('ZINCOXIDE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3285=IFCSIMPLEPROPERTYTEMPLATE('1K$a6PvO91ZQNc_Zqj6UYZ',$,'CharacteristicFunction','The characteristic function to show the relationship between varistor current and voltage.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3286=IFCPROPERTYSETTEMPLATE('1xL6IQjbnDIwJJ3Hk9mY5z',$,'Pset_ProvisionForVoid','Properties for Provisions For Voids.',.PSET_OCCURRENCEDRIVEN.,'IfcBuildingElementProxy/PROVISIONFORVOID,IfcVirtualElement/PROVISIONFORVOID',(#3287,#3288,#3289,#3290,#3291,#3292)); -#3287=IFCSIMPLEPROPERTYTEMPLATE('2JNt2Nfy9DKRvvdAiRN29F',$,'VoidShape','The shape form of the provision for void, the minimum set of agreed values includes ''Rectangle'', ''Round'', and ''Undefined''.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3288=IFCSIMPLEPROPERTYTEMPLATE('33PpWzmen44g7gU4bN3rEy',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3289=IFCSIMPLEPROPERTYTEMPLATE('3ghr3_yrH30PsZ5GZ6ISsE',$,'Height','Characteristic height\X2\000A000A\X0\Vertical extension in elevation. Only provided if the Shape property is set to "rectangle".',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3290=IFCSIMPLEPROPERTYTEMPLATE('1$gyVXGmn1CeJtUph_6O$N',$,'Diameter','The Diameter of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3291=IFCSIMPLEPROPERTYTEMPLATE('2zQD9GsSb7axzJ_ZgtYx60',$,'Depth','The depth of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3292=IFCSIMPLEPROPERTYTEMPLATE('2kJKkG$uz9oPXe3RGdvke5',$,'System','he building service system that requires the provision for voids, e.g. ''Air Conditioning'', ''Plumbing'', ''Electro'', etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3293=IFCPROPERTYSETTEMPLATE('1j$T13utDBF9R1C90EXPkX',$,'Pset_PumpOccurrence','Pump occurrence attributes attached to an instance of IfcPump.',.PSET_OCCURRENCEDRIVEN.,'IfcPump',(#3294,#3295,#3297)); -#3294=IFCSIMPLEPROPERTYTEMPLATE('3bKmcCPP11_wDG0dZgd$zT',$,'ImpellerDiameter','Diameter of object - used to scale performance of geometrically similar objects.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3295=IFCSIMPLEPROPERTYTEMPLATE('2nAKlEY5f7_87PIFB3rY$L',$,'BaseType','Defines general types of pump bases.FRAME: Frame.\X2\000A\X0\BASE: Base.\X2\000A\X0\NONE: There is no pump base, such as an inline pump.\X2\000A\X0\OTHER: Other type of pump base.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3296,$,$,$,.READWRITE.); -#3296=IFCPROPERTYENUMERATION('PEnum_PumpBaseType',(IFCLABEL('BASE'),IFCLABEL('FRAME'),IFCLABEL('NONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3297=IFCSIMPLEPROPERTYTEMPLATE('0hpuEKiCX5bOJ$YjoaTllH',$,'DriveConnectionType','The way the pump drive mechanism is connected to the pump.DIRECTDRIVE: Direct drive.\X2\000A\X0\BELTDRIVE: Belt drive.\X2\000A\X0\COUPLING: Coupling.\X2\000A\X0\OTHER: Other type of drive connection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3298,$,$,$,.READWRITE.); -#3298=IFCPROPERTYENUMERATION('PEnum_PumpDriveConnectionType',(IFCLABEL('BELTDRIVE'),IFCLABEL('COUPLING'),IFCLABEL('DIRECTDRIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3299=IFCPROPERTYSETTEMPLATE('0Zv0FCrUbCW8525Nrv3cT1',$,'Pset_PumpPHistory','Pump performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcPump',(#3300,#3301,#3302,#3303,#3304,#3305)); -#3300=IFCSIMPLEPROPERTYTEMPLATE('3hhcmOZGH2kP5gfGNtZv_h',$,'MechanicalEfficiency','The objects operational mechanical efficiency.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3301=IFCSIMPLEPROPERTYTEMPLATE('3tOQmTs1XEmQlqH5QRwdAi',$,'OverallEfficiency','Total efficiency of object.\X2\000A000A\X0\The pump and motor overall operational efficiency.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3302=IFCSIMPLEPROPERTYTEMPLATE('1EbnQ5v1zA6xTWnkNOuP_F',$,'PressureRise','The developed pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3303=IFCSIMPLEPROPERTYTEMPLATE('1pOTxLqRD5OPb3eiENfh0a',$,'RotationSpeed','Pump rotational speed.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3304=IFCSIMPLEPROPERTYTEMPLATE('0PMNaMfqTFGgE0nMR_SaTP',$,'Flowrate','The flowrate of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3305=IFCSIMPLEPROPERTYTEMPLATE('2Y$ablX8DCXPpZosROcXfy',$,'PowerHistory','The actual power consumption of the pump.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3306=IFCPROPERTYSETTEMPLATE('1EgOQA1Fb6AfcUflXeLo9W',$,'Pset_PumpTypeCommon','Common attributes of a pump type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPump,IfcPumpType',(#3307,#3308,#3310,#3311,#3312,#3313,#3314,#3315)); -#3307=IFCSIMPLEPROPERTYTEMPLATE('1ki$SfvYj80QA8J9qn3YdK',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3308=IFCSIMPLEPROPERTYTEMPLATE('1Gkd$bqcTAjQJOaNrxnYHP',$,'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',$,#3309,$,$,$,.READWRITE.); -#3309=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3310=IFCSIMPLEPROPERTYTEMPLATE('3niewp6kT51QJMiiJ91eDy',$,'FlowRateRange','Allowable range of volume of fluid being pumped against the resistance specified.',.P_BOUNDEDVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#3311=IFCSIMPLEPROPERTYTEMPLATE('1LDvqQxXP7CRh3SQOkaa7E',$,'FlowResistanceRange','Allowable range of frictional resistance against which the fluid is being pumped.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#3312=IFCSIMPLEPROPERTYTEMPLATE('3MH3$O1H1Drue$mBNJk_NL',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\The connection to and from the pump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3313=IFCSIMPLEPROPERTYTEMPLATE('2RTK4LtJH7SQuHaEQmwm8Y',$,'TemperatureRange','Allowable maximum and minimum temperature.\X2\000A000A\X0\Allowable operational range of the fluid temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3314=IFCSIMPLEPROPERTYTEMPLATE('1S9SxSNgz6Nvb7l0gVHMd8',$,'NetPositiveSuctionHead','Minimum liquid pressure at the pump inlet to prevent cavitation.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#3315=IFCSIMPLEPROPERTYTEMPLATE('07AgW6LDnDEu4PubnjeQVH',$,'NominalRotationSpeed','Rotational speed of the object under nominal conditions.\X2\000A000A\X0\Pump rotational speed under nominal conditions.',.P_SINGLEVALUE.,'IfcRotationalFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#3316=IFCPROPERTYSETTEMPLATE('0qkGaznpz7XgmF3Il2SsYZ',$,'Pset_QuayCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to QUAY.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/QUAY',(#3317,#3318,#3319,#3321)); -#3317=IFCSIMPLEPROPERTYTEMPLATE('3glLE63rvDixXj9AtBMSH0',$,'StructuralType','Structural type of the object',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3318=IFCSIMPLEPROPERTYTEMPLATE('0ruqynndXCTQAk3cr08vGZ',$,'BentSpacing','Bent (upright) spacing',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3319=IFCSIMPLEPROPERTYTEMPLATE('3MY7CeJF90q96jjVcW7Jry',$,'QuaySectionType','Whether the structure presents a solid/closed barrier to the passage of water or is open.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3320,$,$,$,.READWRITE.); -#3320=IFCPROPERTYENUMERATION('PEnum_SectionType',(IFCLABEL('CLOSED'),IFCLABEL('OPEN')),$); -#3321=IFCSIMPLEPROPERTYTEMPLATE('2LCXqusg1CGRSNxeRt409Q',$,'Elevation','Elevation of the entity',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3322=IFCPROPERTYSETTEMPLATE('0NJ2Qn0an3lf30xuH0NCXw',$,'Pset_QuayDesignCriteria','Properties common to the definition of design criteria of all occurrences of IfcMarineFacility with the predefined type set to QUAY.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/QUAY',(#3323,#3324,#3325,#3326,#3327,#3328,#3329,#3330,#3331)); -#3323=IFCSIMPLEPROPERTYTEMPLATE('0MN_NhHwLDyB_ahbNXfMkf',$,'HighWaterLevel','High water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3324=IFCSIMPLEPROPERTYTEMPLATE('2CFduc96T8ZwwHjjXsDCtf',$,'LowWaterLevel','Low water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3325=IFCSIMPLEPROPERTYTEMPLATE('1qACqVXoP5s9JVGcxrJ7Cl',$,'ExtremeHighWaterLevel','Extreme high water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3326=IFCSIMPLEPROPERTYTEMPLATE('23upb4dh5Fl9vRxVEcv1qJ',$,'ExtremeLowWaterLevel','Extreme low water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3327=IFCSIMPLEPROPERTYTEMPLATE('1A_VnYU051Ke1kU3K0yarl',$,'ShipLoading','Ship loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#3328=IFCSIMPLEPROPERTYTEMPLATE('2VGY7eX_HENBfJx60vlS06',$,'WaveLoading','Wave loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#3329=IFCSIMPLEPROPERTYTEMPLATE('3FI8ZU2MP2JPDJ2xOsQtI8',$,'FlowLoading','Flow loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#3330=IFCSIMPLEPROPERTYTEMPLATE('0_lbdu$lb9KPVX$mHcq6lS',$,'UniformlyDistributedLoad','Uniformly Distributed Load',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#3331=IFCSIMPLEPROPERTYTEMPLATE('3U6_TYVOjF58CbdDMXKJcM',$,'EquipmentLoading','Loading from equipment',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#3332=IFCPROPERTYSETTEMPLATE('3yv1UHnc19AukeBc_sYKve',$,'Pset_RadiiKerbStone','Properties describing the keb stone radii.',.PSET_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#3333,#3335)); -#3333=IFCSIMPLEPROPERTYTEMPLATE('1aHouksbfDye1E26eB4FoN',$,'CurveShape','Shape according to CurveShapeEnum',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3334,$,$,$,.READWRITE.); -#3334=IFCPROPERTYENUMERATION('PEnum_CurveShapeEnum',(IFCLABEL('EXTERNAL'),IFCLABEL('INTERNAL')),$); -#3335=IFCSIMPLEPROPERTYTEMPLATE('1wx5qKDufFZR9fiikOdCNh',$,'Radius','The radius of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3336=IFCPROPERTYSETTEMPLATE('3OtYaiYNb6$9GTJ_N$fEJL',$,'Pset_RailingCommon','Properties common to the definition of all occurrences of IfcRailing.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRailing,IfcRailingType',(#3337,#3338,#3340,#3341,#3342)); -#3337=IFCSIMPLEPROPERTYTEMPLATE('3M$GJCSJTDn8bz4lRLOe3d',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3338=IFCSIMPLEPROPERTYTEMPLATE('1gi8fTen13Ffc9RnGGsm5W',$,'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',$,#3339,$,$,$,.READWRITE.); -#3339=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3340=IFCSIMPLEPROPERTYTEMPLATE('3A8uossHLAHe7ca9K9adaw',$,'Height','Characteristic height\X2\000A000A\X0\It is the upper height of the railing above the floor or stair.\X2\000A\X0\The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3341=IFCSIMPLEPROPERTYTEMPLATE('1m65CRhI159ABEpDivLoYp',$,'Diameter','The Diameter of the object.\X2\000A000A\X0\Specifically handrail of the railing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3342=IFCSIMPLEPROPERTYTEMPLATE('0NEF6EaHT3$OQMrTGh4TrG',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3343=IFCPROPERTYSETTEMPLATE('3Fvh1Fpk1FluwawoiXtfh5',$,'Pset_RailTypeBlade','Properties common to IfcRail types and occurrences with PredefinedType set to BLADE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRail/BLADE,IfcRailType/BLADE',(#3344,#3345,#3346,#3347)); -#3344=IFCSIMPLEPROPERTYTEMPLATE('1ffA7IyQH4FA9Qdz8obRO8',$,'IsArticulatedBlade','Indicates whether the blade is articulated or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3345=IFCSIMPLEPROPERTYTEMPLATE('3WxQaRYmjBjO5kSQaOfhqL',$,'IsFallbackBlade','Indicates whether the blade always returns to the same position as a trailable turnout or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3346=IFCSIMPLEPROPERTYTEMPLATE('0vcMEMkQj04h8kTW1lz7Kx',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3347=IFCSIMPLEPROPERTYTEMPLATE('3uD$qvx3PA6Qfhgd8wCYEJ',$,'BladeRadius','The radius of the blade bend defined as design parameter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3348=IFCPROPERTYSETTEMPLATE('0hswIxaMX2MuKURlHxSP6F',$,'Pset_RailTypeCheckRail','Properties common to IfcRail types and occurrences with PredefinedType set to CHECKRAIL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRail/CHECKRAIL,IfcRailType/CHECKRAIL',(#3349,#3351)); -#3349=IFCSIMPLEPROPERTYTEMPLATE('218gQr3NfFPPqeZnYr4rsB',$,'CheckRailType','Type of the check rail. Check rail types enumerated in this property are defined based on EN 13674.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3350,$,$,$,.READWRITE.); -#3350=IFCPROPERTYENUMERATION('PEnum_CheckRailType',(IFCLABEL('TYPE_33C1'),IFCLABEL('TYPE_40C1'),IFCLABEL('TYPE_47C1'),IFCLABEL('TYPE_CR3_60U'),IFCLABEL('TYPE_R260'),IFCLABEL('TYPE_R320CR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3351=IFCSIMPLEPROPERTYTEMPLATE('0I7Ie$zJn3mwibufiqEzwR',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#3352=IFCPROPERTYSETTEMPLATE('20mzhvd9fC5wP429dmfk5K',$,'Pset_RailTypeGuardRail','Properties common to IfcRail types and occurrences with PredefinedType set to GUARDRAIL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRail/GUARDRAIL,IfcRailType/GUARDRAIL',(#3353,#3355,#3357)); -#3353=IFCSIMPLEPROPERTYTEMPLATE('0gOb9MpEH63Q$ZicvKgjQj',$,'GuardRailConnection','Indicates how the guard rail is connected along its length, when the fasteners are not explicitly modelled.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3354,$,$,$,.READWRITE.); -#3354=IFCPROPERTYENUMERATION('PEnum_GuardRailConnection',(IFCLABEL('FISHPLATE'),IFCLABEL('NONE'),IFCLABEL('WELD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3355=IFCSIMPLEPROPERTYTEMPLATE('3GIeJAei53SfEQ8qZiTgty',$,'PositionInTrack','Indicates the relative position of the element in track, which lies to the left or right as facing in the direction of increasing stationing values.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3356,$,$,$,.READWRITE.); -#3356=IFCPROPERTYENUMERATION('PEnum_RelativePosition',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3357=IFCSIMPLEPROPERTYTEMPLATE('3eBBAJeUT4wu4PAlSPQre2',$,'GuardRailType','Type of the guard rail.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3358,$,$,$,.READWRITE.); -#3358=IFCPROPERTYENUMERATION('PEnum_GuardRailType',(IFCLABEL('GUARDRAILANDSPOTSLEEPERS'),IFCLABEL('GUARDRAILSONLY'),IFCLABEL('SPOTSLEEPERSONLY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3359=IFCPROPERTYSETTEMPLATE('1pZzvi3MvB3QEGTmrQyaS0',$,'Pset_RailTypeRail','Properties common to IfcRail types and occurrences with PredefinedType set to RAIL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRail/RAIL,IfcRailType/RAIL',(#3360,#3362,#3363,#3365,#3367,#3369,#3371,#3372,#3373)); -#3360=IFCSIMPLEPROPERTYTEMPLATE('0t4q_5MCLDtPx3sNi4HTH4',$,'PositionInTrack','Indicates the relative position of the element in track, which lies to the left or right as facing in the direction of increasing stationing values.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3361,$,$,$,.READWRITE.); -#3361=IFCPROPERTYENUMERATION('PEnum_RelativePosition',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3362=IFCSIMPLEPROPERTYTEMPLATE('1xfBfQ7tz0Sxzp0zd$fy1t',$,'TechnicalStandard','The technical standard which the element should comply with.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#3363=IFCSIMPLEPROPERTYTEMPLATE('3$dR4nOjT5593Zp1LaffuM',$,'RailDeliveryState','The delivery state of rail, which indicates the final treatment at the end in manufacturing.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3364,$,$,$,.READWRITE.); -#3364=IFCPROPERTYENUMERATION('PEnum_RailDeliveryState',(IFCLABEL('HEATTREATMENT'),IFCLABEL('HOTROLLING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3365=IFCSIMPLEPROPERTYTEMPLATE('23_lzeGM1EOQBRb3tudhhy',$,'RailCondition','Assessment of the condition of the rail at point of installation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3366,$,$,$,.READWRITE.); -#3366=IFCPROPERTYENUMERATION('PEnum_RailCondition',(IFCLABEL('NEWRAIL'),IFCLABEL('REGENERATEDRAIL'),IFCLABEL('REUSEDRAIL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3367=IFCSIMPLEPROPERTYTEMPLATE('2SaJ6PRivByvuRn1j6Mwt5',$,'DrillOnRail','Indicates if the manufactured rail is drilled at its extremities or not. It can have holes on one, both or none of its extremities.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3368,$,$,$,.READWRITE.); -#3368=IFCPROPERTYENUMERATION('PEnum_DrillOnRail',(IFCLABEL('BOTHENDS'),IFCLABEL('NONE'),IFCLABEL('ONEEND'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3369=IFCSIMPLEPROPERTYTEMPLATE('0IUzfNjV12AR4PI9qioXIp',$,'RailElementaryLength','The standardised length of rail supplied from the manufacturer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3370,$,$,$,.READWRITE.); -#3370=IFCPROPERTYENUMERATION('PEnum_RailElementaryLength',(IFCLABEL('100M'),IFCLABEL('108M'),IFCLABEL('120M'),IFCLABEL('12M'),IFCLABEL('144M'),IFCLABEL('18M'),IFCLABEL('24M'),IFCLABEL('25M'),IFCLABEL('27M'),IFCLABEL('30M'),IFCLABEL('36M'),IFCLABEL('400M'),IFCLABEL('48M'),IFCLABEL('54M'),IFCLABEL('60M'),IFCLABEL('6M'),IFCLABEL('72M'),IFCLABEL('75M'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3371=IFCSIMPLEPROPERTYTEMPLATE('3h2OqKzxD0OQRjHIGr_ejb',$,'MinimumTensileStrength','Indicates the minimum tensile strength.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#3372=IFCSIMPLEPROPERTYTEMPLATE('3PxfOLqST6xB_UmsetdUVq',$,'IsStainless','Indicates whether the rail is stainless or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3373=IFCSIMPLEPROPERTYTEMPLATE('2gYb7TGxL7PO9yb1vVyd74',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#3374=IFCPROPERTYSETTEMPLATE('1T$3zEfXDDbvhb5qXom6PZ',$,'Pset_RailTypeStockRail','Properties common to IfcRail types and occurrences with PredefinedType set to STOCKRAIL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRail/STOCKRAIL,IfcRailType/STOCKRAIL',(#3375,#3376,#3377)); -#3375=IFCSIMPLEPROPERTYTEMPLATE('3aTC$PiVz42ewRu7UTKXrR',$,'StockRailRadius','The radius of the stock rail bend defined as design parameter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3376=IFCSIMPLEPROPERTYTEMPLATE('1B39mzmzT3ePcTvKhp7jCR',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#3377=IFCSIMPLEPROPERTYTEMPLATE('1NtD2q2Tz4JBPbPYJ81GTB',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3378=IFCPROPERTYSETTEMPLATE('0JUs_zTtL29edzaAwm_or5',$,'Pset_RailwayBalise','Properties applicable to a railway balise. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type TRANSPONDER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/TRANSPONDER,IfcCommunicationsApplianceType/TRANSPONDER',(#3379,#3380,#3381,#3382,#3383,#3384,#3386,#3387,#3388,#3389,#3390)); -#3379=IFCSIMPLEPROPERTYTEMPLATE('3eQM$dcx59wwWuFgqtSVjU',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3380=IFCSIMPLEPROPERTYTEMPLATE('3js5C4tQj8LRUBw5fvi8rl',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3381=IFCSIMPLEPROPERTYTEMPLATE('2rfyDYNBj6NvgQT46Ezy3E',$,'NominalWeight','Nominal weight of the object.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#3382=IFCSIMPLEPROPERTYTEMPLATE('0PzCnIeZT1jfUXUKP_3Ded',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3383=IFCSIMPLEPROPERTYTEMPLATE('2DQGdHrC5CfOcnF3ERuUil',$,'FailureInformation','The information for failure description.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3384=IFCSIMPLEPROPERTYTEMPLATE('06z8yYbSLBqu2mOXguTcwZ',$,'RailwayBaliseType','Type of the railway balise.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3385,$,$,$,.READWRITE.); -#3385=IFCPROPERTYENUMERATION('PEnum_RailwayBaliseType',(IFCLABEL('ACTIVEBALISE'),IFCLABEL('PASSIVEBALISE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3386=IFCSIMPLEPROPERTYTEMPLATE('3Vob2Hmi9B5RiLCPydjg4I',$,'DetectionRange','The detection range of the equipment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3387=IFCSIMPLEPROPERTYTEMPLATE('3yNv_zFuD1XfgGt55IKY0C',$,'InformationLength','Indicates supported bytes of the data Information, e.g.127 bytes.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#3388=IFCSIMPLEPROPERTYTEMPLATE('20xS0T9dr2CBpaPtgHsgNT',$,'TransmissionRate','Data transmission rate between the device and the receiving module in bits per second.',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); -#3389=IFCSIMPLEPROPERTYTEMPLATE('0xwPkyxw98yAq_Pz6aVGxD',$,'OperationalTemperatureRange','The temperature range in which the device operates normally.\X2\000A000A\X0\Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3390=IFCSIMPLEPROPERTYTEMPLATE('2dsKHq1Rf0CPaSGY7w9_Mw',$,'IP_Code','IP Code, the International Protection Marking, IEC 60529), classifies and rates the degree of protection provided against intrusion.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3391=IFCPROPERTYSETTEMPLATE('2U1LIAmNn49ghROVcG0ri3',$,'Pset_RailwayCableCarrier','Common properties for cable carrier segments constructed in railway projects.',.PSET_OCCURRENCEDRIVEN.,'IfcCableCarrierSegment',(#3392)); -#3392=IFCSIMPLEPROPERTYTEMPLATE('11NO2bofH4Lg1nI1KGBiXB',$,'NumberOfCrossedTracks','Number of tracks crossed in cable route.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3393=IFCPROPERTYSETTEMPLATE('1h0KgWa4f9lfYGr_FNxc0v',$,'Pset_RailwayLevelCrossing','Properties applicable to IfcFacilityPartCommon with PredefinedType set to LEVELCROSSING.',.PSET_OCCURRENCEDRIVEN.,'IfcFacilityPartCommon/LEVELCROSSING',(#3394,#3395,#3396,#3397,#3398,#3399)); -#3394=IFCSIMPLEPROPERTYTEMPLATE('3BXrSdk2n2cvrs6q97eDn0',$,'IsAccessibleByVehicle','Indicates whether the element is accessible by a vehicle or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3395=IFCSIMPLEPROPERTYTEMPLATE('2wSMHHAc5808X4vHkNaBXr',$,'HasRailDrainage','Indicates whether there is rail drainage or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3396=IFCSIMPLEPROPERTYTEMPLATE('0Ej0CKcK9DyfEBVp3I3LE5',$,'IsPrivateOwner','Indicates if the owner of the crossed road is private or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3397=IFCSIMPLEPROPERTYTEMPLATE('21WsjwAAf0JeNpY62p3MvS',$,'PermissiblePavementLoad','Permissible traffic load on the pavement.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#3398=IFCSIMPLEPROPERTYTEMPLATE('13Jw3zVcP3L9NgXQ7ryjGH',$,'IsSecuredBySignalingSystem','Indicates whether the level crossing is secured by a signalling system or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3399=IFCSIMPLEPROPERTYTEMPLATE('1m5eRJOqTB7et9ExM1BJIY',$,'IsExceptionalTransportRoute','Indicates whether the route is suitable for exceptional transport (load, structure gauge, road),',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3400=IFCPROPERTYSETTEMPLATE('34amSNfi1BDx$Vu_stH_em',$,'Pset_RailwaySignalAspect','Properties in this property set are applicable for IfcSignal and IfcSign applied in railways. These properties describe the signal aspect, which is the information on the signal or sign shown to the train driver.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSignal,IfcSign,IfcSignalType,IfcSignType',(#3401,#3402,#3404,#3405)); -#3401=IFCSIMPLEPROPERTYTEMPLATE('2ozKT73yn6MeAveh6xtUYr',$,'SignalAspectSymbol','Content which is shown on the signal or sign, e.g. text, number, arrow or icon.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#3402=IFCSIMPLEPROPERTYTEMPLATE('1xV4R5oOH0LxF83Vix0foA',$,'AppliesToTrainCategory','Sign information relative to train category, e.g. freight, passenger.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3403,$,$,$,.READWRITE.); -#3403=IFCPROPERTYENUMERATION('PEnum_TrainCategory',(IFCLABEL('FREIGHT'),IFCLABEL('PASSENGER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3404=IFCSIMPLEPROPERTYTEMPLATE('2TNTfsHbT8O9kdAEtxJ__K',$,'SignalAspectType','The type of aspect, e.g. 2-display aspect for distant signal, 3-display aspect for block signal.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3405=IFCSIMPLEPROPERTYTEMPLATE('3alvHMahb9SeYsRyBYxFu8',$,'SignLegend','Text information written on the signal or sign.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3406=IFCPROPERTYSETTEMPLATE('1u3QdZzNLFK87l5msgpTne',$,'Pset_RailwaySignalOccurrence','Properties common to the definition of occurrences of IfcSignal applied in railways.',.PSET_OCCURRENCEDRIVEN.,'IfcSignal',(#3407,#3408,#3409,#3410,#3411,#3412,#3413,#3414,#3415,#3416,#3417,#3418,#3419)); -#3407=IFCSIMPLEPROPERTYTEMPLATE('2ufcNxU4r5A9koNM_OFV8Z',$,'ApproachSpeed','The design speed of trains approaching the signal if different from the line speed.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3408=IFCSIMPLEPROPERTYTEMPLATE('0t4eDY7cf51QKY8D_bHZ3f',$,'HandSignallingProhibited','Indicates if hand signalling is prohibited in case of any failure.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3409=IFCSIMPLEPROPERTYTEMPLATE('3TKvYeR2P3TA0ZnUZLR4Ld',$,'LimitedClearances','Special conditions for placing the signal post telephone: tunnels, bridges, viaducts.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3410=IFCSIMPLEPROPERTYTEMPLATE('3scKt$ANn3KgqsJUmdowep',$,'NumberOfLampsNotUsed','Number of lamps which are not needed and blanked out (sealed).',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3411=IFCSIMPLEPROPERTYTEMPLATE('2qqzBG0uPC6xfgktpe0n9W',$,'RequiresOLEMesh','Indicates whether an OLE mesh is required to protect the signal or maintainer.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3412=IFCSIMPLEPROPERTYTEMPLATE('21O5w7hRP24v8XKNXQte6O',$,'RequiresSafetyHandrail','Indicates whether a safety handrail is required.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3413=IFCSIMPLEPROPERTYTEMPLATE('1syDkpckj4LxX1ms9v_hkL',$,'SignalPostTelephoneID','The identifier of the signal post telephone attached to the signal.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3414=IFCSIMPLEPROPERTYTEMPLATE('1UoOFv84jACBiqjmPD44dY',$,'SignalPostTelephoneType','Indicates the type of the signal post telephone, e.g. locked, direct line, dial phone.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3415=IFCSIMPLEPROPERTYTEMPLATE('0OZCMXDOz4sPZujBEtvaF0',$,'SpecialPositionArrangement','Type of special position at which the signal is placed.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3416=IFCSIMPLEPROPERTYTEMPLATE('3$oC6KufH3owSeerLn8T$V',$,'HinderingObstaclesDescription','Description of obstacles that hinder the visibility for the staff in the station.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3417=IFCSIMPLEPROPERTYTEMPLATE('0JCiRt_gX2iwdqHdOjBoa0',$,'SignalWalkwayLength','Indicates the length of the walkway from signal to signal post telephone.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3418=IFCSIMPLEPROPERTYTEMPLATE('3kcW5Z9a17zxsre803gIe0',$,'RequiresBannerSignal','Indicates whether a banner repeater signal is required.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3419=IFCSIMPLEPROPERTYTEMPLATE('1n43b1__jAYRTawj2KkKf4',$,'DistanceToStopMark','Distance from the signal to the nearest stop mark at a platform.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3420=IFCPROPERTYSETTEMPLATE('26V9qgBCP3GBdmr0EnbVb0',$,'Pset_RailwaySignalSighting','Properties that define information about signal sighting or visibility in railways. These properties are applicable to occurrences of IfcSignal and IfcSign.',.PSET_OCCURRENCEDRIVEN.,'IfcSignal,IfcSign',(#3421,#3422,#3423,#3424,#3425,#3426,#3427)); -#3421=IFCSIMPLEPROPERTYTEMPLATE('2QzYqbJCDCwus9kBIl0FVp',$,'SignalSightingAchievableDistance','Reading distance of the signal, which is achievable with the help of mitigation works.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3422=IFCSIMPLEPROPERTYTEMPLATE('3kjliarBr4qOmBNA_qcMO9',$,'SignalSightingAvailableDistance','Reading distance of the signal without having any mitigation works.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3423=IFCSIMPLEPROPERTYTEMPLATE('0Nk9D0FFnD5wVlfOsjA2dM',$,'SignalSightingCombinedWithRepeater','Combined reading distance for the signal and any associated repeaters.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3424=IFCSIMPLEPROPERTYTEMPLATE('0y6q9b2Wv0HB0XIT5UGpAO',$,'SignalSightingMinimum','Minimal distance in which the signal has to be readable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3425=IFCSIMPLEPROPERTYTEMPLATE('3G5jaxTN50f9nY7xArwXbL',$,'SignalSightingPreferred','Preferred distance in which the signal shall be readable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3426=IFCSIMPLEPROPERTYTEMPLATE('0ezU$mu3vAr9TECTt0uA2b',$,'SignalSightingRouteIndicator','Required reading distance for the route indicator.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3427=IFCSIMPLEPROPERTYTEMPLATE('27Afc$UdP7hQK9fFuWLBO8',$,'SignalViewingMinimumInFront','Smallest distance where the signal has to be readable (for train very close to the signal).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3428=IFCPROPERTYSETTEMPLATE('0Z7dY$OFf7uOgXcnH4WbWd',$,'Pset_RailwaySignalType','Properties common to the definition of occurrences and types of IfcSignal applied in railways.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSignal,IfcSignalType',(#3429,#3431,#3432,#3433,#3434,#3435,#3436,#3437,#3438,#3439,#3440,#3441)); -#3429=IFCSIMPLEPROPERTYTEMPLATE('1Um7Ljh9bC$f43pdvT4AwS',$,'SignalIndicatorType','Type of the indicators on a signal, e.g. route indicator, speed restriction indicator etc.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3430,$,$,$,.READWRITE.); -#3430=IFCPROPERTYENUMERATION('PEnum_SignalIndicatorType',(IFCLABEL('DEPARTUREINDICATOR'),IFCLABEL('DEPARTUREROUTEINDICATOR'),IFCLABEL('DERAILINDICATOR'),IFCLABEL('ROLLINGSTOCKSTOPINDICATOR'),IFCLABEL('ROUTEINDICATOR'),IFCLABEL('SHUNTINGINDICATOR'),IFCLABEL('SWITCHINDICATOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3431=IFCSIMPLEPROPERTYTEMPLATE('2ImSjGJuXDohHxlEKv6WN$',$,'LensDiffuserType','Type of the lens diffuser the signal is equipped with.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3432=IFCSIMPLEPROPERTYTEMPLATE('2pJRaGZ_r4Jwt4DQy2HaO4',$,'HasConductorRailGuardBoard','Indicates if a guard board is provided.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3433=IFCSIMPLEPROPERTYTEMPLATE('2_kPSvz2X4DRkq9LYOM3rx',$,'MaximumDisplayDistance','The maximum distance that can be displayed. The value relates only to the signal type, not to the circumstances at a special position.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3434=IFCSIMPLEPROPERTYTEMPLATE('2qCJn__v1F9Q9dDwX3nY3u',$,'RequiredDisplayDistance','The required distance that has to be displayed. The value relates only to the signal type, not to the circumstances at a special position.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3435=IFCSIMPLEPROPERTYTEMPLATE('38USEiTR18WO6PlhvBNw2J',$,'IsHighType','Indicates if the signal is high (TRUE) or dwarf (ground mounted) (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3436=IFCSIMPLEPROPERTYTEMPLATE('0CbRNJIFrBXvYbx7Ezis2n',$,'SignalHoodLength','Nominal length of the signal hood, which is the signal lamp cover against glaring sun.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3437=IFCSIMPLEPROPERTYTEMPLATE('2xArjwBqvDevHDIDOL51gU',$,'HotStripOrientation','Position of the hot strip, which indicates the direction of the focus of the light beam and is given in terms like "left upper quadrant (LUQ)" or "5 o''clock".',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3438=IFCSIMPLEPROPERTYTEMPLATE('1QVyemqTHDAQAUuggkptPz',$,'LensDiffuserOrientation','Orientation the lens diffuser has to have, which indicates the direction of the lens diffuser and is given in terms like "left upper quadrant (LUQ)" or "5 o''clock".',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3439=IFCSIMPLEPROPERTYTEMPLATE('1rjB9JGwL7yhCKWdsyXEI8',$,'NumberOfLamps','Number of lamps the signal is composed of.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3440=IFCSIMPLEPROPERTYTEMPLATE('32pY7lcGnDkQCUDzZoCTgQ',$,'SignalMessage','All possible message available at this signal, e.g. "3/4- display automatic blocking".',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3441=IFCSIMPLEPROPERTYTEMPLATE('0nP$4111jFmvHoYH$ap6JG',$,'RailwaySignalType','The type of railway signal, e.g. home signal, starting signal, shunting signal, level crossing signal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3442,$,$,$,.READWRITE.); -#3442=IFCPROPERTYENUMERATION('PEnum_RailwaySignalType',(IFCLABEL('APPROACHSIGNAL'),IFCLABEL('BLOCKSIGNAL'),IFCLABEL('DISTANTSIGNAL'),IFCLABEL('HOMESIGNAL'),IFCLABEL('HUMPAUXILIARYSIGANL'),IFCLABEL('HUMPSIGNAL'),IFCLABEL('LEVELCROSSINGSIGNAL'),IFCLABEL('OBSTRUCTIONSIGNAL'),IFCLABEL('REPEATINGSIGNAL'),IFCLABEL('SHUNTINGSIGNAL'),IFCLABEL('STARTINGSIGNAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3443=IFCPROPERTYSETTEMPLATE('0iuYELgd1DHQkmFwO6QJtY',$,'Pset_RailwayTrackStructurePart','Properties applicable to IfcRailwayPart with PredefinedType set to TRACKSTRUCTURE, or more specialized types including PLAINTRACKSUPERSTRUCTURE, TURNOUTSUPERSTRUCTURE or DILATATIONSUPERSTRUCTURE.',.PSET_OCCURRENCEDRIVEN.,'IfcRailwayPart/DILATATIONSUPERSTRUCTURE,IfcRailwayPart/PLAINTRACKSUPERSTRUCTURE,IfcRailwayPart/TRACKSTRUCTURE,IfcRailwayPart/TURNOUTSUPERSTRUCTURE',(#3444,#3445,#3446,#3447)); -#3444=IFCSIMPLEPROPERTYTEMPLATE('1ilgmCo8j7EOWSW8wAVNGq',$,'HasBallastTrack','Indicates whether the track has ballast or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3445=IFCSIMPLEPROPERTYTEMPLATE('0I$xFBjhz4YP9myqjReVLX',$,'HasCWR','Indicates if the track has continuous welded rails.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3446=IFCSIMPLEPROPERTYTEMPLATE('2blLReCtf7LhBcu73pUwHj',$,'IsSunExposed','Indicates if the object is in exposed position to sunshine.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3447=IFCSIMPLEPROPERTYTEMPLATE('1JyUTcmxz9uQPaWBq65z_E',$,'TrackSupportingStructure','Indicates the supporting structure for track part.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3448,$,$,$,.READWRITE.); -#3448=IFCPROPERTYENUMERATION('PEnum_TrackSupportingStructure',(IFCLABEL('BRIDGE'),IFCLABEL('CONCRETE'),IFCLABEL('ONSPECIALFOUNDATION'),IFCLABEL('PAVEMENT'),IFCLABEL('SUBGRADELAYER'),IFCLABEL('TRANSITIONSECTION'),IFCLABEL('TUNNEL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3449=IFCPROPERTYSETTEMPLATE('09tMnffqrCeeuO92LZN7Lf',$,'Pset_RampCommon','Properties common to the definition of all occurrences of IfcRamp.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRamp,IfcRampType',(#3450,#3451,#3453,#3454,#3455,#3456,#3457,#3458,#3459,#3460,#3461)); -#3450=IFCSIMPLEPROPERTYTEMPLATE('16z3qK0WP94AIBxpuNmkhp',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3451=IFCSIMPLEPROPERTYTEMPLATE('2StFnkz0z6qR4Ifkp5WQVr',$,'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',$,#3452,$,$,$,.READWRITE.); -#3452=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3453=IFCSIMPLEPROPERTYTEMPLATE('32acOncET1vhR_jDyD7lDi',$,'RequiredHeadroom','Required headroom clearance for the passageway according to the applicable building code or additional requirements.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3454=IFCSIMPLEPROPERTYTEMPLATE('2JlXk3uFP2WwylLMn0MRgV',$,'RequiredSlope','Required sloping angle of the object - relative to horizontal (0.0 degrees).\X2\000A\X0\Required maximum slope for the passageway according to the applicable building code or additional requirements.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#3455=IFCSIMPLEPROPERTYTEMPLATE('2c_taa53X4FhMmWa993yoJ',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. Set to (TRUE) if this object is rated as handicap accessible according the local building codes, otherwise (FALSE).\X2\000A\X0\It is giving according to the requirements of the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3456=IFCSIMPLEPROPERTYTEMPLATE('0Q42OU2Ev88QzOeXGA2Amh',$,'HasNonSkidSurface','Indication whether the surface finish is designed to prevent slippery (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3457=IFCSIMPLEPROPERTYTEMPLATE('0bgSzAYfnAnALSxv4uy9UK',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here it defines an exit ramp in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3458=IFCSIMPLEPROPERTYTEMPLATE('0mb4bWptf5AAqvySH9NM_k',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3459=IFCSIMPLEPROPERTYTEMPLATE('1K1wZmMy9668KbRc7ya9Ss',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#3460=IFCSIMPLEPROPERTYTEMPLATE('38h_xOppr8Kfj05FcWHfgV',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3461=IFCSIMPLEPROPERTYTEMPLATE('3XzjeuYMHDnwuJFYmh8oI3',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3462=IFCPROPERTYSETTEMPLATE('3mKn1ctar2ZAkWRU0__uqX',$,'Pset_RampFlightCommon','Properties common to the definition of all occurrences of IfcRampFlight.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRampFlight,IfcRampFlightType',(#3463,#3464,#3466,#3467,#3468,#3469)); -#3463=IFCSIMPLEPROPERTYTEMPLATE('1Wpbcn2nr0Iu67Pdo$p2rX',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3464=IFCSIMPLEPROPERTYTEMPLATE('3gIcGq009ASAYObzUD34jF',$,'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',$,#3465,$,$,$,.READWRITE.); -#3465=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3466=IFCSIMPLEPROPERTYTEMPLATE('1dJmaTOnz7tvG2WPzIu$SH',$,'Headroom','Actual headroom clearance for the passageway according to the current design.\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3467=IFCSIMPLEPROPERTYTEMPLATE('0r6Ar1CrL3jfJ7O9lerRie',$,'ClearWidth','The clear width.\X2\000A000A\X0\Measured as the clear space for accessibility and egress; it is a measured distance between the two handrails or the wall and a handrail on a ramp.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3468=IFCSIMPLEPROPERTYTEMPLATE('2uDwU50Iz4Uui7pvyBmiFH',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#3469=IFCSIMPLEPROPERTYTEMPLATE('3fL$u5d41AjxOjI0Bb0n99',$,'CounterSlope','Sloping angle of the object, measured perpendicular to the slope - relative to horizontal (0.0 degrees).\X2\000A\X0\Actual maximum slope for the passageway measured perpendicular to the direction of travel according to the current design. The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.\X2\000A\X0\Note: new property in IFC4.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#3470=IFCPROPERTYSETTEMPLATE('0tA8GAe1XEAf3lX1OvHSOD',$,'Pset_ReferentCommon','Specifies common properties for IfcReferent',.PSET_OCCURRENCEDRIVEN.,'IfcReferent',(#3471)); -#3471=IFCSIMPLEPROPERTYTEMPLATE('176h8GxJ5ELBU3MLjQiQ3b',$,'NameFormat','Specifies a reference to or description of the formatting or encoding of the Name attribute of the IfcReferent occurrence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3472=IFCPROPERTYSETTEMPLATE('1IVVhno710GxUN3MpDTd3U',$,'Pset_ReinforcementBarCountOfIndependentFooting','Reinforcement Concrete parameter [ST-2]: The amount number information of reinforcement bar with the independent footing. The X and Y direction are based on the local coordinate system of building storey. The X and Y direction of the reinforcement bar are parallel to the X and Y axis of the IfcBuildingStorey''s local coordinate system, respectively.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFooting,IfcFootingType',(#3473,#3474,#3475,#3476,#3477,#3478)); -#3473=IFCSIMPLEPROPERTYTEMPLATE('1TrUIOQ79FFxGCjjvqiC2N',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3474=IFCSIMPLEPROPERTYTEMPLATE('0WfTQho2T0Yw1OHKDYg3d4',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.\X2\000A000A\X0\A descriptive label for the general reinforcement type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3475=IFCSIMPLEPROPERTYTEMPLATE('3vsKiMu2bFygs2zpVpNzlr',$,'XDirectionLowerBarCount','The number of bars with X direction lower bar.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3476=IFCSIMPLEPROPERTYTEMPLATE('0dW2pqpeTBReepTXVxgLb1',$,'YDirectionLowerBarCount','The number of bars with Y direction lower bar.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3477=IFCSIMPLEPROPERTYTEMPLATE('0C5s8tVlz288rmzidd7veV',$,'XDirectionUpperBarCount','The number of bars with X direction upper bar.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3478=IFCSIMPLEPROPERTYTEMPLATE('0Y6h2cL2r0JwLK520FvjhL',$,'YDirectionUpperBarCount','The number of bars with Y direction upper bar.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3479=IFCPROPERTYSETTEMPLATE('25BiOyWD53WASQm0za0UYI',$,'Pset_ReinforcementBarPitchOfBeam','The pitch length information of reinforcement bar with the beam.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBeam,IfcBeamType',(#3480,#3481,#3482,#3483)); -#3480=IFCSIMPLEPROPERTYTEMPLATE('0K0mDCFRHCkuzTsHtIYdJF',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3481=IFCSIMPLEPROPERTYTEMPLATE('28ItmiLuzB5hzfabEgfbbH',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3482=IFCSIMPLEPROPERTYTEMPLATE('244phsM5T33fLyPEdxqv5J',$,'StirrupBarPitch','The pitch length of the stirrup bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3483=IFCSIMPLEPROPERTYTEMPLATE('2YOb69tuj4r8pLcr8ZYhdY',$,'SpacingBarPitch','The pitch length of the spacing bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3484=IFCPROPERTYSETTEMPLATE('0lmaeLn$f5x9Fi9wCYuznS',$,'Pset_ReinforcementBarPitchOfColumn','The pitch length information of reinforcement bar with the column. The X and Y direction are based on the local coordinate system of building storey. The X and Y direction of the reinforcement bar are parallel to the X and Y axis of the IfcBuildingStorey''s local coordinate system, respectively.',.PSET_TYPEDRIVENOVERRIDE.,'IfcColumn,IfcColumnType',(#3485,#3486,#3487,#3489,#3490,#3491,#3492,#3493)); -#3485=IFCSIMPLEPROPERTYTEMPLATE('1871G2fT55twc8Il_khqVu',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3486=IFCSIMPLEPROPERTYTEMPLATE('0SU66UcRf18QQG7XO3y_LR',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3487=IFCSIMPLEPROPERTYTEMPLATE('14F_dHN_nD3BxxyhD$QHC7',$,'ReinforcementBarType','Defines the type of the reinforcement bar.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3488,$,$,$,.READWRITE.); -#3488=IFCPROPERTYENUMERATION('PEnum_ReinforcementBarType',(IFCLABEL('RING'),IFCLABEL('SPIRAL'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); -#3489=IFCSIMPLEPROPERTYTEMPLATE('239a0tQKnDmBnNx5wQtz8G',$,'HoopBarPitch','The pitch length of the hoop bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3490=IFCSIMPLEPROPERTYTEMPLATE('23HSQwyGX9MBEJJC1Pygdn',$,'XDirectionTieHoopBarPitch','The X direction pitch length of the tie hoop.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3491=IFCSIMPLEPROPERTYTEMPLATE('1feNbvhVfAsOfX1amGm1UA',$,'XDirectionTieHoopCount','The number of bars with X direction tie hoop bars.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3492=IFCSIMPLEPROPERTYTEMPLATE('3exexwkVr15QjxVIN_UAOa',$,'YDirectionTieHoopBarPitch','The Y direction pitch length of the tie hoop.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3493=IFCSIMPLEPROPERTYTEMPLATE('3x31P1ejb4pPPVOIUA13bE',$,'YDirectionTieHoopCount','The number of bars with Y direction tie hoop bars.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3494=IFCPROPERTYSETTEMPLATE('2JJIgV8wjDuwuiIRHHF7Bv',$,'Pset_ReinforcementBarPitchOfContinuousFooting','Reinforcement Concrete parameter [ST-2]: The pitch length information of reinforcement bar with the continuous footing.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFooting,IfcFootingType',(#3495,#3496,#3497,#3498)); -#3495=IFCSIMPLEPROPERTYTEMPLATE('0GEP0Lik5AIAitVPaGLmdB',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3496=IFCSIMPLEPROPERTYTEMPLATE('3SiHj3Q8PCvej2cQEfp5yf',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3497=IFCSIMPLEPROPERTYTEMPLATE('3$sMzFB9bFTOeTFcC7em2B',$,'CrossingUpperBarPitch','The pitch length of the crossing upper bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3498=IFCSIMPLEPROPERTYTEMPLATE('3rZjC2ZqnBo8EPDO78Z1yZ',$,'CrossingLowerBarPitch','The pitch length of the crossing lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3499=IFCPROPERTYSETTEMPLATE('3uz9al$uHBAPamHqhOgsQ9',$,'Pset_ReinforcementBarPitchOfSlab','The pitch length information of reinforcement bar with the slab.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab,IfcSlabType',(#3500,#3501,#3502,#3503,#3504,#3505,#3506,#3507,#3508,#3509,#3510,#3511,#3512,#3513)); -#3500=IFCSIMPLEPROPERTYTEMPLATE('0Jae4RDPrFKuZdsogubzz5',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3501=IFCSIMPLEPROPERTYTEMPLATE('1lK7Tl8CvDSw9irLsqU9yA',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3502=IFCSIMPLEPROPERTYTEMPLATE('1Zt4viA0b8tPDKaSHR1u$$',$,'LongOutsideTopBarPitch','The pitch length of the long outside top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3503=IFCSIMPLEPROPERTYTEMPLATE('26Lb4Uv3b4HRYYqUyK4h8_',$,'LongInsideCenterTopBarPitch','The pitch length of the long inside center top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3504=IFCSIMPLEPROPERTYTEMPLATE('1FI6SA6fb6egjnsgMghare',$,'LongInsideEndTopBarPitch','The pitch length of the long inside end top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3505=IFCSIMPLEPROPERTYTEMPLATE('08UvSVPBbCdfXCxml0z0DB',$,'ShortOutsideTopBarPitch','The pitch length of the short outside top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3506=IFCSIMPLEPROPERTYTEMPLATE('1nhuSoXyjDggFkvVRB0WQY',$,'ShortInsideCenterTopBarPitch','The pitch length of the short inside center top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3507=IFCSIMPLEPROPERTYTEMPLATE('0mQVekt755ygt7pDF4tw2z',$,'ShortInsideEndTopBarPitch','The pitch length of the short inside end top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3508=IFCSIMPLEPROPERTYTEMPLATE('1Dp6BRPLXFcuXxs5xsoh1E',$,'LongOutsideLowerBarPitch','The pitch length of the long outside lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3509=IFCSIMPLEPROPERTYTEMPLATE('1apOl$4iH8VPPSezvlYyXk',$,'LongInsideCenterLowerBarPitch','The pitch length of the long inside center lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3510=IFCSIMPLEPROPERTYTEMPLATE('0UDpr3jlr2yeTieBucn_Qs',$,'LongInsideEndLowerBarPitch','The pitch length of the long inside end lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3511=IFCSIMPLEPROPERTYTEMPLATE('3DXWgQTLH01B$ZX_78CQyG',$,'ShortOutsideLowerBarPitch','The pitch length of the short outside lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3512=IFCSIMPLEPROPERTYTEMPLATE('0taRn7q$v0tBZoiDu50tXk',$,'ShortInsideCenterLowerBarPitch','The pitch length of the short inside center lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3513=IFCSIMPLEPROPERTYTEMPLATE('14EGvonFXDlxGYQPmBEz7C',$,'ShortInsideEndLowerBarPitch','The pitch length of the short inside end lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3514=IFCPROPERTYSETTEMPLATE('2bS03joRT3gxbJQRMJQQiy',$,'Pset_ReinforcementBarPitchOfWall','The pitch length information of reinforcement bar with the wall.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWall,IfcWallType',(#3515,#3516,#3517,#3519,#3520,#3521)); -#3515=IFCSIMPLEPROPERTYTEMPLATE('0f27unQq1FtRczrvSzyCSm',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3516=IFCSIMPLEPROPERTYTEMPLATE('3nj_78$1T0I8J0O1wZC6p_',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3517=IFCSIMPLEPROPERTYTEMPLATE('3tXfMI3CP04fiIqa13qjzC',$,'BarAllocationType','Defines the type of the reinforcement bar allocation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3518,$,$,$,.READWRITE.); -#3518=IFCPROPERTYENUMERATION('PEnum_ReinforcementBarAllocationType',(IFCLABEL('ALTERNATE'),IFCLABEL('DOUBLE'),IFCLABEL('SINGLE'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); -#3519=IFCSIMPLEPROPERTYTEMPLATE('1$r_RT4mL01eKAVhnMsZM5',$,'VerticalBarPitch','The pitch length of the vertical bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3520=IFCSIMPLEPROPERTYTEMPLATE('0asdHBgeLDpBj4cwAwfuof',$,'HorizontalBarPitch','The pitch length of the horizontal bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3521=IFCSIMPLEPROPERTYTEMPLATE('0dAe79dSv6nOpw0y$elrmA',$,'SpacingBarPitch','The pitch length of the spacing bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3522=IFCPROPERTYSETTEMPLATE('01gf2rxSX8sBk9_jbxeO$c',$,'Pset_RepairOccurrence','Properties defining repair information for occurrences of element, asset or system.',.PSET_OCCURRENCEDRIVEN.,'IfcAsset,IfcElement,IfcSystem',(#3523,#3524,#3525)); -#3523=IFCSIMPLEPROPERTYTEMPLATE('1Yw568S5r2oQDqSXtykhIy',$,'RepairContent','Content of repair, reason and nature can be given, e.g. display faults, communication failure, display exchange.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3524=IFCSIMPLEPROPERTYTEMPLATE('0AyfqBhIPBovpAkAJkm5E0',$,'RepairDate','Date on which the last repair is done on the asset.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#3525=IFCSIMPLEPROPERTYTEMPLATE('242wu_52j3Jx13_6cdMSO7',$,'MeanTimeToRepair','Mean time to repair.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3526=IFCPROPERTYSETTEMPLATE('3Vc_DaG9rBWP3KCV7Le3Ae',$,'Pset_RevetmentCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to REVETMENT.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/REVETMENT',(#3527,#3528)); -#3527=IFCSIMPLEPROPERTYTEMPLATE('0vTAuBW0L4YQnml0ZeXzhZ',$,'StructuralType','Structural type of the object',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3528=IFCSIMPLEPROPERTYTEMPLATE('3p_fDEKxv4pv1E_rNo9Vqx',$,'Elevation','Elevation of the entity',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3529=IFCPROPERTYSETTEMPLATE('3cEnM7b9LA$g51Yf$zU1xF',$,'Pset_Risk','An indication of exposure to mischance, peril, menace, hazard or loss. Documentation of a potential hazard, likilihood and consequence aligned with AS/NZS 4360 and BS PAS 1192-6:2017, which can be assigned to or associated with a product, activity and/or location. Alternatively it may be assigned to an ISO 3864 annotation symbol.HISTORY Extended in IFC2x3, Revised IFC4x3There are various types of risk that may be encountered and there may be several instances of Pset_Risk associated to an instance or type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcGroup,IfcProcess,IfcProduct,IfcTypeProcess,IfcTypeProduct',(#3530,#3531,#3533,#3534,#3535,#3537,#3539,#3541,#3542,#3544,#3546,#3548,#3549,#3550,#3551)); -#3530=IFCSIMPLEPROPERTYTEMPLATE('2P12m1MIP3E8sz9XjAk12a',$,'RiskName','A locally unique identifier for the risk entry that can be used to track the development and mitiagtion of the risk throughout the project life cycle',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3531=IFCSIMPLEPROPERTYTEMPLATE('3bdVtb1o106QdmFsRgxAtN',$,'RiskType','Identifies the predefined types of risk from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3532,$,$,$,.READWRITE.); -#3532=IFCPROPERTYENUMERATION('PEnum_RiskType',(IFCLABEL('ASBESTOSEFFECTS'),IFCLABEL('ASPHIXIATION'),IFCLABEL('BUSINESS'),IFCLABEL('BUSINESSISSUES'),IFCLABEL('CHEMICALEFFECTS'),IFCLABEL('COMMERICALISSUES'),IFCLABEL('CONFINEMENT'),IFCLABEL('CRUSHING'),IFCLABEL('DROWNINGANDFLOODING'),IFCLABEL('ELECTRICSHOCK'),IFCLABEL('ENVIRONMENTALISSUES'),IFCLABEL('EVENT'),IFCLABEL('FALL'),IFCLABEL('FALLEDGE'),IFCLABEL('FALLFRAGILEMATERIAL'),IFCLABEL('FALLSCAFFOLD'),IFCLABEL('FALL_LADDER'),IFCLABEL('FIRE_EXPLOSION'),IFCLABEL('HANDLING'),IFCLABEL('HAZARD'),IFCLABEL('HAZARDOUSDUST'),IFCLABEL('HEALTHANDSAFETY'),IFCLABEL('HEALTHISSUE'),IFCLABEL('INSURANCE'),IFCLABEL('INSURANCE_ISSUES'),IFCLABEL('LEADEFFECTS'),IFCLABEL('MACHINERYGUARDING'),IFCLABEL('MATERIALEFFECTS'),IFCLABEL('MATERIALSHANDLING'),IFCLABEL('MECHANICALEFFECTS'),IFCLABEL('MECHANICAL_LIFTING'),IFCLABEL('MOBILE_ELEVATEDWORKPLATFORM'),IFCLABEL('NOISE_EFFECTS'),IFCLABEL('OPERATIONALISSUES'),IFCLABEL('OTHERISSUES'),IFCLABEL('OVERTURINGPLANT'),IFCLABEL('PUBLICPROTECTIONISSUES'),IFCLABEL('SAFETYISSUE'),IFCLABEL('SILICADUST'),IFCLABEL('SLIPTRIP'),IFCLABEL('SOCIALISSUES'),IFCLABEL('STRUCK'),IFCLABEL('STRUCKFALLINFOBJECT'),IFCLABEL('STRUCKVEHICLE'),IFCLABEL('TOOLUSAGE'),IFCLABEL('TRAPPED'),IFCLABEL('UNINTENDEDCOLLAPSE'),IFCLABEL('VIBRATION'),IFCLABEL('WELFAREISSUE'),IFCLABEL('WOODDUST'),IFCLABEL('WORKINGOVERHEAD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3533=IFCSIMPLEPROPERTYTEMPLATE('1S09wrB5H1XuuUg1ZeL75_',$,'NatureOfRisk','A description of the generic nature of the context or hazard that might be encountered.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3534=IFCSIMPLEPROPERTYTEMPLATE('292CI6FNP6Fv5VZRTMAKgq',$,'RiskAssessmentMethodology','An indication or link to the chosen risk assessment methodology, for example PAS1192-6 or a chosen ISO13100 annex.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3535=IFCSIMPLEPROPERTYTEMPLATE('1vyZ9V1$TB0AG0wxo0eEVD',$,'UnmitigatedRiskLikelihood','Identifies the likelihood of the hazard prior to any specific mitigation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3536,$,$,$,.READWRITE.); -#3536=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3537=IFCSIMPLEPROPERTYTEMPLATE('00cDNj5N5FDfRk2HQN7WXL',$,'UnmitigatedRiskConsequence','Identifies the consequence of the hazard prior to any specific mitigation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3538,$,$,$,.READWRITE.); -#3538=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3539=IFCSIMPLEPROPERTYTEMPLATE('0kUeRinZH5mwtZZW2TJqt8',$,'UnmitigatedRiskSignificance','Identifies the signifiance of the risk given the likelihood and consequence prior to any specific mitigation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3540,$,$,$,.READWRITE.); -#3540=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3541=IFCSIMPLEPROPERTYTEMPLATE('2mKLRc38f8txLNgzq04dRU',$,'MitigationPlanned','The planned (agreed and irrevocable) mitigation of the likelhood and consequences of the hazard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3542=IFCSIMPLEPROPERTYTEMPLATE('1jHMv4eVL4cfkEB0jxr9$S',$,'MitigatedRiskLikelihood','Identifies the likelihood of the hazard given the planned mitigation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3543,$,$,$,.READWRITE.); -#3543=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3544=IFCSIMPLEPROPERTYTEMPLATE('1G$Lo_uyrCnPGIPPGoFkr7',$,'MitigatedRiskConsequence','Identifies the consequence of the hazard given the planned mitigation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3545,$,$,$,.READWRITE.); -#3545=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3546=IFCSIMPLEPROPERTYTEMPLATE('2y$yI8RPT5a80sfyl$FWxJ',$,'MitigatedRiskSignificance','Identifies the signifiance of the risk given the mitigation of likelihood and consequence.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3547,$,$,$,.READWRITE.); -#3547=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3548=IFCSIMPLEPROPERTYTEMPLATE('2v3xOI0eL1SxEJrSEtSVGj',$,'MitigationProposed','Any proposed, but not yet agreed and irrevocable, mitigation of the likelhood and consequences of the hazard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3549=IFCSIMPLEPROPERTYTEMPLATE('3pED_gvAr1aAwoDZ$T6onx',$,'AssociatedProduct','An indication or link to any associated product or material that may trigger the hazard. If used directly on an annotation or semantic object. for an alternative see group use encoding template',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3550=IFCSIMPLEPROPERTYTEMPLATE('1pWPhZsqzAGA7tU6y5mq_c',$,'AssociatedActivity','An indication or link to any associated activity or process that may trigger the hazard. If used directly on an annotation or semantic object. for an alternative see group use encoding template',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3551=IFCSIMPLEPROPERTYTEMPLATE('2IyR_AMejBk9MByKY_oDTr',$,'AssociatedLocation','An indication or link to any associated location or space that may trigger the hazard. If used directly on an annotation or semantic object. for an alternative see group use encoding template',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3552=IFCPROPERTYSETTEMPLATE('3fZ8ADXI13J8ONCwlaO9o2',$,'Pset_RoadDesignCriteriaCommon','Road design criteria that may be attached to road parts.',.PSET_OCCURRENCEDRIVEN.,'IfcFacilityPartCommon/JUNCTION,IfcFacilityPartCommon/LEVELCROSSING,IfcFacilityPartCommon/SEGMENT,IfcRoadPart/BICYCLECROSSING,IfcRoadPart/INTERSECTION,IfcRoadPart/PEDESTRIAN_CROSSING,IfcRoadPart/RAILWAYCROSSING,IfcRoadPart/ROADSEGMENT,IfcRoadPart/ROUNDABOUT,IfcRoadPart/TOLLPLAZA,IfcRoad',(#3553,#3554,#3555,#3556,#3557,#3558,#3559)); -#3553=IFCSIMPLEPROPERTYTEMPLATE('38Wrdy7V5DwungCNZeuRe5',$,'Crossfall','Specifies the nominal crossfall as a ratio measure (slope) at the location of the event.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3554=IFCSIMPLEPROPERTYTEMPLATE('2ZXk24uG5ELfakV_syaR85',$,'DesignSpeed','Speed selected in designing a new road or in modernizing, strengthening or rehabilitating an existing road section, to determine the various geometric design features of the carriageway that allow a car to travel safely at that speed, under normal road surface and weather conditions.NOTE Definition according to PIARC.\X2\000A\X0\NOTE The design speed is not constant, but may vary depending on the conditions of relief (plain, hill, mountain).',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3555=IFCSIMPLEPROPERTYTEMPLATE('1s4AB8y9nCnR8r$gdyyQr6',$,'DesignTrafficVolume','The traffic volume used for planning and design purposes specified as the number of vehicles per day . Typically given as AADT - Average Annual Daily Traffic',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3556=IFCSIMPLEPROPERTYTEMPLATE('3QOj3bISHDFv6aOkXPc$$Z',$,'DesignVehicleClass','A vehicle designator with content according to local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3557=IFCSIMPLEPROPERTYTEMPLATE('1qQyUwrBzDyh6CMpgqi7wF',$,'LaneWidth','Standard nominal width of one trough lane.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3558=IFCSIMPLEPROPERTYTEMPLATE('0wNHVTLwfFWQS6cqflTqiz',$,'NumberOfThroughLanes','The total number of through lanes on the segment. This excludes auxiliary lanes, parking and turning lanes, acceleration/deceleration lanes, toll collection lanes, shoulders etc.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3559=IFCSIMPLEPROPERTYTEMPLATE('3rsVBpqiXE2QaFihLAdthT',$,'RoadDesignClass','A road design class designator with content according to local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3560=IFCPROPERTYSETTEMPLATE('3sCKi$b8bF7wO_tsMNiDnJ',$,'Pset_RoadGuardElement','Properties assigned to IfcWall/PARAPET or IfcRailing/GUARDRAIL when assigned as road guard elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRailing/GUARDRAIL,IfcWall/PARAPET,IfcRailingType/GUARDRAIL,IfcWallType/PARAPET',(#3561,#3562,#3563,#3564)); -#3561=IFCSIMPLEPROPERTYTEMPLATE('2F4oMarq9DKQUL7AmUvq3x',$,'IsMoveable','True if element is moveable.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3562=IFCSIMPLEPROPERTYTEMPLATE('1kqoOMCo1CQvEAzQkgInT5',$,'IsTerminal','True if element is a terminal. See class Terminal.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3563=IFCSIMPLEPROPERTYTEMPLATE('2ebuU_tuXERvnq1Eg3ZwWq',$,'IsTransition','True if element is a transition. See class Transition.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3564=IFCSIMPLEPROPERTYTEMPLATE('3s0lVdprv3eAONS8CIhdBq',$,'TerminalType','Specifies the kind of terminal if IsTerminal is true.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3565=IFCPROPERTYSETTEMPLATE('34r24KIdX7Hv4hpvePN3bH',$,'Pset_RoadMarkingCommon','Properties for road markings.',.PSET_OCCURRENCEDRIVEN.,'IfcSurfaceFeature/HATCHMARKING,IfcSurfaceFeature/LINEMARKING,IfcSurfaceFeature/PAVEMENTSURFACEMARKING,IfcSurfaceFeature/SYMBOLMARKING',(#3566,#3567,#3568,#3569,#3570,#3571)); -#3566=IFCSIMPLEPROPERTYTEMPLATE('1JOjiVz_TFrxqROa4S5rTV',$,'ApplicationMethod','State the application method used... e.g. spray, extruded',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3567=IFCSIMPLEPROPERTYTEMPLATE('0ozX5CuSrEifWH6gXbVD5u',$,'DiagramNumber','A designator with content according to local standards, e.g. M25.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3568=IFCSIMPLEPROPERTYTEMPLATE('2WgktAiSP8DvtF5Vkan9YN',$,'MaterialColour','Actual colour on the road marking material',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3569=IFCSIMPLEPROPERTYTEMPLATE('0UHmIKDWzBkOTbMkKzEBnx',$,'MaterialThickness','Nominal thickness of the applied material',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3570=IFCSIMPLEPROPERTYTEMPLATE('1$L0aztXz9nglOYn0pav8Y',$,'MaterialType','Material type used... e.g. paint, tape, thermoplastic, stone',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3571=IFCSIMPLEPROPERTYTEMPLATE('21Vvn1Gnr5dAFDMA00Hnt$',$,'Structure','State if marking is Structured or not, and what type... e.g. Kamflex, Longflex, Dropflex',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3572=IFCPROPERTYSETTEMPLATE('2HzyPHNqD5RwV8Qdk5qka5',$,'Pset_RoadSymbolsCommon','Properties for road symbols.',.PSET_OCCURRENCEDRIVEN.,'IfcSurfaceFeature/SYMBOLMARKING',(#3573,#3574)); -#3573=IFCSIMPLEPROPERTYTEMPLATE('32KzMJb3DDSu0KakOdzBg7',$,'Text','Text content',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3574=IFCSIMPLEPROPERTYTEMPLATE('2BmkdPnJn4Cu51T1ZYe2M8',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3575=IFCPROPERTYSETTEMPLATE('2MK0ZcDxz6f8KSc38BjrUh',$,'Pset_RoofCommon','Properties common to the definition of all occurrences of IfcRoof. Note: Properties for ProjectedArea and TotalArea added in IFC 2x3',.PSET_TYPEDRIVENOVERRIDE.,'IfcRoof,IfcRoofType',(#3576,#3577,#3579,#3580,#3581,#3582,#3583)); -#3576=IFCSIMPLEPROPERTYTEMPLATE('0QBAO3uSX7BO5VR5wNcd3_',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3577=IFCSIMPLEPROPERTYTEMPLATE('0poTEq8Lz8dRoTQpfdHlgE',$,'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',$,#3578,$,$,$,.READWRITE.); -#3578=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3579=IFCSIMPLEPROPERTYTEMPLATE('2woLwsp3rFUf3EA9j5qU6I',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3580=IFCSIMPLEPROPERTYTEMPLATE('1HzJSslXD8VvxDGiUupw6o',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3581=IFCSIMPLEPROPERTYTEMPLATE('0a5Ap5JzH4EvBa8dY9VHGD',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#3582=IFCSIMPLEPROPERTYTEMPLATE('3$gM1$UH9A2w29MUH9Hoeo',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3583=IFCSIMPLEPROPERTYTEMPLATE('01oljf6EnDgeuspLC1XrC4',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3584=IFCPROPERTYSETTEMPLATE('2l$wFhX_b1kg5HJkTERUpB',$,'Pset_SanitaryTerminalTypeBath','Sanitary appliance for immersion of the human body or parts of it (BS6100). HISTORY: In IFC4, Material and MaterialThickness properties removed. Use materials capabilities from IfcMaterialsResource schema. Datatype of color changed to IfcLabel (still a string value)',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/BATH,IfcSanitaryTerminalType/BATH',(#3585,#3587,#3588)); -#3585=IFCSIMPLEPROPERTYTEMPLATE('1wQAbwVfTAiupYnsuDy1Wm',$,'BathType','The property enumeration defines the types of bath that may be specified within the property set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3586,$,$,$,.READWRITE.); -#3586=IFCPROPERTYENUMERATION('PEnum_BathType',(IFCLABEL('DOMESTIC'),IFCLABEL('FOOT'),IFCLABEL('PLUNGE'),IFCLABEL('POOL'),IFCLABEL('SITZ'),IFCLABEL('SPA'),IFCLABEL('TREATMENT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3587=IFCSIMPLEPROPERTYTEMPLATE('0p_Uweoy9FDuW9sXXTyqyR',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3588=IFCSIMPLEPROPERTYTEMPLATE('2uKUYYV0X6EAr3rOr_AWJG',$,'HasGrabHandles','Indicates whether the bath is fitted with handles that provide assistance to a bather in entering or leaving the bath.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3589=IFCPROPERTYSETTEMPLATE('0uUrEOtAL72wuYXX7RVgwM',$,'Pset_SanitaryTerminalTypeBidet','Waste water appliance for washing the excretory organs while sitting astride the bowl (BS6100). HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialsResource schema. Datatype of color changed to IfcLabel (still a string value). BidetMounting changed to Mounting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/BIDET,IfcSanitaryTerminalType/BIDET',(#3590,#3592,#3593)); -#3590=IFCSIMPLEPROPERTYTEMPLATE('073DdpJ7T0T8UXMTo0aoyk',$,'Mounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.Note that BackToWall, Pedestal and WallHung are allowable values for a bidet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3591,$,$,$,.READWRITE.); -#3591=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3592=IFCSIMPLEPROPERTYTEMPLATE('2P4d1U0d18zf1ZOjXy2tGp',$,'SpilloverLevel','The level at which water spills out of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3593=IFCSIMPLEPROPERTYTEMPLATE('2bll0ib1r4XxSnLV$ZeaQQ',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3594=IFCPROPERTYSETTEMPLATE('3c6qNh_t5D_ATQHWWErFy1',$,'Pset_SanitaryTerminalTypeCistern','A water storage unit attached to a sanitary terminal that is fitted with a device, operated automatically or by the user, that discharges water to cleanse a water closet (toilet) pan, urinal or slop hopper. (BS6100 330 5008)',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/CISTERN,IfcSanitaryTerminalType/CISTERN',(#3595,#3597,#3598,#3599,#3601,#3602)); -#3595=IFCSIMPLEPROPERTYTEMPLATE('1ZFUANHozDsOt9DK2W8WMD',$,'CisternHeight','Enumeration that identifies the height of the cistern or, if set to ''None'' if the urinal has no cistern and is flushed using mains or high pressure water through a flushing valve.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3596,$,$,$,.READWRITE.); -#3596=IFCPROPERTYENUMERATION('PEnum_CisternHeight',(IFCLABEL('HIGHLEVEL'),IFCLABEL('LOWLEVEL'),IFCLABEL('NONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3597=IFCSIMPLEPROPERTYTEMPLATE('3xzwijamj9$eFOc33BW_p$',$,'CisternCapacity','Volumetric capacity of the cistern',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3598=IFCSIMPLEPROPERTYTEMPLATE('1r4yyVHubAHwyrf6PodTr9',$,'IsSingleFlush','Indicates whether the cistern is single flush = TRUE (i.e. the same amount of water is used for each and every flush) or dual flush = FALSE (i.e. the amount of water used for a flush may be selected by the user to be high or low depending on the waste material to be removed).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3599=IFCSIMPLEPROPERTYTEMPLATE('1kvVEiDkLBIA$cphzOni$B',$,'FlushType','The property enumeration Pset_FlushTypeEnum defines the types of flushing mechanism that may be specified for cisterns and sanitary terminals where:-Lever: Flushing is achieved by twisting a lever that causes a predetermined flow of water to be passed from a cistern to the sanitary terminal.\X2\000A\X0\Pull: Flushing is achieved by pulling a handle or knob vertically upwards that causes a predetermined flow of water to be passed from a cistern to the sanitary terminal.\X2\000A\X0\Push: Flushing is achieved by pushing a button or plate that causes a predetermined flow of water to be passed from a cistern to the sanitary terminal.\X2\000A\X0\Sensor: Flush is activated through an automatic sensing mechanism.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3600,$,$,$,.READWRITE.); -#3600=IFCPROPERTYENUMERATION('PEnum_FlushType',(IFCLABEL('LEVER'),IFCLABEL('PULL'),IFCLABEL('PUSH'),IFCLABEL('SENSOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3601=IFCSIMPLEPROPERTYTEMPLATE('29DwOoRv57DxQ7Mvqu_FJ8',$,'FlushRate','The minimum and maximum volume of water used at each flush. Where a single flush is used, the value of upper bound and lower bound should be equal. For a dual flush toilet, the lower bound should be used for the lesser flush rate and the upper bound for the greater flush rate. Where flush is achieved using mains pressure water through a flush valve, the value of upper and lower bound should be equal and should be the same as the flush rate property of the flush valve (see relevant valve property set). Alternatively, in this case, do not assert the flush rate property; refer to the flush rate of the flush valve.',.P_BOUNDEDVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3602=IFCSIMPLEPROPERTYTEMPLATE('3VB9rxejPEjhCUK$PxMDeM',$,'IsAutomaticFlush','Boolean value that determines if the cistern is flushed automatically either after each use or periodically (TRUE) or whether manual flushing is required (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3603=IFCPROPERTYSETTEMPLATE('0tufoANdbBKwYZRMaFUTgX',$,'Pset_SanitaryTerminalTypeCommon','Common properties for sanitary terminals.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal,IfcSanitaryTerminalType',(#3604,#3605,#3607,#3608,#3609,#3610)); -#3604=IFCSIMPLEPROPERTYTEMPLATE('3cucqQfLjC5wvdbORXpf6r',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3605=IFCSIMPLEPROPERTYTEMPLATE('1d4Ht2OKDBhOeE5bfubXH5',$,'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',$,#3606,$,$,$,.READWRITE.); -#3606=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3607=IFCSIMPLEPROPERTYTEMPLATE('2JTINRoyX8GQ8qOf6F4$Fy',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3608=IFCSIMPLEPROPERTYTEMPLATE('1VO_ewPCnAufyWEnviD3Ra',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3609=IFCSIMPLEPROPERTYTEMPLATE('2Us3pSIF1E0BQugRaFsC2h',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3610=IFCSIMPLEPROPERTYTEMPLATE('1o6jPmq8n85hDGMap9J7rw',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3611=IFCPROPERTYSETTEMPLATE('3t53W1L9n7KfGD0Ehf5OzP',$,'Pset_SanitaryTerminalTypeSanitaryFountain','Asanitary terminal that provides a low pressure jet of water for a specific purpose (IAI). HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialsResource schema. Datatype of color changed to IfcLabel (still a string value).',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/SANITARYFOUNTAIN,IfcSanitaryTerminalType/SANITARYFOUNTAIN',(#3612,#3614,#3616)); -#3612=IFCSIMPLEPROPERTYTEMPLATE('1$6p7jtxH5D9R3HIkbxMtu',$,'FountainType','Selection of the type of fountain from the enumerated list of types where:-DrinkingWater: Sanitary appliance that provides a low pressure jet of drinking water.\X2\000A\X0\Eyewash: Waste water appliance, usually installed in work places where there is a risk of injury to eyes by solid particles or dangerous liquids, with which the user can wash the eyes without touching them.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3613,$,$,$,.READWRITE.); -#3613=IFCPROPERTYENUMERATION('PEnum_FountainType',(IFCLABEL('DRINKINGWATER'),IFCLABEL('EYEWASH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3614=IFCSIMPLEPROPERTYTEMPLATE('0csl4IUIHF$gSRV0fZlbMi',$,'Mounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.Note that BackToWall, Pedestal and WallHung are allowable values for a bidet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3615,$,$,$,.READWRITE.); -#3615=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3616=IFCSIMPLEPROPERTYTEMPLATE('3X3ifEiMnFQPf60sLkh2t0',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3617=IFCPROPERTYSETTEMPLATE('1GN2Yloi1EUeSU3GU3CIwy',$,'Pset_SanitaryTerminalTypeShower','Installation or waste water appliance that emits a spray of water to wash the human body (BS6100). HISTORY: In IFC4, Material and MaterialThickness properties removed. Use materials capabilities from IfcMaterialsResource schema. Datatype of color changed to IfcLabel (still a string value)',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/SHOWER,IfcSanitaryTerminalType/SHOWER',(#3618,#3620,#3621,#3622)); -#3618=IFCSIMPLEPROPERTYTEMPLATE('2cUY3HfM9AlBpekfHjIPDq',$,'ShowerType','Selection of the type of shower from the enumerated list of types where:-Drench: Shower that rapidly gives a thorough soaking in an emergency.\X2\000A\X0\Individual: Shower unit that is typically enclosed and is for the use of one person at a time.\X2\000A\X0\Tunnel: Shower that has a succession of shower heads or spreaders that operate simultaneously along its length.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3619,$,$,$,.READWRITE.); -#3619=IFCPROPERTYENUMERATION('PEnum_ShowerType',(IFCLABEL('DRENCH'),IFCLABEL('INDIVIDUAL'),IFCLABEL('TUNNEL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3620=IFCSIMPLEPROPERTYTEMPLATE('1w8ubTeZr2jOLL$3WitvJe',$,'HasTray','Indicates whether the shower has a separate receptacle that catches the water in a shower and directs it to a waste outlet.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3621=IFCSIMPLEPROPERTYTEMPLATE('33wOW$TFb6mwcgswUzQads',$,'ShowerHeadDescription','A description of the shower head(s) that emit the spray of water.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#3622=IFCSIMPLEPROPERTYTEMPLATE('3jjYRJaWnAgOIivETfcQlo',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3623=IFCPROPERTYSETTEMPLATE('06gMNeiTb3zAI2M7qboDFv',$,'Pset_SanitaryTerminalTypeSink','Waste water appliance for receiving, retaining or disposing of domestic, culinary, laboratory or industrial process liquids. HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialsResource schema. Datatype of color changed to IfcLabel (still a string value). SinkMounting changed to Mounting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/SINK,IfcSanitaryTerminalType/SINK',(#3624,#3626,#3628,#3629,#3630)); -#3624=IFCSIMPLEPROPERTYTEMPLATE('1RJZiex0X59flPRdm3E5SZ',$,'SinkType','Selection of the type of sink from the enumerated list of types where:-Belfast: Deep sink that has a plain edge and a weir overflow\X2\000A\X0\.\X2\000A\X0\Bucket: Sink at low level, with protected front edge, that facilitates filling and emptying buckets, usually with a hinged grid on which to stand them.\X2\000A\X0\Cleaners: Sink, usually fixed at normal height (900mm), with protected front edge.\X2\000A\X0\Combination_Left: Sink with integral drainer on left hand side\X2\000A\X0\.\X2\000A\X0\Combination_Right: Sink with integral drainer on right hand side\X2\000A\X0\.\X2\000A\X0\Combination_Double: Sink with integral drainer on both sides\X2\000A\X0\.\X2\000A\X0\Drip: Small sink that catches drips or flow from a faucet\X2\000A\X0\.\X2\000A\X0\Laboratory: Sink, of acid resisting material, with a top edge shaped to facilitate fixing to the underside of a desktop\X2\000A\X0\.\X2\000A\X0\London: Deep sink that has a plain edge and no overflow\X2\000A\X0\.\X2\000A\X0\Plaster: Sink with sediment receiver to prevent waste plaster passing into drains\X2\000A\X0\.\X2\000A\X0\Pot: Large metal sink, with a standing waste, for washing cooking utensils\X2\000A\X0\.\X2\000A\X0\Rinsing: Metal sink in which water can be heated and culinary utensils and tableware immersed at high temperature that destroys most harmful bacteria and allows subsequent self drying.\X2\000A\X0\.\X2\000A\X0\Shelf: Ceramic sink with an integral back shelf through which water fittings are mounted\X2\000A\X0\.\X2\000A\X0\VegetablePreparation: Large metal sink, with a standing waste, for washing and preparing vegetables\X2\000A\X0\.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3625,$,$,$,.READWRITE.); -#3625=IFCPROPERTYENUMERATION('PEnum_SinkType',(IFCLABEL('BELFAST'),IFCLABEL('BUCKET'),IFCLABEL('CLEANERS'),IFCLABEL('COMBINATION_DOUBLE'),IFCLABEL('COMBINATION_LEFT'),IFCLABEL('COMBINATION_RIGHT'),IFCLABEL('DRIP'),IFCLABEL('LABORATORY'),IFCLABEL('LONDON'),IFCLABEL('PLASTER'),IFCLABEL('POT'),IFCLABEL('RINSING'),IFCLABEL('SHELF'),IFCLABEL('VEGETABLEPREPARATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3626=IFCSIMPLEPROPERTYTEMPLATE('3OyBi$UN9Ah9uhuhXaf3TI',$,'Mounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.Note that BackToWall, Pedestal and WallHung are allowable values for a bidet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3627,$,$,$,.READWRITE.); -#3627=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3628=IFCSIMPLEPROPERTYTEMPLATE('0RSFw3ZVL2Dh3x$UbHYOcA',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3629=IFCSIMPLEPROPERTYTEMPLATE('3PW7onFRr5P9IU9OVprK5r',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3630=IFCSIMPLEPROPERTYTEMPLATE('1hMbi$$KH4FP_fGeWphZz9',$,'MountingOffset','For counter top mounted basins the vertical offset between the top of the sink and the counter top.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3631=IFCPROPERTYSETTEMPLATE('1UiZDtxsX5ZO3Q$NHbhA4c',$,'Pset_SanitaryTerminalTypeToiletPan','Soil appliance for the disposal of excrement. HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialsResource schema. Prefix for color property removed. Datatype of color changed to IfcLabel (still a string value).',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/TOILETPAN,IfcSanitaryTerminalType/TOILETPAN',(#3632,#3634,#3636,#3638)); -#3632=IFCSIMPLEPROPERTYTEMPLATE('3HAwuGZrTCfRzQHC1ifndG',$,'ToiletType','Enumeration that defines the types of toilet (water closet) arrangements that may be specified where:-BedPanWasher: Enclosed soil appliance in which bedpans and urinal bottles are emptied and cleansed.\X2\000A\X0\Chemical: Portable receptacle or soil appliance that receives and retains excrement in either an integral or a separate container, in which it is chemically treated and from which it has to be emptied periodically.\X2\000A\X0\CloseCoupled: Toilet suite in which a flushing cistern is connected directly to the water closet pan.\X2\000A\X0\LooseCoupled: Toilet arrangement in which a flushing cistern is connected to the water closet pan through a flushing pipe.\X2\000A\X0\SlopHopper: Hopper shaped soil appliance with a flushing rim and outlet similar to those of a toilet pan, into which human excrement is emptied for disposal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3633,$,$,$,.READWRITE.); -#3633=IFCPROPERTYENUMERATION('PEnum_ToiletType',(IFCLABEL('BEDPANWASHER'),IFCLABEL('CHEMICAL'),IFCLABEL('CLOSECOUPLED'),IFCLABEL('LOOSECOUPLED'),IFCLABEL('SLOPHOPPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3634=IFCSIMPLEPROPERTYTEMPLATE('2uRrNFiNTETxmjakH95pAQ',$,'ToiletPanType','The property enumeration Pset_ToiletPanTypeEnum defines the types of toilet pan that may be specified within the property set Pset_Toilet:-Siphonic: Toilet pan in which excrement is removed by siphonage induced by the flushing water.\X2\000A\X0\Squat: Toilet pan with an elongated bowl installed with its top edge at or near floor level, so that the user has to squat.\X2\000A\X0\WashDown: Toilet pan in which excrement is removed by the momentum of the flushing water.\X2\000A\X0\WashOut: A washdown toilet pan in which excrement falls first into a shallow water filled bowl.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3635,$,$,$,.READWRITE.); -#3635=IFCPROPERTYENUMERATION('PEnum_ToiletPanType',(IFCLABEL('SIPHONIC'),IFCLABEL('SQUAT'),IFCLABEL('WASHDOWN'),IFCLABEL('WASHOUT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3636=IFCSIMPLEPROPERTYTEMPLATE('2WVG61lN1AO9NYlbY6Ej7k',$,'PanMounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections.\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base.\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3637,$,$,$,.READWRITE.); -#3637=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3638=IFCSIMPLEPROPERTYTEMPLATE('3O563YTgj2dvhMjoolau4x',$,'SpilloverLevel','The level at which water spills out of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3639=IFCPROPERTYSETTEMPLATE('0zWCGktZv0L9Co10aX7I8b',$,'Pset_SanitaryTerminalTypeUrinal','Soil appliance that receives urine and directs it to a waste outlet (BS6100). HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialsResource schema. Prefix for color property removed. Datatype of color changed to IfcLabel (still a string value). Mounting property added.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/URINAL,IfcSanitaryTerminalType/URINAL',(#3640,#3642,#3644)); -#3640=IFCSIMPLEPROPERTYTEMPLATE('3GFFDMsn978fSYt0hl98lm',$,'UrinalType','Selection of the type of urinal from the enumerated list of types where:-Bowl: Individual wall mounted urinal.\X2\000A\X0\Slab: Urinal that consists of a slab or sheet fixed to a wall and down which urinal flows into a floor channel.\X2\000A\X0\Stall: Floor mounted urinal that consists of an elliptically shaped sanitary stall fixed to a wall and down which urine flows into a floor channel.\X2\000A\X0\Trough: Wall mounted urinal of elongated rectangular shape on plan, that can be used by more than one person at a time.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3641,$,$,$,.READWRITE.); -#3641=IFCPROPERTYENUMERATION('PEnum_UrinalType',(IFCLABEL('BOWL'),IFCLABEL('SLAB'),IFCLABEL('STALL'),IFCLABEL('TROUGH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3642=IFCSIMPLEPROPERTYTEMPLATE('1hYDGidKz31vQKPbU_xFro',$,'Mounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.Note that BackToWall, Pedestal and WallHung are allowable values for a bidet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3643,$,$,$,.READWRITE.); -#3643=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3644=IFCSIMPLEPROPERTYTEMPLATE('2mA2uq1f10_BAuTUs3FlLl',$,'SpilloverLevel','The level at which water spills out of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3645=IFCPROPERTYSETTEMPLATE('2fwcRoobHBpekQXILFPUyX',$,'Pset_SanitaryTerminalTypeWashHandBasin','Waste water appliance for washing the upper parts of the body. HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialsResource schema. Datatype of color changed to IfcLabel (still a string value).',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/WASHHANDBASIN,IfcSanitaryTerminalType/WASHHANDBASIN',(#3646,#3648,#3650,#3651)); -#3646=IFCSIMPLEPROPERTYTEMPLATE('1i618fsFH6HB2e2Exhsotv',$,'WashHandBasinType','Defines the types of wash hand basin that may be specified where:DentalCuspidor: Waste water appliance that receives and flushes away mouth washings\X2\000A\X0\.\X2\000A\X0\HandRinse: Wall mounted wash hand basin that has an overall width of 500mm or less\X2\000A\X0\.\X2\000A\X0\Hospital: Wash hand basin that has a smooth easy clean surface without tapholes or overflow slot for use where hygiene is of prime importance.Tipup: Wash hand basin mounted on pivots so that it can be emptied by tilting.Vanity: Wash hand basin for installation into a horizontal surface.Washfountain: Wash hand basin that is circular, semi-circular or polygonal on plan, at which more than one person can wash at the same time.\X2\000A\X0\WashingTrough: Wash hand basin of elongated rectangular shape in plan, at which more than one person can wash at the same time.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3647,$,$,$,.READWRITE.); -#3647=IFCPROPERTYENUMERATION('PEnum_WashHandBasinType',(IFCLABEL('DENTALCUSPIDOR'),IFCLABEL('HANDRINSE'),IFCLABEL('HOSPITAL'),IFCLABEL('TIPUP'),IFCLABEL('WASHFOUNTAIN'),IFCLABEL('WASHINGTROUGH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3648=IFCSIMPLEPROPERTYTEMPLATE('3ylOTD1Ij8LgArmr5$GK1h',$,'Mounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.Note that BackToWall, Pedestal and WallHung are allowable values for a bidet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3649,$,$,$,.READWRITE.); -#3649=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3650=IFCSIMPLEPROPERTYTEMPLATE('0OecLDdMf2vORE60B2DxVr',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3651=IFCSIMPLEPROPERTYTEMPLATE('1hQUpD8k52c9DI4uoj8rAH',$,'MountingOffset','For counter top mounted basins the vertical offset between the top of the sink and the counter top.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3652=IFCPROPERTYSETTEMPLATE('0p0gkM4lf3ghwzH9wdGEDj',$,'Pset_SectioningDevice','Properties of sectioning device used in railway. The property set can be used by the predefined type INSULATOR of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/INSULATOR,IfcDiscreteAccessoryType/INSULATOR',(#3653)); -#3653=IFCSIMPLEPROPERTYTEMPLATE('3nkkA9gmvDWfFP77kFyLqq',$,'SectioningDeviceType','Indicates the sectioning device type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3654,$,$,$,.READWRITE.); -#3654=IFCPROPERTYENUMERATION('PEnum_SectioningDeviceType',(IFCLABEL('DIFFERENT_POWER_SUPPLY_SEPARATION'),IFCLABEL('PHASE_SEPARATION'),IFCLABEL('SAME_FEEDING_SECTION_SEPARATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3655=IFCPROPERTYSETTEMPLATE('1tkKoEUAn8SfdnzsnwKBn0',$,'Pset_SectionInsulator','Properties applicable to the insulator type of discrete accessory, indicated that the insulator is a section insulator used in the overhead contact line system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/INSULATOR,IfcDiscreteAccessoryType/INSULATOR',(#3656,#3657,#3658,#3659)); -#3656=IFCSIMPLEPROPERTYTEMPLATE('3QsX1gk1X6fBVpgGmvywqX',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#3657=IFCSIMPLEPROPERTYTEMPLATE('0fupevSh9AQxKe71n7IAx3',$,'NumberOfWires','The number of wires used in the element.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3658=IFCSIMPLEPROPERTYTEMPLATE('24czfOweH7i8anTWEJs4Fd',$,'IsArcSuppressing','Indicates whether the element has the ability to suppress an arc.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3659=IFCSIMPLEPROPERTYTEMPLATE('0CPHJ155jFJOp2mClP2mQ9',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#3660=IFCPROPERTYSETTEMPLATE('02tTkRwO9CtAii60OmULsf',$,'Pset_SensorPHistory','Properties for history of controller values. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcSensor',(#3661,#3662,#3663,#3664)); -#3661=IFCSIMPLEPROPERTYTEMPLATE('1qqZdQ1AD3PfAHgCgW6P4q',$,'Value','The expected range and default value.\X2\000A000A\X0\Indicates sensed values over time which may be recorded continuously or only when changed beyond a particular deadband. The range of possible values is defined by the SetPoint property of the corresponding sensor type property set.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3662=IFCSIMPLEPROPERTYTEMPLATE('2dZD4DOkD1C9nwAftHKgFG',$,'Direction','Indicates sensed direction for sensors capturing magnitude and direction measured from True North (0 degrees) in a clockwise direction.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3663=IFCSIMPLEPROPERTYTEMPLATE('05iuvKEHT5JfcmGKODKqet',$,'Quality','Indicates the quality of measurement or failure condition, which may be further qualified by the Status. True: measured values are considered reliable; False: measured values are considered not reliable (i.e. a fault has been detected); Unknown: reliability of values is uncertain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3664=IFCSIMPLEPROPERTYTEMPLATE('1ZO9BPNO9DFOqdO4vj1U3p',$,'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_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3665=IFCPROPERTYSETTEMPLATE('3YRyseFPj0NhYl8ygNUbQV',$,'Pset_SensorTypeCO2Sensor','A device that senses or detects carbon dioxide.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/CO2SENSOR,IfcSensorType/CO2SENSOR',(#3666)); -#3666=IFCSIMPLEPROPERTYTEMPLATE('2wm2Bfypr7bADiV$FnHYxv',$,'SetPointCO2Concentration','The carbon dioxide concentration to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3667=IFCPROPERTYSETTEMPLATE('31ZVyEhCX66vkJOm1KnzZi',$,'Pset_SensorTypeCommon','Sensor type common attributes. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor,IfcSensorType',(#3668,#3669)); -#3668=IFCSIMPLEPROPERTYTEMPLATE('0AU9CEnM10OPpTats4dTeV',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3669=IFCSIMPLEPROPERTYTEMPLATE('0mEhNZ4RTALg$yUJyMN2Li',$,'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',$,#3670,$,$,$,.READWRITE.); -#3670=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3671=IFCPROPERTYSETTEMPLATE('0zfatw3A56$gOomBNjsS_q',$,'Pset_SensorTypeConductanceSensor','A device that senses or detects electrical conductance. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/CONDUCTANCESENSOR,IfcSensorType/CONDUCTANCESENSOR',(#3672)); -#3672=IFCSIMPLEPROPERTYTEMPLATE('000hAxfW55ChKaN0dRJ9NE',$,'SetPointConductance','The fill level value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcElectricConductanceMeasure',$,$,$,$,$,.READWRITE.); -#3673=IFCPROPERTYSETTEMPLATE('2tfYBnxZf4cBz8Z5giCSSc',$,'Pset_SensorTypeContactSensor','A device that senses or detects contact. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/CONTACTSENSOR,IfcSensorType/CONTACTSENSOR',(#3674)); -#3674=IFCSIMPLEPROPERTYTEMPLATE('0agQGMk5r7Tw8obdiApYC0',$,'SetPointContact','The contact value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#3675=IFCPROPERTYSETTEMPLATE('1wK5v$3UT42u3WrVtT3uzv',$,'Pset_SensorTypeEarthquakeSensor','Properties that are applicable for IfcSensor with predefined type EARTHQUAKESENSOR.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/EARTHQUAKESENSOR,IfcSensorType/EARTHQUAKESENSOR',(#3676,#3677,#3678,#3679,#3680,#3682,#3683,#3684,#3685,#3686,#3688,#3689)); -#3676=IFCSIMPLEPROPERTYTEMPLATE('18A$NwGxP6fhmv3qjv0Iqc',$,'MarginOfError','Indicates the margin of error of the measurement.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3677=IFCSIMPLEPROPERTYTEMPLATE('2GlWH0DKL4HB1GiNUaGfpb',$,'LinearVelocityResolution','Indicates the resolution of the detected linear velocity.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3678=IFCSIMPLEPROPERTYTEMPLATE('1H9b$WZVz57etI3fqqAVFZ',$,'SamplingFrequency','Indicates the sampling frequency of the device.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#3679=IFCSIMPLEPROPERTYTEMPLATE('0OZhfxCFTCnvZs7rXSAaMT',$,'WorkingState','Indicates the working state of device or system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3680=IFCSIMPLEPROPERTYTEMPLATE('14z4TMfDH6SBDsGlOWql6t',$,'DataCollectionType','Indicates the type or manner of data collection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3681,$,$,$,.READWRITE.); -#3681=IFCPROPERTYENUMERATION('PEnum_DataCollectionType',(IFCLABEL('AUTOMATICANDCONTINUOUS'),IFCLABEL('MANUALANDSINGLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3682=IFCSIMPLEPROPERTYTEMPLATE('3GHGxw_pj9L929xHYcU1OO',$,'DegreeOfLinearity','Indicates the degree of linearity of the earthquake sensor or accelerometer.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3683=IFCSIMPLEPROPERTYTEMPLATE('35dqRD2R138hrdNim_cCX1',$,'DynamicRange','Indicates the dynamic range of the sensor.',.P_BOUNDEDVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3684=IFCSIMPLEPROPERTYTEMPLATE('08LM9Qbqb0wBXRvI70rgsE',$,'EarthquakeSensorRange','Indicates the measuring range of the earthquake sensor or accelerometer.',.P_BOUNDEDVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3685=IFCSIMPLEPROPERTYTEMPLATE('2ui6nEcr18MOdJn8lsBx1g',$,'FullScaleOutput','Indicates the full scale output of the earthquake sensor or accelerometer.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3686=IFCSIMPLEPROPERTYTEMPLATE('1LW9NYtTH81hwqPZh0jk4P',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3687,$,$,$,.READWRITE.); -#3687=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3688=IFCSIMPLEPROPERTYTEMPLATE('3WbBU2tlDBKAwdvX0o42SH',$,'TransverseSensitivityRatio','Indicates the transverse sensitivity ratio of the sensor.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3689=IFCSIMPLEPROPERTYTEMPLATE('3Fm8g7oi9ENvjUJr6EknES',$,'EarthquakeSensorType','Indicates the type of earthquake sensor or accelerometer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3690,$,$,$,.READWRITE.); -#3690=IFCPROPERTYENUMERATION('PEnum_EarthquakeSensorType',(IFCLABEL('2DIRECTION'),IFCLABEL('3DIRECTION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3691=IFCPROPERTYSETTEMPLATE('0t5iMcFTHAIgT7um9xGIwJ',$,'Pset_SensorTypeFireSensor','A device that senses or detects the presence of fire.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/FIRESENSOR,IfcSensorType/FIRESENSOR',(#3692,#3693,#3694)); -#3692=IFCSIMPLEPROPERTYTEMPLATE('2fqi9FKoj5Ewhe1pAAAowt',$,'FireSensorSetPoint','The temperature value to be sensed to indicate the presence of fire.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3693=IFCSIMPLEPROPERTYTEMPLATE('16muQhPJP8d9IKZYhrkABK',$,'AccuracyOfFireSensor','The accuracy of the sensor.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3694=IFCSIMPLEPROPERTYTEMPLATE('1UpbKk7MX168gcNjqFaU8N',$,'TimeConstant','The time constant of the sensor.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3695=IFCPROPERTYSETTEMPLATE('2WZkEN22T8twvPDwpAYRpv',$,'Pset_SensorTypeFlowSensor','A device that senses or detects flow. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/FLOWSENSOR,IfcSensorType/FLOWSENSOR',(#3696)); -#3696=IFCSIMPLEPROPERTYTEMPLATE('2tDSy3U81CmepsyRI_PczK',$,'SetPointFlow','The volumetric flow value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#3697=IFCPROPERTYSETTEMPLATE('1APaAE6HvCdB5ASeBKLANL',$,'Pset_SensorTypeForeignObjectDetectionSensor','Properties that are applicable for IfcSensor with predefined type FOREIGNOBJECTDETECTIONSENSOR.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/FOREIGNOBJECTDETECTIONSENSOR,IfcSensorType/FOREIGNOBJECTDETECTIONSENSOR',(#3698,#3699,#3701)); -#3698=IFCSIMPLEPROPERTYTEMPLATE('3N3XhlU9HFGOFpmLJXsdMp',$,'WorkingState','Indicates the working state of device or system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3699=IFCSIMPLEPROPERTYTEMPLATE('2czBsIckLEKQfxC$y1pPhX',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3700,$,$,$,.READWRITE.); -#3700=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3701=IFCSIMPLEPROPERTYTEMPLATE('1hEY6DUCzDzw6TkYUIhmGI',$,'ForeignObjectDetectionSensorType','Indicates the type of foreign object detection sensor.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3702,$,$,$,.READWRITE.); -#3702=IFCPROPERTYENUMERATION('PEnum_ForeignObjectDetectionSensorType',(IFCLABEL('DUALPOWERNETWORK'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3703=IFCPROPERTYSETTEMPLATE('0fOHVDw$14sA7AyMeE88M4',$,'Pset_SensorTypeFrostSensor','A device that senses or detects the presence of frost.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/FROSTSENSOR,IfcSensorType/FROSTSENSOR',(#3704)); -#3704=IFCSIMPLEPROPERTYTEMPLATE('39REst7BXDVwTBjjB5dwZV',$,'SetPointFrost','The detection of frost.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3705=IFCPROPERTYSETTEMPLATE('3I2xUU8sP4ERWBvMGwIRIv',$,'Pset_SensorTypeGasSensor','A device that senses or detects gas. HISTORY: Changed in IFC4. Gas detected made into enumeration, set point concentration and coverage area added. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/GASSENSOR,IfcSensorType/GASSENSOR',(#3706,#3707,#3708)); -#3706=IFCSIMPLEPROPERTYTEMPLATE('1y6XEapqr3vO4H2zmsIHl5',$,'GasDetected','Identification of the gas that is being detected, according to chemical formula. For example, carbon monoxide is ''CO'', carbon dioxide is ''CO2'', oxygen is ''O2''.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3707=IFCSIMPLEPROPERTYTEMPLATE('12EMpEn4HFSvC$h8HBf5W6',$,'SetPointConcentration','The concentration to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3708=IFCSIMPLEPROPERTYTEMPLATE('2hBZvOhyrEfQJSds30qXmP',$,'CoverageArea','The area that is covered by the object.\X2\000A000A\X0\Floor area (typically measured as a circle whose center is at the location of the sensor).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3709=IFCPROPERTYSETTEMPLATE('0WJBv_LODBKesfkXtKmMnt',$,'Pset_SensorTypeHeatSensor','A device that senses or detects heat. HISTORY: In IFC4, incorporates Fire Sensor. HeatSensorSetPoint changed to SetPointTemperature',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/HEATSENSOR,IfcSensorType/HEATSENSOR',(#3710,#3711,#3712)); -#3710=IFCSIMPLEPROPERTYTEMPLATE('2sfbHzDM91AehDtg3Cza7x',$,'CoverageArea','The area that is covered by the object.\X2\000A000A\X0\Floor area (typically measured as a circle whose center is at the location of the sensor).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3711=IFCSIMPLEPROPERTYTEMPLATE('3gpyAaBmD6dPcpCXZWnpLq',$,'SetPointTemperature','The temperature value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3712=IFCSIMPLEPROPERTYTEMPLATE('0BpBpZqIj6bPXnasxPyPmu',$,'RateOfTemperatureRise','The rate of temperature rise that is to be sensed as being hazardous.',.P_SINGLEVALUE.,'IfcTemperatureRateOfChangeMeasure',$,$,$,$,$,.READWRITE.); -#3713=IFCPROPERTYSETTEMPLATE('14AZGN12vBluCPNsFVfk_C',$,'Pset_SensorTypeHumiditySensor','A device that senses or detects humidity. HISTORY: HumiditySensorSetPoint changed to SetPointHumidity. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/HUMIDITYSENSOR,IfcSensorType/HUMIDITYSENSOR',(#3714)); -#3714=IFCSIMPLEPROPERTYTEMPLATE('3nSv_OLnH4sO7vvupIcmji',$,'SetPointHumidity','The humidity value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3715=IFCPROPERTYSETTEMPLATE('3OQgAU8l52nu7EoyGmgFt_',$,'Pset_SensorTypeIdentifierSensor','A device that senses identification tags.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/IDENTIFIERSENSOR,IfcSensorType/IDENTIFIERSENSOR',(#3716)); -#3716=IFCSIMPLEPROPERTYTEMPLATE('1dT7bWsg973w9zjqyvo$te',$,'SetPointIdentifier','The detected tag value.',.P_BOUNDEDVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3717=IFCPROPERTYSETTEMPLATE('3qZ97g4oj5S9GG4IvMcury',$,'Pset_SensorTypeIonConcentrationSensor','A device that senses or detects ion concentration such as water hardness. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/IONCONCENTRATIONSENSOR,IfcSensorType/IONCONCENTRATIONSENSOR',(#3718,#3719)); -#3718=IFCSIMPLEPROPERTYTEMPLATE('0DWJPRS713tug5IuBXt7xS',$,'SubstanceDetected','Identification of the substance that is being detected according to chemical formula. For example, calcium carbonate is ''CaCO3''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3719=IFCSIMPLEPROPERTYTEMPLATE('14hhUAkzL6IBFjcQ$YWGnI',$,'SetPointIonConcentration','The ion concentration value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcIonConcentrationMeasure',$,$,$,$,$,.READWRITE.); -#3720=IFCPROPERTYSETTEMPLATE('3gZCgaV9X8WPGQFUm3x2rf',$,'Pset_SensorTypeLevelSensor','A device that senses or detects fill level. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/LEVELSENSOR,IfcSensorType/LEVELSENSOR',(#3721)); -#3721=IFCSIMPLEPROPERTYTEMPLATE('0TZevbW1T9tucvycZr3Pr_',$,'SetPointLevel','The fill level value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3722=IFCPROPERTYSETTEMPLATE('0fal0SOLrAwhBzxAoh8Ozo',$,'Pset_SensorTypeLightSensor','A device that senses or detects light. HISTORY: LightSensorSensorSetPoint changed to SetPointIlluminance. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/LIGHTSENSOR,IfcSensorType/LIGHTSENSOR',(#3723)); -#3723=IFCSIMPLEPROPERTYTEMPLATE('2FMFSxbI1DvAE6BmcHjE3S',$,'SetPointIlluminance','The illuminance value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcIlluminanceMeasure',$,$,$,$,$,.READWRITE.); -#3724=IFCPROPERTYSETTEMPLATE('2ocgcnr5j6jA25a6gYIfZR',$,'Pset_SensorTypeMoistureSensor','A device that senses or detects moisture. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/MOISTURESENSOR,IfcSensorType/MOISTURESENSOR',(#3725)); -#3725=IFCSIMPLEPROPERTYTEMPLATE('3rZviSPmzAfxcDmmugRU5E',$,'SetPointMoisture','The moisture value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3726=IFCPROPERTYSETTEMPLATE('0Ejm_Y68X8awtr$P$8hTKa',$,'Pset_SensorTypeMovementSensor','A device that senses or detects movement. HISTORY: In IFC4, time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/MOVEMENTSENSOR,IfcSensorType/MOVEMENTSENSOR',(#3727,#3729)); -#3727=IFCSIMPLEPROPERTYTEMPLATE('0SJogRnnr9LhCp17Db6eXY',$,'MovementSensingType','Enumeration that identifies the type of movement sensing mechanism.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3728,$,$,$,.READWRITE.); -#3728=IFCPROPERTYENUMERATION('PEnum_MovementSensingType',(IFCLABEL('PHOTOELECTRICCELL'),IFCLABEL('PRESSUREPAD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3729=IFCSIMPLEPROPERTYTEMPLATE('3Bmq1MO4f99unbS6j4IwDG',$,'SetPointMovement','The movement to be sensed.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3730=IFCPROPERTYSETTEMPLATE('0bjv0Q8Zj8rOgyrU8Ssrgf',$,'Pset_SensorTypePHSensor','A device that senses or detects acidity. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/PHSENSOR,IfcSensorType/PHSENSOR',(#3731)); -#3731=IFCSIMPLEPROPERTYTEMPLATE('0_CkiUnzP9lhFVW5nE6aCr',$,'SetPointPH','The fill level value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPHMeasure',$,$,$,$,$,.READWRITE.); -#3732=IFCPROPERTYSETTEMPLATE('1i$VdWB0rFlgqOcO1_4o1C',$,'Pset_SensorTypePressureSensor','A device that senses or detects pressure. HISTORY: PressureSensorSensorSetPoint changed to SetPointPressure. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/PRESSURESENSOR,IfcSensorType/PRESSURESENSOR',(#3733,#3734)); -#3733=IFCSIMPLEPROPERTYTEMPLATE('3AOMjBRIH2fRmtB9e4sHEq',$,'SetPointPressure','The pressure value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#3734=IFCSIMPLEPROPERTYTEMPLATE('3YdxCXMbz2IP5OwK6fymJR',$,'IsSwitch','Identifies if the sensor also functions as a switch at the set point (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3735=IFCPROPERTYSETTEMPLATE('2_x0_UZQrBN8p7GM7UBnjC',$,'Pset_SensorTypeRadiationSensor','A device that senses or detects radiation. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/RADIATIONSENSOR,IfcSensorType/RADIATIONSENSOR',(#3736)); -#3736=IFCSIMPLEPROPERTYTEMPLATE('1qkIOJX1PFKg2PT7bpLse2',$,'SetPointRadiation','The radiation power value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#3737=IFCPROPERTYSETTEMPLATE('061hKq2vD1pfCqpUUC_CfX',$,'Pset_SensorTypeRadioactivitySensor','A device that senses or detects atomic decay. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/RADIOACTIVITYSENSOR,IfcSensorType/RADIOACTIVITYSENSOR',(#3738)); -#3738=IFCSIMPLEPROPERTYTEMPLATE('0IQduplNj8G8XMwVofpwAp',$,'SetPointRadioactivity','The radioactivity value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcRadioActivityMeasure',$,$,$,$,$,.READWRITE.); -#3739=IFCPROPERTYSETTEMPLATE('2Vm6U3YcD9qw8N47bEPmxg',$,'Pset_SensorTypeRainSensor','Properties that are applicable for IfcSensor with predefined type RAINSENSOR.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/RAINSENSOR,IfcSensorType/RAINSENSOR',(#3740,#3741,#3742,#3743,#3745,#3746,#3748,#3749)); -#3740=IFCSIMPLEPROPERTYTEMPLATE('0sr_OgKIDAa9eahPYsyKnK',$,'MarginOfError','Indicates the margin of error of the measurement.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3741=IFCSIMPLEPROPERTYTEMPLATE('0heLxWYcTDSeKGblsHyhEo',$,'SamplingFrequency','Indicates the sampling frequency of the device.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#3742=IFCSIMPLEPROPERTYTEMPLATE('1f68LKLFP4CODXLFaaLeRs',$,'WorkingState','Indicates the working state of device or system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3743=IFCSIMPLEPROPERTYTEMPLATE('0llDwWm7LDdRWehwUEdBHw',$,'DataCollectionType','Indicates the type or manner of data collection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3744,$,$,$,.READWRITE.); -#3744=IFCPROPERTYENUMERATION('PEnum_DataCollectionType',(IFCLABEL('AUTOMATICANDCONTINUOUS'),IFCLABEL('MANUALANDSINGLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3745=IFCSIMPLEPROPERTYTEMPLATE('2js_yew3b7xPuxgtmgNhkj',$,'LengthMeasureResolution','Indicates the resolution for length measure of the device.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3746=IFCSIMPLEPROPERTYTEMPLATE('0_LdjHcmH9GhN_39IPiVXB',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3747,$,$,$,.READWRITE.); -#3747=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3748=IFCSIMPLEPROPERTYTEMPLATE('0Vj38tTgXEEPuuuCo7TL4y',$,'RainMeasureRange','Indicates the measuring range of rain gauge.',.P_BOUNDEDVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3749=IFCSIMPLEPROPERTYTEMPLATE('24yD4r1y54vvBHKuLNiv6C',$,'RainSensorType','Indicates the type of rain sensor or gauge.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3750,$,$,$,.READWRITE.); -#3750=IFCPROPERTYENUMERATION('PEnum_RainSensorType',(IFCLABEL('MICROWAVE'),IFCLABEL('PIEZOELECTRIC'),IFCLABEL('TIPPINGBUCKET'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3751=IFCPROPERTYSETTEMPLATE('2JuylVpn9A7P0CRzw2rKIu',$,'Pset_SensorTypeSmokeSensor','A device that senses or detects smoke. HISTORY: PressureSensorSensorSetPoint (error in previous release) changed to SetPointConcentration. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/SMOKESENSOR,IfcSensorType/SMOKESENSOR',(#3752,#3753,#3754)); -#3752=IFCSIMPLEPROPERTYTEMPLATE('3BYBNCIUzBFRNsWFiwtJOR',$,'CoverageArea','The area that is covered by the object.\X2\000A000A\X0\Floor area (typically measured as a circle whose center is at the location of the sensor).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3753=IFCSIMPLEPROPERTYTEMPLATE('2HA4DtKu14ZuPb5oIqdTiS',$,'SetPointConcentration','The concentration to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3754=IFCSIMPLEPROPERTYTEMPLATE('2TAFRtU1DF18BAaWHMN0Ip',$,'HasBuiltInAlarm','Indicates whether the smoke sensor is included as an element within a smoke alarm/sensor unit (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3755=IFCPROPERTYSETTEMPLATE('0pXGDgg_zAZR3sYidDrJtg',$,'Pset_SensorTypeSnowSensor','Properties that are applicable for IfcSensor with predefined type SNOWDEPTHSENSOR.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/SNOWDEPTHSENSOR,IfcSensorType/SNOWDEPTHSENSOR',(#3756,#3757,#3758,#3760,#3761,#3763,#3765,#3766,#3767)); -#3756=IFCSIMPLEPROPERTYTEMPLATE('0WJkPmfYn0jAkD5KsXN08$',$,'MarginOfError','Indicates the margin of error of the measurement.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3757=IFCSIMPLEPROPERTYTEMPLATE('2w$YrTuMnFDu8GrTK8v95t',$,'SamplingFrequency','Indicates the sampling frequency of the device.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#3758=IFCSIMPLEPROPERTYTEMPLATE('0msTVOlsvCFQYbXIBEgSg5',$,'DataCollectionType','Indicates the type or manner of data collection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3759,$,$,$,.READWRITE.); -#3759=IFCPROPERTYENUMERATION('PEnum_DataCollectionType',(IFCLABEL('AUTOMATICANDCONTINUOUS'),IFCLABEL('MANUALANDSINGLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3760=IFCSIMPLEPROPERTYTEMPLATE('0liofbQCfAgAU0JrXIdsNe',$,'ImageResolution','Indicates the image resolution of snow depth meter.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3761=IFCSIMPLEPROPERTYTEMPLATE('2hUO0FPKXBbxOFxBBw3B2m',$,'ImageShootingMode','Indicates the type or manner of snow depth meter image shooting.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3762,$,$,$,.READWRITE.); -#3762=IFCPROPERTYENUMERATION('PEnum_ImageShootingMode',(IFCLABEL('AUTOMATIC'),IFCLABEL('MANUAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3763=IFCSIMPLEPROPERTYTEMPLATE('0WkvzM$3v3yfKtm2SbwBat',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3764,$,$,$,.READWRITE.); -#3764=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3765=IFCSIMPLEPROPERTYTEMPLATE('0ofmazEq58oA10nVvNmWNK',$,'LengthMeasureResolution','Indicates the resolution for length measure of the device.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3766=IFCSIMPLEPROPERTYTEMPLATE('0NRODAhEz9LO2fL6yMjuwM',$,'SnowSensorMeasureRange','Indicates the measuring range of snow depth meter.',.P_BOUNDEDVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3767=IFCSIMPLEPROPERTYTEMPLATE('28JLIzNRP4P9MzKC1eEs4Y',$,'SnowSensorType','Indicates the type of snow depth meter.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3768,$,$,$,.READWRITE.); -#3768=IFCPROPERTYENUMERATION('PEnum_SnowSensorType',(IFCLABEL('LASERIRRADIATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3769=IFCPROPERTYSETTEMPLATE('1FvkOPCGr2mOUp$bWPi3V_',$,'Pset_SensorTypeSoundSensor','A device that senses or detects sound. HISTORY: SoundSensorSensorSetPoint changed to SetPointSound. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/SOUNDSENSOR,IfcSensorType/SOUNDSENSOR',(#3770)); -#3770=IFCSIMPLEPROPERTYTEMPLATE('14cXn65nTB4OOzwj59RZbL',$,'SetPointSound','The sound pressure value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcSoundPressureMeasure',$,$,$,$,$,.READWRITE.); -#3771=IFCPROPERTYSETTEMPLATE('0F9xVb1rHFqQF046Ozr3Hp',$,'Pset_SensorTypeTemperatureSensor','A device that senses or detects temperature. HISTORY: TemperatureSensorSensorSetPoint changed to SetPointTemperature. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/TEMPERATURESENSOR,IfcSensorType/TEMPERATURESENSOR',(#3772,#3774)); -#3772=IFCSIMPLEPROPERTYTEMPLATE('1aASqgsTvChuv6UhW3brzw',$,'TemperatureSensorType','Enumeration that Identifies the types of temperature sensor that can be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3773,$,$,$,.READWRITE.); -#3773=IFCPROPERTYENUMERATION('PEnum_TemperatureSensorType',(IFCLABEL('HIGHLIMIT'),IFCLABEL('LOWLIMIT'),IFCLABEL('OPERATINGTEMPERATURE'),IFCLABEL('OUTSIDETEMPERATURE'),IFCLABEL('ROOMTEMPERATURE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3774=IFCSIMPLEPROPERTYTEMPLATE('3AgBBB0714LB$i2_7Tyf0o',$,'SetPointTemperature','The temperature value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3775=IFCPROPERTYSETTEMPLATE('2N7HZDrpn0$xB49GB0nOvp',$,'Pset_SensorTypeTurnoutClosureSensor','Properties that are applicable for IfcSensor with predefined type TURNOUTCLOSURESENSOR.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/TURNOUTCLOSURESENSOR,IfcSensorType/TURNOUTCLOSURESENSOR',(#3776,#3777)); -#3776=IFCSIMPLEPROPERTYTEMPLATE('1CwuA09Ev0fBkC1PZ0$Pm9',$,'DetectionRange','The detection range of the equipment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3777=IFCSIMPLEPROPERTYTEMPLATE('3CwDmxw1n9HBa_c98LkRq5',$,'IndicationRodMovementRange','Indicates the range of indication rod movement.',.P_BOUNDEDVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3778=IFCPROPERTYSETTEMPLATE('3fP_8k$xbAI94uYWdSDD3S',$,'Pset_SensorTypeWindSensor','A device that senses or detects wind speed and direction. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/WINDSENSOR,IfcSensorType/WINDSENSOR',(#3779,#3781,#3782,#3783,#3785,#3786,#3787,#3788,#3789,#3790,#3791,#3793,#3794)); -#3779=IFCSIMPLEPROPERTYTEMPLATE('0vT1$u4uDAf8FnhVME3Vhs',$,'WindSensorType','Enumeration that Identifies the types of wind sensors that can be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3780,$,$,$,.READWRITE.); -#3780=IFCPROPERTYENUMERATION('PEnum_WindSensorType',(IFCLABEL('CUP'),IFCLABEL('HOTWIRE'),IFCLABEL('LASERDOPPLER'),IFCLABEL('PLATE'),IFCLABEL('SONIC'),IFCLABEL('TUBE'),IFCLABEL('WINDMILL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3781=IFCSIMPLEPROPERTYTEMPLATE('29UmudtUX8WfNPMAzIlUi7',$,'SetPointSpeed','The wind speed value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3782=IFCSIMPLEPROPERTYTEMPLATE('2KCA0AV_DEcA8sgYoHWrru',$,'DampingRatio','Indicates the damping ratio of the device.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3783=IFCSIMPLEPROPERTYTEMPLATE('1_p6O1VG980xJUVLP9S5O3',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3784,$,$,$,.READWRITE.); -#3784=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3785=IFCSIMPLEPROPERTYTEMPLATE('3LfJRSiaDFc9UH5Zr0cm9c',$,'MarginOfError','Indicates the margin of error of the measurement.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3786=IFCSIMPLEPROPERTYTEMPLATE('35U2C6kYz1QRhe761_vaU2',$,'LinearVelocityResolution','Indicates the resolution of the detected linear velocity.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3787=IFCSIMPLEPROPERTYTEMPLATE('2htwQolwj6Lwm_Tc37VcQp',$,'SamplingFrequency','Indicates the sampling frequency of the device.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#3788=IFCSIMPLEPROPERTYTEMPLATE('1xP16vmEH5TAQh8lB11xy_',$,'StartingWindSpeed','Indicates the starting wind speed of the wind sensor.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3789=IFCSIMPLEPROPERTYTEMPLATE('1etVtJiLj2VO6$KErWLLwQ',$,'WorkingState','Indicates the working state of device or system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3790=IFCSIMPLEPROPERTYTEMPLATE('05WyzCHZn47fVcuk$d3Xd1',$,'TimeConstant','The time constant of the sensor.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#3791=IFCSIMPLEPROPERTYTEMPLATE('1v4YOFTUX4_vhiSN5Avv5A',$,'DataCollectionType','Indicates the type or manner of data collection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3792,$,$,$,.READWRITE.); -#3792=IFCPROPERTYENUMERATION('PEnum_DataCollectionType',(IFCLABEL('AUTOMATICANDCONTINUOUS'),IFCLABEL('MANUALANDSINGLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3793=IFCSIMPLEPROPERTYTEMPLATE('1OKwz8yBX6OR_Kie1dugXc',$,'WindAngleRange','Indicates the wind angle range the sensor can monitor.',.P_BOUNDEDVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#3794=IFCSIMPLEPROPERTYTEMPLATE('3TCKm2E1f36xihFrOOicsw',$,'WindSpeedRange','Indicates the range of wind speed the sensor can monitor.',.P_BOUNDEDVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3795=IFCPROPERTYSETTEMPLATE('0vlBP6PYXDxvZ36z2F1wJa',$,'Pset_ServiceLife','Captures the period of time that an artifact will last. HISTORY: Introduced in IFC2X4 as replacement for IfcServiceLife.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#3796,#3797)); -#3796=IFCSIMPLEPROPERTYTEMPLATE('0VX8lpeBr5qfFjGCIa4Gms',$,'ServiceLifeDuration','The length or duration of a service life.The lower bound indicates pessimistic service life, the upper bound indicates optimistic service life, and the setpoint indicates the typical service life.',.P_BOUNDEDVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#3797=IFCSIMPLEPROPERTYTEMPLATE('0Tu07l04DFQfzHmc1k1asI',$,'MeanTimeBetweenFailure','The average time duration between instances of failure of a product.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#3798=IFCPROPERTYSETTEMPLATE('2HcqC8pOz86wgY8E0L6Mgs',$,'Pset_ServiceLifeFactors','Captures various factors that impact the expected service life of elements within the system or zone.',.PSET_OCCURRENCEDRIVEN.,'IfcSystem',(#3799,#3800,#3801,#3802,#3803,#3804,#3805)); -#3799=IFCSIMPLEPROPERTYTEMPLATE('3VB1uOpGj26R2YqX9SwbGo',$,'QualityOfComponents','Adjustment of the service life resulting from the effect of the quality of components used.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3800=IFCSIMPLEPROPERTYTEMPLATE('3od_VecJP1_v4JwLKJQ$53',$,'DesignLevel','Adjustment of the service life resulting from the effect of design level employed.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3801=IFCSIMPLEPROPERTYTEMPLATE('3gXIrFxsr1UBGAkxEBSwAh',$,'WorkExecutionLevel','Adjustment of the service life resulting from the effect of the quality of work executed.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3802=IFCSIMPLEPROPERTYTEMPLATE('0cKEt6sMT61RwO_3AYmr3S',$,'IndoorEnvironment','Adjustment of the service life resulting from the effect of the indoor environment (where appropriate).',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3803=IFCSIMPLEPROPERTYTEMPLATE('1p47KEvwfAmedG2RkkWbLZ',$,'OutdoorEnvironment','Adjustment of the service life resulting from the effect of the outdoor environment (where appropriate)',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3804=IFCSIMPLEPROPERTYTEMPLATE('28jJ5D2LXEDgbwBjnCV1CJ',$,'InUseConditions','Adjustment of the service life resulting from the effect of the conditions in which components are operating.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3805=IFCSIMPLEPROPERTYTEMPLATE('38FWvqRUvBHPYdYCpCcA7j',$,'MaintenanceLevel','Adjustment of the service life resulting from the effect of the level or degree of maintenance applied to dcomponents.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3806=IFCPROPERTYSETTEMPLATE('0YGFSfSUfEPhpUGXbWB0Y1',$,'Pset_ShadingDeviceCommon','Shading device properties associated with an element that represents a shading device',.PSET_TYPEDRIVENOVERRIDE.,'IfcShadingDevice,IfcShadingDeviceType',(#3807,#3808,#3810,#3812,#3813,#3814,#3815,#3816,#3817,#3818,#3819,#3820)); -#3807=IFCSIMPLEPROPERTYTEMPLATE('2M1flkJl16JvoKDT2mcYvR',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3808=IFCSIMPLEPROPERTYTEMPLATE('0Z0TQp9MH4t8Rk$7RNw6NT',$,'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',$,#3809,$,$,$,.READWRITE.); -#3809=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3810=IFCSIMPLEPROPERTYTEMPLATE('1OygHdLSv3o8TnucVcpiPa',$,'ShadingDeviceType','Specifies the type of shading device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3811,$,$,$,.READWRITE.); -#3811=IFCPROPERTYENUMERATION('PEnum_ElementShading',(IFCLABEL('FIXED'),IFCLABEL('MOVABLE'),IFCLABEL('OVERHANG'),IFCLABEL('SIDEFIN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3812=IFCSIMPLEPROPERTYTEMPLATE('0gl3aa5tP8vxZzroX1F8A1',$,'MechanicalOperated','Indication whether the element is operated machanically (TRUE) or not, i.e. manually (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3813=IFCSIMPLEPROPERTYTEMPLATE('2uwhgLLLX3xf8RC3VmxZcV',$,'SolarTransmittance','The ratio of incident solar radiation that directly passes through a system (also named \X2\03C4\X0\e). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#3814=IFCSIMPLEPROPERTYTEMPLATE('0pAkcra0n1Ax_jWEGDqPmJ',$,'SolarReflectance','(Rsol): The ratio of incident solar radiation that is reflected by a glazing system (also named \X2\03C1\X0\e). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#3815=IFCSIMPLEPROPERTYTEMPLATE('1KYgVv18LDyOClNgZbDiMB',$,'VisibleLightTransmittance','Fraction of the visible light that passes the object at normal incidence. It is a value without unit.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#3816=IFCSIMPLEPROPERTYTEMPLATE('0UBCRj2hP9Jg_qWA1Z31af',$,'VisibleLightReflectance','Fraction of the visible light that is reflected by the glazing at normal incidence. It is a value without unit.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#3817=IFCSIMPLEPROPERTYTEMPLATE('3d0mYI93n18e34zpHhFA5B',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).\X2\000A000A\X0\Thermal transmittance coefficient (U-Value) of a material of a certain thickness for this element.',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#3818=IFCSIMPLEPROPERTYTEMPLATE('2DovRy4L90avAVhGY_gicq',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3819=IFCSIMPLEPROPERTYTEMPLATE('2cy4eFYrTDHv879Jn9G5sX',$,'Roughness','A measure of the vertical deviations of the surface.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3820=IFCSIMPLEPROPERTYTEMPLATE('2JV56R5K92nQihia6fRRJB',$,'SurfaceColour','The colour of the surface.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3821=IFCPROPERTYSETTEMPLATE('3UrenIzq9A6RSgqXInkThq',$,'Pset_ShadingDevicePHistory','Shading device performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcShadingDevice',(#3822,#3823)); -#3822=IFCSIMPLEPROPERTYTEMPLATE('27pO$nN2j0nRbLwzUdPv03',$,'TiltAngle','The angle of tilt defined in the plane perpendicular to the extrusion axis (X-Axis of the local placement). The angle shall be measured from the orientation of the Z-Axis in the local placement.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3823=IFCSIMPLEPROPERTYTEMPLATE('24kx51F7T1jA1kO1yxxHKt',$,'Azimuth','The azimuth of the outward normal for the outward or upward facing surface.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3824=IFCPROPERTYSETTEMPLATE('3wPChUqEDAEgsG5ByGolV2',$,'Pset_ShipLockCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to SHIPLOCK.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/SHIPLOCK',(#3825,#3826,#3827,#3828)); -#3825=IFCSIMPLEPROPERTYTEMPLATE('3XJ70Nvlz0MQ02oy4aOzDy',$,'CillLevelUpperHead','Height of the upper head cill level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3826=IFCSIMPLEPROPERTYTEMPLATE('01fbAnyTH0cOhbo0LhCuQu',$,'CillLevelLowerHead','Height of the lower head cill level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3827=IFCSIMPLEPROPERTYTEMPLATE('2PUj4rfBzCOAmm2N0uZ8$5',$,'WaterDeliveryValveType','Type of water delivery valve',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3828=IFCSIMPLEPROPERTYTEMPLATE('3BvOIiTBv6$9yYopuJts4p',$,'WaterDeliverySystemType','Type of water delivery system',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3829=IFCPROPERTYSETTEMPLATE('2ExSa3lT196hkvfgW$iGQd',$,'Pset_ShiplockComplex','Properties common to the definition of occurrences of IfcMarineFacility with the predefined type set to SHIPLOCK, where the facility represents a complex of multiple shiplocks.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/SHIPLOCK',(#3830,#3831,#3832,#3833)); -#3830=IFCSIMPLEPROPERTYTEMPLATE('0OXo9sIN54AP9TYccsFQgm',$,'LockGrade','Operational grading of the ship lock complex',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3831=IFCSIMPLEPROPERTYTEMPLATE('2TUt95ILDA8x9l3y$acgcX',$,'LockLines','Number of Parallel lock series',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3832=IFCSIMPLEPROPERTYTEMPLATE('3kOQM1EHf3d8DoZpSlDkKq',$,'LockChamberLevels','Number of steps (chambers) in a lock line',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3833=IFCSIMPLEPROPERTYTEMPLATE('3DndIPF819GeP3alxuwvES',$,'LockMode','Type of lock system used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3834=IFCPROPERTYSETTEMPLATE('0Zk6H2bQH8Ieg0lObTn$MR',$,'Pset_ShiplockDesignCriteria','Properties common to the definition of design criteria of all occurrences of IfcMarineFacility with the predefined type set to SHIPLOCK.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/SHIPLOCK',(#3835,#3836,#3837,#3838,#3839,#3840,#3841,#3842)); -#3835=IFCSIMPLEPROPERTYTEMPLATE('0M2kepPxL6ZO2mgrNhvGqt',$,'MaximumUpstreamNavigableWaterLevel','Design maximum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3836=IFCSIMPLEPROPERTYTEMPLATE('3L_OPgopfBNP76hUQn6vuz',$,'MinimumUpstreamNavigableWaterLevel','Design minimum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3837=IFCSIMPLEPROPERTYTEMPLATE('3Yb$4L85v6fuHu6B2IFs6V',$,'MaximumDownstreamNavigableWaterLevel','Design maximum downstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3838=IFCSIMPLEPROPERTYTEMPLATE('34gFDuICXEShGg20yj1q0K',$,'MinimumDownstreamNavigableWaterLevel','Design minimum downstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3839=IFCSIMPLEPROPERTYTEMPLATE('3WO0$De1vAPv8ZD8RxoqZl',$,'UpstreamMaintenanceWaterLevel','Design maximum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3840=IFCSIMPLEPROPERTYTEMPLATE('3KERVjqQ96jhvaGwZ_GaT_',$,'DownstreamMaintenanceWaterLevel','Design minimum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3841=IFCSIMPLEPROPERTYTEMPLATE('1Jd$fHVIX37BzoH_a4FO0z',$,'UpstreamFloodWaterLevel','Design maximum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3842=IFCSIMPLEPROPERTYTEMPLATE('1IUsMcsRz56xE9I3lPNfjJ',$,'DownstreamFloodWaterLevel','the design minimum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#3843=IFCPROPERTYSETTEMPLATE('1VGFz8j$f8CR19lHBDony_',$,'Pset_ShipyardCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to SHIPYARD.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/SHIPYARD',(#3844)); -#3844=IFCSIMPLEPROPERTYTEMPLATE('1GbYIRgyn92ufcyx6QNl29',$,'PrimaryProductionType','Primary type of ship production of the facility',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3845=IFCPROPERTYSETTEMPLATE('3oBZfQpBPCZO7rvSBG0_iG',$,'Pset_SignalFrame','Properties that define signal frame parameters for occurrences and types of IfcSignal applied in railways.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSignal,IfcSignalType',(#3846,#3847,#3848,#3849,#3851,#3852)); -#3846=IFCSIMPLEPROPERTYTEMPLATE('3Q7jZJ3Vr97B7kreQrfi7z',$,'BackboardType','The type of the backboard of the signal frame.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3847=IFCSIMPLEPROPERTYTEMPLATE('1KD3z78Sn4nRs2a4XPDAux',$,'SignalFrameType','Type of frame, e.g. main frame, route indicator, speed indicator, direction indicator, etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3848=IFCSIMPLEPROPERTYTEMPLATE('3fnHQ4Jqj6dvdQud3qpO$a',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3849=IFCSIMPLEPROPERTYTEMPLATE('2p$DjGDkfAJ8D4BgmTQDyR',$,'SignalIndicatorType','Type of the indicators on a signal, e.g. route indicator, speed restriction indicator etc.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3850,$,$,$,.READWRITE.); -#3850=IFCPROPERTYENUMERATION('PEnum_SignalIndicatorType',(IFCLABEL('DEPARTUREINDICATOR'),IFCLABEL('DEPARTUREROUTEINDICATOR'),IFCLABEL('DERAILINDICATOR'),IFCLABEL('ROLLINGSTOCKSTOPINDICATOR'),IFCLABEL('ROUTEINDICATOR'),IFCLABEL('SHUNTINGINDICATOR'),IFCLABEL('SWITCHINDICATOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3851=IFCSIMPLEPROPERTYTEMPLATE('15hedHrO10yhufG_RFsPHf',$,'SignalFrameBackboardHeight','The nominal height of the signal frame backboard.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3852=IFCSIMPLEPROPERTYTEMPLATE('3Jt3V$oJ1EWgW2FpzbX1ac',$,'SignalFrameBackboardDiameter','The nominal diameter of the signal frame backboard.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3853=IFCPROPERTYSETTEMPLATE('2w6CjKY$rBVBgaZD1ortsV',$,'Pset_SignCommon','Common properties for Signs.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSign,IfcSignType',(#3854,#3855,#3856,#3857)); -#3854=IFCSIMPLEPROPERTYTEMPLATE('37gOvb2pL3fOOSxMww3WGI',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3855=IFCSIMPLEPROPERTYTEMPLATE('2wdfWX3Rz0jwcBWdrddxk8',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3856=IFCSIMPLEPROPERTYTEMPLATE('3qdSkpt05Epxez_yEMQ_xh',$,'Category','Designation of the category into which the actors in the population belong.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3857=IFCSIMPLEPROPERTYTEMPLATE('1qrgNNMvT9du9M$SDcHSJq',$,'TactileMarking','The kind of Tactile Marking of the element.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3858=IFCPROPERTYSETTEMPLATE('1TmUbMe0nC5gP4quF_JDt3',$,'Pset_SiteCommon','Properties common to the definition of all occurrences of IfcSite. Please note that several site attributes are handled directly at the IfcSite instance, the site number (or short name) by IfcSite.Name, the site name (or long name) by IfcSite.LongName, and the description (or comments) by IfcSite.Description. The land title number is also given as an explicit attribute IfcSite.LandTitleNumber. Actual site quantities, like site perimeter, site area and site volume are provided by IfcElementQuantity, and site classification according to national building code by IfcClassificationReference. The global positioning of the site in terms of Northing and Easting and height above sea level datum is given by IfcSite.RefLongitude, IfcSite.RefLatitude, IfcSite.RefElevation and the postal address by IfcSite.SiteAddress.',.PSET_OCCURRENCEDRIVEN.,'IfcSite',(#3859,#3860,#3861,#3862,#3863,#3864)); -#3859=IFCSIMPLEPROPERTYTEMPLATE('3mmXo0lfT4PRkcZHfVW8YY',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3860=IFCSIMPLEPROPERTYTEMPLATE('0wePUD1$f7owN_fdoQ0tye',$,'BuildableArea','The area of site utilization expressed as a maximum value according to local building codes.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3861=IFCSIMPLEPROPERTYTEMPLATE('0MZbSd3afE2fofQGI7tTMy',$,'SiteCoverageRatio','The ratio of the utilization, TotalArea / BuildableArea, expressed as a maximum value. The ratio value may be used to derive BuildableArea.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3862=IFCSIMPLEPROPERTYTEMPLATE('0mmSVsfFP9Ke6u_6p5Z0kr',$,'FloorAreaRatio','The ratio of all floor areas to the buildable area as the maximum floor area utilization of the site as a maximum value according to local building codes.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3863=IFCSIMPLEPROPERTYTEMPLATE('24whNwJ5X6NxL3BW8v6drC',$,'BuildingHeightLimit','Allowed maximum height of buildings on this site - according to local building codes.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3864=IFCSIMPLEPROPERTYTEMPLATE('1ZmUfjbBrCof$mq8CViXxP',$,'TotalArea','Total planned area for the site. Used for programming the site space.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3865=IFCPROPERTYSETTEMPLATE('1zn_spWH50xxM0qPNEvKSW',$,'Pset_SiteWeather','Properties for site weather',.PSET_OCCURRENCEDRIVEN.,'IfcSite',(#3866,#3867)); -#3866=IFCSIMPLEPROPERTYTEMPLATE('2BQ2BkcmLErwF2NJ3BNBHU',$,'MaxAmbientTemp','Maximum ambient temperature of the site used as a basis of design',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3867=IFCSIMPLEPROPERTYTEMPLATE('2Gx3sfTkHAe8WnFAQZ$9vt',$,'MinAmbientTemp','Minimum ambient temperature of the site used as a basis of design',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3868=IFCPROPERTYSETTEMPLATE('2U2r4G115BZAkpDWeMDUem',$,'Pset_SlabCommon','Properties common to the definition of all occurrences of IfcSlab. Note: Properties for PitchAngle added in IFC 2x3',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab,IfcSlabType',(#3869,#3870,#3872,#3873,#3874,#3875,#3876,#3877,#3878,#3879,#3880)); -#3869=IFCSIMPLEPROPERTYTEMPLATE('1s3nMy3YDEfezlORffP0Oc',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3870=IFCSIMPLEPROPERTYTEMPLATE('2Xi2gM5ojBXRwla3ru9gLr',$,'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',$,#3871,$,$,$,.READWRITE.); -#3871=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3872=IFCSIMPLEPROPERTYTEMPLATE('3Wctq1_mzDYQznpy9_MlFV',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3873=IFCSIMPLEPROPERTYTEMPLATE('3FRy9pHYj0muF6iTicXw_O',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3874=IFCSIMPLEPROPERTYTEMPLATE('030hWRZ8XDQBjO7MR2bpt9',$,'PitchAngle','Angle of the slab to the horizontal when used as a component for the roof (specified as 0 degrees or not asserted for cases where the slab is not used as a roof component).The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#3875=IFCSIMPLEPROPERTYTEMPLATE('3YFw_steD44v_q2voYvqQ7',$,'Combustible','Indication whether the object is made from combustible material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3876=IFCSIMPLEPROPERTYTEMPLATE('1CJIMIT7n1Q9jh4igSQxMu',$,'SurfaceSpreadOfFlame','Indication on how the flames spread around the surface,\X2\000A\X0\It is given according to the national building code that governs the fire behaviour for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3877=IFCSIMPLEPROPERTYTEMPLATE('3LmOACfnf91wvNPHrHy1Nr',$,'Compartmentation','Indication whether the object is designed to serve as a fire compartmentation (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3878=IFCSIMPLEPROPERTYTEMPLATE('3QbpARRHH6kB1Ktn2Nr6ay',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3879=IFCSIMPLEPROPERTYTEMPLATE('36N1vd4aD4CeMZZOY7Ic8H',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#3880=IFCSIMPLEPROPERTYTEMPLATE('2Q2tD_iuz8yRNhWmmMg4Bl',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3881=IFCPROPERTYSETTEMPLATE('2ZyvpfQff5OPayse3y3bEF',$,'Pset_SlabTypeTrackSlab','Properties in this property set are generally applicable slabs used in railway tracks, modelled as IfcSlab with PredefinedType TRACKSLAB.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab/TRACKSLAB,IfcSlabType/TRACKSLAB',(#3882)); -#3882=IFCSIMPLEPROPERTYTEMPLATE('0agpnaBLr9fQqUgtlnl2YZ',$,'TechnicalStandard','The technical standard which the element should comply with.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#3883=IFCPROPERTYSETTEMPLATE('387wNjniL6TvtuJrJlINzJ',$,'Pset_SolarDeviceTypeCommon','Common properties for solar device types.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSolarDevice,IfcSolarDeviceType',(#3884,#3885)); -#3884=IFCSIMPLEPROPERTYTEMPLATE('1vdIqss0fCQPGtVx$Bs9UN',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3885=IFCSIMPLEPROPERTYTEMPLATE('1gRR_9nRv5TuBp9RlhLfoL',$,'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',$,#3886,$,$,$,.READWRITE.); -#3886=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3887=IFCPROPERTYSETTEMPLATE('3knZUmdLL0tfCnVXuZwiHk',$,'Pset_SolidStratumCapacity','Properties expressing the capacity of a stratum using physical measures. Regional and National conventions should be captured through classification and specific property sets.',.PSET_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum/SOLID',(#3888,#3889,#3890,#3891,#3892,#3893,#3894,#3895,#3896,#3897,#3898,#3899,#3900)); -#3888=IFCSIMPLEPROPERTYTEMPLATE('2qOIODd5TAAgKiyRnSAgv6',$,'CohesionBehaviour','Cohesive shear strength of a rock or soil that is independent of interparticle friction.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#3889=IFCSIMPLEPROPERTYTEMPLATE('01q0d8XrjDIhJPRdfMHaCu',$,'FrictionAngle','Friction angle is the tested inclination angle from horizontal.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#3890=IFCSIMPLEPROPERTYTEMPLATE('3OCLgh9lX91OTEavLN952i',$,'FrictionBehaviour','Friction shear strength of a rock or soil that is dependent on interparticle friction.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#3891=IFCSIMPLEPROPERTYTEMPLATE('1QdSaZ_HL0jPtFhYijMuOV',$,'GrainSize','Grain size diameter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3892=IFCSIMPLEPROPERTYTEMPLATE('3uARgHNgX8ku4zcW1Ib7Qt',$,'HydraulicConductivity','Hydraulic Conductivity (permeability) of soil for water, given with the K or Kf value in m/s',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3893=IFCSIMPLEPROPERTYTEMPLATE('0Fp3Yes6P4uP0Y289gZX1S',$,'LoadBearingCapacity','Maximum load bearing capacity of the floor structure throughtout the storey as designed.',.P_SINGLEVALUE.,'IfcPlanarForceMeasure',$,$,$,$,$,.READWRITE.); -#3894=IFCSIMPLEPROPERTYTEMPLATE('0ZTxUs9P9DY8QusDCGphE0',$,'NValue','Blow count from standard penetration testing, to ISO 22476-3, ASTM D1586[1] and Australian Standards AS 1289.6.3.1, which correlates to other engineering properties of soils.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3895=IFCSIMPLEPROPERTYTEMPLATE('3KJ_fvV1bAJgI9$uKO1RxI',$,'PermeabilityBehaviour','Proportionality constant in Darcy''s law which relates flow rate and viscosity to a pressure gradient applied to the porous media.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3896=IFCSIMPLEPROPERTYTEMPLATE('3sQ3OBp4z1DA0oUBXuCx30',$,'PoisonsRatio','Ratio of transverse contraction strain to longitudinal extension strain in the direction of stretching force.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#3897=IFCSIMPLEPROPERTYTEMPLATE('1g9zn7CVnCL9Nw3NeOgXo8',$,'PwaveVelocity','P-wave velocity of a rock or soil.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3898=IFCSIMPLEPROPERTYTEMPLATE('1Cl2fGy9T729vhR1lA4ZSe',$,'Resistivity','Electrical resistivity of a rock or soil (Ohm-m).',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#3899=IFCSIMPLEPROPERTYTEMPLATE('0qvscusHD3zfS6yh3J1per',$,'SettlementBehaviour','Estimate of the settlement/compaction behaviour of the stratum.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#3900=IFCSIMPLEPROPERTYTEMPLATE('0__tpYtfvALRJ8cGt7yJLb',$,'SwaveVelocity','S-wave velocity of a rock or soil.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#3901=IFCPROPERTYSETTEMPLATE('26nNqT6f1B_ezO5pSXCIiE',$,'Pset_SolidStratumComposition','Properties expressing the composition of a stratum using volume measures, implementing ISO14688 Part 2 Table 1 Primary fractions and composite fractions. Regional and National conventions should be captured through classification and specific property sets. Zero values may be omitted.',.PSET_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum/SOLID',(#3902,#3903,#3904,#3905,#3906,#3907,#3908,#3909,#3910,#3911,#3912,#3913,#3914)); -#3902=IFCSIMPLEPROPERTYTEMPLATE('2qPCfbdDX4pej2veL0r8GI',$,'AirVolume','Relative volume of air stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3903=IFCSIMPLEPROPERTYTEMPLATE('3mv1u41TvDSRK8MABlZ723',$,'BouldersVolume','Relative volume of boulders (typically larger than 200mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3904=IFCSIMPLEPROPERTYTEMPLATE('0dK59KnfbA2wF4x$qtpxKR',$,'ClayVolume','Relative volume of clay (typically smaller than 0.002mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3905=IFCSIMPLEPROPERTYTEMPLATE('1Ky5J9JjDCr9DZ5kTo7BN_',$,'CobblesVolume','Relative volume of cobbles (typically larger than 63mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3906=IFCSIMPLEPROPERTYTEMPLATE('1ZCclT6yT3fgPa6b1USLLu',$,'ContaminantVolume','Relative volume of contaminant stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3907=IFCSIMPLEPROPERTYTEMPLATE('0N9juzaW18cxCNlFm0i9_0',$,'FillVolume','Relative volume of fill (controlled placement of anthropogenic soil) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3908=IFCSIMPLEPROPERTYTEMPLATE('0RqCSdDUXDIeOxaDD9Zqti',$,'GravelVolume','Relative volume of gravel (typically larger than 2mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3909=IFCSIMPLEPROPERTYTEMPLATE('2pZZMfiHXFMOY5SoV3DNN5',$,'OrganicVolume','Relative volume of organic (peat/humus) stratum constituents especially soil.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3910=IFCSIMPLEPROPERTYTEMPLATE('1CoPxB1m5BxO_UaRbmTr52',$,'RockVolume','Relative volume of rock stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3911=IFCSIMPLEPROPERTYTEMPLATE('3IpfZAGor4MgbjyLT17w5F',$,'SandVolume','Relative volume of sand (typically smaller than 2mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3912=IFCSIMPLEPROPERTYTEMPLATE('08zQfPLmTCDuhG_eyw1UiJ',$,'SiltVolume','Relative volume of silt (typically smaller than 0.063mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3913=IFCSIMPLEPROPERTYTEMPLATE('1GXq8BvZb5AgPdwOzjUkRV',$,'WaterVolume','Relative volume of water stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#3914=IFCSIMPLEPROPERTYTEMPLATE('0LH7aRhQTC98suauop523p',$,'CompositeFractions','Denomination into soil groups by composite fractions',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3915,$,$,$,.READWRITE.); -#3915=IFCPROPERTYENUMERATION('PEnum_SoilCompositeFractions',(IFCLABEL('BOULDERS'),IFCLABEL('BOULDERS_WITH_COBBLES'),IFCLABEL('BOULDERS_WITH_FINER_SOILS'),IFCLABEL('CLAY'),IFCLABEL('CLAYEY_SILT'),IFCLABEL('COBBLES'),IFCLABEL('COBBLES_WITH_BOULDERS'),IFCLABEL('COBBLES_WITH_FINER_SOILS'),IFCLABEL('FILL'),IFCLABEL('GRAVEL'),IFCLABEL('GRAVELLY_SAND'),IFCLABEL('GRAVEL_WITH_CLAY_OR_SILT'),IFCLABEL('GRAVEL_WITH_COBBLES'),IFCLABEL('ORGANIC_CLAY'),IFCLABEL('ORGANIC_SILT'),IFCLABEL('SAND'),IFCLABEL('SANDY_CLAYEY_SILT'),IFCLABEL('SANDY_GRAVEL'),IFCLABEL('SANDY_GRAVELLY_CLAY'),IFCLABEL('SANDY_GRAVELLY_SILT'),IFCLABEL('SANDY_GRAVEL_WITH_COBBLES'),IFCLABEL('SANDY_PEAT'),IFCLABEL('SANDY_SILT'),IFCLABEL('SAND_WITH_CLAY_AND_SILT'),IFCLABEL('SILT'),IFCLABEL('SILTY_CLAY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3916=IFCPROPERTYSETTEMPLATE('1w3EnC9U98IhyCurpo9Gjl',$,'Pset_SoundAttenuation','Common definition to capture sound pressure at a point on behalf of a device typically used within the context of building services and flow distribution systems. To indicate sound values from an instance of IfcDistributionFlowElement at a particular location, IfcAnnotation instance(s) should be assigned to the IfcDistributionFlowElement through the IfcRelAssignsToProduct relationship. The IfcAnnotation should specify ObjectType of ''Sound'' and geometric representation of ''Annotation Point'' consisting of a single IfcPoint subtype as described at IfcAnnotation. This property set is instantiated multiple times on an object for each frequency band. HISTORY: New property set in IFC Release 2x4.',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation',(#3917,#3919,#3920)); -#3917=IFCSIMPLEPROPERTYTEMPLATE('2HXySL$9n86wslbbiHSFEP',$,'SoundScale','The reference sound scale.DBA: Decibels in an A-weighted scale\X2\000A\X0\DBB: Decibels in an B-weighted scale\X2\000A\X0\DBC: Decibels in an C-weighted scale\X2\000A\X0\NC: Noise criteria\X2\000A\X0\NR: Noise rating',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3918,$,$,$,.READWRITE.); -#3918=IFCPROPERTYENUMERATION('PEnum_SoundScale',(IFCLABEL('DBA'),IFCLABEL('DBB'),IFCLABEL('DBC'),IFCLABEL('NC'),IFCLABEL('NR')),$); -#3919=IFCSIMPLEPROPERTYTEMPLATE('28cGZ0WWv2C9W2KmHPYySZ',$,'SoundFrequency','List of nominal sound frequencies, correlated to the SoundPressure time series values (IfcTimeSeries.ListValues)',.P_LISTVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#3920=IFCSIMPLEPROPERTYTEMPLATE('1I38XsWH5FMhHSCk9i2$R4',$,'SoundPressure','A time series of sound pressure values measured in decibels at a reference pressure of 20 microPascals for the referenced octave band frequency. Each value in IfcTimeSeries.ListValues is correlated to the sound frequency at the same position within SoundFrequencies.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3921=IFCPROPERTYSETTEMPLATE('11r3A0JOz4PvyfpN0YAJei',$,'Pset_SoundGeneration','Common definition to capture the properties of sound typically used within the context of building services and flow distribution systems. This property set is instantiated multiple times on an object for each frequency band. HISTORY: New property set in IFC Release 2x4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionFlowElement,IfcDistributionFlowElementType',(#3922)); -#3922=IFCSIMPLEPROPERTYTEMPLATE('1koZcI0fLFIOjq2Ee4Rahh',$,'SoundCurve','Sound curve.\X2\000A000A\X0\Table of sound frequencies and sound power measured in decibels at a reference power of 1 picowatt(10\\^(-12) watt) for the referenced octave band frequency.',.P_TABLEVALUE.,'IfcFrequencyMeasure','IfcSoundPowerMeasure',$,$,$,$,.READWRITE.); -#3923=IFCPROPERTYSETTEMPLATE('0KvplqeQr7$xRlEOedW0q5',$,'Pset_SpaceAirHandlingDimensioning','Properties for Space AirHandling Dimensioning.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialElementType',(#3924,#3925,#3926,#3927,#3928,#3929,#3930,#3931,#3932,#3933,#3934,#3935,#3936)); -#3924=IFCSIMPLEPROPERTYTEMPLATE('2UaQFiGOHCGwnnhsBMJQHX',$,'CoolingDesignAirFlow','The air flowrate required during the peak cooling conditions.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#3925=IFCSIMPLEPROPERTYTEMPLATE('3Sdyepmzz3uRImIZokjEDE',$,'HeatingDesignAirFlow','The air flowrate required during the peak heating conditions, but could also be determined by minimum ventilation requirement or minimum air change requirements.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#3926=IFCSIMPLEPROPERTYTEMPLATE('1iqUWXJCL6Dx9QbTgqbHXX',$,'SensibleHeatGain','The sensible heat or energy gained by the space during the peak conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#3927=IFCSIMPLEPROPERTYTEMPLATE('08lbmRMMz6FfkswB5kUqp_',$,'TotalHeatGain','The total (sensible+latent) amount of heat or energy gained by the space at the time of the space''s peak cooling conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#3928=IFCSIMPLEPROPERTYTEMPLATE('2NCSlxcmH9Zg8x3Dae7Isk',$,'TotalHeatLoss','The total amount of heat or energy lost by the space at the time of the space''s peak heating conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#3929=IFCSIMPLEPROPERTYTEMPLATE('1TGINQE212wRXrOFYVZrUw',$,'CoolingDryBulb','Dry bulb temperature, usually for for cooling design.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3930=IFCSIMPLEPROPERTYTEMPLATE('0YD5vmXoL94A_A1d8GFJ0O',$,'CoolingRelativeHumidity','Inside relative humidity for cooling design.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3931=IFCSIMPLEPROPERTYTEMPLATE('1OMpfaMOTCUeedteFMnmJh',$,'HeatingDryBulb','Dry bulb temperature for heating design.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#3932=IFCSIMPLEPROPERTYTEMPLATE('01djp6fnn3Nu1LIIcBvXXw',$,'HeatingRelativeHumidity','Inside relative humidity for heating design.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#3933=IFCSIMPLEPROPERTYTEMPLATE('3nmg2PoSbAAAmxWIo4vY10',$,'VentilationDesignAirFlow','Ventilation outside air requirement for the space.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#3934=IFCSIMPLEPROPERTYTEMPLATE('1BMN$Inuz9BPoF7wenhv_R',$,'DesignAirFlow','Design air flow rate for the space.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#3935=IFCSIMPLEPROPERTYTEMPLATE('2DFIPrvd5CShtMkG3Zx6Yo',$,'CeilingRAPlenum','Ceiling plenum used for return air or not. TRUE = Yes, FALSE = No.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3936=IFCSIMPLEPROPERTYTEMPLATE('3NrlmnpP58LgXwxJgrDtOY',$,'BoundaryAreaHeatLoss','Heat loss per unit area for the boundary object. This is a design input value for use in the absence of calculated load data.',.P_SINGLEVALUE.,'IfcHeatFluxDensityMeasure',$,$,$,$,$,.READWRITE.); -#3937=IFCPROPERTYSETTEMPLATE('14LYs5HVr7Iv97WL43p8aq',$,'Pset_SpaceCommon','Properties common to the definition of all occurrences of IfcSpace. Please note that several space attributes are handled directly at the IfcSpace instance, the space number (or short name) by IfcSpace.Name, the space name (or long name) by IfcSpace:LongName, and the description (or comments) by IfcSpace.Description. Actual space quantities, like space perimeter, space area and space volume are provided by IfcElementQuantity, and space classification according to national building code by IfcClassificationReference. The level above zero (relative to the building) for the slab row construction is provided by the IfcBuildingStorey.Elevation, the level above zero (relative to the building) for the floor finish is provided by the IfcSpace.ElevationWithFlooring.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialElementType',(#3938,#3939,#3940,#3941,#3942,#3943)); -#3938=IFCSIMPLEPROPERTYTEMPLATE('0b978MxaXCxvSgYFdIx_iP',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3939=IFCSIMPLEPROPERTYTEMPLATE('0KcPbPOM9CmQSS2kKl5rJo',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3940=IFCSIMPLEPROPERTYTEMPLATE('2U5sZ7fkD28u917p3cGbNJ',$,'GrossPlannedArea','Total planned gross area of the spatial structure element. Used for programming the spatial structure element.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3941=IFCSIMPLEPROPERTYTEMPLATE('0SER8Kydn0xx_C7xpq0i73',$,'NetPlannedArea','Total planned net area of the object. Used for programming the object.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#3942=IFCSIMPLEPROPERTYTEMPLATE('2L6E2zVfv32AE1GB4Zko7k',$,'PubliclyAccessible','Indication whether this space (in case of e.g., a toilet) is designed to serve as a publicly accessible space, e.g., for a public toilet (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3943=IFCSIMPLEPROPERTYTEMPLATE('3Vf3HNUJf4Du3VhrAGhC6H',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. Set to (TRUE) if this object is rated as handicap accessible according the local building codes, otherwise (FALSE).\X2\000A\X0\It is giving according to the requirements of the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3944=IFCPROPERTYSETTEMPLATE('3z88d7dcD2Oem$py9Gh0Tv',$,'Pset_SpaceCoveringRequirements','Properties common to the definition of covering requirements of IfcSpace. Those properties define the requirements coming from a space program in early project phases and can later be used to define the room book information, if such coverings are not modeled explicitly as covering elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialElementType',(#3945,#3946,#3947,#3948,#3949,#3950,#3951,#3952,#3953,#3954,#3955,#3956,#3957,#3958)); -#3945=IFCSIMPLEPROPERTYTEMPLATE('04KfPkxrD3FubSPNVkKlmZ',$,'FloorCovering','Label to indicate the material or finish of the space flooring. The label is used for room book information and often displayed in room stamp.The material information is provided in absence of an IfcCovering (type=FLOORING) object with own shape representation and material assignment. In case of inconsistency the material assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3946=IFCSIMPLEPROPERTYTEMPLATE('2VS0E0EXH0FQ$GHOzOUNLF',$,'FloorCoveringThickness','Thickness of the material layer(s) for the space flooring.The thickness information is provided in absence of an IfcCovering (type=FLOORING) object with own shape representation. In cases of inconsistency between the geometric parameters of an assigned IfcCovering and this attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3947=IFCSIMPLEPROPERTYTEMPLATE('11wA0iX9PBegeMPv8$HWqo',$,'WallCovering','Label to indicate the material or finish of the space flooring. The label is used for room book information and often displayed in room stamp.The material information is provided in absence of an IfcCovering (type=CLADDING) object with own shape representation and material assignment. In case of inconsistency the material assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3948=IFCSIMPLEPROPERTYTEMPLATE('0XCiBhuL58dOWuUxBNUePD',$,'WallCoveringThickness','Thickness of the material layer(s) for the space cladding.The thickness information is provided in absence of an IfcCovering (type=CLADDING) object with own shape representation. In cases of inconsistency between the geometric parameters of an assigned IfcCovering and this attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3949=IFCSIMPLEPROPERTYTEMPLATE('1Hizljlu10ZeADfkNJqxsD',$,'CeilingCovering','Label to indicate the material or finish of the space flooring. The label is used for room book information and often displayed in room stamp.The material information is provided in absence of an IfcCovering (type=CEILING) object with own shape representation and material assignment. In case of inconsistency the material assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3950=IFCSIMPLEPROPERTYTEMPLATE('1pYC_iRBP0nuVFCJdtAM49',$,'CeilingCoveringThickness','Thickness of the material layer(s) for the space ceiling.The thickness information is provided in absence of an IfcCovering (type=CEILING) object with own shape representation. In cases of inconsistency between the geometric parameters of an assigned IfcCovering and this attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3951=IFCSIMPLEPROPERTYTEMPLATE('0qr9aH849AVvQYntN$xv3z',$,'SkirtingBoard','Label to indicate the material or construction of the skirting board around the space flooring. The label is used for room book information.The material information is provided in absence of an IfcCovering (type=SKIRTINGBOARD) object with own shape representation and material assignment. In case of inconsistency the material assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3952=IFCSIMPLEPROPERTYTEMPLATE('0ETvTf1ZLFAvDXeS2dALUp',$,'SkirtingBoardHeight','Height of the skirting board.The height information is provided in absence of an IfcCovering (type=SKIRTINGBOARD) object with own shape representation and material assignment. In case of inconsistency the height assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3953=IFCSIMPLEPROPERTYTEMPLATE('2gNA4M9Qf4ufOCZwnH0qQx',$,'Molding','Label to indicate the material or construction of the molding around the space ceiling. The label is used for room book information.The material information is provided in absence of an IfcCovering (type=MOLDING) object with own shape representation and material assignment. In case of inconsistency the material assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3954=IFCSIMPLEPROPERTYTEMPLATE('1CwXI$rpjFvge6qofglcPe',$,'MoldingHeight','Height of the molding.The height information is provided in absence of an IfcCovering (type=MOLDING) object with own shape representation and material assignment. In case of inconsistency the height assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#3955=IFCSIMPLEPROPERTYTEMPLATE('3j83J7KDjAC8Pi306TJ4rR',$,'ConcealedFlooring','Indication whether this space is designed to have a concealed flooring space (TRUE) or not (FALSE). A concealed flooring space is normally meant to be the space beneath a raised floor.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3956=IFCSIMPLEPROPERTYTEMPLATE('2Lp5dKghX1pvU$JbgKVfKO',$,'ConcealedFlooringOffset','Distance between the floor slab and the floor covering, often used for cables and other installations. Often referred to as raised flooring.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3957=IFCSIMPLEPROPERTYTEMPLATE('1ACIU87CDExgei3wUb06v9',$,'ConcealedCeiling','Indication whether this space is designed to have a concealed flooring space (TRUE) or not (FALSE). A concealed ceiling space is normally meant to be the space between a slab and a ceiling.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3958=IFCSIMPLEPROPERTYTEMPLATE('1ypzIlvqb9JOLxy_t4yuul',$,'ConcealedCeilingOffset','Distance between the upper floor slab and the suspended ceiling, often used for distribution systems. Often referred to as plenum.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#3959=IFCPROPERTYSETTEMPLATE('2VtFYWrOz8IfFzwLOw9liE',$,'Pset_SpaceFireSafetyRequirements','Properties related to fire protection of spaces that apply to the occurrences of IfcSpace or IfcZone.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialZone,IfcZone,IfcSpatialElementType,IfcSpatialZoneType',(#3960,#3961,#3962,#3963,#3964,#3965)); -#3960=IFCSIMPLEPROPERTYTEMPLATE('2BZFzJOBz3wuAHrGubQow8',$,'FireRiskFactor','Fire Risk factor assigned to the space according to local building regulations. It defines the fire risk of the space at several levels of fire hazard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#3961=IFCSIMPLEPROPERTYTEMPLATE('2OGT2jxnX6jAA087CW6pnQ',$,'FlammableStorage','Indication whether the space is intended to serve as a storage of flammable material (which is regarded as such by the presiding building code. (TRUE) indicates yes, (FALSE) otherwise.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3962=IFCSIMPLEPROPERTYTEMPLATE('0C5I9Uc79DtObDrgsR_QSz',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here whether the space (in case of e.g., a corridor) is designed to serve as an exit space, e.g., for fire escape purposes.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3963=IFCSIMPLEPROPERTYTEMPLATE('0TPJyTa8f0Q9MPW$GaZD66',$,'SprinklerProtection','Indication whether this object is sprinkler protected (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3964=IFCSIMPLEPROPERTYTEMPLATE('0rxW5nsPT7nvkqexG_U6vf',$,'SprinklerProtectionAutomatic','Indication whether this object has an automatic sprinkler protection (TRUE) or not (FALSE).\X2\000A\X0\It should only be given, if the property "SprinklerProtection" is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3965=IFCSIMPLEPROPERTYTEMPLATE('1$rYoBcPjFj9i5pi7wXR2J',$,'AirPressurization','Indication whether the space is required to have pressurized air (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#3966=IFCPROPERTYSETTEMPLATE('0PVgGw2w15meTZEFQn81Ie',$,'Pset_SpaceHeaterPHistory','Space heater performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcSpaceHeater',(#3967,#3968,#3969,#3970,#3971,#3972,#3973,#3974,#3975,#3976,#3977,#3978)); -#3967=IFCSIMPLEPROPERTYTEMPLATE('2_VJI4Nlj00OrQyJGzdr73',$,'FractionRadiantHeatTransfer','Fraction of the total heat transfer rate as the radiant heat transfer.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3968=IFCSIMPLEPROPERTYTEMPLATE('22TrinrcPE2BBKlOUtwgla',$,'FractionConvectiveHeatTransfer','Fraction of the total heat transfer rate as the convective heat transfer.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3969=IFCSIMPLEPROPERTYTEMPLATE('3DUrAq$ITCLf5HliCI6hqg',$,'Effectiveness','Effectiveness, represented as ratio.\X2\000A000A\X0\Ratio of the real heat transfer rate to the maximum possible heat transfer rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3970=IFCSIMPLEPROPERTYTEMPLATE('2MXlG_g5zESx_nRd0mKvsM',$,'SurfaceTemperature','Average surface temperature of the component.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3971=IFCSIMPLEPROPERTYTEMPLATE('2$1dyTOUr2H923mEIOS715',$,'SpaceAirTemperature','Dry bulb temperature in the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3972=IFCSIMPLEPROPERTYTEMPLATE('1KEB9LxeHFBPheCp9h8pW5',$,'SpaceMeanRadiantTemperature','Mean radiant temperature in the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3973=IFCSIMPLEPROPERTYTEMPLATE('01B76AupD2uQRm8NwPDcrj',$,'AuxiliaryEnergySourceConsumption','Auxiliary energy source consumption.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3974=IFCSIMPLEPROPERTYTEMPLATE('0230xq_dT9IA2mkeQX_zW5',$,'UACurve','UA value.\X2\000A000A\X0\As a function of ambient temperature and surface temperature; UA = f (Tambient, Tsurface)',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3975=IFCSIMPLEPROPERTYTEMPLATE('0JOb9a0dP5AQJE1pOqCQcM',$,'OutputCapacityCurve','Partial output capacity curve (as a function of water temperature); Q = f (Twater).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3976=IFCSIMPLEPROPERTYTEMPLATE('3vZwIIMw1Erg1TWlwF8K6P',$,'AirResistanceCurve','Air resistance curve (w/ fan only); Pressure = f ( flow rate).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3977=IFCSIMPLEPROPERTYTEMPLATE('27jYoWl8XDYfVGWWelvjF9',$,'CharacteristicExponent','Characteristic exponent, slope of log(heat output) vs log (surface temperature minus environmental temperature).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3978=IFCSIMPLEPROPERTYTEMPLATE('0ztFMT1RP04Pa2iBRj07_n',$,'HeatOutputRate','Overall heat transfer rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#3979=IFCPROPERTYSETTEMPLATE('1U8Jfz3zr5SxYGxUhu1tD0',$,'Pset_SpaceHeaterTypeCommon','Space heater type common attributes.\X2\000A\X0\SoundLevel attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead. Properties added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpaceHeater,IfcSpaceHeaterType',(#3980,#3981,#3983,#3985,#3987,#3989,#3991,#3993,#3994,#3995,#3996,#3997,#3998)); -#3980=IFCSIMPLEPROPERTYTEMPLATE('0bjNU2EUL6mviNEmnbbsGD',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#3981=IFCSIMPLEPROPERTYTEMPLATE('0qXvPDGw94_Bo0$BjMQhHB',$,'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',$,#3982,$,$,$,.READWRITE.); -#3982=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3983=IFCSIMPLEPROPERTYTEMPLATE('2TlciMCTb3OePlpBRgc7rJ',$,'SpaceHeaterPlacement','Indicates how the space heater is designed to be placed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3984,$,$,$,.READWRITE.); -#3984=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterPlacementType',(IFCLABEL('BASEBOARD'),IFCLABEL('SUSPENDED'),IFCLABEL('TOWELWARMER'),IFCLABEL('WALL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3985=IFCSIMPLEPROPERTYTEMPLATE('3JGJQfLFb27A8TGwYoen5K',$,'TemperatureClassification','Enumeration defining the temperature classification of the space heater surface temperature.\X2\000A\X0\low temperature - surface temperature is relatively low, usually heated by hot water or electricity.\X2\000A\X0\high temperature - surface temperature is relatively high, usually heated by gas or steam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3986,$,$,$,.READWRITE.); -#3986=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterTemperatureClassification',(IFCLABEL('HIGHTEMPERATURE'),IFCLABEL('LOWTEMPERATURE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3987=IFCSIMPLEPROPERTYTEMPLATE('2uFgXGLqjFW8UGpMOvxP1d',$,'HeatTransferDimension','Indicates how heat is transmitted according to the shape of the space heater.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3988,$,$,$,.READWRITE.); -#3988=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterHeatTransferDimension',(IFCLABEL('PATH'),IFCLABEL('POINT'),IFCLABEL('SURFACE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3989=IFCSIMPLEPROPERTYTEMPLATE('0mPfjnqur2XuKWUNhDs8pY',$,'HeatTransferMedium','Enumeration defining the heat transfer medium if applicable.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3990,$,$,$,.READWRITE.); -#3990=IFCPROPERTYENUMERATION('PEnum_HeatTransferMedium',(IFCLABEL('STEAM'),IFCLABEL('WATER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3991=IFCSIMPLEPROPERTYTEMPLATE('3FSYtd5c50svRt5LT9qgeZ',$,'EnergySource','Enumeration defining the energy source or fuel cumbusted.\X2\000A000A\X0\Note: hydronic heaters shall use UNSET; dual-use hydronic/electric heaters shall use ELECTRICITY.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3992,$,$,$,.READWRITE.); -#3992=IFCPROPERTYENUMERATION('PEnum_EnergySource',(IFCLABEL('COAL'),IFCLABEL('COAL_PULVERIZED'),IFCLABEL('ELECTRICITY'),IFCLABEL('GAS'),IFCLABEL('OIL'),IFCLABEL('PROPANE'),IFCLABEL('WOOD'),IFCLABEL('WOOD_CHIP'),IFCLABEL('WOOD_PELLET'),IFCLABEL('WOOD_PULVERIZED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#3993=IFCSIMPLEPROPERTYTEMPLATE('2pKxsJtQHCGRMyLG9e1YOG',$,'BodyMass','Overall body mass of the heater.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#3994=IFCSIMPLEPROPERTYTEMPLATE('06U5obDGr2iv53NEBIQAMf',$,'ThermalMassHeatCapacity','Product of component mass and specific heat.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#3995=IFCSIMPLEPROPERTYTEMPLATE('1R8jH_QNf1HxfiDIbOVsM8',$,'OutputCapacity','Total nominal heat output as listed by the manufacturer.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#3996=IFCSIMPLEPROPERTYTEMPLATE('07ijl3AVf498u8ykrk$89n',$,'ThermalEfficiency','Overall Thermal Efficiency is defined as gross energy output of the heat transfer device divided by the energy input.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#3997=IFCSIMPLEPROPERTYTEMPLATE('2sd$UMR6LAFgEddlm74jTe',$,'NumberOfPanels','Number of panels.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3998=IFCSIMPLEPROPERTYTEMPLATE('1hqHiA73v3OxMrtrveKYPK',$,'NumberOfSections','Number of sections.\X2\000A000A\X0\Number of vertical sections, measured in the direction of flow.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#3999=IFCPROPERTYSETTEMPLATE('0dCoF$NrP36Af$rC8XnMMe',$,'Pset_SpaceHeaterTypeConvector','Space heater type convector attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpaceHeater/CONVECTOR,IfcSpaceHeaterType/CONVECTOR',(#4000)); -#4000=IFCSIMPLEPROPERTYTEMPLATE('2icAKDClD82AFdhqN1Pnrb',$,'ConvectorType','Indicates the type of convector, whether forced air (mechanically driven) or natural (gravity).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4001,$,$,$,.READWRITE.); -#4001=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterConvectorType',(IFCLABEL('FORCED'),IFCLABEL('NATURAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4002=IFCPROPERTYSETTEMPLATE('1ENa5mKjT2Xu4FLQYur6JE',$,'Pset_SpaceHeaterTypeRadiator','Space heater type radiator attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpaceHeater/RADIATOR,IfcSpaceHeaterType/RADIATOR',(#4003,#4005,#4006)); -#4003=IFCSIMPLEPROPERTYTEMPLATE('2yxq8_Vfn8ze37wa0mGOkE',$,'RadiatorType','Indicates the type of radiator.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4004,$,$,$,.READWRITE.); -#4004=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterRadiatorType',(IFCLABEL('FINNEDTUBE'),IFCLABEL('PANEL'),IFCLABEL('SECTIONAL'),IFCLABEL('TUBULAR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4005=IFCSIMPLEPROPERTYTEMPLATE('1CIznUL0n6p85btviZ2ohB',$,'TubingLength','Water tube length inside the component.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4006=IFCSIMPLEPROPERTYTEMPLATE('0rdzxaeYL9_QcLpj96T26d',$,'WaterContent','Weight of water content within the heater.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#4007=IFCPROPERTYSETTEMPLATE('1JOit5DSfFt81NoG5WC8ze',$,'Pset_SpaceHVACDesign','Properties for HVAC requirements for spaces.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialZone,IfcZone,IfcSpatialElementType,IfcSpatialZoneType',(#4008,#4009,#4010,#4011,#4012,#4013,#4014,#4015,#4016,#4017,#4018,#4019,#4020,#4021,#4022,#4023,#4024,#4025,#4026,#4027)); -#4008=IFCSIMPLEPROPERTYTEMPLATE('213SMyX5D9NRv92r7Ne590',$,'TemperatureSetPoint','The temperature setpoint range and default setpoint.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4009=IFCSIMPLEPROPERTYTEMPLATE('3NUnrtgi9389VNB6vOuRgy',$,'TemperatureMax','Maximal temperature of the space or zone, that is required from user/designer view point. If no summer or winter space temperature requirements are given, it applies all year, otherwise for the intermediate period.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4010=IFCSIMPLEPROPERTYTEMPLATE('09mmRumxz9OPG_pewSU_sO',$,'TemperatureMin','Minimal temperature of the space or zone, that is required from user/designer view point. If no summer or winter space temperature requirements are given, it applies all year, otherwise for the intermediate period.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4011=IFCSIMPLEPROPERTYTEMPLATE('0P$tx4H0L6IfpaLN4JSp_H',$,'TemperatureSummerMax','Maximal temperature of the space or zone for the hot (summer) period, that is required from user/designer view point and provided as requirement for cooling.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4012=IFCSIMPLEPROPERTYTEMPLATE('3kfdd0zWr7TOS8p8Lpzv6O',$,'TemperatureSummerMin','Minimal temperature of the space or zone for the hot (summer) period, that is required from user/designer view point and provided as requirement for cooling.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4013=IFCSIMPLEPROPERTYTEMPLATE('15xiX_QEr7mRT5SYGpf7rp',$,'TemperatureWinterMax','Maximal temperature of the space or zone for the cold (winter) period, that is required from user/designer view point and provided as requirement for heating.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4014=IFCSIMPLEPROPERTYTEMPLATE('20scoWgPX0OAt4oK84pZUd',$,'TemperatureWinterMin','Minimal temperature of the space or zone for the cold (winter) period, that is required from user/designer view point and provided as requirement for heating.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4015=IFCSIMPLEPROPERTYTEMPLATE('0yUseqgSj4YgNyLzinGU$U',$,'HumiditySetPoint','Humidity of the space or zone that is required from user/designer view point. If no summer or winter space humidity requirements are given, it applies all year, otherwise for the intermediate period. Provide this property, if no humidity range (Min-Max) is available.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4016=IFCSIMPLEPROPERTYTEMPLATE('1BvPuUcXj9nfgtKBMGs2Un',$,'HumidityMax','Maximal permitted humidity of the space or zone that is required from user/designer view point. If no summer or winter space humidity requirements are given, it applies all year, otherwise for the intermediate period.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4017=IFCSIMPLEPROPERTYTEMPLATE('0C3IcnaEX3yvQ8ujNLVp4h',$,'HumidityMin','Minimal permitted humidity of the space or zone that is required from user/designer view point. If no summer or winter space humidity requirements are given, it applies all year, otherwise for the intermediate period.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4018=IFCSIMPLEPROPERTYTEMPLATE('3Pn$EYb2f1YBURdrb7C2z3',$,'HumiditySummer','Humidity of the space or zone for the hot (summer) period, that is required from user/designer view point and provided as requirement for cooling.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4019=IFCSIMPLEPROPERTYTEMPLATE('3psSPg2hT9Q8twRf2lPdrw',$,'HumidityWinter','Humidity of the space or zone for the cold (winter) period that is required from user/designer view point and provided as requirement for heating.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4020=IFCSIMPLEPROPERTYTEMPLATE('1A$mSCV91BqhFhKK_X45YA',$,'DiscontinuedHeating','Indication whether discontinued heating is required/desirable from user/designer view point. (TRUE) if yes, (FALSE) otherwise.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4021=IFCSIMPLEPROPERTYTEMPLATE('1YRGI$0CLAV8oaW$7ZR86v',$,'NaturalVentilation','Indication whether the space is required to have natural ventilation (TRUE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4022=IFCSIMPLEPROPERTYTEMPLATE('1_CnGzpRLFNA$COAgDIq1H',$,'NaturalVentilationRate','Indication of the requirement of a particular natural air ventilation rate, given in air changes per hour.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4023=IFCSIMPLEPROPERTYTEMPLATE('3ZZopGz2TFewCiaStlBgpS',$,'MechanicalVentilation','Indication whether the space is required to have mechanical ventilation (TRUE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4024=IFCSIMPLEPROPERTYTEMPLATE('2VxPnrlEHDZPDwMe_60lrk',$,'MechanicalVentilationRate','Indication of the requirement of a particular mechanical air ventilation rate, given in air changes per hour.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4025=IFCSIMPLEPROPERTYTEMPLATE('1l9RUNYgTBROGL75kNyt2f',$,'AirConditioning','Indication whether this space requires air conditioning provided (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4026=IFCSIMPLEPROPERTYTEMPLATE('1TRoz92Zz2SPHsv3$b4wUe',$,'AirConditioningCentral','Indication whether the space requires a central air conditioning provided (TRUE) or not (FALSE).\X2\000A\X0\It should only be given, if the property "AirConditioning" is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4027=IFCSIMPLEPROPERTYTEMPLATE('3PG1T3GNX6ufol7j8nT11G',$,'AirHandlingName','The name of the air side system.IfcRelServicesBuildings should be used to reference the correct AirHandlingSystem (IfcSystem)',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4028=IFCPROPERTYSETTEMPLATE('3FCGzzQmXA_9RMmc9H6XzV',$,'Pset_SpaceLightingDesign','Properties for requirements on Lighting of spaces.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialZone,IfcZone,IfcSpatialElementType,IfcSpatialZoneType',(#4029,#4030)); -#4029=IFCSIMPLEPROPERTYTEMPLATE('2o3jBwZHP4_eBpbyJUeiVR',$,'ArtificialLighting','Indication whether this space requires artificial lighting (as natural lighting would be not sufficient). (TRUE) indicates yes (FALSE) otherwise.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4030=IFCSIMPLEPROPERTYTEMPLATE('07sFGQtbL2ABnbMlwSNLrz',$,'Illuminance','Required average illuminance value for this space.',.P_SINGLEVALUE.,'IfcIlluminanceMeasure',$,$,$,$,$,.READWRITE.); -#4031=IFCPROPERTYSETTEMPLATE('28Uc_Y4x58WBm8HP7LOUYx',$,'Pset_SpaceOccupancyRequirements','Properties concerning work activities occurring or expected to occur within one or a set of similar spatial structure elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialZone,IfcZone,IfcSpatialElementType,IfcSpatialZoneType',(#4032,#4033,#4034,#4035,#4036,#4037,#4038)); -#4032=IFCSIMPLEPROPERTYTEMPLATE('3cYDqHDAL6PvciC_hUbhNU',$,'OccupancyType','Occupancy type for this object.\X2\000A\X0\It is defined according to the presiding national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4033=IFCSIMPLEPROPERTYTEMPLATE('3AvX7xzqT03Q0RqjyTVpWK',$,'OccupancyNumber','Number of people required for the activity assigned to this space.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4034=IFCSIMPLEPROPERTYTEMPLATE('26f04GSVPE1A__0rwkNSzt',$,'OccupancyNumberPeak','Maximal number of people required for the activity assigned to this space in peak time.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4035=IFCSIMPLEPROPERTYTEMPLATE('1sytKM1rbBtRaAJ3$BiGYO',$,'OccupancyTimePerDay','The amount of time during the day that the activity is required within this space.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#4036=IFCSIMPLEPROPERTYTEMPLATE('1Js1TxYVP74eXQPVaDV2jO',$,'AreaPerOccupant','Design occupancy loading for this type of usage assigned to this space.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#4037=IFCSIMPLEPROPERTYTEMPLATE('0KnpBufzv4NgdVuJHPZlhz',$,'MinimumHeadroom','Headroom required for the activity assigned to this space.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4038=IFCSIMPLEPROPERTYTEMPLATE('0gunaZguDF58K5vFIjvXdB',$,'IsOutlookDesirable','An indication of whether the outlook is desirable (set TRUE) or not (set FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4039=IFCPROPERTYSETTEMPLATE('3UEHmM6lv2s9bgZ6Clfzs3',$,'Pset_SpaceParking','Properties common to the definition of all occurrences of IfcSpace which have an attribute value for ObjectType = ''Parking''. NOTE: Modified in IFC 2x3, properties ParkingUse and ParkingUnits added.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpace/PARKING,IfcSpaceType/PARKING',(#4040,#4041,#4042,#4043)); -#4040=IFCSIMPLEPROPERTYTEMPLATE('3E4yNYAbz0QBaRRajK2K0O',$,'ParkingUse','Identifies the type of transportation for which the parking space is designed. Values are not predefined but might include car, compact car, motorcycle, bicycle, truck, bus etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4041=IFCSIMPLEPROPERTYTEMPLATE('3niYvZJM51IQX_en3sawPY',$,'ParkingUnits','Indicates the number of transportation units of the type specified by the property ParkingUse that may be accommodated within the space. Generally, this value should default to 1 unit. However, where the parking space is for motorcycles or bicycles, provision may be made for more than one unit in the space.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4042=IFCSIMPLEPROPERTYTEMPLATE('1FLjLSF7H2$eysqlvP9BlK',$,'IsAisle','Indicates that this parking zone is for accessing the parking units, i.e. an aisle (TRUE) and not a parking unit itself (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4043=IFCSIMPLEPROPERTYTEMPLATE('2vouVKW5rF_RWnq60ezcUq',$,'IsOneWay','Indicates whether the parking aisle is designed for oneway traffic (TRUE) or twoway traffic (FALSE). Should only be provided if the property IsAisle is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4044=IFCPROPERTYSETTEMPLATE('0SwtOKZSj7kQzp5TFHhPPl',$,'Pset_SpaceThermalLoad','The space thermal load defines all thermal losses and gains occurring within a space or zone. The thermal load source attribute defines an enumeration of possible sources of the thermal load. The maximum, minimum, time series and app',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialElementType',(#4045,#4046,#4047,#4048,#4049,#4050,#4051,#4052,#4053,#4054,#4055,#4056,#4057,#4058)); -#4045=IFCSIMPLEPROPERTYTEMPLATE('1fD_7A3CT6YfefE1oUnlt3',$,'People','Heat gains and losses from people.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4046=IFCSIMPLEPROPERTYTEMPLATE('1CmR5SXgbCiBmDOx4n2Fke',$,'Lighting','Lighting loads.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4047=IFCSIMPLEPROPERTYTEMPLATE('0JpIMoJAfANuIscTPFpLXF',$,'EquipmentSensible','Heat gains and losses from equipment.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4048=IFCSIMPLEPROPERTYTEMPLATE('2ZtYdJWij6QuZEqLSYOSkD',$,'VentilationIndoorAir','Ventilation loads from indoor air.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4049=IFCSIMPLEPROPERTYTEMPLATE('1zvXYtlUjCgAz00BIvhgjW',$,'VentilationOutdoorAir','Ventilation loads from outdoor air.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4050=IFCSIMPLEPROPERTYTEMPLATE('3lZmlMr5r2MgrsU7WaREyb',$,'RecirculatedAir','Loads from recirculated air.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4051=IFCSIMPLEPROPERTYTEMPLATE('39DZy3EwjEIOarIEoDblVN',$,'ExhaustAir','Loads from exhaust air.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4052=IFCSIMPLEPROPERTYTEMPLATE('24KXfza$z42fInybmCmcr9',$,'AirExchangeRate','Loads from the air exchange rate.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4053=IFCSIMPLEPROPERTYTEMPLATE('10NJyCEEP3deZ8jRR3Qp68',$,'DryBulbTemperature','Dry bulb temperature of the object.\X2\000A000A\X0\Loads from the dry bulb temperature.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4054=IFCSIMPLEPROPERTYTEMPLATE('2WulI0k5zDP81mdPN_w0$C',$,'RelativeHumidity','Loads from the relative humidity.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4055=IFCSIMPLEPROPERTYTEMPLATE('3_fFsmLyD8Zwhsgzq4pwra',$,'InfiltrationSensible','Heat gains and losses from infiltration.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4056=IFCSIMPLEPROPERTYTEMPLATE('20p40YBYnAEhtnqxn_BiEL',$,'TotalSensibleLoad','Total energy added or removed from air that affects its temperature. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4057=IFCSIMPLEPROPERTYTEMPLATE('3gHXn_uDzASeCbKN4C1Rjo',$,'TotalLatentLoad','Total energy added or removed from air that affects its humidity or concentration of water vapor. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4058=IFCSIMPLEPROPERTYTEMPLATE('3M_ZuNFaT4EhDzyIIm7s6J',$,'TotalRadiantLoad','Total electromagnetic energy added or removed by emission or absorption. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4059=IFCPROPERTYSETTEMPLATE('2poKQnrebA1u4G9TpS0szo',$,'Pset_SpaceThermalLoadPHistory','The space thermal load IfcSpaceThermalLoadProperties defines actual measured thermal losses and gains occurring within a space or zone. The thermal load source attribute defines an enumeration of possible sources of the thermal load.',.PSET_PERFORMANCEDRIVEN.,'IfcSpatialElement',(#4060,#4061,#4062,#4063,#4064,#4065,#4066,#4067,#4068,#4069,#4070,#4071,#4072,#4073)); -#4060=IFCSIMPLEPROPERTYTEMPLATE('1uJMD5xr1Ayvp5Eq8K5rpK',$,'PeopleHistory','Heat gains and losses from people.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4061=IFCSIMPLEPROPERTYTEMPLATE('1Dz6Q64OrAawfxN6Jq7pag',$,'LightingHistory','Lighting loads.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4062=IFCSIMPLEPROPERTYTEMPLATE('3PahFEgcPEP9yPSmYgFb7m',$,'EquipmentSensibleHistory','Heat gains and losses from equipment.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4063=IFCSIMPLEPROPERTYTEMPLATE('1qN3fGLa1FX86yjfIkgYhq',$,'VentilationIndoorAirHistory','Ventilation loads from indoor air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4064=IFCSIMPLEPROPERTYTEMPLATE('06HkCFAbP6YxQGKeY9vo0u',$,'VentilationOutdoorAirHistory','Ventilation loads from outdoor air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4065=IFCSIMPLEPROPERTYTEMPLATE('0dKv9_bcX008aBWRYfYksa',$,'RecirculatedAirHistory','Loads from recirculated air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4066=IFCSIMPLEPROPERTYTEMPLATE('1GmubDaY19A8459aNcCpL7',$,'ExhaustAirHistory','Loads from exhaust air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4067=IFCSIMPLEPROPERTYTEMPLATE('1pT7OBc$bDj9EA7EZmCSlq',$,'AirExchangeRateTimeHistory','Loads from the air exchange rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4068=IFCSIMPLEPROPERTYTEMPLATE('1t_2Aa_zLC2f$OwQ5qAGNC',$,'DryBulbTemperatureHistory','Loads from the dry bulb temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4069=IFCSIMPLEPROPERTYTEMPLATE('2MM6avKVP7k8fKKIQY134K',$,'RelativeHumidityHistory','Loads from the relative humidity.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4070=IFCSIMPLEPROPERTYTEMPLATE('2DYJX0eG1DZRtUksZ6wkwT',$,'InfiltrationSensibleHistory','Heat gains and losses from infiltration.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4071=IFCSIMPLEPROPERTYTEMPLATE('3MXDwoDkzEUBPzpMBEoo3F',$,'TotalSensibleLoadHistory','Total energy added or removed from air that affects its temperature. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4072=IFCSIMPLEPROPERTYTEMPLATE('22aWngh8f7ROSs8BYEf7Eh',$,'TotalLatentLoadHistory','Total energy added or removed from air that affects its humidity or concentration of water vapor. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4073=IFCSIMPLEPROPERTYTEMPLATE('2LycDo$onD_heUTu2fpD3B',$,'TotalRadiantLoadHistory','Total electromagnetic energy added or removed by emission or absorption. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4074=IFCPROPERTYSETTEMPLATE('2R3akwxX5CXP_BxHw9O1ne',$,'Pset_SpaceThermalPHistory','Thermal and air flow conditions of a space or zone. HISTORY: New property set in IFC 2x2.',.PSET_PERFORMANCEDRIVEN.,'IfcSpatialElement',(#4075,#4076,#4077,#4078,#4079,#4080)); -#4075=IFCSIMPLEPROPERTYTEMPLATE('2x8x4HkoL3KfG6XC1Z60BA',$,'CoolingAirFlowRate','Cooling air flow rate in the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4076=IFCSIMPLEPROPERTYTEMPLATE('1vOqEvrFD9OuwUfe731pDP',$,'HeatingAirFlowRate','Heating air flow rate in the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4077=IFCSIMPLEPROPERTYTEMPLATE('2ZzzyojUTF5O0KSJrhEV4V',$,'VentilationAirFlowRateHistory','Ventilation air flow rate in the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4078=IFCSIMPLEPROPERTYTEMPLATE('28tsvNYiT0rBkxKxwwUbjo',$,'ExhaustAirFlowRate','Design exhaust air flow rate for the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4079=IFCSIMPLEPROPERTYTEMPLATE('05cnX91iHEPxYgebFjcaUS',$,'SpaceTemperatureHistory','Temperature of the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4080=IFCSIMPLEPROPERTYTEMPLATE('3$1Q3PUOzEOgFIHz04bCiJ',$,'SpaceRelativeHumidity','The relative humidity of the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4081=IFCPROPERTYSETTEMPLATE('1YcwCSDMvCRwhlNhoAXnCg',$,'Pset_SpatialZoneCommon','Common properties for Spatial Zones.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialZone,IfcSpatialZoneType',(#4082,#4083)); -#4082=IFCSIMPLEPROPERTYTEMPLATE('2qaU_I0kT3MfTTb0TtYUNW',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4083=IFCSIMPLEPROPERTYTEMPLATE('2SK_2aU3b2WOpiBThhpksw',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4084=IFCPROPERTYSETTEMPLATE('0LST8cAqP4peETMsfcdO9y',$,'Pset_SpringTensioner','Properties of spring tensioner used in railway. The property set can be used by the predefined type TENSIONINGEQUIPMENT of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/TENSIONINGEQUIPMENT,IfcDiscreteAccessoryType/TENSIONINGEQUIPMENT',(#4085,#4086,#4087)); -#4085=IFCSIMPLEPROPERTYTEMPLATE('3kHbG45djENBpR5zgrX6MS',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4086=IFCSIMPLEPROPERTYTEMPLATE('2JG6s0uN1ADPXhehh1U9V3',$,'NominalWeight','Nominal weight of the object.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#4087=IFCSIMPLEPROPERTYTEMPLATE('2YJtEv18TAwO3DzFFWE32I',$,'TensioningWorkingRange','The working range of the tensioning equipment under normal operation.',.P_BOUNDEDVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#4088=IFCPROPERTYSETTEMPLATE('1hbVtJj$D5B9fMHXCEseps',$,'Pset_StackTerminalTypeCommon','Common properties for stack terminals.',.PSET_TYPEDRIVENOVERRIDE.,'IfcStackTerminal,IfcStackTerminalType',(#4089,#4090)); -#4089=IFCSIMPLEPROPERTYTEMPLATE('29pitzh093M8meIulxpl9E',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4090=IFCSIMPLEPROPERTYTEMPLATE('2Rt6rOvrX7_QEfzfvA7aQV',$,'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',$,#4091,$,$,$,.READWRITE.); -#4091=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4092=IFCPROPERTYSETTEMPLATE('1Ej3UfgVHDTB_MsafdMO7S',$,'Pset_StairCommon','Properties common to the definition of all occurrences of IfcStair.',.PSET_TYPEDRIVENOVERRIDE.,'IfcStair,IfcStairType',(#4093,#4094,#4096,#4097,#4098,#4099,#4100,#4101,#4102,#4103,#4104,#4105,#4106,#4107,#4108,#4109,#4110,#4111,#4112)); -#4093=IFCSIMPLEPROPERTYTEMPLATE('2fQ9joX$98agDVo33Jdf7V',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4094=IFCSIMPLEPROPERTYTEMPLATE('1h0o0jRA9DeOP9bGjC$iGL',$,'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',$,#4095,$,$,$,.READWRITE.); -#4095=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4096=IFCSIMPLEPROPERTYTEMPLATE('1ykrYvJf95X8V8sqwK97Rl',$,'NumberOfRiser','Total number of the risers included in the stair or stair flight.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4097=IFCSIMPLEPROPERTYTEMPLATE('0010eGlUz0tg6IS6VkJHav',$,'NumberOfTreads','Total number of treads included in the stair or stairflight.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4098=IFCSIMPLEPROPERTYTEMPLATE('2wia$K0DnFDQqae6AL3jwo',$,'RiserHeight','Vertical distance from tread to tread.\X2\000A\X0\The riser height is supposed to be equal for all steps of a stair or stair flight.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4099=IFCSIMPLEPROPERTYTEMPLATE('3CEN2Z$YD0RRcheK0wmSGC',$,'TreadLength','Horizontal distance from the front of the thread to the front of the next tread.\X2\000A\X0\The tread length is supposed to be equal for all steps of the stair or stair flight at the walking line.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4100=IFCSIMPLEPROPERTYTEMPLATE('2QO$vA40bFnvFJHNvWYB2q',$,'NosingLength','Horizontal distance from the front of the tread to the riser underneath. It is the overhang of the tread.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4101=IFCSIMPLEPROPERTYTEMPLATE('2X$GCskbrAqfy6HblHLSzr',$,'WalkingLineOffset','Offset of the walking line from the inner side of the flight.\X2\000A\X0\Note: the walking line may have a own shape representation (in case of inconsistencies, the value derived from the shape representation shall take precedence).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4102=IFCSIMPLEPROPERTYTEMPLATE('0am0N8G5TC$AlgU_fEUiIi',$,'TreadLengthAtOffset','Length of treads at a given offset.\X2\000A\X0\Walking line position is given by the ''WalkingLineOffset''. The resulting value should normally be identical with TreadLength, it may be given in addition, if the walking line offset for building code calculations is different from that used in design.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4103=IFCSIMPLEPROPERTYTEMPLATE('3SyZkay194IPakk3sVepz2',$,'TreadLengthAtInnerSide','Minimum length of treads at the inner side of the winder.\X2\000A\X0\Only relevant in case of winding flights, for straight flights it is identical with IfcStairFlight.TreadLength. It is a pre-calculated value, in case of inconsistencies, the value derived from the shape representation shall take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4104=IFCSIMPLEPROPERTYTEMPLATE('21WC9tmZrEvhJHjkcS2tuh',$,'WaistThickness','Minimum thickness of the stair flight, measured perpendicular to the slope of the flight to the inner corner of riser and tread. It is a pre-calculated value, in case of inconsistencies, the value derived from the shape representation shall take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4105=IFCSIMPLEPROPERTYTEMPLATE('1SWPpXmX16febnZTKTdngO',$,'RequiredHeadroom','Required headroom clearance for the passageway according to the applicable building code or additional requirements.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4106=IFCSIMPLEPROPERTYTEMPLATE('3aR3NMgmDEogw2ShYUlRiN',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. Set to (TRUE) if this object is rated as handicap accessible according the local building codes, otherwise (FALSE).\X2\000A\X0\It is giving according to the requirements of the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4107=IFCSIMPLEPROPERTYTEMPLATE('24mLVBgzf4EvZKsOm3j$5N',$,'HasNonSkidSurface','Indication whether the surface finish is designed to prevent slippery (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4108=IFCSIMPLEPROPERTYTEMPLATE('0wXk2sibP5fQ1Wyn0Eq4PW',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4109=IFCSIMPLEPROPERTYTEMPLATE('1BjzVre$jEj9uFIrgJCWLk',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#4110=IFCSIMPLEPROPERTYTEMPLATE('3MtEyYVEDBHBZZ87xkpSxL',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4111=IFCSIMPLEPROPERTYTEMPLATE('3zXr0dL1PCuB1Dcn$z6l9q',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4112=IFCSIMPLEPROPERTYTEMPLATE('1zKZ6Gwk1919fBMpEMy_ws',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here it defines an exit stair in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4113=IFCPROPERTYSETTEMPLATE('29ZTW_RGbF7BifLVELOhwl',$,'Pset_StairFlightCommon','Properties common to the definition of all occurrences of IfcStairFlight.',.PSET_TYPEDRIVENOVERRIDE.,'IfcStairFlight,IfcStairFlightType',(#4114,#4115,#4117,#4118,#4119,#4120,#4121,#4122,#4123,#4124,#4125,#4126)); -#4114=IFCSIMPLEPROPERTYTEMPLATE('2EiPbUNa557eEViu$KHLJZ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4115=IFCSIMPLEPROPERTYTEMPLATE('1jahwAOGPDge_TiEeG2tz8',$,'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',$,#4116,$,$,$,.READWRITE.); -#4116=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4117=IFCSIMPLEPROPERTYTEMPLATE('3UtEuu4Lf6Wfkn_KFTEuSy',$,'NumberOfRiser','Total number of the risers included in the stair or stair flight.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4118=IFCSIMPLEPROPERTYTEMPLATE('045hvKnvP5u9mPhpOxlDJJ',$,'NumberOfTreads','Total number of treads included in the stair or stairflight.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4119=IFCSIMPLEPROPERTYTEMPLATE('3q2WpqO3b4s8da1gB8K9dy',$,'RiserHeight','Vertical distance from tread to tread.\X2\000A\X0\The riser height is supposed to be equal for all steps of a stair or stair flight.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4120=IFCSIMPLEPROPERTYTEMPLATE('19CJSqg4X7ag7VKT_$Pj8x',$,'TreadLength','Horizontal distance from the front of the thread to the front of the next tread.\X2\000A\X0\The tread length is supposed to be equal for all steps of the stair or stair flight at the walking line.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4121=IFCSIMPLEPROPERTYTEMPLATE('07kPnkfp11sxwVIgH7RPbY',$,'NosingLength','Horizontal distance from the front of the tread to the riser underneath. It is the overhang of the tread.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4122=IFCSIMPLEPROPERTYTEMPLATE('1RovF7Veb3u9Du7UAOp815',$,'WalkingLineOffset','Offset of the walking line from the inner side of the flight.\X2\000A\X0\Note: the walking line may have a own shape representation (in case of inconsistencies, the value derived from the shape representation shall take precedence).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4123=IFCSIMPLEPROPERTYTEMPLATE('2N4iXmcCj2XfZkQb3CU0$m',$,'TreadLengthAtOffset','Length of treads at a given offset.\X2\000A\X0\Walking line position is given by the ''WalkingLineOffset''. The resulting value should normally be identical with TreadLength, it may be given in addition, if the walking line offset for building code calculations is different from that used in design.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4124=IFCSIMPLEPROPERTYTEMPLATE('18mJXUKj585PBO0OKMHPk_',$,'TreadLengthAtInnerSide','Minimum length of treads at the inner side of the winder.\X2\000A\X0\Only relevant in case of winding flights, for straight flights it is identical with IfcStairFlight.TreadLength. It is a pre-calculated value, in case of inconsistencies, the value derived from the shape representation shall take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4125=IFCSIMPLEPROPERTYTEMPLATE('2tZbplBur8MAnfXwjakcJh',$,'Headroom','Actual headroom clearance for the passageway according to the current design.\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4126=IFCSIMPLEPROPERTYTEMPLATE('1eOK8_4V9BiwszCjCkXo5q',$,'WaistThickness','Minimum thickness of the stair flight, measured perpendicular to the slope of the flight to the inner corner of riser and tread. It is a pre-calculated value, in case of inconsistencies, the value derived from the shape representation shall take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4127=IFCPROPERTYSETTEMPLATE('1F$f5_Hhf2xw2qh9s$FR4c',$,'Pset_Stationing','Specifies stationing parameters for IfcReferent.',.PSET_OCCURRENCEDRIVEN.,'IfcReferent',(#4128,#4129)); -#4128=IFCSIMPLEPROPERTYTEMPLATE('2TApwUdLTD8RolCiVjaogG',$,'IncomingStation','The optional station value of the incoming segment that ends at this location. This value needs to be set if the intention is to specify a station equation, i.e. a location where stationing changes.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4129=IFCSIMPLEPROPERTYTEMPLATE('3SJGKmkHP6pQ$55WOSKXHO',$,'Station','The station value at this location.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4130=IFCPROPERTYSETTEMPLATE('0oAzHHwe1EnQkLazKke$Rl',$,'Pset_StructuralSurfaceMemberVaryingThickness','Thickness parameters of a surface member (structural analysis item) with varying thickness, particularly with linearly varying thickness. The thickness is interpolated/ extrapolated from three points. The locations of these points are given either in local x,y coordinates of the surface member or in global X,Y,Z coordinates. Either way, these points are required to be located within the face or at the bounds of the face of the surface member, and they must not be located on a common line. Local and global coordinates shall not be mixed within the same property set instance.',.PSET_OCCURRENCEDRIVEN.,'IfcStructuralSurfaceMemberVarying',(#4131,#4132,#4133,#4134,#4135,#4136,#4137,#4138,#4139)); -#4131=IFCSIMPLEPROPERTYTEMPLATE('3VvczbkrnBKwnsvQb_ur97',$,'Thickness1','First thickness parameter of a surface member with varying thickness',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4132=IFCSIMPLEPROPERTYTEMPLATE('2255r43LrD_9OUZ5cNiAbq',$,'Location1Local','Local x,y coordinates of the point in which Thickness1 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4133=IFCSIMPLEPROPERTYTEMPLATE('0Pt7yYz299Cvo4xhCqWSwI',$,'Location1Global','Global X,Y,Z coordinates of the point in which Thickness1 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4134=IFCSIMPLEPROPERTYTEMPLATE('3Zdy8vZyP2Ex6Ddqs1iT9L',$,'Thickness2','Second thickness parameter of a surface member with varying thickness',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4135=IFCSIMPLEPROPERTYTEMPLATE('09lfKrDiLEQ8m0POB4VgVm',$,'Location2Local','Local x,y coordinates of the point in which Thickness2 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4136=IFCSIMPLEPROPERTYTEMPLATE('3E2QvvSBD9LfLujnt6Lhor',$,'Location2Global','Global X,Y,Z coordinates of the point in which Thickness2 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4137=IFCSIMPLEPROPERTYTEMPLATE('1OnW31V1f52h_mxuBdk$II',$,'Thickness3','Third thickness parameter of a surface member with varying thickness',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4138=IFCSIMPLEPROPERTYTEMPLATE('0MGrjw7JP8dP6TBOYsZlla',$,'Location3Local','Local x,y coordinates of the point in which Thickness3 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4139=IFCSIMPLEPROPERTYTEMPLATE('2s4Bfn1k5E9QBnNaBoHGbJ',$,'Location3Global','Global X,Y,Z coordinates of the point in which Thickness3 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4140=IFCPROPERTYSETTEMPLATE('2Y0xLrs2bDKv_8oF2ZWZgF',$,'Pset_SumpBusterCommon','Properties for a sump buster.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUMPBUSTER,IfcElementAssemblyType/SUMPBUSTER',(#4141)); -#4141=IFCSIMPLEPROPERTYTEMPLATE('0ULdDLUnvFPfgd6JahhbGP',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4142=IFCPROPERTYSETTEMPLATE('1vl1Y6Z21ApOr0w7EDXdVp',$,'Pset_Superelevation','Specifies the general properties for a Superelevation event.',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation/SUPERELEVATIONEVENT',(#4143,#4145,#4146)); -#4143=IFCSIMPLEPROPERTYTEMPLATE('3x0rV_qQX9CvKMz6WkmkfC',$,'Side','Specifies if the width is measured to the RIGHT or to the LEFT of the curve referenced by the placement, or if the same value is applied to BOTH sides.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4144,$,$,$,.READWRITE.); -#4144=IFCPROPERTYENUMERATION('PEnum_SideType',(IFCLABEL('BOTH'),IFCLABEL('LEFT'),IFCLABEL('RIGHT')),$); -#4145=IFCSIMPLEPROPERTYTEMPLATE('3SNnZVjhX30eJ0rFMXT5CH',$,'Superelevation','Specifies the superelevation as a ratio measure (slope) at the location of the event.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4146=IFCSIMPLEPROPERTYTEMPLATE('3RAKrKd89CE9s_k4_GXbRS',$,'TransitionSuperelevation','The type of transition of superelevation from previous event to this one.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4147,$,$,$,.READWRITE.); -#4147=IFCPROPERTYENUMERATION('PEnum_TransitionSuperelevationType',(IFCLABEL('LINEAR')),$); -#4148=IFCPROPERTYSETTEMPLATE('2Vj8DPUHDC7ft0zh07bMDN',$,'Pset_SwitchingDeviceTypeCommon','A switching device is a device designed to make or break the current in one or more electric circuits.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice,IfcSwitchingDeviceType',(#4149,#4150,#4152,#4153,#4155,#4156,#4157,#4158)); -#4149=IFCSIMPLEPROPERTYTEMPLATE('0LyS2gUK50efLk72PE5Ohg',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4150=IFCSIMPLEPROPERTYTEMPLATE('0iP8MElWD78QT4omMe16aY',$,'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',$,#4151,$,$,$,.READWRITE.); -#4151=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4152=IFCSIMPLEPROPERTYTEMPLATE('1Bg8sOJnj60eb2P4rVMRmG',$,'NumberOfGangs','Number of gangs in the object.\X2\000A000A\X0\Number of gangs/buttons on this switch.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4153=IFCSIMPLEPROPERTYTEMPLATE('2pi7UlE6v5shnMn_otjHJm',$,'SwitchFunction','Indicates types of switches which differs in functionality.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4154,$,$,$,.READWRITE.); -#4154=IFCPROPERTYENUMERATION('PEnum_SwitchFunctionType',(IFCLABEL('DOUBLETHROWSWITCH'),IFCLABEL('INTERMEDIATESWITCH'),IFCLABEL('ONOFFSWITCH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4155=IFCSIMPLEPROPERTYTEMPLATE('2hh59u0zvAsxtRcYo9swFu',$,'HasLock','Indication of whether a switching device has a key operated lock (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4156=IFCSIMPLEPROPERTYTEMPLATE('1eGaYb2KH9wBYdF840SiDc',$,'IsIlluminated','An indication of whether there is an illuminated indicator to show that the switch is on (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4157=IFCSIMPLEPROPERTYTEMPLATE('28lbLs1_n7OhuS0sRllYNP',$,'Legend','A text inscribed or applied to the switch as a legend to indicate purpose or function.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4158=IFCSIMPLEPROPERTYTEMPLATE('0$llPl__fEJBTGCmflwvMC',$,'SetPoint','Indicates the setpoint and label.\X2\000A000A\X0\For toggle switches, there are two positions, 0 for off and 1 for on. For dimmer switches, the values may indicate the fully-off and full-on positions, where missing integer values in between are interpolated. For selector switches, the range indicates the available positions.\X2\000A\X0\An IfcTable may be attached (using IfcMetric and IfcPropertyConstraintRelationship) containing columns of the specified header names and types:\X2\000A\X0\''Position'' (IfcInteger): The discrete setpoint level.\X2\000A\X0\''Sink'' (IfcLabel): The Name of the switched input port (IfcDistributionPort with FlowDirection=SINK).\X2\000A\X0\''Source'' (IfcLabel): The Name of the switched output port (IfcDistributionPort with FlowDirection=SOURCE).\X2\000A\X0\''Ratio'' (IfcNormalizedRatioMeasure): The ratio of power at the setpoint where 0.0 is off and 1.0 is fully on.',.P_TABLEVALUE.,'IfcInteger','IfcLabel',$,$,$,$,.READWRITE.); -#4159=IFCPROPERTYSETTEMPLATE('2qW6K8Y8j1NBJpNuf41CJf',$,'Pset_SwitchingDeviceTypeContactor','An electrical device used to control the flow of power in a circuit on or off.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/CONTACTOR,IfcSwitchingDeviceType/CONTACTOR',(#4160)); -#4160=IFCSIMPLEPROPERTYTEMPLATE('2nAqXXpSHAw9kpUXQulI5Y',$,'ContactorType','A list of the available types of contactor from which that required may be selected where:CapacitorSwitching: for switching 3 phase single or multi-step capacitor banks.\X2\000A\X0\LowCurrent: requires the use of low resistance contacts.\X2\000A\X0\MagneticLatching: enables the contactor to remain in the on position when the coil is no longer energized.\X2\000A\X0\MechanicalLatching: requires that the contactor is mechanically retained in the on position.\X2\000A\X0\Modular: are totally enclosed and self contained.\X2\000A\X0\Reversing: has a double set of contactors that are prewired.\X2\000A\X0\Standard: is a generic device that controls the flow of power in a circuit on or off.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4161,$,$,$,.READWRITE.); -#4161=IFCPROPERTYENUMERATION('PEnum_ContactorType',(IFCLABEL('CAPACITORSWITCHING'),IFCLABEL('LOWCURRENT'),IFCLABEL('MAGNETICLATCHING'),IFCLABEL('MECHANICALLATCHING'),IFCLABEL('MODULAR'),IFCLABEL('REVERSING'),IFCLABEL('STANDARD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4162=IFCPROPERTYSETTEMPLATE('0kU033x298Chr6EEXwQ6Qm',$,'Pset_SwitchingDeviceTypeDimmerSwitch','A dimmer switch is a switch that adjusts electrical power through a variable position level action. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/DIMMERSWITCH,IfcSwitchingDeviceType/DIMMERSWITCH',(#4163)); -#4163=IFCSIMPLEPROPERTYTEMPLATE('3RbQ0r5JP1TQMcD9BGFv45',$,'DimmerType','A list of the available types of dimmer switch from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4164,$,$,$,.READWRITE.); -#4164=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceDimmerSwitchType',(IFCLABEL('ROCKER'),IFCLABEL('SELECTOR'),IFCLABEL('TWIST'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4165=IFCPROPERTYSETTEMPLATE('2nEnh9F7vBKf0ki1RL8f4C',$,'Pset_SwitchingDeviceTypeEmergencyStop','An emergency stop device acts to remove as quickly as possible any danger that may have arisen unexpectedly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/EMERGENCYSTOP,IfcSwitchingDeviceType/EMERGENCYSTOP',(#4166,#4168,#4169,#4170,#4171,#4172,#4173,#4174,#4175,#4176,#4177,#4178,#4179)); -#4166=IFCSIMPLEPROPERTYTEMPLATE('13rA$4gsz1rRwPyH$SgAUc',$,'SwitchOperation','Indicates operation of emergency stop switch.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4167,$,$,$,.READWRITE.); -#4167=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceEmergencyStopType',(IFCLABEL('MUSHROOM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4168=IFCSIMPLEPROPERTYTEMPLATE('3KsE9Lw5H8bwLXoiTWdnwe',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4169=IFCSIMPLEPROPERTYTEMPLATE('3vUjAbouj9FgDCY$n2HPCk',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4170=IFCSIMPLEPROPERTYTEMPLATE('2vL1fcKPrELBMRP4hU4G0e',$,'BreakingCapacity','The current that a fuse, circuit breaker, or other electrical apparatus is able to interrupt without being destroyed or causing an electric arc with unacceptable duration.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#4171=IFCSIMPLEPROPERTYTEMPLATE('1i5BPJzZTBz9MUh04zqlXT',$,'NumberOfEarthFaultRelays','Indicates the number of relays used for preventing earth fault.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4172=IFCSIMPLEPROPERTYTEMPLATE('3_FW9Flzv0Af2guHxnwBcy',$,'NumberOfEmergencyButtons','The number of emergency buttons built in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4173=IFCSIMPLEPROPERTYTEMPLATE('3gfyaolITETvrtHvRcoFT1',$,'NumberOfRelays','Indicates number of relays built in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4174=IFCSIMPLEPROPERTYTEMPLATE('3mppN2dFDBCu0NA1keQJm7',$,'NumberOfOverCurrentRelays','Indicates number of relays used for preventing over current.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4175=IFCSIMPLEPROPERTYTEMPLATE('1L$J8kSOD5kvfAGAyWJsmp',$,'NumberOfAffectedPoles','Number of poles that the equipment affects.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4176=IFCSIMPLEPROPERTYTEMPLATE('1KQ$p$UPrCv94VlmCAYHTV',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#4177=IFCSIMPLEPROPERTYTEMPLATE('0Dftnj4wP22O7zFSlvXjX2',$,'RatedFrequency','Frequency of the AC electric power supply when the device or system reaches its optimum operating condition.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#4178=IFCSIMPLEPROPERTYTEMPLATE('0AyT9ssTj71QVHHmgUlYdK',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4179=IFCSIMPLEPROPERTYTEMPLATE('0eJeiZDYH9g9jkfhpDWTiz',$,'TransformationRatio','The ratio of the actual primary current or voltage to the actual secondary current or voltage.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4180=IFCPROPERTYSETTEMPLATE('0WVCo1ZVrBd9gVYpRMPM3d',$,'Pset_SwitchingDeviceTypeKeypad','A keypad is a switch supporting multiple functions. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/KEYPAD,IfcSwitchingDeviceType/KEYPAD',(#4181)); -#4181=IFCSIMPLEPROPERTYTEMPLATE('2mzV1HIGb7jAF_EyH92_oE',$,'KeypadType','A list of the available types of keypad switch from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4182,$,$,$,.READWRITE.); -#4182=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceKeypadType',(IFCLABEL('BUTTONS'),IFCLABEL('TOUCHSCREEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4183=IFCPROPERTYSETTEMPLATE('18mwFoiwzEaf9c3xPHMn9E',$,'Pset_SwitchingDeviceTypeMomentarySwitch','A momentary switch is a switch that does not hold state. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/MOMENTARYSWITCH,IfcSwitchingDeviceType/MOMENTARYSWITCH',(#4184)); -#4184=IFCSIMPLEPROPERTYTEMPLATE('3q1T1Se11A5RB3Od4r1RwF',$,'MomentaryType','A list of the available types of momentary switch from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4185,$,$,$,.READWRITE.); -#4185=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceMomentarySwitchType',(IFCLABEL('BUTTON'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4186=IFCPROPERTYSETTEMPLATE('0bC6Bdbz1979WHC6qVBFb2',$,'Pset_SwitchingDeviceTypePHistory','Indicates switch positions or levels over time, such as for energy management or surveillance.',.PSET_PERFORMANCEDRIVEN.,'IfcSwitchingDevice',(#4187)); -#4187=IFCSIMPLEPROPERTYTEMPLATE('3rCeHGUUv6YgyM5_kiLkSk',$,'SetPointHistory','Indicates the switch position over time according to Pset_SwitchingDeviceTypeCommon.SetPoint.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4188=IFCPROPERTYSETTEMPLATE('2tKEFWxG100uCq7nQEdT86',$,'Pset_SwitchingDeviceTypeRelay','Properties in this property set are applicable for IfcSwitchingDevice with PredefinedType RELAY.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/RELAY,IfcSwitchingDeviceType/RELAY',(#4189,#4190,#4191,#4192,#4193,#4194,#4195,#4196,#4197)); -#4189=IFCSIMPLEPROPERTYTEMPLATE('1tAup6AAf6cfHYoTMOVVnN',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4190=IFCSIMPLEPROPERTYTEMPLATE('1WwUpUE9vCeh9NmmhaB9Zt',$,'Current','The actual current and operable range.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#4191=IFCSIMPLEPROPERTYTEMPLATE('3N3_Mzebn5Gx7J3h7ve4UT',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4192=IFCSIMPLEPROPERTYTEMPLATE('1H9H8JHVf4Ew5zD8kt98Dc',$,'InsulationResistance','Minimum resistance between one terminal or several terminals connected together and the case or enclosure of a component at specified voltage.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#4193=IFCSIMPLEPROPERTYTEMPLATE('204CnnjLP2mQMDPTUHNLKz',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4194=IFCSIMPLEPROPERTYTEMPLATE('3VPmXgSG99V8arW7sHD7km',$,'ContactResistance','Resistance when electrical node is closed.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); -#4195=IFCSIMPLEPROPERTYTEMPLATE('1XZTwhXP97Nvu9bhkU6GhW',$,'PullInVoltage','Working voltage of relay in excitation state.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4196=IFCSIMPLEPROPERTYTEMPLATE('1s_Ja4znjBXh8fd5p56N36',$,'ReleaseVoltage','The maximum voltage to guarantee the drop of the relay node.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4197=IFCSIMPLEPROPERTYTEMPLATE('30Jav7DTL1ZeE$8KoHo1wE',$,'Voltage','The actual voltage and operable range.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4198=IFCPROPERTYSETTEMPLATE('2vjBexZ_zBIvZSFEI7qg6x',$,'Pset_SwitchingDeviceTypeSelectorSwitch','A selector switch is a switch that adjusts electrical power through a multi-position action. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/SELECTORSWITCH,IfcSwitchingDeviceType/SELECTORSWITCH',(#4199,#4201,#4203,#4205,#4206,#4207,#4208,#4209)); -#4199=IFCSIMPLEPROPERTYTEMPLATE('0xBYoXcivFtRBBq6AN6gU9',$,'SelectorType','A list of the available types of selector switch from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4200,$,$,$,.READWRITE.); -#4200=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceDimmerSwitchType',(IFCLABEL('ROCKER'),IFCLABEL('SELECTOR'),IFCLABEL('TWIST'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4201=IFCSIMPLEPROPERTYTEMPLATE('0eqh3Tq7n4O9QN5F54ncUU',$,'SwitchUsage','A list of the available usages for switches from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4202,$,$,$,.READWRITE.); -#4202=IFCPROPERTYENUMERATION('PEnum_SwitchUsage',(IFCLABEL('EMERGENCY'),IFCLABEL('GUARD'),IFCLABEL('LIMIT'),IFCLABEL('START'),IFCLABEL('STOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4203=IFCSIMPLEPROPERTYTEMPLATE('2rXszjUqL1zOdtGUYO1VpW',$,'SwitchActivation','A list of the available activations for switches from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4204,$,$,$,.READWRITE.); -#4204=IFCPROPERTYENUMERATION('PEnum_SwitchActivation',(IFCLABEL('ACTUATOR'),IFCLABEL('FOOT'),IFCLABEL('HAND'),IFCLABEL('PROXIMITY'),IFCLABEL('SOUND'),IFCLABEL('TWOHAND'),IFCLABEL('WIRE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4205=IFCSIMPLEPROPERTYTEMPLATE('1ZTgDHnhL9UQW9Tz99Qq0G',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#4206=IFCSIMPLEPROPERTYTEMPLATE('2Rp9bzFdvAEQ6YtH5ZbsFs',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4207=IFCSIMPLEPROPERTYTEMPLATE('3fhkiweJn1IRn_8opeY5La',$,'RatedFrequency','Frequency of the AC electric power supply when the device or system reaches its optimum operating condition.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#4208=IFCSIMPLEPROPERTYTEMPLATE('3qwWVUdmT2VhfTR5H$dUZO',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4209=IFCSIMPLEPROPERTYTEMPLATE('37_f$0ci55KeVzitiDgwTo',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4210=IFCPROPERTYSETTEMPLATE('1QHDBQENT5KQMFNbkSH$1$',$,'Pset_SwitchingDeviceTypeStarter','A starter is a switch which in the closed position controls the application of power to an electrical device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/STARTER,IfcSwitchingDeviceType/STARTER',(#4211)); -#4211=IFCSIMPLEPROPERTYTEMPLATE('3jHB6p3uv3B9todARs5vti',$,'StarterType','A list of the available types of starter from which that required may be selected where:AutoTransformer: A starter for an induction motor which uses for starting one or more reduced voltages derived from an auto transformer. (IEC 441-14-45)\X2\000A\X0\Manual: A starter in which the force for closing the main contacts is provided exclusively by manual energy. (IEC 441-14-39)\X2\000A\X0\DirectOnLine: A starter which connects the line voltage across the motor terminals in one step. (IEC 441-14-40)\X2\000A\X0\Frequency: A starter in which the frequency of the power supply is progressively increased until the normal operation frequency is attained.\X2\000A\X0\nStep: A starter in which there are (n-1) intermediate accelerating positions between the off and full on positions. (IEC 441-14-41)\X2\000A\X0\Rheostatic: A starter using one or several resistors for obtaining, during starting, stated motor torque characteristics and for limiting the current. (IEC 441-14-425)\X2\000A\X0\StarDelta: A starter for a 3 phase induction motor such that in the starting position the stator windings are connected in star and in the final running position they are connected in delta. (IEC 441-14-44)',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4212,$,$,$,.READWRITE.); -#4212=IFCPROPERTYENUMERATION('PEnum_StarterType',(IFCLABEL('AUTOTRANSFORMER'),IFCLABEL('DIRECTONLINE'),IFCLABEL('FREQUENCY'),IFCLABEL('MANUAL'),IFCLABEL('NSTEP'),IFCLABEL('RHEOSTATIC'),IFCLABEL('STARDELTA'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4213=IFCPROPERTYSETTEMPLATE('3M9t8Ixkr1xfb2QNetEnFl',$,'Pset_SwitchingDeviceTypeSwitchDisconnector','A switch disconnector is a switch which in the open position satisfies the isolating requirements specified for a disconnector.History: Property ''HasVisualIndication'' changed to ''IsIlluminated'' to conform with property name for toggle switch',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/SWITCHDISCONNECTOR,IfcSwitchingDeviceType/SWITCHDISCONNECTOR',(#4214,#4216)); -#4214=IFCSIMPLEPROPERTYTEMPLATE('3FYfRHawzBfuaiQ3c5dy1c',$,'SwitchDisconnectorType','A list of the available types of switch disconnector from which that required may be selected where:CenterBreak: A disconnector in which both contacts of each pole are movable and engage at a point substantially midway between their supports. (IEC 441-14-08)\X2\000A\X0\DividedSupport: A disconnector in which the fixed and moving contacts of each pole are not supported by a common base or frame. (IEC 441-14-06)\X2\000A\X0\DoubleBreak: A disconnector that opens a circuit at two points. (IEC 441-14-09)\X2\000A\X0\EarthingSwitch: A disconnector in which the fixed and moving contacts of each pole are not supported by a common base or frame. (IEC 441-14-07)\X2\000A\X0\Isolator: A disconnector which in the open position satisfies isolating requirements. (IEC 441-14-12)',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4215,$,$,$,.READWRITE.); -#4215=IFCPROPERTYENUMERATION('PEnum_SwitchDisconnectorType',(IFCLABEL('CENTERBREAK'),IFCLABEL('DIVIDEDSUPPORT'),IFCLABEL('DOUBLEBREAK'),IFCLABEL('EARTHINGSWITCH'),IFCLABEL('ISOLATOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4216=IFCSIMPLEPROPERTYTEMPLATE('0UwlUTzxTCzwxNReTU$yZt',$,'LoadDisconnectionType','A list of the available types of load disconnection from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4217,$,$,$,.READWRITE.); -#4217=IFCPROPERTYENUMERATION('PEnum_LoadDisconnectionType',(IFCLABEL('OFFLOAD'),IFCLABEL('ONLOAD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4218=IFCPROPERTYSETTEMPLATE('3RRU4sFx96NRrYMTKpv_dx',$,'Pset_SwitchingDeviceTypeToggleSwitch','A toggle switch is a switch that enables or isolates electrical power through a two position on/off action. HISTORY: SetPoint added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/TOGGLESWITCH,IfcSwitchingDeviceType/TOGGLESWITCH',(#4219,#4221,#4223)); -#4219=IFCSIMPLEPROPERTYTEMPLATE('0hH_nkcCv9Wf5iSNIATMcu',$,'ToggleSwitchType','A list of the available types of toggle switch from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4220,$,$,$,.READWRITE.); -#4220=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceToggleSwitchType',(IFCLABEL('BREAKGLASS'),IFCLABEL('CHANGEOVER'),IFCLABEL('KEYOPERATED'),IFCLABEL('MANUALPULL'),IFCLABEL('PULLCORD'),IFCLABEL('PUSHBUTTON'),IFCLABEL('ROCKER'),IFCLABEL('SELECTOR'),IFCLABEL('TWIST'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4221=IFCSIMPLEPROPERTYTEMPLATE('3NmTgUlbn6jfxpz3BZVyZL',$,'SwitchUsage','A list of the available usages for switches from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4222,$,$,$,.READWRITE.); -#4222=IFCPROPERTYENUMERATION('PEnum_SwitchUsage',(IFCLABEL('EMERGENCY'),IFCLABEL('GUARD'),IFCLABEL('LIMIT'),IFCLABEL('START'),IFCLABEL('STOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4223=IFCSIMPLEPROPERTYTEMPLATE('2Vd$8L0Zv5IeHlmFlHHOm9',$,'SwitchActivation','A list of the available activations for switches from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4224,$,$,$,.READWRITE.); -#4224=IFCPROPERTYENUMERATION('PEnum_SwitchActivation',(IFCLABEL('ACTUATOR'),IFCLABEL('FOOT'),IFCLABEL('HAND'),IFCLABEL('PROXIMITY'),IFCLABEL('SOUND'),IFCLABEL('TWOHAND'),IFCLABEL('WIRE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4225=IFCPROPERTYSETTEMPLATE('0n2vEYWwDB1h2jLJOHekTa',$,'Pset_SymmetricPairCable','Properties applicable to a symmetric pair cable, which is is a copper cable with a variable number of copper twisted symmetric pair conductors used to transmit data by means of electrical signals. this property set is applicable to type or occurrence of IfcCableSegment with predefined type CABLESEGMENT',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CABLESEGMENT,IfcCableSegmentType/CABLESEGMENT',(#4226,#4227)); -#4226=IFCSIMPLEPROPERTYTEMPLATE('0mTnslmen079SIPhlKfbDa',$,'NumberOfTwistedPairs','Total number of twisted wire pairs in copper pair cables.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4227=IFCSIMPLEPROPERTYTEMPLATE('3MwGluw0n9RP$mayKmJMgV',$,'NumberOfUntwistedPairs','Total number of untwisted wire pairs in the copper pair cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4228=IFCPROPERTYSETTEMPLATE('2aL8cQpDT7AfNQL4bevZAr',$,'Pset_SystemFurnitureElementTypeCommon','Common properties for all systems furniture (I.e. modular furniture) element types (e.g. vertical panels, work surfaces, and storage). HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FurnitureElementCommon',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElement,IfcSystemFurnitureElementType',(#4229,#4230,#4231,#4232,#4233)); -#4229=IFCSIMPLEPROPERTYTEMPLATE('21BB4Z04fFmfpk6JZ9P6CZ',$,'IsUsed','Indicates whether the element is being used in a workstation (= TRUE) or not.(= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4230=IFCSIMPLEPROPERTYTEMPLATE('3frXq3QAbB1fQCOxVjCfKm',$,'GroupCode','e.g. panels, worksurfaces, storage, etc.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4231=IFCSIMPLEPROPERTYTEMPLATE('3bKxl2VN58jBVMjITAjCl2',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4232=IFCSIMPLEPROPERTYTEMPLATE('13Bd9PspXC2xxsmuWjNnvW',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A000A\X0\The nominal height of the system furniture elements of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4233=IFCSIMPLEPROPERTYTEMPLATE('0bdd46cIDCDO3_5MS6BsDt',$,'Finishing','The finishing applied to system furniture elements of this type e.g. walnut, fabric.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4234=IFCPROPERTYSETTEMPLATE('26zmKs7Zb4_hA2CJ_1sShY',$,'Pset_SystemFurnitureElementTypePanel','A set of specific properties for vertical panels that assembly workstations.. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Panel',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElement/PANEL,IfcSystemFurnitureElementType/PANEL',(#4235,#4236,#4238)); -#4235=IFCSIMPLEPROPERTYTEMPLATE('3q4robUfP0z92dd_NSoF_$',$,'HasOpening','indicates whether the panel has an opening (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4236=IFCSIMPLEPROPERTYTEMPLATE('1JvYAtHkX1Owz6S6tFjSsh',$,'FurniturePanelType','Available panel types from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4237,$,$,$,.READWRITE.); -#4237=IFCPROPERTYENUMERATION('PEnum_FurniturePanelType',(IFCLABEL('ACOUSTICAL'),IFCLABEL('DOOR'),IFCLABEL('ENDS'),IFCLABEL('GLAZED'),IFCLABEL('HORZ_SEG'),IFCLABEL('MONOLITHIC'),IFCLABEL('OPEN'),IFCLABEL('SCREEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4238=IFCSIMPLEPROPERTYTEMPLATE('0l0kQlZtrD39NQ$zbB2lcJ',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4239=IFCPROPERTYSETTEMPLATE('0EiCtf24b0g9eQnqSaB6El',$,'Pset_SystemFurnitureElementTypeSubrack','Properties of subrack used in railway telecom. The property set can be used by the predefined type SUBRACK of IfcSystemFurnitureElement',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElement/SUBRACK,IfcSystemFurnitureElementType/SUBRACK',(#4240,#4241,#4242)); -#4240=IFCSIMPLEPROPERTYTEMPLATE('2$vV9Derf63gP7EBJ9Vtbb',$,'NumberOfSlots','Indicates the number of slots.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4241=IFCSIMPLEPROPERTYTEMPLATE('3RjkTcVHn3ARs3tNzVa0am',$,'NumberOfUnits','Indicates the number of vertical units.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4242=IFCSIMPLEPROPERTYTEMPLATE('1ey91kTZf0g9NvKg07nHOm',$,'NumberOfOccupiedUnits','Indicates the number of vertical units occupied by the equipment.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4243=IFCPROPERTYSETTEMPLATE('26Z$zGAfP41eG700H3yhCB',$,'Pset_SystemFurnitureElementTypeWorkSurface','A set of specific properties for work surfaces used in workstations. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Worksurface',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElement/WORKSURFACE,IfcSystemFurnitureElementType/WORKSURFACE',(#4244,#4245,#4247,#4248,#4249)); -#4244=IFCSIMPLEPROPERTYTEMPLATE('1GdpXCgz95OQt8v5HPWCk0',$,'UsePurpose','The principal purpose for which the work surface is intended to be used e.g. writing/reading, computer, meeting, printer, reference files, etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4245=IFCSIMPLEPROPERTYTEMPLATE('3ocl1HIvT0of9xTGjxt7zx',$,'SupportType','Available support types from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4246,$,$,$,.READWRITE.); -#4246=IFCPROPERTYENUMERATION('PEnum_FurniturePanelType',(IFCLABEL('ACOUSTICAL'),IFCLABEL('DOOR'),IFCLABEL('ENDS'),IFCLABEL('GLAZED'),IFCLABEL('HORZ_SEG'),IFCLABEL('MONOLITHIC'),IFCLABEL('OPEN'),IFCLABEL('SCREEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4247=IFCSIMPLEPROPERTYTEMPLATE('2gBq_43vf0WO1c1xBJvwfO',$,'HangingHeight','The hanging height of the worksurface.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4248=IFCSIMPLEPROPERTYTEMPLATE('0i_gj1YAf2lQ8aquVsqqWX',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4249=IFCSIMPLEPROPERTYTEMPLATE('0Wfz15Fjf0YhZy1FqY5T1k',$,'ShapeDescription','A description of the shape of the work surface e.g. corner square, rectangle, etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4250=IFCPROPERTYSETTEMPLATE('1LJxpG8ob0w891TBrzkqIP',$,'Pset_TankOccurrence','Properties that relate to a tank. Note that a partial tank may be considered as a compartment within a compartmentalized tank.',.PSET_OCCURRENCEDRIVEN.,'IfcTank',(#4251,#4253,#4254)); -#4251=IFCSIMPLEPROPERTYTEMPLATE('3Zpu$kS$vADwQijWGR0dVv',$,'TankComposition','Defines the level of element composition where.COMPLEX: A set of elementary units aggregated together to fulfill the overall required purpose.\X2\000A\X0\ELEMENT: A single elementary unit that may exist of itself or as an aggregation of partial units..\X2\000A\X0\PARTIAL: A partial elementary unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4252,$,$,$,.READWRITE.); -#4252=IFCPROPERTYENUMERATION('PEnum_TankComposition',(IFCLABEL('COMPLEX'),IFCLABEL('ELEMENT'),IFCLABEL('PARTIAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4253=IFCSIMPLEPROPERTYTEMPLATE('2NMp6BTdH5m9Bauoo5qplK',$,'HasLadder','Indication of whether the tank is provided with a ladder (set TRUE) for access to the top. If no ladder is provided then value is set FALSE.Note: No indication is given of the type of ladder (gooseneck etc.)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4254=IFCSIMPLEPROPERTYTEMPLATE('3aEwQygIDFhe3GpgJud_$U',$,'HasVisualIndicator','Indication of whether the tank is provided with a visual indicator (set TRUE) that shows the water level in the tank. If no visual indicator is provided then value is set FALSE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4255=IFCPROPERTYSETTEMPLATE('2gVPiM40j5x8KRtkCEar22',$,'Pset_TankTypeCommon','Common attributes of a tank type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTank,IfcTankType',(#4256,#4257,#4259,#4261,#4263,#4264,#4265,#4266,#4267,#4268,#4269,#4271,#4273,#4274,#4275)); -#4256=IFCSIMPLEPROPERTYTEMPLATE('3BoyHYDRz4fxdHtBY$B_QT',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4257=IFCSIMPLEPROPERTYTEMPLATE('1KoK3cqVT87RPBcuOTAEwD',$,'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',$,#4258,$,$,$,.READWRITE.); -#4258=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4259=IFCSIMPLEPROPERTYTEMPLATE('037GrH1u5FvQKx5mo4aU10',$,'AccessType','Defines the types of access (or cover) to a tank that may be specified.Note that covers are generally specified for rectangular tanks. For cylindrical tanks, access will normally be via a manhole.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4260,$,$,$,.READWRITE.); -#4260=IFCPROPERTYENUMERATION('PEnum_TankAccessType',(IFCLABEL('LOOSECOVER'),IFCLABEL('MANHOLE'),IFCLABEL('NONE'),IFCLABEL('SECUREDCOVER'),IFCLABEL('SECUREDCOVERWITHMANHOLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4261=IFCSIMPLEPROPERTYTEMPLATE('3Lh6zo2qn6_vSqbY0Z$FzO',$,'StorageType','Defines the general material category intended to be stored.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4262,$,$,$,.READWRITE.); -#4262=IFCPROPERTYENUMERATION('PEnum_TankStorageType',(IFCLABEL('FUEL'),IFCLABEL('ICE'),IFCLABEL('OIL'),IFCLABEL('POTABLEWATER'),IFCLABEL('RAINWATER'),IFCLABEL('WASTEWATER'),IFCLABEL('WATER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4263=IFCSIMPLEPROPERTYTEMPLATE('1CjqjgBQz8wRiSxwdhrMjj',$,'NominalLengthOrDiameter','The nominal length or, in the case of a vertical cylindrical tank, the nominal diameter of the tank.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4264=IFCSIMPLEPROPERTYTEMPLATE('2Tt06yCmD56eDP6Pn26hxf',$,'NominalWidthOrDiameter','The nominal width or, in the case of a horizontal cylindrical tank, the nominal diameter of the tank.Note: Not required for a vertical cylindrical tank.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4265=IFCSIMPLEPROPERTYTEMPLATE('0IwZvw3Pz3lf5B0Y3fq9ZR',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4266=IFCSIMPLEPROPERTYTEMPLATE('1efZr5W795uxxv1$0KHd48',$,'TankNominalCapacity','The total nominal or design volumetric capacity of the tank.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#4267=IFCSIMPLEPROPERTYTEMPLATE('2Abj1mfX9Fr9H0CKhQ$kMZ',$,'EffectiveCapacity','The total effective or actual volumetric capacity of the tank.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#4268=IFCSIMPLEPROPERTYTEMPLATE('0GEtpf_Fz8oAeG86f3AuBc',$,'OperatingWeight','Operating weight of the tank including all of its contents.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#4269=IFCSIMPLEPROPERTYTEMPLATE('1zcGQXQ8n8GxcPHBSEL06Z',$,'PatternType','Defines the types of pattern (or shape of a tank that may be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4270,$,$,$,.READWRITE.); -#4270=IFCPROPERTYENUMERATION('PEnum_TankPatternType',(IFCLABEL('HORIZONTALCYLINDER'),IFCLABEL('RECTANGULAR'),IFCLABEL('VERTICALCYLINDER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4271=IFCSIMPLEPROPERTYTEMPLATE('0Z5FuHqw1F7BGs0$_r3bcv',$,'EndShapeType','Defines the types of end shapes that can be used for preformed tanks. The convention for reading these enumerated values is that for a vertical cylinder, the first value is the base and the second is the top; for a horizontal cylinder, the order of reading should be left to right. For a speherical tank, the value UNSET should be used.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4272,$,$,$,.READWRITE.); -#4272=IFCPROPERTYENUMERATION('PEnum_EndShapeType',(IFCLABEL('CONCAVECONVEX'),IFCLABEL('CONCAVEFLAT'),IFCLABEL('CONVEXCONVEX'),IFCLABEL('FLATCONVEX'),IFCLABEL('FLATFLAT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4273=IFCSIMPLEPROPERTYTEMPLATE('0cxy9eYlD7OR2GdhKRl$l7',$,'FirstCurvatureRadius','FirstCurvatureRadius should be defined as the base or left side radius of curvature value.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4274=IFCSIMPLEPROPERTYTEMPLATE('2odcYQlqTCOReAEolQ44DI',$,'SecondCurvatureRadius','SecondCurvatureRadius should be defined as the top or right side radius of curvature value.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4275=IFCSIMPLEPROPERTYTEMPLATE('0oPlt0MPX81RllrdTjII6$',$,'NumberOfSections','Number of sections.\X2\000A000A\X0\Number of sections used in the construction of the tank. Default is 1.Note: All sections assumed to be the same size.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4276=IFCPROPERTYSETTEMPLATE('3tw7pmmhDAiuxUFohNAqZF',$,'Pset_TankTypeExpansion','Common attributes of an expansion type tank.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTank/EXPANSION,IfcTankType/EXPANSION',(#4277,#4278,#4279)); -#4277=IFCSIMPLEPROPERTYTEMPLATE('07bVjyy7bD_Od5lCZcD4iC',$,'ChargePressure','Nominal or design operating pressure of the tank.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4278=IFCSIMPLEPROPERTYTEMPLATE('0xWsg_Jdz1oR6O_aFlky7R',$,'PressureRegulatorSetting','Pressure that is automatically maintained in the tank.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4279=IFCSIMPLEPROPERTYTEMPLATE('0toZPNTkD6xRPScYfKfoZG',$,'ReliefValveSetting','Pressure at which the relief valve activates.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4280=IFCPROPERTYSETTEMPLATE('22YUwP_0j1$92QaSwWBBM2',$,'Pset_TankTypePreformed','Fixed vessel manufactured as a single unit with one or more compartments for storing a liquid.Pset renamed from Pset_TankTypePreformedTank to Pset_TankTypePreformed in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTank,IfcTankType',(#4281,#4283,#4285,#4286)); -#4281=IFCSIMPLEPROPERTYTEMPLATE('0PX4fROXvEfAuehsChSiVx',$,'PatternType','Defines the types of pattern (or shape of a tank that may be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4282,$,$,$,.READWRITE.); -#4282=IFCPROPERTYENUMERATION('PEnum_TankPatternType',(IFCLABEL('HORIZONTALCYLINDER'),IFCLABEL('RECTANGULAR'),IFCLABEL('VERTICALCYLINDER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4283=IFCSIMPLEPROPERTYTEMPLATE('0NGf7FexL6ER18XUK5nDEV',$,'EndShapeType','Defines the types of end shapes that can be used for preformed tanks. The convention for reading these enumerated values is that for a vertical cylinder, the first value is the base and the second is the top; for a horizontal cylinder, the order of reading should be left to right. For a speherical tank, the value UNSET should be used.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4284,$,$,$,.READWRITE.); -#4284=IFCPROPERTYENUMERATION('PEnum_EndShapeType',(IFCLABEL('CONCAVECONVEX'),IFCLABEL('CONCAVEFLAT'),IFCLABEL('CONVEXCONVEX'),IFCLABEL('FLATCONVEX'),IFCLABEL('FLATFLAT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4285=IFCSIMPLEPROPERTYTEMPLATE('2O5e1O8lvFnP_bRXRBubf3',$,'FirstCurvatureRadius','FirstCurvatureRadius should be defined as the base or left side radius of curvature value.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4286=IFCSIMPLEPROPERTYTEMPLATE('1g0AD_K05Eru0GQBRSfTBk',$,'SecondCurvatureRadius','SecondCurvatureRadius should be defined as the top or right side radius of curvature value.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4287=IFCPROPERTYSETTEMPLATE('31bK1T_I1FHut8nEmWkPBT',$,'Pset_TankTypePressureVessel','Common attributes of a pressure vessel.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTank/PRESSUREVESSEL,IfcTankType/PRESSUREVESSEL',(#4288,#4289,#4290)); -#4288=IFCSIMPLEPROPERTYTEMPLATE('1e3aYfBf527vdl93G2heZM',$,'ChargePressure','Nominal or design operating pressure of the tank.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4289=IFCSIMPLEPROPERTYTEMPLATE('1CCkXJGzvCFAoPOAI9f2r4',$,'PressureRegulatorSetting','Pressure that is automatically maintained in the tank.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4290=IFCSIMPLEPROPERTYTEMPLATE('0xh5gGWQn8If$i0rihTkwR',$,'ReliefValveSetting','Pressure at which the relief valve activates.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4291=IFCPROPERTYSETTEMPLATE('1mETyovUr5bRjoMfMLb9lc',$,'Pset_TankTypeSectional','Fixed vessel constructed from sectional parts with one or more compartments for storing a liquid.Note (1): All sectional construction tanks are considered to be rectangular by default.\X2\000A\X0\Note (2): Generally, it is not expected that sectional construction tanks will be used for the purposes of gas storage.Pset renamed from Pset_TankTypeSectionalTank to Pset_TankTypeSectional in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTank,IfcTankType',(#4292,#4293,#4294)); -#4292=IFCSIMPLEPROPERTYTEMPLATE('2jk4uMIxrD48uxGjORO4_2',$,'NumberOfSections','Number of sections.\X2\000A000A\X0\Number of sections used in the construction of the tankNote: All sections assumed to be the same size.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4293=IFCSIMPLEPROPERTYTEMPLATE('3bP66LqnHDHO7lvarNLYOQ',$,'SectionLength','The length of a section used in the construction of the tank.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4294=IFCSIMPLEPROPERTYTEMPLATE('1yp0osYcbEjeV9gutbXO23',$,'SectionWidth','The width of a section used in the construction of the tank.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4295=IFCPROPERTYSETTEMPLATE('2mvbIqP$P06QNwnO3LViZ2',$,'Pset_TelecomCableGeneral','Properties common to occurrences and types of IfcCableSegment and IfcCableFitting applied in telecommunication domain.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting,IfcCableSegment,IfcCableFittingType,IfcCableSegmentType',(#4296,#4297,#4298,#4299,#4300,#4301,#4303)); -#4296=IFCSIMPLEPROPERTYTEMPLATE('35stiNH7LBRwiScOUZekjE',$,'Attenuation','Indicates the optical or electrical attenuation of the cable measured in dB, at a certain wavelength or frequency, changing with the length of the cable.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#4297=IFCSIMPLEPROPERTYTEMPLATE('36oGDKeFLBxgeRYr9qKvld',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4298=IFCSIMPLEPROPERTYTEMPLATE('3fUE9RWiL9Af_8vYVxkJ2B',$,'IsFireResistant','Indicates whether the cable is fire resistant.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4299=IFCSIMPLEPROPERTYTEMPLATE('3ofv3QNV98zfLkMHd099tJ',$,'NominalDiameter','Nominal diameter or width of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4300=IFCSIMPLEPROPERTYTEMPLATE('2JDal8NonEv87aJJgB_gXC',$,'JacketColour','Indicates the colour of the cable or fitting jacket.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4301=IFCSIMPLEPROPERTYTEMPLATE('2l_WsY62L5relo6Mj9WXlh',$,'CableFunctionType','Distinguishes between Telecom and Power Supply cables.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4302,$,$,$,.READWRITE.); -#4302=IFCPROPERTYENUMERATION('PEnum_CableFunctionType',(IFCLABEL('POWERSUPPLY'),IFCLABEL('TELECOMMUNICATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4303=IFCSIMPLEPROPERTYTEMPLATE('2t11z6JXT05wmvTgGRwU7Y',$,'CableArmourType','The armour type of the cable for mechanical protection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4304,$,$,$,.READWRITE.); -#4304=IFCPROPERTYENUMERATION('PEnum_CableArmourType',(IFCLABEL('DIELECTRIC'),IFCLABEL('METALLIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4305=IFCPROPERTYSETTEMPLATE('3x7lOhZgj9ShZoKDbtfBhM',$,'Pset_ThermalLoad','Properties for thermal loads of elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialElementType',(#4306,#4307,#4308,#4309,#4310,#4311,#4312,#4313,#4314,#4315,#4316,#4317,#4318)); -#4306=IFCSIMPLEPROPERTYTEMPLATE('08v3T8HyL1NAtNXZX1L3Ts',$,'OccupancyDiversity','Diversity factor that may be applied to the number of people in the space.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4307=IFCSIMPLEPROPERTYTEMPLATE('3eGaJHl0bDsO55okunGrMP',$,'LightingDiversity','Lighting diversity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4308=IFCSIMPLEPROPERTYTEMPLATE('1YT0xxj8H7vgsPu6gC3jFg',$,'ApplianceDiversity','Diversity of appliance load.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4309=IFCSIMPLEPROPERTYTEMPLATE('3y0F7kLKDFi88gjgt19Iqe',$,'OutsideAirPerPerson','Design quantity of outside air to be provided per person in the space.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#4310=IFCSIMPLEPROPERTYTEMPLATE('39urscJ9XEe9XE$GVsL3Eb',$,'ReceptacleLoadIntensity','Average power use intensity of appliances and other non-HVAC equipment in the space per unit area.(PowerMeasure/IfcAreaMeasure).',.P_SINGLEVALUE.,'IfcHeatFluxDensityMeasure',$,$,$,$,$,.READWRITE.); -#4311=IFCSIMPLEPROPERTYTEMPLATE('29i$ocSgz7$9ChSv0$HzEp',$,'AppliancePercentLoadToRadiant','Percent of sensible load to radiant heat.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4312=IFCSIMPLEPROPERTYTEMPLATE('0ikRRQ6Wv2DvyTkK1oWrLg',$,'LightingLoadIntensity','Average lighting load intensity in the space per unit area (PowerMeasure/IfcAreaMeasure).',.P_SINGLEVALUE.,'IfcHeatFluxDensityMeasure',$,$,$,$,$,.READWRITE.); -#4313=IFCSIMPLEPROPERTYTEMPLATE('25uOx49q17uf$pOLL3fHNB',$,'LightingPercentLoadToReturnAir','Percent of lighting load to the return air plenum.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4314=IFCSIMPLEPROPERTYTEMPLATE('0pO4ouhJjFgeeu4XSSjEhk',$,'TotalCoolingLoad','The peak total cooling load for the building, zone or space.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4315=IFCSIMPLEPROPERTYTEMPLATE('0x6KTjPvv6Aha6qhTBWFd9',$,'TotalHeatingLoad','The peak total heating load for the building, zone or space.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4316=IFCSIMPLEPROPERTYTEMPLATE('1_BXpBefbDJgaxMZT0yDcK',$,'InfiltrationDiversitySummer','Diversity factor for Summer infiltration.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4317=IFCSIMPLEPROPERTYTEMPLATE('1aFrcm6h9BUxMTe20oyFel',$,'InfiltrationDiversityWinter','Diversity factor for Winter infiltration.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4318=IFCSIMPLEPROPERTYTEMPLATE('2EAb_YR6D9Ggyi2617AuV9',$,'LoadSafetyFactor','Load safety factor.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4319=IFCPROPERTYSETTEMPLATE('06sB9bjAf0K8KdxSTFbQvu',$,'Pset_TicketProcessing','Properties for indicating performance ratings for ticket processing of entry elements (e.g. turnstile, boom barrier).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor/BOOM_BARRIER,IfcDoor/TURNSTILE,IfcDoorType/BOOM_BARRIER,IfcDoorType/TURNSTILE',(#4320,#4321)); -#4320=IFCSIMPLEPROPERTYTEMPLATE('1JbKI4SgL2vQqq1Lb88ToA',$,'TicketProcessingTime','Indicates the processing time of a ticket.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#4321=IFCSIMPLEPROPERTYTEMPLATE('2h6AFRLu57FxOFVA8kYjQp',$,'TicketStuckRatio','Indicates the ratio of tickets being stuck or jammed in the appliance.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4322=IFCPROPERTYSETTEMPLATE('3vM4G$$QP7ofNGLr4jVums',$,'Pset_TicketVendingMachine','Properties of ticket vending machine. The property set can be used by IfcElectricAppliance with PredefinedType VENDINGMACHINE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricAppliance/VENDINGMACHINE,IfcElectricApplianceType/VENDINGMACHINE',(#4323,#4324,#4325,#4327,#4328,#4330)); -#4323=IFCSIMPLEPROPERTYTEMPLATE('0nn3S35E5AIRx4_y38VHnt',$,'TicketStuckRatio','Indicates the ratio of tickets being stuck or jammed in the appliance.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4324=IFCSIMPLEPROPERTYTEMPLATE('0VtNAv4JH6wRgkUVjL8$JZ',$,'MoneyStuckRatio','Indicates the ratio of money being stuck or jammed in appliance.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4325=IFCSIMPLEPROPERTYTEMPLATE('3JM$XZBy52zxDLbC_btSbv',$,'PaymentMethod','Indicates the vending machine payment method.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4326,$,$,$,.READWRITE.); -#4326=IFCPROPERTYENUMERATION('PEnum_PaymentMethod',(IFCLABEL('CARD'),IFCLABEL('CASH'),IFCLABEL('E_PAYMENT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4327=IFCSIMPLEPROPERTYTEMPLATE('0r2sSrAafET81IrmeCMYlb',$,'TicketProductionSpeed','Indicates the production speed of the ticket. It is measured by counting the number of tickets that can be produced per hour.',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); -#4328=IFCSIMPLEPROPERTYTEMPLATE('2aZlVtHgD57wwpmK2de5X3',$,'TicketVendingMachineType','Indicates the type of ticket vending machine.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4329,$,$,$,.READWRITE.); -#4329=IFCPROPERTYENUMERATION('PEnum_TicketVendingMachineType',(IFCLABEL('TICKETREDEMPTIONMACHINE'),IFCLABEL('TICKETREFUNDINGMACHINE'),IFCLABEL('TICKETVENDINGMACHINE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4330=IFCSIMPLEPROPERTYTEMPLATE('0_dM1rln97mPgIp3BqOqfc',$,'VendingMachineUserInterface','Indicates the type of vending machine user interface.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4331,$,$,$,.READWRITE.); -#4331=IFCPROPERTYENUMERATION('PEnum_VendingMachineUserInterface',(IFCLABEL('MOUSECHOOSETYPE'),IFCLABEL('TOUCHSCREEN'),IFCLABEL('TOUCH_TONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4332=IFCPROPERTYSETTEMPLATE('1D43V$VJr5Cw$r5CSgbC$z',$,'Pset_Tiling','Properties about tiles.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPavement,IfcCovering,IfcPavementType,IfcCoveringType',(#4333,#4334,#4335)); -#4333=IFCSIMPLEPROPERTYTEMPLATE('35OVpXVybDzAQYlxC5qDYv',$,'Permeability','Ratio of the permeability of the ceiling.\X2\000A\X0\The ration can be used to indicate an open ceiling (that enables identification of whether ceiling construction should be considered as impeding distribution of sprinkler water, light etc. from installations within the ceiling area).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#4334=IFCSIMPLEPROPERTYTEMPLATE('3tVk3xaqP3G9Xr3f_66L3z',$,'TileLength','Length of ceiling tiles. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4335=IFCSIMPLEPROPERTYTEMPLATE('1bbBNuWnrEtBPqwrQNlwKC',$,'TileWidth','Width of ceiling tiles. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4336=IFCPROPERTYSETTEMPLATE('2YNsgxY0H6qB0B7j4eobwx',$,'Pset_Tolerance','Properties expressing the tolerance relating to locating and shaping of an intended element or feature. Range diameters are non-negative describing a linear, rectangular or boxed region .',.PSET_TYPEDRIVENOVERRIDE.,'IfcProduct,IfcTypeProduct',(#4337,#4338,#4340,#4341,#4342,#4343,#4344,#4345,#4346,#4347,#4348,#4349,#4350,#4351,#4352,#4353,#4354,#4355)); -#4337=IFCSIMPLEPROPERTYTEMPLATE('2HHu$xJXb8tA7LAeiq4a2a',$,'ToleranceDescription','General description of the tolerance associated to the element or feature, its source and implications.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#4338=IFCSIMPLEPROPERTYTEMPLATE('2HxsJpnGz7OvFVzGYOqt4c',$,'ToleranceBasis','Indication of the basis of the tolerance requirement',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4339,$,$,$,.READWRITE.); -#4339=IFCPROPERTYENUMERATION('PEnum_ToleranceBasis',(IFCLABEL('APPEARANCE'),IFCLABEL('ASSEMBLY'),IFCLABEL('DEFLECTION'),IFCLABEL('EXPANSION'),IFCLABEL('FUNCTIONALITY'),IFCLABEL('SETTLEMENT'),IFCLABEL('STRUCTURAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4340=IFCSIMPLEPROPERTYTEMPLATE('31Icu3Ud96iRLBv11Y7CaK',$,'OverallTolerance','Indicative (95%-100%) range tolerance associated to the intended shape and position in XYZ.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4341=IFCSIMPLEPROPERTYTEMPLATE('3JnG62M1P8IuGHdu6kj$yN',$,'HorizontalTolerance','Indicative (95%-100%) range tolerance associated to the horizontal shape and position in X, if different to the overall tolerance.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4342=IFCSIMPLEPROPERTYTEMPLATE('13w2dFNq582hiOm8gXJ6wA',$,'OrthogonalTolerance','Indicative (95%-100%) range tolerance associated to the horizontal shape and position in Y, if different to the overall tolerance.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4343=IFCSIMPLEPROPERTYTEMPLATE('1AzSap7qH3s9xC56K_zCPF',$,'VerticalTolerance','Indicative (95%-100%) range tolerance associated to the vertical shape and position in Z, if different to the overall tolerance.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4344=IFCSIMPLEPROPERTYTEMPLATE('0ow1315sD7bwoNsgGfZx9e',$,'PlanarFlatness','Indicative (95%-100%) range flatness associated to the intended shape and position in XYZ.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4345=IFCSIMPLEPROPERTYTEMPLATE('1dMnp7O8TFNwS$8jyaqsP2',$,'HorizontalFlatness','Indicative (95%-100%) range flatness associated to the horizontal surface in XY, if different to the overall flatness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4346=IFCSIMPLEPROPERTYTEMPLATE('2N74Xam7b0KgDjKq89Jkw8',$,'ElevationalFlatness','Indicative (95%-100%) range flatness associated to the elevational surface in ZX, if different to the overall flatness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4347=IFCSIMPLEPROPERTYTEMPLATE('3z7uiedar3afMyy8vk0FGT',$,'SideFlatness','Indicative (95%-100%) range flatness associated to the side surface in YZ, if different to the overall flatness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4348=IFCSIMPLEPROPERTYTEMPLATE('3pXVEfJJPEJQlT4iQv$boc',$,'OverallOrthogonality','Indicative (95%-100%) range orthogonality associated to the intended shape and orientation in XYZ.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#4349=IFCSIMPLEPROPERTYTEMPLATE('09lL9gs7TCYw2HsZcoGvCR',$,'HorizontalOrthogonality','Indicative (95%-100%) range orthogonality associated to the horizontal shape and orientation in X, if different to the overall orthogonality.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#4350=IFCSIMPLEPROPERTYTEMPLATE('1hld3GvXP8Q9OLT34F9ZiT',$,'OrthogonalOrthogonality','Indicative (95%-100%) range orthogonality associated to the horizontal shape and orientation in Y, if different to the overall orthogonality.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#4351=IFCSIMPLEPROPERTYTEMPLATE('3avoHm$Zv1O9EpNqcxu5so',$,'VerticalOrthogonality','Indicative (95%-100%) range orthogonality associated to the vertical shape and orientation in Z, if different to the overall orthogonality.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); -#4352=IFCSIMPLEPROPERTYTEMPLATE('1IGfUveu1FNPu1LIgElYo9',$,'OverallStraightness','Indicative (95%-100%) range straightness associated to the intended shape.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4353=IFCSIMPLEPROPERTYTEMPLATE('1ZGwfNBFv9VegY6ClIvPys',$,'HorizontalStraightness','Indicative (95%-100%) range straightness associated to the horizontal shape in X, if different to the overall straightness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4354=IFCSIMPLEPROPERTYTEMPLATE('3jQIdqxnHCpueQOS$n1DzK',$,'OrthogonalStraightness','Indicative (95%-100%) range straightness associated to the horizontal shape in Y, if different to the overall straightness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4355=IFCSIMPLEPROPERTYTEMPLATE('3JZtMAmsD08OK4rTcqksbt',$,'VerticalStraightness','Indicative (95%-100%) range straightness associated to the vertical shape in Z, if different to the overall straightness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4356=IFCPROPERTYSETTEMPLATE('3i_RHtwov52eLYCBtE9dNY',$,'Pset_TrackBase','Properties in this property set are applicable for IfcSlab with PredefinedType BASESLAB, indicated that the base slab is a track base slab.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab/BASESLAB,IfcSlabType/BASESLAB',(#4357,#4358)); -#4357=IFCSIMPLEPROPERTYTEMPLATE('2oTazFKjXEJAqn69$djHFo',$,'IsSurfaceGalling','Indicates whether the surface is galling or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4358=IFCSIMPLEPROPERTYTEMPLATE('3F8hOJgln9yPXQyLCh2MEa',$,'SurfaceGallingArea','The galling area of the object surface.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#4359=IFCPROPERTYSETTEMPLATE('1OPgwBNyHCCwXnpHqeHp5G',$,'Pset_TrackElementOccurrenceSleeper','Properties common to the definition to all occurrences of IfcTrackElement with PredefinedType set to SLEEPER.',.PSET_OCCURRENCEDRIVEN.,'IfcTrackElement/SLEEPER',(#4360,#4361,#4362,#4364)); -#4360=IFCSIMPLEPROPERTYTEMPLATE('1JjMRpSQ1BfxJ5_nNww_JY',$,'HasSpecialEquipment','Indicates whether the sleeper has any special equipment for fastening components (e.g. Balise, signum magnet) or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4361=IFCSIMPLEPROPERTYTEMPLATE('2xlmIh0vb7DRsS0cVsqOMF',$,'SequenceInTrackPanel','Sequence of the sleeper within the track panel.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); -#4362=IFCSIMPLEPROPERTYTEMPLATE('1Nl4EAJkr35gm2qQco4eF9',$,'UnderSleeperPadStiffness','Indicates the stiffness of the under-sleeper pad as design reference for the sleeper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4363,$,$,$,.READWRITE.); -#4363=IFCPROPERTYENUMERATION('PEnum_UnderSleeperPadStiffness',(IFCLABEL('MEDIUM'),IFCLABEL('SOFT'),IFCLABEL('STIFF'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4364=IFCSIMPLEPROPERTYTEMPLATE('3LkfLHjuz5WOU1MNHu09Y_',$,'IsContaminatedSleeper','Indicates whether the sleeper is contaminated and requires special disposal or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4365=IFCPROPERTYSETTEMPLATE('2Wxdda0pjBSvfO2DC8BLqc',$,'Pset_TrackElementPHistoryDerailer','Indicates derailer information over time for operation management.',.PSET_PERFORMANCEDRIVEN.,'IfcTrackElement/DERAILER',(#4366)); -#4366=IFCSIMPLEPROPERTYTEMPLATE('26TMOtZr1CzhoEwaKrkbxG',$,'IsDerailing','Indicates whether the derailer is on or not.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4367=IFCPROPERTYSETTEMPLATE('3Okj2xEfnFLhLHHJsOYGDT',$,'Pset_TrackElementTypeDerailer','Properties common to the definition to all occurrences and types of IfcTrackElement with PredefinedType set to DERAILER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTrackElement/DERAILER,IfcTrackElementType/DERAILER',(#4368,#4369,#4370,#4371)); -#4368=IFCSIMPLEPROPERTYTEMPLATE('22ZXb1IlfEye0qaxUmFQTg',$,'AppliedLineLoad','The load of line where the derailer is installed. It is a design parameter and is defined by mass per length.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); -#4369=IFCSIMPLEPROPERTYTEMPLATE('3jzbsbH$16X96Ak3hfsVeb',$,'DerailmentMaximumSpeedLimit','Indicates the maximum allowable train speed for the derailer.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); -#4370=IFCSIMPLEPROPERTYTEMPLATE('08AOH5UszF_9nR1ANdqn0g',$,'DerailmentWheelDiameter','Indicates the wheel diameter requirement for the derailer.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4371=IFCSIMPLEPROPERTYTEMPLATE('1kPr3qmhPBAR8W5MSeZV7u',$,'DerailmentHeight','Height of derailment block when derailer in protection state.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4372=IFCPROPERTYSETTEMPLATE('2BC7REWjv94Ak1xe6jqwup',$,'Pset_TrackElementTypeSleeper','Properties common to the definition to all occurrences and types of IfcTrackElement with PredefinedType set to SLEEPER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTrackElement/SLEEPER,IfcTrackElementType/SLEEPER',(#4373,#4375,#4377,#4378,#4379,#4380,#4381,#4382)); -#4373=IFCSIMPLEPROPERTYTEMPLATE('3Cw_1EOFz6QBwfygDSfOBA',$,'InstalledCondition','Assessment of the condition of the element at point of installation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4374,$,$,$,.READWRITE.); -#4374=IFCPROPERTYENUMERATION('PEnum_InstalledCondition',(IFCLABEL('NEW'),IFCLABEL('REGENERATED'),IFCLABEL('REUSED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4375=IFCSIMPLEPROPERTYTEMPLATE('0fhgCs0Sn8XOUqbac4TZcT',$,'SleeperType','Indicates the sleeper type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4376,$,$,$,.READWRITE.); -#4376=IFCPROPERTYENUMERATION('PEnum_SleeperType',(IFCLABEL('COMPOSITESLEEPER'),IFCLABEL('CONCRETESLEEPER'),IFCLABEL('INSULATEDSTEELSLEEPER'),IFCLABEL('MONOBLOCKCONCRETESLEEPER'),IFCLABEL('NOTINSULATEDSTEELSLEEPER'),IFCLABEL('TWOBLOCKCONCRETESLEEPER'),IFCLABEL('WOODENSLEEPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4377=IFCSIMPLEPROPERTYTEMPLATE('1EW1q7QAL61Q_7D7fjnnjc',$,'TechnicalStandard','The technical standard which the element should comply with.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); -#4378=IFCSIMPLEPROPERTYTEMPLATE('06kiLtjjb2u91kNuFHzrcA',$,'FasteningType','Indicates the type of fastening used to generate traction between the foot of the rail and the sleeper. It depends on but is not uniquely identified by the type of sleeper. This property shall only be used when sleeper fastening is not modelled as an element.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4379=IFCSIMPLEPROPERTYTEMPLATE('3UwG75xIj9d9OLjHUJ3KPm',$,'IsElectricallyInsulated','Indicates whether the sleeper is electrically insulated due to its design or the running rails or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4380=IFCSIMPLEPROPERTYTEMPLATE('1ZRb1ti5f8YxBPkIvYNgu5',$,'HollowSleeperUsage','Indicates the purpose of using hollow sleeper. The possible value can be eg. cable trenching, protection of turnout mechanism, etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4381=IFCSIMPLEPROPERTYTEMPLATE('0AbmXZMKLE0xH41ozIBYx8',$,'NumberOfTrackCenters','Indicates the number of track centers running over the sleepers.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4382=IFCSIMPLEPROPERTYTEMPLATE('1ea5wjoGb1KhszpndOR5nu',$,'IsHollowSleeper','Indicates whether the sleeper is hollowed or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4383=IFCPROPERTYSETTEMPLATE('06kC866P524QrWU4cptyvv',$,'Pset_TractionPowerSystem','Properties of a traction power system. The property is associated to the predefined type ELECTRICAL of IfcDistributionSystem, and is used to characterise systems such as railway electrical distribution networks used to provide energy for rolling stock.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem/ELECTRICAL',(#4384,#4386,#4388,#4389)); -#4384=IFCSIMPLEPROPERTYTEMPLATE('1Uw73OfH5DMgar9RJIqz9G',$,'PowerSupplyMode','Power supply mode of the equipment or system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4385,$,$,$,.READWRITE.); -#4385=IFCPROPERTYENUMERATION('PEnum_PowerSupplyMode',(IFCLABEL('AC'),IFCLABEL('DC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4386=IFCSIMPLEPROPERTYTEMPLATE('3L4mynupLF7O4rxaxSc62a',$,'ElectrificationType','Indicates the type of railway electrification.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4387,$,$,$,.READWRITE.); -#4387=IFCPROPERTYENUMERATION('PEnum_ElectrificationType',(IFCLABEL('AC'),IFCLABEL('DC'),IFCLABEL('NON_ELECTRIFIED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4388=IFCSIMPLEPROPERTYTEMPLATE('339oSlpV55MxgirvU$OFjJ',$,'RatedFrequency','Frequency of the AC electric power supply when the device or system reaches its optimum operating condition.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#4389=IFCSIMPLEPROPERTYTEMPLATE('0vrZdFxATFMxyH7HSs2ttg',$,'NominalVoltage','The optimum voltage for the electrical appliance or system.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4390=IFCPROPERTYSETTEMPLATE('3GskYZt2z7EvqctAmstNvq',$,'Pset_TrafficCalmingDeviceCommon','Properties for a traffic calming device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/TRAFFIC_CALMING_DEVICE,IfcElementAssemblyType/TRAFFIC_CALMING_DEVICE',(#4391)); -#4391=IFCSIMPLEPROPERTYTEMPLATE('1LWMUGpsr3sQLIhnNzy$Fe',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4392=IFCPROPERTYSETTEMPLATE('32MdMDX8XADwdG7XWHZTtn',$,'Pset_TransformerTypeCommon','An inductive stationary device that transfers electrical energy from one circuit to another.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTransformer,IfcTransformerType',(#4393,#4394,#4396,#4397,#4398,#4399,#4400,#4401,#4402,#4403,#4404,#4405,#4407,#4408,#4409,#4410,#4412,#4413)); -#4393=IFCSIMPLEPROPERTYTEMPLATE('151cT0PLX8_uijWnueWZzu',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4394=IFCSIMPLEPROPERTYTEMPLATE('3s6h0BeRfBe9vGj7ywUJB3',$,'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',$,#4395,$,$,$,.READWRITE.); -#4395=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4396=IFCSIMPLEPROPERTYTEMPLATE('2GSIzOZ016Fx2f3K9yr82C',$,'PrimaryVoltage','The voltage that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4397=IFCSIMPLEPROPERTYTEMPLATE('0AM$DbarT4_RKhpbS0KcB$',$,'SecondaryVoltage','The voltage that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4398=IFCSIMPLEPROPERTYTEMPLATE('16TPTtcK15sPdNrnkY_uIj',$,'PrimaryCurrent','The current that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#4399=IFCSIMPLEPROPERTYTEMPLATE('36kB795rD1NO_sPpyRUCs5',$,'SecondaryCurrent','The current that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#4400=IFCSIMPLEPROPERTYTEMPLATE('3Nk44JqNz71BMcYLhz4h50',$,'PrimaryFrequency','The frequency that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#4401=IFCSIMPLEPROPERTYTEMPLATE('2Kc77m2Ur0Txsv6$uAJNw$',$,'SecondaryFrequency','The frequency that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#4402=IFCSIMPLEPROPERTYTEMPLATE('3mj4cEuJHElQSqq$oIlLke',$,'PrimaryApparentPower','The power in VA (volt ampere) that has been transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4403=IFCSIMPLEPROPERTYTEMPLATE('32Y9EKlrX7ggvykmq0CFQu',$,'SecondaryApparentPower','The power in VA (volt ampere) that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4404=IFCSIMPLEPROPERTYTEMPLATE('0KtV7t3G5EIOrSN$MlsEuR',$,'MaximumApparentPower','Maximum apparent power/capacity in VA (volt ampere).',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4405=IFCSIMPLEPROPERTYTEMPLATE('3zC$W7XUbC6RiCI9mR6u1f',$,'SecondaryCurrentType','A list of the secondary current types that can result from transformer output.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4406,$,$,$,.READWRITE.); -#4406=IFCPROPERTYENUMERATION('PEnum_SecondaryCurrentType',(IFCLABEL('AC'),IFCLABEL('DC'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4407=IFCSIMPLEPROPERTYTEMPLATE('07VYsggiP0RwlLPw7wh1hS',$,'ShortCircuitVoltage','A complex number that specifies the real and imaginary parts of the short-circuit voltage at rated current of a transformer given in %.',.P_SINGLEVALUE.,'IfcComplexNumber',$,$,$,$,$,.READWRITE.); -#4408=IFCSIMPLEPROPERTYTEMPLATE('3GL_r$d4b8Efg7MlM_NMyg',$,'RealImpedanceRatio','The ratio between the real part of the zero sequence impedance and the real part of the positive impedance (i.e. real part of the short-circuit voltage) of the transformer.\X2\000A\X0\Used for three-phase transformer which includes a N-conductor.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4409=IFCSIMPLEPROPERTYTEMPLATE('3xN4mr$5b0UebTmEhqoz5S',$,'ImaginaryImpedanceRatio','The ratio between the imaginary part of the zero sequence impedance and the imaginary part of the positive impedance (i.e. imaginary part of the short-circuit voltage) of the transformer.\X2\000A\X0\Used for three-phase transformer which includes a N-conductor.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4410=IFCSIMPLEPROPERTYTEMPLATE('2FensYE3TAcuU1DpiTlLm3',$,'TransformerVectorGroup','List of the possible vector groups for the transformer from which that required may be set. Values in the enumeration list follow a standard international code where the first letter describes how the primary windings are connected,\X2\000A\X0\the second letter describes how the secondary windings are connected, and the numbers describe the rotation of voltages and currents from the primary to the secondary side in multiples of 30 degrees.D: means that the windings are delta-connected.\X2\000A\X0\Y: means that the windings are star-connected.\X2\000A\X0\Z: means that the windings are zig-zag connected (a special start-connected providing low reactance of the transformer);\X2\000A\X0\The connectivity is only relevant for three-phase transformers.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4411,$,$,$,.READWRITE.); -#4411=IFCPROPERTYENUMERATION('PEnum_TransformerVectorGroup',(IFCLABEL('DD0'),IFCLABEL('DD6'),IFCLABEL('DY11'),IFCLABEL('DY5'),IFCLABEL('DZ0'),IFCLABEL('DZ6'),IFCLABEL('YD11'),IFCLABEL('YD5'),IFCLABEL('YY0'),IFCLABEL('YY6'),IFCLABEL('YZ11'),IFCLABEL('YZ5'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4412=IFCSIMPLEPROPERTYTEMPLATE('3_48WbwsvBhBlJa7_8VkxD',$,'IsNeutralPrimaryTerminalAvailable','An indication of whether the neutral point of the primary winding is available as a terminal (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4413=IFCSIMPLEPROPERTYTEMPLATE('22XXCi0XrDOuqshjCViKpj',$,'IsNeutralSecondaryTerminalAvailable','An indication of whether the neutral point of the secondary winding is available as a terminal (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4414=IFCPROPERTYSETTEMPLATE('2S30JOC8nFI8VfSAS3tPMJ',$,'Pset_TransitionSectionCommon','Properties for a transition section.',.PSET_OCCURRENCEDRIVEN.,'IfcEarthworksFill/TRANSITIONSECTION',(#4415)); -#4415=IFCSIMPLEPROPERTYTEMPLATE('30ncGAZnL2w8RNTrXgt9Kp',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4416=IFCPROPERTYSETTEMPLATE('0M_UgXYIr8_vZfkKnX2p$v',$,'Pset_TransportElementCommon','Properties common to the definition of all occurrences of IfcTransportElement or IfcTransportElementType',.PSET_TYPEDRIVENOVERRIDE.,'IfcTransportationDevice,IfcTransportationDeviceType',(#4417,#4418,#4420,#4421,#4422)); -#4417=IFCSIMPLEPROPERTYTEMPLATE('190zApsK524eHUUpL8OPAM',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4418=IFCSIMPLEPROPERTYTEMPLATE('2P4NmU$rH9OhX0GOjDUfn4',$,'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',$,#4419,$,$,$,.READWRITE.); -#4419=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4420=IFCSIMPLEPROPERTYTEMPLATE('3kVg5czQXFnxJvSzldMJ3Y',$,'CapacityPeople','Capacity of the transportation element measured in numbers of person.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4421=IFCSIMPLEPROPERTYTEMPLATE('3dUxBho6f3dhMgLPUuA8Fp',$,'CapacityWeight','Capacity of the transport element measured by weight.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#4422=IFCSIMPLEPROPERTYTEMPLATE('1JViJoMtj69exJeVEvrK0S',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here whether the transport element (in case of e.g., a lift) is designed to serve as a fire exit, e.g., for fire escape purposes.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4423=IFCPROPERTYSETTEMPLATE('0E4xJcLL9FchD5Lk2xLj2j',$,'Pset_TransportElementElevator','Properties common to the definition of all occurrences of IfcTransportElement with the predefined type ="ELEVATOR"',.PSET_TYPEDRIVENOVERRIDE.,'IfcTransportElement/ELEVATOR,IfcTransportElementType/ELEVATOR',(#4424,#4425,#4426,#4427)); -#4424=IFCSIMPLEPROPERTYTEMPLATE('1WsiK5V4r6OBJVL1u4Y8Xi',$,'FireFightingLift','Indication whether the elevator is designed to serve as a fire fighting lift the case of fire (TRUE) or not (FALSE). A fire fighting lift is used by fire fighters to access the location of fire and to evacuate people.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4425=IFCSIMPLEPROPERTYTEMPLATE('0WIouzJc57K9X9pFd5cVdF',$,'ClearWidth','The clear width.\X2\000A000A\X0\It indicates the distance from the inner surfaces of the elevator car left and right from the elevator door.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4426=IFCSIMPLEPROPERTYTEMPLATE('3U9SkkXi94SgnZuevtdkPP',$,'ClearDepth','The clear depth.\X2\000A000A\X0\It indicates the distance from the inner surface of the elevator door to the opposite surface of the elevator car.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4427=IFCSIMPLEPROPERTYTEMPLATE('08wkC8stL29gZDWxZBG3Mk',$,'ClearHeight','Clear height of the object (elevator).\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4428=IFCPROPERTYSETTEMPLATE('165iSctzb6DemVF3WOPMIX',$,'Pset_TransportEquipmentOTN','Properties in this property set are applied to transport equipment that act in optical transport network (OTN) system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/TRANSPORTEQUIPMENT,IfcCommunicationsApplianceType/TRANSPORTEQUIPMENT',(#4429,#4430,#4431,#4432,#4433,#4434,#4435)); -#4429=IFCSIMPLEPROPERTYTEMPLATE('3xB4bG6yLDQeNih3IXk3ys',$,'SingleChannelAveragePower','Indicates the average power of a single channel of the transport equipment.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4430=IFCSIMPLEPROPERTYTEMPLATE('2WEyvX6R1ABO_tfjKvzRyX',$,'ChromaticDispersionTolerance','Indicates the tolerance of the transport equipment chromatic dispersion. The value is defined by picosecond per nanometer (ps/nm).',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#4431=IFCSIMPLEPROPERTYTEMPLATE('0lsC9wY518pfG4WJGxp063',$,'SingleChannelPower','Indicates the power range of a single channel of the transport equipment.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4432=IFCSIMPLEPROPERTYTEMPLATE('3u$goNoTP4nRmFhl8_OHOF',$,'MinimumOpticalSignalToNoiseRatio','Indicates the minimum optical signal to noise ratio of the transport equipment.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4433=IFCSIMPLEPROPERTYTEMPLATE('2WymtB5Ib9T9umHkl37iKw',$,'PolarizationModeDispersionTolerance','Indicates the polarization mode dispersion tolerance of the transport equipment. It is usually measured by picosecond.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); -#4434=IFCSIMPLEPROPERTYTEMPLATE('2Vnp9P9gjDvR6v$VZM$Nzp',$,'SingleWaveTransmissionRate','Indicates the single wave transmission rate of the transport equipment.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#4435=IFCSIMPLEPROPERTYTEMPLATE('2EQq75c7H0PgCdyYF9sLAz',$,'EquipmentCapacity','Indicates the equipment capacity of the appliance. The value is defined in bits/s.',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); -#4436=IFCPROPERTYSETTEMPLATE('0JeLdmK4X9EfzD6Jh3$itb',$,'Pset_TrenchExcavationCommon','Properties for a trench excavation.',.PSET_OCCURRENCEDRIVEN.,'IfcEarthworksCut/TRENCH',(#4437,#4438)); -#4437=IFCSIMPLEPROPERTYTEMPLATE('3qSZk9sjDDQ9gt8tam9viK',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4438=IFCSIMPLEPROPERTYTEMPLATE('0RtJhB$oL7jeEzGYsJKnD8',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4439=IFCPROPERTYSETTEMPLATE('04$JER3JzC$uc9zSnBYB1e',$,'Pset_TubeBundleTypeCommon','Tube bundle type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTubeBundle,IfcTubeBundleType',(#4440,#4441,#4443,#4444,#4445,#4446,#4447,#4448,#4449,#4450,#4451,#4452,#4453,#4454,#4455,#4456)); -#4440=IFCSIMPLEPROPERTYTEMPLATE('0PzPEBo_T16P6fjKscOnQX',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4441=IFCSIMPLEPROPERTYTEMPLATE('0uAC$c0Fr5$hpiG5ZdC8wy',$,'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',$,#4442,$,$,$,.READWRITE.); -#4442=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4443=IFCSIMPLEPROPERTYTEMPLATE('1CSs4aX9bEkQdFf_OaBcji',$,'NumberOfRows','Number of tube rows in the tube bundle assembly.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4444=IFCSIMPLEPROPERTYTEMPLATE('2GY1NHSTjAlxfMrA2kvK7L',$,'StaggeredRowSpacing','Staggered tube row spacing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4445=IFCSIMPLEPROPERTYTEMPLATE('3E4RvPEOf2Vx$eespZErs0',$,'InLineRowSpacing','In-line tube row spacing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4446=IFCSIMPLEPROPERTYTEMPLATE('3zZRLfPQbAXvcfbqbcu_3N',$,'NumberOfCircuits','Number of circuits.\X2\000A000A\X0\Number of parallel fluid tube circuits.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4447=IFCSIMPLEPROPERTYTEMPLATE('03ZgfoYTDBs90ocWWNv_Nm',$,'FoulingFactor','Fouling factor of the tubes in the tube bundle.',.P_SINGLEVALUE.,'IfcThermalResistanceMeasure',$,$,$,$,$,.READWRITE.); -#4448=IFCSIMPLEPROPERTYTEMPLATE('1uPLQtjrfAbhLrULCkyQHh',$,'ThermalConductivity','The thermal conductivity of the object.',.P_SINGLEVALUE.,'IfcThermalConductivityMeasure',$,$,$,$,$,.READWRITE.); -#4449=IFCSIMPLEPROPERTYTEMPLATE('3ZBmBG1Gj75Qeu9h8NeMFr',$,'Length','The length of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4450=IFCSIMPLEPROPERTYTEMPLATE('0y4qWPmkX6EAQl2ChHHEnh',$,'Volume','Volume of the element.\X2\000A000A\X0\Total volume of fluid in the tubes and their headers.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); -#4451=IFCSIMPLEPROPERTYTEMPLATE('00pdDBcbH2A9Ns3C9EzKOl',$,'NominalDiameter','Nominal diameter or width of the object.\X2\000A000A\X0\Nominal diameter or width of the tubes in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4452=IFCSIMPLEPROPERTYTEMPLATE('1YVpjLzMj68Oj59GP5W66d',$,'OutsideDiameter','Actual outside diameter of the tube in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4453=IFCSIMPLEPROPERTYTEMPLATE('3q8$fqFi1EHxY_ndaH9W_X',$,'InsideDiameter','Actual inner diameter of the tube in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4454=IFCSIMPLEPROPERTYTEMPLATE('3GWlishhb5xetsXM9e24J6',$,'HorizontalSpacing','Horizontal spacing between tubes in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4455=IFCSIMPLEPROPERTYTEMPLATE('0EHr2DjR10yPwVgC7JiapC',$,'VerticalSpacing','Vertical spacing between tubes in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4456=IFCSIMPLEPROPERTYTEMPLATE('3zvB8qam93QOzaNwuAHRzQ',$,'HasTurbulator','TRUE if the tube has a turbulator, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4457=IFCPROPERTYSETTEMPLATE('12yhiBPEj9kPrvvjMCHbED',$,'Pset_TubeBundleTypeFinned','Finned tube bundle type attributes.\X2\000A\X0\Contains the attributes related to the fins attached to a tube in a finned tube bundle such as is commonly found in coils.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTubeBundle/FINNED,IfcTubeBundleType/FINNED',(#4458,#4459,#4460,#4461,#4462,#4463,#4464,#4465)); -#4458=IFCSIMPLEPROPERTYTEMPLATE('31ppCjAE94u90Nqc5s8qnS',$,'Spacing','Distance between fins on a tube in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4459=IFCSIMPLEPROPERTYTEMPLATE('1h0d6RQHzBNw6jHeNtqb_a',$,'Thickness','The geometric thickness of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4460=IFCSIMPLEPROPERTYTEMPLATE('27UoTo0aLAJxVy$yKXTTIp',$,'ThermalConductivity','The thermal conductivity of the object.',.P_SINGLEVALUE.,'IfcThermalConductivityMeasure',$,$,$,$,$,.READWRITE.); -#4461=IFCSIMPLEPROPERTYTEMPLATE('16dOeUhjH4NRAWz3Z0P8Dq',$,'Length','The length of the object.\X2\000A000A\X0\As measured parallel to the direction of airflow.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4462=IFCSIMPLEPROPERTYTEMPLATE('1_HQsMrOv0H8NkhiK3bJsj',$,'Height','Characteristic height\X2\000A000A\X0\Length of the fin as measured perpendicular to the direction of airflow.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4463=IFCSIMPLEPROPERTYTEMPLATE('31PQOgxnTDtwh3F5C8XLFA',$,'Diameter','The Diameter of the object.\X2\000A000A\X0\For circular fins only.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4464=IFCSIMPLEPROPERTYTEMPLATE('3c7H_ZTe52nAiHk_4PM89W',$,'FinCorrugatedType','Description of a fin corrugated type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4465=IFCSIMPLEPROPERTYTEMPLATE('2gqOubEWv5zO55941cGXZz',$,'HasCoating','TRUE if the fin has a coating, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4466=IFCPROPERTYSETTEMPLATE('2DFcIEtx50ufv_IQ6Qrnio',$,'Pset_Uncertainty','Property set capturing the geometric uncertainty regarding measurements including how the way that uncertainty was assessed.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProduct,IfcTypeProduct',(#4467,#4469,#4470,#4471,#4472,#4473)); -#4467=IFCSIMPLEPROPERTYTEMPLATE('3Left0v$v09PrjfcFwXmo$',$,'UncertaintyBasis','Indication of the basis of the uncertainty',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4468,$,$,$,.READWRITE.); -#4468=IFCPROPERTYENUMERATION('PEnum_UncertaintyBasis',(IFCLABEL('ASSESSMENT'),IFCLABEL('ESTIMATE'),IFCLABEL('INTERPRITATION'),IFCLABEL('MEASUREMENT'),IFCLABEL('OBSERVATION'),IFCLABEL('NOTKNOWN'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); -#4469=IFCSIMPLEPROPERTYTEMPLATE('28yIfMhs15fh8VQYcxYFwZ',$,'UncertaintyDescription','General description of the uncertainty associated to the element or feature, its source and implications.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#4470=IFCSIMPLEPROPERTYTEMPLATE('1gjSdJnH16Vubx1EZNfNFy',$,'HorizontalUncertainty','Indicative (95%-100%) range diameter associated to the vertical shape and position in X, if different to the linear uncertainty.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4471=IFCSIMPLEPROPERTYTEMPLATE('2rjECBL65Fng3TB2pnnSaR',$,'LinearUncertainty','Indicative (95%-100%) range diameter associated to the overall shape and position in XYZ.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4472=IFCSIMPLEPROPERTYTEMPLATE('270OEqMjL4G9wMTP0ET8tI',$,'OrthogonalUncertainty','Indicative (95%-100%) range diameter associated to the horizontal shape and position in Y, if different to the horizontal uncertainty.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4473=IFCSIMPLEPROPERTYTEMPLATE('2951lkDeL85fHPlX9zdLYl',$,'VerticalUncertainty','Indicative (95%-100%) range diameter associated to the vertical shape and position in Z, if different to the linear uncertainty.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4474=IFCPROPERTYSETTEMPLATE('3YKZNUBiP8qQgnm9HqA63Y',$,'Pset_UnitaryControlElementBaseStationController','Properties that are applicable to IfcUnitaryControlElement with the predefined type set to BASESTATIONCONTROLLER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement/BASESTATIONCONTROLLER,IfcUnitaryControlElementType/BASESTATIONCONTROLLER',(#4475,#4476,#4477)); -#4475=IFCSIMPLEPROPERTYTEMPLATE('3nZbgVyB5EQ8ZmlGfUOGIE',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); -#4476=IFCSIMPLEPROPERTYTEMPLATE('1GUE8uXbf8XAks6CIIcf_z',$,'NumberOfManagedBTSs','Indicates the maximum number of base transceiver stations (BTSs) that can be handled by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4477=IFCSIMPLEPROPERTYTEMPLATE('3BOPWZRqn9ngmc8I$NL8Na',$,'NumberOfManagedCarriers','Indicates how many carrier frequencies can be managed by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4478=IFCPROPERTYSETTEMPLATE('3tNKDrSJXADeiTS8i0RwXK',$,'Pset_UnitaryControlElementPHistory','Properties for history and operating schedules of thermostats. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcUnitaryControlElement',(#4479,#4480,#4481,#4482)); -#4479=IFCSIMPLEPROPERTYTEMPLATE('15KUDnK_z6B97ZFqbJ5EB8',$,'Temperature','Temperature of the fluid.\X2\000A000A\X0\Indicates the current measured temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4480=IFCSIMPLEPROPERTYTEMPLATE('3G08jNAC18SRvsGz3l4upp',$,'OperationModeHistory','Indicates operation mode corresponding to Pset_UnitaryControlTypeCommon.Mode. For example, ''HEAT'', ''COOL'', ''AUTO''.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4481=IFCSIMPLEPROPERTYTEMPLATE('35PP0xSpfDSPXGcXmAM3b_',$,'Fan','Indicates fan operation where True is on, False is off, and Unknown is automatic.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4482=IFCSIMPLEPROPERTYTEMPLATE('2K83cdk6f8BBP2XjeYit8N',$,'SetPoint','Indicates the setpoint and label.\X2\000A000A\X0\Indicates the temperature setpoint. For thermostats with setbacks or separate high and low setpoints, then the time series may contain a pair of values at each entry where the first value is the heating setpoint (low) and the second value is the cooling setpoint (high).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4483=IFCPROPERTYSETTEMPLATE('2SMuIky3525vUt8JoIukv5',$,'Pset_UnitaryControlElementTypeCommon','Unitary control element type common attributes. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement,IfcUnitaryControlElementType',(#4484,#4485,#4487)); -#4484=IFCSIMPLEPROPERTYTEMPLATE('35rRz3FOD1vf7q4Ku8h4nU',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4485=IFCSIMPLEPROPERTYTEMPLATE('271pd3f1L1aQqq8KUawniR',$,'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',$,#4486,$,$,$,.READWRITE.); -#4486=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4487=IFCSIMPLEPROPERTYTEMPLATE('3XtUjMcc171QtT0H2zHJ4o',$,'OperationMode','Table mapping operation mode identifiers to descriptive labels, which may be used for interpreting Pset_UnitaryControlElementPHistory.Mode.',.P_TABLEVALUE.,'IfcIdentifier','IfcLabel',$,$,$,$,.READWRITE.); -#4488=IFCPROPERTYSETTEMPLATE('0aQW6jDIrB6xPuqX1OCHYs',$,'Pset_UnitaryControlElementTypeControlPanel','Properties that are applicable to IfcUnitaryControlElement with the predefined type set to CONTROLPANEL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement/CONTROLPANEL,IfcUnitaryControlElementType/CONTROLPANEL',(#4489,#4490,#4491,#4492,#4493)); -#4489=IFCSIMPLEPROPERTYTEMPLATE('3NIevTJGjAjAuXqmZdYi_X',$,'NominalCurrent','The nominal current that is designed to be measured.\X2\000A000A\X0\A set of nominal currents in [A] for which the data of this instance is valid. At least one value shall be provided. Any value in the set shall not exceed the value of the\X2\000A\X0\UltimateRatedCurrent associated with the same breaker unit.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#4490=IFCSIMPLEPROPERTYTEMPLATE('1$3LzwW994k8N8$kAwmTUx',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4491=IFCSIMPLEPROPERTYTEMPLATE('11JaLqb3PADhYJraJcCeta',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4492=IFCSIMPLEPROPERTYTEMPLATE('3bYPx3OYD82Q8H_sJXQxzX',$,'ReferenceAirRelativeHumidity','Measurement of the ratio of water vapor in the air.',.P_BOUNDEDVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); -#4493=IFCSIMPLEPROPERTYTEMPLATE('0s9XuUv$b5VPcBGz4r0RLO',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4494=IFCPROPERTYSETTEMPLATE('2xExfNWZH2WPF1iq6w3al5',$,'Pset_UnitaryControlElementTypeIndicatorPanel','Unitary control element type indicator panel attributes. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement/INDICATORPANEL,IfcUnitaryControlElementType/INDICATORPANEL',(#4495)); -#4495=IFCSIMPLEPROPERTYTEMPLATE('3vGozh0Ln3W8VkPR_MULs0',$,'UnitaryApplication','The application of the unitary control element.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4496,$,$,$,.READWRITE.); -#4496=IFCPROPERTYENUMERATION('PEnum_UnitaryControlElementApplication',(IFCLABEL('LIFTARRIVALGONG'),IFCLABEL('LIFTCARDIRECTIONLANTERN'),IFCLABEL('LIFTFIRESYSTEMSPORT'),IFCLABEL('LIFTHALLLANTERN'),IFCLABEL('LIFTPOSITIONINDICATOR'),IFCLABEL('LIFTVOICEANNOUNCER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4497=IFCPROPERTYSETTEMPLATE('0LtsMAH$T5ohCmBY6$gRec',$,'Pset_UnitaryControlElementTypeThermostat','Unitary control element type thermostat attributes. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement/THERMOSTAT,IfcUnitaryControlElementType/THERMOSTAT',(#4498)); -#4498=IFCSIMPLEPROPERTYTEMPLATE('3ReGGLHZ11ZupBXOWEE9YU',$,'TemperatureSetPoint','The temperature setpoint range and default setpoint.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4499=IFCPROPERTYSETTEMPLATE('0ixjmS6ET37R5_WBiPWY$n',$,'Pset_UnitaryEquipmentTypeAirConditioningUnit','Air conditioning unit equipment type attributes.\X2\000A\X0\Note that these attributes were formerly Pset_PackagedACUnit prior to IFC2x2.\X2\000A\X0\HeatingEnergySource attribute deleted in IFC2x2 Pset Addendum: Use IfcEnergyProperties, IfcFuelProperties, etc. instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryEquipment/AIRCONDITIONINGUNIT,IfcUnitaryEquipmentType/AIRCONDITIONINGUNIT',(#4500,#4501,#4502,#4503,#4504,#4505,#4506,#4507,#4508)); -#4500=IFCSIMPLEPROPERTYTEMPLATE('356WLlijD3YPsgPKUEmVeO',$,'SensibleCoolingCapacity','Sensible cooling capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4501=IFCSIMPLEPROPERTYTEMPLATE('1SqkejT6XDrubOQszT8J0J',$,'LatentCoolingCapacity','Latent cooling capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4502=IFCSIMPLEPROPERTYTEMPLATE('0Vk5icMNH9Xv4K9NjlRdAA',$,'CoolingEfficiency','Coefficient of Performance: Ratio of cooling energy output to energy input under full load operating conditions.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4503=IFCSIMPLEPROPERTYTEMPLATE('2YuwuAZLz4QRNILhgxaQNw',$,'HeatingCapacity','Heating capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4504=IFCSIMPLEPROPERTYTEMPLATE('2ysxGea$L5WPmUeAu01oK8',$,'HeatingEfficiency','Heating efficiency under full load heating conditions.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4505=IFCSIMPLEPROPERTYTEMPLATE('1plli4OY16EwvZ4zrzxDWE',$,'CondenserFlowrate','Flow rate of fluid through the condenser.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#4506=IFCSIMPLEPROPERTYTEMPLATE('3tMaQl5lD67v_k7uguOSTJ',$,'CondenserEnteringTemperature','Temperature of fluid entering condenser.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4507=IFCSIMPLEPROPERTYTEMPLATE('2nK97HsUf8GRJ7OQ9hjHSd',$,'CondenserLeavingTemperature','Temperature of fluid leaving condenser.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); -#4508=IFCSIMPLEPROPERTYTEMPLATE('29ha$n_Sr6MAftJCzRdRwv',$,'OutsideAirFlowrate','Flow rate of outside air entering the unit.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#4509=IFCPROPERTYSETTEMPLATE('2uK6EM2xTBZhbZHdnj7R07',$,'Pset_UnitaryEquipmentTypeAirHandler','Air handler unitary equipment type attributes.\X2\000A\X0\Note that these attributes were formerly Pset_AirHandler prior to IFC2x2.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryEquipment/AIRHANDLER,IfcUnitaryEquipmentType/AIRHANDLER',(#4510,#4512,#4514)); -#4510=IFCSIMPLEPROPERTYTEMPLATE('004KsCHff1we8x0Pe0i_1o',$,'AirHandlerConstruction','Enumeration defining how the air handler might be fabricated.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4511,$,$,$,.READWRITE.); -#4511=IFCPROPERTYENUMERATION('PEnum_AirHandlerConstruction',(IFCLABEL('CONSTRUCTEDONSITE'),IFCLABEL('MANUFACTUREDITEM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4512=IFCSIMPLEPROPERTYTEMPLATE('2VEV92NsDCNfgkoZdACYnn',$,'AirHandlerFanCoilArrangement','Enumeration defining the arrangement of the supply air fan and the cooling coil.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4513,$,$,$,.READWRITE.); -#4513=IFCPROPERTYENUMERATION('PEnum_AirHandlerFanCoilArrangement',(IFCLABEL('BLOWTHROUGH'),IFCLABEL('DRAWTHROUGH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4514=IFCSIMPLEPROPERTYTEMPLATE('00o7DtdnDFIOuLzr89pwjB',$,'DualDeck','Does the AirHandler have a dual deck? TRUE = Yes, FALSE = No.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4515=IFCPROPERTYSETTEMPLATE('1I3Cvmqq52PxsXHMUY3ZZl',$,'Pset_UnitaryEquipmentTypeCommon','Unitary equipment type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryEquipment,IfcUnitaryEquipmentType',(#4516,#4517)); -#4516=IFCSIMPLEPROPERTYTEMPLATE('0zGgr2wh11vA7pvxfW3xuQ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4517=IFCSIMPLEPROPERTYTEMPLATE('33bzdHLd1FUQNcjWxSMuEc',$,'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',$,#4518,$,$,$,.READWRITE.); -#4518=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4519=IFCPROPERTYSETTEMPLATE('3GTW3ctNjBI8unZhcpAKHm',$,'Pset_UtilityConsumptionPHistory','Consumption of utility resources, typically applied to the IfcBuilding instance, used to identify how much was consumed on I.e., a monthly basis.',.PSET_PERFORMANCEDRIVEN.,'IfcBuilding',(#4520,#4521,#4522,#4523,#4524)); -#4520=IFCSIMPLEPROPERTYTEMPLATE('1WxdBOQl9BFACj5vUDl2sF',$,'Heat','The amount of heat energy consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4521=IFCSIMPLEPROPERTYTEMPLATE('2NQIjiAZH6Kxs1qVIqObb7',$,'Electricity','The amount of electricity consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4522=IFCSIMPLEPROPERTYTEMPLATE('0LKZ70utfA$g0iizPjUQPB',$,'Water','The amount of water consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4523=IFCSIMPLEPROPERTYTEMPLATE('0gLGr8de1EAQz6emzScpcb',$,'Fuel','The amount of fuel consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4524=IFCSIMPLEPROPERTYTEMPLATE('1rr2_ndinFM8nlhIRF1o3Y',$,'Steam','The amount of steam consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4525=IFCPROPERTYSETTEMPLATE('1K7lRkNHbCYgEBW6KJm9Ie',$,'Pset_ValvePHistory','Valve performance history common attributes of a typical 2 port pattern type valve.',.PSET_PERFORMANCEDRIVEN.,'IfcValve',(#4526,#4527,#4528)); -#4526=IFCSIMPLEPROPERTYTEMPLATE('1RVNowOOXDfOW9A0Vj5Vo8',$,'PercentageOpen','The ratio between the amount that the valve is open to the full open position of the valve.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4527=IFCSIMPLEPROPERTYTEMPLATE('04G_U8BKz6OuLIL8WfDuxl',$,'MeasuredFlowRate','The rate of flow of a fluid measured across the valve.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4528=IFCSIMPLEPROPERTYTEMPLATE('1gLmdq6Gv2YPsvOp4AekEZ',$,'MeasuredPressureDrop','The actual pressure drop in the fluid measured across the valve.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); -#4529=IFCPROPERTYSETTEMPLATE('3ArM4FVqD0jOjGOT_qKMqG',$,'Pset_ValveTypeAirRelease','Valve used to release air from a pipe or fitting.\X2\000A\X0\Note that an air release valve is constrained to have a single port pattern',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/AIRRELEASE,IfcValveType/AIRRELEASE',(#4530)); -#4530=IFCSIMPLEPROPERTYTEMPLATE('1fmDD$$bDCkAZTKZKJwrIe',$,'IsAutomatic','Indication of whether the valve is automatically operated (TRUE) or manually operated (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4531=IFCPROPERTYSETTEMPLATE('0v3TMI6l18cOsbOA5EEYnX',$,'Pset_ValveTypeCommon','Valve type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve,IfcValveType',(#4532,#4533,#4535,#4537,#4539,#4541,#4542,#4543,#4544,#4545)); -#4532=IFCSIMPLEPROPERTYTEMPLATE('08v0oddlD189QOHhKASBkO',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4533=IFCSIMPLEPROPERTYTEMPLATE('1gWZV33lHBDeu0zre9sMKh',$,'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',$,#4534,$,$,$,.READWRITE.); -#4534=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4535=IFCSIMPLEPROPERTYTEMPLATE('2Rj_rLcXbD5eZRp8tv4mGC',$,'ValvePattern','The configuration of the ports of a valve according to either the linear route taken by a fluid flowing through the valve or by the number of ports where:SINGLEPORT: Valve that has a single entry port from the system that it serves, the exit port being to the surrounding environment.\X2\000A\X0\ANGLED_2_PORT: Valve in which the direction of flow is changed through 90 degrees.\X2\000A\X0\STRAIGHT_2_PORT: Valve in which the flow is straight through.\X2\000A\X0\STRAIGHT_3_PORT: Valve with three separate ports.\X2\000A\X0\CROSSOVER_4_PORT: Valve with 4 separate ports.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4536,$,$,$,.READWRITE.); -#4536=IFCPROPERTYENUMERATION('PEnum_ValvePattern',(IFCLABEL('ANGLED_2_PORT'),IFCLABEL('CROSSOVER_4_PORT'),IFCLABEL('SINGLEPORT'),IFCLABEL('STRAIGHT_2_PORT'),IFCLABEL('STRAIGHT_3_PORT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4537=IFCSIMPLEPROPERTYTEMPLATE('2Srq6hgR1BMBVehSK8BknC',$,'ValveOperation','The method of valve operation where:DROPWEIGHT: A valve that is closed by the action of a weighted lever being released, the weight normally being prevented from dropping by being held by a wire, the closure normally being made by the action of heat on a fusible link in the wire\X2\000A\X0\FLOAT: A valve that is opened and closed by the action of a float that rises and falls with water level. The float may be a ball attached to a lever or other mechanism\X2\000A\X0\HYDRAULIC: A valve that is opened and closed by hydraulic actuation\X2\000A\X0\LEVER: A valve that is opened and closed by the action of a lever rotating the gate within the valve.\X2\000A\X0\LOCKSHIELD: A valve that requires the use of a special lockshield key for opening and closing, the operating mechanism being protected by a shroud during normal operation.\X2\000A\X0\MOTORIZED: A valve that is opened and closed by the action of an electric motor on an actuator\X2\000A\X0\PNEUMATIC: A valve that is opened and closed by pneumatic actuation\X2\000A\X0\SOLENOID: A valve that is normally held open by a magnetic field in a coil acting on the gate but that is closed immediately if the electrical current generating the magnetic field is removed.\X2\000A\X0\SPRING: A valve that is normally held in position by the pressure of a spring on a plate but that may be caused to open if the pressure of the fluid is sufficient to overcome the spring pressure.\X2\000A\X0\THERMOSTATIC: A valve in which the ports are opened or closed to maintain a required predetermined temperature.\X2\000A\X0\WHEEL: A valve that is opened and closed by the action of a wheel moving the gate within the valve.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4538,$,$,$,.READWRITE.); -#4538=IFCPROPERTYENUMERATION('PEnum_ValveOperation',(IFCLABEL('DROPWEIGHT'),IFCLABEL('FLOAT'),IFCLABEL('HYDRAULIC'),IFCLABEL('LEVER'),IFCLABEL('LOCKSHIELD'),IFCLABEL('MOTORIZED'),IFCLABEL('PNEUMATIC'),IFCLABEL('SOLENOID'),IFCLABEL('SPRING'),IFCLABEL('THERMOSTATIC'),IFCLABEL('WHEEL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4539=IFCSIMPLEPROPERTYTEMPLATE('3NDNAtwWz04Rryfl2jI7LT',$,'ValveMechanism','The mechanism by which the valve function is achieved where:BALL: Valve that has a ported ball that can be turned relative to the body seat ports.\X2\000A\X0\BUTTERFLY: Valve in which a streamlined disc pivots about a diametric axis.\X2\000A\X0\CONFIGUREDGATE: Screwdown valve in which the closing gate is shaped in a configured manner to have a more precise control of pressure and flow change across the valve.\X2\000A\X0\GLAND: Valve with a tapered seating, in which a rotatable plug is retained by means of a gland and gland packing.\X2\000A\X0\GLOBE: Screwdown valve that has a spherical body.\X2\000A\X0\LUBRICATEDPLUG: Plug valve in which a lubricant is injected under pressure between the plug face and the body.\X2\000A\X0\NEEDLE: Valve for regulating the flow in or from a pipe, in which a slender cone moves along the axis of flow to close against a fixed conical seat.\X2\000A\X0\PARALLELSLIDE: Screwdown valve that has a machined plate that slides in formed grooves to form a seal.\X2\000A\X0\PLUG: Valve that has a ported plug that can be turned relative to the body seat ports.\X2\000A\X0\WEDGEGATE: Screwdown valve that has a wedge shaped plate fitting into tapered guides to form a seal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4540,$,$,$,.READWRITE.); -#4540=IFCPROPERTYENUMERATION('PEnum_ValveMechanism',(IFCLABEL('BALL'),IFCLABEL('BUTTERFLY'),IFCLABEL('CONFIGUREDGATE'),IFCLABEL('GLAND'),IFCLABEL('GLOBE'),IFCLABEL('LUBRICATEDPLUG'),IFCLABEL('NEEDLE'),IFCLABEL('PARALLELSLIDE'),IFCLABEL('PLUG'),IFCLABEL('WEDGEGATE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4541=IFCSIMPLEPROPERTYTEMPLATE('3HeRIyCHj9PxEs8f1O9TNa',$,'Size','The size of the connection to the valve (or to each connection for faucets, mixing valves, etc.).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4542=IFCSIMPLEPROPERTYTEMPLATE('0MlwZZ1ybBDBoUsvfPHP2M',$,'TestPressure','The maximum pressure to which the valve has been subjected under test.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4543=IFCSIMPLEPROPERTYTEMPLATE('3Pnq3K7JLC5g5uOZQaRaq1',$,'WorkingPressure','Working pressure.\X2\000A000A\X0\The normally expected maximum working pressure of the valve.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4544=IFCSIMPLEPROPERTYTEMPLATE('1C0761Sdn7SeE1p6fg6YnZ',$,'FlowCoefficient','Flow coefficient (the quantity of fluid that passes through a fully open valve at unit pressure drop), typically expressed as the Kv or Cv value for the valve.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); -#4545=IFCSIMPLEPROPERTYTEMPLATE('2$5y2Cm5D3Ee3joX0K8rV4',$,'CloseOffRating','Close off rating.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4546=IFCPROPERTYSETTEMPLATE('30oa3Nu410geSyNxD8mcMm',$,'Pset_ValveTypeDrawOffCock','A small diameter valve, used to drain water from a cistern or water filled system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/DRAWOFFCOCK,IfcValveType/DRAWOFFCOCK',(#4547)); -#4547=IFCSIMPLEPROPERTYTEMPLATE('1Sd87_Bx94TPQhcsABSdmw',$,'HasHoseUnion','Indicates whether the object is fitted with a hose union connection (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4548=IFCPROPERTYSETTEMPLATE('04auzKp0bAIxGuAYU__pQ7',$,'Pset_ValveTypeFaucet','A small diameter valve, with a free outlet, from which water is drawn.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/FAUCET,IfcValveType/FAUCET',(#4549,#4551,#4553,#4555,#4556)); -#4549=IFCSIMPLEPROPERTYTEMPLATE('1243Y$3IrD5PrT2dDMSflF',$,'FaucetType','Defines the range of faucet types that may be specified where:Bib: Faucet with a horizontal inlet and a nozzle that discharges downwards.\X2\000A\X0\Globe: Faucet fitted through the end of a bath, with a horizontal inlet, a partially spherical body and a vertical nozzle.\X2\000A\X0\Diverter: Combination faucet assembly with a valve to enable the flow of mixed water to be transferred to a showerhead.\X2\000A\X0\DividedFlowCombination: Combination faucet assembly in which hot and cold water are kept separate until emerging from a common nozzle\X2\000A\X0\.\X2\000A\X0\Pillar: Faucet that has a vertical inlet and a nozzle that discharges downwards\X2\000A\X0\.\X2\000A\X0\SingleOutletCombination = Combination faucet assembly in which hot and cold water mix before emerging from a common nozzle\X2\000A\X0\.\X2\000A\X0\Spray: Faucet with a spray outlet\X2\000A\X0\.\X2\000A\X0\SprayMixing: Spray faucet connected to hot and cold water supplies that delivers water at a temperature determined during use.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4550,$,$,$,.READWRITE.); -#4550=IFCPROPERTYENUMERATION('PEnum_FaucetType',(IFCLABEL('BIB'),IFCLABEL('DIVERTER'),IFCLABEL('DIVIDEDFLOWCOMBINATION'),IFCLABEL('GLOBE'),IFCLABEL('PILLAR'),IFCLABEL('SINGLEOUTLETCOMBINATION'),IFCLABEL('SPRAY'),IFCLABEL('SPRAYMIXING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4551=IFCSIMPLEPROPERTYTEMPLATE('2Sz7mRzOr6IumOnoE9U8Yi',$,'FaucetOperation','Defines the range of ways in which a faucet can be operated that may be specified where:CeramicDisc: Quick action faucet with a ceramic seal to open or close the orifice\X2\000A\X0\.\X2\000A\X0\LeverHandle: Quick action faucet that is operated by a lever handle\X2\000A\X0\.\X2\000A\X0\NonConcussiveSelfClosing: Self closing faucet that does not induce surge pressure\X2\000A\X0\.\X2\000A\X0\QuarterTurn: Quick action faucet that can be fully opened or shut by turning the operating mechanism through 90 degrees.\X2\000A\X0\QuickAction: Faucet that can be opened or closed fully with a single small movement of the operating mechanism\X2\000A\X0\.\X2\000A\X0\ScrewDown: Faucet in which a plate or disc is moved, by the rotation of a screwed spindle, to close or open the orifice.\X2\000A\X0\SelfClosing: Faucet that is opened by pressure of the top of an operating spindle and is closed under the action of a spring or weight when the pressure is released.\X2\000A\X0\TimedSelfClosing: Self closing faucet that discharges for a predetermined period of time\X2\000A\X0\.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4552,$,$,$,.READWRITE.); -#4552=IFCPROPERTYENUMERATION('PEnum_FaucetOperation',(IFCLABEL('CERAMICDISC'),IFCLABEL('LEVERHANDLE'),IFCLABEL('NONCONCUSSIVESELFCLOSING'),IFCLABEL('QUARTERTURN'),IFCLABEL('QUICKACTION'),IFCLABEL('SCREWDOWN'),IFCLABEL('SELFCLOSING'),IFCLABEL('TIMEDSELFCLOSING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4553=IFCSIMPLEPROPERTYTEMPLATE('01m2xt$yHBygacLpzdH_69',$,'FaucetFunction','Defines the operating temperature of a faucet that may be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4554,$,$,$,.READWRITE.); -#4554=IFCPROPERTYENUMERATION('PEnum_FaucetFunction',(IFCLABEL('COLD'),IFCLABEL('HOT'),IFCLABEL('MIXED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4555=IFCSIMPLEPROPERTYTEMPLATE('1BVFAzz0XFZhDLP8$BKuff',$,'Finish','Description of the (surface) finish of the object for informational purposes.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#4556=IFCSIMPLEPROPERTYTEMPLATE('3Xcy29A$rB_OnA1p2LkpMV',$,'FaucetTopDescription','Description of the operating mechanism/top of the faucet.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#4557=IFCPROPERTYSETTEMPLATE('0nRZTGTNr6XfKSZnrZNPwL',$,'Pset_ValveTypeFlushing','Valve that flushes a predetermined quantity of water to cleanse a WC, urinal or slop hopper.\X2\000A\X0\Note that a flushing valve is constrained to have a 2 port pattern.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/FLUSHING,IfcValveType/FLUSHING',(#4558,#4559,#4560)); -#4558=IFCSIMPLEPROPERTYTEMPLATE('3_V2vVltb5p8yJ9pxy6_JE',$,'FlushingRate','The predetermined quantity of water to be flushed.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#4559=IFCSIMPLEPROPERTYTEMPLATE('2Q$3u731f2GBCC96grNRtr',$,'HasIntegralShutOffDevice','Indication of whether the flushing valve has an integral shut off device fitted (set TRUE) or not (set FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4560=IFCSIMPLEPROPERTYTEMPLATE('3SHwRDesT4ouEEiEh4nCXs',$,'IsHighPressure','Indication of whether the flushing valve is suitable for use on a high pressure water main (set TRUE) or not (set FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4561=IFCPROPERTYSETTEMPLATE('1J8VUB5dnF4AVTlrq5qa64',$,'Pset_ValveTypeGasTap','A small diameter valve, used to discharge gas from a system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/GASTAP,IfcValveType/GASTAP',(#4562)); -#4562=IFCSIMPLEPROPERTYTEMPLATE('19eilN1cbDC8sO0muAPRS1',$,'HasHoseUnion','Indicates whether the object is fitted with a hose union connection (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4563=IFCPROPERTYSETTEMPLATE('3DPqn$Hnn1C8kanGA79oZB',$,'Pset_ValveTypeIsolating','Valve that is used to isolate system components.\X2\000A\X0\Note that an isolating valve is constrained to have a 2 port pattern.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/ISOLATING,IfcValveType/ISOLATING',(#4564,#4565)); -#4564=IFCSIMPLEPROPERTYTEMPLATE('0L4PcpxGz1kPm1FF3rAahy',$,'IsNormallyOpen','If TRUE, the valve is normally open. If FALSE is is normally closed.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4565=IFCSIMPLEPROPERTYTEMPLATE('1qFCYn4Vn7ihUQioPkZZg_',$,'IsolatingPurpose','Defines the purpose for which the isolating valve is used since the way in which the valve is identified as an isolating valve may be in the context of its use. Note that unless there is a contextual name for the isolating valve (as in the case of a Landing Valve on a rising fire main), then the value assigned shoulkd be UNSET.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4566,$,$,$,.READWRITE.); -#4566=IFCPROPERTYENUMERATION('PEnum_IsolatingPurpose',(IFCLABEL('LANDING'),IFCLABEL('LANDINGWITHPRESSUREREGULATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4567=IFCPROPERTYSETTEMPLATE('27Pj9IjFX3UPflK4DOjlEr',$,'Pset_ValveTypeMixing','A valve where typically the temperature of the outlet is determined by mixing hot and cold water inlet flows.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/MIXING,IfcValveType/MIXING',(#4568,#4570)); -#4568=IFCSIMPLEPROPERTYTEMPLATE('1gJIs$VgP7Y9MP6Ij2MsR2',$,'MixerControl','Defines the form of control of the mixing valve.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4569,$,$,$,.READWRITE.); -#4569=IFCPROPERTYENUMERATION('PEnum_MixingValveControl',(IFCLABEL('MANUAL'),IFCLABEL('PREDEFINED'),IFCLABEL('THERMOSTATIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4570=IFCSIMPLEPROPERTYTEMPLATE('3v2pIrt8zCrOZj_iYmHulX',$,'OutletConnectionSize','Size of the outlet connection from the object.\X2\000A000A\X0\The size of the pipework connection from the mixing valve.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4571=IFCPROPERTYSETTEMPLATE('2$icP2dk51$eLfvT3s9c_5',$,'Pset_ValveTypePressureReducing','Valve that reduces the pressure of a fluid immediately downstream of its position in a pipeline to a preselected value or by a predetermined ratio.\X2\000A\X0\Note that a pressure reducing valve is constrained to have a 2 port pattern.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/PRESSUREREDUCING,IfcValveType/PRESSUREREDUCING',(#4572,#4573)); -#4572=IFCSIMPLEPROPERTYTEMPLATE('2t0gFQO9rFquJOgTlQIEgE',$,'UpstreamPressure','The operating pressure of the fluid upstream of the pressure reducing valve.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4573=IFCSIMPLEPROPERTYTEMPLATE('3E2pUwJdnCExk_GrJYGfEP',$,'DownstreamPressure','The operating pressure of the fluid downstream of the pressure reducing valve.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4574=IFCPROPERTYSETTEMPLATE('0yfpBU949APvtiCIPoJjbO',$,'Pset_ValveTypePressureRelief','Spring or weight loaded valve that automatically discharges to a safe place fluid that has built up to excessive pressure in pipes or fittings.\X2\000A\X0\Note that a pressure relief valve is constrained to have a single port pattern.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/PRESSURERELIEF,IfcValveType/PRESSURERELIEF',(#4575)); -#4575=IFCSIMPLEPROPERTYTEMPLATE('2jm2NnNI58pgMHbFAbQFQk',$,'ReliefPressure','The pressure at which the spring or weight in the valve is set to discharge fluid.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); -#4576=IFCPROPERTYSETTEMPLATE('0jsn4HP8nDdOplbJNkJ0Uu',$,'Pset_VegetationCommon','Properties for a plant.',.PSET_OCCURRENCEDRIVEN.,'IfcGeographicElement/VEGETATION',(#4577,#4578)); -#4577=IFCSIMPLEPROPERTYTEMPLATE('3ek7T7aLr1lvaA2FsdRKv0',$,'BotanicalName','Formal scientific name conforming to the International Code of Nomenclature for algae, fungi, and plants (ICN)',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4578=IFCSIMPLEPROPERTYTEMPLATE('0iZ3V3$0L0sfCAxGGJcsX7',$,'LocalName','The local name that the plant is known as.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4579=IFCPROPERTYSETTEMPLATE('1EF6VYX1r3sP2ad9Ow6PLj',$,'Pset_VehicleAvailability','Property set for the application of availability data to vehicles and equipment.',.PSET_TYPEDRIVENOVERRIDE.,'IfcVehicle/ROLLINGSTOCK,IfcVehicle/VEHICLEAIR,IfcVehicle/VEHICLEMARINE,IfcVehicle/VEHICLE,IfcVehicle/VEHICLETRACKED,IfcVehicleType/ROLLINGSTOCK,IfcVehicleType/VEHICLEAIR,IfcVehicleType/VEHICLEMARINE,IfcVehicleType/VEHICLE,IfcVehicleType/VEHICLETRACKED',(#4580,#4581,#4582)); -#4580=IFCSIMPLEPROPERTYTEMPLATE('3rupTdRNX5eAxgroj0uJle',$,'VehicleAvailability','Vehicle or Plant availability',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4581=IFCSIMPLEPROPERTYTEMPLATE('3NZA0bNp92W9ijUie043kP',$,'MaintenanceDowntime','Maintenance downtime proportion.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4582=IFCSIMPLEPROPERTYTEMPLATE('3mIF0gQZ5CSO00Rmvvm57L',$,'WeatherDowntime','Weather downtime proportion',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4583=IFCPROPERTYSETTEMPLATE('0cKLy6iebAEOKC9NakmPdN',$,'Pset_VesselLineCommon','Properties for vessel lines and anchoring',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/ROPE,IfcMechanicalFastenerType/ROPE',(#4584,#4585,#4586,#4587,#4588,#4589,#4590,#4591,#4592,#4593,#4594,#4595,#4596)); -#4584=IFCSIMPLEPROPERTYTEMPLATE('3ixa1bOlf2PuxUF6njWHOh',$,'LineIdentifier','Reference ID relative to a design vessel in the project',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4585=IFCSIMPLEPROPERTYTEMPLATE('2Q_mZT6snE_vV5T8jQpNmH',$,'MidshipToFairLead','Distance from the vessel midship to the fairlead for the line',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4586=IFCSIMPLEPROPERTYTEMPLATE('322Xxtalf9VfzEDpSq3M2C',$,'CentreLineToFairlead','Distance from the vessel centreline to the fairlead for the line',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4587=IFCSIMPLEPROPERTYTEMPLATE('17JVizc3HFdvzDQ6OrOAn$',$,'HeightAboveMainDeck','Height of the fairlead above the main deck of the vessel',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4588=IFCSIMPLEPROPERTYTEMPLATE('25sUx2DqTAnul_U0yVch$D',$,'FairleadToTermination','Distance from the fairlead to the bitt or winch on the vessel where the line terminates',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4589=IFCSIMPLEPROPERTYTEMPLATE('0doRWoMJfAuO0k2S84C61a',$,'WinchBreakLimit','Line force at which the winch starts to release the line (maximum load)',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#4590=IFCSIMPLEPROPERTYTEMPLATE('0DHR0j7b96IwwoZybK42_G',$,'PreTensionAim','Line force that the winch is set to maintain (minimum load)',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#4591=IFCSIMPLEPROPERTYTEMPLATE('2LjrciwkfBuxJpINhDzGjc',$,'LineType','Mooring line type',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4592=IFCSIMPLEPROPERTYTEMPLATE('1IgnuvLaX0gRRLo2fZPVzw',$,'LineStrength','Breaking load of the line (note that ultimate stress is not part of any of the material Psets)',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#4593=IFCSIMPLEPROPERTYTEMPLATE('3okacu2tX8kuHpgmfO2GQK',$,'TailLength','Length of the tail',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4594=IFCSIMPLEPROPERTYTEMPLATE('2iVIsm4Ib2OuZFYqKCCnzc',$,'TailDiameter','Diameter of the tail',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4595=IFCSIMPLEPROPERTYTEMPLATE('2R0ZEfW$D4IuSfUkH6RfRm',$,'TailType','Mooring tail type',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4596=IFCSIMPLEPROPERTYTEMPLATE('3j6noq7Kf2xAfEXZt2Bi15',$,'TailStrength','Breaking load of the tail (note that ultimate stress is not part of any of the material Psets)',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); -#4597=IFCPROPERTYSETTEMPLATE('01HdAhykP9Rw8CG2FSlPDR',$,'Pset_VibrationIsolatorTypeCommon','Vibration isolator type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcVibrationIsolator,IfcVibrationIsolatorType',(#4598,#4599,#4601,#4602,#4603,#4604,#4605)); -#4598=IFCSIMPLEPROPERTYTEMPLATE('10KNOTTOD2ifzlwPGhrLeg',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4599=IFCSIMPLEPROPERTYTEMPLATE('0KMFH0qQ98sgRgqr3HDG8x',$,'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',$,#4600,$,$,$,.READWRITE.); -#4600=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4601=IFCSIMPLEPROPERTYTEMPLATE('24cOHEkeL99OkOZ$vNnYc6',$,'VibrationTransmissibility','The vibration transmissibility percentage.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4602=IFCSIMPLEPROPERTYTEMPLATE('2YfK3ucW93cPAwaVpHyQbj',$,'IsolatorStaticDeflection','Static deflection of the vibration isolator.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4603=IFCSIMPLEPROPERTYTEMPLATE('03ELSlvHn3IhdBrWKPpmv4',$,'IsolatorCompressibility','The compressibility of the vibration isolator.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4604=IFCSIMPLEPROPERTYTEMPLATE('3VHJC0x4z6peus7UvXAUfy',$,'MaximumSupportedWeight','The maximum weight that can be carried by the vibration isolator.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); -#4605=IFCSIMPLEPROPERTYTEMPLATE('2Sw7aSm3fFGg6WHFnPIvFc',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A000A\X0\Height of the vibration isolator before the application of load.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4606=IFCPROPERTYSETTEMPLATE('0TJRDLUP95BAkMNDd0h1Ew',$,'Pset_VoltageInstrumentTransformer','Instrument transformers are high accuracy class electrical devices used to isolate or transform voltage or current levels. The main function of instrument transformers is to operate instruments or metering from high voltage or high current circuits, safely isolating secondary control circuitry from the high voltages or currents. Combination instrument transformers are metering voltage.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument/COMBINED,IfcFlowInstrument/VOLTMETER,IfcFlowInstrumentType/COMBINED,IfcFlowInstrumentType/VOLTMETER',(#4607,#4608,#4609,#4610,#4611,#4612,#4613,#4614,#4615,#4616)); -#4607=IFCSIMPLEPROPERTYTEMPLATE('3gRLsoLEbBdAIvGMrRjPSV',$,'AccuracyClass','A designation assigned to an instrument transformer the current (or voltage) error and phase displacement of which remain within specified limits under prescribed conditions of use (IEC 321-01-24).',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); -#4608=IFCSIMPLEPROPERTYTEMPLATE('1SbLjB5xr7bvllpgarTzwZ',$,'AccuracyGrade','The grade of accuracy.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4609=IFCSIMPLEPROPERTYTEMPLATE('00RNe56Oj61xzuGUQrcj$S',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4610=IFCSIMPLEPROPERTYTEMPLATE('05Ejv$hHL1UQszxnHcl7LP',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); -#4611=IFCSIMPLEPROPERTYTEMPLATE('38tskyeufCFOFfftIdXIbq',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); -#4612=IFCSIMPLEPROPERTYTEMPLATE('1E$HevnSzBdg647MLRFZ9G',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); -#4613=IFCSIMPLEPROPERTYTEMPLATE('0rsu3AHLDA0wy93GSsX0O_',$,'PrimaryFrequency','The frequency that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#4614=IFCSIMPLEPROPERTYTEMPLATE('3qDNXGMMv3zu6xEnBDBq2O',$,'PrimaryVoltage','The voltage that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4615=IFCSIMPLEPROPERTYTEMPLATE('176MZZ6Vn7q8eDZphX9gxM',$,'SecondaryFrequency','The frequency that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); -#4616=IFCSIMPLEPROPERTYTEMPLATE('0WoAtpv5H9v8G4XDQWKewy',$,'SecondaryVoltage','The voltage that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); -#4617=IFCPROPERTYSETTEMPLATE('2vP4ZorPL3FeW_6VZnURJO',$,'Pset_WallCommon','Properties common to the definition of all occurrences of IfcWall.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWall,IfcWallType',(#4618,#4619,#4621,#4622,#4623,#4624,#4625,#4626,#4627,#4628,#4629)); -#4618=IFCSIMPLEPROPERTYTEMPLATE('1iq9hEU4PFjg_q$8XuRytx',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4619=IFCSIMPLEPROPERTYTEMPLATE('2FusdziUHCMhtb1xVFLSQj',$,'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',$,#4620,$,$,$,.READWRITE.); -#4620=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4621=IFCSIMPLEPROPERTYTEMPLATE('05XoHA8N55DRciTT3_Wno2',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4622=IFCSIMPLEPROPERTYTEMPLATE('2Du_8RCD1B7gaNaZ_9MZxu',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4623=IFCSIMPLEPROPERTYTEMPLATE('0$cb5vM4b6_QH4eCNiIhI$',$,'Combustible','Indication whether the object is made from combustible material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4624=IFCSIMPLEPROPERTYTEMPLATE('1zaRQVDnfBX9QOvfebKwkV',$,'SurfaceSpreadOfFlame','Indication on how the flames spread around the surface,\X2\000A\X0\It is given according to the national building code that governs the fire behaviour for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4625=IFCSIMPLEPROPERTYTEMPLATE('3VSFMXgXb7qvn_5rc7zKB_',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#4626=IFCSIMPLEPROPERTYTEMPLATE('23iPvVZWv2cRPylg8cmvfc',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4627=IFCSIMPLEPROPERTYTEMPLATE('0IUJUxCl9AuQmz_t4RETfx',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4628=IFCSIMPLEPROPERTYTEMPLATE('0VWTby18P4qfYHbZuOlNNM',$,'ExtendToStructure','Indicates whether the object extend to the structure above (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4629=IFCSIMPLEPROPERTYTEMPLATE('0t_E5vWvf5QOFGAbZvHlS4',$,'Compartmentation','Indication whether the object is designed to serve as a fire compartmentation (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4630=IFCPROPERTYSETTEMPLATE('1xdhHCWej4dAMGv1LMuPaC',$,'Pset_Warranty','An assurance given by the seller or provider of an artefact that the artefact is without defects and will operate as described for a defined period of time without failure and that if a defect does arise during that time, that it will be corrected by the seller or provider.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#4631,#4632,#4633,#4634,#4635,#4636,#4637)); -#4631=IFCSIMPLEPROPERTYTEMPLATE('3ZEBOkDNXDgPEoZYln23tw',$,'WarrantyIdentifier','The identifier assigned to a warranty.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4632=IFCSIMPLEPROPERTYTEMPLATE('3Xvy41E9j3OBlOrGQhBQhY',$,'WarrantyStartDate','The date on which the warranty commences.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); -#4633=IFCSIMPLEPROPERTYTEMPLATE('14ah_Av7L08OtGPjNTpl7m',$,'IsExtendedWarranty','Indication of whether this is an extended warranty whose duration is greater than that normally assigned to an artefact (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4634=IFCSIMPLEPROPERTYTEMPLATE('1vR7wcunPDXRQ3A3c3kYIc',$,'WarrantyPeriod','The time duration during which a manufacturer or supplier guarantees or warrants the performance of an artefact.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#4635=IFCSIMPLEPROPERTYTEMPLATE('0EdwGbGlPDBf6fGaiv__8c',$,'WarrantyContent','The content of the warranty.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#4636=IFCSIMPLEPROPERTYTEMPLATE('1tNw$dI8b0KvWt$b$_xzJh',$,'PointOfContact','The organization that should be contacted for action under the terms of the warranty. Note that the role of the organization (manufacturer, supplier, installer etc.) is determined by the IfcActorRole attribute of IfcOrganization.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4637=IFCSIMPLEPROPERTYTEMPLATE('0JrCDOEIjAxxStYyvGx9_j',$,'Exclusions','Items, conditions or actions that may be excluded from the warranty or that may cause the warranty to become void.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); -#4638=IFCPROPERTYSETTEMPLATE('0ht9KPUB53XA3CbccQh70A',$,'Pset_WasteTerminalTypeCommon','Common properties for waste terminals.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal,IfcWasteTerminalType',(#4639,#4640)); -#4639=IFCSIMPLEPROPERTYTEMPLATE('17Bt5qtTf1TuJSJ2v3GKDn',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4640=IFCSIMPLEPROPERTYTEMPLATE('1iQVhEOgXFhxmeqYIko1ha',$,'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',$,#4641,$,$,$,.READWRITE.); -#4641=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4642=IFCPROPERTYSETTEMPLATE('2s1zSoZ1PFTwM7hPgOepCm',$,'Pset_WasteTerminalTypeFloorTrap','Pipe fitting, set into the floor, that retains liquid to prevent the passage of foul air.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/FLOORTRAP,IfcWasteTerminalType/FLOORTRAP',(#4643,#4644,#4645,#4646,#4647,#4648,#4650,#4651,#4652,#4654,#4655,#4656,#4657)); -#4643=IFCSIMPLEPROPERTYTEMPLATE('2YXh$5Flb9OgCi13uMBKmZ',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4644=IFCSIMPLEPROPERTYTEMPLATE('3nWfdfhGLAXxJjkrTBXfl1',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4645=IFCSIMPLEPROPERTYTEMPLATE('32RV2p0nvFIfOqLylvPS3T',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4646=IFCSIMPLEPROPERTYTEMPLATE('1YnmEnHnDCB9magpHZO3G6',$,'IsForSullageWater','Indicates if the purpose of the floor trap is to receive sullage water, or if that is amongst its purposes (= TRUE), or not (= FALSE). Note that if TRUE, it is expected that an upstand or kerb will be placed around the floor trap to prevent the ingress of surface water runoff; the provision of the upstand or kerb is not dealt with in this property set.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4647=IFCSIMPLEPROPERTYTEMPLATE('3SjMZPFUHAMhRUNRi4S_WL',$,'SpilloverLevel','The level at which water spills out of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4648=IFCSIMPLEPROPERTYTEMPLATE('27Vs4lkjj2oOf0LJ7sxqqn',$,'TrapType','Identifies the predefined types of trap from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4649,$,$,$,.READWRITE.); -#4649=IFCPROPERTYENUMERATION('PEnum_TrapType',(IFCLABEL('NONE'),IFCLABEL('P_TRAP'),IFCLABEL('Q_TRAP'),IFCLABEL('S_TRAP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4650=IFCSIMPLEPROPERTYTEMPLATE('3$jz2n9bvEMPnPfdyD2QV4',$,'HasStrainer','Indicates whether the gully trap has a strainer (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4651=IFCSIMPLEPROPERTYTEMPLATE('2OEgmhcurAoxVLr$Nf6fWm',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4652=IFCSIMPLEPROPERTYTEMPLATE('1QG1oc4Q99$PcLfj5pNRkX',$,'InletPatternType','Identifies the pattern of inlet connections to a trap.A trap may have 0,1,2,3 or 4 inlet connections and the pattern of their arrangement may vary. The enumeration makes the convention that an outlet is either vertical or is placed at the bottom (south side) of the trap (when viewed in plan). Position 1 is to the left (west), position 2 is to the top (north), position 3 is to the right (east) and position 4 is to the bottom (south).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4653,$,$,$,.READWRITE.); -#4653=IFCPROPERTYENUMERATION('PEnum_InletPatternType',(IFCLABEL('1'),IFCLABEL('12'),IFCLABEL('123'),IFCLABEL('1234'),IFCLABEL('124'),IFCLABEL('13'),IFCLABEL('134'),IFCLABEL('14'),IFCLABEL('2'),IFCLABEL('23'),IFCLABEL('234'),IFCLABEL('24'),IFCLABEL('3'),IFCLABEL('34'),IFCLABEL('4'),IFCLABEL('NONE')),$); -#4654=IFCSIMPLEPROPERTYTEMPLATE('06az8q9$5FE8HkjQGMOKGb',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4655=IFCSIMPLEPROPERTYTEMPLATE('0W$RxjGen73ONjqOOcfyii',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4656=IFCSIMPLEPROPERTYTEMPLATE('0lHVRqzS104O01lEOEfYqH',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4657=IFCSIMPLEPROPERTYTEMPLATE('3r3g5$I$DBNwMSLpUq$su$',$,'CoverMaterial','Material from which the cover or grating is constructed.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); -#4658=IFCPROPERTYSETTEMPLATE('2vTlzsF2v7c8VLcB6O0VCZ',$,'Pset_WasteTerminalTypeFloorWaste','Pipe fitting, set into the floor, that collects waste water and discharges it to a separate trap.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/FLOORWASTE,IfcWasteTerminalType/FLOORWASTE',(#4659,#4660,#4661,#4662,#4663,#4664)); -#4659=IFCSIMPLEPROPERTYTEMPLATE('2UyRx5kfn6sQgUNzW8Y4W_',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4660=IFCSIMPLEPROPERTYTEMPLATE('390SGQS7D0$894lQGzJmKI',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4661=IFCSIMPLEPROPERTYTEMPLATE('056HXvn895H820S0QcTPr6',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4662=IFCSIMPLEPROPERTYTEMPLATE('1f$102Tob8v9BKPgpx2$B2',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4663=IFCSIMPLEPROPERTYTEMPLATE('27wIRntbz9mPYvofmJvuoA',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4664=IFCSIMPLEPROPERTYTEMPLATE('2pYxZVleX8JAZOo4JXvLbd',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4665=IFCPROPERTYSETTEMPLATE('2nuYClaJbD2AOijSfVgy0M',$,'Pset_WasteTerminalTypeGullySump','Pipe fitting or assembly of fittings to receive surface water or waste water, fitted with a grating or sealed cover.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/GULLYSUMP,IfcWasteTerminalType/GULLYSUMP',(#4666,#4667,#4668,#4669,#4671,#4673,#4674,#4676,#4677,#4678)); -#4666=IFCSIMPLEPROPERTYTEMPLATE('3jv8vnSabFlPcZWMYr2EOF',$,'NominalSumpLength','Nominal or quoted length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4667=IFCSIMPLEPROPERTYTEMPLATE('2RlajVvdb4Bxz7JKrTYywm',$,'NominalSumpWidth','Nominal or quoted length measured along the y-axis in the local coordinate system of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4668=IFCSIMPLEPROPERTYTEMPLATE('3rYBwsSHfAXRZmL5S69ejG',$,'NominalSumpDepth','Nominal or quoted length measured along the z-axis in the local coordinate system of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4669=IFCSIMPLEPROPERTYTEMPLATE('3rfGe4Oi946QOjHcLDS3Da',$,'GullyType','Identifies the predefined types of gully from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4670,$,$,$,.READWRITE.); -#4670=IFCPROPERTYENUMERATION('PEnum_GullyType',(IFCLABEL('BACKINLET'),IFCLABEL('VERTICAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4671=IFCSIMPLEPROPERTYTEMPLATE('1ugsf2niL4Xvn$g$7KTblo',$,'TrapType','Identifies the predefined types of trap from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4672,$,$,$,.READWRITE.); -#4672=IFCPROPERTYENUMERATION('PEnum_TrapType',(IFCLABEL('NONE'),IFCLABEL('P_TRAP'),IFCLABEL('Q_TRAP'),IFCLABEL('S_TRAP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4673=IFCSIMPLEPROPERTYTEMPLATE('0UDPtV_896vh2NGGqcCp0K',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4674=IFCSIMPLEPROPERTYTEMPLATE('03hpGelib7lgZNf5tJAiMo',$,'BackInletPatternType','Identifies the pattern of inlet connections to a gully trap.A gulley trap may have 0,1,2,3 or 4 inlet connections and the pattern of their arrangement may vary. The enumeration makes the convention that an outlet is either vertical or is placed at the bottom (south side) of the gully trap (when viewed in plan). Position 1 is to the left (west), position 2 is to the top (north), position 3 is to the right (east) and position 4 is to the bottom (south).2\X2\000A\X0\ |! |\X2\000A\X0\1-| |-3\X2\000A\X0\ ! ||\X2\000A\X0\ 4',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4675,$,$,$,.READWRITE.); -#4675=IFCPROPERTYENUMERATION('PEnum_BackInletPatternType',(IFCLABEL('1'),IFCLABEL('12'),IFCLABEL('123'),IFCLABEL('1234'),IFCLABEL('124'),IFCLABEL('13'),IFCLABEL('134'),IFCLABEL('14'),IFCLABEL('2'),IFCLABEL('23'),IFCLABEL('234'),IFCLABEL('24'),IFCLABEL('3'),IFCLABEL('34'),IFCLABEL('4'),IFCLABEL('NONE')),$); -#4676=IFCSIMPLEPROPERTYTEMPLATE('15BVGaLRDBLg27AkU9mzIe',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4677=IFCSIMPLEPROPERTYTEMPLATE('0lvSPeb0H8xP5FsQJkOEC5',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4678=IFCSIMPLEPROPERTYTEMPLATE('0xTslDu_jCLfPWy_bnesJ7',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4679=IFCPROPERTYSETTEMPLATE('0RShy0NmLBAhyfMfRNQmDQ',$,'Pset_WasteTerminalTypeGullyTrap','Pipe fitting or assembly of fittings to receive surface water or waste water, fitted with a grating or sealed cover and discharging through a trap (BS6100 330 3504 modified)',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/GULLYTRAP,IfcWasteTerminalType/GULLYTRAP',(#4680,#4681,#4682,#4683,#4685,#4686,#4688,#4689,#4691,#4692,#4693)); -#4680=IFCSIMPLEPROPERTYTEMPLATE('0q9VQVXO9DsA0wjBmMdBe8',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4681=IFCSIMPLEPROPERTYTEMPLATE('3hfoX3cGz9bO4N_BBlrSDn',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4682=IFCSIMPLEPROPERTYTEMPLATE('02OxHbvnb5NP7F2IKFYU2I',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4683=IFCSIMPLEPROPERTYTEMPLATE('2kHzrsS7P7LfAj7D$boQby',$,'GullyType','Identifies the predefined types of gully from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4684,$,$,$,.READWRITE.); -#4684=IFCPROPERTYENUMERATION('PEnum_GullyType',(IFCLABEL('BACKINLET'),IFCLABEL('VERTICAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4685=IFCSIMPLEPROPERTYTEMPLATE('14Olt7H8H79BlIg0SrYNAu',$,'HasStrainer','Indicates whether the gully trap has a strainer (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4686=IFCSIMPLEPROPERTYTEMPLATE('0nqWM5rsb2yf7IjFxo70FT',$,'TrapType','Identifies the predefined types of trap from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4687,$,$,$,.READWRITE.); -#4687=IFCPROPERTYENUMERATION('PEnum_TrapType',(IFCLABEL('NONE'),IFCLABEL('P_TRAP'),IFCLABEL('Q_TRAP'),IFCLABEL('S_TRAP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4688=IFCSIMPLEPROPERTYTEMPLATE('3ID2zP_1f2qeMr6vMUJ$WQ',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4689=IFCSIMPLEPROPERTYTEMPLATE('1UnaJyKJz9EgEOyzXwnOT2',$,'BackInletPatternType','Identifies the pattern of inlet connections to a gully trap.A gulley trap may have 0,1,2,3 or 4 inlet connections and the pattern of their arrangement may vary. The enumeration makes the convention that an outlet is either vertical or is placed at the bottom (south side) of the gully trap (when viewed in plan). Position 1 is to the left (west), position 2 is to the top (north), position 3 is to the right (east) and position 4 is to the bottom (south).2\X2\000A\X0\ |! |\X2\000A\X0\1-| |-3\X2\000A\X0\ ! ||\X2\000A\X0\ 4',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4690,$,$,$,.READWRITE.); -#4690=IFCPROPERTYENUMERATION('PEnum_BackInletPatternType',(IFCLABEL('1'),IFCLABEL('12'),IFCLABEL('123'),IFCLABEL('1234'),IFCLABEL('124'),IFCLABEL('13'),IFCLABEL('134'),IFCLABEL('14'),IFCLABEL('2'),IFCLABEL('23'),IFCLABEL('234'),IFCLABEL('24'),IFCLABEL('3'),IFCLABEL('34'),IFCLABEL('4'),IFCLABEL('NONE')),$); -#4691=IFCSIMPLEPROPERTYTEMPLATE('1ZQjCh0TL2vuOCqa$fKg5p',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4692=IFCSIMPLEPROPERTYTEMPLATE('0whxD61arDZg7$gWN$tWIh',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4693=IFCSIMPLEPROPERTYTEMPLATE('1xStiHHwz3YgTmpaNHzdm0',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4694=IFCPROPERTYSETTEMPLATE('3078tQPb18QgxzqtSfTvkB',$,'Pset_WasteTerminalTypeRoofDrain','Pipe fitting, set into the roof, that collects rainwater for discharge into the rainwater system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/ROOFDRAIN,IfcWasteTerminalType/ROOFDRAIN',(#4695,#4696,#4697,#4698,#4699,#4700)); -#4695=IFCSIMPLEPROPERTYTEMPLATE('1NlfxrVnj6ywXMCOBJGDlP',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4696=IFCSIMPLEPROPERTYTEMPLATE('0D4RQF7xz4j9rL3S_vgX4E',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4697=IFCSIMPLEPROPERTYTEMPLATE('1SJTFkPz55$BxetaVpq09K',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4698=IFCSIMPLEPROPERTYTEMPLATE('0k8lyqT6f9hw5UOunsL3cI',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4699=IFCSIMPLEPROPERTYTEMPLATE('0VAQkEoKD6fuikGqMi_mAu',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4700=IFCSIMPLEPROPERTYTEMPLATE('0jeP6Kkt54CBdi8U6bPFbd',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4701=IFCPROPERTYSETTEMPLATE('1ONiVEiS5AV9AhvhrrmxsT',$,'Pset_WasteTerminalTypeWasteDisposalUnit','Electrically operated device that reduces kitchen or other waste into fragments small enough to be flushed into a drainage system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/WASTEDISPOSALUNIT,IfcWasteTerminalType/WASTEDISPOSALUNIT',(#4702,#4703,#4704)); -#4702=IFCSIMPLEPROPERTYTEMPLATE('0WuW6RsFL0R8F7OFLzgFhL',$,'DrainConnectionSize','Size of the drain connection inlet to the waste disposal unit.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4703=IFCSIMPLEPROPERTYTEMPLATE('3qRQpF8ar4eOkp1os4vp4p',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4704=IFCSIMPLEPROPERTYTEMPLATE('2crPsywOjCs8WK68qviOuq',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4705=IFCPROPERTYSETTEMPLATE('3LiqfUKIz9M8fOlWUGgOCU',$,'Pset_WasteTerminalTypeWasteTrap','Pipe fitting, set adjacent to a sanitary terminal, that retains liquid to prevent the passage of foul air.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/WASTETRAP,IfcWasteTerminalType/WASTETRAP',(#4706,#4708,#4709)); -#4706=IFCSIMPLEPROPERTYTEMPLATE('0DcbGL7_j5qghAYpgT4bzw',$,'WasteTrapType','Identifies the predefined types of trap from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4707,$,$,$,.READWRITE.); -#4707=IFCPROPERTYENUMERATION('PEnum_TrapType',(IFCLABEL('NONE'),IFCLABEL('P_TRAP'),IFCLABEL('Q_TRAP'),IFCLABEL('S_TRAP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4708=IFCSIMPLEPROPERTYTEMPLATE('22OUgrpF95hB$o4ug3e8WJ',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4709=IFCSIMPLEPROPERTYTEMPLATE('17DrrRKQHCJ9YTVy9B5llQ',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4710=IFCPROPERTYSETTEMPLATE('0frSawCYz3Re7kgg$vwqrN',$,'Pset_WaterStratumCommon','Properties expressing the composition and any variability in the height of the body of water. Ranges are non-negative describing a spread.',.PSET_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum/WATER',(#4711,#4712,#4713,#4714,#4715,#4716)); -#4711=IFCSIMPLEPROPERTYTEMPLATE('3cZgE23vP2owB1xwQCEczD',$,'AnnualRange','Indicative (95%-100%) annual range in levels.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4712=IFCSIMPLEPROPERTYTEMPLATE('2cMk5Y5Vv9EQQJvWrV6pqz',$,'AnnualTrend','Indicative (95%-100%) annual rise in level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); -#4713=IFCSIMPLEPROPERTYTEMPLATE('0HIMBUONbC0QYVVJE5YmQI',$,'IsFreshwater','Indication of freshwater (true,false or unknown)',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); -#4714=IFCSIMPLEPROPERTYTEMPLATE('2KSxY4W5P7zRjHq3NzDCZu',$,'SeicheRange','Indicative (95%-100%) range between peaks and troughts of seiche (resonant) waves.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4715=IFCSIMPLEPROPERTYTEMPLATE('28W2D0APb9pRZINiuggLDl',$,'TidalRange','Indicative (95%-100%) range between high and low tide levels.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4716=IFCSIMPLEPROPERTYTEMPLATE('0qPRtsBkHBwPvKUkZtMaly',$,'WaveRange','Indicative (95%-100%) range between peaks and troughs of waves',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); -#4717=IFCPROPERTYSETTEMPLATE('0ZLsVFSgX84RijpbrFjODo',$,'Pset_Width','Specifies the general properties for a Width event.',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation/WIDTHEVENT',(#4718,#4720,#4722)); -#4718=IFCSIMPLEPROPERTYTEMPLATE('074GxfOnH75wDr2CR4KWA4',$,'Side','Specifies if the width is measured to the RIGHT or to the LEFT of the curve referenced by the placement, or if the same value is applied to BOTH sides.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4719,$,$,$,.READWRITE.); -#4719=IFCPROPERTYENUMERATION('PEnum_SideType',(IFCLABEL('BOTH'),IFCLABEL('LEFT'),IFCLABEL('RIGHT')),$); -#4720=IFCSIMPLEPROPERTYTEMPLATE('1HONdaTwv2cgFb8JXHPUFP',$,'TransitionWidth','The type of transition of width used between the previous event and this event.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4721,$,$,$,.READWRITE.); -#4721=IFCPROPERTYENUMERATION('PEnum_TransitionWidthType',(IFCLABEL('CONST'),IFCLABEL('LINEAR')),$); -#4722=IFCSIMPLEPROPERTYTEMPLATE('3IF_k_1CHDYeq0a9g4icwo',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); -#4723=IFCPROPERTYSETTEMPLATE('2NELxUcbH0OAEY1qcSp5hA',$,'Pset_WindowCommon','Properties common to the definition of all occurrences of Window.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWindow,IfcWindowType',(#4724,#4725,#4727,#4728,#4729,#4730,#4731,#4732,#4733,#4734,#4735,#4736,#4737,#4738,#4739,#4740,#4741)); -#4724=IFCSIMPLEPROPERTYTEMPLATE('21wWSv1KbFb9SuLxRCphPv',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4725=IFCSIMPLEPROPERTYTEMPLATE('2UDB$7XdX9yhhhmRei5_HO',$,'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',$,#4726,$,$,$,.READWRITE.); -#4726=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4727=IFCSIMPLEPROPERTYTEMPLATE('2CcC80iMf3PvJiVSWwIHx1',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4728=IFCSIMPLEPROPERTYTEMPLATE('00BBoIfsL5mx4IxDVAarJB',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4729=IFCSIMPLEPROPERTYTEMPLATE('3t_KLwlunEDval_UYO5qj2',$,'SecurityRating','Index based rating system indicating security level.\X2\000A\X0\It is giving according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4730=IFCSIMPLEPROPERTYTEMPLATE('2U2NZLkAL2vOJSfYPSz$jf',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4731=IFCSIMPLEPROPERTYTEMPLATE('04qK1vtmb98gOpBs9DmjrY',$,'Infiltration','Infiltration flowrate of outside air for the filler object based on the area of the filler object at a pressure level of 50 Pascals. It shall be used, if the length of all joints is unknown.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); -#4732=IFCSIMPLEPROPERTYTEMPLATE('32PIo3BNL84OT2lsKM9cYV',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); -#4733=IFCSIMPLEPROPERTYTEMPLATE('07PsdMwEX1r9T6OSm3y6kZ',$,'GlazingAreaFraction','Fraction of the glazing area relative to the total area of the filling element.\X2\000A\X0\It shall be used, if the glazing area is not given separately for all panels within the filling element.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); -#4734=IFCSIMPLEPROPERTYTEMPLATE('1b$4b12612twYFe92QjChl',$,'HasSillExternal','Indication whether the window opening has an external sill (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4735=IFCSIMPLEPROPERTYTEMPLATE('0syrT5ER1AW89bjEUWP9_0',$,'HasSillInternal','Indication whether the window opening has an internal sill (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4736=IFCSIMPLEPROPERTYTEMPLATE('0X1CMHwajCPgVk0esCyRzn',$,'HasDrive','Indication whether this object has an automatic drive to operate it (TRUE) or no drive (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4737=IFCSIMPLEPROPERTYTEMPLATE('3Vek6GszLCXPold2H2h0KA',$,'SmokeStop','Indication whether the object is designed to provide a smoke stop (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4738=IFCSIMPLEPROPERTYTEMPLATE('1sgaMQr1577gBZiNVG_82U',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here it defines an exit window in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4739=IFCSIMPLEPROPERTYTEMPLATE('1xOQCpjIr6WRtRK4AIcBNo',$,'WaterTightnessRating','Water tightness rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4740=IFCSIMPLEPROPERTYTEMPLATE('0Rkk33S6D7mgbaOjVtZLJ5',$,'MechanicalLoadRating','Mechanical load rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4741=IFCSIMPLEPROPERTYTEMPLATE('0kyxdGEJr7QfdwB5da$mz7',$,'WindLoadRating','Wind load resistance rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#4742=IFCPROPERTYSETTEMPLATE('3XW$iVfcL6Pu3Z97xXNYCg',$,'Pset_WiredCommunicationPortCommon','Properties used for wired communication port.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort/CABLE',(#4743,#4745)); -#4743=IFCSIMPLEPROPERTYTEMPLATE('0R3oMy24L4$eTIF7dxzTha',$,'CommunicationStandard','Indicates the communication standard supported by the physical wired communication port.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4744,$,$,$,.READWRITE.); -#4744=IFCPROPERTYENUMERATION('PEnum_CommunicationStandard',(IFCLABEL('ETHERNET'),IFCLABEL('STM_1'),IFCLABEL('STM_16'),IFCLABEL('STM_256'),IFCLABEL('STM_4'),IFCLABEL('STM_64'),IFCLABEL('USB'),IFCLABEL('XDSL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); -#4745=IFCSIMPLEPROPERTYTEMPLATE('3sk2O6VjrCdOwWF6nj7M66',$,'MaximumTransferRate','Indicates the transmission rate in bit/s over the wired port.',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); -#4746=IFCPROPERTYSETTEMPLATE('2I$aH70lX21gGvw7$UvPIn',$,'Pset_WorkControlCommon','Properties common to the definition of all occurrences of IfcWorkPlan and IfcWorkSchedule (subtypes of IfcWorkControl).',.PSET_OCCURRENCEDRIVEN.,'IfcWorkControl',(#4747,#4748,#4749,#4750,#4751)); -#4747=IFCSIMPLEPROPERTYTEMPLATE('3nvkmLT419VvVnsXwt7K6Z',$,'WorkStartTime','The default time of day a task is scheduled to start. For presentation purposes, if the start time of a task matches the WorkStartTime, then applications may choose to display the date only. Conversely when entering dates without specifying time, applications may automatically append the WorkStartTime.',.P_SINGLEVALUE.,'IfcTime',$,$,$,$,$,.READWRITE.); -#4748=IFCSIMPLEPROPERTYTEMPLATE('30gzeFpuT6qPcl2$M5uMSn',$,'WorkFinishTime','The default time of day a task is scheduled to finish. For presentation purposes, if the finish time of a task matches the WorkFinishTime, then applications may choose to display the date only. Conversely when entering dates without specifying time, applications may automatically append the WorkFinishTime.',.P_SINGLEVALUE.,'IfcTime',$,$,$,$,$,.READWRITE.); -#4749=IFCSIMPLEPROPERTYTEMPLATE('1IYfB1Y7PCrx7SVLqZkeFq',$,'WorkDayDuration','The elapsed time within a worktime-based day. For presentation purposes, applications may choose to display IfcTask durations in work days where IfcTaskTime.DurationType=WORKTIME. This value must be less than or equal to 24 hours (an elapsed day); if omitted then 8 hours is assumed.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#4750=IFCSIMPLEPROPERTYTEMPLATE('3gO13M3Cf9lvI13AXdB_Za',$,'WorkWeekDuration','The elapsed time within a worktime-based week. For presentation purposes, applications may choose to display IfcTask durations in work weeks where IfcTaskTime.DurationType=WORKTIME. This value must be less than or equal to 168 hours (an elapsed week); if omitted then 40 hours is assumed.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#4751=IFCSIMPLEPROPERTYTEMPLATE('2TPxdWhXf7yBumrMk_UPYT',$,'WorkMonthDuration','The elapsed time within a worktime-based month. For presentation purposes, applications may choose to display IfcTask durations in work months where IfcTaskTime.DurationType=WORKTIME. This value must be less than or equal to 744 hours (an elapsed month of 31 days); if omitted then 160 hours is assumed.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); -#4752=IFCPROPERTYSETTEMPLATE('2JHjH65oj1Kfd6Ei9JjM7e',$,'Pset_ZoneCommon','Properties common to the definition of all occurrences of IfcZone.',.PSET_OCCURRENCEDRIVEN.,'IfcZone',(#4753,#4754,#4755,#4756,#4757,#4758)); -#4753=IFCSIMPLEPROPERTYTEMPLATE('2N8RLItvrCderJucFaajeZ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); -#4754=IFCSIMPLEPROPERTYTEMPLATE('2RkUi$gQrAPxErrJN_qfJH',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4755=IFCSIMPLEPROPERTYTEMPLATE('0knwJQQWXEHwA7OtkIC43V',$,'GrossPlannedArea','Total planned gross area of the spatial structure element. Used for programming the spatial structure element.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#4756=IFCSIMPLEPROPERTYTEMPLATE('2jY51pnuf4jw8HkXQGJI$m',$,'NetPlannedArea','Total planned net area of the object. Used for programming the object.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); -#4757=IFCSIMPLEPROPERTYTEMPLATE('3kYa1iU_D1OPYgEu2G0BR2',$,'PubliclyAccessible','Indication whether this space (in case of e.g., a toilet) is designed to serve as a publicly accessible space, e.g., for a public toilet (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4758=IFCSIMPLEPROPERTYTEMPLATE('26ljzPZh18dvUT4559ZlSc',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. Set to (TRUE) if this object is rated as handicap accessible according the local building codes, otherwise (FALSE).\X2\000A\X0\It is giving according to the requirements of the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); -#4759=IFCPROPERTYSETTEMPLATE('0XBuKrD2HAxh7FQFFCdaNT',$,'Qto_ActuatorBaseQuantities','Base quantities that are common to the definition of all occurrences of actuator.',.QTO_TYPEDRIVENOVERRIDE.,'IfcActuator,IfcActuatorType',(#4760)); -#4760=IFCSIMPLEPROPERTYTEMPLATE('3v1jYDkkz1nAwUwhvJ245r',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4761=IFCPROPERTYSETTEMPLATE('0mjd6VFpH4EuToq6pKv81u',$,'Qto_AirTerminalBaseQuantities','Base quantities that are common to the definition of all types of air terminals.',.QTO_TYPEDRIVENOVERRIDE.,'IfcAirTerminal,IfcAirTerminalType',(#4762,#4763,#4764)); -#4762=IFCSIMPLEPROPERTYTEMPLATE('03B5XmOUvELRRVcmYrlY_y',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4763=IFCSIMPLEPROPERTYTEMPLATE('1nQJJWIGn3WhB3Gt$22NTE',$,'Perimeter','Perimeter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4764=IFCSIMPLEPROPERTYTEMPLATE('0QweRGaULCPuG641KDoyoM',$,'TotalSurfaceArea','Total surface area of the element.\X2\000A000A\X0\Concerns the air terminal face plate.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4765=IFCPROPERTYSETTEMPLATE('2zF$LWRiT3ah0CD5mmbIOa',$,'Qto_AirTerminalBoxTypeBaseQuantities','Base quantities that are common to the definition of all types of air terminal boxes.',.QTO_TYPEDRIVENOVERRIDE.,'IfcAirTerminalBox,IfcAirTerminalBoxType',(#4766)); -#4766=IFCSIMPLEPROPERTYTEMPLATE('1LMVAtLzr0$uvRSsBI8hc4',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4767=IFCPROPERTYSETTEMPLATE('3$fH1_8bXC0QJK31lE4w0e',$,'Qto_AirToAirHeatRecoveryBaseQuantities','Base quantities that are common to the definition of all types of air-to-air heat recovery elements.',.QTO_TYPEDRIVENOVERRIDE.,'IfcAirToAirHeatRecovery,IfcAirToAirHeatRecoveryType',(#4768)); -#4768=IFCSIMPLEPROPERTYTEMPLATE('34TS77vJnAr8Oxneinq9lF',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4769=IFCPROPERTYSETTEMPLATE('3TZgjQFAbERAJyVtrAIu8E',$,'Qto_AlarmBaseQuantities','Base quantities that are common to the definition of all occurrences of alarm.',.QTO_TYPEDRIVENOVERRIDE.,'IfcAlarm,IfcAlarmType',(#4770)); -#4770=IFCSIMPLEPROPERTYTEMPLATE('2v1z0xx49C1uMeY689N8oz',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4771=IFCPROPERTYSETTEMPLATE('1mZjqRXp5Bx8flGyKwSHIa',$,'Qto_ArealStratumBaseQuantities','Quantity measures associated to areal stratum such as in a geotechnical slice. Uncertainty is documented in Pset_Uncertainty.',.QTO_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum',(#4772,#4773,#4774)); -#4772=IFCSIMPLEPROPERTYTEMPLATE('2I0qcUdp51nguObT7uKwTs',$,'Area','Calculated area for the object.\X2\000A000A\X0\Area represented, if lower edge of stratum known.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4773=IFCSIMPLEPROPERTYTEMPLATE('0wAjiC7lDE09W9_k$cUYEu',$,'Length','The length of the object.\X2\000A000A\X0\Of upper edge of slice.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4774=IFCSIMPLEPROPERTYTEMPLATE('0waazsJ5r8OBDmnAjtL0Xu',$,'PlanLength','Projected plan length of upper edge of slice.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4775=IFCPROPERTYSETTEMPLATE('2UzJgVBJP5Dhtpa$j6Eq5Y',$,'Qto_AudioVisualApplianceBaseQuantities','Base quantities that are common to the definition of all occurrences of audio visual appliance.',.QTO_TYPEDRIVENOVERRIDE.,'IfcAudioVisualAppliance,IfcAudioVisualApplianceType',(#4776)); -#4776=IFCSIMPLEPROPERTYTEMPLATE('1cFpY5HIX2M8ktmyS2um2q',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4777=IFCPROPERTYSETTEMPLATE('1mJotGWDDFAOPh9vzjaDZb',$,'Qto_BeamBaseQuantities','Base quantities that are common to the definition of all occurrences of beams.',.QTO_TYPEDRIVENOVERRIDE.,'IfcBeam,IfcBeamType',(#4778,#4779,#4780,#4781,#4782,#4783,#4784,#4785,#4786)); -#4778=IFCSIMPLEPROPERTYTEMPLATE('3DmVVB0YLE8u_PpkYf_vwD',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4779=IFCSIMPLEPROPERTYTEMPLATE('2PmSDjXuv8GuCbcAdxetiR',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4780=IFCSIMPLEPROPERTYTEMPLATE('3cS6E3FYrFWfuQcjVULsHg',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4781=IFCSIMPLEPROPERTYTEMPLATE('0QSM65qGnFTw4UGRBAVPYa',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4782=IFCSIMPLEPROPERTYTEMPLATE('2OTBsyKcrAMwCdJgS661aY',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4783=IFCSIMPLEPROPERTYTEMPLATE('3LF8zX5zL4SRVmuzAIuWSD',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4784=IFCSIMPLEPROPERTYTEMPLATE('2AAC7ksCLErBLsVaVgDyCy',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4785=IFCSIMPLEPROPERTYTEMPLATE('2hFEADcLr65xR0NFkCpfjQ',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4786=IFCSIMPLEPROPERTYTEMPLATE('1m0fsqM614894fI__Nkr8_',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4787=IFCPROPERTYSETTEMPLATE('2KS9su6r517uLXTGKwwDdn',$,'Qto_BodyGeometryValidation','Quantities supplied for validating the correct interpretation of the body shape representation at import. In case of multiple representation items, the quantities are summed for each of the items (irrespective of any overlap). Choosing a suitable tolerance value for comparing the supplied numbers to the numbers calculated from the reconstructed geometry is at the discretion of the importing application.',.QTO_OCCURRENCEDRIVEN.,'IfcProduct',(#4788,#4789,#4790,#4791,#4792,#4793)); -#4788=IFCSIMPLEPROPERTYTEMPLATE('3iCdOOLRjCwQ_HRTB41Xh8',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.\X2\000A000A\X0\Total gross surface area of the element before applying product-level geometric features such as openings and projections.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4789=IFCSIMPLEPROPERTYTEMPLATE('0juemEqF5889vg7HwR87Fv',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net surface area of the element after applying product-level geometric features such as openings and projections.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4790=IFCSIMPLEPROPERTYTEMPLATE('1LUuLSnMXFDgGLBCvte8aH',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.\X2\000A000A\X0\Total gross volume of the element before applying product-level geometric features such as openings and projections.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4791=IFCSIMPLEPROPERTYTEMPLATE('0ny7TXUFz8wvnoQ2eU8czF',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the element before applying product-level geometric features such as openings and projections.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4792=IFCSIMPLEPROPERTYTEMPLATE('31g8_gdUv8KRkOWzW48KoP',$,'SurfaceGenusBeforeFeatures','The Surface Genus of the evaluated representation items before applying product-level geometric features such as openings and projections.Surface Genus is a topological measure that represents the number of "holes" or "handles" on a surface. For example, a sphere has genus 0, and a torus has genus 1.Computed using the Euler characteristic:$$\\chi=V-E+F$$With the numbers of vertices (V), edges (E) and faces (F)$$\\chi=2\X2\2212\X0\2g\X2\2212\X0\b$$With surface genus (g) and the number of boundaries (b) the latter zero in case of an enclosed volume.',.Q_COUNT.,$,$,$,$,$,$,.READWRITE.); -#4793=IFCSIMPLEPROPERTYTEMPLATE('3kBBtGUebC09mUggGTKpjj',$,'SurfaceGenusAfterFeatures','The Surface Genus of the evaluated representation items after applying product-level geometric features such as openings and projections.Surface Genus is a topological measure that represents the number of "holes" or "handles" on a surface. For example, a sphere has genus 0, and a torus has genus 1.Computed using the Euler characteristic:$$\\chi=V-E+F$$With the numbers of vertices (V), edges (E) and faces (F)$$\\chi=2\X2\2212\X0\2g\X2\2212\X0\b$$With surface genus (g) and the number of boundaries (b) the latter zero in case of an enclosed volume.',.Q_COUNT.,$,$,$,$,$,$,.READWRITE.); -#4794=IFCPROPERTYSETTEMPLATE('0bGW4$csTD6OEAus6LeP_W',$,'Qto_BoilerBaseQuantities','Base quantities that are common to the definition of all types of boilers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcBoiler,IfcBoilerType',(#4795,#4796,#4797)); -#4795=IFCSIMPLEPROPERTYTEMPLATE('1KlNInP2X9oB1dhIKHT8T0',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4796=IFCSIMPLEPROPERTYTEMPLATE('2Q3voxL3j64grR7xc4etVh',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the element, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4797=IFCSIMPLEPROPERTYTEMPLATE('2K7F9gJr98exVXBqifO$Z7',$,'TotalSurfaceArea','Total surface area of the element.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4798=IFCPROPERTYSETTEMPLATE('0nGE1R71b5xhwffxbnq9FD',$,'Qto_BuildingBaseQuantities','Base quantities that are common to the definition of all occurrences of building.',.QTO_OCCURRENCEDRIVEN.,'IfcBuilding',(#4799,#4800,#4801,#4802,#4803,#4804,#4805)); -#4799=IFCSIMPLEPROPERTYTEMPLATE('2PVoetDtD9lP2rdqNL$MSX',$,'Height','Characteristic height\X2\000A000A\X0\Standard gross height of this building, from the top surface of the construction floor, to the top surface of the construction floor or roof above. Only provided is there is a constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4800=IFCSIMPLEPROPERTYTEMPLATE('3cQmPNtaj41Q5nkgcnuelE',$,'EavesHeight','Standard net height of this storey, from the top surface of the construction floor, to the bottom surface of the construction floor or roof above. Only provided is there is a constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4801=IFCSIMPLEPROPERTYTEMPLATE('1MtjYvS851xhJQpwaUm5Hf',$,'FootPrintArea','Gross area of the site covered by the building(s).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4802=IFCSIMPLEPROPERTYTEMPLATE('0xWEv1hg5C3BQxDr9aySXn',$,'GrossFloorArea','Sum of all gross floor areas covered by the spaces within the spatial structure element.\X2\000A000A\X0\Includes the area of construction elements within the building. May be provided in addition to the quantities of the spaces and the construction elements assigned to the building. In case of inconsistencies, the individual quantities of spaces and construction elements take precedence.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4803=IFCSIMPLEPROPERTYTEMPLATE('1t1klEXmn1BhESIFOtxxL5',$,'NetFloorArea','Sum of all net usable floor areas.\X2\000A000A\X0\It excludes the area of construction elements within the building. May be provided in addition to the quantities of the spaces assigned to the building. In case of inconsistencies, the individual quantities of spaces take precedence.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4804=IFCSIMPLEPROPERTYTEMPLATE('2E9lxMppn4kg7CkvlrakDR',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.\X2\000A000A\X0\Sum of all gross volumes of spaces enclosed. It includes the volumes of construction elements within the element. May be provided in addition to the quantities of the spaces and the construction elements assigned to the element. In case of inconsistencies, the individual quantities of spaces and construction elements take precedence.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4805=IFCSIMPLEPROPERTYTEMPLATE('10OBBDSy5BnQoOfE9PRwj0',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Sum of all net volumes of spaces enclosed by the building. It excludes the volumes of construction elements within the building. May be provided in addition to the quantities of the spaces assigned to the building. In case of inconsistencies, the individual quantities of spaces take precedence.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4806=IFCPROPERTYSETTEMPLATE('2$_oarY2j3v8qBbIPdWTL3',$,'Qto_BuildingElementProxyQuantities','Quantity set for Building Element Proxies.',.QTO_TYPEDRIVENOVERRIDE.,'IfcBuildingElementProxy,IfcBuildingElementProxyType',(#4807,#4808)); -#4807=IFCSIMPLEPROPERTYTEMPLATE('2lDu2tXt128hHlstYjsOMK',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4808=IFCSIMPLEPROPERTYTEMPLATE('1uU1iU6d1C7QicHF7EHZyg',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4809=IFCPROPERTYSETTEMPLATE('3r00ySoPj6qBXFt6Otog3m',$,'Qto_BuildingStoreyBaseQuantities','Base quantities that are common to the definition of all occurrences of building storey.',.QTO_OCCURRENCEDRIVEN.,'IfcBuildingStorey',(#4810,#4811,#4812,#4813,#4814,#4815,#4816)); -#4810=IFCSIMPLEPROPERTYTEMPLATE('3YbtmioKj8LPj$Q7UGj_Ex',$,'GrossHeight','Standard gross height of this storey, from the top surface of the construction floor, to the top surface of the construction floor or roof above. Only provided is there is a constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4811=IFCSIMPLEPROPERTYTEMPLATE('1THHvP8XL7Z8R8E_XWcz22',$,'NetHeight','Standard net height of this storey, from the top surface of the construction floor, to the bottom surface of the construction floor or roof above. Only provided is there is a constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4812=IFCSIMPLEPROPERTYTEMPLATE('1VshZhkdnD3P3haoouzMOg',$,'GrossPerimeter','Gross perimeter at the outer contour of the object.\X2\000A000A\X0\Without taking interior slab openings into account.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4813=IFCSIMPLEPROPERTYTEMPLATE('3qvJKNSI9E6Pe5dW1o_F35',$,'GrossFloorArea','Sum of all gross floor areas covered by the spaces within the spatial structure element.\X2\000A000A\X0\Includes the area of construction elements within the building storey. May be provided in addition to the quantities of the spaces and the construction elements assigned to the storey. In case of inconsistencies, the individual quantities of spaces and construction elements take precedence.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4814=IFCSIMPLEPROPERTYTEMPLATE('13iHPjYSP0oRKjo4dV$QhE',$,'NetFloorArea','Sum of all net usable floor areas.\X2\000A000A\X0\It excludes the area of construction elements within the building storey. May be provided in addition to the quantities of the spaces assigned to the storey. In case of inconsistencies, the individual quantities of spaces take precedence.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4815=IFCSIMPLEPROPERTYTEMPLATE('2734peH0LEVhs0qUP$yFVB',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.\X2\000A000A\X0\Sum of all gross volumes of spaces enclosed. It includes the volumes of construction elements within the element. May be provided in addition to the quantities of the spaces and the construction elements assigned to the element. In case of inconsistencies, the individual quantities of spaces and construction elements take precedence.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4816=IFCSIMPLEPROPERTYTEMPLATE('1nCZux3vjDUPn0oKUAhzbw',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Sum of all net volumes of spaces enclosed by the building storey. It iexcludes the volumes of construction elements within the building storey. May be provided in addition to the quantities of the spaces assigned to the storey. In case of inconsistencies, the individual quantities of spaces take precedence.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4817=IFCPROPERTYSETTEMPLATE('01z0bbrsTF9unAZyqr6pZd',$,'Qto_BurnerBaseQuantities','Base quantities that are common to the definition of all types of burners.',.QTO_TYPEDRIVENOVERRIDE.,'IfcBurner,IfcBurnerType',(#4818)); -#4818=IFCSIMPLEPROPERTYTEMPLATE('3u75uVzD587woXtBZ6dyx8',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4819=IFCPROPERTYSETTEMPLATE('3H5DtQZbzAG98cGEyTJSrX',$,'Qto_CableCarrierFittingBaseQuantities','Base quantities that are common to the definition of all occurrences of cable carrier fitting.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCableCarrierFitting,IfcCableCarrierFittingType',(#4820)); -#4820=IFCSIMPLEPROPERTYTEMPLATE('2HRSPmvE923gzHJHV178ZF',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4821=IFCPROPERTYSETTEMPLATE('1P$qtdIJPC_x4a79_LxS2Y',$,'Qto_CableCarrierSegmentBaseQuantities','Base quantities that are common to the definition of all occurrences of cable carrier segment.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment,IfcCableCarrierSegmentType',(#4822,#4823,#4824,#4825)); -#4822=IFCSIMPLEPROPERTYTEMPLATE('0RB5DuacfAxe0kf6D6zAZs',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4823=IFCSIMPLEPROPERTYTEMPLATE('2_RAKFOq91Q9Qo6pupg4QE',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section, equal to the distance between inlet and outlet ports.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4824=IFCSIMPLEPROPERTYTEMPLATE('3L1vlQBv55oA48q$lPkRWb',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4825=IFCSIMPLEPROPERTYTEMPLATE('2UBIjkl3PBTBAJktXVW1cF',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4826=IFCPROPERTYSETTEMPLATE('1_c6w2dZrBivoUsNQh9U9N',$,'Qto_CableFittingBaseQuantities','Base quantities that are common to the definition of all occurrences of flow cable fitting.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCableFitting,IfcCableFittingType',(#4827)); -#4827=IFCSIMPLEPROPERTYTEMPLATE('0uC1neWmr8R9f2QzD65eST',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4828=IFCPROPERTYSETTEMPLATE('11cQpcy_18AueU4HI7Utp6',$,'Qto_CableSegmentBaseQuantities','Base quantities that are common to the definition of all occurrences of cable segment.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCableSegment,IfcCableSegmentType',(#4829,#4830,#4831,#4832)); -#4829=IFCSIMPLEPROPERTYTEMPLATE('33UNkY9Hf63QSHZEQHX4V9',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4830=IFCSIMPLEPROPERTYTEMPLATE('2i2vzjec9EVvSzMbm8Ef3s',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section, equal to the distance between inlet and outlet ports.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4831=IFCSIMPLEPROPERTYTEMPLATE('0eCSwkD218nvvuovheNppd',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4832=IFCSIMPLEPROPERTYTEMPLATE('0KXqBjZyfAAenKHxJl3Fis',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4833=IFCPROPERTYSETTEMPLATE('00D5I_wgL8Zhh$x4msdT61',$,'Qto_ChillerBaseQuantities','Base quantities that are common to the definition of all types of chillers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcChiller,IfcChillerType',(#4834)); -#4834=IFCSIMPLEPROPERTYTEMPLATE('3vCvNcnp51V9qqTl46JLkB',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4835=IFCPROPERTYSETTEMPLATE('3SeBTilbz4UvlQcOinHBtl',$,'Qto_ChimneyBaseQuantities','Base quantities that are common to the definition of all occurrences of chimneys.',.QTO_TYPEDRIVENOVERRIDE.,'IfcChimney,IfcChimneyType',(#4836)); -#4836=IFCSIMPLEPROPERTYTEMPLATE('3e1icCoY15U88exoPYnODT',$,'Length','The length of the object.\X2\000A000A\X0\From the foundation (or beginning) to the top not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4837=IFCPROPERTYSETTEMPLATE('2_J$tDmor3dxAzut5PRm64',$,'Qto_CoilBaseQuantities','Base quantities that are common to the definition of all types of coils.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCoil,IfcCoilType',(#4838)); -#4838=IFCSIMPLEPROPERTYTEMPLATE('3iAKZ5QU5CDeArrlc7CZ5F',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4839=IFCPROPERTYSETTEMPLATE('1Dj42Jkgz4pO$RxflOlSRb',$,'Qto_ColumnBaseQuantities','Base quantities that are common to the definition of all occurrences of columns.',.QTO_TYPEDRIVENOVERRIDE.,'IfcColumn,IfcColumnType',(#4840,#4841,#4842,#4843,#4844,#4845,#4846,#4847,#4848)); -#4840=IFCSIMPLEPROPERTYTEMPLATE('0qWdE1PPDAggIMtvYK$mqt',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4841=IFCSIMPLEPROPERTYTEMPLATE('1mcrdX_THBdvwK79m7Zjvd',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4842=IFCSIMPLEPROPERTYTEMPLATE('2dI5qHijv7JxLI9va4XZ0R',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4843=IFCSIMPLEPROPERTYTEMPLATE('37NhO1$y974OghfA81lz$S',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4844=IFCSIMPLEPROPERTYTEMPLATE('1VCqdw6Y98y8E3UiJPhf3X',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4845=IFCSIMPLEPROPERTYTEMPLATE('2O3FI$PHLABRn0cpPF$Ntd',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4846=IFCSIMPLEPROPERTYTEMPLATE('0qh5GUPGr38eYaPmFB6PFj',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4847=IFCSIMPLEPROPERTYTEMPLATE('3G$INUFHf2KPUUS$ArquAs',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4848=IFCSIMPLEPROPERTYTEMPLATE('2o8MsHsfb4b8rBj1dSaS2P',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4849=IFCPROPERTYSETTEMPLATE('2bAdFJtCXCQOb11VJ$9M6O',$,'Qto_CommunicationsApplianceBaseQuantities','Base quantities that are common to the definition of all occurrences of communications appliance.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance,IfcCommunicationsApplianceType',(#4850)); -#4850=IFCSIMPLEPROPERTYTEMPLATE('07GItdScj7rQuaLLRrmSxc',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4851=IFCPROPERTYSETTEMPLATE('2ghjm4AAnDtQA7v_SUFLPf',$,'Qto_CompressorBaseQuantities','Base quantities that are common to the definition of all types of compressors.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCompressor,IfcCompressorType',(#4852)); -#4852=IFCSIMPLEPROPERTYTEMPLATE('3cQqej64PABhZw$kf4UXM$',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4853=IFCPROPERTYSETTEMPLATE('3SN0Q3WAHB2u$kNUjP_cxc',$,'Qto_CondenserBaseQuantities','Base quantities that are common to the definition of all types of condensers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCondenser,IfcCondenserType',(#4854)); -#4854=IFCSIMPLEPROPERTYTEMPLATE('0V2o_KCOHDRvAzkdDF$7Vt',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4855=IFCPROPERTYSETTEMPLATE('3tLdUPl19Bvubj$PfiHig2',$,'Qto_ConduitSegmentBaseQuantities','Quantity set of Conduit Segment Base.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CONDUITSEGMENT,IfcCableCarrierSegmentType/CONDUITSEGMENT',(#4856,#4857)); -#4856=IFCSIMPLEPROPERTYTEMPLATE('2XKBEhk7XCBB62fvxuiAIe',$,'InnerDiameter','The actual inner diameter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4857=IFCSIMPLEPROPERTYTEMPLATE('2FXvFdB5PB1hT7SWPJGmic',$,'OuterDiameter','The actual outer diameter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4858=IFCPROPERTYSETTEMPLATE('1lwry9zIzBHPBvAPEy0skm',$,'Qto_ConstructionEquipmentResourceBaseQuantities','Base quantities that are common to the definition of all occurrences of construction equipment resources.',.QTO_TYPEDRIVENOVERRIDE.,'IfcConstructionEquipmentResource,IfcConstructionEquipmentResourceType',(#4859,#4860)); -#4859=IFCSIMPLEPROPERTYTEMPLATE('3XO4rYN612C8RHQKR1$vKt',$,'UsageTime','Total time using the equipment including operating time and idle time.',.Q_TIME.,$,$,$,$,$,$,.READWRITE.); -#4860=IFCSIMPLEPROPERTYTEMPLATE('3BeYEM_OnFAvEBkebg6eU0',$,'OperatingTime','Productive time using the equipment including operating time and excluding idle time.',.Q_TIME.,$,$,$,$,$,$,.READWRITE.); -#4861=IFCPROPERTYSETTEMPLATE('0KaTszlBz5CAGSu8gYgtQX',$,'Qto_ConstructionMaterialResourceBaseQuantities','Base quantities that are common to the definition of all occurrences of construction material resources.',.QTO_TYPEDRIVENOVERRIDE.,'IfcConstructionMaterialResource,IfcConstructionMaterialResourceType',(#4862,#4863,#4864,#4865)); -#4862=IFCSIMPLEPROPERTYTEMPLATE('3$m0hRsAf8j9Gv51BaUSRz',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.\X2\000A000A\X0\Including material placed and wasted.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4863=IFCSIMPLEPROPERTYTEMPLATE('29_6$YOlL8z8GBvzqvXitj',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the material, including material placed but excluding material wasted.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4864=IFCSIMPLEPROPERTYTEMPLATE('3bJ8B1h$rAQPacnsbyUl2Y',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Including material placed and wasted.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4865=IFCSIMPLEPROPERTYTEMPLATE('3QOihODWr8IuYTWNOA5$Ge',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net weight of the material, including material placed but excluding material wasted.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4866=IFCPROPERTYSETTEMPLATE('3sMZan$5fEfOE5RNDwtVy8',$,'Qto_ControllerBaseQuantities','Base quantities that are common to the definition of all occurrences of controller.',.QTO_TYPEDRIVENOVERRIDE.,'IfcController,IfcControllerType',(#4867)); -#4867=IFCSIMPLEPROPERTYTEMPLATE('3fv47SNLTCqxRmDBYPsti3',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4868=IFCPROPERTYSETTEMPLATE('3vTwOhRXj30e524NGLj57Q',$,'Qto_CooledBeamBaseQuantities','Base quantities that are common to the definition of all types of cooled beams.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCooledBeam,IfcCooledBeamType',(#4869)); -#4869=IFCSIMPLEPROPERTYTEMPLATE('2rDRGNt1r8ogaBcVSgD0JJ',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4870=IFCPROPERTYSETTEMPLATE('3HUIIgo$978RJeO19gdhej',$,'Qto_CoolingTowerBaseQuantities','Base quantities that are common to the definition of all types of cooling towers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCoolingTower,IfcCoolingTowerType',(#4871)); -#4871=IFCSIMPLEPROPERTYTEMPLATE('3uFDHVNHr289fEbgXA1PXE',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4872=IFCPROPERTYSETTEMPLATE('0t5y0jDlfFVvb964TT5xmQ',$,'Qto_CourseBaseQuantities','Quantity set for Course base.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCourse,IfcCourseType',(#4873,#4874,#4875,#4876,#4877,#4878)); -#4873=IFCSIMPLEPROPERTYTEMPLATE('2orNOXMcHFO8QIp12AYiqJ',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4874=IFCSIMPLEPROPERTYTEMPLATE('3vs4zKVRb23BUV_0ZGeLj1',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4875=IFCSIMPLEPROPERTYTEMPLATE('02eb0PP8X8dh8mfvZuJoCg',$,'Thickness','The geometric thickness of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4876=IFCSIMPLEPROPERTYTEMPLATE('2hzwUK3Xj7uhT4wAgXjK$V',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4877=IFCSIMPLEPROPERTYTEMPLATE('162hYTwfrAD8MQV7iwyHgd',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4878=IFCSIMPLEPROPERTYTEMPLATE('3_jWAuI0P80wVnlso64mwA',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4879=IFCPROPERTYSETTEMPLATE('0Ocdanb5v8u8sLYJuOS9iP',$,'Qto_CoveringBaseQuantities','Base quantities that are common to the definition of all occurrences of coverings applied to spaces.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCovering,IfcCoveringType',(#4880,#4881,#4882)); -#4880=IFCSIMPLEPROPERTYTEMPLATE('3xtOLlygLEYgroQna2T7Nl',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4881=IFCSIMPLEPROPERTYTEMPLATE('3jvdu7jR5EEf3lGtJUjBED',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Sum of all gross areas of the covering facing the space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4882=IFCSIMPLEPROPERTYTEMPLATE('2tZVAWDv5EgO88A9B1ZIMI',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Sum of all net areas of the covering facing the space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4883=IFCPROPERTYSETTEMPLATE('3Pooj545X9lg7f1nUvob4o',$,'Qto_CurtainWallQuantities','Base quantities that are common to the definition of all occurrences of curtain walls.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCurtainWall,IfcCurtainWallType',(#4884,#4885,#4886,#4887,#4888)); -#4884=IFCSIMPLEPROPERTYTEMPLATE('160LvolSD8lxrheynrnOY7',$,'Length','The length of the object.\X2\000A000A\X0\Along center line (even if different to the wall path).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4885=IFCSIMPLEPROPERTYTEMPLATE('0PzvVl4TvAmvHl$LNqouJA',$,'Height','Characteristic height\X2\000A000A\X0\Total height of the curtain wall. It should only be provided, if it is constant along the curtain wall path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4886=IFCSIMPLEPROPERTYTEMPLATE('27Sp8S7oL0UvgcxFE0vAEd',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\Only be provided, if it is constant along the curtain wall path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4887=IFCSIMPLEPROPERTYTEMPLATE('0A9W53HOL6RB1SuTxQtydX',$,'GrossSideArea','Area of the wall as viewed by an elevation view of the middle plane of the wall. It does not take into account any wall modifications (such as openings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4888=IFCSIMPLEPROPERTYTEMPLATE('2uRhDhDbnCKQLUIazu48Y8',$,'NetSideArea','Area of the object as viewed by an elevation view of the middle plane of the object. It does take into account all object modifications (such as openings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4889=IFCPROPERTYSETTEMPLATE('287xOREzX2gRFc2kEhdL5p',$,'Qto_DamperBaseQuantities','Base quantities that are common to the definition of all types of dampers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDamper,IfcDamperType',(#4890)); -#4890=IFCSIMPLEPROPERTYTEMPLATE('3M7otr3199efl5Q2IygiUp',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4891=IFCPROPERTYSETTEMPLATE('3dFaXa1RfBVucpc6zHt0ft',$,'Qto_DistributionBoardBaseQuantities','Base quantities that are common to the definition of all occurrences of electric distribution board.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricDistributionBoard,IfcElectricDistributionBoardType',(#4892,#4893)); -#4892=IFCSIMPLEPROPERTYTEMPLATE('2wzcUZT2j8kANezhyI1x$m',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4893=IFCSIMPLEPROPERTYTEMPLATE('2YG2n0fSvFmgzII8kDtoqI',$,'NumberOfCircuits','Number of circuits.\X2\000A000A\X0\Number of circuits in the distribution board.',.Q_COUNT.,$,$,$,$,$,$,.READWRITE.); -#4894=IFCPROPERTYSETTEMPLATE('2YDlC1Wgr0pwABajbRyXnG',$,'Qto_DistributionChamberElementBaseQuantities','Base quantities that are common to the definition of all occurrences of distribution chamber elements.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement,IfcDistributionChamberElementType',(#4895,#4896,#4897,#4898,#4899)); -#4895=IFCSIMPLEPROPERTYTEMPLATE('3iRvHXqX5BSuu7Mi9oJUJj',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4896=IFCSIMPLEPROPERTYTEMPLATE('3$4q8GikL1eAhb8iukiC2C',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net area of the inner surface of the chamber, subtracting any openings such as for pipes, ducts, or cables.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4897=IFCSIMPLEPROPERTYTEMPLATE('2o$Iy31Fr1$AvOP_ubucNL',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4898=IFCSIMPLEPROPERTYTEMPLATE('3z0Xfj4bL1NBIulHweKXVd',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the chamber, subtracting any enclosed elements such as pipes, ducts, cables, or equipment.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4899=IFCSIMPLEPROPERTYTEMPLATE('3bgqmjP4fDyRFIEjDphCXh',$,'Depth','The depth of the object.\X2\000A000A\X0\Indicates the depth of the element.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4900=IFCPROPERTYSETTEMPLATE('150rCYpLz2_RSvGS_cNx1X',$,'Qto_DoorBaseQuantities','Base quantities that are common to the definition of all occurrences of doors.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDoor,IfcDoorType',(#4901,#4902,#4903,#4904)); -#4901=IFCSIMPLEPROPERTYTEMPLATE('2O4tswIqL4owiJBYmGMe97',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\Total outer width of the door lining. It should only be provided, if it is a rectangular door.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4902=IFCSIMPLEPROPERTYTEMPLATE('2Ej2glQxTEaQ9YRy1_R2Vd',$,'Height','Characteristic height\X2\000A000A\X0\Total outer height of the door lining. It should only be provided, if it is a rectangular door.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4903=IFCSIMPLEPROPERTYTEMPLATE('1VRdMds0D6AuWu12wi9hMH',$,'Perimeter','Perimeter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4904=IFCSIMPLEPROPERTYTEMPLATE('0Vs9EaaIn9RhZJ1I$RDnbM',$,'Area','Calculated area for the object.\X2\000A000A\X0\Total area of the outer lining of the door.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4905=IFCPROPERTYSETTEMPLATE('2WGBbPscH8pe7O_skEKvxB',$,'Qto_DuctFittingBaseQuantities','Base quantities that are common to the definition of all types and occurrences of duct fittings.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDuctFitting,IfcDuctFittingType',(#4906,#4907,#4908,#4909,#4910)); -#4906=IFCSIMPLEPROPERTYTEMPLATE('3WQLL97fb3$BL7JOBAL1w8',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section and equal to the distance along the flow path from the port inlet to the port outlet. For junction fittings, it indicates the length of the longest flow path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4907=IFCSIMPLEPROPERTYTEMPLATE('2yqNUpRE12ves0HshG4lYr',$,'GrossCrossSectionArea','Area of the cross section.\X2\000A000A\X0\At the inlet, including the duct fitting itself and the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4908=IFCSIMPLEPROPERTYTEMPLATE('13SwU7ELfCwPmCyoCkHwl8',$,'NetCrossSectionArea','Area of the cross section of the object.\X2\000A000A\X0\Including the duct fitting and excluding the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4909=IFCSIMPLEPROPERTYTEMPLATE('2z1_4M6IfF$gxxIgMmMNTb',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4910=IFCSIMPLEPROPERTYTEMPLATE('1r$_J5hvr56P7xmsfWCNDl',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4911=IFCPROPERTYSETTEMPLATE('1g_fHUXrr2Pu5h9QLSVgJk',$,'Qto_DuctSegmentBaseQuantities','Base quantities that are common to the definition of all types and occurrences of duct segments.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDuctSegment,IfcDuctSegmentType',(#4912,#4913,#4914,#4915,#4916)); -#4912=IFCSIMPLEPROPERTYTEMPLATE('3qtYyFyfH9$95F5h$RuQir',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section, equal to the distance between inlet and outlet ports.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4913=IFCSIMPLEPROPERTYTEMPLATE('0JulA1OsH3cu7pNHlwHNGV',$,'GrossCrossSectionArea','Area of the cross section.\X2\000A000A\X0\Including the duct itself and the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4914=IFCSIMPLEPROPERTYTEMPLATE('0sUV9JwW1FrBgAE0a0ZC5V',$,'NetCrossSectionArea','Area of the cross section of the object.\X2\000A000A\X0\Excluding the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4915=IFCSIMPLEPROPERTYTEMPLATE('1KCslW_ZLCq942XmXGB$bu',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4916=IFCSIMPLEPROPERTYTEMPLATE('1LzXjnENX30gzqUJPXaqN4',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4917=IFCPROPERTYSETTEMPLATE('30P7_KGZj0UhRyKoA9r7yH',$,'Qto_DuctSilencerBaseQuantities','Base quantities that are common to the definition of all types of duct silencers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDuctSilencer,IfcDuctSilencerType',(#4918)); -#4918=IFCSIMPLEPROPERTYTEMPLATE('3tt3uFQM9FjvUwMnM80vlW',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4919=IFCPROPERTYSETTEMPLATE('1HNR1rDGn709sGMnr8GeVS',$,'Qto_EarthworksCutBaseQuantities','Quantity set for Earthworks Cut Base.',.QTO_OCCURRENCEDRIVEN.,'IfcEarthworksCut',(#4920,#4921,#4922,#4923,#4924,#4925)); -#4920=IFCSIMPLEPROPERTYTEMPLATE('2PZ672QUb4IhEw6WSr_GbS',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4921=IFCSIMPLEPROPERTYTEMPLATE('01rJmCAfr0hPS56uLMjhIq',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4922=IFCSIMPLEPROPERTYTEMPLATE('23eXo8YZrBSuxCLcjFCv4X',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4923=IFCSIMPLEPROPERTYTEMPLATE('3OAl2dbbj3MgTB4TH3L$dR',$,'UndisturbedVolume','Undisturbed Volume',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4924=IFCSIMPLEPROPERTYTEMPLATE('0iMOq$mBf8pARA_6LWwaXC',$,'LooseVolume','Volume of the earthworks when in a loose piled state',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4925=IFCSIMPLEPROPERTYTEMPLATE('1yNy03eMT0nvcYK0Lw_ygu',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4926=IFCPROPERTYSETTEMPLATE('0BK5X8QQTEQ8wLvaLeHycV',$,'Qto_EarthworksFillBaseQuantities','Quantity set for Earthworks Fill Base.',.QTO_OCCURRENCEDRIVEN.,'IfcEarthworksFill',(#4927,#4928,#4929,#4930,#4931)); -#4927=IFCSIMPLEPROPERTYTEMPLATE('3D0TkWuvXB3vpNa4QdUVtD',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4928=IFCSIMPLEPROPERTYTEMPLATE('1sZA_NEajCaxvUeVWcpaLw',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4929=IFCSIMPLEPROPERTYTEMPLATE('0Q3neW2011O8J2vYTEXGz2',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4930=IFCSIMPLEPROPERTYTEMPLATE('3t0_WquCf3BfUN29yluVc5',$,'CompactedVolume','Volume of the earthworks when finished and compacted in place.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4931=IFCSIMPLEPROPERTYTEMPLATE('38F0$Y0eH4guENPfp9MhFi',$,'LooseVolume','Volume of the earthworks when in a loose piled state',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4932=IFCPROPERTYSETTEMPLATE('35RTeOCTT6y8xcdydPs$hK',$,'Qto_ElectricApplianceBaseQuantities','Base quantities that are common to the definition of all occurrences of electric appliance.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricAppliance,IfcElectricApplianceType',(#4933)); -#4933=IFCSIMPLEPROPERTYTEMPLATE('1ffUG1iKfAUfTSc_SRUV6B',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4934=IFCPROPERTYSETTEMPLATE('2rQTV_cTT6xw2XtTqW0v7k',$,'Qto_ElectricFlowStorageDeviceBaseQuantities','Base quantities that are common to the definition of all occurrences of electric flow storage device.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice,IfcElectricFlowStorageDeviceType',(#4935)); -#4935=IFCSIMPLEPROPERTYTEMPLATE('3jYatwu2H6HvYsY_FriYRX',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4936=IFCPROPERTYSETTEMPLATE('3oXZcC51H0bvHEESZ9ecwY',$,'Qto_ElectricGeneratorBaseQuantities','Base quantities that are common to the definition of all occurrences of electric generator.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricGenerator,IfcElectricGeneratorType',(#4937)); -#4937=IFCSIMPLEPROPERTYTEMPLATE('0UAau7ciL5VRooFSkDiAa2',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4938=IFCPROPERTYSETTEMPLATE('3A7GyG5_bDWPUTTMEoyNyt',$,'Qto_ElectricMotorBaseQuantities','Base quantities that are common to the definition of all occurrences of electric motor.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricMotor,IfcElectricMotorType',(#4939)); -#4939=IFCSIMPLEPROPERTYTEMPLATE('20fDOrX3X6k9tPmzkphns0',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4940=IFCPROPERTYSETTEMPLATE('2YVZHOUef8b8vypf9Y06Gc',$,'Qto_ElectricTimeControlBaseQuantities','Base quantities that are common to the definition of all occurrences of electric time control.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricTimeControl,IfcElectricTimeControlType',(#4941)); -#4941=IFCSIMPLEPROPERTYTEMPLATE('1iK3sBodDD99ffj3E8vi5W',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4942=IFCPROPERTYSETTEMPLATE('2sdDxwugv0jOMy5KDt8qFJ',$,'Qto_EvaporativeCoolerBaseQuantities','Base quantities that are common to the definition of all types of evaporative coolers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcEvaporativeCooler,IfcEvaporativeCoolerType',(#4943)); -#4943=IFCSIMPLEPROPERTYTEMPLATE('1gq9e0JWvDNQKVkixdzwGd',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4944=IFCPROPERTYSETTEMPLATE('2NC9yVbxH9O827r0FY_KUt',$,'Qto_EvaporatorBaseQuantities','Base quantities that are common to the definition of all types of evaporators.',.QTO_TYPEDRIVENOVERRIDE.,'IfcEvaporator,IfcEvaporatorType',(#4945)); -#4945=IFCSIMPLEPROPERTYTEMPLATE('0mN36zjFH1URyXrh0ux2np',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4946=IFCPROPERTYSETTEMPLATE('11PrRoX3HB2Pq1VTE_Q8bw',$,'Qto_FacilityPartBaseQuantities','Base quantities that are common to the definition of all occurrences of IfcFacilityPart.',.QTO_OCCURRENCEDRIVEN.,'IfcFacilityPart',(#4947,#4948,#4949,#4950,#4951)); -#4947=IFCSIMPLEPROPERTYTEMPLATE('0cOx0kWoj2Ju9w$7OOoZ_n',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4948=IFCSIMPLEPROPERTYTEMPLATE('1ggD4$3mr7aO4h0sSq4dFS',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4949=IFCSIMPLEPROPERTYTEMPLATE('2sxt$lqGrFr9Yq9YeZivc3',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4950=IFCSIMPLEPROPERTYTEMPLATE('2LtM0o7nHCThl8EGGYYhmf',$,'Area','Calculated area for the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4951=IFCSIMPLEPROPERTYTEMPLATE('1nwloGlpj7nvzbD7TEGv2m',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4952=IFCPROPERTYSETTEMPLATE('2WdXMSwr56l8v7TdvipTod',$,'Qto_FanBaseQuantities','Base quantities that are common to the definition of all types of fans.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFan,IfcFanType',(#4953)); -#4953=IFCSIMPLEPROPERTYTEMPLATE('1eE$XKt4T7gf2Keu9nIvkR',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4954=IFCPROPERTYSETTEMPLATE('0$t3qQ9fb7Bxzu4XttGGeh',$,'Qto_FilterBaseQuantities','Base quantities that are common to the definition of all types of filters.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFilter,IfcFilterType',(#4955)); -#4955=IFCSIMPLEPROPERTYTEMPLATE('0cAY3B9D9AOhKxY5iKX6L2',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4956=IFCPROPERTYSETTEMPLATE('3KydZZ4gvAoOPEXA7Croxm',$,'Qto_FireSuppressionTerminalBaseQuantities','Base quantities that are common to the definition of all occurrences of fire suppression terminal.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal,IfcFireSuppressionTerminalType',(#4957)); -#4957=IFCSIMPLEPROPERTYTEMPLATE('1P3YbX0q55cR81aauhklcd',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4958=IFCPROPERTYSETTEMPLATE('0K2sSjFI54yeCnskx_qszW',$,'Qto_FlowInstrumentBaseQuantities','Base quantities that are common to the definition of all occurrences of flow instrument.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument,IfcFlowInstrumentType',(#4959)); -#4959=IFCSIMPLEPROPERTYTEMPLATE('2XiwFYXvnCaQZ48v5q6O01',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4960=IFCPROPERTYSETTEMPLATE('03aeifaqL95R0Jd4wbSfbt',$,'Qto_FlowMeterBaseQuantities','Base quantities that are common to the definition of all types of flow meters.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFlowMeter,IfcFlowMeterType',(#4961)); -#4961=IFCSIMPLEPROPERTYTEMPLATE('3xKZuWvlz1HfYCxObsuOxu',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4962=IFCPROPERTYSETTEMPLATE('1oguTMzzD9584qUJZMDfzG',$,'Qto_FootingBaseQuantities','Base quantities that are common to the definition of all occurrences of footings.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFooting,IfcFootingType',(#4963,#4964,#4965,#4966,#4967,#4968,#4969,#4970,#4971,#4972)); -#4963=IFCSIMPLEPROPERTYTEMPLATE('1$RPAL3mP9_AnA6fWaTyqu',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features. For strip footings it is measured along the path, for other footings it is one of the horizontal dimensions. It should only be provided, if it is constant.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4964=IFCSIMPLEPROPERTYTEMPLATE('2SbaOJhj1EQuDc1fcEGCKW',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\For strip footings it is measured perpendicular to the footing path (or longitudial axis). For other footings it is one of the horizontal dimensions. It should only be provided, if it is constant.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4965=IFCSIMPLEPROPERTYTEMPLATE('0jAQ3FfRb2qOJqm25XRfwg',$,'Height','Characteristic height\X2\000A000A\X0\Total nominal height of the footing. It should only be provided, if it is constant.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4966=IFCSIMPLEPROPERTYTEMPLATE('3rNRstkaXBKOVVT228qt$x',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4967=IFCSIMPLEPROPERTYTEMPLATE('1ifYSfsCv7dBaixXx7cgRo',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4968=IFCSIMPLEPROPERTYTEMPLATE('2h9CMQC3n92RP0uYWNHjdO',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#4969=IFCSIMPLEPROPERTYTEMPLATE('3BJn5T_v5CMRWxZ8tGyvGm',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4970=IFCSIMPLEPROPERTYTEMPLATE('1N08iDgWr1mPvKQ$6ZoiKN',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4971=IFCSIMPLEPROPERTYTEMPLATE('2PsyV$SAXF1hEoN_M7bA91',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4972=IFCSIMPLEPROPERTYTEMPLATE('0nPNqwkgD6VR5wmsBxTq4C',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4973=IFCPROPERTYSETTEMPLATE('3quYruDv99lvml37CaNNQ3',$,'Qto_HeatExchangerBaseQuantities','Base quantities that are common to the definition of all types of heat exchangers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcHeatExchanger,IfcHeatExchangerType',(#4974)); -#4974=IFCSIMPLEPROPERTYTEMPLATE('0t8piR7yn3LOIuAMT4FH3E',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4975=IFCPROPERTYSETTEMPLATE('3hku9JpTHFlfyIkY5LyBPz',$,'Qto_HumidifierBaseQuantities','Base quantities that are common to the definition of all types of humidifiers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcHumidifier,IfcHumidifierType',(#4976)); -#4976=IFCSIMPLEPROPERTYTEMPLATE('0SHOefspT9zvyMEBFjQPn7',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4977=IFCPROPERTYSETTEMPLATE('2tQA3OVQfDRBN3ZjlKT2jf',$,'Qto_ImpactProtectionDeviceBaseQuantities','Quantity set Impact Protection Device Base.',.QTO_TYPEDRIVENOVERRIDE.,'IfcImpactProtectionDevice,IfcImpactProtectionDeviceType',(#4978)); -#4978=IFCSIMPLEPROPERTYTEMPLATE('02GH20HIb2OhUgJ9vfSAbZ',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4979=IFCPROPERTYSETTEMPLATE('2yL6qP8fzAFw3ZTGr6w$wr',$,'Qto_InterceptorBaseQuantities','Base quantities that are common to the definition of all occurrences of interceptor.',.QTO_TYPEDRIVENOVERRIDE.,'IfcInterceptor,IfcInterceptorType',(#4980)); -#4980=IFCSIMPLEPROPERTYTEMPLATE('3nr$wMVUn6xe67mP9J3Nsu',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4981=IFCPROPERTYSETTEMPLATE('34RvHA6pzAJ86aBwk2nKMd',$,'Qto_JunctionBoxBaseQuantities','Base quantities that are common to the definition of all occurrences of junction box.',.QTO_TYPEDRIVENOVERRIDE.,'IfcJunctionBox,IfcJunctionBoxType',(#4982,#4983,#4984,#4985,#4986)); -#4982=IFCSIMPLEPROPERTYTEMPLATE('3Y2M_hxf51GOY8S8uj5TGG',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4983=IFCSIMPLEPROPERTYTEMPLATE('1BeHmYtJr8kuG14fnNhpyR',$,'NumberOfGangs','Number of gangs in the object.\X2\000A000A\X0\Number of gangs in the junction box.',.Q_COUNT.,$,$,$,$,$,$,.READWRITE.); -#4984=IFCSIMPLEPROPERTYTEMPLATE('13ezle_zD6KRN29maHqHN6',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4985=IFCSIMPLEPROPERTYTEMPLATE('37dOk7MVLF_AhgkvqsP$TD',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4986=IFCSIMPLEPROPERTYTEMPLATE('2nxYS7U29BDA1RE6XDhY8T',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4987=IFCPROPERTYSETTEMPLATE('0GaPKggub2yfi0M3_vHiza',$,'Qto_KerbBaseQuantities','Quantity set for Kerb Base.',.QTO_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#4988,#4989,#4990,#4991,#4992,#4993)); -#4988=IFCSIMPLEPROPERTYTEMPLATE('3jas1OvYT1$BGvoGoWUy6c',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4989=IFCSIMPLEPROPERTYTEMPLATE('3LW67yDFXFa9KZhmDD5pPV',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4990=IFCSIMPLEPROPERTYTEMPLATE('2bb96WTmr8huE2BSgovcXX',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4991=IFCSIMPLEPROPERTYTEMPLATE('0wQFYQh2nFV9jHcaA12E1r',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#4992=IFCSIMPLEPROPERTYTEMPLATE('0U0rHcvs9FIABH4qZ$OCm8',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#4993=IFCSIMPLEPROPERTYTEMPLATE('06wlh_xFP7Cf_y976xhSCV',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4994=IFCPROPERTYSETTEMPLATE('0_9i5PhpDE7Aq41Y8B5ccX',$,'Qto_LaborResourceBaseQuantities','Base quantities that are common to the definition of all occurrences of labour resources.',.QTO_TYPEDRIVENOVERRIDE.,'IfcLaborResource,IfcLaborResourceType',(#4995,#4996)); -#4995=IFCSIMPLEPROPERTYTEMPLATE('0iLVd8vOLCAO6jyBbRa007',$,'StandardWork','Work that is performed at regular times, up to a particular limit after which overtime rates may apply.',.Q_TIME.,$,$,$,$,$,$,.READWRITE.); -#4996=IFCSIMPLEPROPERTYTEMPLATE('3dKGgqY2L7pxsGzxND3AOQ',$,'OvertimeWork','Work that is performed after exceeding a particular limit such as hours per day and/or hours per week, after which company or municipal policy requires a different rate to apply. Note: Policies for when overtime takes effect are the responsibility of the user or application; they are not modelled in IFC.',.Q_TIME.,$,$,$,$,$,$,.READWRITE.); -#4997=IFCPROPERTYSETTEMPLATE('2YI4Vd2DrFjvw1WLw_6LQL',$,'Qto_LampBaseQuantities','Base quantities that are common to the definition of all occurrences of lamp.',.QTO_TYPEDRIVENOVERRIDE.,'IfcLamp,IfcLampType',(#4998)); -#4998=IFCSIMPLEPROPERTYTEMPLATE('0dLFU1JQz9m9zInKzup4xW',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#4999=IFCPROPERTYSETTEMPLATE('2FB9g8g3j6ihFkMY3giwwK',$,'Qto_LightFixtureBaseQuantities','Base quantities that are common to the definition of all occurrences of light fixture.',.QTO_TYPEDRIVENOVERRIDE.,'IfcLightFixture,IfcLightFixtureType',(#5000)); -#5000=IFCSIMPLEPROPERTYTEMPLATE('25o3KtFRLDme3qmrOsECSA',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5001=IFCPROPERTYSETTEMPLATE('04YgdLJazETgnaolIJsj5L',$,'Qto_LinearStratumBaseQuantities','Quantity measures associated to a linear stratum such as in a borehole. Uncertainty is documented in Pset_Uncertainty.',.QTO_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum',(#5002,#5003)); -#5002=IFCSIMPLEPROPERTYTEMPLATE('3gxTLEmIb1mwEL1RgmX2cn',$,'Diameter','The Diameter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5003=IFCSIMPLEPROPERTYTEMPLATE('0XygQ25sn6wfJhY28Gpri7',$,'Length','The length of the object.\X2\000A000A\X0\Effective length sampled, if lower end of segment known',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5004=IFCPROPERTYSETTEMPLATE('2acs8TLrv2Hht_oTyCp064',$,'Qto_MarineFacilityBaseQuantities','Base quantities that are common to the definition of all occurrences of IfcMarineFacility.',.QTO_OCCURRENCEDRIVEN.,'IfcMarineFacility',(#5005,#5006,#5007,#5008,#5009)); -#5005=IFCSIMPLEPROPERTYTEMPLATE('0BXfR_1cT3GuAbQ_yXPQ34',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5006=IFCSIMPLEPROPERTYTEMPLATE('1zqvnT8ZrBzvf0ui6$kkWB',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5007=IFCSIMPLEPROPERTYTEMPLATE('0zCe92z$z6hQEIcKGr8TRr',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5008=IFCSIMPLEPROPERTYTEMPLATE('0I0_oQEBH5gRJDlbehc$bN',$,'Area','Calculated area for the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5009=IFCSIMPLEPROPERTYTEMPLATE('0UlR4ecVnFUh6q2wcG8Han',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5010=IFCPROPERTYSETTEMPLATE('0s$uiGmmHEcx0tKHTZCeTO',$,'Qto_MemberBaseQuantities','Base quantities that are common to the definition of all occurrences of members.',.QTO_TYPEDRIVENOVERRIDE.,'IfcMember,IfcMemberType',(#5011,#5012,#5013,#5014,#5015,#5016,#5017,#5018,#5019)); -#5011=IFCSIMPLEPROPERTYTEMPLATE('087Xybgez3bx_xum1hPtKu',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5012=IFCSIMPLEPROPERTYTEMPLATE('2Uf$RYF2TDIRJHKWYfT7Ix',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5013=IFCSIMPLEPROPERTYTEMPLATE('2mmpmKsFj0BQHg$Y6Q1t3z',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5014=IFCSIMPLEPROPERTYTEMPLATE('2JZyeco4zECeEiNKCnUAhq',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5015=IFCSIMPLEPROPERTYTEMPLATE('3G4cebOu96XQqeE3wGPzY_',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5016=IFCSIMPLEPROPERTYTEMPLATE('0vdihba8D0v9JhNIXkTlBF',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5017=IFCSIMPLEPROPERTYTEMPLATE('3mg3hTrO5C0B8t793a6goR',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5018=IFCSIMPLEPROPERTYTEMPLATE('1SFndaJBjBbBr7$mGm6uQ1',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5019=IFCSIMPLEPROPERTYTEMPLATE('31cd1SSez4mAQxlsxZuwHh',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5020=IFCPROPERTYSETTEMPLATE('1LD6xCTTvCKR2W0wQ9BdcS',$,'Qto_MotorConnectionBaseQuantities','Base quantities that are common to the definition of all occurrences of motor connection.',.QTO_TYPEDRIVENOVERRIDE.,'IfcMotorConnection,IfcMotorConnectionType',(#5021)); -#5021=IFCSIMPLEPROPERTYTEMPLATE('3yuKhSMnz1e88goPgy_SUI',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5022=IFCPROPERTYSETTEMPLATE('3vwpMsFMr3uBwRGiRFb0aE',$,'Qto_OpeningElementBaseQuantities','Base quantities that are common to the definition of all occurrences of opening elements.',.QTO_TYPEDRIVENOVERRIDE.,'IfcOpeningElement',(#5023,#5024,#5025,#5026,#5027)); -#5023=IFCSIMPLEPROPERTYTEMPLATE('15YEiobiz2xPK8w2w7njTc',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\Width of the opening, in case of wall openings it is the horizontal dimension in case of slab openings it is one horizontal dimension. Only provided, if the area is rectangular.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5024=IFCSIMPLEPROPERTYTEMPLATE('2u_JsrOv594R4WG3Bw_7$S',$,'Height','Characteristic height\X2\000A000A\X0\Height of the opening, in case of wall openings it is the vertical dimension in case of slab openings it is one horizontal dimension. Only provided, if the area is rectangular.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5025=IFCSIMPLEPROPERTYTEMPLATE('089QortZj8598UuJx0DlaO',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (or thickness) of the opening, in case of openings it shall be identical to the width (or thickness) of the voided element, in case of recesses it shall be less. Only provided, if the depth is constant.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5026=IFCSIMPLEPROPERTYTEMPLATE('0M7PX2b$f0iudaGFXsqnpV',$,'Area','Calculated area for the object.\X2\000A000A\X0\Area of the opening as viewed by an elevation view (for wall openings) or as viewed by a ground floor view (for slab openings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5027=IFCSIMPLEPROPERTYTEMPLATE('3IkxzJVzbE6Qt6nC$f8Ci3',$,'Volume','Volume of the element.\X2\000A000A\X0\Volume of the opening. It is the subtraction volume of the opening from the voided element (e.g. wall or slab). In case that the geometric volume of the opening is bigger then the subtraction volume, only the subtraction volume should be used.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5028=IFCPROPERTYSETTEMPLATE('2Xcpks4zX9DxLtZF1ldlyW',$,'Qto_OutletBaseQuantities','Base quantities that are common to the definition of all occurrences of outlet.',.QTO_TYPEDRIVENOVERRIDE.,'IfcOutlet,IfcOutletType',(#5029)); -#5029=IFCSIMPLEPROPERTYTEMPLATE('2RkQrvTrvEUf714np_u6n1',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5030=IFCPROPERTYSETTEMPLATE('1az2G4doXEsuMDmIf8wAZV',$,'Qto_PavementBaseQuantities','Quantity set for Pavement.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPavement,IfcPavementType',(#5031,#5032,#5033,#5034,#5035,#5036,#5037)); -#5031=IFCSIMPLEPROPERTYTEMPLATE('0lRiFqpy9DTRfArBbkPA3E',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5032=IFCSIMPLEPROPERTYTEMPLATE('1MEsQBMtHFpPB1tPj22PvY',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5033=IFCSIMPLEPROPERTYTEMPLATE('0kFDOUrKXFFgIPyPfTVPRS',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5034=IFCSIMPLEPROPERTYTEMPLATE('3TdWxCHrX9nOwK_GzNBmxX',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Indicates the extruded area of the element. Only given, if the element is prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5035=IFCSIMPLEPROPERTYTEMPLATE('3OE_EjXU90kvBIJpK1VJb6',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Indicates the extruded area of the object. Only given when prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5036=IFCSIMPLEPROPERTYTEMPLATE('0SpLlIjfD8qQ8NuUFYrSkm',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5037=IFCSIMPLEPROPERTYTEMPLATE('3E4hwVRmj7BeCrSWqzUaIu',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the slab. Openings and recesses are taken into account by subtraction, projections by addition.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5038=IFCPROPERTYSETTEMPLATE('1rfvvDq6z4tPeRkGfiwNoi',$,'Qto_PictorialSignQuantities','Quantity set for Pictorial Signs.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSign/PICTORAL,IfcSignType/PICTORAL',(#5039,#5040)); -#5039=IFCSIMPLEPROPERTYTEMPLATE('1MyUF3V29DORWOyANTKumB',$,'Area','Calculated area for the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5040=IFCSIMPLEPROPERTYTEMPLATE('1Pgk1uIf96fhRCKOG90QpY',$,'SignArea','Sign Area',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5041=IFCPROPERTYSETTEMPLATE('3KT9xZMUr8zhAQp6O7cUvG',$,'Qto_PileBaseQuantities','Base quantities that are common to the definition of all occurrences of piles.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPile,IfcPileType',(#5042,#5043,#5044,#5045,#5046,#5047,#5048,#5049)); -#5042=IFCSIMPLEPROPERTYTEMPLATE('0$Wi7t9RPELRJNbSH3K8z8',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5043=IFCSIMPLEPROPERTYTEMPLATE('0umFHic0f5bPD58uc$9q5o',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5044=IFCSIMPLEPROPERTYTEMPLATE('2UVCiDw35Aywbg0enOHxwA',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5045=IFCSIMPLEPROPERTYTEMPLATE('3qde4iPDL94vZJL2VpbYXN',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5046=IFCSIMPLEPROPERTYTEMPLATE('3IQ1ouhWbEruCOsp4mfAYh',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5047=IFCSIMPLEPROPERTYTEMPLATE('3ddd07W3P6s9$L$zSHyotT',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5048=IFCSIMPLEPROPERTYTEMPLATE('2v8iLma5X3t9Cl_J9EMrZ$',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5049=IFCSIMPLEPROPERTYTEMPLATE('0_1BJpBA13O8VQMhAiKxRQ',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5050=IFCPROPERTYSETTEMPLATE('2VNCySUF1FqPky8t4wpz4c',$,'Qto_PipeFittingBaseQuantities','Base quantities that are common to the definition of all types and occurrences of pipe fittings.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPipeFitting,IfcPipeFittingType',(#5051,#5052,#5053,#5054,#5055,#5056)); -#5051=IFCSIMPLEPROPERTYTEMPLATE('3Y7hR6jfj2p9IWLFAkPpOp',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section and equal to the distance along the flow path from the port inlet to the port outlet. For junction fittings, it indicates the length of the longest flow path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5052=IFCSIMPLEPROPERTYTEMPLATE('30RGmxRs5E6873u$4_ky05',$,'GrossCrossSectionArea','Area of the cross section.\X2\000A000A\X0\Including the pipe fitting itself and the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5053=IFCSIMPLEPROPERTYTEMPLATE('33dYPMu_9BK9Wxt9JyQXZu',$,'NetCrossSectionArea','Area of the cross section of the object.\X2\000A000A\X0\Including the pipe fitting and excluding the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5054=IFCSIMPLEPROPERTYTEMPLATE('1zrCABITz1KfLkfETGNTrn',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5055=IFCSIMPLEPROPERTYTEMPLATE('3AhWJ0Twb21wG2VSfNO0bR',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5056=IFCSIMPLEPROPERTYTEMPLATE('0Tk8OVUS550wXJNLi8IkYS',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the pipe fitting, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5057=IFCPROPERTYSETTEMPLATE('01Vn$Iz5n0tOTALQlaUxn_',$,'Qto_PipeSegmentBaseQuantities','Base quantities that are common to the definition of all types and occurrences of pipe segments.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPipeSegment,IfcPipeSegmentType',(#5058,#5059,#5060,#5061,#5062,#5063,#5064)); -#5058=IFCSIMPLEPROPERTYTEMPLATE('3olEUNYEv2rgFjh2bGZqJ3',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section, equal to the distance between inlet and outlet ports.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5059=IFCSIMPLEPROPERTYTEMPLATE('3TzbL2YfT7DQwgUIdyMr5k',$,'GrossCrossSectionArea','Area of the cross section.\X2\000A000A\X0\Including the pipe itself and the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5060=IFCSIMPLEPROPERTYTEMPLATE('3R2_MkOcr2bQ52_LdLnvJz',$,'NetCrossSectionArea','Area of the cross section of the object.\X2\000A000A\X0\Excluding the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5061=IFCSIMPLEPROPERTYTEMPLATE('3sFUGo1P50mBdGaP9CeOPX',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5062=IFCSIMPLEPROPERTYTEMPLATE('3CXkSdkV1CWv6U6Q_ZwHY9',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5063=IFCSIMPLEPROPERTYTEMPLATE('3j2EN1a5j26PZAifalk7aL',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the pipe segment, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5064=IFCSIMPLEPROPERTYTEMPLATE('1xO9ucFcH36wKA6BrLf8bS',$,'FootPrintArea','Gross area of the site covered by the building(s).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5065=IFCPROPERTYSETTEMPLATE('15NdGn7ab2GvPq9q75QeY6',$,'Qto_PlateBaseQuantities','Base quantities that are common to the definition of all occurrences of plates.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPlate,IfcPlateType',(#5066,#5067,#5068,#5069,#5070,#5071,#5072,#5073)); -#5066=IFCSIMPLEPROPERTYTEMPLATE('0a$UCXraLA8uEidPKx1h9h',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5067=IFCSIMPLEPROPERTYTEMPLATE('2DQY9y8OTCQO7vW1Wi8ij2',$,'Perimeter','Perimeter of the object.\X2\000A000A\X0\Perimeter measured along the outer boundaries of the plate. Only given, if the plate is prismatic (constant thickness).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5068=IFCSIMPLEPROPERTYTEMPLATE('2IFfLwuNPDsfRYycSujZLl',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Indicates the extruded area of the element. Only given, if the element is prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5069=IFCSIMPLEPROPERTYTEMPLATE('2KacBbH1z6Jg4do1Tjc$GT',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Indicates the extruded area of the object. Only given when prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5070=IFCSIMPLEPROPERTYTEMPLATE('0HoxmQc_55NuLrWzrW9bpt',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5071=IFCSIMPLEPROPERTYTEMPLATE('1mj6r5kuT4Th7Tlj_A5nxK',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the plate. Openings and recesses are taken into account by subtraction, projections by addition.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5072=IFCSIMPLEPROPERTYTEMPLATE('29xPYyunDAhAdkxzRUFlCA',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5073=IFCSIMPLEPROPERTYTEMPLATE('3puNU3bg12MeoSvnGGrpPT',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5074=IFCPROPERTYSETTEMPLATE('2n6Jt5_vzFxPLgu4kOTk04',$,'Qto_ProjectionElementBaseQuantities','Base quantities that are common to the definition of all occurrences of projection elements.',.QTO_OCCURRENCEDRIVEN.,'IfcProjectionElement',(#5075,#5076)); -#5075=IFCSIMPLEPROPERTYTEMPLATE('1fNELUSAHFzPY2EK4FeG1d',$,'Area','Calculated area for the object.\X2\000A000A\X0\Area of the projection as viewed by an elevation view (for wall projections or as viewed by a ground floor view (for slab projections).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5076=IFCSIMPLEPROPERTYTEMPLATE('34diKVtLH4pASWs25mT$tz',$,'Volume','Volume of the element.\X2\000A000A\X0\Volume of the opening. It is the additional volume of the projection to the element (e.g. wall or slab).',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5077=IFCPROPERTYSETTEMPLATE('3Cb6CGpmzCm9uW70AksY0M',$,'Qto_ProtectiveDeviceBaseQuantities','Base quantities that are common to the definition of all occurrences of protective device.',.QTO_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#5078)); -#5078=IFCSIMPLEPROPERTYTEMPLATE('06$KC1MkfBCwg7O8l2gMEs',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5079=IFCPROPERTYSETTEMPLATE('1tOdJBSD18_9Xuj0C4s1Bk',$,'Qto_ProtectiveDeviceTrippingUnitBaseQuantities','Base quantities that are common to the definition of all occurrences of protective device tripping unit.',.QTO_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#5080)); -#5080=IFCSIMPLEPROPERTYTEMPLATE('1lZan2$710DBiStrS4fUbL',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5081=IFCPROPERTYSETTEMPLATE('1cAsH9QXX4yOFU8naGoZZm',$,'Qto_PumpBaseQuantities','Base quantities that are common to the definition of all types of pumps.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPump,IfcPumpType',(#5082)); -#5082=IFCSIMPLEPROPERTYTEMPLATE('24JVMPW$XB8uOluZceqH2o',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5083=IFCPROPERTYSETTEMPLATE('2dFVifq3n0iBoBdbNa4zAP',$,'Qto_RailBaseQuantities','Base quantities that are common to the definition of all occurrences of rail.',.QTO_TYPEDRIVENOVERRIDE.,'IfcRail,IfcRailType',(#5084,#5085,#5086)); -#5084=IFCSIMPLEPROPERTYTEMPLATE('0R3PREneLA0OR8JJ$V0gc5',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5085=IFCSIMPLEPROPERTYTEMPLATE('1PaH2onoP10vasWBg8dd03',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5086=IFCSIMPLEPROPERTYTEMPLATE('2qFpWftY98kwCVwnryHc4w',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5087=IFCPROPERTYSETTEMPLATE('0$0TIneCz9RvFarCi$WO8F',$,'Qto_RailingBaseQuantities','Base quantities that are common to the definition of all occurrences of railings.',.QTO_TYPEDRIVENOVERRIDE.,'IfcRailing,IfcRailingType',(#5088)); -#5088=IFCSIMPLEPROPERTYTEMPLATE('2SXiPpAXL49Rf0$0OadZuc',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5089=IFCPROPERTYSETTEMPLATE('2t6Yjj1f9E$95sgzwc3CcM',$,'Qto_RampFlightBaseQuantities','Base quantities that are common to the definition of all occurrences of ramp flights.',.QTO_TYPEDRIVENOVERRIDE.,'IfcRampFlight,IfcRampFlightType',(#5090,#5091,#5092,#5093,#5094,#5095)); -#5090=IFCSIMPLEPROPERTYTEMPLATE('2UB9GpP4XBlf0BR4W4DTl1',$,'Length','The length of the object.\X2\000A000A\X0\Measured along the walking line.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5091=IFCSIMPLEPROPERTYTEMPLATE('3e7hKL97D6m9mYcli_fbxj',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5092=IFCSIMPLEPROPERTYTEMPLATE('2LYNE1P_98Ev0k$0J3I3V0',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Total area of the ramp flight (not the projected area). Only given, if the element is prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5093=IFCSIMPLEPROPERTYTEMPLATE('240lnUSVv48u3Kd33e6tcC',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Total area of the ramp flight (not the projected area). Only given when prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5094=IFCSIMPLEPROPERTYTEMPLATE('2iPskOEd94kfofzE22Nypl',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5095=IFCSIMPLEPROPERTYTEMPLATE('1CwQ7wNdjCLvhtgVPRRe2p',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the ramp flight. Openings and recesses are taken into account by subtraction, projections by addition.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5096=IFCPROPERTYSETTEMPLATE('2p1dm7O255mhuKX9klzqcs',$,'Qto_ReinforcedSoilBaseQuantities','Quantity sets for Reinforced Soil Base.',.QTO_OCCURRENCEDRIVEN.,'IfcReinforcedSoil',(#5097,#5098,#5099,#5100,#5101)); -#5097=IFCSIMPLEPROPERTYTEMPLATE('2JTwwHeur1QgTZjOWBBaDL',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5098=IFCSIMPLEPROPERTYTEMPLATE('1RyI37SRLAERcFsSs943RF',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5099=IFCSIMPLEPROPERTYTEMPLATE('18LPtH3If18eKgLJuz5Pyv',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5100=IFCSIMPLEPROPERTYTEMPLATE('1uGzUqNN50thWGqdnrGNqJ',$,'Area','Calculated area for the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5101=IFCSIMPLEPROPERTYTEMPLATE('3Epw8FiKj62wqj7CKhl4Uz',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5102=IFCPROPERTYSETTEMPLATE('0WWn7TXG5A1Qu4o_k3U8LT',$,'Qto_ReinforcingElementBaseQuantities','Base quantities that are common to the definition of all occurrences of reinforcement.',.QTO_TYPEDRIVENOVERRIDE.,'IfcReinforcingElement,IfcReinforcingElementType',(#5103,#5104,#5105)); -#5103=IFCSIMPLEPROPERTYTEMPLATE('1X_RZfKtb9HhLuOSPLfPYf',$,'Count','Total count of reinforcing items.',.Q_COUNT.,$,$,$,$,$,$,.READWRITE.); -#5104=IFCSIMPLEPROPERTYTEMPLATE('2NJcjVVY91HQ$OsNzNVZy9',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5105=IFCSIMPLEPROPERTYTEMPLATE('0MBPI9rcH7L8mJQGUDMYoA',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5106=IFCPROPERTYSETTEMPLATE('2WV8sBT0TBdQ5_hmVegNaO',$,'Qto_RoofBaseQuantities','Base quantities that are common to the definition of all occurrences of roof.',.QTO_TYPEDRIVENOVERRIDE.,'IfcRoof,IfcRoofType',(#5107,#5108,#5109)); -#5107=IFCSIMPLEPROPERTYTEMPLATE('0tOemvJyT9IvseBKFWKT05',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Indicates the outer surface of the roof and the sum of all roof slab gross areas.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5108=IFCSIMPLEPROPERTYTEMPLATE('2KShU4$Q55185$4pgZF0Rt',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Total net area of the outer surface of the roof. It is the suma of all roof slab net areas.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5109=IFCSIMPLEPROPERTYTEMPLATE('1SB1YQ9pX219Rnyu6oXk1v',$,'ProjectedArea','Total gross area of the outer surfaces of the roof, projected tp the ground. It is the sum of all projected roof slab gross areas. Roof openings, like sky windows and other openings and cut-outs are not taken into account.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5110=IFCPROPERTYSETTEMPLATE('2m$EQaPrHDfPMtNbobO0zZ',$,'Qto_SanitaryTerminalBaseQuantities','Base quantities that are common to the definition of all occurrences of sanitary terminal.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal,IfcSanitaryTerminalType',(#5111)); -#5111=IFCSIMPLEPROPERTYTEMPLATE('3pdGWH_tD1mRoq1UvDmwiS',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5112=IFCPROPERTYSETTEMPLATE('3xvT0yuurBI8WJ$qCpQLu8',$,'Qto_SensorBaseQuantities','Base quantities that are common to the definition of all occurrences of sensor.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSensor,IfcSensorType',(#5113)); -#5113=IFCSIMPLEPROPERTYTEMPLATE('0DhgIGZgz3hPUT6tKpS7gU',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5114=IFCPROPERTYSETTEMPLATE('3u4$zb04jAqgHwBiazJd$l',$,'Qto_SignalBaseQuantities','Base quantities for Signals.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSignal,IfcSignalType',(#5115)); -#5115=IFCSIMPLEPROPERTYTEMPLATE('2jxCErhCv77O8$RvSsQw9H',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5116=IFCPROPERTYSETTEMPLATE('1zYhe5$V95I97MourFBvTn',$,'Qto_SignBaseQuantities','Base quantities for Signs.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSign,IfcSignType',(#5117,#5118,#5119,#5120)); -#5117=IFCSIMPLEPROPERTYTEMPLATE('3wVzmBZRz5bgj3pVt11Kj5',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5118=IFCSIMPLEPROPERTYTEMPLATE('014iAArCDBNeO00IZfnctE',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5119=IFCSIMPLEPROPERTYTEMPLATE('2ofs9edbXCoxkL_$kRaaq_',$,'Thickness','The geometric thickness of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5120=IFCSIMPLEPROPERTYTEMPLATE('0K6E1Se0X0XRqJIFl5SdFc',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5121=IFCPROPERTYSETTEMPLATE('2g7F0mIbb3AvWHszG9YToO',$,'Qto_SiteBaseQuantities','Base quantities that are common to the definition of all occurrences of site.',.QTO_OCCURRENCEDRIVEN.,'IfcSite',(#5122,#5123)); -#5122=IFCSIMPLEPROPERTYTEMPLATE('2o_Z5Ou792xuKdD5QPoMf$',$,'GrossPerimeter','Gross perimeter at the outer contour of the object.\X2\000A000A\X0\Measured in horizontal projection.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5123=IFCSIMPLEPROPERTYTEMPLATE('0dMWSwB$j75BDKtvUNpQ5m',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Measured in horizontal projections.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5124=IFCPROPERTYSETTEMPLATE('1TOH3iV0X95vJdh4rAfWkh',$,'Qto_SlabBaseQuantities','Base quantities that are common to the definition of all occurrences of slabs.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSlab,IfcSlabType',(#5125,#5126,#5127,#5128,#5129,#5130,#5131,#5132,#5133,#5134)); -#5125=IFCSIMPLEPROPERTYTEMPLATE('2e5q5JuZnFIf80NVKYvLDm',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5126=IFCSIMPLEPROPERTYTEMPLATE('3dH518J916_B9UNOM_sjTU',$,'Length','The length of the object.\X2\000A000A\X0\Only provided if rectangular.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5127=IFCSIMPLEPROPERTYTEMPLATE('0shxT0RpH7awtf98GZx2Md',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5128=IFCSIMPLEPROPERTYTEMPLATE('1_S7NXqxr7Xf1W$HsJgi5K',$,'Perimeter','Perimeter of the object.\X2\000A000A\X0\Perimeter measured along the outer boundaries of the slab. Only given, if the slab is prismatic (constant thickness).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5129=IFCSIMPLEPROPERTYTEMPLATE('0WlTVJ$bf5ef1otvw8egIy',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Indicates the extruded area of the element. Only given, if the element is prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5130=IFCSIMPLEPROPERTYTEMPLATE('3Xm6V8IJ5Bfuv3fxSMEghW',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Indicates the extruded area of the object. Only given when prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5131=IFCSIMPLEPROPERTYTEMPLATE('2NEI_oMpz66R1A7$Yu9RBT',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5132=IFCSIMPLEPROPERTYTEMPLATE('2SwaZNNf18LgpqNptoO6pD',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the slab. Openings and recesses are taken into account by subtraction, projections by addition.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5133=IFCSIMPLEPROPERTYTEMPLATE('38GaFIbkL2EAKtgzhbEDhL',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5134=IFCSIMPLEPROPERTYTEMPLATE('17xKaP$lT9GvWHmaYDO_tH',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5135=IFCPROPERTYSETTEMPLATE('1t1cU5kz57Z8mpR$zdLivx',$,'Qto_SleeperBaseQuantities','Base quantities common to the definition to all occurrences of IfcTrackElement with PredefinedType set to SLEEPER.',.QTO_TYPEDRIVENOVERRIDE.,'IfcTrackElement/SLEEPER,IfcTrackElementType/SLEEPER',(#5136,#5137,#5138)); -#5136=IFCSIMPLEPROPERTYTEMPLATE('0_io0dS0bEkQDq8icEVLBU',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5137=IFCSIMPLEPROPERTYTEMPLATE('3EX1wlYKX1lvHb2s0KMh4D',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5138=IFCSIMPLEPROPERTYTEMPLATE('3zaKDqCDfCzQoc$BnPn7zo',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5139=IFCPROPERTYSETTEMPLATE('1s_YUjmOz3FhVehEj4BSBQ',$,'Qto_SolarDeviceBaseQuantities','Base quantities that are common to the definition of all occurrences of solar devices.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSolarDevice,IfcSolarDeviceType',(#5140,#5141)); -#5140=IFCSIMPLEPROPERTYTEMPLATE('2sf4FFnzH38PuMR97UYzlo',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5141=IFCSIMPLEPROPERTYTEMPLATE('0RQ$mM_4P6cfcp1MPRL27K',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Including the outer frame.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5142=IFCPROPERTYSETTEMPLATE('0$EwddC51AZ8uLMXDlSRE5',$,'Qto_SpaceBaseQuantities','Base quantities that are common to the definition of all occurrences of spaces.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSpace,IfcSpaceType',(#5143,#5144,#5145,#5146,#5147,#5148,#5149,#5150,#5151,#5152,#5153,#5154,#5155)); -#5143=IFCSIMPLEPROPERTYTEMPLATE('0aeHrmsq92oxjiT58JaLu_',$,'Height','Characteristic height\X2\000A000A\X0\Total height (from base slab without flooring to ceiling without suspended ceiling) for this space (measured from top of slab below to bottom of slab above). To be provided only if the space has a constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5144=IFCSIMPLEPROPERTYTEMPLATE('2RqrwHBTrAPRy9GroZYe6m',$,'FinishCeilingHeight','Height of the suspended ceiling (from top of flooring to the bottom of the suspended ceiling). To be provided only if the space has a suspended ceiling with constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5145=IFCSIMPLEPROPERTYTEMPLATE('3I$Fyh6xzE2fjZUZDOKZLT',$,'FinishFloorHeight','Height of the flooring (from base slab without flooring to the flooring height). To be provided only if the space has a constant flooring height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5146=IFCSIMPLEPROPERTYTEMPLATE('0X1ECS6oHAaf9QVYggRRDZ',$,'GrossPerimeter','Gross perimeter at the outer contour of the object.\X2\000A000A\X0\Measured at floor level with all sides of the space, including those parts of the perimeter that are created by virtual boundaries and openings (like doors).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5147=IFCSIMPLEPROPERTYTEMPLATE('23yXsZpzX3HRoUPjnpbPo3',$,'NetPerimeter','Net perimeter at the floor level of this space. It excludes those parts of the perimeter that are created by by virtual boundaries and openings (like doors). It is the measurement used for skirting boards and may includes the perimeter of internal fixed objects like columns.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5148=IFCSIMPLEPROPERTYTEMPLATE('2xu3Mu17vCUPB7RSgyzIxf',$,'GrossFloorArea','Sum of all gross floor areas covered by the spaces within the spatial structure element.\X2\000A000A\X0\Includes the area covered by elements inside the space (columns, inner walls, etc.) and excludes the area covered by wall claddings.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5149=IFCSIMPLEPROPERTYTEMPLATE('32bD6QtMr7pAI1Sv_1YUyk',$,'NetFloorArea','Sum of all net usable floor areas.\X2\000A000A\X0\It excludes the area covered by elements inside the space (columns, inner walls, built-in''s etc.), slab openings, or other protruding elements. Varying heights are not taking into account (i.e. no reduction for areas under a minimum headroom).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5150=IFCSIMPLEPROPERTYTEMPLATE('0nBW9aIFz0me3Thu4o1kwB',$,'GrossWallArea','Sum of all wall (and other vertically bounding elements, like columns) areas bounded by the space. It includes the area covered by elements inside the wall area (doors, windows, other openings, etc.).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5151=IFCSIMPLEPROPERTYTEMPLATE('0UH$r4p6966Blj233icHDZ',$,'NetWallArea','Sum of all wall (and other vertically bounding elements, like columns) areas bounded by the space. It excludes the area covered by elements inside the wall area (doors, windows, other openings, etc.).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5152=IFCSIMPLEPROPERTYTEMPLATE('3hUZ$sDPr24v6Pou1gO$ae',$,'GrossCeilingArea','Sum of all ceiling areas of the space. It includes the area covered by elementsinside the space (columns, inner walls, etc.). The ceiling area is the real (and not the projected) area (e.g. in case of sloped ceilings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5153=IFCSIMPLEPROPERTYTEMPLATE('1HWCY2EkXEuBwLNaqAUB8R',$,'NetCeilingArea','Sum of all ceiling areas of the space. It excludes the area covered by elementsinside the space (columns, inner walls, etc.). The ceiling area is the real (and not the projected) area (e.g. in case of sloped ceilings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5154=IFCSIMPLEPROPERTYTEMPLATE('166GdM$Xn6gPvXEBwYUrH6',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5155=IFCSIMPLEPROPERTYTEMPLATE('1D5EIVPm54LPIJBc9$ZklS',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Net volume enclosed by the space, excluding the volume of construction elements inside the space.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5156=IFCPROPERTYSETTEMPLATE('1fadAYaZP74QXGkq9j7DuZ',$,'Qto_SpaceHeaterBaseQuantities','Base quantities that are common to the definition of all types of space heaters.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSpaceHeater,IfcSpaceHeaterType',(#5157,#5158,#5159)); -#5157=IFCSIMPLEPROPERTYTEMPLATE('2u$iTAupr8WQJ8Jt7pYEUy',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5158=IFCSIMPLEPROPERTYTEMPLATE('3owc3cQhP1ROE7McM9Ce$f',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5159=IFCSIMPLEPROPERTYTEMPLATE('3EbNkqsPn04f6eLFdvFUIS',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the element, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5160=IFCPROPERTYSETTEMPLATE('2$Sh4aPFjFjx7pq$dp$VFt',$,'Qto_SpatialZoneBaseQuantities','Base quantities set for Spatial Zones.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSpatialZone,IfcSpatialZoneType',(#5161,#5162,#5163)); -#5161=IFCSIMPLEPROPERTYTEMPLATE('0cSVfwjM58UAU2oWLW3bZA',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5162=IFCSIMPLEPROPERTYTEMPLATE('1gyVpFpRH8ygAXixmD2BBm',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5163=IFCSIMPLEPROPERTYTEMPLATE('2aA3I8WujELe_olQi9541U',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5164=IFCPROPERTYSETTEMPLATE('2X24wiQxH2bfiJJMviXP_Z',$,'Qto_StackTerminalBaseQuantities','Base quantities that are common to the definition of all occurrences of stack terminal.',.QTO_TYPEDRIVENOVERRIDE.,'IfcStackTerminal,IfcStackTerminalType',(#5165)); -#5165=IFCSIMPLEPROPERTYTEMPLATE('27Lp37Qt10QBhU93V6dyEs',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5166=IFCPROPERTYSETTEMPLATE('2n53tfxPL9OgHdnQ5NjQ1o',$,'Qto_StairFlightBaseQuantities','Base quantities that are common to the definition of all occurrences of stair flights.',.QTO_TYPEDRIVENOVERRIDE.,'IfcStairFlight,IfcStairFlightType',(#5167,#5168,#5169)); -#5167=IFCSIMPLEPROPERTYTEMPLATE('1wJmC8us9ClvOxleY1Zv7l',$,'Length','The length of the object.\X2\000A000A\X0\Measured along the walking line.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5168=IFCSIMPLEPROPERTYTEMPLATE('3u13mdEPbBkxPwpmPtXhYS',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5169=IFCSIMPLEPROPERTYTEMPLATE('3vxEAzMgT8C8qv9Av0Wr23',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the stair flight. Openings and recesses are taken into account by subtraction, projections by addition.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5170=IFCPROPERTYSETTEMPLATE('3TJ1NiBXHEQBG4j9Ar2Fl7',$,'Qto_SurfaceFeatureBaseQuantities','Base quantities for Surface Features.',.QTO_OCCURRENCEDRIVEN.,'IfcSurfaceFeature',(#5171,#5172)); -#5171=IFCSIMPLEPROPERTYTEMPLATE('34ECEfF4X1igF6TQ_q1hNA',$,'Area','Calculated area for the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5172=IFCSIMPLEPROPERTYTEMPLATE('05BzuG90X28Aiyg2jGLFsT',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5173=IFCPROPERTYSETTEMPLATE('2PbdRc_yv2gwtcKgJ9v8Rh',$,'Qto_SwitchingDeviceBaseQuantities','Base quantities that are common to the definition of all occurrences of switching device.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice,IfcSwitchingDeviceType',(#5174)); -#5174=IFCSIMPLEPROPERTYTEMPLATE('2Cv4QbhC93HgAaUQJlBFgc',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5175=IFCPROPERTYSETTEMPLATE('13IpaV9hL4R94nsveVp5MK',$,'Qto_TankBaseQuantities','Base quantities that are common to the definition of all types of tanks.',.QTO_TYPEDRIVENOVERRIDE.,'IfcTank,IfcTankType',(#5176,#5177,#5178)); -#5176=IFCSIMPLEPROPERTYTEMPLATE('0OYQxNdBbAg9pXsAWE5oD4',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5177=IFCSIMPLEPROPERTYTEMPLATE('1zHY2hqML0w8Dp4mZNdCk8',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the element, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5178=IFCSIMPLEPROPERTYTEMPLATE('0SA7HDTWX3G8CDRW_qJjAO',$,'TotalSurfaceArea','Total surface area of the element.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5179=IFCPROPERTYSETTEMPLATE('1wr2urGaj4awgCcymuaD_1',$,'Qto_TransformerBaseQuantities','Base quantities that are common to the definition of all occurrences of transformer.',.QTO_TYPEDRIVENOVERRIDE.,'IfcTransformer,IfcTransformerType',(#5180)); -#5180=IFCSIMPLEPROPERTYTEMPLATE('3b$dfWlE5EcP5_Ro4AYta1',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5181=IFCPROPERTYSETTEMPLATE('0or3PJwtLB_AtaLEuF3tuV',$,'Qto_TubeBundleBaseQuantities','Base quantities that are common to the definition of all types of tube bundles.',.QTO_TYPEDRIVENOVERRIDE.,'IfcTubeBundle,IfcTubeBundleType',(#5182,#5183)); -#5182=IFCSIMPLEPROPERTYTEMPLATE('2bKpu8Xyv5geIrG0Y5p$3Z',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5183=IFCSIMPLEPROPERTYTEMPLATE('2ZXX6xkM9D4Q4svvK3NGGz',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the element, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5184=IFCPROPERTYSETTEMPLATE('373wpFtALEEQbGELp7914t',$,'Qto_UnitaryControlElementBaseQuantities','Base quantities that are common to the definition of all occurrences of unitary control element.',.QTO_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement,IfcUnitaryControlElementType',(#5185)); -#5185=IFCSIMPLEPROPERTYTEMPLATE('2wlliyTCr8Mhmtyxva4$J$',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5186=IFCPROPERTYSETTEMPLATE('2YvhplFkP6B9DJmpLwlWeg',$,'Qto_UnitaryEquipmentBaseQuantities','Base quantities that are common to the definition of all types of unitary equipment.',.QTO_TYPEDRIVENOVERRIDE.,'IfcUnitaryEquipment,IfcUnitaryEquipmentType',(#5187)); -#5187=IFCSIMPLEPROPERTYTEMPLATE('0DN9nUmpz1De3JTgAem4nE',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5188=IFCPROPERTYSETTEMPLATE('2341itr3P25uK5YqSLvQou',$,'Qto_ValveBaseQuantities','Base quantities that are common to the definition of all types of valves.',.QTO_TYPEDRIVENOVERRIDE.,'IfcValve,IfcValveType',(#5189)); -#5189=IFCSIMPLEPROPERTYTEMPLATE('0M$wWMxk953fKH1M9IsIxb',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5190=IFCPROPERTYSETTEMPLATE('26VG4bywb5geWqnU3QHEoI',$,'Qto_VehicleBaseQuantities','Quantities for vehicles',.QTO_TYPEDRIVENOVERRIDE.,'IfcVehicle/ROLLINGSTOCK,IfcVehicle/VEHICLEAIR,IfcVehicle/VEHICLEMARINE,IfcVehicle/VEHICLE,IfcVehicle/VEHICLETRACKED,IfcVehicleType/ROLLINGSTOCK,IfcVehicleType/VEHICLEAIR,IfcVehicleType/VEHICLEMARINE,IfcVehicleType/VEHICLE,IfcVehicleType/VEHICLETRACKED',(#5191,#5192,#5193)); -#5191=IFCSIMPLEPROPERTYTEMPLATE('2dqKHeXBj0JwXlGPh_DFHP',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5192=IFCSIMPLEPROPERTYTEMPLATE('1U_O0LWl9AVfyiqqPHl8HO',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5193=IFCSIMPLEPROPERTYTEMPLATE('339ZIFL8nFcwlJBZuGt9Ds',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5194=IFCPROPERTYSETTEMPLATE('1_qrNR3CvB7vXb4QE5mNGk',$,'Qto_VibrationIsolatorBaseQuantities','Base quantities that are common to the definition of all types of vibration isolators.',.QTO_TYPEDRIVENOVERRIDE.,'IfcVibrationIsolator,IfcVibrationIsolatorType',(#5195)); -#5195=IFCSIMPLEPROPERTYTEMPLATE('2B2rzau0PARvg7qfzlzGIU',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5196=IFCPROPERTYSETTEMPLATE('0a5nlSz4D83A5sUo$Llfru',$,'Qto_VolumetricStratumBaseQuantities','Quantity measures associated to volumetric stratum such as in a geotechnical model. Uncertainty is documented in Pset_Uncertainty.',.QTO_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum',(#5197,#5198,#5199,#5200)); -#5197=IFCSIMPLEPROPERTYTEMPLATE('286BHJSLPDjR0Ap0Jks0Ov',$,'Area','Calculated area for the object.\X2\000A000A\X0\Actual area of upper surface of shape.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5198=IFCSIMPLEPROPERTYTEMPLATE('1smFKn3Rj3I90dC9Ry58gt',$,'Mass','Mass represented, if lower surface of stratum known.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5199=IFCSIMPLEPROPERTYTEMPLATE('2jGGbIVy19nOvOjP1SRi_z',$,'PlanArea','Projected plan area of upper surface of model.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5200=IFCSIMPLEPROPERTYTEMPLATE('1fXxot$pLBMv4H1YO9zpuU',$,'Volume','Volume of the element.\X2\000A000A\X0\Volume represented, if lower surface of stratum known.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5201=IFCPROPERTYSETTEMPLATE('3bCU5_uufADQ$PBK65hkqM',$,'Qto_WallBaseQuantities','Base quantities that are common to the definition of all occurrences of walls.',.QTO_TYPEDRIVENOVERRIDE.,'IfcWall,IfcWallType',(#5202,#5203,#5204,#5205,#5206,#5207,#5208,#5209,#5210,#5211,#5212)); -#5202=IFCSIMPLEPROPERTYTEMPLATE('0rm9VV3ajBiP0ulkW34NIT',$,'Length','The length of the object.\X2\000A000A\X0\Along center line (even if different to the wall path).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5203=IFCSIMPLEPROPERTYTEMPLATE('3$qNetIeTBsBhO59ABC0jO',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\Measured perpendicular to the wall path. It should only be provided, if it is constant along the wall path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5204=IFCSIMPLEPROPERTYTEMPLATE('0aGNoGUX54rwljtqEenPSz',$,'Height','Characteristic height\X2\000A000A\X0\Total nominal height of the wall. It should only be provided, if it is constant along the wall path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5205=IFCSIMPLEPROPERTYTEMPLATE('2fkAxpbdvCJ9F7TJJdMmw8',$,'GrossFootPrintArea',$,.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5206=IFCSIMPLEPROPERTYTEMPLATE('2JhCtIiWT5Yw9uncnpjKoB',$,'NetFootPrintArea',$,.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5207=IFCSIMPLEPROPERTYTEMPLATE('0mV4G6GkD1TA4xzVSStegj',$,'GrossSideArea','Area of the wall as viewed by an elevation view of the middle plane of the wall. It does not take into account any wall modifications (such as openings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5208=IFCSIMPLEPROPERTYTEMPLATE('10p$HtGD9CffG40XCt670Q',$,'NetSideArea','Area of the object as viewed by an elevation view of the middle plane of the object. It does take into account all object modifications (such as openings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); -#5209=IFCSIMPLEPROPERTYTEMPLATE('0XaSJ9NN5ECQYJ4WoPaoQo',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5210=IFCSIMPLEPROPERTYTEMPLATE('2UeLeY2_976e9VUjS$EAd4',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Volume of the wall, after subtracting the openings and after considering the connection geometry.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); -#5211=IFCSIMPLEPROPERTYTEMPLATE('1XSNA2cf9EfebDyMIamjTC',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5212=IFCSIMPLEPROPERTYTEMPLATE('0BOsDBabb7kBMDKnY$1OhW',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5213=IFCPROPERTYSETTEMPLATE('30rEnkpy1FdfTnP0HO4ZVy',$,'Qto_WasteTerminalBaseQuantities','Base quantities that are common to the definition of all occurrences of waste terminal.',.QTO_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal,IfcWasteTerminalType',(#5214)); -#5214=IFCSIMPLEPROPERTYTEMPLATE('3RS5UyHo14Vh45JAYQnsrT',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); -#5215=IFCPROPERTYSETTEMPLATE('1YDhfKnsP5kexG88Ag_0OO',$,'Qto_WindowBaseQuantities','Base quantities that are common to the definition of all occurrences of windows.',.QTO_TYPEDRIVENOVERRIDE.,'IfcWindow,IfcWindowType',(#5216,#5217,#5218,#5219)); -#5216=IFCSIMPLEPROPERTYTEMPLATE('1s3i5dzZ976O09CuN4YqLx',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\Total outer width of the window lining. It should only be provided, if it is a rectangular window.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5217=IFCSIMPLEPROPERTYTEMPLATE('1iqg14I8L6GfGdcm7OJR6h',$,'Height','Characteristic height\X2\000A000A\X0\Total outer height of the window lining. It should only be provided, if it is a rectangular window.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5218=IFCSIMPLEPROPERTYTEMPLATE('2LaPVPY1rCeQUbfTt7wvmG',$,'Perimeter','Perimeter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); -#5219=IFCSIMPLEPROPERTYTEMPLATE('2kQTdm53f2nAc3UYi_lpSI',$,'Area','Calculated area for the object.\X2\000A000A\X0\Total area of the outer lining of the window.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#2180=IFCSIMPLEPROPERTYTEMPLATE('3Fr3rSIb994O1I8PxBMyKG',$,'Style','Description of the furniture style.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2181=IFCSIMPLEPROPERTYTEMPLATE('2susfy7hj6uxQwfw6jYID$',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A000A\X0\The nominal height of the furniture of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2182=IFCSIMPLEPROPERTYTEMPLATE('2dZrU8XbTAKuG6FXd5Qsaq',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2183=IFCSIMPLEPROPERTYTEMPLATE('0XVLg3_GT7$PhSBKUDJW68',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2184=IFCSIMPLEPROPERTYTEMPLATE('3Q6hrwZBzFbxp2sgLA5FCb',$,'MainColour','The main colour of the furniture of this type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2185=IFCSIMPLEPROPERTYTEMPLATE('1VljsszWz7xOmMLdUP3Lai',$,'IsBuiltIn','Indicates whether the furniture type is intended to be ''built in'' i.e. physically attached to a building or facility (= TRUE) or not i.e. Loose and movable (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2186=IFCPROPERTYSETTEMPLATE('2VpjUyNSvFHvtuHCYcjeqo',$,'Pset_FurnitureTypeDesk','A set of specific properties for furniture type desk. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Desk',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurniture/DESK,IfcFurnitureType/DESK',(#2187)); +#2187=IFCSIMPLEPROPERTYTEMPLATE('3DDBTCY1TFr8dSirinufaE',$,'WorksurfaceArea','The value of the work surface area of the desk.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#2188=IFCPROPERTYSETTEMPLATE('1FaBnjQfHEDAOpLK0keVrr',$,'Pset_FurnitureTypeFileCabinet','A set of specific properties for furniture type file cabinet HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FileCabinet',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurniture/FILECABINET,IfcFurnitureType/FILECABINET',(#2189)); +#2189=IFCSIMPLEPROPERTYTEMPLATE('2TLwu5f992De8vphxlFczs',$,'WithLock','Indicates whether the file cabinet is lockable (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2190=IFCPROPERTYSETTEMPLATE('0Gg$KIC$14Kw7Jm5NfesVv',$,'Pset_FurnitureTypeTable','HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Table',.PSET_TYPEDRIVENOVERRIDE.,'IfcFurniture/TABLE,IfcFurnitureType/TABLE',(#2191,#2192)); +#2191=IFCSIMPLEPROPERTYTEMPLATE('0Fz1CF1MDDhxO3dRNA$zIp',$,'WorksurfaceArea','The value of the work surface area of the desk.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#2192=IFCSIMPLEPROPERTYTEMPLATE('2dCqY8syzAo8HFtKg1muKw',$,'NumberOfChairs','Maximum number of chairs that can fit with the table for normal use.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2193=IFCPROPERTYSETTEMPLATE('181qm7DnHB$vMP$nytaz11',$,'Pset_GateHeadCommon','Properties common to the definition of all occurrences of IfcMarinePart with the predefined type set to GATEHEAD.',.PSET_OCCURRENCEDRIVEN.,'IfcMarinePart/GATEHEAD',(#2194)); +#2194=IFCSIMPLEPROPERTYTEMPLATE('0h6InSAPj9i9OBS6a$DAEN',$,'StructuralType','Structural type of the object',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2195=IFCPROPERTYSETTEMPLATE('2AhQJgEmDEku_hIh_jBEFv',$,'Pset_GeotechnicalAssemblyCommon','Properties describing the characteristics of any geotechnical model. A Status of "New" should not be associated to a IfcGeotechnicalAssembly or IfcGeotechnicalStratum, as other entities are used for earthworks and courses.',.PSET_OCCURRENCEDRIVEN.,'IfcGeotechnicalAssembly',(#2196,#2197,#2198,#2200)); +#2196=IFCSIMPLEPROPERTYTEMPLATE('3b$jFeHmz6AgUmX66CPjdX',$,'Limitations','Limitations on usage.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2197=IFCSIMPLEPROPERTYTEMPLATE('32_bNLJb91khJWP12MPyH5',$,'Methodology','Methodology used to prepare the contents of the geotechnical assembly.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2198=IFCSIMPLEPROPERTYTEMPLATE('3XvQ5nKInFnRG7tMI7fjQV',$,'BoreHolePurpose','Purpose for which the borehole, section or volumetric model was created. (EU Inspire, boreholeML)',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2199,$,$,$,.READWRITE.); +#2199=IFCPROPERTYENUMERATION('PEnum_StrataAssemblyPurpose',(IFCLABEL('DEPOSIT'),IFCLABEL('ENVIRONMENTAL'),IFCLABEL('FEEDSTOCK'),IFCLABEL('GEOLOGICAL'),IFCLABEL('GEOTHERMAL'),IFCLABEL('HYDROCARBON'),IFCLABEL('HYDROGEOLOGICAL'),IFCLABEL('MINERAL'),IFCLABEL('PEDOLOGICAL'),IFCLABEL('SITE_INVESTIGATION'),IFCLABEL('STORAGE'),IFCLABEL('NOTKNOWN'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); +#2200=IFCSIMPLEPROPERTYTEMPLATE('2HhT2j56f6rulsg4DPBjpH',$,'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',$,#2201,$,$,$,.READWRITE.); +#2201=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2202=IFCPROPERTYSETTEMPLATE('2ur3iqGjXDV98qE_vkXimA',$,'Pset_GeotechnicalStratumCommon','Properties describing the characteristics of any solid, water or void stratum. A status of "New" should not be associated to a IfcGeotechnicalAssembly or IfcSolidStratum, as other entities are used for earthworks and courses.',.PSET_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum',(#2203,#2204,#2205,#2206,#2207,#2209)); +#2203=IFCSIMPLEPROPERTYTEMPLATE('20DJQZdM5FeeYHNDqqNIAf',$,'StratumColour','Stratum colour',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2204=IFCSIMPLEPROPERTYTEMPLATE('0vsn4awz92DvYIPHoA84DP',$,'IsTopographic','Is the stratum ever topmost and so a visible topographic feature',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); +#2205=IFCSIMPLEPROPERTYTEMPLATE('3GQwodkN9Ah9v_qUKYbCIX',$,'PiezometricHead','Pressure head of water content.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2206=IFCSIMPLEPROPERTYTEMPLATE('2trqF5OO1DRBlvHNsw9duV',$,'PiezometricPressure','Pressure of water content.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2207=IFCSIMPLEPROPERTYTEMPLATE('0jEgY1WpX5xxoFlOviBfAl',$,'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',$,#2208,$,$,$,.READWRITE.); +#2208=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2209=IFCSIMPLEPROPERTYTEMPLATE('1f4D5Zr6vFTxD9ORWgtrNy',$,'Texture','Stratum texture',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2210=IFCPROPERTYSETTEMPLATE('0xEjXjeD91mBevrWkb6eQv',$,'Pset_HeatExchangerTypeCommon','Heat exchanger type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcHeatExchanger,IfcHeatExchangerType',(#2211,#2212,#2214)); +#2211=IFCSIMPLEPROPERTYTEMPLATE('1I$7Dwq0fATB4BIU3jrhvk',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2212=IFCSIMPLEPROPERTYTEMPLATE('3fKcPs7bDBg93ewr0pv4H9',$,'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',$,#2213,$,$,$,.READWRITE.); +#2213=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2214=IFCSIMPLEPROPERTYTEMPLATE('2TJOtc7vT9uBxX4xoyPPNo',$,'FlowArrangement','Defines the basic flow arrangements for the heat exchanger or cooler tower:COUNTERFLOW: Air and water flow enter in different directions.\X2\000A\X0\CROSSFLOW: Air and water flow are perpendicular.\X2\000A\X0\PARALLELFLOW: Air and water flow enter in same directions.\X2\000A\X0\MULTIPASS: Multipass flow heat exchanger arrangement. \X2\000A\X0\OTHER: Other type of heat exchanger flow arrangement not defined above.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2215,$,$,$,.READWRITE.); +#2215=IFCPROPERTYENUMERATION('PEnum_HeatExchangerArrangement',(IFCLABEL('COUNTERFLOW'),IFCLABEL('CROSSFLOW'),IFCLABEL('MULTIPASS'),IFCLABEL('PARALLELFLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2216=IFCPROPERTYSETTEMPLATE('2B9cJ9XN9CTvn_TX8ADfUU',$,'Pset_HeatExchangerTypePlate','Plate heat exchanger type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcHeatExchanger/PLATE,IfcHeatExchangerType/PLATE',(#2217)); +#2217=IFCSIMPLEPROPERTYTEMPLATE('0qt$4ZHU52jxGg9ifneMf7',$,'NumberOfPlates','Number of plates used by the plate heat exchanger.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2218=IFCPROPERTYSETTEMPLATE('2LUy$n_NX4Q9znjTbIWUNp',$,'Pset_HumidifierPHistory','Humidifier performance history attributes.\X2\000A\X0\Sound attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead.',.PSET_PERFORMANCEDRIVEN.,'IfcHumidifier',(#2219,#2220)); +#2219=IFCSIMPLEPROPERTYTEMPLATE('1ZJQcmnrP4D9Ia2z37wSx6',$,'AtmosphericPressure','Ambient atmospheric pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2220=IFCSIMPLEPROPERTYTEMPLATE('1z2vHp3NTD7AqYcOEccsg7',$,'SaturationEfficiency','Saturation efficiency: Ratio of leaving air absolute humidity to the maximum absolute humidity.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2221=IFCPROPERTYSETTEMPLATE('2XJV_YwMHFPPOMmilbgn9U',$,'Pset_HumidifierTypeCommon','Humidifier type common attributes.\X2\000A\X0\WaterProperties attribute renamed to WaterRequirement and unit type modified in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcHumidifier,IfcHumidifierType',(#2222,#2223,#2225,#2227,#2228,#2229,#2230,#2232,#2233,#2234)); +#2222=IFCSIMPLEPROPERTYTEMPLATE('0X0nl8wvb1_hivFBAC5McM',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2223=IFCSIMPLEPROPERTYTEMPLATE('3qF3sqGRj3pu5vls8DvUNx',$,'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',$,#2224,$,$,$,.READWRITE.); +#2224=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2225=IFCSIMPLEPROPERTYTEMPLATE('1cVwHyeQrB3xAdCdEkwNnF',$,'HumidifierApplication','Humidifier application.Fixed: Humidifier installed in a ducted flow distribution system.\X2\000A\X0\Portable: Humidifier is not installed in a ducted flow distribution system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2226,$,$,$,.READWRITE.); +#2226=IFCPROPERTYENUMERATION('PEnum_HumidifierApplication',(IFCLABEL('FIXED'),IFCLABEL('PORTABLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2227=IFCSIMPLEPROPERTYTEMPLATE('1mtsRjRXr1GP92JOjTLkVm',$,'Weight','Total weight of object',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#2228=IFCSIMPLEPROPERTYTEMPLATE('1YBFG1OzXEBfu9j0HlgkP2',$,'NominalMoistureGain','Nominal rate of water vapor added into the airstream.',.P_SINGLEVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2229=IFCSIMPLEPROPERTYTEMPLATE('2s65wfVs99$R_aNZkDYZ8N',$,'NominalAirFlowRate','Nominal air flow rate.\X2\000A000A\X0\Nominal rate of air flow into which water vapor is added.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2230=IFCSIMPLEPROPERTYTEMPLATE('1tgckiHmX5mekcR4_1NVmv',$,'InternalControl','Internal modulation control.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2231,$,$,$,.READWRITE.); +#2231=IFCPROPERTYENUMERATION('PEnum_HumidifierInternalControl',(IFCLABEL('MODULATING'),IFCLABEL('NONE'),IFCLABEL('ONOFF'),IFCLABEL('STEPPED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2232=IFCSIMPLEPROPERTYTEMPLATE('2uksc3ufr1CBnQ0FbK73sO',$,'WaterRequirement','Make-up water requirement.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2233=IFCSIMPLEPROPERTYTEMPLATE('0wj9voNh17sg30JmJvfAG2',$,'SaturationEfficiencyCurve','Saturation efficiency as a function of the air flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); +#2234=IFCSIMPLEPROPERTYTEMPLATE('3hthgdBIj6Qx9vSZ_pj$8z',$,'AirPressureDropCurve','Air pressure drop as a function of air flow rate.\X2\000A000A\X0\Air pressure drop versus air-flow rate.',.P_TABLEVALUE.,'IfcVolumetricFlowRateMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2235=IFCPROPERTYSETTEMPLATE('3oEqMWIWXBpR8Ao416NxAF',$,'Pset_ImpactProtectionDeviceOccurrenceBumper','Properties common to all occurrences of IfcImpactProtectionDevice with PredefinedType set to BUMPER.',.PSET_OCCURRENCEDRIVEN.,'IfcImpactProtectionDevice/BUMPER',(#2236,#2237,#2238)); +#2236=IFCSIMPLEPROPERTYTEMPLATE('3pWOvsM5j0SQnYvLkxd8cR',$,'BrakingLength','Length of the braking distance as a design parameter of the bumper occurrence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2237=IFCSIMPLEPROPERTYTEMPLATE('3Swel65VT6iQ72SH1FafVc',$,'IsRemovableBumper','Indicates if the bumper is removable or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2238=IFCSIMPLEPROPERTYTEMPLATE('3GkGvHi8TFDut488kSSpxp',$,'BumperOrientation','Direction in which the bumper is aligned, e.g. same direction as increasing stationing values or opposite.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2239,$,$,$,.READWRITE.); +#2239=IFCPROPERTYENUMERATION('PEnum_BumperOrientation',(IFCLABEL('OPPOSITETOSTATIONDIRECTION'),IFCLABEL('STATIONDIRECTION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2240=IFCPROPERTYSETTEMPLATE('1zuTmPrzj2vwm05DJcJXw1',$,'Pset_ImpactProtectionDeviceTypeBumper','Properties common to all occurrences and types of IfcImpactProtectionDevice with PredefinedType set to BUMPER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcImpactProtectionDevice/BUMPER,IfcImpactProtectionDeviceType/BUMPER',(#2241,#2242,#2243)); +#2241=IFCSIMPLEPROPERTYTEMPLATE('0CJvxlZY1BPuRe4ebVIfzo',$,'IsAbsorbingEnergy','Indicates whether the bumper absorbs energy or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2242=IFCSIMPLEPROPERTYTEMPLATE('2XlWeslvz7weTfqxiKoa0M',$,'MaximumLoadRetention','Maximum possible impact load retention.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#2243=IFCSIMPLEPROPERTYTEMPLATE('0zcpvWEdP4keRq41bBx0Qj',$,'EnergyAbsorption','Energy absorption capacity of the element.',.P_SINGLEVALUE.,'IfcEnergyMeasure',$,$,$,$,$,.READWRITE.); +#2244=IFCPROPERTYSETTEMPLATE('2VgHIiJFn6YeiWEUy2Fpwp',$,'Pset_InstallationOccurrence','Properties defining installation information for occurrences of element, asset or system.',.PSET_OCCURRENCEDRIVEN.,'IfcAsset,IfcElement,IfcSystem',(#2245,#2246,#2247)); +#2245=IFCSIMPLEPROPERTYTEMPLATE('1QiYaSW3D6Z9NJhiTo_jAQ',$,'InstallationDate','Date on which the element is installed.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#2246=IFCSIMPLEPROPERTYTEMPLATE('1sxstu81P7ShAxlAlBqndq',$,'AcceptanceDate','Date on which the element is accepted by the manager or administrator.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#2247=IFCSIMPLEPROPERTYTEMPLATE('3YhMMj53nCsOYl88GxJ47Q',$,'PutIntoOperationDate','Date on which the element is put into operation.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#2248=IFCPROPERTYSETTEMPLATE('3Buju5QeD6vA5Z1By2DO_9',$,'Pset_InterceptorTypeCommon','Common properties for interceptors.',.PSET_TYPEDRIVENOVERRIDE.,'IfcInterceptor,IfcInterceptorType',(#2249,#2250,#2252,#2253,#2254,#2255,#2256,#2257,#2258,#2259)); +#2249=IFCSIMPLEPROPERTYTEMPLATE('3zWofP$rj2VAqalZKvCogf',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2250=IFCSIMPLEPROPERTYTEMPLATE('1b6XUTMYX0iuUdcsn1wJJS',$,'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',$,#2251,$,$,$,.READWRITE.); +#2251=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2252=IFCSIMPLEPROPERTYTEMPLATE('0gbN6n6bn7jOhiIuUfpnb9',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2253=IFCSIMPLEPROPERTYTEMPLATE('1uMNsJKlbCRwkAedi2oHth',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2254=IFCSIMPLEPROPERTYTEMPLATE('3IgvzayO151fxZbVH2kL51',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2255=IFCSIMPLEPROPERTYTEMPLATE('1CR7hQ8ZT8KPtifW01RKTP',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2256=IFCSIMPLEPROPERTYTEMPLATE('3U2idoj8D0dxHCHBIktzbN',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2257=IFCSIMPLEPROPERTYTEMPLATE('2YaFJXS0T489t$hHczLblz',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2258=IFCSIMPLEPROPERTYTEMPLATE('3SVrTRnrvDax887T4j61Kq',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2259=IFCSIMPLEPROPERTYTEMPLATE('2HXKYgUwX9qeM0ZwLaMdNz',$,'VentilatingPipeSize','Size of the ventilating pipe(s).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2260=IFCPROPERTYSETTEMPLATE('0bWKSBsTf46gPF5ZD3vs8T',$,'Pset_IpNetworkEquipmentPHistory','Properties defining performance information for IP network equipment.',.PSET_PERFORMANCEDRIVEN.,'IfcCommunicationsAppliance/IPNETWORKEQUIPMENT',(#2261)); +#2261=IFCSIMPLEPROPERTYTEMPLATE('1UtaowXvn0zA086iJd_M3h',$,'NumberOfPackets','Indicates the number of packets of the IP network equipment.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2262=IFCPROPERTYSETTEMPLATE('1$Gt0FPBH6fBpKwQi6ktDT',$,'Pset_JettyCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to JETTY.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/JETTY',(#2263,#2264,#2265,#2267)); +#2263=IFCSIMPLEPROPERTYTEMPLATE('1pTxVttt54bvl52_61eV8p',$,'StructuralType','Structural type of the object',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2264=IFCSIMPLEPROPERTYTEMPLATE('1kawwMfQD6jhvgt6j$ONeM',$,'BentSpacing','Bent (upright) spacing',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2265=IFCSIMPLEPROPERTYTEMPLATE('3f4_9JZxTAd9Gs8QjWq2NZ',$,'PierSectionType','Whether the structure presents a solid/closed barrier to the passage of water or is open.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2266,$,$,$,.READWRITE.); +#2266=IFCPROPERTYENUMERATION('PEnum_SectionType',(IFCLABEL('CLOSED'),IFCLABEL('OPEN')),$); +#2267=IFCSIMPLEPROPERTYTEMPLATE('1xkLzVoNz9Xu0zYQQcDGd9',$,'Elevation','Elevation of the entity',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2268=IFCPROPERTYSETTEMPLATE('1kem7nkNj688ET754iMkNk',$,'Pset_JettyDesignCriteria','Properties common to the definition of design criteria of all occurrences of IfcMarineFacility with the predefined type set to JETTY.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/JETTY',(#2269,#2270,#2271,#2272,#2273,#2274,#2275,#2276,#2277)); +#2269=IFCSIMPLEPROPERTYTEMPLATE('09obYAQU9BUAMYSe0nxnxN',$,'HighWaterLevel','High water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2270=IFCSIMPLEPROPERTYTEMPLATE('1$h2mt2w54HQDxqOAeGCaE',$,'LowWaterLevel','Low water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2271=IFCSIMPLEPROPERTYTEMPLATE('0gl3uZO_184A4grNR0veHQ',$,'ExtremeHighWaterLevel','Extreme high water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2272=IFCSIMPLEPROPERTYTEMPLATE('20J4QnowP7ERBQm60UYN8X',$,'ExtremeLowWaterLevel','Extreme low water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2273=IFCSIMPLEPROPERTYTEMPLATE('2zqlwC0WjARwLd3kLZ9gkB',$,'ShipLoading','Ship loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#2274=IFCSIMPLEPROPERTYTEMPLATE('2yUiz0F_H6eA10dK_IzvLg',$,'WaveLoading','Wave loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#2275=IFCSIMPLEPROPERTYTEMPLATE('1w$cf0D915yBdGMMLnzPJM',$,'FlowLoading','Flow loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#2276=IFCSIMPLEPROPERTYTEMPLATE('1qAk4l5qv84fEVQLPw5p5i',$,'UniformlyDistributedLoad','Uniformly Distributed Load',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#2277=IFCSIMPLEPROPERTYTEMPLATE('0tSWpW$qvA3w1kffbLdFhi',$,'EquipmentLoading','Loading from equipment',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#2278=IFCPROPERTYSETTEMPLATE('2cjlyZdDnD5xxG4$AbPPw4',$,'Pset_JunctionBoxTypeCommon','A junction box is an enclosure within which cables are connected.History: New in IFC4',.PSET_TYPEDRIVENOVERRIDE.,'IfcJunctionBox,IfcJunctionBoxType',(#2279,#2280,#2282,#2283,#2284,#2286,#2288,#2290,#2291,#2292,#2293,#2294)); +#2279=IFCSIMPLEPROPERTYTEMPLATE('2wqNUH$OrBuBAv94FFjzBX',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2280=IFCSIMPLEPROPERTYTEMPLATE('2_NqQ3HeP7EhLExCyanCCF',$,'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',$,#2281,$,$,$,.READWRITE.); +#2281=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2282=IFCSIMPLEPROPERTYTEMPLATE('05Mu1qNSPBJQENTHcaN2Sg',$,'NumberOfGangs','Number of gangs in the object.\X2\000A000A\X0\Number of slots available for switches/outlets (most commonly 1, 2, 3, or 4).',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2283=IFCSIMPLEPROPERTYTEMPLATE('3QjkNCFsf9ze47EFx8ntkg',$,'ClearDepth','The clear depth.\X2\000A000A\X0\It indicates the unobstructed depth available for cable inclusion within the junction box.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2284=IFCSIMPLEPROPERTYTEMPLATE('01Oyz1BUD9cxPY13XD9hfp',$,'ShapeType','Shape of the junction box.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2285,$,$,$,.READWRITE.); +#2285=IFCPROPERTYENUMERATION('PEnum_JunctionBoxShapeType',(IFCLABEL('RECTANGULAR'),IFCLABEL('ROUND'),IFCLABEL('SLOT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2286=IFCSIMPLEPROPERTYTEMPLATE('1s78WT9eL11hM_e6pAA2NA',$,'PlacingType','Location at which the type of junction box can be located.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2287,$,$,$,.READWRITE.); +#2287=IFCPROPERTYENUMERATION('PEnum_JunctionBoxPlacingType',(IFCLABEL('CEILING'),IFCLABEL('FLOOR'),IFCLABEL('WALL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2288=IFCSIMPLEPROPERTYTEMPLATE('1QooHklTr1UQqdSjg1TiWy',$,'JunctionBoxMountingType','Method of mounting to be adopted for the type of junction box.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2289,$,$,$,.READWRITE.); +#2289=IFCPROPERTYENUMERATION('PEnum_JunctionBoxMountingType',(IFCLABEL('CUT_IN'),IFCLABEL('FACENAIL'),IFCLABEL('SIDENAIL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2290=IFCSIMPLEPROPERTYTEMPLATE('3FaqMKtaT4SAfzl1y$BO6p',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2291=IFCSIMPLEPROPERTYTEMPLATE('0t5BjVMpn7Lhai5o1JaqyH',$,'IP_Code','IP Code, the International Protection Marking, IEC 60529), classifies and rates the degree of protection provided against intrusion.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2292=IFCSIMPLEPROPERTYTEMPLATE('0vW1MKGN102xhUTOIbomjr',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2293=IFCSIMPLEPROPERTYTEMPLATE('0cn166ILDBtfSpmF_En3Q9',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2294=IFCSIMPLEPROPERTYTEMPLATE('3JgxxZTlTBcOe$0SVPavno',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2295=IFCPROPERTYSETTEMPLATE('0HIiG1YLzD2wcQJNV1dJ0C',$,'Pset_JunctionBoxTypeData','The property set can be used by the predefined type DATA of IfcJunctionBox.',.PSET_TYPEDRIVENOVERRIDE.,'IfcJunctionBox/DATA,IfcJunctionBoxType/DATA',(#2296)); +#2296=IFCSIMPLEPROPERTYTEMPLATE('1lr2xlPb1EP8SoYkyfxjqg',$,'DataConnectionType','Indicates the data connection type of the junction box e.g. copper pair, fiber or others.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2297,$,$,$,.READWRITE.); +#2297=IFCPROPERTYENUMERATION('PEnum_DataConnectionType',(IFCLABEL('COPPER'),IFCLABEL('FIBER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2298=IFCPROPERTYSETTEMPLATE('2VWJ7CBaT9iQySTzGhh3bF',$,'Pset_KerbCommon','Properties for a kerb.',.PSET_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#2299,#2300,#2301)); +#2299=IFCSIMPLEPROPERTYTEMPLATE('2M0sYMfaH2YQSBmILu$7BY',$,'CombinedKerbGutter','Indicating the use of a combined kerb and gutter.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2300=IFCSIMPLEPROPERTYTEMPLATE('0lQ_3OjUDD08pFwCD1RjuE',$,'Upstand','The height difference between the two separated surfaces.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2301=IFCSIMPLEPROPERTYTEMPLATE('3FBeMj0BP6c9NcsKWy8F3C',$,'Mountable','Specifies whether the kerb can be readily climbed by a vehicle or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2302=IFCPROPERTYSETTEMPLATE('31Ca1q3w9EGvRnHZrGeub5',$,'Pset_KerbStone','Properties for kerb stones.',.PSET_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#2303,#2304,#2305,#2306,#2307)); +#2303=IFCSIMPLEPROPERTYTEMPLATE('3WxhnPBN16RhZcSmrYEqrs',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2304=IFCSIMPLEPROPERTYTEMPLATE('2YqooBuXX1ZB2kNtPRi4Db',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2305=IFCSIMPLEPROPERTYTEMPLATE('2OMx59onj6XBMd8p2dKQOv',$,'StoneFinishes','Eg. ''Polished'', ''Bush Hammered'', ''Split'', ''Sawn'', ''Flamed''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2306=IFCSIMPLEPROPERTYTEMPLATE('0HWpRUTPvFUvL8IEG1UcdB',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2307=IFCSIMPLEPROPERTYTEMPLATE('3lDAF9pVr14Q6zMd$9xv9Y',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2308=IFCPROPERTYSETTEMPLATE('3uXrYmtWn1LuOjtronheiq',$,'Pset_LampTypeCommon','A lamp is a component within a light fixture that is designed to emit light.History: Name changed from Pset_LampEmitterTypeCommon in IFC 2x3.',.PSET_TYPEDRIVENOVERRIDE.,'IfcLamp,IfcLampType',(#2309,#2310,#2312,#2313,#2314,#2315,#2317,#2319,#2320,#2321,#2322)); +#2309=IFCSIMPLEPROPERTYTEMPLATE('1oKK37b3r09xN5QxM9yZ3X',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2310=IFCSIMPLEPROPERTYTEMPLATE('3xPaNySorBZOlsvB1128iU',$,'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',$,#2311,$,$,$,.READWRITE.); +#2311=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2312=IFCSIMPLEPROPERTYTEMPLATE('1K4am6fLz6eeVMTHw0JkZU',$,'ContributedLuminousFlux','Luminous flux is a photometric measure of radiant flux, i.e. the volume of light emitted from a light source. Luminous flux is measured either for the interior as a whole or for a part of the interior (partial luminous flux for a solid angle). All other photometric parameters are derivatives of luminous flux. Luminous flux is measured in lumens (lm). The luminous flux is given as a nominal value for each lamp.',.P_SINGLEVALUE.,'IfcLuminousFluxMeasure',$,$,$,$,$,.READWRITE.); +#2313=IFCSIMPLEPROPERTYTEMPLATE('3Xc5FhtYH92wCgReNgsJ7a',$,'LightEmitterNominalPower','Light emitter nominal power.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#2314=IFCSIMPLEPROPERTYTEMPLATE('3HB0hEMuf2_B4mET$hIK5X',$,'LampMaintenanceFactor','Non recoverable losses of luminous flux of a lamp due to lamp depreciation; i.e. the decreasing of light output of a luminaire due to aging and dirt.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2315=IFCSIMPLEPROPERTYTEMPLATE('1QiSe$dDf47Aq6tTZUhSbD',$,'LampBallastType','The type of ballast used to stabilise gas discharge by limiting the current during operation and to deliver the necessary striking voltage for starting. Ballasts are needed to operate Discharge Lamps such as Fluorescent, Compact Fluorescent, High-pressure Mercury, Metal Halide and High-pressure Sodium Lamps.\X2\000A\X0\Magnetic ballasts are chokes which limit the current passing through a lamp connected in series on the principle of self-induction. The resultant current and power are decisive for the efficient operation of the lamp. A specially designed ballast is required for every type of lamp to comply with lamp rating in terms of Luminous Flux, Color Appearance and service life. The two types of magnetic ballasts for fluorescent lamps are KVG Conventional (EC-A series) and VVG Low-loss ballasts (EC-B series). Low-loss ballasts have a higher efficiency, which means reduced ballast losses and a lower thermal load. Electronic ballasts are used to run fluorescent lamps at high frequencies (approx. 35 - 40 kHz).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2316,$,$,$,.READWRITE.); +#2316=IFCPROPERTYENUMERATION('PEnum_LampBallastType',(IFCLABEL('CONVENTIONAL'),IFCLABEL('ELECTRONIC'),IFCLABEL('LOWLOSS'),IFCLABEL('RESISTOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2317=IFCSIMPLEPROPERTYTEMPLATE('1tiksuwdTDNxtkv8hm4WHq',$,'LampCompensationType','Identifies the form of compensation used for power factor correction and radio suppression.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2318,$,$,$,.READWRITE.); +#2318=IFCPROPERTYENUMERATION('PEnum_LampCompensationType',(IFCLABEL('CAPACITIVE'),IFCLABEL('INDUCTIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2319=IFCSIMPLEPROPERTYTEMPLATE('3buvu9iuD5LOtnzX0Rs785',$,'ColourAppearance','In both the DIN and CIE standards, artificial light sources are classified in terms of their colour appearance. To the human eye they all appear to be white; the difference can only be detected by direct comparison. Visual performance is not directly affected by differences in colour appearance.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2320=IFCSIMPLEPROPERTYTEMPLATE('3YH2w6Hx176ADZ7n2w66Tf',$,'Spectrum','The spectrum of radiation describes its composition with regard to wavelength. Light, for example, as the portion of electromagnetic radiation that is visible to the human eye, is radiation with wavelengths in the range of approx. 380 to 780 nm (1 nm = 10 m). The corresponding range of colours varies from violet to indigo, blue, green, yellow, orange, and red. These colours form a continuous spectrum, in which the various spectral sectors merge into each other.',.P_TABLEVALUE.,'IfcNumericMeasure','IfcNumericMeasure',$,$,$,$,.READWRITE.); +#2321=IFCSIMPLEPROPERTYTEMPLATE('1O9bqnHmzBFOmLFzvKE2A2',$,'ColourTemperature','The colour temperature of any source of radiation is defined as the temperature (in Kelvin) of a black-body or Planckian radiator whose radiation has the same chromaticity as the source of radiation. Often the values are only approximate colour temperatures as the black-body radiator cannot emit radiation of every chromaticity value. The colour temperatures of the commonest artificial light sources range from less than 3000K (warm white) to 4000K (intermediate) and over 5000K (daylight).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2322=IFCSIMPLEPROPERTYTEMPLATE('1lqCTW4SnCMRmDAksBYDOS',$,'ColourRenderingIndex','The CRI indicates how well a light source renders eight standard colours compared to perfect reference lamp with the same colour temperature. The CRI scale ranges from 1 to 100, with 100 representing perfect rendering properties.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#2323=IFCPROPERTYSETTEMPLATE('3aci5SoQ1AZQxy7rTBNKMQ',$,'Pset_LandRegistration','Specifies the identity of land within a statutory registration system.NOTE The property LandTitleID is to be used in preference to deprecated attribute LandTitleNumber in IfcSite.',.PSET_OCCURRENCEDRIVEN.,'IfcSite',(#2324,#2325,#2326)); +#2324=IFCSIMPLEPROPERTYTEMPLATE('0Ew9Gkh4L1FRQojUxLfmBx',$,'LandID','Identification number assigned by the statutory registration authority to a land parcel.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2325=IFCSIMPLEPROPERTYTEMPLATE('1hOLWlLm912fP9B2WD94Su',$,'IsPermanentID','Indicates whether the identity assigned to the object is permanent (= TRUE) or temporary (=FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2326=IFCSIMPLEPROPERTYTEMPLATE('2xWOA0LP1AbeVBqTB5IjE9',$,'LandTitleID','Identification number assigned by the statutory registration authority to the title to a land parcel.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2327=IFCPROPERTYSETTEMPLATE('3w7E9sVtXF59C2u3cB3dxj',$,'Pset_LightFixtureTypeCommon','Common data for light fixtures.\X2\000A\X0\History: IFC4 - Article number and manufacturer specific information deleted. Use Pset_ManufacturerTypeInformation. ArticleNumber instead. Load properties moved from Pset_LightFixtureTypeThermal (deleted).',.PSET_TYPEDRIVENOVERRIDE.,'IfcLightFixture,IfcLightFixtureType',(#2328,#2329,#2331,#2332,#2333,#2335,#2337,#2338,#2339,#2340)); +#2328=IFCSIMPLEPROPERTYTEMPLATE('2A8Utmg1T6cfUXrYl9VNOu',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2329=IFCSIMPLEPROPERTYTEMPLATE('2YiiDSHwn1GuLuh575XT_F',$,'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',$,#2330,$,$,$,.READWRITE.); +#2330=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2331=IFCSIMPLEPROPERTYTEMPLATE('2m_RDJey979hBx3lL0nz9v',$,'NumberOfSources','Number of sources .',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2332=IFCSIMPLEPROPERTYTEMPLATE('1DoHsNBbnEE8RzPJE43nit',$,'TotalWattage','Wattage on whole lightfitting device with all sources intact.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#2333=IFCSIMPLEPROPERTYTEMPLATE('1eQN8CN5r29ROPsXtDZqU9',$,'LightFixtureMountingType','A list of the available types of mounting for light fixtures from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2334,$,$,$,.READWRITE.); +#2334=IFCPROPERTYENUMERATION('PEnum_LightFixtureMountingType',(IFCLABEL('CABLESPANNED'),IFCLABEL('FREESTANDING'),IFCLABEL('POLE_SIDE'),IFCLABEL('POLE_TOP'),IFCLABEL('RECESSED'),IFCLABEL('SURFACE'),IFCLABEL('SUSPENDED'),IFCLABEL('TRACKMOUNTED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2335=IFCSIMPLEPROPERTYTEMPLATE('0laP9nq19FdvqBi7elFDBb',$,'LightFixturePlacingType','A list of the available types of placing specification for light fixtures from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2336,$,$,$,.READWRITE.); +#2336=IFCPROPERTYENUMERATION('PEnum_LightFixturePlacingType',(IFCLABEL('CEILING'),IFCLABEL('FLOOR'),IFCLABEL('FURNITURE'),IFCLABEL('POLE'),IFCLABEL('WALL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2337=IFCSIMPLEPROPERTYTEMPLATE('2f2sfr4LLB9BvaDlQ5Qx7s',$,'MaintenanceFactor','The arithmetical allowance made for depreciation of lamps and reflective equipment from their initial values due to dirt, fumes, or age.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2338=IFCSIMPLEPROPERTYTEMPLATE('2xJ5cGD1997he6N6evT$YE',$,'MaximumPlenumSensibleLoad','Maximum or Peak sensible thermal load contributed to return air plenum by the light fixture.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#2339=IFCSIMPLEPROPERTYTEMPLATE('1z90m643T6dBwNwPqr5KtL',$,'MaximumSpaceSensibleLoad','Maximum or Peak sensible thermal load contributed to the conditioned space by the light fixture.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#2340=IFCSIMPLEPROPERTYTEMPLATE('1BJKhigD95$PexIJCSF81c',$,'SensibleLoadToRadiant','Percent of sensible thermal load to radiant heat.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2341=IFCPROPERTYSETTEMPLATE('0$1dM5teL3_g73BF3uyFcX',$,'Pset_LightFixtureTypeSecurityLighting','Properties that characterize security lighting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcLightFixture/SECURITYLIGHTING,IfcLightFixtureType/SECURITYLIGHTING',(#2342,#2344,#2345,#2347,#2349,#2351)); +#2342=IFCSIMPLEPROPERTYTEMPLATE('2jB2$DS5zEmvotE5gC3yAA',$,'SecurityLightingType','The type of security lighting.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2343,$,$,$,.READWRITE.); +#2343=IFCPROPERTYENUMERATION('PEnum_LightFixtureSecurityLightingType',(IFCLABEL('BLUEILLUMINATION'),IFCLABEL('EMERGENCYEXITLIGHT'),IFCLABEL('SAFETYLIGHT'),IFCLABEL('WARNINGLIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2344=IFCSIMPLEPROPERTYTEMPLATE('1efmnrbrnESBLRMr6eNwST',$,'FixtureHeight','The height of the fixture, such as the text height of an exit sign.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2345=IFCSIMPLEPROPERTYTEMPLATE('08Z6G50f9FP8xFxW1uy235',$,'SelfTestFunction','The type of self test function.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2346,$,$,$,.READWRITE.); +#2346=IFCPROPERTYENUMERATION('PEnum_SelfTestType',(IFCLABEL('CENTRAL'),IFCLABEL('LOCAL'),IFCLABEL('NONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2347=IFCSIMPLEPROPERTYTEMPLATE('3YrMQ7J_1BCB3q9XATzPBx',$,'BackupSupplySystem','The type of backup supply system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2348,$,$,$,.READWRITE.); +#2348=IFCPROPERTYENUMERATION('PEnum_BackupSupplySystemType',(IFCLABEL('CENTRALBATTERY'),IFCLABEL('LOCALBATTERY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2349=IFCSIMPLEPROPERTYTEMPLATE('2$3WsEzJ55RBnFFFbjT2uU',$,'PictogramEscapeDirection','The direction of escape pictogram.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2350,$,$,$,.READWRITE.); +#2350=IFCPROPERTYENUMERATION('PEnum_PictogramEscapeDirectionType',(IFCLABEL('DOWNARROW'),IFCLABEL('LEFTARROW'),IFCLABEL('RIGHTARROW'),IFCLABEL('UPARROW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2351=IFCSIMPLEPROPERTYTEMPLATE('1CRgxiyfX8qBgXqIv0hpxp',$,'Addressablility','The type of addressability.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2352,$,$,$,.READWRITE.); +#2352=IFCPROPERTYENUMERATION('PEnum_AddressabilityType',(IFCLABEL('IMPLEMENTED'),IFCLABEL('NOTIMPLEMENTED'),IFCLABEL('UPGRADEABLETO'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2353=IFCPROPERTYSETTEMPLATE('2sv6B2j8LBgxoSsxmq87$9',$,'Pset_LinearReferencingMethod','Describes the manner in which measurements are made along (and optionally offset from) a linear element.NOTE Definition according to ISO 19148:2021',.PSET_OCCURRENCEDRIVEN.,'IfcAlignment,IfcReferent',(#2354,#2355,#2357,#2358,#2359)); +#2354=IFCSIMPLEPROPERTYTEMPLATE('1y2w3DEBz6POBy6OD68FS2',$,'LRMName','Gives the name of this Linear Referencing Method, such as \X2\201C\X0\kilometre-point\X2\201D\X0\.NOTE Definition according to ISO 19148:2021.\X2\000A\X0\NOTE Names of commonly used Linear Referencing Methods are included in ISO 19148, Annex C, along with recognized name aliases.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2355=IFCSIMPLEPROPERTYTEMPLATE('1El38J8vD9ABqwIXwqjGO0',$,'LRMType','Gives the type of this Linear Referencing Method.NOTE Definition according to ISO 19148:2021, LRMType.\X2\000A\X0\NOTE Since the definition in ISO 19148:2021, LRMType is stereotyped as a CodeList it is open for user defined extensions. In this Pset this is handled by adding the enumeration constant LRM_USERDEFINED and the additional property UserDefinedLRMType',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2356,$,$,$,.READWRITE.); +#2356=IFCPROPERTYENUMERATION('PEnum_LRMType',(IFCLABEL('LRM_ABSOLUTE'),IFCLABEL('LRM_INTERPOLATIVE'),IFCLABEL('LRM_RELATIVE'),IFCLABEL('LRM_USERDEFINED')),$); +#2357=IFCSIMPLEPROPERTYTEMPLATE('2B2ozmF896bwmUUU09x65$',$,'UserDefinedLRMType','Gives the user defined type of this Linear Referencing Method when property LRMType is LRM_USERDEFINED.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2358=IFCSIMPLEPROPERTYTEMPLATE('0bqXDQZFn0IxKOKEOrVQvp',$,'LRMUnit','Specifies the units of measure used by this Linear Referencing Method for measures along the linear element being measured.NOTE Definition according to ISO 19148:2021.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2359=IFCSIMPLEPROPERTYTEMPLATE('1mrjrYt9LC0QTWIhMHUqjA',$,'LRMConstraint','Allows for the specification of constraints imposed by this Linear Referencing Method. For example, a Reference Post Linear Referencing Method may specify that referents be of type \X2\201C\X0\reference marker\X2\201D\X0\.NOTE definition according to ISO 19148:2021',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2360=IFCPROPERTYSETTEMPLATE('0ghY2Mh$1Euu6sWiYnbwU8',$,'Pset_MaintenanceStrategy','Property set for the association of a maintenance strategy to an element, asset of system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcAsset,IfcElement,IfcSystem,IfcElementType',(#2361,#2363,#2365,#2367,#2369)); +#2361=IFCSIMPLEPROPERTYTEMPLATE('2NrKt$UhLBiuZtVqMhmu_g',$,'AssetCriticality','Rating of the asset''s criticality to the operation of the facility',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2362,$,$,$,.READWRITE.); +#2362=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); +#2363=IFCSIMPLEPROPERTYTEMPLATE('3XZKxUbuzA4RtiJMNHpSOO',$,'AssetFrailty','Rating of the asset''s frailty to breakage or deterioration',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2364,$,$,$,.READWRITE.); +#2364=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); +#2365=IFCSIMPLEPROPERTYTEMPLATE('1WybEW9nX4UwmoPGiV2kOq',$,'AssetPriority','Combined criticality and frailty rating indicating the operational and maintenance priority of the asset',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2366,$,$,$,.READWRITE.); +#2366=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); +#2367=IFCSIMPLEPROPERTYTEMPLATE('23BCJs88L8JvFUUuOyRwRg',$,'MonitoringType','Monitoring strategy chosen for the asset',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2368,$,$,$,.READWRITE.); +#2368=IFCPROPERTYENUMERATION('PEnum_MonitoringType',(IFCLABEL('FEEDBACK'),IFCLABEL('INSPECTION'),IFCLABEL('IOT'),IFCLABEL('PPM'),IFCLABEL('SENSORS')),$); +#2369=IFCSIMPLEPROPERTYTEMPLATE('34FgXnIBr89AtX2$_39A6U',$,'AccidentResponse','Accident response chosen for the asset',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2370,$,$,$,.READWRITE.); +#2370=IFCPROPERTYENUMERATION('PEnum_AccidentResponse',(IFCLABEL('EMERGENCYINSPECTION'),IFCLABEL('EMERGENCYPROCEDURE'),IFCLABEL('REACTIVE'),IFCLABEL('URGENTINSPECTION'),IFCLABEL('URGENTPROCEDURE')),$); +#2371=IFCPROPERTYSETTEMPLATE('3PLZfMYY9FNh85_Oiu49O6',$,'Pset_MaintenanceTriggerCondition','Trigger levels for an asset that has an inspection-based maintenance strategy',.PSET_TYPEDRIVENOVERRIDE.,'IfcAsset,IfcElement,IfcSystem,IfcElementType',(#2372,#2374,#2376,#2378)); +#2372=IFCSIMPLEPROPERTYTEMPLATE('3s7gl1k7z7IhnDGLT1eVgC',$,'ConditionTargetPerformance','Target condition of the asset',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2373,$,$,$,.READWRITE.); +#2373=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); +#2374=IFCSIMPLEPROPERTYTEMPLATE('2237tVtFH7Vv4HlC9XnUIY',$,'ConditionMaintenanceLevel','Condition that will trigger maintenance',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2375,$,$,$,.READWRITE.); +#2375=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); +#2376=IFCSIMPLEPROPERTYTEMPLATE('3gI_u4p714HhEmMGNjeK81',$,'ConditionReplacementLevel','Condition that will trigger a replacement process',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2377,$,$,$,.READWRITE.); +#2377=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); +#2378=IFCSIMPLEPROPERTYTEMPLATE('2f7CCPLa19URQhAxwX2zr_',$,'ConditionDisposalLevel','Condition that will trigger a disposal process',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2379,$,$,$,.READWRITE.); +#2379=IFCPROPERTYENUMERATION('PEnum_AssetRating',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW')),$); +#2380=IFCPROPERTYSETTEMPLATE('1hcJSSZjzEbwBLVQ8Mfqj2',$,'Pset_MaintenanceTriggerDuration','Trigger levels for an asset that has an PPM based maintenance strategy.',.PSET_TYPEDRIVENOVERRIDE.,'IfcAsset,IfcElement,IfcSystem,IfcElementType',(#2381,#2382,#2383,#2384)); +#2381=IFCSIMPLEPROPERTYTEMPLATE('0NC0DZIf19P9n9Xiu6ljEL',$,'DurationTargetPerformance','Target time to failure of the asset',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#2382=IFCSIMPLEPROPERTYTEMPLATE('1UrhBVwO5AX92mgixtCkqe',$,'DurationMaintenanceLevel','Duration interval at which maintenance is performed',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#2383=IFCSIMPLEPROPERTYTEMPLATE('1Yt4OsQcDDEflvnGVPRRG3',$,'DurationReplacementLevel','Duration interval at which replacement is performed',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#2384=IFCSIMPLEPROPERTYTEMPLATE('28cgL8YZD9JwoKhGDbmKg$',$,'DurationDisposalLevel','Duration interval at which disposal is performed',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#2385=IFCPROPERTYSETTEMPLATE('0HQ3syDOD1Outs0sfuxTfI',$,'Pset_MaintenanceTriggerPerformance','Properties for performance based maintenance policies',.PSET_TYPEDRIVENOVERRIDE.,'IfcAsset,IfcElement,IfcSystem,IfcElementType',(#2386,#2387,#2388,#2389)); +#2386=IFCSIMPLEPROPERTYTEMPLATE('3rybDZIGj0P85ti8vOOO7q',$,'TargetPerformance','Target capacity or performance of the asset. Units of the performance value are specified through the propertyValue units attribute.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2387=IFCSIMPLEPROPERTYTEMPLATE('3zZIxUQO968utqzZsVgF4L',$,'PerformanceMaintenanceLevel','Performance level at which maintenance takes place',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2388=IFCSIMPLEPROPERTYTEMPLATE('0ijJ5m4b99WQVis9bOR6RK',$,'ReplacementLevel','Performance level at which replacement takes place',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2389=IFCSIMPLEPROPERTYTEMPLATE('0yV7Up93b989VfHj78$PTT',$,'DisposalLevel','Performance level at which disposal takes place',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2390=IFCPROPERTYSETTEMPLATE('160pWhRgDF58okYZb$WVeg',$,'Pset_ManufacturerOccurrence','Defines properties of individual instances of manufactured products that may be given by the manufacturer.\X2\000A\X0\HISTORY: IFC 2x4: AssemblyPlace property added. This property does not need to be asserted if Pset_ManufacturerTypeInformation is allocated to the type and the AssemblyPlace property is asserted there.',.PSET_OCCURRENCEDRIVEN.,'IfcElement',(#2391,#2392,#2393,#2394,#2395,#2397)); +#2391=IFCSIMPLEPROPERTYTEMPLATE('14B7aU2eHFUw50qFmQB_q0',$,'AcquisitionDate','The date that the manufactured item was purchased.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#2392=IFCSIMPLEPROPERTYTEMPLATE('3Y8nUu44f1pPi2EO2eUnlv',$,'BarCode','The identity of the bar code given to an occurrence of the product.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2393=IFCSIMPLEPROPERTYTEMPLATE('1o0I19rFvBcO_haqmFiJWK',$,'SerialNumber','The manufacturer''s serial number assigned to an occurrence of a product.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2394=IFCSIMPLEPROPERTYTEMPLATE('0qOO5hFgzAWfr0pyJwueLA',$,'BatchReference','The identity of the batch reference from which an occurrence of a product is taken.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2395=IFCSIMPLEPROPERTYTEMPLATE('0IOV_luVj7h9KDcvww5ZUA',$,'AssemblyPlace','Enumeration defining where the assembly is intended to take place, either in a factory, other offsite location or on the building site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2396,$,$,$,.READWRITE.); +#2396=IFCPROPERTYENUMERATION('PEnum_AssemblyPlace',(IFCLABEL('FACTORY'),IFCLABEL('OFFSITE'),IFCLABEL('SITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2397=IFCSIMPLEPROPERTYTEMPLATE('019038XQXCOw7cBG653eGz',$,'ManufacturingDate','Date on which the element was manufactured.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#2398=IFCPROPERTYSETTEMPLATE('00j$QKnO1FNODcBZPbxfx9',$,'Pset_ManufacturerTypeInformation','Defines characteristics of types (ranges) of manufactured products that may be given by the manufacturer. Note that the term ''manufactured'' may also be used to refer to products that are supplied and identified by the supplier or that are assembled off site by a third party provider.\X2\000A\X0\HISTORY: This property set replaces the entity IfcManufacturerInformation from previous IFC releases. IFC 2x4: AssemblyPlace property added.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#2399,#2400,#2401,#2402,#2403,#2404,#2405,#2407,#2408,#2409)); +#2399=IFCSIMPLEPROPERTYTEMPLATE('2nzyDLBMD2xAy$bLkKya_4',$,'GlobalTradeItemNumber','The Global Trade Item Number (GTIN) is an identifier for trade items developed by GS1 (www.gs1.org).',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2400=IFCSIMPLEPROPERTYTEMPLATE('3QYYAAAYnBGhsEK1qZ7OKz',$,'ArticleNumber','Article number or reference that is be applied to a configured product according to a standard scheme for article number definition as defined by the manufacturer. It is often used as the purchasing number.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2401=IFCSIMPLEPROPERTYTEMPLATE('3VLLb_Gn13v9Xk77lovicj',$,'ModelReference','The model number or designator of the product model (or product line) as assigned by the manufacturer of the manufactured item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2402=IFCSIMPLEPROPERTYTEMPLATE('1Xg8oAb3b87hb5acyNT5rX',$,'ModelLabel','The descriptive model name of the product model (or product line) as assigned by the manufacturer of the manufactured item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2403=IFCSIMPLEPROPERTYTEMPLATE('0cN9fTpcfDaBuTs0iS_DFj',$,'Manufacturer','The organization that manufactured and/or assembled the item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2404=IFCSIMPLEPROPERTYTEMPLATE('32WeoI05n9ifiBjwMrI9Y9',$,'ProductionYear','The year of production of the manufactured item.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2405=IFCSIMPLEPROPERTYTEMPLATE('3q1bMn1KXD5gwHKSPzyG7d',$,'AssemblyPlace','Enumeration defining where the assembly is intended to take place, either in a factory, other offsite location or on the building site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2406,$,$,$,.READWRITE.); +#2406=IFCPROPERTYENUMERATION('PEnum_AssemblyPlace',(IFCLABEL('FACTORY'),IFCLABEL('OFFSITE'),IFCLABEL('SITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2407=IFCSIMPLEPROPERTYTEMPLATE('3kYHL403DCTfHokBQ4$$3f',$,'OperationalDocument','Manufacturer''s operational document',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#2408=IFCSIMPLEPROPERTYTEMPLATE('08Wov4YvT5VuJjGltYiKAS',$,'SafetyDocument','Manufacturer''s safety document',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); +#2409=IFCSIMPLEPROPERTYTEMPLATE('0CBhm5UATBZg1USYUX7KTI',$,'PerformanceCertificate','Manufacturer''s performance certificate',.P_REFERENCEVALUE.,'IfcDocumentReference',$,$,$,$,$,.READWRITE.); +#2410=IFCPROPERTYSETTEMPLATE('2iB7SPlTr5Aeoglndbndnz',$,'Pset_MarineFacilityTransportation','Properties common to the definition of all occurrences of IfcMarineFacility which are catagorised as transportation facilities such as Ports, marinas etc.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility',(#2411,#2412,#2413)); +#2411=IFCSIMPLEPROPERTYTEMPLATE('2TV6FKsg95AxB1NE44EzJE',$,'Berths','Number of standard berths within the facility',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2412=IFCSIMPLEPROPERTYTEMPLATE('3cgztQgfD16fCqKWdiuouN',$,'BerthGrade','Berth grade',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2413=IFCSIMPLEPROPERTYTEMPLATE('0AKelyWZjFwxZRY3NBcYb_',$,'BerthCargoWeight','Total cargo weight of berths within the facility',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#2414=IFCPROPERTYSETTEMPLATE('0GJjhxpZn3SxV4gOWA0jjV',$,'Pset_MarinePartChamberCommon','Properties common to the definition of all occurrences of IfcMarinePart with the predefined type set to CHAMBER.',.PSET_OCCURRENCEDRIVEN.,'IfcMarinePart/CHAMBER',(#2415,#2416)); +#2415=IFCSIMPLEPROPERTYTEMPLATE('0PMe0xKVTB0ANKz3dxwNhw',$,'EffectiveChamberSize','Volumetric measure defining the effective chamber size for operational and design activities.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#2416=IFCSIMPLEPROPERTYTEMPLATE('3Hsoz08ibEnQheCm3Me0vn',$,'StructuralType','Structural type of the object',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2417=IFCPROPERTYSETTEMPLATE('2YwwTOtIH2wOl2iYiXsU6s',$,'Pset_MarineVehicleCommon','Properties common to the definition of all occurrences of IfcTransportElement and types of IfcTransportElementType with the predefined type set to VEHICLEMARINE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcVehicle/VEHICLEMARINE,IfcVehicleType/VEHICLEMARINE',(#2418,#2419,#2420,#2421,#2422,#2423,#2424,#2425)); +#2418=IFCSIMPLEPROPERTYTEMPLATE('2EW84ZQoX0afJqyvm_aVWd',$,'LengthBetweenPerpendiculars','Length of vessel from rudder shaft to crossing point of the bow and the loaded waterline.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2419=IFCSIMPLEPROPERTYTEMPLATE('2vXgbvhdnDMhKHzbymm35Z',$,'VesselDepth','Depth of the vessel from the main deck to the keel.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2420=IFCSIMPLEPROPERTYTEMPLATE('2z8$9ilib2YhY1GM4_HH4d',$,'VesselDraft','Depth of vessel from the waterline to the keel (LightShip, Ballasted, Maximum)',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2421=IFCSIMPLEPROPERTYTEMPLATE('3BZkx5rBX6PhOpM8xDeJrC',$,'AboveDeckProjectedWindEnd','End on projected windage area above the main deck',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#2422=IFCSIMPLEPROPERTYTEMPLATE('3DzE8oIZvA$PFzI66BxxeJ',$,'AboveDeckProjectedWindSide','Side on projected windage area above the main deck',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#2423=IFCSIMPLEPROPERTYTEMPLATE('2bj7jhqGTB$8$waFjwZeau',$,'Displacement','Weight of water displaced by the vessel',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#2424=IFCSIMPLEPROPERTYTEMPLATE('1ByMzcAlH9bOGhYZ$5HKPb',$,'CargoDeadWeight','Weight of (bulk) cargo carried',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#2425=IFCSIMPLEPROPERTYTEMPLATE('11a4v7IcbBzQXtGtB$qoH3',$,'LaneMeters','Length of lanes accommodating vehicles on roll-on, roll-off vessels',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2426=IFCPROPERTYSETTEMPLATE('2QUlkej1b5iQeiRPhEnWIl',$,'Pset_MarineVehicleDesignCriteria','Properties common to the definition of design criteria of all occurrences of IfcTransportElement and types of IfcTransportElementType with the predefined type set to MARINEVEHICLE',.PSET_TYPEDRIVENOVERRIDE.,'IfcVehicle/VEHICLEMARINE,IfcVehicleType/VEHICLEMARINE',(#2427,#2428)); +#2427=IFCSIMPLEPROPERTYTEMPLATE('0Wde_nqVX29vZxWDfMreQc',$,'AllowableHullPressure','Allowable contact pressure between fender and hull',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2428=IFCSIMPLEPROPERTYTEMPLATE('1i4X5B4jb00u20m2Ah$29n',$,'SoftnessCoefficient','Vessel flexibility factor - proportion of impact energy absorbed by the hull.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2429=IFCPROPERTYSETTEMPLATE('2vcIr2UuD4E9MrNEVHsA39',$,'Pset_MarkerGeneral','Properties common to a signalling marker made as an assembly of elements. The property set can be used by the predefined type SIGNAL_ASSEMBLY of IfcElementAssembly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SIGNALASSEMBLY,IfcElementAssemblyType/SIGNALASSEMBLY',(#2430,#2431,#2433,#2434,#2435)); +#2430=IFCSIMPLEPROPERTYTEMPLATE('0$AChl37v33whgARF3hdZc',$,'ApproachSpeed','The design speed of trains approaching the signal if different from the line speed.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#2431=IFCSIMPLEPROPERTYTEMPLATE('1wui3rCGv2Bh7lww7F3bVX',$,'MarkerType','The type of marker (sign) e.g. stop signal, restriction signal, track circuit tuning zone sign or others specified in PEnum_MarkerType.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2432,$,$,$,.READWRITE.); +#2432=IFCPROPERTYENUMERATION('PEnum_MarkerType',(IFCLABEL('APPROACHING_MARKER'),IFCLABEL('CABLE_POST_MARKER'),IFCLABEL('COMMUNICATION_MODE_CONVERSION_MARKER'),IFCLABEL('EMU_STOP_POSITION_SIGN'),IFCLABEL('FOUR_ASPECT_CAB_SIGNAL_CONNECT_SIGN'),IFCLABEL('FOUR_ASPECT_CAB_SIGNAL_DISCONNECT_SIGN'),IFCLABEL('LEVEL_CONVERSION_SIGN'),IFCLABEL('LOCOMOTIVE_STOP_POSITION_SIGN'),IFCLABEL('RELAY_STATION_SIGN'),IFCLABEL('RESTRICTION_PLACE_SIGN'),IFCLABEL('RESTRICTION_PROTECTION_AREA_TERMINAL_SIGN'),IFCLABEL('RESTRICTION_SIGN'),IFCLABEL('SECTION_SIGNAL_MARKER'),IFCLABEL('STOP_SIGN'),IFCLABEL('TRACK_CIRCUIT_TUNING_ZONE_SIGN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2433=IFCSIMPLEPROPERTYTEMPLATE('2c0nf$m753$fnFdvhj0LLt',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A000A\X0\The nominal height of the furniture of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2434=IFCSIMPLEPROPERTYTEMPLATE('3I$FYDPMP2HuIbNlDL4_XX',$,'Symbol','Content which is shown on the sign, e.g. text, number, arrow or icon. The string can also be a pointer to a symbol catalog.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#2435=IFCSIMPLEPROPERTYTEMPLATE('2p5hnXcrP0uOg$y8Hm6eRm',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2436=IFCPROPERTYSETTEMPLATE('0dX5YhXrP3mxtSoIzmije1',$,'Pset_MarkingLinesCommon','Properties for line markings.',.PSET_OCCURRENCEDRIVEN.,'IfcSurfaceFeature/LINEMARKING',(#2437,#2438,#2439)); +#2437=IFCSIMPLEPROPERTYTEMPLATE('0SMRL1Lp9FNhKWjqBzydlM',$,'DashedLine','State if the line is dashed or continuous',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2438=IFCSIMPLEPROPERTYTEMPLATE('3v7yyq7DL1hexBrVwCHSIg',$,'DashedLinePattern','Indicates the pattern for dashed line types e.g. ''3+9''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2439=IFCSIMPLEPROPERTYTEMPLATE('03PUAYNBH08vBJG9e_pJsi',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2440=IFCPROPERTYSETTEMPLATE('3OvVeSbqPAjeAJlD2vzngz',$,'Pset_MaterialCombustion','A set of extended material properties of products of combustion generated by elements typically used within the context of building services and flow distribution systems.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2441,#2442,#2443,#2444)); +#2441=IFCSIMPLEPROPERTYTEMPLATE('1kS5_PDfPF3BPbPK39P8KY',$,'SpecificHeatCapacity','Defines the specific heat capacity of a material.\X2\000A000A\X0\Specific heat of the products of combustion: heat energy absorbed per temperature unit.',.P_SINGLEVALUE.,'IfcSpecificHeatCapacityMeasure',$,$,$,$,$,.READWRITE.); +#2442=IFCSIMPLEPROPERTYTEMPLATE('3_TQt72wr4sfwdinvCnhen',$,'N20Content','Nitrous oxide (N2O) content of the products of combustion. This is measured in weight of N2O per unit weight and is therefore unitless.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2443=IFCSIMPLEPROPERTYTEMPLATE('1kVUzKwDPC7gcYnlom1XAH',$,'COContent','Carbon monoxide (CO) content of the products of combustion. This is measured in weight of CO per unit weight and is therefore unitless.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2444=IFCSIMPLEPROPERTYTEMPLATE('0Xep6Ap7f9oBrYRK_HO2fM',$,'CO2Content','Carbon dioxide (CO2) content of the products of combustion. This is measured in weight of CO2 per unit weight and is therefore unitless.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2445=IFCPROPERTYSETTEMPLATE('0vnh5fZl5438uzTWYKqtcz',$,'Pset_MaterialCommon','A set of general material properties.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2446,#2447,#2448)); +#2446=IFCSIMPLEPROPERTYTEMPLATE('2JRpTxIWrA9eS_btjGnGIy',$,'MolecularWeight','Molecular weight of material (typically gas).',.P_SINGLEVALUE.,'IfcMolecularWeightMeasure',$,$,$,$,$,.READWRITE.); +#2447=IFCSIMPLEPROPERTYTEMPLATE('16GGDM7MTDS8pxPizYs$wS',$,'Porosity','The void fraction of the total volume occupied by material (Vbr - Vnet)/Vbr.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2448=IFCSIMPLEPROPERTYTEMPLATE('1pyytcgRv0U85QoDoCEgRm',$,'MassDensity','Material mass density.',.P_SINGLEVALUE.,'IfcMassDensityMeasure',$,$,$,$,$,.READWRITE.); +#2449=IFCPROPERTYSETTEMPLATE('2YevSUwLn3HOqNv6GH95mx',$,'Pset_MaterialConcrete','A set of extended mechanical properties related to concrete materials.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2450,#2451,#2452,#2453,#2454,#2455)); +#2450=IFCSIMPLEPROPERTYTEMPLATE('1_vZsymXrELB7OsEOkaOm5',$,'CompressiveStrength','The compressive strength of the object or material.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2451=IFCSIMPLEPROPERTYTEMPLATE('1HAcJvQU53nOYaKuG2Q2fd',$,'MaxAggregateSize','The maximum aggregate size of the concrete.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2452=IFCSIMPLEPROPERTYTEMPLATE('0qd0c6va91NeTQbWbNOP0Q',$,'AdmixturesDescription','Description of the admixtures added to the concrete mix.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2453=IFCSIMPLEPROPERTYTEMPLATE('1fszDt0Sr9P89wM2f6$2Df',$,'Workability','Description of the workability of the fresh concrete defined according to local standards.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2454=IFCSIMPLEPROPERTYTEMPLATE('1_evCRUbT4jOI23p$zRRdj',$,'WaterImpermeability','Description of the water impermeability denoting the water repelling properties.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2455=IFCSIMPLEPROPERTYTEMPLATE('3nNNMa0AHCFud$qG8p162E',$,'ProtectivePoreRatio','The protective pore ratio indicating the frost-resistance of the concrete.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2456=IFCPROPERTYSETTEMPLATE('1xsXt$6Nr0n9a60VBqlpR7',$,'Pset_MaterialEnergy','A set of extended material properties for energy calculation purposes.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2457,#2458,#2459,#2460,#2461,#2462,#2463)); +#2457=IFCSIMPLEPROPERTYTEMPLATE('19Dvp9vdL2jfxngwiuhj4c',$,'ViscosityTemperatureDerivative','Viscosity temperature derivative.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2458=IFCSIMPLEPROPERTYTEMPLATE('24JG_cpIT7_f$9TUamAEnm',$,'MoistureCapacityThermalGradient','Thermal gradient coefficient for moisture capacity. Based on water vapor density.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2459=IFCSIMPLEPROPERTYTEMPLATE('2IG7x3_LDAWuO782j1$Gky',$,'ThermalConductivityTemperatureDerivative','Thermal conductivity temperature derivative.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2460=IFCSIMPLEPROPERTYTEMPLATE('2rIJ8ICPb1IxJGhNAOSM2s',$,'SpecificHeatTemperatureDerivative','Specific heat temperature derivative.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2461=IFCSIMPLEPROPERTYTEMPLATE('1V0H6uR112QBF7NgeAu8TJ',$,'VisibleRefractionIndex','Index of refraction (visible) defines the "bending" of the sola! r ray in the visible spectrum when it passes from one medium into another.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2462=IFCSIMPLEPROPERTYTEMPLATE('1QZuA_dfH6VxJQLaLD8MmN',$,'SolarRefractionIndex','Index of refraction (solar) defines the "bending" of the solar ray when it passes from one medium into another.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2463=IFCSIMPLEPROPERTYTEMPLATE('1oyOBFx8r8EvKSyfYmyhNE',$,'GasPressure','Fill pressure (e.g. for between-pane gas fills): the pressure exerted by a mass of gas confined in a constant volume.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2464=IFCPROPERTYSETTEMPLATE('3cFt$p$JvEGw_CVG$vrOQX',$,'Pset_MaterialFuel','A set of extended material properties of fuel energy typically used within the context of building services and flow distribution systems.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2465,#2466,#2467,#2468)); +#2465=IFCSIMPLEPROPERTYTEMPLATE('24cYkjAf94BvNXaw6cTwh0',$,'CombustionTemperature','Combustion temperature.\X2\000A000A\X0\Combustion temperature of the material when air is at 298 K and 100 kPa.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2466=IFCSIMPLEPROPERTYTEMPLATE('0CgWhCBE9DOx8w5DDeBzNq',$,'CarbonContent','The carbon content in the fuel. This is measured in weight of carbon per unit weight of fuel and is therefore unitless.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2467=IFCSIMPLEPROPERTYTEMPLATE('3JC0$xDiD70uYWYHEkret2',$,'LowerHeatingValue','Lower Heating Value is defined as the amount of energy released (MJ/kg) when a fuel is burned completely, and H2O is in vapor form in the combustion products.',.P_SINGLEVALUE.,'IfcHeatingValueMeasure',$,$,$,$,$,.READWRITE.); +#2468=IFCSIMPLEPROPERTYTEMPLATE('2xErrIPFvFE8sy5GWVzgpR',$,'HigherHeatingValue','Higher Heating Value is defined as the amount of energy released (MJ/kg) when a fuel is burned completely, and H2O is in liquid form in the combustion products.',.P_SINGLEVALUE.,'IfcHeatingValueMeasure',$,$,$,$,$,.READWRITE.); +#2469=IFCPROPERTYSETTEMPLATE('2OkhjvH7PBAh5fubUx4Ysv',$,'Pset_MaterialHygroscopic','A set of hygroscopic properties of materials.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2470,#2471,#2472,#2473,#2474)); +#2470=IFCSIMPLEPROPERTYTEMPLATE('0TMETMxcD4FRBD0XE1nQ2z',$,'UpperVaporResistanceFactor','The vapor permeability relationship of air/material (typically value > 1), measured in high relative humidity (typically in 95/50 % RH).',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2471=IFCSIMPLEPROPERTYTEMPLATE('26ehO4Ou94hxxqeXVHVQij',$,'LowerVaporResistanceFactor','The vapor permeability relationship of air/material (typically value > 1), measured in low relative humidity (typically in 0/50 % RH).',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2472=IFCSIMPLEPROPERTYTEMPLATE('3uYllFeTj31Pvz_6RCKLlr',$,'IsothermalMoistureCapacity','Based on water vapor density.',.P_SINGLEVALUE.,'IfcIsothermalMoistureCapacityMeasure',$,$,$,$,$,.READWRITE.); +#2473=IFCSIMPLEPROPERTYTEMPLATE('24wFzBbCr0mub9ERzgVsbe',$,'VaporPermeability','The rate of water vapor transmission per unit area per unit of vapor pressure differential under test conditions.',.P_SINGLEVALUE.,'IfcVaporPermeabilityMeasure',$,$,$,$,$,.READWRITE.); +#2474=IFCSIMPLEPROPERTYTEMPLATE('3WYseYV1zDbPXRHc3pYsgx',$,'MoistureDiffusivity','Moisture diffusivity is a transport property that is frequently used in the hygrothermal analysis of building envelope components.',.P_SINGLEVALUE.,'IfcMoistureDiffusivityMeasure',$,$,$,$,$,.READWRITE.); +#2475=IFCPROPERTYSETTEMPLATE('2CY1XJcWjC9Q7Dxo2$tdLX',$,'Pset_MaterialMechanical','A set of mechanical material properties normally used for structural analysis purpose. It contains all properties which are independent of the actual material type.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2476,#2477,#2478,#2479,#2480)); +#2476=IFCSIMPLEPROPERTYTEMPLATE('3doAUPBeP7SuDr6kC5uwQf',$,'DynamicViscosity','A measure of the viscous resistance of the material.',.P_SINGLEVALUE.,'IfcDynamicViscosityMeasure',$,$,$,$,$,.READWRITE.); +#2477=IFCSIMPLEPROPERTYTEMPLATE('3n38QUglb9nhl5Gkdqlm1B',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2478=IFCSIMPLEPROPERTYTEMPLATE('2fzT5ap_95ThJ5Z0siBRFk',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2479=IFCSIMPLEPROPERTYTEMPLATE('2oaOpiXtbDUen77Ck8fprw',$,'PoissonRatio','A measure of the lateral deformations in the elastic range.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2480=IFCSIMPLEPROPERTYTEMPLATE('2tahvEf$z0xOhOqx9BVqHU',$,'ThermalExpansionCoefficient','Quantity characterizing the variation with thermodynamic temperature T of the distance l between two points of a body, under given conditions (IEC 113-04-27). The ratio is defined per Kelvin.',.P_SINGLEVALUE.,'IfcThermalExpansionCoefficientMeasure',$,$,$,$,$,.READWRITE.); +#2481=IFCPROPERTYSETTEMPLATE('3_NRkiNOfF7RA8pv1sjrCx',$,'Pset_MaterialOptical','A set of optical properties of materials.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2482,#2483,#2484,#2485,#2486,#2487,#2488,#2489,#2490)); +#2482=IFCSIMPLEPROPERTYTEMPLATE('3AEtF9eVj9rPUfcHkdI5g0',$,'VisibleTransmittance','Transmittance at normal incidence (visible). Defines the fraction of the visible spectrum of solar radiation that passes through per unit area, perpendicular to the surface.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2483=IFCSIMPLEPROPERTYTEMPLATE('3NpfY5L990pejXn3Z5z3mc',$,'SolarTransmittance','The ratio of incident solar radiation that directly passes through a system (also named \X2\03C4\X0\e). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2484=IFCSIMPLEPROPERTYTEMPLATE('3b_TcQESvBseYfswf76cSp',$,'ThermalIrTransmittance','Thermal IR transmittance at normal incidence. Defines the fraction of thermal energy that passes through per unit area, perpendicular to the surface.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2485=IFCSIMPLEPROPERTYTEMPLATE('1wWZPR5Dz3oBGbddwBCUoB',$,'ThermalIrEmissivityBack','Thermal IR emissivity: back side. Defines the fraction of thermal energy emitted per unit area to "blackbody" at the same temperature, through the "back" side of the material.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2486=IFCSIMPLEPROPERTYTEMPLATE('00bTtMPnr04f2sLp6_kJ2_',$,'ThermalIrEmissivityFront','Thermal IR emissivity: front side. Defines the fraction of thermal energy emitted per unit area to "blackbody" at the same temperature, through the "front" side of the material.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2487=IFCSIMPLEPROPERTYTEMPLATE('2CW61Ga590zOproIx5M3jR',$,'VisibleReflectanceBack','Reflectance at normal incidence (visible): back side. Defines the fraction of the solar ray in the visible spectrum that is reflected and not transmitted when the ray passes from one medium into another, at the "back" side of the other material, perpendicular to the surface. Dependent on material and surface characteristics.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2488=IFCSIMPLEPROPERTYTEMPLATE('3iq4rLcDPACQDL$KkFjxWj',$,'VisibleReflectanceFront','Reflectance at normal incidence (visible): front side. Defines the fraction of the solar ray in the visible spectrum that is reflected and not transmitted when the ray passes from one medium into another, at the "front" side of the other material, perpendicular to the surface. Dependent on material and surface characteristics.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2489=IFCSIMPLEPROPERTYTEMPLATE('2IoCQzPMnAOhuk7Hb8DZVZ',$,'SolarReflectanceBack','Reflectance at normal incidence (solar): back side. Defines the fraction of the solar ray that is reflected and not transmitted when the ray passes from one medium into another, at the "back" side of the other material, perpendicular to the surface. Dependent on material and surface characteristics.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2490=IFCSIMPLEPROPERTYTEMPLATE('3la1TWjofEV9jHa4rEOBH0',$,'SolarReflectanceFront','Reflectance at normal incidence (solar): front side. Defines the fraction of the solar ray that is reflected and not transmitted when the ray passes from one medium into another, at the "front" side of the other material, perpendicular to the surface. Dependent on material and surface characteristics.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2491=IFCPROPERTYSETTEMPLATE('0i3qtkTUv2IQrtMoY2hxHb',$,'Pset_MaterialSteel','A set of extended mechanical properties related to steel (or other metallic and isotropic) materials.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2492,#2493,#2494,#2495,#2496,#2497,#2498,#2499)); +#2492=IFCSIMPLEPROPERTYTEMPLATE('0OQS1WX_1FfR8t5pBqz12A',$,'YieldStress','A measure of the yield stress (or characteristic 0.2 percent proof stress) of the material.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2493=IFCSIMPLEPROPERTYTEMPLATE('0G98n2PHj2688YagMyDFpO',$,'UltimateStress','A measure of the ultimate stress of the material.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2494=IFCSIMPLEPROPERTYTEMPLATE('1PPS4VcpbDMf8kq9sPDkV0',$,'UltimateStrain','A measure of the (engineering) strain at the state of ultimate stress of the material.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2495=IFCSIMPLEPROPERTYTEMPLATE('2pgLCLx8D3bgXrzqSLA6SN',$,'HardeningModule','A measure of the hardening module of the material (slope of stress versus strain curve after yield range).',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2496=IFCSIMPLEPROPERTYTEMPLATE('2uvaOwTb11S8EDcZtxXJOM',$,'ProportionalStress','A measure of the proportional stress of the material. It describes the stress before the first plastic deformation occurs and is commonly measured at a deformation of 0.01%.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2497=IFCSIMPLEPROPERTYTEMPLATE('3YxL1R_M98IfXxzcIgyb1Y',$,'PlasticStrain','A measure of the permanent displacement, as in slip or twinning, which remains after the stress has been removed. Currently applied to a strain of 0.2% proportional stress of the material.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2498=IFCSIMPLEPROPERTYTEMPLATE('3ILapWV6951RIrHi4hNG7G',$,'Relaxations','Measures of decrease in stress over long time intervals resulting from plastic flow. Different relaxation values for different initial stress levels for a material may be given. It describes the time dependent relative relaxation value for a given initial stress level at constant strain.\X2\000A\X0\Relating values are the "RelaxationValue". Related values are the "InitialStress"',.P_TABLEVALUE.,'IfcNormalisedRatioMeasure','IfcNormalisedRatioMeasure',$,$,$,$,.READWRITE.); +#2499=IFCSIMPLEPROPERTYTEMPLATE('3a22kU71HDrP$jtDiA4vi1',$,'StructuralGrade','Classification label to define mechanical properties according to structural grades defined in published standards; designated by numbers, letters, or a combination of both.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2500=IFCPROPERTYSETTEMPLATE('1$LJ$QAHH6FApL7aHLdzqq',$,'Pset_MaterialThermal','A set of thermal material properties.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2501,#2502,#2503,#2504)); +#2501=IFCSIMPLEPROPERTYTEMPLATE('35ppn26ffCuPwuoAnOqk1j',$,'SpecificHeatCapacity','Defines the specific heat capacity of a material.\X2\000A000A\X0\Defines the specific heat of the material: heat energy absorbed per temperature unit.',.P_SINGLEVALUE.,'IfcSpecificHeatCapacityMeasure',$,$,$,$,$,.READWRITE.); +#2502=IFCSIMPLEPROPERTYTEMPLATE('3Upe5ycdTD5fNy2H8Ti7LG',$,'BoilingPoint','The boiling point of the material (fluid).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2503=IFCSIMPLEPROPERTYTEMPLATE('3z7IohmTPDiO$TfntnPRdc',$,'FreezingPoint','The freezing point of the material (fluid).',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2504=IFCSIMPLEPROPERTYTEMPLATE('11ISsO0grEyeBdGclbP2L_',$,'ThermalConductivity','The thermal conductivity of the object.\X2\000A000A\X0\The rate at which thermal energy is transmitted through the material.',.P_SINGLEVALUE.,'IfcThermalConductivityMeasure',$,$,$,$,$,.READWRITE.); +#2505=IFCPROPERTYSETTEMPLATE('1bXSNwIkf0FvvPJ9k2lggD',$,'Pset_MaterialWater','A set of extended material properties for of water typically used within the context of building services and flow distribution systems.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2506,#2507,#2508,#2509,#2510,#2511,#2512)); +#2506=IFCSIMPLEPROPERTYTEMPLATE('0JVjK$cnTDJg2GUEoiMO8E',$,'IsPotable','If TRUE, then the water is considered potable.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2507=IFCSIMPLEPROPERTYTEMPLATE('2ONklesojBqgRQcgxXtwjk',$,'Hardness','Water hardness as positive, multivalent ion concentration in the water (usually concentrations of calcium and magnesium ions in terms of calcium carbonate).',.P_SINGLEVALUE.,'IfcIonConcentrationMeasure',$,$,$,$,$,.READWRITE.); +#2508=IFCSIMPLEPROPERTYTEMPLATE('3f83ZIKqj3IOSqsvWiYP8L',$,'AlkalinityConcentration','Maximum alkalinity concentration (maximum sum of concentrations of each of the negative ions substances measured as CaCO3).',.P_SINGLEVALUE.,'IfcIonConcentrationMeasure',$,$,$,$,$,.READWRITE.); +#2509=IFCSIMPLEPROPERTYTEMPLATE('0lIcI4XFr5jQMJRPZKelgv',$,'AcidityConcentration','Maximum CaCO3 equivalent that would neutralize the acid.',.P_SINGLEVALUE.,'IfcIonConcentrationMeasure',$,$,$,$,$,.READWRITE.); +#2510=IFCSIMPLEPROPERTYTEMPLATE('2i7eYB7Rj3gQd5wPsDoLWe',$,'ImpuritiesContent','Fraction of impurities such as dust to the total amount of water. This is measured in weight of impurities per weight of water and is therefore unitless.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2511=IFCSIMPLEPROPERTYTEMPLATE('0hyoiqQGrFIhNSgeMBWsxH',$,'DissolvedSolidsContent','Fraction of the dissolved solids to the total amount of water. This is measured in weight of dissolved solids per weight of water and is therefore unitless.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#2512=IFCSIMPLEPROPERTYTEMPLATE('1sNd08OdL38BwpK8APMwt2',$,'PHLevel','Maximum water PH in a range from 0-14.',.P_SINGLEVALUE.,'IfcPHMeasure',$,$,$,$,$,.READWRITE.); +#2513=IFCPROPERTYSETTEMPLATE('3y8o2Reo52sfUG1YjXoD$H',$,'Pset_MaterialWood','This is a collection of properties applicable to wood-based materials that specify kind and grade of material as well as moisture related parameters.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2514,#2515,#2516,#2517,#2518,#2519,#2520,#2521,#2522)); +#2514=IFCSIMPLEPROPERTYTEMPLATE('1OiwyZd$jFTeAFqRFnEB62',$,'Species','Wood species of a solid wood or laminated wood product.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2515=IFCSIMPLEPROPERTYTEMPLATE('0KcLaluQHBtQOH7HNoeuMQ',$,'StrengthGrade','Grade with respect to mechanical strength and stiffness.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2516=IFCSIMPLEPROPERTYTEMPLATE('101E887AvEJhEN4nHmzeQ1',$,'AppearanceGrade','Grade with respect to visual quality.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2517=IFCSIMPLEPROPERTYTEMPLATE('1jSwhn7u90OOio66wfkK63',$,'Layup','Configuration of the lamination.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2518=IFCSIMPLEPROPERTYTEMPLATE('3zFrfLDn5AHwr4jjYsrkeX',$,'Layers','Number of layers.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#2519=IFCSIMPLEPROPERTYTEMPLATE('1rvioeKzD0dRJHqDpPQ4xe',$,'Plies','Number of plies.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#2520=IFCSIMPLEPROPERTYTEMPLATE('1iexdIADvD0QZc91KvNcAN',$,'MoistureContent','Total weight of moisture relative to oven-dried weight of the wood.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2521=IFCSIMPLEPROPERTYTEMPLATE('1bNhUlHL18P8aNTmcseUnu',$,'DimensionalChangeCoefficient','Weighted dimensional change coefficient, relative to 1% change in moisture content.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2522=IFCSIMPLEPROPERTYTEMPLATE('1DsNocvHz0RgfTUDFesQ5W',$,'ThicknessSwelling','Swelling ratio relative to board depth.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2523=IFCPROPERTYSETTEMPLATE('0o4oHG_DX2bQQ_mNyTGCIw',$,'Pset_MaterialWoodBasedStructure','Properties about Material of Wood Based Structure.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2524)); +#2524=IFCSIMPLEPROPERTYTEMPLATE('3GsJ2MS4T44Pf4BQTH3roA',$,'ApplicableStructuralDesignMethod','Determines whether mechanical material properties are applicable to ''ASD'' = allowable stress design (working stress design), ''LSD'' = limit state design, or ''LRFD'' = load and resistance factor design.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2525=IFCPROPERTYSETTEMPLATE('2bUqHgD4TApQSxZ7__B00z',$,'Pset_MechanicalBeamInPlane','Properties about Mechanical Beam in Plane.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2526,#2527,#2528,#2529,#2530,#2531,#2532,#2533,#2534,#2535,#2536,#2537,#2538,#2539,#2540,#2541)); +#2526=IFCSIMPLEPROPERTYTEMPLATE('0lLANa0Of5BeQqYCi89pwh',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2527=IFCSIMPLEPROPERTYTEMPLATE('3md3l8NB97hg9xmRJeOsFZ',$,'YoungModulusMin','Elastic modulus, minimal value, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2528=IFCSIMPLEPROPERTYTEMPLATE('2q5WJl3Nf9rhOR7gDQyVcM',$,'YoungModulusPerp','Elastic modulus, mean value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2529=IFCSIMPLEPROPERTYTEMPLATE('3_ZhC2B49FTOGTE2F_Cyv3',$,'YoungModulusPerpMin','Elastic modulus, minimal value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2530=IFCSIMPLEPROPERTYTEMPLATE('0VyGrmV2XFshALSi8_oe9i',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2531=IFCSIMPLEPROPERTYTEMPLATE('3aWULsQdPC3uRH8pNk3_rt',$,'ShearModulusMin','Shear modulus, minimal value.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2532=IFCSIMPLEPROPERTYTEMPLATE('31hP15Bp9E5QAdWjEzkX9P',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2533=IFCSIMPLEPROPERTYTEMPLATE('18BM7dORv7Q8gLBJKer9H1',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2534=IFCSIMPLEPROPERTYTEMPLATE('35TdQ_RWn6$BT7HIX3DXCx',$,'TensileStrengthPerp','Tensile strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2535=IFCSIMPLEPROPERTYTEMPLATE('2vN$MQuMvEmQo0nBA1jRVE',$,'CompStrength','Compressive strength, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2536=IFCSIMPLEPROPERTYTEMPLATE('3xWGmOYW5D9POKKPUcgzh0',$,'CompStrengthPerp','Compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2537=IFCSIMPLEPROPERTYTEMPLATE('0jLEe4pHn1nxvkGPWRPrkI',$,'RaisedCompStrengthPerp','Alternative value for compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\, which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2538=IFCSIMPLEPROPERTYTEMPLATE('2LDY6MyuTDe9xyrMwXJE5n',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2539=IFCSIMPLEPROPERTYTEMPLATE('2Pl8ZCttPESAd1cp_whz6j',$,'TorsionalStrength','Shear strength in torsion.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2540=IFCSIMPLEPROPERTYTEMPLATE('25dSeiafv4B8Ym1kUoEulB',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2541=IFCSIMPLEPROPERTYTEMPLATE('3sgsLm735FmA5INr0dGlTo',$,'InstabilityFactors','Defining values: slenderness ratios; defined values: either factors or divisors of the strength, depending on the design method (if <1: factors, if >1: divisors).',.P_TABLEVALUE.,'IfcPositiveRatioMeasure','IfcPositiveRatioMeasure',$,$,$,$,.READWRITE.); +#2542=IFCPROPERTYSETTEMPLATE('1W_181x4P93vGuyWv8qL1v',$,'Pset_MechanicalBeamInPlaneNegative','Properties about Mechanical Beam in Plane Negative.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2543,#2544,#2545,#2546,#2547,#2548,#2549,#2550,#2551,#2552,#2553,#2554,#2555,#2556,#2557,#2558)); +#2543=IFCSIMPLEPROPERTYTEMPLATE('11TndYRF9A2vG3Pb9NjNr4',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2544=IFCSIMPLEPROPERTYTEMPLATE('1vDLe0K4n84x2bATFlsaW7',$,'YoungModulusMin','Elastic modulus, minimal value, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2545=IFCSIMPLEPROPERTYTEMPLATE('3_628eennFThNDoKy27OGE',$,'YoungModulusPerp','Elastic modulus, mean value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2546=IFCSIMPLEPROPERTYTEMPLATE('1L4KayOaDCN8$c4EFrsnNA',$,'YoungModulusPerpMin','Elastic modulus, minimal value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2547=IFCSIMPLEPROPERTYTEMPLATE('0VcGN2OALCcfV5s0ByI7Ol',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2548=IFCSIMPLEPROPERTYTEMPLATE('2LZLqJS797yuSsczMlTjxy',$,'ShearModulusMin','Shear modulus, minimal value.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2549=IFCSIMPLEPROPERTYTEMPLATE('29p$mNSurCS9kTUc9Fo18V',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2550=IFCSIMPLEPROPERTYTEMPLATE('3RUlY5flP1$BHZb_et59h7',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2551=IFCSIMPLEPROPERTYTEMPLATE('3OIsx$Kj96txow_FEVoCn9',$,'TensileStrengthPerp','Tensile strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2552=IFCSIMPLEPROPERTYTEMPLATE('0j4P0n3Q5EEB3Skil_ytVD',$,'CompStrength','Compressive strength, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2553=IFCSIMPLEPROPERTYTEMPLATE('3vigswGS1B$8V$Tw7gU2Az',$,'CompStrengthPerp','Compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2554=IFCSIMPLEPROPERTYTEMPLATE('03RaO9AsXAFABlYrL0cZXT',$,'RaisedCompStrengthPerp','Alternative value for compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\, which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2555=IFCSIMPLEPROPERTYTEMPLATE('00neLXDpf6exrxWUWIk7iF',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2556=IFCSIMPLEPROPERTYTEMPLATE('2ekRpGXljCX85Qrl5j7tMF',$,'TorsionalStrength','Shear strength in torsion.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2557=IFCSIMPLEPROPERTYTEMPLATE('2_N7H4ij50CQwzmSvJrNj8',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2558=IFCSIMPLEPROPERTYTEMPLATE('2fjzRZOeH5zBCMJcFtNyCh',$,'InstabilityFactors','Defining values: slenderness ratios; defined values: either factors or divisors of the strength, depending on the design method (if <1: factors, if >1: divisors).',.P_TABLEVALUE.,'IfcPositiveRatioMeasure','IfcPositiveRatioMeasure',$,$,$,$,.READWRITE.); +#2559=IFCPROPERTYSETTEMPLATE('35s5ZjmJX14vyLRmbEKOah',$,'Pset_MechanicalBeamOutOfPlane','Properties about Mechanical Beam Out Of Plane.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2560,#2561,#2562,#2563,#2564,#2565,#2566,#2567,#2568,#2569,#2570,#2571,#2572,#2573,#2574,#2575)); +#2560=IFCSIMPLEPROPERTYTEMPLATE('2HOGklrmf71vdYX$EyfjDX',$,'YoungModulus','A measure of the Young''s modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2561=IFCSIMPLEPROPERTYTEMPLATE('1F4K$AzsD11OEmF_nIt2_Z',$,'YoungModulusMin','Elastic modulus, minimal value, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2562=IFCSIMPLEPROPERTYTEMPLATE('02FxLQNyP8A8EpeyqQtqnk',$,'YoungModulusPerp','Elastic modulus, mean value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2563=IFCSIMPLEPROPERTYTEMPLATE('3Np_6M3uj0zOWp97_NFpQB',$,'YoungModulusPerpMin','Elastic modulus, minimal value, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2564=IFCSIMPLEPROPERTYTEMPLATE('2dv7d3uYTEnO2ZAdnS31fG',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2565=IFCSIMPLEPROPERTYTEMPLATE('0mH0CxVdz3Jw7RdklmOsnv',$,'ShearModulusMin','Shear modulus, minimal value.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2566=IFCSIMPLEPROPERTYTEMPLATE('1T85oZyAvELuevQ7KcLoDw',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2567=IFCSIMPLEPROPERTYTEMPLATE('2Rcmqb0vf5LRPPEEDbQ8t7',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2568=IFCSIMPLEPROPERTYTEMPLATE('1mZraJCqnBSv87fD7JzCBe',$,'TensileStrengthPerp','Tensile strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2569=IFCSIMPLEPROPERTYTEMPLATE('0H9WkIzaz5LfObPSX4g7xi',$,'CompStrength','Compressive strength, \X2\03B1\X0\=0\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2570=IFCSIMPLEPROPERTYTEMPLATE('1XyA1$cg10d9l1$bnc$xHa',$,'CompStrengthPerp','Compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2571=IFCSIMPLEPROPERTYTEMPLATE('2FpvAzpJzDtQSIaaCwevwT',$,'RaisedCompStrengthPerp','Alternative value for compressive strength, \X2\03B1\X0\=90\X2\00B0\X0\, which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2572=IFCSIMPLEPROPERTYTEMPLATE('1kMcKxh_r53RsBSE07YvqF',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2573=IFCSIMPLEPROPERTYTEMPLATE('0PXnZCEDXESPwZb1LHj2uR',$,'TorsionalStrength','Shear strength in torsion.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2574=IFCSIMPLEPROPERTYTEMPLATE('0EfoakbyP1mBi7R0Iyzrq1',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2575=IFCSIMPLEPROPERTYTEMPLATE('10fU7W61nC3vOwcMK2IOfw',$,'InstabilityFactors','Defining values: slenderness ratios; defined values: either factors or divisors of the strength, depending on the design method (if <1: factors, if >1: divisors).',.P_TABLEVALUE.,'IfcPositiveRatioMeasure','IfcPositiveRatioMeasure',$,$,$,$,.READWRITE.); +#2576=IFCPROPERTYSETTEMPLATE('0wVI7$oY18W8szucUql8nS',$,'Pset_MechanicalFastenerAnchorBolt','Properties common to different types of anchor bolts.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/ANCHORBOLT,IfcMechanicalFastenerType/ANCHORBOLT',(#2577,#2578,#2579,#2580)); +#2577=IFCSIMPLEPROPERTYTEMPLATE('38ZIuHpK9DKh7CXTpTRvai',$,'AnchorBoltLength','The length of the anchor bolt.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2578=IFCSIMPLEPROPERTYTEMPLATE('0M0RW6GkvEBADfwGOs1Rnv',$,'AnchorBoltDiameter','The nominal diameter of the anchor bolt bar(s).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2579=IFCSIMPLEPROPERTYTEMPLATE('1DzaEUjobBceC3p_vyUeuF',$,'AnchorBoltThreadLength','The length of the threaded part of the anchor bolt.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2580=IFCSIMPLEPROPERTYTEMPLATE('2o9kQIEA17U8CwqMozbr4e',$,'AnchorBoltProtrusionLength','The length of the protruding part of the anchor bolt.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2581=IFCPROPERTYSETTEMPLATE('1ZBAa_1bX88h3wHx1SSu2y',$,'Pset_MechanicalFastenerBolt','Properties related to bolt-type fasteners. The properties of a whole set with bolt, washers and nut may be provided. Note, it is usually not necessary to transmit these properties in case of standardized bolts. Instead, the standard is referred to.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/BOLT,IfcMechanicalFastenerType/BOLT',(#2582,#2583,#2584,#2585,#2586,#2587,#2588,#2589)); +#2582=IFCSIMPLEPROPERTYTEMPLATE('1udR1iNkr2ge57rzSLhNtC',$,'ThreadDiameter','Nominal diameter of the thread, if different from the bolt''s overall nominal diameter',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2583=IFCSIMPLEPROPERTYTEMPLATE('0YHCrrWfz8tuRtPtimiLZi',$,'ThreadLength','Nominal length of the thread',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2584=IFCSIMPLEPROPERTYTEMPLATE('3Cr3zyOX9FIwhTNVkirzAJ',$,'NutsCount','Count of nuts to be mounted on one bolt',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2585=IFCSIMPLEPROPERTYTEMPLATE('0WCZLjE856eOMVmxfyVut9',$,'WashersCount','Count of washers to be mounted on one bolt',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2586=IFCSIMPLEPROPERTYTEMPLATE('01OtM_VffCwPcZrFKWKMRN',$,'HeadShape','Shape of the bolt''s head, e.g. ''Hexagon'', ''Countersunk'', ''Cheese''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2587=IFCSIMPLEPROPERTYTEMPLATE('0zzI3axGj0fR6gyP9GIHy_',$,'KeyShape','If applicable, shape of the head''s slot, e.g. ''Slot'', ''Allen''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2588=IFCSIMPLEPROPERTYTEMPLATE('3dA3WMX2z4wQ2YjTcjEOUP',$,'NutShape','Shape of the nut, e.g. ''Hexagon'', ''Cap'', ''Castle'', ''Wing''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2589=IFCSIMPLEPROPERTYTEMPLATE('1rqnmRHFnFteFyMt1KGjfG',$,'WasherShape','Shape of the washers, e.g. ''Standard'', ''Square''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2590=IFCPROPERTYSETTEMPLATE('1fKABPBGP92h5z4Mq9s8tt',$,'Pset_MechanicalFastenerOCSFitting','Common properties of clamps and fittings used in railway overhead contact system (OCS).',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/COUPLER,IfcMechanicalFastenerType/COUPLER',(#2591,#2592)); +#2591=IFCSIMPLEPROPERTYTEMPLATE('1fivOiPdz09hJ_ml33xmmv',$,'ManufacturingTechnology','The method / technology used to produce the equipment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2592=IFCSIMPLEPROPERTYTEMPLATE('0IQHrh9TP3a8uX6USIa5n0',$,'OCSFasteningType','Indicates the type of the overhead contact system (OCS) mechanical fastener.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2593,$,$,$,.READWRITE.); +#2593=IFCPROPERTYENUMERATION('PEnum_OCSFasteningType',(IFCLABEL('EARTHING_FITTING'),IFCLABEL('JOINT_FITTING'),IFCLABEL('REGISTRATION_FITTING'),IFCLABEL('SUPPORT_FITTING'),IFCLABEL('SUSPENSION_FITTING'),IFCLABEL('TENSIONING_FITTING'),IFCLABEL('TERMINATION_FITTING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2594=IFCPROPERTYSETTEMPLATE('064J9m9xT9L8LYVlAoUbBO',$,'Pset_MechanicalFastenerTypeRailFastening','Properties of rail fastening used in railway track system. The property set can be used by the predefined type RAILFASTENING of IfcMechanicalFastener.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/RAILFASTENING,IfcMechanicalFastenerType/RAILFASTENING',(#2595,#2596,#2597)); +#2595=IFCSIMPLEPROPERTYTEMPLATE('3AyN1iOFr6mOZl3ZcrE4QU',$,'TechnicalStandard','The technical standard which the element should comply with.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#2596=IFCSIMPLEPROPERTYTEMPLATE('1OUlFIoMfBOeEjZ0vj_emV',$,'IsReducedResistanceFastening','Indicates whether the rail fastening is a reduced resistance fastening (YES) or not (NO).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2597=IFCSIMPLEPROPERTYTEMPLATE('3pTxJRroL0ZxUk$VrjeApq',$,'TrackFasteningElasticityType','Track fastening elasticity type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2598,$,$,$,.READWRITE.); +#2598=IFCPROPERTYENUMERATION('PEnum_TrackFasteningElasticityType',(IFCLABEL('ELASTIC_FASTENING'),IFCLABEL('RIGID_FASTENING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2599=IFCPROPERTYSETTEMPLATE('0$bna1CDj4_O4KoBiPVE4x',$,'Pset_MechanicalFastenerTypeRailJoint','Properties common to a rail joint of a railway track system. The property set can be used by the predefined type RAILJOINT of IfcMechanicalFastener.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/RAILJOINT,IfcMechanicalFastenerType/RAILJOINT',(#2600,#2602,#2603,#2604,#2605,#2606,#2607,#2608)); +#2600=IFCSIMPLEPROPERTYTEMPLATE('3l0Hz5vnvC5fvAbz5wdbh2',$,'SleeperArrangement','Define the rail joint sleeper method of assembly ("twin sleeper" type or "between sleepers" type).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2601,$,$,$,.READWRITE.); +#2601=IFCPROPERTYENUMERATION('PEnum_SleeperArrangement',(IFCLABEL('BETWEENSLEEPERS'),IFCLABEL('TWINSLEEPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2602=IFCSIMPLEPROPERTYTEMPLATE('2YtCHF9q5EwPM9Rs0eAND_',$,'IsCWRJoint','Indicates if the rail joint is associated to a continuous welded rail.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2603=IFCSIMPLEPROPERTYTEMPLATE('3HdIiUlTPAXerzj0BeIsSR',$,'IsJointInsulated','Indicates if the rail joint is insulated.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2604=IFCSIMPLEPROPERTYTEMPLATE('158kZybFvCtvXDrQ$DYZVx',$,'IsLiftingBracketConnection','Indicates if the connection is between two different heights (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2605=IFCSIMPLEPROPERTYTEMPLATE('2UaX_6Px5DU84h1WYp$ZO0',$,'NumberOfScrews','Number of screws/bolts/connections.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2606=IFCSIMPLEPROPERTYTEMPLATE('0EfIxa4WnANAkzBBRUn076',$,'RailGap','The gap between the rail profiles.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2607=IFCSIMPLEPROPERTYTEMPLATE('1Ti1P3n4f5mxwshdFgl5Sv',$,'IsJointControlEquipment','Indicates whether security equipment is checking the mechanical functionality of the rail joint.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2608=IFCSIMPLEPROPERTYTEMPLATE('3yscZQCa9DgOQmBMThd1gi',$,'AssemblyPlace','Enumeration defining where the assembly is intended to take place, either in a factory, other offsite location or on the building site.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2609,$,$,$,.READWRITE.); +#2609=IFCPROPERTYENUMERATION('PEnum_AssemblyPlace',(IFCLABEL('FACTORY'),IFCLABEL('OFFSITE'),IFCLABEL('SITE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2610=IFCPROPERTYSETTEMPLATE('3_5j8E6KLDPvHL7FtCQ2tn',$,'Pset_MechanicalPanelInPlane','Properties for Mechanical Panels In Plane.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2611,#2612,#2613,#2614,#2615,#2616,#2617,#2618,#2619,#2620,#2621)); +#2611=IFCSIMPLEPROPERTYTEMPLATE('3gY_aBtAn30fESXA2GWz2U',$,'YoungModulusBending','Defining values: \X2\03B1\X0\; defined values: elastic modulus in bending.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); +#2612=IFCSIMPLEPROPERTYTEMPLATE('305HJfxiz3TfoDPxllrkuz',$,'YoungModulusTension','Defining values: \X2\03B1\X0\; defined values: elastic modulus in tension.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); +#2613=IFCSIMPLEPROPERTYTEMPLATE('2pwcujLL58IQXWBmim9QIu',$,'YoungModulusCompression','Elastic modulus in compression.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2614=IFCSIMPLEPROPERTYTEMPLATE('3uOs6qRg5FnuiKOW6lG5Jy',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2615=IFCSIMPLEPROPERTYTEMPLATE('19tIJdEWP18RzKSpqST_Dz',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2616=IFCSIMPLEPROPERTYTEMPLATE('0uR8F70vXAe84loehx2Ogi',$,'CompressiveStrength','The compressive strength of the object or material.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: compressive strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2617=IFCSIMPLEPROPERTYTEMPLATE('0jMUEoJ0zETeObJ3nqn8f4',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2618=IFCSIMPLEPROPERTYTEMPLATE('14UlPugGn1ZBOAY5_rTLAd',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2619=IFCSIMPLEPROPERTYTEMPLATE('1abZy0uzP6_htNv_oyrQ99',$,'BearingStrength','Defining values: \X2\03B1\X0\; defined values: bearing strength of bolt holes, i.e. intrados pressure.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2620=IFCSIMPLEPROPERTYTEMPLATE('28PGHa0FLELuDnZ9tMmXZl',$,'RaisedCompressiveStrength','Alternative value for compressive strength which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2621=IFCSIMPLEPROPERTYTEMPLATE('1fn5VQpR58WRCYk3_gp$3$',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2622=IFCPROPERTYSETTEMPLATE('3YtQrQAb5AIQ72Z24iZcGn',$,'Pset_MechanicalPanelOutOfPlane','Properties for Mechanica lPanels Out Of Plane.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2623,#2624,#2625,#2626,#2627,#2628,#2629,#2630,#2631,#2632,#2633)); +#2623=IFCSIMPLEPROPERTYTEMPLATE('3vtBUxUpz2HxelLdRBUzAB',$,'YoungModulusBending','Defining values: \X2\03B1\X0\; defined values: elastic modulus in bending.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); +#2624=IFCSIMPLEPROPERTYTEMPLATE('3X59ceTuf60wtMbKIxqd_j',$,'YoungModulusTension','Defining values: \X2\03B1\X0\; defined values: elastic modulus in tension.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); +#2625=IFCSIMPLEPROPERTYTEMPLATE('3TkGwRX$P6_Rs0CPGhkOwg',$,'YoungModulusCompression','Elastic modulus in compression.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2626=IFCSIMPLEPROPERTYTEMPLATE('2fb9Lw7X55ZQjIETWmG9hP',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2627=IFCSIMPLEPROPERTYTEMPLATE('3Sw5djkjD59h5Dx$PiSUp3',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2628=IFCSIMPLEPROPERTYTEMPLATE('0rTG9eFaT42x3d2wsDS8Tr',$,'CompressiveStrength','The compressive strength of the object or material.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: compressive strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2629=IFCSIMPLEPROPERTYTEMPLATE('0Pvh9TKG51OwTxvGECY3dA',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2630=IFCSIMPLEPROPERTYTEMPLATE('1V6W5oQan0ofob6mrYTvXv',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2631=IFCSIMPLEPROPERTYTEMPLATE('0S_YZ_BH5BKwmSCeKxwlm0',$,'BearingStrength','Defining values: \X2\03B1\X0\; defined values: bearing strength of bolt holes, i.e. intrados pressure.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2632=IFCSIMPLEPROPERTYTEMPLATE('39oSgrMJ52BfQWy7k9wTmh',$,'RaisedCompressiveStrength','Alternative value for compressive strength which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2633=IFCSIMPLEPROPERTYTEMPLATE('1V$MSK3z53QQWJbIQBzcm9',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2634=IFCPROPERTYSETTEMPLATE('3OqIjRdgf4C8ccm4YTq4YH',$,'Pset_MechanicalPanelOutOfPlaneNegative','Properties for Mechanical Panels Out Of Plane Negative.',.PSET_MATERIALDRIVEN.,'IfcMaterial',(#2635,#2636,#2637,#2638,#2639,#2640,#2641,#2642,#2643,#2644,#2645)); +#2635=IFCSIMPLEPROPERTYTEMPLATE('2Ewi71qSbErO_R7MhzdqSJ',$,'YoungModulusBending','Defining values: \X2\03B1\X0\; defined values: elastic modulus in bending.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); +#2636=IFCSIMPLEPROPERTYTEMPLATE('1ifHNqWsn6aQEYKSbKjkyq',$,'YoungModulusTension','Defining values: \X2\03B1\X0\; defined values: elastic modulus in tension.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcModulusOfElasticityMeasure',$,$,$,$,.READWRITE.); +#2637=IFCSIMPLEPROPERTYTEMPLATE('2OUcmOUATFGxISA0Zh$tJ5',$,'YoungModulusCompression','Elastic modulus in compression.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2638=IFCSIMPLEPROPERTYTEMPLATE('1oGVrw25v8$QIjE3$LpnDs',$,'ShearModulus','A measure of the shear modulus of elasticity of the material.',.P_SINGLEVALUE.,'IfcModulusOfElasticityMeasure',$,$,$,$,$,.READWRITE.); +#2639=IFCSIMPLEPROPERTYTEMPLATE('1rQddTiwb1Rhc2HFwsSGGJ',$,'BendingStrength','Bending strength.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: bending strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2640=IFCSIMPLEPROPERTYTEMPLATE('2I_60Diov0MRH1Ej3Gf4f7',$,'CompressiveStrength','The compressive strength of the object or material.\X2\000A000A\X0\Defining values: \X2\03B1\X0\; defined values: compressive strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2641=IFCSIMPLEPROPERTYTEMPLATE('05XhHGX4zBiuc5jfE428YQ',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2642=IFCSIMPLEPROPERTYTEMPLATE('3Kdw0W3fDBpwwItj$VZHZM',$,'ShearStrength','Defining values: \X2\03B1\X0\; defined values: shear strength.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2643=IFCSIMPLEPROPERTYTEMPLATE('1QSie9mg91wAZxxNlqQIe_',$,'BearingStrength','Defining values: \X2\03B1\X0\; defined values: bearing strength of bolt holes, i.e. intrados pressure.',.P_TABLEVALUE.,'IfcPositivePlaneAngleMeasure','IfcPressureMeasure',$,$,$,$,.READWRITE.); +#2644=IFCSIMPLEPROPERTYTEMPLATE('20ql9BYobCXu4asV9NDGcc',$,'RaisedCompressiveStrength','Alternative value for compressive strength which may be used under material and code dependent conditions (e.g. if deformation is tolerable, or far from ends of the member); conditions should be stated in SELF\\IfcProperty.Description.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2645=IFCSIMPLEPROPERTYTEMPLATE('3c$jacrED1SgR0PsIxeqtp',$,'ReferenceDepth','Depth in bending for which the mechanical properties are valid; provided as a means to check the integrity of material assignment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2646=IFCPROPERTYSETTEMPLATE('3N_yNJDP1ErRBkw2BdO4Ap',$,'Pset_MedicalDeviceTypeCommon','Medical device type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMedicalDevice,IfcMedicalDeviceType',(#2647,#2648)); +#2647=IFCSIMPLEPROPERTYTEMPLATE('2hLjzRk2z03Pikirmf8VJY',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2648=IFCSIMPLEPROPERTYTEMPLATE('2O0nRFNA90MOZ_cvJsettB',$,'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',$,#2649,$,$,$,.READWRITE.); +#2649=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2650=IFCPROPERTYSETTEMPLATE('1zRwD4HyfCo80voOh0UR8M',$,'Pset_MemberCommon','Properties common to the definition of all occurrences of IfcMember.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember,IfcMemberType',(#2651,#2652,#2654,#2655,#2656,#2657,#2658,#2659,#2660)); +#2651=IFCSIMPLEPROPERTYTEMPLATE('31Gfw7zeH0YA4J5Znw3gvE',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2652=IFCSIMPLEPROPERTYTEMPLATE('39Ls3J7q9D7QjMQS9jlC$s',$,'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',$,#2653,$,$,$,.READWRITE.); +#2653=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2654=IFCSIMPLEPROPERTYTEMPLATE('3LTarVkm96OgIinMh43Wrt',$,'Span','Clear span for this object.The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2655=IFCSIMPLEPROPERTYTEMPLATE('01AqpM5ITAexaFTTRTfOgL',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2656=IFCSIMPLEPROPERTYTEMPLATE('2qKye5M$H8y8M8Q7dpj18O',$,'Roll','Rotation against the longitudinal axis.\X2\000A000A\X0\Relative to the global Z direction for all members that are non-vertical in regard to the global coordinate system (Profile direction equals global Z is Roll = 0.)\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.\X2\000A\X0\Note: new property in IFC4.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2657=IFCSIMPLEPROPERTYTEMPLATE('2nbP0XhHz0Pfwm7iGjJqN2',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2658=IFCSIMPLEPROPERTYTEMPLATE('0TFSWvpgbEduoGPrFWzhtC',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#2659=IFCSIMPLEPROPERTYTEMPLATE('0teX2TF8r9RfYV3_D$eVXE',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2660=IFCSIMPLEPROPERTYTEMPLATE('22kVa3vSH1Dg1S8UJV$Ur5',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2661=IFCPROPERTYSETTEMPLATE('2xuKanKyX9DPsELNpFXdHP',$,'Pset_MemberTypeAnchoringBar','Properties of anchoring bar. The anchoring bar is used to connect stay from pole to the foundation.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember/BRACE,IfcMemberType/BRACE',(#2662,#2664)); +#2662=IFCSIMPLEPROPERTYTEMPLATE('1mu88n23v20uflkGioQ28u',$,'MechanicalStressType','Indicates which type of stress is applied to the element.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2663,$,$,$,.READWRITE.); +#2663=IFCPROPERTYENUMERATION('PEnum_MechanicalStressType',(IFCLABEL('MECHANICAL_COMPRESSION'),IFCLABEL('MECHANICAL_TRACTION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2664=IFCSIMPLEPROPERTYTEMPLATE('1cYvrara18wAzyMFGmM7SP',$,'HasLightningRod','Indicates whether the element is equipped with a lightning rod (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2665=IFCPROPERTYSETTEMPLATE('3JY7jQjvr6OPoPd5QMWy5y',$,'Pset_MemberTypeCatenaryStay','Properties of catenary stay used in railway. The property set can be used by the predefined type STAY_CABLE of IfcMember.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember/STAY_CABLE,IfcMemberType/STAY_CABLE',(#2666,#2667,#2668,#2670)); +#2666=IFCSIMPLEPROPERTYTEMPLATE('2e4Pb63An1yBxSRGInQ93r',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#2667=IFCSIMPLEPROPERTYTEMPLATE('0UJK$7b3rDa8XeI1idHWmI',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2668=IFCSIMPLEPROPERTYTEMPLATE('0tWKf_E05EdBSQGBkW2Ae2',$,'CatenaryStayType','Indicates the type of catenary stay used.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2669,$,$,$,.READWRITE.); +#2669=IFCPROPERTYENUMERATION('PEnum_CatenaryStayType',(IFCLABEL('DOUBLE_STAY'),IFCLABEL('SINGLE_STAY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2670=IFCSIMPLEPROPERTYTEMPLATE('0hq8sRXJX6Ogq0ko_Z69Fx',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2671=IFCPROPERTYSETTEMPLATE('1figKRzN97BQzVjBw2FhQK',$,'Pset_MemberTypeOCSRigidSupport','Properties of rigid catenary support used in railway overhead contact system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember/MEMBER,IfcMemberType/MEMBER',(#2672,#2673)); +#2672=IFCSIMPLEPROPERTYTEMPLATE('0RMR8Lfzz3QAsRioOxfhpE',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#2673=IFCSIMPLEPROPERTYTEMPLATE('1gZk15EIX198PeSSFMuJph',$,'ContactWireStagger','Lateral displacement of the contact wire to opposite sides of the track centre at successive supports.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2674=IFCPROPERTYSETTEMPLATE('0W223gdvTDqvhmvJBNsvmV',$,'Pset_MemberTypePost','Properties of a post. A post is a linear (usually vertical) member used to support something or to mark a point.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember/POST,IfcMemberType/POST',(#2675,#2676,#2677,#2678,#2679,#2680)); +#2675=IFCSIMPLEPROPERTYTEMPLATE('3fEukz9k970OzBDN1BzebX',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2676=IFCSIMPLEPROPERTYTEMPLATE('1VoRUlXev9U8f9k7gbOtAP',$,'ConicityRatio','The ratio of the diameter of the cone bottom surface to the height of the pole.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#2677=IFCSIMPLEPROPERTYTEMPLATE('1u4f4Tv$jBLelrux3mUJ6j',$,'LoadBearingCapacity','Maximum load bearing capacity of the floor structure throughtout the storey as designed.',.P_SINGLEVALUE.,'IfcPlanarForceMeasure',$,$,$,$,$,.READWRITE.); +#2678=IFCSIMPLEPROPERTYTEMPLATE('3noG5G6Aj5H9LOG7cKGuZY',$,'WindLoadRating','Wind load resistance rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2679=IFCSIMPLEPROPERTYTEMPLATE('0mI5RAjy17aeMx5Ma55zC8',$,'TorsionalStrength','Shear strength in torsion.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2680=IFCSIMPLEPROPERTYTEMPLATE('3aho$oaxn9DQI9MS8tfX0d',$,'BendingStrength','Bending strength.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2681=IFCPROPERTYSETTEMPLATE('04a9P6BYb88ReEZiPpeHA5',$,'Pset_MemberTypeTieBar','Properties of tie bar. A tie bar is a linear bar element used to secure or stabilise a structure by resisting lateral and longitudinal loading through tension and or compression. usually formed by a solid bar.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember/TIEBAR,IfcMemberType/TIEBAR',(#2682)); +#2682=IFCSIMPLEPROPERTYTEMPLATE('2sKobyTivCHvm3tLPa70_Z',$,'IsTemporaryInstallation','Indicates whether the installation (in the construction stage) is permanent (TRUE) or temporary (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2683=IFCPROPERTYSETTEMPLATE('3UEcxitCb2kQat9LleJt2V',$,'Pset_MobileTelecommunicationsApplianceTypeAccessPoint','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to ACCESSPOINT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/ACCESSPOINT,IfcMobileTelecommunicationsApplianceType/ACCESSPOINT',(#2684,#2685,#2686,#2687,#2688,#2689)); +#2684=IFCSIMPLEPROPERTYTEMPLATE('3PpDKnWQ59pQ8mdtKfu2My',$,'BandWidth','Indicates the bandwidth for telecommunication of the device.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#2685=IFCSIMPLEPROPERTYTEMPLATE('2YYHKoWpPFngxgVN3q3Eik',$,'DataEncryptionType','Indicates the type of security protocols that can be used in the access point to protect the wireless network.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2686=IFCSIMPLEPROPERTYTEMPLATE('3l3sjaWQD6RAteQNBEo5tG',$,'DataExchangeRate','Indicates the data transfer rate of the access point in bit per second (bps).',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); +#2687=IFCSIMPLEPROPERTYTEMPLATE('3xVigWhr1Ebwa8PvJeZxR$',$,'NumberOfAntennas','Indicates the number of antennas integrated in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2688=IFCSIMPLEPROPERTYTEMPLATE('06YmB6I7L5bAgKLPW9IjdL',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2689=IFCSIMPLEPROPERTYTEMPLATE('0vtM4dx8nAU8NbzrewDqNz',$,'UserCapacity','Indicates the user capacity of the device, defined as the maximum number of users that can be active at the same time.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#2690=IFCPROPERTYSETTEMPLATE('1hx6ryp2z52B9VYC2i2Pje',$,'Pset_MobileTelecommunicationsApplianceTypeBasebandUnit','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to BASEBANDUNIT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/BASEBANDUNIT,IfcMobileTelecommunicationsApplianceType/BASEBANDUNIT',(#2691,#2692,#2693,#2694)); +#2691=IFCSIMPLEPROPERTYTEMPLATE('2Go$h48a5Eo9xj5A1dUt7O',$,'NumberOfCarriers','Indicates how many carrier frequencies can be managed by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2692=IFCSIMPLEPROPERTYTEMPLATE('25tA6688v3$9V2hdd48_2t',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2693=IFCSIMPLEPROPERTYTEMPLATE('2YV3a_Ye555eRWOJu3XkJw',$,'NumberOfEmergencyTransceivers','Indicates the number of emergency transceivers in the base band unit.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2694=IFCSIMPLEPROPERTYTEMPLATE('1P8Xbk1W9BMOLcRLnNzVmh',$,'MaximumNumberOfRRUs','Indicates the maximum number of remote radio units (RRU) which can be connected to the baseband unit.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#2695=IFCPROPERTYSETTEMPLATE('1EtoWZOwXFux$mKoFKL2Ni',$,'Pset_MobileTelecommunicationsApplianceTypeBaseTransceiverStation','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to BASETRANSCEIVERSTATION.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/BASETRANSCEIVERSTATION,IfcMobileTelecommunicationsApplianceType/BASETRANSCEIVERSTATION',(#2696,#2697,#2698,#2699,#2700,#2701,#2702,#2703,#2704)); +#2696=IFCSIMPLEPROPERTYTEMPLATE('1lP8ASWuXFThnXU5O_2g51',$,'DownlinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for downlink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#2697=IFCSIMPLEPROPERTYTEMPLATE('2N1QJONoX1SO1djYf3LQdH',$,'NumberOfCarriers','Indicates how many carrier frequencies can be managed by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2698=IFCSIMPLEPROPERTYTEMPLATE('23WB6oI$DDCuiKZgyPCknO',$,'NumberOfAntennas','Indicates the number of antennas integrated in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2699=IFCSIMPLEPROPERTYTEMPLATE('3yy_$cPEr5IO4x85W0n0pv',$,'UplinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for uplink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#2700=IFCSIMPLEPROPERTYTEMPLATE('0uqhfLf4f48RlGocpkowEL',$,'ExchangeCapacity','Indicates how many simultaneous calls the base transceiver station can handle.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#2701=IFCSIMPLEPROPERTYTEMPLATE('1EDQHCreb95QCldnCo3$qg',$,'NumberOfEmergencyTransceivers','Indicates the number of emergency transceivers in the base band unit.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2702=IFCSIMPLEPROPERTYTEMPLATE('2WXARdvSbAbBIAf8i9w0m$',$,'NumberOfTransceiversPerAntenna','Indicates the number of transceivers per antenna.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2703=IFCSIMPLEPROPERTYTEMPLATE('3qTLD915P7dg8iddaww1FW',$,'RadiatedOutputPowerPerAntenna','Indicates the power of radio waves emitted by each antenna of the base transceiver station.',.P_TABLEVALUE.,'IfcLabel','IfcPowerMeasure',$,$,$,$,.READWRITE.); +#2704=IFCSIMPLEPROPERTYTEMPLATE('1G02$XaV56FRhscpBImmNe',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2705=IFCPROPERTYSETTEMPLATE('2ZdITY6YH0GhQB3v_CVzQq',$,'Pset_MobileTelecommunicationsApplianceTypeCommon','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance,IfcMobileTelecommunicationsApplianceType',(#2706,#2707)); +#2706=IFCSIMPLEPROPERTYTEMPLATE('2CtnXwa$X2FxJkRV1eKYee',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2707=IFCSIMPLEPROPERTYTEMPLATE('3oP0Klr_L7YPIexSzbib_F',$,'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',$,#2708,$,$,$,.READWRITE.); +#2708=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2709=IFCPROPERTYSETTEMPLATE('3LBWcyyhn3bPpOQririWZz',$,'Pset_MobileTelecommunicationsApplianceTypeEUtranNodeB','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to E_UTRAN_NODE_B.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/E_UTRAN_NODE_B,IfcMobileTelecommunicationsApplianceType/E_UTRAN_NODE_B',(#2710,#2711,#2712,#2713,#2714,#2715)); +#2710=IFCSIMPLEPROPERTYTEMPLATE('0ND$MyvFf2xxX$kH9GkhSg',$,'DownlinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for downlink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#2711=IFCSIMPLEPROPERTYTEMPLATE('2zpzzdqUv4SgD3xVq40MP6',$,'NumberOfCarriers','Indicates how many carrier frequencies can be managed by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2712=IFCSIMPLEPROPERTYTEMPLATE('3M394Dczr86P$wzgsPzzl_',$,'RadiatedOutputPowerPerAntenna','Indicates the power of radio waves emitted by each antenna of the base transceiver station.',.P_TABLEVALUE.,'IfcLabel','IfcPowerMeasure',$,$,$,$,.READWRITE.); +#2713=IFCSIMPLEPROPERTYTEMPLATE('2eGLWIwyL3QulD8r7w4I5_',$,'NumberOfAntennas','Indicates the number of antennas integrated in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2714=IFCSIMPLEPROPERTYTEMPLATE('3QYqAoU4r5pRuTEm0xEb2Y',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2715=IFCSIMPLEPROPERTYTEMPLATE('3IAATBa3LFMucO1XvfZjUf',$,'UplinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for uplink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#2716=IFCPROPERTYSETTEMPLATE('3AJtGMkdz4LuqnDhfW2N_a',$,'Pset_MobileTelecommunicationsApplianceTypeMasterUnit','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to MASTERUNIT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/MASTERUNIT,IfcMobileTelecommunicationsApplianceType/MASTERUNIT',(#2717,#2718,#2719,#2721,#2722,#2723,#2725)); +#2717=IFCSIMPLEPROPERTYTEMPLATE('3S88h2Th9BcPd$5EN9baEj',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2718=IFCSIMPLEPROPERTYTEMPLATE('1_v9OqpYj72ORedmcCHOKI',$,'MaximumNumberOfConnectedRUs','Indicates the maximum number of remote units (RUs) which can be connected to the master unit.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#2719=IFCSIMPLEPROPERTYTEMPLATE('303dMp3V56KAT07W2wHYNH',$,'TransmissionType','Indicates the data transmission type of the master unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2720,$,$,$,.READWRITE.); +#2720=IFCPROPERTYENUMERATION('PEnum_TransmissionType',(IFCLABEL('FIBER'),IFCLABEL('RADIO'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2721=IFCSIMPLEPROPERTYTEMPLATE('2Va1JZSoL03v5ZnZrLD$dr',$,'TransmittedBandwidth','Indicates the transmitted bandwidth of the master unit.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#2722=IFCSIMPLEPROPERTYTEMPLATE('08xHJ33O18MhbgxxblW1ZX',$,'TransmittedFrequency','Indicates the transmitted frequency used by the master unit.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#2723=IFCSIMPLEPROPERTYTEMPLATE('3$hAcla3b2EwEEQkoT69rW',$,'TransmittedSignal','Indicates the type or standard of signal transmitted by the master unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2724,$,$,$,.READWRITE.); +#2724=IFCPROPERTYENUMERATION('PEnum_TransmittedSignal',(IFCLABEL('CDMA'),IFCLABEL('GSM'),IFCLABEL('LTE'),IFCLABEL('TD_SCDMA'),IFCLABEL('WCDMA'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2725=IFCSIMPLEPROPERTYTEMPLATE('0B2crXWYz5kBBCKaSTqK2o',$,'MasterUnitType','Indicates the master unit type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2726,$,$,$,.READWRITE.); +#2726=IFCPROPERTYENUMERATION('PEnum_MasterUnitType',(IFCLABEL('ANALOG'),IFCLABEL('DIGITAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2727=IFCPROPERTYSETTEMPLATE('32F5VLzrjDUB2FCNG76bP5',$,'Pset_MobileTelecommunicationsApplianceTypeMobileSwitchingCenter','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to MOBILESWITCHINGCENTER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/MOBILESWITCHINGCENTER,IfcMobileTelecommunicationsApplianceType/MOBILESWITCHINGCENTER',(#2728,#2729,#2730)); +#2728=IFCSIMPLEPROPERTYTEMPLATE('39mrGzfUD5nO_uMC2i4Hwy',$,'UserCapacity','Indicates the user capacity of the device, defined as the maximum number of users that can be active at the same time.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#2729=IFCSIMPLEPROPERTYTEMPLATE('0lpkp6Sbr9mwHAjlzy5qvX',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2730=IFCSIMPLEPROPERTYTEMPLATE('3PnjYTU9P6D8IN7KnIIRzY',$,'MaximumNumberOfManagedBSCs','Indicates the maximum number of base station controller (BSC) that can be managed simultaneously by the mobile switching center (MSC).',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#2731=IFCPROPERTYSETTEMPLATE('2YmCtxFw56D8eGea3gtvCv',$,'Pset_MobileTelecommunicationsApplianceTypeMSCServer','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to MSCSERVER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/MSCSERVER,IfcMobileTelecommunicationsApplianceType/MSCSERVER',(#2732,#2733)); +#2732=IFCSIMPLEPROPERTYTEMPLATE('3Axs0ooj9D5ukQ1510MpO5',$,'UserCapacity','Indicates the user capacity of the device, defined as the maximum number of users that can be active at the same time.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#2733=IFCSIMPLEPROPERTYTEMPLATE('1eK8EcRVn3gwN9kWHAvozs',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2734=IFCPROPERTYSETTEMPLATE('2jMOoev6L0tu16yMpJIc9f',$,'Pset_MobileTeleCommunicationsApplianceTypeRemoteRadioUnit','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to REMOTERADIOUNIT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/REMOTERADIOUNIT,IfcMobileTelecommunicationsApplianceType/REMOTERADIOUNIT',(#2735,#2736,#2737,#2738,#2739,#2740,#2741,#2742)); +#2735=IFCSIMPLEPROPERTYTEMPLATE('1akFNmbWjFkveMMk6324aq',$,'DownlinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for downlink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#2736=IFCSIMPLEPROPERTYTEMPLATE('3BRYNUUg5FvQMNOBLWSyxt',$,'NumberOfCarriers','Indicates how many carrier frequencies can be managed by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2737=IFCSIMPLEPROPERTYTEMPLATE('2F9v$_gfr7OORIv3UI7cb3',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2738=IFCSIMPLEPROPERTYTEMPLATE('0xgcnmTaL3qe8NaqEcze_I',$,'UplinkRadioBand','Indicates the frequency range, delimited by a lower frequency and an upper frequency, allocated for uplink transmission.',.P_BOUNDEDVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#2739=IFCSIMPLEPROPERTYTEMPLATE('1dithd9jj1Wvc9dr5cxPf5',$,'NumberOfTransceiversPerAntenna','Indicates the number of transceivers per antenna.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2740=IFCSIMPLEPROPERTYTEMPLATE('3uCVjgrpTDzPgG95CEo2ML',$,'RadiatedOutputPowerPerAntenna','Indicates the power of radio waves emitted by each antenna of the base transceiver station.',.P_TABLEVALUE.,'IfcLabel','IfcPowerMeasure',$,$,$,$,.READWRITE.); +#2741=IFCSIMPLEPROPERTYTEMPLATE('1B01vsbgD1RPDKvzfq7ODS',$,'AntennaType','Indicates the type of antenna.\X2\000A000A\X0\Indicates the type of antenna integrated in the device.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2742=IFCSIMPLEPROPERTYTEMPLATE('1d$nPj4eL2IR9aySe5B3_X',$,'RRUConnectionType','Indicates the connection type between the remote radio unit and baseband unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2743,$,$,$,.READWRITE.); +#2743=IFCPROPERTYENUMERATION('PEnum_UnitConnectionType',(IFCLABEL('CHAIN'),IFCLABEL('MIXED'),IFCLABEL('RING'),IFCLABEL('STAR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2744=IFCPROPERTYSETTEMPLATE('0kGZtjMizDNfP2jx6N6gFk',$,'Pset_MobileTelecommunicationsApplianceTypeRemoteUnit','Properties common to the definition of all occurrences of IfcMobileTelecommunicationsAppliance and types of IfcMobileTelecommunicationsApplianceType with the predefined type set to REMOTEUNIT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMobileTelecommunicationsAppliance/REMOTEUNIT,IfcMobileTelecommunicationsApplianceType/REMOTEUNIT',(#2745,#2746,#2747)); +#2745=IFCSIMPLEPROPERTYTEMPLATE('26S6oKx3HFgwc_FJnZAEEg',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2746=IFCSIMPLEPROPERTYTEMPLATE('1d2nJQ9ff2DAmuDqRaFjch',$,'NumberOfAntennas','Indicates the number of antennas integrated in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2747=IFCSIMPLEPROPERTYTEMPLATE('04EMztP7DFbfeSOjnXN959',$,'RUConnectionType','Indicate the connection type between the remote unit and the master unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2748,$,$,$,.READWRITE.); +#2748=IFCPROPERTYENUMERATION('PEnum_UnitConnectionType',(IFCLABEL('CHAIN'),IFCLABEL('MIXED'),IFCLABEL('RING'),IFCLABEL('STAR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2749=IFCPROPERTYSETTEMPLATE('0V33wUk4b57wSDNTIboH29',$,'Pset_MooringDeviceCommon','Properties common to the definition of all occurrences of IfcMooringDevice and types of IfcMooringDeviceType.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMooringDevice,IfcMooringDeviceType',(#2750,#2752,#2753,#2755,#2756,#2757)); +#2750=IFCSIMPLEPROPERTYTEMPLATE('2lCpcql2X7BO2LGfMdD07n',$,'DeviceType','Mooring device type',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2751,$,$,$,.READWRITE.); +#2751=IFCPROPERTYENUMERATION('PEnum_MooringDeviceType',(IFCLABEL('CLEAT'),IFCLABEL('DOUBLEBUTT'),IFCLABEL('HORN'),IFCLABEL('KIDNEY'),IFCLABEL('PILLAR'),IFCLABEL('RING'),IFCLABEL('SINGLEBUTT'),IFCLABEL('THEAD')),$); +#2752=IFCSIMPLEPROPERTYTEMPLATE('14yQvlYOf4CO9lTQl5l3LR',$,'DeviceCapacity','Mooring device force capacity',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#2753=IFCSIMPLEPROPERTYTEMPLATE('0lBOtuueH0kfWzgbAfdEo8',$,'AnchorageType','Mooring device anchorage type',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2754,$,$,$,.READWRITE.); +#2754=IFCPROPERTYENUMERATION('PEnum_AnchorageType',(IFCLABEL('CASTIN'),IFCLABEL('DRILLEDANDFIXED'),IFCLABEL('THROUGHBOLTED')),$); +#2755=IFCSIMPLEPROPERTYTEMPLATE('34PawIITj4he8a6KmJFw6g',$,'MinumumLineSlope','Minimum allowable line angle in degrees (negative if below horizontal from quay)',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2756=IFCSIMPLEPROPERTYTEMPLATE('0_1JX8ntj3SuVrBJq8FwXp',$,'MaximumLineSlope','Maximum allowable line angle in degrees (negative if below horizontal from quay)',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2757=IFCSIMPLEPROPERTYTEMPLATE('3LoD1Hk1TCCPhR_LVm4cTd',$,'MaximumLineCount','Maximum number of lines that may be secured to the mooring device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2758=IFCPROPERTYSETTEMPLATE('2asyMpZDj4rxxr$q9G5HWk',$,'Pset_MotorConnectionTypeCommon','Common properties for motor connections. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcMotorConnection,IfcMotorConnectionType',(#2759,#2760)); +#2759=IFCSIMPLEPROPERTYTEMPLATE('35gvw6CCLB$hd77rBEA4Nn',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2760=IFCSIMPLEPROPERTYTEMPLATE('2ROZCT3evBEw3E68jviWHd',$,'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',$,#2761,$,$,$,.READWRITE.); +#2761=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2762=IFCPROPERTYSETTEMPLATE('2zH$Q4$X1DDe55eI1y73Ky',$,'Pset_OnSiteCastKerb','Properties for an on site cast kerb.',.PSET_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#2763,#2764)); +#2763=IFCSIMPLEPROPERTYTEMPLATE('1M6jm0lX5AOvBi7q8t9XL9',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2764=IFCSIMPLEPROPERTYTEMPLATE('1Rb2whf3z7xRP85DYiyuhF',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2765=IFCPROPERTYSETTEMPLATE('02$MN5h2z3sBJbkfwLSSdh',$,'Pset_OnSiteTelecomControlUnit','Properties for on-site telecom control unit used for railway.',.PSET_TYPEDRIVENOVERRIDE.,'IfcController,IfcControllerType',(#2766,#2767,#2768,#2769,#2771,#2772,#2773,#2774)); +#2766=IFCSIMPLEPROPERTYTEMPLATE('00w2yZ0XDFUft9YLd3hS0C',$,'HasEarthquakeAlarm','Indicates whether the on-site control unit includes earthquake alarm function.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2767=IFCSIMPLEPROPERTYTEMPLATE('1jqk4qE6HCFvoxuKUOWSXj',$,'HasEarthquakeCollection','Indicates whether the on-site control unit collects earthquake information.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2768=IFCSIMPLEPROPERTYTEMPLATE('3tXDcIw$DEvOYBo7y2UBNw',$,'HasForeignObjectCollection','Indicates whether the on-site control unit collects foreign object information.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2769=IFCSIMPLEPROPERTYTEMPLATE('17ZRsfU3nDnhRZk3ED5g1v',$,'ControllerInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2770,$,$,$,.READWRITE.); +#2770=IFCPROPERTYENUMERATION('PEnum_ControllerInterfaceType',(IFCLABEL('EARTHQUAKERELAYINTERFACE'),IFCLABEL('FOREIGNOBJECTRELAYINTERFACE'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2771=IFCSIMPLEPROPERTYTEMPLATE('3yaK_BCDr55vSCPQUGU9I9',$,'HasOutputFunction','Indicates whether the on-site control unit includes an output function.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2772=IFCSIMPLEPROPERTYTEMPLATE('1Me8D$ROr4mPrpAWlHm936',$,'HasRainCollection','Indicates whether the on-site control unit collects information on rain.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2773=IFCSIMPLEPROPERTYTEMPLATE('0r0TEpiPb2Oud3n$pibHsF',$,'HasSnowCollection','Indicates whether the on-site control unit collects information on snow depth.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2774=IFCSIMPLEPROPERTYTEMPLATE('10YXDYB4n7cwfhgodvF_Gb',$,'HasWindCollection','Indicates whether the on-site control unit collects information on wind.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2775=IFCPROPERTYSETTEMPLATE('3gJkHupDPA5goBtj2B4PQR',$,'Pset_OpeningElementCommon','Properties common to the definition of all instances of IfcOpeningElement.',.PSET_OCCURRENCEDRIVEN.,'IfcOpeningElement',(#2776,#2777,#2779,#2780,#2781,#2782)); +#2776=IFCSIMPLEPROPERTYTEMPLATE('3pDBIuMvD3kA477Q3heC47',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2777=IFCSIMPLEPROPERTYTEMPLATE('0kLkTRNRD6BBsz20Aiqw$f',$,'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',$,#2778,$,$,$,.READWRITE.); +#2778=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2779=IFCSIMPLEPROPERTYTEMPLATE('3x8l6XDnjFMANatCaAQCrH',$,'Purpose','Indication of the purpose of this object\X2\000A000A\X0\E.g. ''ventilation'' or ''access''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2780=IFCSIMPLEPROPERTYTEMPLATE('3CczHyZJv1zRF5ayL9xlRw',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here whether the space (in case of e.g., a corridor) is designed to serve as an exit space, e.g., for fire escape purposes.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2781=IFCSIMPLEPROPERTYTEMPLATE('1qIvvdFqjE59kN7nMHgLbT',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.\X2\000A000A\X0\Requirement for the element filling the opening.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2782=IFCSIMPLEPROPERTYTEMPLATE('3hdGuVtaT4yxWcsIM4BgNX',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).\X2\000A000A\X0\Requirement for the element filling the opening.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2783=IFCPROPERTYSETTEMPLATE('26y566sLHC3vsA8Hlwmy9T',$,'Pset_OpticalAdapter','Properties in this property set are applicable to the transition type of cable fitting. Indicated that such transition is an optical adapter.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting/TRANSITION,IfcCableFittingType/TRANSITION',(#2784)); +#2784=IFCSIMPLEPROPERTYTEMPLATE('37x$77CQfEDvMHaENyIdjA',$,'FiberType','Indicates the type of the single fiber.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2785,$,$,$,.READWRITE.); +#2785=IFCPROPERTYENUMERATION('PEnum_FiberType',(IFCLABEL('BEND_INSENSITIVEFIBER'),IFCLABEL('CUTOFFSHIFTEDFIBER'),IFCLABEL('DISPERSIONSHIFTEDFIBER'),IFCLABEL('LOWWATERPEAKFIBER'),IFCLABEL('NON_ZERODISPERSIONSHIFTEDFIBER'),IFCLABEL('OM1'),IFCLABEL('OM2'),IFCLABEL('OM3'),IFCLABEL('OM4'),IFCLABEL('OM5'),IFCLABEL('STANDARDSINGLEMODEFIBER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2786=IFCPROPERTYSETTEMPLATE('0cSVVmNKb6dvpYsQ0PY93I',$,'Pset_OpticalPigtail','Property set for optical pigtail. This property set is applicable to a type or occurrence of IfcCableSegment with predefined type OPTICALCABLESEGMENT.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/OPTICALCABLESEGMENT,IfcCableSegmentType/OPTICALCABLESEGMENT',(#2787,#2788,#2790)); +#2787=IFCSIMPLEPROPERTYTEMPLATE('23A3k51SPDPvO1R0QDfA9e',$,'JacketColour','Indicates the colour of the cable or fitting jacket.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2788=IFCSIMPLEPROPERTYTEMPLATE('227Q_4i5b1Ge57b2uDOA2R',$,'FiberType','Indicates the type of the single fiber.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2789,$,$,$,.READWRITE.); +#2789=IFCPROPERTYENUMERATION('PEnum_FiberType',(IFCLABEL('BEND_INSENSITIVEFIBER'),IFCLABEL('CUTOFFSHIFTEDFIBER'),IFCLABEL('DISPERSIONSHIFTEDFIBER'),IFCLABEL('LOWWATERPEAKFIBER'),IFCLABEL('NON_ZERODISPERSIONSHIFTEDFIBER'),IFCLABEL('OM1'),IFCLABEL('OM2'),IFCLABEL('OM3'),IFCLABEL('OM4'),IFCLABEL('OM5'),IFCLABEL('STANDARDSINGLEMODEFIBER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2790=IFCSIMPLEPROPERTYTEMPLATE('1ifu9MksH14ufZUIWqvGqN',$,'ConnectorType','Indicates the type of connector.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2791=IFCPROPERTYSETTEMPLATE('0K6sgOax920x_H47JV4MoL',$,'Pset_OpticalSplitter','Properties of optical splitter used in the telecommunication domain. This property set can be used by the predefined type DATA of IfcJunctionBox.',.PSET_TYPEDRIVENOVERRIDE.,'IfcJunctionBox/DATA,IfcJunctionBoxType/DATA',(#2792,#2793,#2795)); +#2792=IFCSIMPLEPROPERTYTEMPLATE('2EnOgk8qX5Iwb5Jt20PS7a',$,'NumberOfBranches','Indicates the number of branches that can be supported by the optical splitter.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2793=IFCSIMPLEPROPERTYTEMPLATE('1LG3ZqYmD5$fGmi6tVYm6i',$,'OpticalSplitterType','Indicates the type of optical splitter, single mode or multi-mode.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2794,$,$,$,.READWRITE.); +#2794=IFCPROPERTYENUMERATION('PEnum_OpticalSplitterType',(IFCLABEL('MULTIMODE'),IFCLABEL('SINGLEMODE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2795=IFCSIMPLEPROPERTYTEMPLATE('3U_YxS7Er7cQgmL_qggUya',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#2796=IFCPROPERTYSETTEMPLATE('0UNgKs3bfCuPpgEXsnGPcr',$,'Pset_OutletTypeCommon','Common properties for different outlet types.',.PSET_TYPEDRIVENOVERRIDE.,'IfcOutlet,IfcOutletType',(#2797,#2798,#2800,#2801)); +#2797=IFCSIMPLEPROPERTYTEMPLATE('1nfcH5SaTAvQpUbKl3sUw9',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2798=IFCSIMPLEPROPERTYTEMPLATE('0WE4LBxE18Px$y8xA1n3Tc',$,'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',$,#2799,$,$,$,.READWRITE.); +#2799=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2800=IFCSIMPLEPROPERTYTEMPLATE('3wlSUWoY58ifJ87NdoQV8S',$,'IsPluggableOutlet','Indication of whether the outlet accepts a loose plug connection (= TRUE) or whether it is directly connected (= FALSE) or whether the form of connection has not yet been determined (= UNKNOWN).',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); +#2801=IFCSIMPLEPROPERTYTEMPLATE('2CJAQTPzz5UwY7T_K_rTHQ',$,'NumberOfSockets','The number of sockets that may be connected. In case of inconsistency, sockets defined on ports take precedence.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2802=IFCPROPERTYSETTEMPLATE('3TgSJlVcvCTO9ZcyGEpoLc',$,'Pset_OutsideDesignCriteria','Outside air conditions used as the basis for calculating thermal loads at peak conditions, as well as the weather data location from which these conditions were obtained. HISTORY: New property set in IFC Release 1.0.',.PSET_OCCURRENCEDRIVEN.,'IfcBuilding',(#2803,#2804,#2805,#2806,#2807,#2808,#2809,#2810,#2811,#2813,#2814)); +#2803=IFCSIMPLEPROPERTYTEMPLATE('2Vsf2czwv4tOIXb5grk3Xg',$,'HeatingDryBulb','Dry bulb temperature for heating design.\X2\000A000A\X0\At outside.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2804=IFCSIMPLEPROPERTYTEMPLATE('0YeqHDm$n4g8Ce2VKDG9Km',$,'HeatingWetBulb','Outside wet bulb temperature for heating design.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2805=IFCSIMPLEPROPERTYTEMPLATE('1mlhWY00r0Vx7ZI6tB1DaP',$,'HeatingDesignDay','The month, day and time that has been selected for the heating design calculations.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); +#2806=IFCSIMPLEPROPERTYTEMPLATE('3_fuOxM8v6iR6MYeOG0hzv',$,'CoolingDryBulb','Dry bulb temperature, usually for for cooling design.\X2\000A000A\X0\Outside dry bulb temperature',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2807=IFCSIMPLEPROPERTYTEMPLATE('1hS1rk9HLBxPwEqdEqYB$P',$,'CoolingWetBulb','Outside wet bulb temperature for cooling design.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2808=IFCSIMPLEPROPERTYTEMPLATE('3_1MnZi794hOaQDcU6wNoR',$,'CoolingDesignDay','The month, day and time that has been selected for the cooling design calculations.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); +#2809=IFCSIMPLEPROPERTYTEMPLATE('1K42byUt98dOEIAZ$GL8Bv',$,'WeatherDataStation','The site weather data station description or reference to the data source from which weather data was obtained for use in calculations.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2810=IFCSIMPLEPROPERTYTEMPLATE('0VPFhwULf8Vvpidsokrb_y',$,'WeatherDataDate','The date for which the weather data was gathered.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); +#2811=IFCSIMPLEPROPERTYTEMPLATE('3YyX7uODL1jPKVbPRLf7Mu',$,'BuildingThermalExposure','The thermal exposure expected by the building based on surrounding site conditions.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2812,$,$,$,.READWRITE.); +#2812=IFCPROPERTYENUMERATION('PEnum_BuildingThermalExposure',(IFCLABEL('HEAVY'),IFCLABEL('LIGHT'),IFCLABEL('MEDIUM'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2813=IFCSIMPLEPROPERTYTEMPLATE('2GMBiOTeL5Tw7LkhVSu1a2',$,'PrevailingWindDirection','The prevailing wind angle direction measured from True North (0 degrees) in a clockwise direction.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2814=IFCSIMPLEPROPERTYTEMPLATE('3kX6L9odLE88UqsUEA7j0z',$,'PrevailingWindVelocity','The design wind velocity coming from the direction specified by the PrevailingWindDirection attribute.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#2815=IFCPROPERTYSETTEMPLATE('0SfL9xann43h3Zc4YwXzPs',$,'Pset_PackingInstructions','Packing instructions are specific instructions relating to the packing that is required for an artifact in the event of a move (or transport).',.PSET_TYPEDRIVENOVERRIDE.,'IfcTask/MOVE,IfcTaskType/MOVE',(#2816,#2818,#2819,#2820)); +#2816=IFCSIMPLEPROPERTYTEMPLATE('0uRQesK_L46Ou$m4pPw9VT',$,'PackingCareType','Identifies the predefined types of care that may be required when handling the artefact during a move where:Fragile: artefact may be broken during a move through careless handling.\X2\000A\X0\HandleWithCare: artefact may be damaged during a move through careless handling.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2817,$,$,$,.READWRITE.); +#2817=IFCPROPERTYENUMERATION('PEnum_PackingCareType',(IFCLABEL('FRAGILE'),IFCLABEL('HANDLEWITHCARE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2818=IFCSIMPLEPROPERTYTEMPLATE('2LwMA1JSH4mh96Z7LENKlE',$,'WrappingMaterial','Special requirements for material used to wrap an artefact.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#2819=IFCSIMPLEPROPERTYTEMPLATE('2vaPbpbHT7rvhuCNvthihW',$,'ContainerMaterial','Special requirements for material used to contain an artefact.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#2820=IFCSIMPLEPROPERTYTEMPLATE('1rprLu1p96wAYNNZeKWMzK',$,'SpecialInstructions','Special instructions.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2821=IFCPROPERTYSETTEMPLATE('3VOVS$Cx5939d4cTFeF0OK',$,'Pset_PatchCordCable','This property set has properties that are applicable to cable segment and optical cable segment, indicated that the cable is a patch cord cable, which is fitted with connectors at both ends, allowing it to be rapidly and conveniently connected to other cables or to distribution panels.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CABLESEGMENT,IfcCableSegment/OPTICALCABLESEGMENT,IfcCableSegmentType/CABLESEGMENT,IfcCableSegmentType/OPTICALCABLESEGMENT',(#2822)); +#2822=IFCSIMPLEPROPERTYTEMPLATE('0CJlbza6HDPhcKq4cC6Ycz',$,'JacketColour','Indicates the colour of the cable or fitting jacket.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2823=IFCPROPERTYSETTEMPLATE('0wIwld$Pv9eRePu5s0BQ2V',$,'Pset_PavementCommon','Describes the common properties and nominal dimensions of pavement.Property use clarification\X2\000A\X0\The nominal thickness of the pavement remains constant with the value from NominalThickness, unless the property NominalThicknessEnd is provided. In which case NominalThickness is the value at the beginning of a transition (usually at the object placement location). e.g. a (road) transition segment where the pavement object''s linear placement along an alignment denotes the beginning location and NominalThicknessEnd is the value at the end as indicated by the property NominalLength. In the case of local placements, it is user defined along which axis lengths and widths are measured.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPavement,IfcPavementType',(#2824,#2825,#2827,#2828,#2829,#2830,#2831,#2832)); +#2824=IFCSIMPLEPROPERTYTEMPLATE('1UV38ckQ92de1Rk5ngKcxR',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2825=IFCSIMPLEPROPERTYTEMPLATE('1QDfho0$T9_w2qT6_TLL0C',$,'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',$,#2826,$,$,$,.READWRITE.); +#2826=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2827=IFCSIMPLEPROPERTYTEMPLATE('2QVHz2NBXAvv3Ib30nbmHK',$,'NominalThicknessEnd','The nominal thickness of the object after a transition from its original value. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2828=IFCSIMPLEPROPERTYTEMPLATE('2o_vyoOkX8mw_TJOjGrRlk',$,'StructuralSlope','The nominal side slope (allowable steepness) of the pavement structure (not including side slope fill) as a positive ratio measure. The slope information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters take precedence. Value is typically less than 1.0 (1:1) but may be greater than that for steeper slopes.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2829=IFCSIMPLEPROPERTYTEMPLATE('0j1zFsd4j7TArGGGrvLoot',$,'StructuralSlopeType','User defined description on the type of slope used for the pavement structure (not including side slope fill) . Examples are "Even" or "Stepped".',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2830=IFCSIMPLEPROPERTYTEMPLATE('0AubfDB_P7cu0XmrQXdpdy',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2831=IFCSIMPLEPROPERTYTEMPLATE('3xf2cGtCr0tA6icHf2QebA',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2832=IFCSIMPLEPROPERTYTEMPLATE('320YMJ9ZbCmhLNi35T9DyX',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2833=IFCPROPERTYSETTEMPLATE('0tyFrC41vEMgCVa0sUpkTs',$,'Pset_PavementMillingCommon','Properties for pavement milling.',.PSET_OCCURRENCEDRIVEN.,'IfcEarthworksCut/PAVEMENTMILLING',(#2834,#2835)); +#2834=IFCSIMPLEPROPERTYTEMPLATE('39qKI7b7DEDPoLofu3kWZQ',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2835=IFCSIMPLEPROPERTYTEMPLATE('0JT4DZ7bf1yAFUDT2YIwsp',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2836=IFCPROPERTYSETTEMPLATE('0BkV8WI1f1mxiZZO9TFBqX',$,'Pset_PavementSurfaceCommon','Properties for a pavement surface.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPavement,IfcPavementType',(#2837,#2838)); +#2837=IFCSIMPLEPROPERTYTEMPLATE('2Qqi7Uohf57Q7cqEDMDD_U',$,'PavementRoughness','An assessment of the functional condition of the pavement surface indicated as an index according to the International Roughness Index (IRI).',.P_SINGLEVALUE.,'IfcNumericMeasure',$,$,$,$,$,.READWRITE.); +#2838=IFCSIMPLEPROPERTYTEMPLATE('2oNnjvXrj8WBhGUPXGh5_3',$,'PavementTexture','Characterization of pavement texture by mean profile depthNOTE Definition according to ISO 13473-1:2019',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2839=IFCPROPERTYSETTEMPLATE('0kmCOaJgv4VxYlNwCO3VaX',$,'Pset_PermeableCoveringProperties','Properties of the permeable covering.HISTORY New property set in IFC4.3.2.0 to replace the entity IfcPermeableCoveringProperties',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor,IfcMember,IfcWindow,IfcDoorType,IfcMemberType,IfcWindowType',(#2840,#2842,#2844,#2845)); +#2840=IFCSIMPLEPROPERTYTEMPLATE('3lh9tXJxPDLBiBEj5Zr9Cg',$,'OperationType','Type of operations. Also used to assign standard symbolic presentations according to national building standards.\X2\000A000A\X0\For a permeable covering, it is the type of permeable covering operations. Also used to assign standard symbolic presentations according to national building standards.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2841,$,$,$,.READWRITE.); +#2841=IFCPROPERTYENUMERATION('PEnum_PermeableCoveringOperationEnum',(IFCLABEL('GRILL'),IFCLABEL('LOUVER'),IFCLABEL('SCREEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2842=IFCSIMPLEPROPERTYTEMPLATE('1bt8sP5RfFVP5fJtTJB6ij',$,'PanelPosition','Position of the panel.\X2\000A000A\X0\For a permeable covering, it is the position of the permeable covering panel within the overall window or door type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2843,$,$,$,.READWRITE.); +#2843=IFCPROPERTYENUMERATION('PEnum_WindowPanelPositionEnum',(IFCLABEL('BOTTOM'),IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('TOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2844=IFCSIMPLEPROPERTYTEMPLATE('3uY5Ray6z2FhxPFcLLkUCb',$,'FrameDepth','The length (or depth) of the frame.\X2\000A000A\X0\For a permeable covering, it is the depth of panel frame (used to include the permeable covering), measured from front face to back face horizontally (i.e. perpendicular to the window or door elevation plane).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2845=IFCSIMPLEPROPERTYTEMPLATE('3Qs9dZnof56Pu82xVL_WXx',$,'FrameThickness','The thickness of the frame.\X2\000A000A\X0\For a permeable covering, it is the width of panel frame (used to include the permeable covering), measured from inside of panel (at permeable covering) to outside of panel (at lining), i.e. parallel to the window or door (elevation) plane.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2846=IFCPROPERTYSETTEMPLATE('3cq_oH3Fr7fPPfSgK3B5Rn',$,'Pset_Permit','A permit is a document that allows permission to gain access to an area or carry out work in a situation where security or other access restrictions apply.\X2\000A\X0\HISTORY: IFC4 EndDate added. PermitType, PermitDuration, StartTime and EndTime are deleted.',.PSET_OCCURRENCEDRIVEN.,'IfcPermit',(#2847,#2848,#2849,#2850)); +#2847=IFCSIMPLEPROPERTYTEMPLATE('1HkbKUe6v6FfR8QHM5bMWV',$,'EscortRequirement','Indicates whether or not an escort is required to accompany persons carrying out a work order at or to/from the place of work (= TRUE) or not (= FALSE).NOTE - There are many instances where escorting is required, particularly in a facility that has a high security rating. Escorting may require that persons are escorted to and from the place of work. Alternatively, it may involve the escort remaining at the place of work at all times.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2848=IFCSIMPLEPROPERTYTEMPLATE('2myWQRXxXE29tc5I5Ilex_',$,'StartDate','Date and time from which the permit becomes valid.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); +#2849=IFCSIMPLEPROPERTYTEMPLATE('1wZMT7TFzEHOnEYhc2WXJ2',$,'EndDate','Date and time at which the permit ceases to be valid.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); +#2850=IFCSIMPLEPROPERTYTEMPLATE('0m32Nr1Nr5WxuRoTV_Wli5',$,'SpecialRequirements','Any additional special requirements that need to be included in the permit to work.NOTE - Additional permit requirements may be imposed according to the nature of the facility at which the work is carried out. For instance, in clean areas, special clothing may be required whilst in corrective institutions, it may be necessary to check in and check out tools that will be used for work as a safety precaution.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2851=IFCPROPERTYSETTEMPLATE('33XVCl1S9DX8iAodaFJbpE',$,'Pset_PileCommon','Properties common to the definition of all occurrences of IfcPile.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPile,IfcPileType',(#2852,#2853,#2855)); +#2852=IFCSIMPLEPROPERTYTEMPLATE('0npqEM3jjDdusV2QHmubqv',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2853=IFCSIMPLEPROPERTYTEMPLATE('1KFGCk4Pb7tBgblyJAm0D7',$,'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',$,#2854,$,$,$,.READWRITE.); +#2854=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2855=IFCSIMPLEPROPERTYTEMPLATE('1no$h$VQn6s91ShidPz0ly',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2856=IFCPROPERTYSETTEMPLATE('3RwL_t0S59YwhRa3Nl6w8R',$,'Pset_PipeConnectionFlanged','This property set is used to define the specifics of a flanged pipe connection used between occurrences of pipe segments and fittings.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeSegment,IfcPipeSegmentType',(#2857,#2858,#2859,#2860,#2861,#2862,#2863,#2864)); +#2857=IFCSIMPLEPROPERTYTEMPLATE('3MnTpb3rb9ggxeHqrlQ0Jl',$,'FlangeTable','Designation of the standard table to which the flange conforms.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2858=IFCSIMPLEPROPERTYTEMPLATE('1lhbJbgDf4RxQgZEhBvuw5',$,'FlangeStandard','Designation of the standard describing the flange table.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2859=IFCSIMPLEPROPERTYTEMPLATE('3nQBbd35XA5BmmmgSUb$Rx',$,'BoreSize','The nominal bore of the pipe flange.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2860=IFCSIMPLEPROPERTYTEMPLATE('2MZWi6X6z3nfgCoNesUYu6',$,'FlangeDiameter','Overall diameter of the flange.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2861=IFCSIMPLEPROPERTYTEMPLATE('2bu1O5YyD0zf1VpB1w6sNz',$,'FlangeThickness','Thickness of the material from which the pipe bend is constructed.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2862=IFCSIMPLEPROPERTYTEMPLATE('2IOWbMvnf4Sw7won8eS5zq',$,'NumberOfBoltholes','Number of boltholes in the flange.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2863=IFCSIMPLEPROPERTYTEMPLATE('1tNQ96Dw5DxApqfPfRPcJl',$,'BoltSize','Size of the bolts securing the flange.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2864=IFCSIMPLEPROPERTYTEMPLATE('1w4cSgZEz8BewjDB7uMzzy',$,'BoltholePitch','Diameter of the circle along which the boltholes are placed.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2865=IFCPROPERTYSETTEMPLATE('1ejz3b_LL5pwDk$yKAi$OP',$,'Pset_PipeFittingOccurrence','Pipe segment occurrence attributes attached to an instance of IfcPipeSegment.',.PSET_OCCURRENCEDRIVEN.,'IfcPipeFitting',(#2866,#2867)); +#2866=IFCSIMPLEPROPERTYTEMPLATE('1U5sfcUQH9aB0FnjhJhHjh',$,'InteriorRoughnessCoefficient','The interior roughness of the material of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2867=IFCSIMPLEPROPERTYTEMPLATE('1IeCX_sFrDSBxoYlDk46gI',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2868=IFCPROPERTYSETTEMPLATE('0418zACrfFiOaVIm$_rlyE',$,'Pset_PipeFittingPHistory','Pipe fitting performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcPipeFitting',(#2869,#2870)); +#2869=IFCSIMPLEPROPERTYTEMPLATE('20HvaaECvA39j2pQQkIfBG',$,'LossCoefficient','Dimensionless loss coefficient used for calculating fluid resistance representing the ratio of total pressure loss to velocity pressure at a referenced cross-section.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2870=IFCSIMPLEPROPERTYTEMPLATE('1aRkjHz5TD7ufHHy5j2pHZ',$,'FlowrateLeakage','Leakage flowrate versus pressure difference.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2871=IFCPROPERTYSETTEMPLATE('35cOaOlffBsBQo1$05wzs7',$,'Pset_PipeFittingTypeCommon','Pipe fitting type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeFitting,IfcPipeFittingType',(#2872,#2873,#2875,#2876,#2877,#2878)); +#2872=IFCSIMPLEPROPERTYTEMPLATE('3ceOHUpab1SBYZJWybPkhQ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2873=IFCSIMPLEPROPERTYTEMPLATE('22NrKmh_r0Owv7pGIfmNUX',$,'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',$,#2874,$,$,$,.READWRITE.); +#2874=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2875=IFCSIMPLEPROPERTYTEMPLATE('0T2kJxywX048aLzjVOr1zM',$,'PressureClass','Nominal pressure rating of the object.\X2\000A000A\X0\The test or rated pressure classification of the fitting.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2876=IFCSIMPLEPROPERTYTEMPLATE('3OLXKoyDbFiBAvs5kb6Bq2',$,'PressureRange','Allowable maximum and minimum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2877=IFCSIMPLEPROPERTYTEMPLATE('37qRFXpA92sP7PrS7NkZD5',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2878=IFCSIMPLEPROPERTYTEMPLATE('26LvdA96b0Mvxnn23MLxgq',$,'FittingLossFactor','A factor that determines the pressure loss due to friction through the fitting.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#2879=IFCPROPERTYSETTEMPLATE('2DdpmBfKH5cuysXs9OYwqb',$,'Pset_PipeSegmentOccurrence','Pipe segment occurrence attributes attached to an instance of IfcPipeSegment.',.PSET_OCCURRENCEDRIVEN.,'IfcPipeSegment',(#2880,#2881,#2882,#2883)); +#2880=IFCSIMPLEPROPERTYTEMPLATE('0p1q84IpzDnAHtzrWrK4qA',$,'InteriorRoughnessCoefficient','The interior roughness of the material of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2881=IFCSIMPLEPROPERTYTEMPLATE('3_vL_LPsb3l9$OnXM0CEHL',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2882=IFCSIMPLEPROPERTYTEMPLATE('36SR1rcMHDWAqBc4ZFthmC',$,'Gradient','The gradient of the pipe segment.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2883=IFCSIMPLEPROPERTYTEMPLATE('3aMumq9EX1dumAdnO2TlHq',$,'InvertElevation','The invert elevation relative to the datum established for the project.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2884=IFCPROPERTYSETTEMPLATE('1fL1gPALnD$96cj$Kjr98j',$,'Pset_PipeSegmentPHistory','Pipe segment performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcPipeSegment',(#2885,#2886)); +#2885=IFCSIMPLEPROPERTYTEMPLATE('1FGfU4kIL6FBqvMJOek90O',$,'LeakageCurve','Leakage versus pressure drop; Leakage = f (pressure).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2886=IFCSIMPLEPROPERTYTEMPLATE('0b7Mp$OIb0lgcNvA2Pq6kK',$,'FluidFlowLeakage','Volumetric leakage flow rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#2887=IFCPROPERTYSETTEMPLATE('0AJyVWxvz2ivByYplm4PgS',$,'Pset_PipeSegmentTypeCommon','Pipe segment type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeSegment,IfcPipeSegmentType',(#2888,#2889,#2891,#2892,#2893,#2894,#2895,#2896,#2897)); +#2888=IFCSIMPLEPROPERTYTEMPLATE('0tKJwtGvj4mupotB9ZahGP',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2889=IFCSIMPLEPROPERTYTEMPLATE('0CFFWCRLrBdwpzZb$45SNN',$,'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',$,#2890,$,$,$,.READWRITE.); +#2890=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2891=IFCSIMPLEPROPERTYTEMPLATE('0GCByH1VXFqPMw_tRwbc5W',$,'WorkingPressure','Working pressure.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2892=IFCSIMPLEPROPERTYTEMPLATE('16Hagjp4T1nwhEza7jcVxH',$,'PressureRange','Allowable maximum and minimum working pressure (relative to ambient pressure).',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2893=IFCSIMPLEPROPERTYTEMPLATE('38BaPWWcbBLwcg27PhRcBF',$,'TemperatureRange','Allowable maximum and minimum temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#2894=IFCSIMPLEPROPERTYTEMPLATE('0bRkZ1L1PEpRWXN30jpxGO',$,'NominalDiameter','Nominal diameter or width of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2895=IFCSIMPLEPROPERTYTEMPLATE('0qRHaLl3D1A87qOdFcRu8z',$,'InnerDiameter','The actual inner diameter of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2896=IFCSIMPLEPROPERTYTEMPLATE('3GuG69K$L4D8x1TTg6lK9O',$,'OuterDiameter','The actual outer diameter of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2897=IFCSIMPLEPROPERTYTEMPLATE('0wEDLoJXvFUBme6jKXYdK6',$,'Length','The length of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2898=IFCPROPERTYSETTEMPLATE('3omFtXMOT5vudQRSX_qXR$',$,'Pset_PipeSegmentTypeCulvert','Covered channel or large pipe that forms a watercourse below ground level, usually under a road or railway (BS6100).',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeSegment/CULVERT,IfcPipeSegmentType/CULVERT',(#2899,#2900)); +#2899=IFCSIMPLEPROPERTYTEMPLATE('2ZUu4IozPC1Odj0buhDdDv',$,'InternalWidth','The internal width of the culvert.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2900=IFCSIMPLEPROPERTYTEMPLATE('0E2SnGpe1DBRYNFNEzQmwL',$,'ClearDepth','The clear depth.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2901=IFCPROPERTYSETTEMPLATE('0oju1mO$f3xApV3Q02_1C0',$,'Pset_PipeSegmentTypeGutter','Gutter segment type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPipeSegment/GUTTER,IfcPipeSegmentType/GUTTER',(#2902,#2903,#2904,#2906,#2907,#2908)); +#2902=IFCSIMPLEPROPERTYTEMPLATE('25BfmOQlXCKfDFwewDHSdE',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.\X2\000A000A\X0\Angle of the gutter to allow for drainage.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2903=IFCSIMPLEPROPERTYTEMPLATE('3wRfyhKVbBjBKSSkHP8OJ2',$,'FlowRating','Actual flow capacity for the gutter. Value of 0.00 means this value has not been set.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#2904=IFCSIMPLEPROPERTYTEMPLATE('1Hy0qCyov9seFFhc73jAxD',$,'Complementaryfunction','Indicates the complementary function of the drain channel.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2905,$,$,$,.READWRITE.); +#2905=IFCPROPERTYENUMERATION('PEnum_ComplementaryWorks',(IFCLABEL('DISPERSING_WELLS'),IFCLABEL('LIFTING_WATER_WELLS'),IFCLABEL('TRANSVERSAL_WATER_REMOVAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('NOTDEFINED')),$); +#2906=IFCSIMPLEPROPERTYTEMPLATE('3O2VEzYLLAO9Yz3FvUlsCq',$,'OrthometricHeight','The orthometric height is the vertical distance H along the plumb line from a point of interest to a reference surface known as the geoid, the vertical datum that approximates mean sea level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#2907=IFCSIMPLEPROPERTYTEMPLATE('0KH9i5t_LE3fyV0KZndzfy',$,'IsCovered','This property defines if the drain channel has a cover (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2908=IFCSIMPLEPROPERTYTEMPLATE('0hAsR7Xtj9zf5ahLzLjkXy',$,'IsMonitored','This property defines if the Drain Channel is monitored (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2909=IFCPROPERTYSETTEMPLATE('02i_efQgDFP9DHAFtNlUGj',$,'Pset_PlateCommon','Properties common to the definition of all occurrences of IfcPlate.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPlate,IfcPlateType',(#2910,#2911,#2913,#2914,#2915,#2916,#2917)); +#2910=IFCSIMPLEPROPERTYTEMPLATE('3vbc4dSZv5n9YnsSGLGvge',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2911=IFCSIMPLEPROPERTYTEMPLATE('0OzQM$T41F49g$pOl9LxVN',$,'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',$,#2912,$,$,$,.READWRITE.); +#2912=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2913=IFCSIMPLEPROPERTYTEMPLATE('1YmRkioy1B$gSXJPlU5Cbt',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2914=IFCSIMPLEPROPERTYTEMPLATE('37f0NqE_vCGvRPOv5uf8lw',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2915=IFCSIMPLEPROPERTYTEMPLATE('3zs_ESpcX9e9Rox8EM27mw',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#2916=IFCSIMPLEPROPERTYTEMPLATE('0sfnEEFU10I9c7f108w6$0',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2917=IFCSIMPLEPROPERTYTEMPLATE('0NXneVU3z9jfprx3QwzwO3',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2918=IFCPROPERTYSETTEMPLATE('2DyiGSdo95xfDxq5iTvHip',$,'Pset_PointMachine','Properties of point machine used in railway. The property set can be used by IfcActuator with predefined type set to ELECTRICACTUATOR, HYDRAULICACTUATOR, HANDOPERATEDACTUATOR, or PNEUMATICACTUATOR, indicated that such actuator is a point machine that can switch and lock the track turnout.',.PSET_TYPEDRIVENOVERRIDE.,'IfcActuator/ELECTRICACTUATOR,IfcActuator/HANDOPERATEDACTUATOR,IfcActuator/HYDRAULICACTUATOR,IfcActuator/PNEUMATICACTUATOR,IfcActuatorType/ELECTRICACTUATOR,IfcActuatorType/HANDOPERATEDACTUATOR,IfcActuatorType/HYDRAULICACTUATOR,IfcActuatorType/PNEUMATICACTUATOR',(#2919,#2920,#2921,#2922,#2923,#2924,#2925,#2926,#2927)); +#2919=IFCSIMPLEPROPERTYTEMPLATE('3Vw7Rk95f8zf4sxw$r37vh',$,'ActionBarMovementLength','The movement of the bar that pulls the point of a turnout.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2920=IFCSIMPLEPROPERTYTEMPLATE('0c3_vif$f2NA_8pQ5TbmvT',$,'TractionForce','Traction force of the point machine in turnout conversion.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#2921=IFCSIMPLEPROPERTYTEMPLATE('1L4eEkQWH9sBC3yF17HP4S',$,'ConversionTime','Turnout conversion completion time.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#2922=IFCSIMPLEPROPERTYTEMPLATE('1haiTE5rn8WPlsZIbKWcbK',$,'LockingForce','Locking force of the point machine motor.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#2923=IFCSIMPLEPROPERTYTEMPLATE('1S5$9nfEH7rhKG$vtwNbOz',$,'HasLockInside','Indicates whether the locking is inside (TRUE) or outside (FALSE) of the point machine.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#2924=IFCSIMPLEPROPERTYTEMPLATE('3ZQ$C$m0TB7epKl6s5pbZb',$,'MarkingRodMovementLength','The length of the movement bar which indicates the turnout position.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2925=IFCSIMPLEPROPERTYTEMPLATE('15zEkMHzL6qRXf0gVtoWtX',$,'MaximumOperatingTime','The maximum duration of the turnout movement before the interlocking turns to out of control status.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#2926=IFCSIMPLEPROPERTYTEMPLATE('1d6OUvhbz3lg5syFuoiYfk',$,'MinimumOperatingSpeed','Minimum operating speed of the point machine.',.P_SINGLEVALUE.,'IfcAngularVelocityMeasure',$,$,$,$,$,.READWRITE.); +#2927=IFCSIMPLEPROPERTYTEMPLATE('035q$gfGr8pAXU6y2eU0SC',$,'Current','The actual current and operable range.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#2928=IFCPROPERTYSETTEMPLATE('0BHZp6GjvBaP0XO5nnue8R',$,'Pset_PowerControlSystem','Properties of power control system. The property set can be used by the predefined type ELECTRICAL of IfcDistributionSystem. The property set can be used to characterize the system that controls the railway energy network.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem/ELECTRICAL',(#2929)); +#2929=IFCSIMPLEPROPERTYTEMPLATE('1QJeO_EwjEXOpiWGST0_sa',$,'AssemblyInstruction','Instructions to describe how the system / equipment / facility is assembled.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#2930=IFCPROPERTYSETTEMPLATE('2_14cagqLFGuvkEzauuKD3',$,'Pset_PrecastConcreteElementFabrication','Production and manufacturing related properties common to different types of precast concrete elements. The Pset applies to manufactured pieces. It can be used by a number of subtypes of IfcBuiltElement. If the precast concrete ele',.PSET_TYPEDRIVENOVERRIDE.,'IfcBeam,IfcBuildingElementProxy,IfcChimney,IfcCivilElement,IfcColumn,IfcFooting,IfcMember,IfcPile,IfcPlate,IfcRampFlight,IfcRamp,IfcRoof,IfcSlab,IfcStairFlight,IfcStair,IfcWall,IfcBeamType,IfcBuildingElementProxyType,IfcChimneyType,IfcCivilElementType,IfcColumnType,IfcFootingType,IfcMemberType,IfcPileType,IfcPlateType,IfcRampFlightType,IfcRampType,IfcRoofType,IfcSlabType,IfcStairFlightType,IfcStairType,IfcWallType',(#2931,#2932,#2933,#2934,#2935,#2936,#2937)); +#2931=IFCSIMPLEPROPERTYTEMPLATE('1rQG6NNgj3Ku50rcERu5cT',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2932=IFCSIMPLEPROPERTYTEMPLATE('14iXbtW$PFtf3tG5gyqiaa',$,'ProductionLotId','The manufacturer''s production lot identifier.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2933=IFCSIMPLEPROPERTYTEMPLATE('3jsJphCljBLOayYrcvNhCq',$,'SerialNumber','The manufacturer''s serial number assigned to an occurrence of a product.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#2934=IFCSIMPLEPROPERTYTEMPLATE('3WepZGOe9CaeXSiZh4Fkyr',$,'PieceMark','Defines a unique piece for production purposes. All pieces with the same piece mark value are identical and interchangeable. The piece mark may be composed of sub-parts that have specific locally defined meaning (e.g. B-1A may denote a beam, of generic type \X2\2018\X0\1\X2\2019\X0\ and specific shape \X2\2018\X0\A\X2\2019\X0\).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2935=IFCSIMPLEPROPERTYTEMPLATE('01b2_ebD57weCVcdj1Zjck',$,'AsBuiltLocationNumber','Defines a unique location within a structure, the \X2\2018\X0\slot\X2\2019\X0\ into which the piece was installed. Where pieces share the same piece mark, they can be interchanged. The value is only known after erection.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2936=IFCSIMPLEPROPERTYTEMPLATE('02IYqwOXf85fzzAIsj0iFo',$,'ActualProductionDate','Production date (stripped from form).',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); +#2937=IFCSIMPLEPROPERTYTEMPLATE('2rUDirMUbDBOBFNQjNQNRG',$,'ActualErectionDate','Date erected.',.P_SINGLEVALUE.,'IfcDateTime',$,$,$,$,$,.READWRITE.); +#2938=IFCPROPERTYSETTEMPLATE('23kocPHov4SR3NeJsUVHfK',$,'Pset_PrecastConcreteElementGeneral','Production and manufacturing related properties common to different types of precast concrete elements. The Pset can be used by a number of subtypes of IfcBuiltElement. If the precast concrete element is a sandwich wall panel each structural layer or shell represented by an IfcBuildingElementPart may be attached to a separate Pset of this type, if needed. Some of the properties apply only for specific types of precast concrete elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBeam,IfcBuildingElementProxy,IfcChimney,IfcCivilElement,IfcColumn,IfcFooting,IfcMember,IfcPile,IfcPlate,IfcRampFlight,IfcRamp,IfcRoof,IfcSlab,IfcStairFlight,IfcStair,IfcWall,IfcBeamType,IfcBuildingElementProxyType,IfcChimneyType,IfcCivilElementType,IfcColumnType,IfcFootingType,IfcMemberType,IfcPileType,IfcPlateType,IfcRampFlightType,IfcRampType,IfcRoofType,IfcSlabType,IfcStairFlightType,IfcStairType,IfcWallType',(#2939,#2940,#2941,#2942,#2943,#2944,#2945,#2946,#2947,#2948,#2949,#2950,#2951,#2952,#2953,#2954,#2955,#2956,#2957,#2958)); +#2939=IFCSIMPLEPROPERTYTEMPLATE('1zXSHyAEnDaOrqq3KIcvxH',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2940=IFCSIMPLEPROPERTYTEMPLATE('1fC820PV1C2hobIaLPZxr2',$,'CornerChamfer','The chamfer in the corners of the precast element. The chamfer is presumed to be equal in both directions.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2941=IFCSIMPLEPROPERTYTEMPLATE('28WCdqpvvBZ9cdR8iNn6jt',$,'ManufacturingToleranceClass','Classification designation of the manufacturing tolerances according to local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2942=IFCSIMPLEPROPERTYTEMPLATE('11VZujYDP0yRTFP$iyhoVZ',$,'FormStrippingStrength','The minimum required compressive strength of the concrete at form stripping time.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2943=IFCSIMPLEPROPERTYTEMPLATE('1SRl_o8RLEmhYzqwlSj0BY',$,'LiftingStrength','The minimum required compressive strength of the concrete when the concrete element is lifted.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2944=IFCSIMPLEPROPERTYTEMPLATE('04SsIVbH9FK82hdm1WEUuu',$,'ReleaseStrength','The minimum required compressive strength of the concrete when the tendon stress is released. This property applies to prestressed concrete elements only.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2945=IFCSIMPLEPROPERTYTEMPLATE('2zwXe_V7n6mRPXKqzBdWrs',$,'MinimumAllowableSupportLength','The minimum allowable support length.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2946=IFCSIMPLEPROPERTYTEMPLATE('2KrohKpzv18h3NWmAYsgC8',$,'InitialTension','The initial stress of the tendon. This property applies to prestressed concrete elements only.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2947=IFCSIMPLEPROPERTYTEMPLATE('0dbPixVVrCsxGokqP4Lpps',$,'TendonRelaxation','The maximum allowable relaxation of the tendon (usually expressed as %/1000 h).This property applies to prestressed concrete elements only.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#2948=IFCSIMPLEPROPERTYTEMPLATE('3OVGwN72b2DOSyh2V_qvAP',$,'TransportationStrength','The minimum required compressive strength of the concrete required for transportation.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#2949=IFCSIMPLEPROPERTYTEMPLATE('3sqB8lUDvFuQlG0ji1p3kp',$,'SupportDuringTransportDescription','Textual description of how the concrete element is supported during transportation.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#2950=IFCSIMPLEPROPERTYTEMPLATE('2vNsKhAyD5HxRN6vZ0I19l',$,'SupportDuringTransportDocReference','Reference to an external document defining how the concrete element is supported during transportation.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#2951=IFCSIMPLEPROPERTYTEMPLATE('2a1MgIGPzB5QVbKMYE3gSP',$,'HollowCorePlugging','A descriptive label for how the hollow core ends are treated: they may be left open, closed with a plug, or sealed with cast concrete. Values would be, for example: ''Unplugged'', ''Plugged'', ''SealedWithConcrete''. This property applies to hollow core slabs only.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2952=IFCSIMPLEPROPERTYTEMPLATE('2QnB_rt$vBC9OcdQ7PzBDp',$,'CamberAtMidspan','The camber deflection, measured from the midpoint of a cambered face of a piece to the midpoint of the chord joining the ends of the same face, as shown in the figure below, divided by the original (nominal) straight length of the face of the piece.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#2953=IFCSIMPLEPROPERTYTEMPLATE('0FS2czwOT1YfKjxFPkV_NG',$,'BatterAtStart','The angle, in radians, by which the formwork at the starting face of a piece is to be rotated from the vertical in order to compensate for the rotation of the face that will occur once the piece is stripped from its form, inducing camber due to eccentric prestressing.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2954=IFCSIMPLEPROPERTYTEMPLATE('2hnY_MIu53k8NIu1BW44aD',$,'BatterAtEnd','The angle, in radians, by which the formwork at the ending face of a piece is to be rotated from the vertical in order to compensate for the rotation of the face that will occur once the piece is stripped from its form, inducing camber due to eccentric prestressing.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2955=IFCSIMPLEPROPERTYTEMPLATE('3Ym$WhJPXCgf7f_eyZzsuG',$,'Twisting','The angle, in radians, through which the end face of a precast piece is rotated with respect to its starting face, along its longitudinal axis, as a result of non-aligned supports. This measure is also termed the \X2\2018\X0\warping\X2\2019\X0\ angle.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2956=IFCSIMPLEPROPERTYTEMPLATE('2CO70oYUD23PyRm9VFoJ1X',$,'Shortening','The ratio of the distance by which a precast piece is shortened after release from its form (due to compression induced by prestressing) to its original (nominal) length.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#2957=IFCSIMPLEPROPERTYTEMPLATE('2LuNPJz_r2TQF04zhmAppy',$,'PieceMark','Defines a unique piece for production purposes. All pieces with the same piece mark value are identical and interchangeable. The piece mark may be composed of sub-parts that have specific locally defined meaning (e.g. B-1A may denote a beam, of generic type \X2\2018\X0\1\X2\2019\X0\ and specific shape \X2\2018\X0\A\X2\2019\X0\).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2958=IFCSIMPLEPROPERTYTEMPLATE('3BmOgQOinEMgvPQhW3IK8G',$,'DesignLocationNumber','Defines a unique location within a structure, the \X2\2018\X0\slot\X2\2019\X0\ for which the piece was designed.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2959=IFCPROPERTYSETTEMPLATE('0mCPLvA7X2rAPq0B9KQjZh',$,'Pset_PrecastKerbStone','Properties for precast kerb stone.',.PSET_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#2960,#2961,#2962,#2963)); +#2960=IFCSIMPLEPROPERTYTEMPLATE('1mONsE0eDA$Bd_Io6g$4Gu',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2961=IFCSIMPLEPROPERTYTEMPLATE('1Yywmgyjb948OPDgJ1mlB9',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2962=IFCSIMPLEPROPERTYTEMPLATE('3zHH0setP8jAXlOUvivRZA',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2963=IFCSIMPLEPROPERTYTEMPLATE('26F$hVle5819pf6Rm039Vk',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2964=IFCPROPERTYSETTEMPLATE('0blcIVYsnFzw4Io7hIVjWd',$,'Pset_PrecastSlab','Layout and component information defining how prestressed slab components are laid out in a precast slab assembly. The values are global defaults for the slab as a whole, but can be overridden by local placements of the individual com',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab,IfcSlabType',(#2965,#2966,#2967,#2968,#2969,#2970,#2971,#2972)); +#2965=IFCSIMPLEPROPERTYTEMPLATE('1zdh$IxYD8vxj5f$eV_0Vu',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2966=IFCSIMPLEPROPERTYTEMPLATE('3j3olrvOnANA7FvLqccNFY',$,'ToppingType','Defines if a topping is applied and what kind. Values are \X2\201C\X0\Full topping\X2\201D\X0\, \X2\201C\X0\Perimeter Wash\X2\201D\X0\, \X2\201C\X0\None\X2\201D\X0\',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2967=IFCSIMPLEPROPERTYTEMPLATE('3pHyQ187XACPzlSA8FrnvK',$,'EdgeDistanceToFirstAxis','The distance from the left (\X2\2018\X0\West\X2\2019\X0\) edge of the slab (in the direction of span of the components) to the axis of the first component.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2968=IFCSIMPLEPROPERTYTEMPLATE('3FXcu_hwHDhepiEHRGhHgN',$,'DistanceBetweenComponentAxes','The distance between the axes of the components, measured along the \X2\2018\X0\South\X2\2019\X0\ edge of the slab.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2969=IFCSIMPLEPROPERTYTEMPLATE('3wjCFKNM19VhBzJKaU1JFv',$,'AngleToFirstAxis','The angle of rotation of the axis of the first component relative to the \X2\2018\X0\West\X2\2019\X0\ edge of the slab.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2970=IFCSIMPLEPROPERTYTEMPLATE('0bv5uWp$z2_grYkNSnOJVt',$,'AngleBetweenComponentAxes','The angle between the axes of each pair of components.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#2971=IFCSIMPLEPROPERTYTEMPLATE('0hLwJ_ADP8$PH8BCO2tUy0',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2972=IFCSIMPLEPROPERTYTEMPLATE('0V2XOvD0v1tgrKmXPZPmxK',$,'NominalToppingThickness','The nominal thickness of the topping.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2973=IFCPROPERTYSETTEMPLATE('3VOWzqt$PFqQk8lrI_I92l',$,'Pset_ProcessCapacity','Property set for the application of process data to spatial elements and transport assets',.PSET_TYPEDRIVENOVERRIDE.,'IfcBuiltSystem,IfcDistributionSystem,IfcDoor,IfcSpace,IfcTransportationDevice,IfcZone,IfcDoorType,IfcSpaceType,IfcTransportationDeviceType',(#2974,#2976,#2977,#2978,#2979)); +#2974=IFCSIMPLEPROPERTYTEMPLATE('3Mr1uD0trDUAZTMQ_gr_zA',$,'ProcessItem','The type of item (and its measurement method) being modelled within a process. This can be cargo, passengers or vehicles that pass through the system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#2975,$,$,$,.READWRITE.); +#2975=IFCPROPERTYENUMERATION('PEnum_ProcessItem',(IFCLABEL('BARREL'),IFCLABEL('CGT'),IFCLABEL('PASSENGER'),IFCLABEL('TEU'),IFCLABEL('TONNE'),IFCLABEL('VEHICLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#2976=IFCSIMPLEPROPERTYTEMPLATE('0i00UIoVj13B0955pxuSAV',$,'ProcessCapacity','The number of units that can be processed in the time defined in ProcessPerformance',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#2977=IFCSIMPLEPROPERTYTEMPLATE('2_Pp2AdwHDguIxtxgGEdiP',$,'ProcessPerformance','Minimum time to accept or dispatch the entire item capacity.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#2978=IFCSIMPLEPROPERTYTEMPLATE('2Bq55z7g92jgGq590GCF_i',$,'DownstreamConnections','Names of downstream connected equipment and spaces, if not otherwise represented',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2979=IFCSIMPLEPROPERTYTEMPLATE('3Pb0aP5zX4HPg9_sem9o4t',$,'UpstreamConnections','Names of upstream connected equipment and spaces, if not otherwise represented',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#2980=IFCPROPERTYSETTEMPLATE('2dAr26LZ9AsvaUNoWWsn_o',$,'Pset_ProfileArbitraryDoubleT','This is a collection of geometric properties of double-T section profiles of precast concrete elements, to be used in conjunction with IfcArbitraryClosedProfileDef when profile designation alone does not fulfill the information requirements.',.PSET_PROFILEDRIVEN.,'IfcArbitraryClosedProfileDef',(#2981,#2982,#2983,#2984,#2985,#2986,#2987,#2988,#2989,#2990,#2991,#2992,#2993,#2994,#2995)); +#2981=IFCSIMPLEPROPERTYTEMPLATE('1PoJHbS$51FAuyw0sn9l82',$,'OverallWidth','Overall width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2982=IFCSIMPLEPROPERTYTEMPLATE('2UqB5l6M99zhgV0S$Bipge',$,'LeftFlangeWidth','Left flange width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2983=IFCSIMPLEPROPERTYTEMPLATE('30JJXo$519WA9R0mGAxfOm',$,'RightFlangeWidth','Right flange width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2984=IFCSIMPLEPROPERTYTEMPLATE('3gjlaD43n1xeK07aTXTrtW',$,'OverallDepth','Overall depth of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2985=IFCSIMPLEPROPERTYTEMPLATE('379Oriog94yv6R2793gXiH',$,'FlangeDepth','Flange depth of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2986=IFCSIMPLEPROPERTYTEMPLATE('3arHFutXj0e9S8NZJdslEt',$,'FlangeDraft','Flange draft of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2987=IFCSIMPLEPROPERTYTEMPLATE('1ee$EDElH948g0bDi_z5_V',$,'FlangeChamfer','Flange chamfer of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2988=IFCSIMPLEPROPERTYTEMPLATE('0KobIMUJT0wP5z9tRTFUOW',$,'FlangeBaseFillet','Flange base fillet of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2989=IFCSIMPLEPROPERTYTEMPLATE('1Wx3sdP1r94et1UGwdHx6U',$,'FlangeTopFillet','Flange top fillet of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2990=IFCSIMPLEPROPERTYTEMPLATE('0T32NyNifFygEZl$7yHHIT',$,'StemBaseWidth','Stem base width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2991=IFCSIMPLEPROPERTYTEMPLATE('0vXeZGXdvFMgOgz6wT0REL',$,'StemTopWidth','Stem top width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2992=IFCSIMPLEPROPERTYTEMPLATE('2TM5P557TDpwodBj0yAuAw',$,'StemBaseChamfer','Stem base chamfer of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2993=IFCSIMPLEPROPERTYTEMPLATE('2r$ft0HmTF39OiUnr6sITs',$,'StemTopChamfer','Stem top chamfer of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2994=IFCSIMPLEPROPERTYTEMPLATE('0ybNz_Dnf3zBKqxTDMEkhL',$,'StemBaseFillet','Stem base fillet of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2995=IFCSIMPLEPROPERTYTEMPLATE('2sthGqZMT0seevehfguMB7',$,'StemTopFillet','Stem top fillet of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#2996=IFCPROPERTYSETTEMPLATE('37uuCegwHDB9MT4t74dPIE',$,'Pset_ProfileArbitraryHollowCore','This is a collection of geometric properties of hollow core section profiles of precast concrete elements, to be used in conjunction with IfcArbitraryProfileDefWithVoids when profile designation alone does not fulfill the information requirements.In all cases, the cores are symmetrically distributed on either side of the plank center line, irrespective of whether the number of cores is odd or even. For planks with a center core with different geometry to that of the other cores, provide the property CenterCoreSpacing. When the number of cores is even, no Center Core properties shall be asserted.Key chamfers and draft chamfer are all 45 degree chamfers.The CoreTopRadius and CoreBaseRadius parameters can be derived and are therefore not listed in the property set. They are shown to define that the curves are arcs. The parameters for the center core are the same as above, but with the prefix "Center".',.PSET_PROFILEDRIVEN.,'IfcArbitraryProfileDefWithVoids',(#2997,#2998,#2999,#3000,#3001,#3002,#3003,#3004,#3005,#3006,#3007,#3008,#3009,#3010,#3011,#3012,#3013,#3014,#3015,#3016,#3017,#3018,#3019)); +#2997=IFCSIMPLEPROPERTYTEMPLATE('3sGygQnm94k9BLLmydTqcc',$,'OverallWidth','Overall width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2998=IFCSIMPLEPROPERTYTEMPLATE('3qUhDv9B16sOO6n$aljbhd',$,'OverallDepth','Overall depth of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#2999=IFCSIMPLEPROPERTYTEMPLATE('0qRXnOp3f1TekAJhVpBg6S',$,'EdgeDraft','Edge draft of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3000=IFCSIMPLEPROPERTYTEMPLATE('2Elfh9Fx18r87cGtf8EmwQ',$,'DraftBaseOffset','Draft base offset of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3001=IFCSIMPLEPROPERTYTEMPLATE('0qABI31prFnvlnX9FWRs_l',$,'DraftSideOffset','Draft side offset of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3002=IFCSIMPLEPROPERTYTEMPLATE('3kYj3YlKP08heE8_Mdhn2s',$,'BaseChamfer','Base chamfer of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3003=IFCSIMPLEPROPERTYTEMPLATE('3FZaUA08538AoKItQc$SiZ',$,'KeyDepth','Key depth of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3004=IFCSIMPLEPROPERTYTEMPLATE('2PIMBwQTP2Q8eoGeUWWjhv',$,'KeyHeight','Key height of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3005=IFCSIMPLEPROPERTYTEMPLATE('2wCVK6oST1afh8lA1CcTBI',$,'KeyOffset','Key offset of the profile.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3006=IFCSIMPLEPROPERTYTEMPLATE('0LPnafAU9BchESBixLhhhy',$,'BottomCover','Bottom cover of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3007=IFCSIMPLEPROPERTYTEMPLATE('0Jnq8K1D5EJeg5fSe4lJ2X',$,'CoreSpacing','Core spacing of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3008=IFCSIMPLEPROPERTYTEMPLATE('3VzL_GCen7LBACo9oth7z$',$,'CoreBaseHeight','Core base height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3009=IFCSIMPLEPROPERTYTEMPLATE('3SmyshQp91Px06hppuTGxy',$,'CoreMiddleHeight','Core middle height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3010=IFCSIMPLEPROPERTYTEMPLATE('2MQrBuLDPD5eHxMswAjurm',$,'CoreTopHeight','Core top height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3011=IFCSIMPLEPROPERTYTEMPLATE('2gDFQ9ShLBP98cymhuGL9M',$,'CoreBaseWidth','Core base width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3012=IFCSIMPLEPROPERTYTEMPLATE('284pV1A6jAGgD7Wzk3lzv6',$,'CoreTopWidth','Core top width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3013=IFCSIMPLEPROPERTYTEMPLATE('0y407D3pL4RAVlTNLNI803',$,'CenterCoreSpacing','Center core spacing of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3014=IFCSIMPLEPROPERTYTEMPLATE('3IuUs9Q4z6dPyjCi$f7Rr1',$,'CenterCoreBaseHeight','Center core base height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3015=IFCSIMPLEPROPERTYTEMPLATE('0w2Euz1ynA3ej4CS_vXuzg',$,'CenterCoreMiddleHeight','Center core middle height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3016=IFCSIMPLEPROPERTYTEMPLATE('2ARUWPcuHFCfTpy5W9knGG',$,'CenterCoreTopHeight','Center core top height of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3017=IFCSIMPLEPROPERTYTEMPLATE('32LYNh8gP5RP483ycfWbni',$,'CenterCoreBaseWidth','Center core base width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3018=IFCSIMPLEPROPERTYTEMPLATE('1e2SYeua56buz01Knd5shT',$,'CenterCoreTopWidth','Center core top width of the profile.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3019=IFCSIMPLEPROPERTYTEMPLATE('0P_zNpEfnBS9j8hyVXloJU',$,'NumberOfCores','The number of cores.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3020=IFCPROPERTYSETTEMPLATE('21q_8nrpr9QRF2S9dJBimS',$,'Pset_ProfileMechanical','This is a collection of mechanical properties that are applicable to virtually all profile classes. Most of these properties are especially used in structural analysis.',.PSET_PROFILEDRIVEN.,'IfcProfileDef',(#3021,#3022,#3023,#3024,#3025,#3026,#3027,#3028,#3029,#3030,#3031,#3032,#3033,#3034,#3035,#3036,#3037,#3038,#3039,#3040,#3041,#3042,#3043,#3044,#3045)); +#3021=IFCSIMPLEPROPERTYTEMPLATE('1qYBmVxuz4uvpqqywIAW_J',$,'MassPerLength','Mass per length, i.e. mass of a beam with a unit length of extrusion. For example measured in kg/m.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); +#3022=IFCSIMPLEPROPERTYTEMPLATE('0jjTw3VAXDxRe4z7VR8oGi',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3023=IFCSIMPLEPROPERTYTEMPLATE('3_3OAKIXvFfeooU5NJYVhL',$,'Perimeter','Perimeter of the object.\X2\000A000A\X0\Perimeter of the profile for calculating the surface area. For example measured in mm.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3024=IFCSIMPLEPROPERTYTEMPLATE('1DFTje3zHFAvhT_PRDcwyk',$,'MinimumPlateThickness','This value may be needed for stress analysis and to handle buckling problems. It can also be derived from the given profile geometry or classification and therefore it is only an optional feature allowing for an explicit description. For example measured in mm.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3025=IFCSIMPLEPROPERTYTEMPLATE('3FEiJKh_b6u9jCaALUq8Ur',$,'MaximumPlateThickness','This value may be needed for stress analysis and to handle buckling problems. It can also be derived from the given profile geometry or classification and therefore it is only an optional feature allowing for an explicit description. For example measured in mm.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3026=IFCSIMPLEPROPERTYTEMPLATE('02EurVPvn7uw$If51AbIXq',$,'CentreOfGravityInX','Location of the profile''s centre of gravity (geometric centroid), measured along xp.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3027=IFCSIMPLEPROPERTYTEMPLATE('0malakSxD08gv_dlMLtyAY',$,'CentreOfGravityInY','Location of the profile''s centre of gravity (geometric centroid), measured along yp.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3028=IFCSIMPLEPROPERTYTEMPLATE('0RRn6_h2H9LwTasvixPQ3q',$,'ShearCentreZ','Location of the profile''s shear centre, measured along zs.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3029=IFCSIMPLEPROPERTYTEMPLATE('3ox0opMMD9DwVtsPH0U3Ai',$,'ShearCentreY','Location of the profile''s shear centre, measured along ys.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3030=IFCSIMPLEPROPERTYTEMPLATE('22uUe270n77O6XTZY$GrNu',$,'MomentOfInertiaY','Moment of inertia about ys (second moment of area, about ys). For example measured in mm4.',.P_SINGLEVALUE.,'IfcMomentOfInertiaMeasure',$,$,$,$,$,.READWRITE.); +#3031=IFCSIMPLEPROPERTYTEMPLATE('2keuDn7gnBiBR953qd6TT_',$,'MomentOfInertiaZ','Moment of inertia about zs (second moment of area, about zs). For example measured in mm4',.P_SINGLEVALUE.,'IfcMomentOfInertiaMeasure',$,$,$,$,$,.READWRITE.); +#3032=IFCSIMPLEPROPERTYTEMPLATE('3p0VHyUGLBmPusb2B235M_',$,'MomentOfInertiaYZ','Moment of inertia about ys and zs (product moment of area). For example measured in mm4.',.P_SINGLEVALUE.,'IfcMomentOfInertiaMeasure',$,$,$,$,$,.READWRITE.); +#3033=IFCSIMPLEPROPERTYTEMPLATE('0RC0w2qFrFHOy6voa2bpVi',$,'TorsionalConstantX','Torsional constant about xs. For example measured in mm4.',.P_SINGLEVALUE.,'IfcMomentOfInertiaMeasure',$,$,$,$,$,.READWRITE.); +#3034=IFCSIMPLEPROPERTYTEMPLATE('1Qx1xecOv8xRfjNGILKQ2b',$,'WarpingConstant','Warping constant of the profile for torsional action. For example measured in mm6.',.P_SINGLEVALUE.,'IfcWarpingConstantMeasure',$,$,$,$,$,.READWRITE.); +#3035=IFCSIMPLEPROPERTYTEMPLATE('1uCZV2tBr8$h16dWJaedRH',$,'ShearDeformationAreaZ','Area of the profile for calculating the shear deformation due to a shear force parallel to zs. For example measured in mm\X2\00B2\X0\. If given, the shear deformation area zs shall be non-negative.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3036=IFCSIMPLEPROPERTYTEMPLATE('1HgI28hOjEBfLJ5Hp2D8mp',$,'ShearDeformationAreaY','Area of the profile for calculating the shear deformation due to a shear force parallel to ys. For example measured in mm\X2\00B2\X0\. If given, the shear deformation area ys shall be non-negative.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3037=IFCSIMPLEPROPERTYTEMPLATE('03ZDzbdjTCguMEGwS3D0sh',$,'MaximumSectionModulusY','Bending resistance about the ys axis at the point with maximum zs ordinate. For example measured in mm\X2\00B3\X0\.',.P_SINGLEVALUE.,'IfcSectionModulusMeasure',$,$,$,$,$,.READWRITE.); +#3038=IFCSIMPLEPROPERTYTEMPLATE('2TUJSrUJ58ePAaMy66lIKO',$,'MinimumSectionModulusY','Bending resistance about the ys axis at the point with minimum zs ordinate. For example measured in mm\X2\00B3\X0\.',.P_SINGLEVALUE.,'IfcSectionModulusMeasure',$,$,$,$,$,.READWRITE.); +#3039=IFCSIMPLEPROPERTYTEMPLATE('372yF2zi52YuL2xuM3zeWF',$,'MaximumSectionModulusZ','Bending resistance about the zs axis at the point with maximum ys ordinate. For example measured in mm\X2\00B3\X0\.',.P_SINGLEVALUE.,'IfcSectionModulusMeasure',$,$,$,$,$,.READWRITE.); +#3040=IFCSIMPLEPROPERTYTEMPLATE('3tFPqrDDz6cgX9hN1gcbDD',$,'MinimumSectionModulusZ','Bending resistance about the zs axis at the point with minimum ys ordinate. For example measured in mm\X2\00B3\X0\.',.P_SINGLEVALUE.,'IfcSectionModulusMeasure',$,$,$,$,$,.READWRITE.); +#3041=IFCSIMPLEPROPERTYTEMPLATE('00iHVDxhX2cBPbxe8lrF_5',$,'TorsionalSectionModulus','Torsional resistance (about xs). For example measured in mm\X2\00B3\X0\.',.P_SINGLEVALUE.,'IfcSectionModulusMeasure',$,$,$,$,$,.READWRITE.); +#3042=IFCSIMPLEPROPERTYTEMPLATE('3_tYpZNWHE4h_nzMhGSAlq',$,'ShearAreaZ','Area of the profile for calculating the shear stress due to shear force parallel to the section analysis axis zs. For example measured in mm\X2\00B2\X0\. If given, the shear area zs shall be non-negative.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3043=IFCSIMPLEPROPERTYTEMPLATE('2HIigsTRT8$vl5ivTPLGtO',$,'ShearAreaY','Area of the profile for calculating the shear stress due to shear force parallel to the section analysis axis ys. For example measured in mm\X2\00B2\X0\. If given, the shear area ys shall be non-negative.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3044=IFCSIMPLEPROPERTYTEMPLATE('1sGNxaF$D6Dwe8KueJByUK',$,'PlasticShapeFactorY','Ratio of plastic versus elastic bending moment capacity about the section analysis axis ys. A dimensionless value.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3045=IFCSIMPLEPROPERTYTEMPLATE('1KCBoQteXBTPf7heDUCM$k',$,'PlasticShapeFactorZ','Ratio of plastic versus elastic bending moment capacity about the section analysis axis zs. A dimensionless value.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3046=IFCPROPERTYSETTEMPLATE('2Te6itKQ90FBkFBwiTJ29h',$,'Pset_ProjectCommon','Property set for the application of high level project information.',.PSET_OCCURRENCEDRIVEN.,'IfcProject',(#3047,#3049,#3050,#3051,#3052,#3053)); +#3047=IFCSIMPLEPROPERTYTEMPLATE('29f8ekrfzBaAFd13wcP1rT',$,'ProjectType','Additional typing of a project',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3048,$,$,$,.READWRITE.); +#3048=IFCPROPERTYENUMERATION('PEnum_ProjectType',(IFCLABEL('MODIFICATION'),IFCLABEL('NEWBUILD'),IFCLABEL('OPERATIONMAINTENANCE'),IFCLABEL('RENOVATION'),IFCLABEL('REPAIR')),$); +#3049=IFCSIMPLEPROPERTYTEMPLATE('3zPf2Q8qvE8wCqu7a_nBiw',$,'ProjectInvestmentEstimate','Estimate of investment cost',.P_REFERENCEVALUE.,'IfcCostValue',$,$,$,$,$,.READWRITE.); +#3050=IFCSIMPLEPROPERTYTEMPLATE('26kyjxq09DohiSYQBb5AMF',$,'FundingSource','Investment funding source',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3051=IFCSIMPLEPROPERTYTEMPLATE('11KN6pyBPCyen0pELloqR5',$,'ROI','Return on Investment',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3052=IFCSIMPLEPROPERTYTEMPLATE('1ASZHJG$HF8fRWPgm09$go',$,'NetEarnedValue','Net earned value',.P_REFERENCEVALUE.,'IfcCostValue',$,$,$,$,$,.READWRITE.); +#3053=IFCSIMPLEPROPERTYTEMPLATE('1u5k6UuUnC_Qx17qGSOKMr',$,'PaybackPeriod','Payback period of investment',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#3054=IFCPROPERTYSETTEMPLATE('2wl5hGyF1E$PwPMLVwoF_R',$,'Pset_ProjectOrderChangeOrder','A change order is an instruction to make a change to a product or work being undertake. Note that the change order status is defined in the same way as a work order status since a change order implies a work requirement.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder/CHANGEORDER',(#3055,#3056)); +#3055=IFCSIMPLEPROPERTYTEMPLATE('29QCWQw9H77Q8HFf_Fi2QE',$,'ReasonForChange','A description of the problem for why a change is needed.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3056=IFCSIMPLEPROPERTYTEMPLATE('1U8m_rNmf52gTx0qCJDAmz',$,'BudgetSource','The budget source requested.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3057=IFCPROPERTYSETTEMPLATE('3WUlkizM18YgKjBBohvikt',$,'Pset_ProjectOrderMaintenanceWorkOrder','A MaintenanceWorkOrder is a detailed description of maintenance work that is to be performed. Note that the Scheduled Frequency property of the maintenance work order is used when the order is required as an instance of a scheduled work order.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder/MAINTENANCEWORKORDER',(#3058,#3059,#3060,#3061,#3062,#3064,#3066,#3068)); +#3058=IFCSIMPLEPROPERTYTEMPLATE('2FSdMt8_nDoQDNQAR7PhyK',$,'ProductDescription','A textual description of the products that require the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3059=IFCSIMPLEPROPERTYTEMPLATE('3IjWfv2lL1le1E0rh$3usS',$,'WorkTypeRequested','Work type requested in circumstances where there are categorizations of types of work task. It could be used to identify a remedial task, minor work task, electrical task etc.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3060=IFCSIMPLEPROPERTYTEMPLATE('0w9c8ylzb5Lg6DYg1cKC28',$,'ContractualType','The contractual type of the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3061=IFCSIMPLEPROPERTYTEMPLATE('1ue1zVWyf35OU5AtRvAgKe',$,'IfNotAccomplished','Comments if the job is not accomplished.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3062=IFCSIMPLEPROPERTYTEMPLATE('0AHecM6OzFlAwYh4QZZits',$,'MaintenanceType','Identifies the predefined types of maintenance that can be done from which the type that generates the maintenance work order may be set where:ConditionBased: generated as a result of the condition of an asset or artefact being less than a determined value.\X2\000A\X0\Corrective: generated as a result of an immediate and urgent need for maintenance action.\X2\000A\X0\PlannedCorrective: generated as a result of immediate corrective action being needed but with sufficient time available for the work order to be included in maintenance planning.\X2\000A\X0\Scheduled: generated as a result of a fixed, periodic maintenance requirement.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3063,$,$,$,.READWRITE.); +#3063=IFCPROPERTYENUMERATION('PEnum_MaintenanceType',(IFCLABEL('CONDITIONBASED'),IFCLABEL('CORRECTIVE'),IFCLABEL('PLANNEDCORRECTIVE'),IFCLABEL('SCHEDULED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3064=IFCSIMPLEPROPERTYTEMPLATE('2rnt3UXtD7ARgkUx8bxlbQ',$,'FaultPriorityType','Identifies the predefined types of priority that can be assigned from which the type may be set where:High: action is required urgently.\X2\000A\X0\Medium: action can occur within a reasonable period of time.\X2\000A\X0\Low: action can occur when convenient.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3065,$,$,$,.READWRITE.); +#3065=IFCPROPERTYENUMERATION('PEnum_PriorityType',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MEDIUM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3066=IFCSIMPLEPROPERTYTEMPLATE('3y0tJBCpn0NAC2ooinsGbX',$,'LocationPriorityType','Identifies the predefined types of priority that can be assigned from which the type may be set where:High: action is required urgently.\X2\000A\X0\Medium: action can occur within a reasonable period of time.\X2\000A\X0\Low: action can occur when convenient.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3067,$,$,$,.READWRITE.); +#3067=IFCPROPERTYENUMERATION('PEnum_PriorityType',(IFCLABEL('HIGH'),IFCLABEL('LOW'),IFCLABEL('MEDIUM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3068=IFCSIMPLEPROPERTYTEMPLATE('1gGjEXXoD7bwRORqk2IcL9',$,'ScheduledFrequency','The period of time between expected instantiations of a work order that may have been predefined.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3069=IFCPROPERTYSETTEMPLATE('3Azz3nf6PDPul0U2oWYWSQ',$,'Pset_ProjectOrderMoveOrder','Defines the requirements for move orders. Note that the move order status is defined in the same way as a work order status since a move order implies a work requirement.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder/MOVEORDER',(#3070)); +#3070=IFCSIMPLEPROPERTYTEMPLATE('1BJldLpXb67uA13N1pfDl3',$,'SpecialInstructions','Special instructions.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3071=IFCPROPERTYSETTEMPLATE('1FTAYxts90i9Esg9M6Nv0k',$,'Pset_ProjectOrderPurchaseOrder','Defines the requirements for purchase orders in a project.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder/PURCHASEORDER',(#3072,#3073)); +#3072=IFCSIMPLEPROPERTYTEMPLATE('27HRqPmR16eRGp$API0r92',$,'IsFOB','Indication of whether contents of the purchase order are delivered ''Free on Board'' (= True) or not (= False). FOB is a shipping term which indicates that the supplier pays the shipping costs (and usually also the insurance costs) from the point of manufacture to a specified destination, at which point the buyer takes responsibility.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3073=IFCSIMPLEPROPERTYTEMPLATE('23ZYXNUyvEve0$_BdSk812',$,'ShipMethod','Method of shipping that will be used for goods or services.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3074=IFCPROPERTYSETTEMPLATE('0FnjpWWFPA2uWQeTVMeygu',$,'Pset_ProjectOrderWorkOrder','Defines the requirements for purchase orders in a project.',.PSET_OCCURRENCEDRIVEN.,'IfcProjectOrder/WORKORDER',(#3075,#3076,#3077,#3078)); +#3075=IFCSIMPLEPROPERTYTEMPLATE('1WMdjULvv0z8WAq6Ao_vHP',$,'ProductDescription','A textual description of the products that require the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3076=IFCSIMPLEPROPERTYTEMPLATE('1khoDTH$P0LOSYJ8$53FuP',$,'WorkTypeRequested','Work type requested in circumstances where there are categorizations of types of work task. It could be used to identify a remedial task, minor work task, electrical task etc.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3077=IFCSIMPLEPROPERTYTEMPLATE('0_svavPRL4fvyeFdx9JAg_',$,'ContractualType','The contractual type of the work.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3078=IFCSIMPLEPROPERTYTEMPLATE('1VsfWCz3r14O3J1oNIoAjE',$,'IfNotAccomplished','Comments if the job is not accomplished.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3079=IFCPROPERTYSETTEMPLATE('1$3sIR2IL968BsVMtxXZGQ',$,'Pset_PropertyAgreement','A property agreement is an agreement that enables the occupation of a property for a period of time.The objective is to capture the information within an agreement that is relevant to a facilities manager. Design and construction information associated with the property is not considered. A property agreement may be applied to an instance of IfcSpatialStructureElement including to compositions defined through the IfcSpatialStructureElement.Element.CompositionEnum.Note that the associated actors are captured by the IfcOccupant class.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialStructureElement,IfcSpatialStructureElementType',(#3080,#3082,#3083,#3084,#3085,#3086,#3087,#3088,#3089,#3090,#3091,#3092)); +#3080=IFCSIMPLEPROPERTYTEMPLATE('1lYTlAcVr6bfulBrkI2wxb',$,'AgreementType','Identifies the predefined types of property agreement from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3081,$,$,$,.READWRITE.); +#3081=IFCPROPERTYENUMERATION('PEnum_PropertyAgreementType',(IFCLABEL('ASSIGNMENT'),IFCLABEL('LEASE'),IFCLABEL('TENANT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3082=IFCSIMPLEPROPERTYTEMPLATE('1dIAva7uTCIfEQbNr1tyI5',$,'TrackingIdentifier','The identifier assigned to the agreement for the purposes of tracking.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3083=IFCSIMPLEPROPERTYTEMPLATE('0MeIVg$n95y9C_gcmNRB0R',$,'AgreementVersion','The version number of the agreement that is identified.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3084=IFCSIMPLEPROPERTYTEMPLATE('3na6bz271FJvr61i$TyHlg',$,'AgreementDate','The date on which the version of the agreement became applicable.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#3085=IFCSIMPLEPROPERTYTEMPLATE('1RlgAdSbnA3fnV6i1m7NKQ',$,'PropertyName','Addressing details of the property as stated within the agreement.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3086=IFCSIMPLEPROPERTYTEMPLATE('2m$66QJmH2QAe5$9iq6ju8',$,'CommencementDate','Date on which the agreement commences.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#3087=IFCSIMPLEPROPERTYTEMPLATE('3Ffw0zrUH5N8l7h04YaY4E',$,'TerminationDate','Date on which the agreement terminates.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#3088=IFCSIMPLEPROPERTYTEMPLATE('3SCH4UcHn7PQ8V5Y6aT4ri',$,'Duration','Duration.\X2\000A000A\X0\The period of time for the lease.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#3089=IFCSIMPLEPROPERTYTEMPLATE('2oy4qypob7DPXUIbFX743H',$,'Options','A statement of the options available in the agreement.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3090=IFCSIMPLEPROPERTYTEMPLATE('2NjGkQSrn6yPPMptycj_1x',$,'ConditionCommencement','Condition of property provided on commencement of the agreement e.g. cold shell, warm lit shell, broom clean, turn-key.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3091=IFCSIMPLEPROPERTYTEMPLATE('2XCflBbq566QXsXP1iDylk',$,'Restrictions','Restrictions that may be placed by a competent authority.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3092=IFCSIMPLEPROPERTYTEMPLATE('3tNL8r3lf0g8hLiv0mCHCR',$,'ConditionTermination','Condition of property required on termination of the agreement e.g. cold shell, warm lit shell, broom clean, turn-key.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3093=IFCPROPERTYSETTEMPLATE('3foU1Rlyj4cQUOmZtVSon8',$,'Pset_ProtectiveDeviceBreakerUnitI2TCurve','A coherent set of attributes representing a curve for let-through energy of a protective device. Note - A protective device may be associated with different instances of this pSet providing information related to different basic characteristics',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3094,#3096,#3097)); +#3094=IFCSIMPLEPROPERTYTEMPLATE('0rqe1Kz_j9Gv5UEAptIfHT',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3095,$,$,$,.READWRITE.); +#3095=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3096=IFCSIMPLEPROPERTYTEMPLATE('3JozPgMYb42OOwzdNzty1s',$,'NominalCurrent','The nominal current that is designed to be measured.\X2\000A000A\X0\A set of nominal currents in [A] for which the data of this instance is valid. At least one value shall be provided. Any value in the set shall not exceed the value of the\X2\000A\X0\UltimateRatedCurrent associated with the same breaker unit.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3097=IFCSIMPLEPROPERTYTEMPLATE('1rIo5NpwvDHPt2bevZaqbM',$,'BreakerUnitCurve','A curve that establishes the let through energy of a breaker unit when a particular prospective current is applied. Note that the breaker unit curve is defined within a Cartesian coordinate system and this fact must be asserted within the property set:(1) Defining value: ProspectiveCurrent: A list of minimum 2 and maximum 16 numbers providing the currents in [A] for points in the current/I2t log/log coordinate space. The curve is drawn as a straight line between two consecutive points.\X2\000A\X0\(2) Defined value: LetThroughEnergy: A list of minimum 2 and maximum 16 numbers providing the let-through energy, I2t, in [A2s] for points in the current/I2t log/log coordinate space. The curve is drawn as a straight line between two consecutive points.',.P_TABLEVALUE.,'IfcElectricCurrentMeasure','IfcReal',$,$,$,$,.READWRITE.); +#3098=IFCPROPERTYSETTEMPLATE('3PNms2QJj22vF9Hq_HxkAq',$,'Pset_ProtectiveDeviceBreakerUnitI2TFuseCurve','A coherent set of attributes representing curves for melting- and breaking-energy of a fuse. Note - A fuse may be associated with different instances of this property set providing information related to different basic characteristics.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3099,#3101,#3102)); +#3099=IFCSIMPLEPROPERTYTEMPLATE('1GS9dZ_3b8JhCiwrBh9SlF',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3100,$,$,$,.READWRITE.); +#3100=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3101=IFCSIMPLEPROPERTYTEMPLATE('3ohpTRLvDBHAe_loZEw5oA',$,'BreakerUnitFuseMeltingCurve','A curve that establishes the energy required to melt the fuse of a breaker unit when a particular prospective melting current is applied. Note that the breaker unit fuse melting curve is defined within a Cartesian coordinate system and this fact must be:(1) Defining value: ProspectiveCurrentMelting :A list of minimum 2 and maximum 8 numbers providing the currents in [A] for points in the\X2\000A\X0\current/melting_energy log/log coordinate space. The curve is drawn as a straight line between two consecutive points.\X2\000A\X0\(2) Defined value: MeltingEnergy: A list of minimum 2 and maximum 8 numbers providing the energy whereby the fuse is starting to melt, I2t, in [A2s] for points in the current/melting_energy log/log coordinate space. The curve is drawn as a straight line between two consecutive points.',.P_TABLEVALUE.,'IfcElectricCurrentMeasure','IfcReal',$,$,$,$,.READWRITE.); +#3102=IFCSIMPLEPROPERTYTEMPLATE('3veQa2kkX6WfZj6d2mbJD2',$,'BreakerUnitFuseBreakingingCurve','A curve that establishes the let through breaking energy of a breaker unit when a particular prospective breaking current is applied. Note that the breaker unit fuse breaking curve is defined within a Cartesian coordinate system and this fact must be:(1) Defining value: ProspectiveCurrentBreaking: A list of minimum 2 and maximum 8 numbers providing the currents in [A] for points in the\X2\000A\X0\current/breaking energy log/log coordinate space. The curve is drawn as a straight line between two consecutive points.\X2\000A\X0\(2) Defined value: LetThroughBreakingEnergy: A list of minimum 2 and maximum 8 numbers providing the breaking energy whereby the fuse has provided a break, I2t, in [A2s] for points in the current/breakting_energy log/log coordinate space. The curve is drawn as a straight line between two consecutive.',.P_TABLEVALUE.,'IfcElectricCurrentMeasure','IfcReal',$,$,$,$,.READWRITE.); +#3103=IFCPROPERTYSETTEMPLATE('0558On3BH8ZgvcuKUzdWp9',$,'Pset_ProtectiveDeviceBreakerUnitIPICurve','A coherent set of attributes representing curves for let-through currents of a protective device. Note - A protective device may be associated with different instances of this pSet providing information related to different basic characteristics.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3104,#3106,#3107)); +#3104=IFCSIMPLEPROPERTYTEMPLATE('2PqBbyPRL5UgbJ76oBPfFm',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3105,$,$,$,.READWRITE.); +#3105=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3106=IFCSIMPLEPROPERTYTEMPLATE('0M7BGiHIL21ut25KtgHQ_C',$,'NominalCurrent','The nominal current that is designed to be measured.\X2\000A000A\X0\A set of nominal currents in [A] for which the data of this instance is valid. At least one value shall be provided. Any value in the set shall not exceed the value of the\X2\000A\X0\UltimateRatedCurrent associated with the same breaker unit.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3107=IFCSIMPLEPROPERTYTEMPLATE('1O0SiJRzHDCeidQRgq9qmK',$,'BreakerUnitIPICurve','A curve that establishes the let through peak current of a breaker unit when a particular prospective current is applied. Note that the breaker unit IPI curve is defined within a Cartesian coordinate system and this fact must be asserted within the property set:(1) Defining value: A list of minimum 2 and maximum 16 numbers providing the currents in [A] for points in the I/\X2\00CE\X0\ log/log coordinate space. The curve is drawn as a straight line between two consecutive points.\X2\000A\X0\(2) Defined value: A list of minimum 2 and maximum 16 numbers providing the let-through peak currents, \X2\00CE\X0\, in [A] for points in the I/\X2\00CE\X0\ log/log coordinate space. The curve is drawn as a straight line between two consecutive points.',.P_TABLEVALUE.,'IfcElectricCurrentMeasure','IfcElectricCurrentMeasure',$,$,$,$,.READWRITE.); +#3108=IFCPROPERTYSETTEMPLATE('3vDXt7KpX1yQ2hmkNjB49P',$,'Pset_ProtectiveDeviceBreakerUnitTypeMCB','A coherent set of attributes representing the breaking capacities of an MCB. Note - A protective device may be associated with different instances of this property set providing information related to different basic characteristics.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/CIRCUITBREAKER,IfcProtectiveDeviceType/CIRCUITBREAKER',(#3109,#3110,#3112,#3113,#3114,#3115,#3116)); +#3109=IFCSIMPLEPROPERTYTEMPLATE('25HhxbvmL8leQUe9Kvi4N2',$,'PowerLoss','The power loss in [W].\X2\000A000A\X0\The power loss in [W] per pole of the MCB when the nominal current is flowing through the MCB.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#3110=IFCSIMPLEPROPERTYTEMPLATE('02T_ftVyHEAujuNt5pEzLe',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3111,$,$,$,.READWRITE.); +#3111=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3112=IFCSIMPLEPROPERTYTEMPLATE('357hUIbTH4tRtmEHXlbBmr',$,'NominalCurrents','A set of values providing information on available modules (chips) for setting the nominal current of the protective device.\X2\000A000A\X0\A set of nominal currents in [A] for which the data of this instance is valid. At least one value shall be provided. Any value in the set shall not exceed the value of the\X2\000A\X0\UltimateRatedCurrent associated with the same breaker unit.',.P_LISTVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3113=IFCSIMPLEPROPERTYTEMPLATE('2hBsr4Kbn7ixSSIdFA3h5t',$,'ICU60947','The ultimate breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3114=IFCSIMPLEPROPERTYTEMPLATE('334EaskC19d8_rcFhMRoUr',$,'ICS60947','The service breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3115=IFCSIMPLEPROPERTYTEMPLATE('2XeXgnXQ90XPq6JIGoEVBD',$,'ICN60898','The nominal breaking capacity in [A] for an MCB tested in accordance with the IEC 60898 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3116=IFCSIMPLEPROPERTYTEMPLATE('3MlnQq4APDbPN$Fb1T306I',$,'ICS60898','The service breaking capacity in [A] for an MCB tested in accordance with the IEC 60898 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3117=IFCPROPERTYSETTEMPLATE('1q$T7qI7X8thR9jY8ODblZ',$,'Pset_ProtectiveDeviceBreakerUnitTypeMotorProtection','A coherent set of attributes representing different capacities of a a motor protection device, defined in accordance with IEC 60947. Note - A protective device may be associated with different instances of this Pset.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3118,#3119,#3121,#3122,#3123,#3124)); +#3118=IFCSIMPLEPROPERTYTEMPLATE('1n$VmyPgT6481o3$wDlX1h',$,'PerformanceClasses','A set of designations of performance classes for the breaker unit for which the data of this instance is valid.\X2\000A000A\X0\A set of designations of performance classes for the breaker unit for which the data of this instance is valid. A breaker unit being a motor protection device may be\X2\000A\X0\constructed for different levels of breaking capacities. A maximum of 7 different\X2\000A\X0\performance classes may be provided. Examples of performance classes that may be specified include B, C, N, S, H, L, V.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3119=IFCSIMPLEPROPERTYTEMPLATE('3bgTLfKS96jR8fCLqyak5d',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3120,$,$,$,.READWRITE.); +#3120=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3121=IFCSIMPLEPROPERTYTEMPLATE('0mreCxRmzBuA9zhzwQQSwk',$,'ICU60947','The ultimate breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3122=IFCSIMPLEPROPERTYTEMPLATE('1MkGcGdRH5nPHxkwWIaw4s',$,'ICS60947','The service breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3123=IFCSIMPLEPROPERTYTEMPLATE('2kbtgn2wH1Nvb92zj0Nsut',$,'ICW60947','The thermal withstand current in [A] for a circuit breaker or motor protection device tested in accordance with the IEC 60947 series. The value shall be related to 1 s.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3124=IFCSIMPLEPROPERTYTEMPLATE('0olDsRgEfDnfrKcj7l4WgM',$,'ICM60947','The making capacity in [A] for a circuit breaker or motor protection device tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3125=IFCPROPERTYSETTEMPLATE('1oIEDHFB120OnjGrqlpMRP',$,'Pset_ProtectiveDeviceOccurrence','Properties that are applied to an occurrence of a protective device.',.PSET_OCCURRENCEDRIVEN.,'IfcProtectiveDevice',(#3126,#3128,#3129,#3130,#3131,#3132,#3133,#3134,#3135,#3136,#3137,#3138,#3139,#3140)); +#3126=IFCSIMPLEPROPERTYTEMPLATE('1uPs5MogzFNPmBascYzGx9',$,'PoleUsage','Pole usage.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3127,$,$,$,.READWRITE.); +#3127=IFCPROPERTYENUMERATION('PEnum_PoleUsage',(IFCLABEL('1P'),IFCLABEL('1PN'),IFCLABEL('2P'),IFCLABEL('3P'),IFCLABEL('3PN'),IFCLABEL('4P'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3128=IFCSIMPLEPROPERTYTEMPLATE('2AJ_5fGXf97vvhFOFsK$EE',$,'LongTimeFunction','Applying long time function\X2\000A\X0\A flag indicating that the long time function (i.e. the thermal tripping) of the device is used. The value should be set to TRUE for all devices except those that allows the Long time function of the device not to be used.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3129=IFCSIMPLEPROPERTYTEMPLATE('0S0JFfWe1DWh1mfhj191vq',$,'ShortTimeFunction','Applying short time function A flag indicating that the short time function of the device is used. The value should be set to FALSE for devices not having a short time function, or if the short time function is not selected to be used.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3130=IFCSIMPLEPROPERTYTEMPLATE('0VrezfxN56FxNEhg3cdiQn',$,'ShortTimei2tFunction','Applying short time i2t function. A flag indicating that the I2t short time function of the device is used. The value should be set to TRUE only if the I2t function \X2\00A0\X0\is explicitly selected for the device.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3131=IFCSIMPLEPROPERTYTEMPLATE('0BHYIxWO9FCfeeZYC5E6Vb',$,'GroundFaultFunction','Applying ground fault function. A flag indicating that the ground fault function of the device is used. The value should be set to FALSE for devices not having a ground fault function, or if the ground fault function is not selected to be used.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3132=IFCSIMPLEPROPERTYTEMPLATE('1r_ZGe2QHDff0IW$toCYhF',$,'GroundFaulti2tFunction','Applying ground fault i2t function. A flag indicating that the I2t ground fault function of the device is used. The value should be set to TRUE only if the I2t function is explicitly selected for the device.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3133=IFCSIMPLEPROPERTYTEMPLATE('0dprqSbR19dRxLJTo38_ng',$,'LongTimeCurrentSetValue','Long time current set value. The set value of the long time tripping current if adjustable.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3134=IFCSIMPLEPROPERTYTEMPLATE('1V7gh2obn1xhlYl75Dc178',$,'ShortTimeCurrentSetValue','Short time current set value. The set value of the long time tripping current if adjustable.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3135=IFCSIMPLEPROPERTYTEMPLATE('2sQRI3XGHDQe8iH9GJBpvV',$,'InstantaneousCurrentSetValue','Instantaneous current set value. The set value of the instantaneous tripping current if adjustable.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3136=IFCSIMPLEPROPERTYTEMPLATE('0yA9mYm8D1xu4Jau7dPTIR',$,'GroundFaultCurrentSetValue','Ground fault current set value. The set value of the ground tripping current if adjustable.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3137=IFCSIMPLEPROPERTYTEMPLATE('0UoEYNBBPFGuqyaLKmQxS6',$,'LongTimeDelay','Long time delay. The set value of the long time time-delay if adjustable.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3138=IFCSIMPLEPROPERTYTEMPLATE('13p7iDDLfELBWp1BjH7gSY',$,'ShortTimeTrippingTime','Short time tripping time. The set value of the short time tripping time if adjustable.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3139=IFCSIMPLEPROPERTYTEMPLATE('2D67WTGo90rRWwoU0JTtUo',$,'InstantaneousTrippingTime','Instantaneous tripping time. The set value of the instantaneous tripping time if adjustable.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3140=IFCSIMPLEPROPERTYTEMPLATE('0aXjb0w$51Fxu8WM9SGF3o',$,'GroundFaultTrippingTime','Ground fault tripping time. The set value of the ground fault tripping current if adjustable.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3141=IFCPROPERTYSETTEMPLATE('0roSrFDab5uxjwQ7Cvxs$l',$,'Pset_ProtectiveDeviceTrippingCurve','Tripping curves are applied to thermal, thermal magnetic or MCB_RCD tripping units (i.e. tripping units having type property sets for thermal, thermal magnetic or MCB_RCD tripping defined). They are not applied to electronic tripping units.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3142,#3144)); +#3142=IFCSIMPLEPROPERTYTEMPLATE('1$CqZb_$z9Cusq55AGbn3u',$,'TrippingCurveType','The type of tripping curve that is represented by the property set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3143,$,$,$,.READWRITE.); +#3143=IFCPROPERTYENUMERATION('PEnum_TrippingCurveType',(IFCLABEL('LOWER'),IFCLABEL('UPPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3144=IFCSIMPLEPROPERTYTEMPLATE('3GPYOWQrH1AvIa65TycUic',$,'TrippingCurve','A curve that establishes the release time of a tripping unit when a particular prospective current is applied. Note that the tripping curve is defined within a Cartesian coordinate system and this fact must be asserted within the property set:(1) Defining value is the Prospective Current which is a list of minimum 2 and maximum 16 numbers providing the currents in [x In] for points in the current/time log/log coordinate space. The curve is drawn as a straight line between two consecutive points.\X2\000A\X0\(2) Defined value is a list of minimum 2 and maximum 16 numbers providing the release_time in [s] for points in the current/time log/log coordinate space. The curve is drawn as a straight line between two consecutive points. Note that a defined interpolation.',.P_TABLEVALUE.,'IfcElectricCurrentMeasure','IfcTimeMeasure',$,$,$,$,.READWRITE.); +#3145=IFCPROPERTYSETTEMPLATE('1jhN8mU6X1rxozTyjEOPnN',$,'Pset_ProtectiveDeviceTrippingFunctionGCurve','Tripping functions are applied to electronic tripping units (i.e. tripping units having type property sets for electronic tripping defined). They are not applied to thermal, thermal magnetic or RCD tripping units.\X2\000A\X0\This property set represent the ground fault protection (G-curve) of an electronic protection device',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3146,#3147,#3148,#3149,#3150,#3151,#3152,#3153,#3154,#3155,#3156,#3157,#3158,#3159,#3160,#3161,#3162)); +#3146=IFCSIMPLEPROPERTYTEMPLATE('2ALizJxXP92QywAphWszen',$,'IsSelectable','Indication whether something can be switched off or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3147=IFCSIMPLEPROPERTYTEMPLATE('1y_a2ysWb1JOUBjMk5Ipa5',$,'NominalCurrentAdjusted','An indication if the tripping currents of the short time protection is related to the nominal current multiplied with the actual setting of the current adjustment, if any, of the long time protection part of the protective device, or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3148=IFCSIMPLEPROPERTYTEMPLATE('2pP3jCHjj8PhHxzguSRK6h',$,'ExternalAdjusted','An indication if the ground fault protection may be adjusted according to an external current coil or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3149=IFCSIMPLEPROPERTYTEMPLATE('3EfwQdtHj9yBSfATsiv2ta',$,'ReleaseCurrent','The release current in [x In] for the initial tripping of the S-function.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3150=IFCSIMPLEPROPERTYTEMPLATE('3QvS8gFTDAQvG0MVAOaMaW',$,'ReleaseTime','The release time in [s] for the initial tripping of the relevant part. This time indicates that for current lower than the indicated release current, the tripping time will be longer than the indicated release time. The value is given as a mean value.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3151=IFCSIMPLEPROPERTYTEMPLATE('1MpgNGaUj5EvCjXkQ1x2X7',$,'CurrentTolerance1','The tolerance for the current of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3152=IFCSIMPLEPROPERTYTEMPLATE('1noSVSlK97xfvajKCFc7cj',$,'CurrentToleranceLimit1','The time limit in [s] limiting the application of CurrentTolerance1, if any. If the value is set to 0, the value of the CurrentTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3153=IFCSIMPLEPROPERTYTEMPLATE('3FHv9jtQD5wgu8KakCqj3T',$,'CurrentTolerance2','The tolerance for the current of time/current-curve in [%] valid for times above CurrentTolereanceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3154=IFCSIMPLEPROPERTYTEMPLATE('1yc762Zj101wm$LPldW7Gl',$,'IsCurrentTolerancePositiveOnly','Indication whether the value of CurrentTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3155=IFCSIMPLEPROPERTYTEMPLATE('3Qaz4sHFDCUeab3w_NTQLi',$,'TimeTolerance1','The tolerance for the time of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3156=IFCSIMPLEPROPERTYTEMPLATE('0M8kD5r_v2BQOo_ZKisNYo',$,'TimeToleranceLimit1','The current limit in [x In] limiting the application of TimeTolerance1, if any. If the value is set to 0, the value of the TimeTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3157=IFCSIMPLEPROPERTYTEMPLATE('1lWJr68Er8vAwKiyS0uRyk',$,'TimeTolerance2','The tolerance for the time of the time/current-curve in [%] valid for currents above TimeToleranceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3158=IFCSIMPLEPROPERTYTEMPLATE('3HTL7LNRnFSRAekrfC6j13',$,'IsTimeTolerancePositiveOnly','Indication whether the value of TimeTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3159=IFCSIMPLEPROPERTYTEMPLATE('0YSl9aHpf9eQ8IsptKTcbU',$,'ReleaseCurrentI2tStart','The release current in [x In].\X2\000A000A\X0\For the start point of the I2t tripping curve of the G-function, if any.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3160=IFCSIMPLEPROPERTYTEMPLATE('1A0kBo8Pb7of3FAd_FEKT8',$,'ReleaseTimeI2tStart','The release time in [s].\X2\000A000A\X0\For the start point of the I2t tripping curve of the G-function, if any.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3161=IFCSIMPLEPROPERTYTEMPLATE('2o9Nz6z7LF9AcZrSbbWcj3',$,'ReleaseCurrentI2tEnd','The release current in [x In].\X2\000A000A\X0\For the end point of the I2t tripping curve of the G-function, if any. The value of ReleaseCurrentI2tEnd shall be larger than ReleaseCurrentI2tStart.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3162=IFCSIMPLEPROPERTYTEMPLATE('1D1Zxv6b1DpOa1c9HDIIxE',$,'ReleaseTimeI2tEnd','The release time in [s].\X2\000A000A\X0\For the end point of the I2 tripping curve of the G-function, if any. The value of ReleaseTimeI2tEnd shall be lower than ReleaseTimeI2tStart.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3163=IFCPROPERTYSETTEMPLATE('151Neo5on4dB2x9Kqic0BE',$,'Pset_ProtectiveDeviceTrippingFunctionICurve','Tripping functions are applied to electronic tripping units (i.e. tripping units having type property sets for electronic tripping defined). They are not applied to thermal, thermal magnetic or RCD tripping units.\X2\000A\X0\This property set represent the instantaneous time protection (I-curve) of an electronic protection device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3164,#3165,#3166,#3167,#3168,#3169,#3170,#3171,#3172,#3173,#3174,#3175,#3176,#3177)); +#3164=IFCSIMPLEPROPERTYTEMPLATE('3ZbiU24CDCJhfXhZ61A8FU',$,'IsSelectable','Indication whether something can be switched off or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3165=IFCSIMPLEPROPERTYTEMPLATE('3tGCdyvbjCFQbE913aGLEC',$,'NominalCurrentAdjusted','An indication if the tripping currents of the short time protection is related to the nominal current multiplied with the actual setting of the current adjustment, if any, of the long time protection part of the protective device, or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3166=IFCSIMPLEPROPERTYTEMPLATE('3CRp2gkOD92fL823qUma3d',$,'ReleaseCurrent','The release current in [x In] for the initial tripping of the S-function.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3167=IFCSIMPLEPROPERTYTEMPLATE('1QArrPO3rC6BEK9_AJc0eh',$,'ReleaseTime','The release time in [s] for the initial tripping of the relevant part. This time indicates that for current lower than the indicated release current, the tripping time will be longer than the indicated release time. The value is given as a mean value.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3168=IFCSIMPLEPROPERTYTEMPLATE('16EF8KStLD88r2uJxR2QR4',$,'CurrentTolerance1','The tolerance for the current of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3169=IFCSIMPLEPROPERTYTEMPLATE('1PzhXwOof61f4R8xtE2jLm',$,'CurrentToleranceLimit1','The time limit in [s] limiting the application of CurrentTolerance1, if any. If the value is set to 0, the value of the CurrentTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3170=IFCSIMPLEPROPERTYTEMPLATE('07JdMJug16lPu1sj_fGiIL',$,'CurrentTolerance2','The tolerance for the current of time/current-curve in [%] valid for times above CurrentTolereanceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3171=IFCSIMPLEPROPERTYTEMPLATE('3uMF7XLNLEsAoH_vJEyPzI',$,'IsCurrentTolerancePositiveOnly','Indication whether the value of CurrentTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3172=IFCSIMPLEPROPERTYTEMPLATE('2B91LAJRP6UO_vdXYFyrPv',$,'TimeTolerance1','The tolerance for the time of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3173=IFCSIMPLEPROPERTYTEMPLATE('3aaVnzW5b91RgsZ0OlFSoe',$,'TimeToleranceLimit1','The current limit in [x In] limiting the application of TimeTolerance1, if any. If the value is set to 0, the value of the TimeTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3174=IFCSIMPLEPROPERTYTEMPLATE('19WVZb7rf2wfoc0JbgHzPa',$,'TimeTolerance2','The tolerance for the time of the time/current-curve in [%] valid for currents above TimeToleranceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3175=IFCSIMPLEPROPERTYTEMPLATE('27wQgrj4f0YuYJ4TnURIDi',$,'IsTimeTolerancePositiveOnly','Indication whether the value of TimeTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3176=IFCSIMPLEPROPERTYTEMPLATE('2AwDctD3rEC81eyoIAJK5V',$,'MaxAdjustmentX_ICS','Provides the maximum setting value for the available current adjustment in relation to the Ics breaking capacity of the protection device of which the actual tripping unit is a part of. The value is not asserted unless the instantaneous time protection is.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3177=IFCSIMPLEPROPERTYTEMPLATE('2_WWmVG_nAb8JJR9_J22om',$,'IsOffWhenSFunctionOn','Indication whether the I-function is automatically switched off when the S-function is switched on.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3178=IFCPROPERTYSETTEMPLATE('3gcSC38yr0Bf7xRfUmWHO3',$,'Pset_ProtectiveDeviceTrippingFunctionLCurve','Tripping functions are applied to electronic tripping units (i.e. tripping units having type property sets for electronic tripping defined). They are not applied to thermal, thermal magnetic or RCD tripping units.\X2\000A\X0\This property set represent the long time protection (L-curve) of an electronic protection device',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3179,#3180,#3181,#3182,#3183,#3184,#3185,#3186,#3187)); +#3179=IFCSIMPLEPROPERTYTEMPLATE('3xzmWl95vAQBXT6Wnw1w50',$,'IsSelectable','Indication whether something can be switched off or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3180=IFCSIMPLEPROPERTYTEMPLATE('200JjNEpf9VP3S1AJe7D$g',$,'UpperCurrent1','The current in [x In], indicating that for currents larger than UpperCurrent1 the I2t part of the L-function will trip the current.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3181=IFCSIMPLEPROPERTYTEMPLATE('0ouIIaT_n4vR_J$XqwpqOO',$,'UpperCurrent2','The current in [x In], indicating the upper current limit of the upper time/current curve of the I2t part of the L-function.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3182=IFCSIMPLEPROPERTYTEMPLATE('1Olnncg392meclph53fUel',$,'UpperTime1','The time in [s], indicating that tripping times of the upper time/current curve lower than UpperTime1 is determined by the I2t part of the L-function.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3183=IFCSIMPLEPROPERTYTEMPLATE('36h0_XShTCC9ju7PFdizjW',$,'UpperTime2','The time in [s], indicating the tripping times of the upper time/current curve at the UpperCurrent2.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3184=IFCSIMPLEPROPERTYTEMPLATE('03zXSDgEP4zOmagd5Jzl71',$,'LowerCurrent1','The current in [x In], indicating that for currents smaller than LowerCurrent1 the I2t part of the L-function will not trip the current,',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3185=IFCSIMPLEPROPERTYTEMPLATE('13lYjNO5r7BBTFLz780p3I',$,'LowerCurrent2','The current in [x In], indicating the upper current limit of the lower time/current curve of the I2t part of the L-function.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3186=IFCSIMPLEPROPERTYTEMPLATE('3226X6vdD3KOqxvd2vbh15',$,'LowerTime1','The time in [s], indicating that tripping times of the lower time/current curve lower than LowerTime1 is determined by the I2t part of the L-function.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3187=IFCSIMPLEPROPERTYTEMPLATE('1iqtSj4bvBPgDTvL6AnpFQ',$,'LowerTime2','The time in [s], indicating the tripping times of the upper time/current curve at the LowerCurrent2.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3188=IFCPROPERTYSETTEMPLATE('2uRpqtQDD6fQujTtM7ZUUn',$,'Pset_ProtectiveDeviceTrippingFunctionSCurve','Tripping functions are applied to electronic tripping units (i.e. tripping units having type property sets for electronic tripping defined). They are not applied to thermal, thermal magnetic or RCD tripping units.\X2\000A\X0\This property set represent the short time protection (S-curve) of an electronic protection device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3189,#3190,#3191,#3192,#3193,#3194,#3195,#3196,#3197,#3198,#3199,#3200,#3201,#3202,#3203,#3204,#3205)); +#3189=IFCSIMPLEPROPERTYTEMPLATE('2NSf1EJEj8uPMTG_jxRyaY',$,'IsSelectable','Indication whether something can be switched off or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3190=IFCSIMPLEPROPERTYTEMPLATE('1MZ$CeSiz3fQBpc7kjUdtA',$,'NominalCurrentAdjusted','An indication if the tripping currents of the short time protection is related to the nominal current multiplied with the actual setting of the current adjustment, if any, of the long time protection part of the protective device, or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3191=IFCSIMPLEPROPERTYTEMPLATE('01Lik7Jh16AvEqBk5ROaKG',$,'ReleaseCurrent','The release current in [x In] for the initial tripping of the S-function.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3192=IFCSIMPLEPROPERTYTEMPLATE('23c6fXk9rDqezy_6p3P6F8',$,'ReleaseTime','The release time in [s] for the initial tripping of the relevant part. This time indicates that for current lower than the indicated release current, the tripping time will be longer than the indicated release time. The value is given as a mean value.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3193=IFCSIMPLEPROPERTYTEMPLATE('1IE8k4ecDFPP7sixCFgmpz',$,'CurrentTolerance1','The tolerance for the current of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3194=IFCSIMPLEPROPERTYTEMPLATE('2Vkmj9SSD3BvBWgr61o3_e',$,'CurrentToleranceLimit1','The time limit in [s] limiting the application of CurrentTolerance1, if any. If the value is set to 0, the value of the CurrentTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3195=IFCSIMPLEPROPERTYTEMPLATE('1yVz7sHkD0ThO11W6J9mHt',$,'CurrentTolerance2','The tolerance for the current of time/current-curve in [%] valid for times above CurrentTolereanceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3196=IFCSIMPLEPROPERTYTEMPLATE('07tkNF1lz3$R43tF46nH4u',$,'IsCurrentTolerancePositiveOnly','Indication whether the value of CurrentTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3197=IFCSIMPLEPROPERTYTEMPLATE('3Uep4u1kzAM8hAi9fqahXO',$,'TimeTolerance1','The tolerance for the time of time/current-curve in [%].',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3198=IFCSIMPLEPROPERTYTEMPLATE('2LTRE_36f4uwvW04hDtXSX',$,'TimeToleranceLimit1','The current limit in [x In] limiting the application of TimeTolerance1, if any. If the value is set to 0, the value of the TimeTolerance1 is valid for the whole time/current-curve.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3199=IFCSIMPLEPROPERTYTEMPLATE('3MUGKfPU5Dsh3q9gFT3jUb',$,'TimeTolerance2','The tolerance for the time of the time/current-curve in [%] valid for currents above TimeToleranceLimit1.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3200=IFCSIMPLEPROPERTYTEMPLATE('1FU0Of$$X3E8TQNkkL5FAA',$,'IsTimeTolerancePositiveOnly','Indication whether the value of TimeTolerance1 is provided as a positive tolereance only or not. If not, the value is proved as a pluss/minus tolerance.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3201=IFCSIMPLEPROPERTYTEMPLATE('3hhLMxHVXDxxCVa6Sjr3av',$,'ReleaseCurrentI2tStart','The release current in [x In].\X2\000A000A\X0\For the start point of the I2t tripping curve of the S-function, if any.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3202=IFCSIMPLEPROPERTYTEMPLATE('0fgyc$9JX9cxUFJejLWHjn',$,'ReleaseTimeI2tStart','The release time in [s].\X2\000A000A\X0\For the start point of the I2t tripping curve of the S-function, if any',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3203=IFCSIMPLEPROPERTYTEMPLATE('22XMLJi359rQlyZR$MConB',$,'ReleaseCurrentI2tEnd','The release current in [x In].\X2\000A000A\X0\For the end point of the I2t tripping curve of the S-function, if any. The value of ReleaseCurrentI2tEnd shall be larger than ReleaseCurrentI2tStart.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3204=IFCSIMPLEPROPERTYTEMPLATE('3ZuvHQ5m9DZA8XFTAgxCNP',$,'ReleaseTimeI2tEnd','The release time in [s].\X2\000A000A\X0\For the end point of the I2 tripping curve of the S-function, if any. The value of ReleaseTimeI2tEnd shall be lower than ReleaseTimeI2tStart.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3205=IFCSIMPLEPROPERTYTEMPLATE('3ueq3LXAjAVPRAN3pDWX1x',$,'IsOffWhenLfunctionOn','Indication whether the S-function is automatically switched off when the I-function is switched on.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3206=IFCPROPERTYSETTEMPLATE('1h59n$2EH4KhVwewxeNYiE',$,'Pset_ProtectiveDeviceTrippingUnitCurrentAdjustment','A set of current adjustment values that may be applied to an electronic or thermal tripping unit type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3207,#3209,#3210,#3211,#3212)); +#3207=IFCSIMPLEPROPERTYTEMPLATE('2xekW7zoD5bgXqH4$MZoa6',$,'AdjustmentValueType','The type of adjustment value that is applied through the property set. This determines the properties that should be asserted (see below).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3208,$,$,$,.READWRITE.); +#3208=IFCPROPERTYENUMERATION('PEnum_AdjustmentValueType',(IFCLABEL('LIST'),IFCLABEL('RANGE')),$); +#3209=IFCSIMPLEPROPERTYTEMPLATE('3WOKp624r088Gwv_hZWE3p',$,'CurrentAdjustmentRange','Upper and lower current adjustment limits for an AdjustmentValueType = RANGE. Note that this property should not have a value for an AdjustmentValueType = LIST.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3210=IFCSIMPLEPROPERTYTEMPLATE('0NH6H9fVf0A9HsJpnITGWe',$,'CurrentAdjustmentRangeStepValue','Step value of current adjustment for an AdjustmentValueType = RANGE. Note that this property should not have a value for an AdjustmentValueType = LIST.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3211=IFCSIMPLEPROPERTYTEMPLATE('1rRGDJ9M1DXgVweSa_OE8J',$,'CurrentAdjustmentValues','A list of current adjustment values that may be applied to a tripping unit for an AdjustmentValueType = LIST. A minimum of 1 and a maximum of 16 adjustment values may be specified. Note that this property should not have a value for an AdjustmentValueType = RANGE.',.P_LISTVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3212=IFCSIMPLEPROPERTYTEMPLATE('3VPI6WGuv1_9NMkPPq9ao8',$,'AdjustmentDesignation','The desgnation on the device for the adjustment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3213=IFCPROPERTYSETTEMPLATE('0FubKx7cr2R9DdaQz1qZTg',$,'Pset_ProtectiveDeviceTrippingUnitTimeAdjustment','A set of time adjustment values that may be applied to an electronic or thermal tripping unit type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3214,#3216,#3217,#3218,#3219,#3220,#3221)); +#3214=IFCSIMPLEPROPERTYTEMPLATE('31CqSf6En59vs2SWvInk9m',$,'AdjustmentValueType','The type of adjustment value that is applied through the property set. This determines the properties that should be asserted (see below).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3215,$,$,$,.READWRITE.); +#3215=IFCPROPERTYENUMERATION('PEnum_AdjustmentValueType',(IFCLABEL('LIST'),IFCLABEL('RANGE')),$); +#3216=IFCSIMPLEPROPERTYTEMPLATE('033AhwH5H41xEh3R5j9QIr',$,'TimeAdjustmentRange','Upper and lower time adjustment limits for an AdjustmentValueType = RANGE. Note that this property should not have a value for an AdjustmentValueType = LIST.',.P_BOUNDEDVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3217=IFCSIMPLEPROPERTYTEMPLATE('3yF0PtoIHAkQF5c4xIKm2P',$,'TimeAdjustmentRangeStepValue','Step value of time adjustment for an AdjustmentValueType = RANGE. Note that this property should not have a value for an AdjustmentValueType = LIST.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3218=IFCSIMPLEPROPERTYTEMPLATE('3mu$XM4XD1QOmhweG6EoEU',$,'TimeAdjustmentValues','A list of time adjustment values that may be applied to a tripping unit for an AdjustmentValueType = LIST. A minimum of 1 and a maximum of 16 adjustment values may be specified. Note that this property should not have a value for an AdjustmentValueType = RANGE.',.P_LISTVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3219=IFCSIMPLEPROPERTYTEMPLATE('0HuOkK4fH5EusMahNcncwf',$,'AdjustmentDesignation','The desgnation on the device for the adjustment.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3220=IFCSIMPLEPROPERTYTEMPLATE('2CNUXKWSf6AhZMRF7CjfWt',$,'CurrentForTimeDelay','The tripping current in [x In] at which the time delay is specified. A value for this property should only be asserted for time delay of L-function, and for I2t of the S and G function.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3221=IFCSIMPLEPROPERTYTEMPLATE('2I6X_nOwn7IuSKpHlQHqNJ',$,'I2TApplicability','The applicability of the time adjustment related to the tripping function.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3222,$,$,$,.READWRITE.); +#3222=IFCPROPERTYENUMERATION('PEnum_AdjustmentValueType',(IFCLABEL('LIST'),IFCLABEL('RANGE')),$); +#3223=IFCPROPERTYSETTEMPLATE('0LrpxG3h10a9OxY1w1MLjt',$,'Pset_ProtectiveDeviceTrippingUnitTypeCommon','Common information concerning tripping units that area associated with protective devices',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#3224,#3225,#3227,#3228,#3229,#3230,#3231)); +#3224=IFCSIMPLEPROPERTYTEMPLATE('0Coc9CHWnEpPVk8QgZg1PK',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3225=IFCSIMPLEPROPERTYTEMPLATE('13zFXYHFLBWQ7MxC_V1x8s',$,'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',$,#3226,$,$,$,.READWRITE.); +#3226=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3227=IFCSIMPLEPROPERTYTEMPLATE('3ztmOn5iXAUPPiXjYwklPd',$,'Standard','The designation of the standard applicable for the definition of the object used.\X2\000A000A\X0\The designation of the standard applicable for the definition of the characteristics of the\X2\000A\X0\tripping_unit.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3228=IFCSIMPLEPROPERTYTEMPLATE('2EI0ypsNf6KfVNrIB4Ae$F',$,'UseInDiscrimination','An indication whether the time/current tripping information can be applied in a discrimination\X2\000A\X0\analysis or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3229=IFCSIMPLEPROPERTYTEMPLATE('0TiV2Nmb59reNLIhKbgC_C',$,'AtexVerified','An indication whether the tripping_unit is verified to be applied in EX-environment or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3230=IFCSIMPLEPROPERTYTEMPLATE('12oFouDyHC$ONf5FLaldGF',$,'OldDevice','Indication whether the protection_ unit is out-dated or not. If not out-dated, the device is still for sale.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3231=IFCSIMPLEPROPERTYTEMPLATE('1PJgcUxej0dQ91mppojors',$,'LimitingTerminalSize','The maximum terminal size capacity of the device.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3232=IFCPROPERTYSETTEMPLATE('28UleKzv5C$Rt7HIieCAqA',$,'Pset_ProtectiveDeviceTrippingUnitTypeElectroMagnetic','Information on tripping units that are electrically or magnetically tripped.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit/ELECTROMAGNETIC,IfcProtectiveDeviceTrippingUnitType/ELECTROMAGNETIC',(#3233,#3235,#3236,#3237,#3238,#3239,#3240,#3241,#3242,#3243)); +#3233=IFCSIMPLEPROPERTYTEMPLATE('2zJJw8d616sBFDaIFZlfq2',$,'ElectroMagneticTrippingUnitType','A list of the available types of electric magnetic tripping unit from which that required may be selected. These cover overload, none special, short circuit, motor protection and bi-metal tripping.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3234,$,$,$,.READWRITE.); +#3234=IFCPROPERTYENUMERATION('PEnum_ElectroMagneticTrippingUnitType',(IFCLABEL('OL'),IFCLABEL('TMP_BM'),IFCLABEL('TMP_MP'),IFCLABEL('TMP_SC'),IFCLABEL('TMP_STD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3235=IFCSIMPLEPROPERTYTEMPLATE('3rwMRWwPrABhRuuBwuATcx',$,'I1','The (thermal) lower testing current limit in [x In], indicating that for currents lower than I1, the tripping time shall be longer than the associated tripping time, T2.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#3236=IFCSIMPLEPROPERTYTEMPLATE('00ls$dqWj7nObEm0W9SZB8',$,'I2','The (thermal) upper testing current limit in [x In], indicating that for currents larger than I2, the tripping time shall be shorter than the associated tripping time, T2.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#3237=IFCSIMPLEPROPERTYTEMPLATE('2Bvu_SWfX2rvJzH7YKhpq8',$,'T2','The (thermal) testing time in [s] associated with the testing currents I1 and I2.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3238=IFCSIMPLEPROPERTYTEMPLATE('3qtO0acnT5BeA28uNP98Re',$,'DefinedTemperature','The ambient temperature at which the thermal current/time-curve associated with this protection device is defined.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3239=IFCSIMPLEPROPERTYTEMPLATE('0NmBoQusr6C9_aohXAUIzC',$,'TemperatureFactor','The correction factor (typically measured as %/deg K) for adjusting the thermal current/time to an ambient temperature different from the value given by the defined temperature.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3240=IFCSIMPLEPROPERTYTEMPLATE('2TqFdFM2r8yvWZy4iTMyU2',$,'I4','The lower electromagnetic testing current limit in [x In], indicating that for currents lower than I4, the tripping time shall be longer than the associated tripping time, T5, i.e. the device shall not trip instantaneous.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#3241=IFCSIMPLEPROPERTYTEMPLATE('3_652hZ7H5EeaDLSupvA5p',$,'I5','The upper electromagnetic testing current limit in [x In], indicating that for currents larger than I5, the tripping time shall be shorter than or equal to the associated tripping time, T5, i.e. the device shall trip instantaneous.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#3242=IFCSIMPLEPROPERTYTEMPLATE('0SP5qsv2P3OAuO1nh1vR5s',$,'T5','The electromagnetic testing time in [s] associated with the testing currents I4 and I5, i.e. electromagnetic tripping time',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3243=IFCSIMPLEPROPERTYTEMPLATE('0a6ImfC9H7CRHEOFhCxd7i',$,'CurveDesignation','The designation of the trippingcurve given by the manufacturer. For a MCB the designation should be in accordance with the designations given in IEC 60898.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3244=IFCPROPERTYSETTEMPLATE('0F4_qz$jjALh70e_VI$6GH',$,'Pset_ProtectiveDeviceTrippingUnitTypeElectronic','Information on tripping units that are electronically tripped.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit/ELECTRONIC,IfcProtectiveDeviceTrippingUnitType/ELECTRONIC',(#3245,#3247,#3248,#3249,#3250,#3251)); +#3245=IFCSIMPLEPROPERTYTEMPLATE('21HzPRWlb2dhnpN_9fEi3a',$,'ElectronicTrippingUnitType','A list of the available types of electronic tripping unit from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3246,$,$,$,.READWRITE.); +#3246=IFCPROPERTYENUMERATION('PEnum_ElectronicTrippingUnitType',(IFCLABEL('EP_BM'),IFCLABEL('EP_MP'),IFCLABEL('EP_SC'),IFCLABEL('EP_STD'),IFCLABEL('EP_TIMEDELAYED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3247=IFCSIMPLEPROPERTYTEMPLATE('1z2zOBW9D1CQ5ELkXyf5P_',$,'NominalCurrents','A set of values providing information on available modules (chips) for setting the nominal current of the protective device.\X2\000A000A\X0\A set of values providing information on available modules (chips) for setting the nominal current of the protective device. If\X2\000A\X0\the set is empty, no nominal current modules are available for the tripping unit.',.P_LISTVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3248=IFCSIMPLEPROPERTYTEMPLATE('2Na1uX401C5PoMwZanRz4v',$,'N_Protection','An indication whether the electronic tripping unit has separate protection for the N conductor, or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3249=IFCSIMPLEPROPERTYTEMPLATE('3M3NVxUtTFD8$rbAOq8CpR',$,'N_Protection_50','An indication whether the electronic tripping unit is tripping if the current in the N conductor is more than 50% of that of the phase conductors. The property is only asserted if the property N_Protection is asserted.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3250=IFCSIMPLEPROPERTYTEMPLATE('0JRm8aEHL7m8dG40Uueh4S',$,'N_Protection_100','An indication whether the electronic tripping unit is tripping if the current in the N conductor is more than 100% of that of the phase conductors. The property is only asserted if the property N_Protection is asserted.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3251=IFCSIMPLEPROPERTYTEMPLATE('0ctuC1uWT77fnnfOt4cWlG',$,'N_Protection_Select','An indication whether the use of the N_Protection can be selected by the user or not. If both the properties N_Protection_50 and N_Protection_100 are asserted, the value of N_Protection_Select property is set to TRUE. The property is only asserted if the property N_Protection is asserted.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3252=IFCPROPERTYSETTEMPLATE('0UBbYW1IP3nwahyKcX8XR3',$,'Pset_ProtectiveDeviceTrippingUnitTypeResidualCurrent','Information on tripping units that are activated by residual current.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit/RESIDUALCURRENT,IfcProtectiveDeviceTrippingUnitType/RESIDUALCURRENT',(#3253)); +#3253=IFCSIMPLEPROPERTYTEMPLATE('1RqvksBu16Jer$R8uWvP8K',$,'TrippingUnitReleaseCurrent','The value of tripping or residual current for which the device has the possibility to be equipped. The values are given in mA.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3254,$,$,$,.READWRITE.); +#3254=IFCPROPERTYENUMERATION('PEnum_TrippingUnitReleaseCurrent',(IFCLABEL('10'),IFCLABEL('100'),IFCLABEL('1000'),IFCLABEL('30'),IFCLABEL('300'),IFCLABEL('500'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3255=IFCPROPERTYSETTEMPLATE('3oIO_pTG57UeRkHtLlOXH8',$,'Pset_ProtectiveDeviceTrippingUnitTypeThermal','Information on tripping units that are thermally tripped.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit/THERMAL,IfcProtectiveDeviceTrippingUnitType/THERMAL',(#3256,#3258,#3259,#3260,#3261,#3262,#3263)); +#3256=IFCSIMPLEPROPERTYTEMPLATE('1wiheaZrb5uxmUxNd1qsQX',$,'ThermalTrippingUnitType','A list of the available types of thermal tripping unit from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3257,$,$,$,.READWRITE.); +#3257=IFCPROPERTYENUMERATION('PEnum_ThermalTrippingUnitType',(IFCLABEL('DIAZED'),IFCLABEL('MINIZED'),IFCLABEL('NEOZED'),IFCLABEL('NH_FUSE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3258=IFCSIMPLEPROPERTYTEMPLATE('1kupzJk3j93O5d__W8SvuZ',$,'I1','The (thermal) lower testing current limit in [x In], indicating that for currents lower than I1, the tripping time shall be longer than the associated tripping time, T2.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#3259=IFCSIMPLEPROPERTYTEMPLATE('036_UrtTT7XhloSSHPvZ8X',$,'I2','The (thermal) upper testing current limit in [x In], indicating that for currents larger than I2, the tripping time shall be shorter than the associated tripping time, T2.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#3260=IFCSIMPLEPROPERTYTEMPLATE('3xeVxZmsv4sPbKoYkANcQG',$,'T2','The (thermal) testing time in [s] associated with the testing currents I1 and I2.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3261=IFCSIMPLEPROPERTYTEMPLATE('24Z1qzNqv8rgEVhd2Yli9e',$,'DefinedTemperature','The ambient temperature at which the thermal current/time-curve associated with this protection device is defined.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3262=IFCSIMPLEPROPERTYTEMPLATE('3Tvb_pd$X3r8befPXnCufT',$,'TemperatureFactor','The correction factor (typically measured as %/deg K) for adjusting the thermal current/time to an ambient temperature different from the value given by the defined temperature.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3263=IFCSIMPLEPROPERTYTEMPLATE('37zr_l22D3hAoS9ah$FJXs',$,'CurveDesignation','The designation of the trippingcurve given by the manufacturer. For a MCB the designation should be in accordance with the designations given in IEC 60898.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3264=IFCPROPERTYSETTEMPLATE('3MT4AzSRHBYhdJncyGQcRA',$,'Pset_ProtectiveDeviceTypeAntiArcingDevice','Anti arcing device properties used in energy domain. The property set can be used by the predefined type ANTI_ARCING_DEVICE of IfcProtectiveDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/ANTI_ARCING_DEVICE,IfcProtectiveDeviceType/ANTI_ARCING_DEVICE',(#3265,#3266)); +#3265=IFCSIMPLEPROPERTYTEMPLATE('1uDsnqe7DFdfIQbshBe2vr',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#3266=IFCSIMPLEPROPERTYTEMPLATE('1TUYNsNar1K9N2rYVrdFJo',$,'GroundingType','The type of grounding connection.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3267=IFCPROPERTYSETTEMPLATE('3kgUseP8XFMRixZS6KFOOp',$,'Pset_ProtectiveDeviceTypeCircuitBreaker','A coherent set of attributes representing different capacities of a circuit breaker or of a motor protection device, defined in accordance with IEC 60947. Note - A protective device may be associated with different instances of this property set providing information related to different basic characteristics.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/CIRCUITBREAKER,IfcProtectiveDeviceType/CIRCUITBREAKER',(#3268,#3269,#3271,#3272,#3273,#3274)); +#3268=IFCSIMPLEPROPERTYTEMPLATE('21Eau$yMnAMPVAeNxqFkDr',$,'PerformanceClasses','A set of designations of performance classes for the breaker unit for which the data of this instance is valid.\X2\000A000A\X0\A set of designations of performance classes for the breaker unit for which the data of this instance is valid. A breaker unit being a circuit breaker may be\X2\000A\X0\constructed for different levels of breaking capacities. A maximum of 7 different\X2\000A\X0\performance classes may be provided. Examples of performance classes that may be specified include B, C, N, S, H, L, V.',.P_LISTVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3269=IFCSIMPLEPROPERTYTEMPLATE('39DHUVQ3n0Z91VnLk32I77',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3270,$,$,$,.READWRITE.); +#3270=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3271=IFCSIMPLEPROPERTYTEMPLATE('3jvbe56QP1_8dlTiuf2mt8',$,'ICU60947','The ultimate breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3272=IFCSIMPLEPROPERTYTEMPLATE('3gGB6yPNj7F82K6i8hVwCf',$,'ICS60947','The service breaking capacity in [A] for an object tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3273=IFCSIMPLEPROPERTYTEMPLATE('18tCIXWq15wAraZUs9OwO2',$,'ICW60947','The thermal withstand current in [A] for a circuit breaker or motor protection device tested in accordance with the IEC 60947 series. The value shall be related to 1 s.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3274=IFCSIMPLEPROPERTYTEMPLATE('14QTa8YyX0ngVk4sQ1Phrx',$,'ICM60947','The making capacity in [A] for a circuit breaker or motor protection device tested in accordance with the IEC 60947 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3275=IFCPROPERTYSETTEMPLATE('2$OgGJSDHDcuUivlnK8C_B',$,'Pset_ProtectiveDeviceTypeCommon','Properties that are applied to a definition of a protective device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#3276,#3277)); +#3276=IFCSIMPLEPROPERTYTEMPLATE('05uIFQZ7H1zuUX6X$kE52j',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3277=IFCSIMPLEPROPERTYTEMPLATE('0AB51clUj2yQf01D4FroAe',$,'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',$,#3278,$,$,$,.READWRITE.); +#3278=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3279=IFCPROPERTYSETTEMPLATE('1BNihxef9CfeDzPFdQLsyj',$,'Pset_ProtectiveDeviceTypeEarthLeakageCircuitBreaker','An earth failure device acts to protect people and equipment from the effects of current leakage.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/EARTHLEAKAGECIRCUITBREAKER,IfcProtectiveDeviceType/EARTHLEAKAGECIRCUITBREAKER',(#3280,#3282)); +#3280=IFCSIMPLEPROPERTYTEMPLATE('0Ht7DmZSH2neSBjgAJODtc',$,'EarthFailureDeviceType','A list of the available types of circuit breaker from which that required may be selected where:Standard: Device that operates without a time delay.\X2\000A\X0\TimeDelayed: Device that operates after a time delay.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3281,$,$,$,.READWRITE.); +#3281=IFCPROPERTYENUMERATION('PEnum_EarthFailureDeviceType',(IFCLABEL('STANDARD'),IFCLABEL('TIMEDELAYED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3282=IFCSIMPLEPROPERTYTEMPLATE('0UXMeNPin42xr12EDrVN7P',$,'Sensitivity','Sensitivity.\X2\000A000A\X0\The rated rms value of the vector sum of the instantaneous currents flowing in the main circuits of the device which causes the device to operate under specified conditions. (IEC 61008-1).',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3283=IFCPROPERTYSETTEMPLATE('2$$$B9sKX8AAwS3NuB43GC',$,'Pset_ProtectiveDeviceTypeFuseDisconnector','A coherent set of attributes representing the breaking capacity of a fuse, defined in accordance with IEC 60269. Note - A protective device may be associated with different instances of this pSet providing information related to different basic characteristics.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/FUSEDISCONNECTOR,IfcProtectiveDeviceType/FUSEDISCONNECTOR',(#3284,#3286,#3288,#3289,#3290,#3291,#3292,#3293,#3294,#3295,#3296,#3297,#3298)); +#3284=IFCSIMPLEPROPERTYTEMPLATE('3bLyw2twz3VOO6bl2BGVAG',$,'FuseDisconnectorType','A list of the available types of fuse disconnector from which that required may be selected where:EngineProtectionDevice: A fuse whose characteristic is specifically designed for the protection of a motor or generator.\X2\000A\X0\FuseSwitchDisconnector: A switch disconnector in which a fuse link or a fuse carrier with fuse link forms the moving contact,\X2\000A\X0\HRC: A standard fuse (High Rupturing Capacity)\X2\000A\X0\OverloadProtectionDevice: A device that disconnects the supply when the operating conditions in an electrically undamaged circuit causes an overcurrent,\X2\000A\X0\SemiconductorFuse: A fuse whose characteristic is specifically designed for the protection of sem-conductor devices.\X2\000A\X0\SwitchDisconnectorFuse: A switch disconnector in which one or more poles have a fuse in series in a composite unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3285,$,$,$,.READWRITE.); +#3285=IFCPROPERTYENUMERATION('PEnum_FuseDisconnectorType',(IFCLABEL('ENGINEPROTECTIONDEVICE'),IFCLABEL('FUSEDSWITCH'),IFCLABEL('HRC'),IFCLABEL('OVERLOADPROTECTIONDEVICE'),IFCLABEL('SWITCHDISCONNECTORFUSE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3286=IFCSIMPLEPROPERTYTEMPLATE('12VDOZePL5ewDQbQ$el36w',$,'VoltageLevel','The voltage levels for which the data of the instance is valid. More than one value may be selected in the enumeration.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3287,$,$,$,.READWRITE.); +#3287=IFCPROPERTYENUMERATION('PEnum_VoltageLevels',(IFCLABEL('U1000'),IFCLABEL('U230'),IFCLABEL('U400'),IFCLABEL('U440'),IFCLABEL('U525'),IFCLABEL('U690'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3288=IFCSIMPLEPROPERTYTEMPLATE('3Zx$BNXuLEe9KGDPYbgWTb',$,'IC60269','The breaking capacity in [A] for fuses in accordance with the IEC 60269 series.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3289=IFCSIMPLEPROPERTYTEMPLATE('36dsYLofX7ORbx8kSNNSfz',$,'PowerLoss','The power loss in [W].\X2\000A000A\X0\The power loss in [W] of the fuse when the nominal current is flowing through the fuse.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#3290=IFCSIMPLEPROPERTYTEMPLATE('3clwxNLGn1CwAKllcVPuxe',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3291=IFCSIMPLEPROPERTYTEMPLATE('3ohfp3$xf79AKpPjOv3Zfu',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3292=IFCSIMPLEPROPERTYTEMPLATE('3VkYNv9nr7i8JsRxsTp0o3',$,'BreakingCapacity','The current that a fuse, circuit breaker, or other electrical apparatus is able to interrupt without being destroyed or causing an electric arc with unacceptable duration.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3293=IFCSIMPLEPROPERTYTEMPLATE('3E0rEVCND65xxh0Wvf5wGB',$,'ArcExtinctionType','Type of arc extinction used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3294=IFCSIMPLEPROPERTYTEMPLATE('0OKcUmEBPDzv5OBh$0DRBP',$,'NumberOfPoles','Number of poles that the object would affect.\X2\000A000A\X0\Number of poles that the equipment would affect.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3295=IFCSIMPLEPROPERTYTEMPLATE('0rcveU0dnFcRF$OJaGJnIh',$,'TransformationRatio','The ratio of the actual primary current or voltage to the actual secondary current or voltage.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3296=IFCSIMPLEPROPERTYTEMPLATE('3hgwHpMfH3tf3aJ81Ey0c5',$,'NominalFrequency','The nominal frequency of the supply.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#3297=IFCSIMPLEPROPERTYTEMPLATE('3CCmlNoZr2HQp2hEWozg2K',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3298=IFCSIMPLEPROPERTYTEMPLATE('2zWZXUYG9CfR67ajfUsNgO',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#3299=IFCPROPERTYSETTEMPLATE('39DDcdL1P8EhWSipEfRXUS',$,'Pset_ProtectiveDeviceTypeResidualCurrentCircuitBreaker','A residual current circuit breaker opens, closes or isolates a circuit and has short circuit and overload protection.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/RESIDUALCURRENTCIRCUITBREAKER,IfcProtectiveDeviceType/RESIDUALCURRENTCIRCUITBREAKER',(#3300)); +#3300=IFCSIMPLEPROPERTYTEMPLATE('1gorDrSTX8_fmHUhdNkb1l',$,'Sensitivity','Sensitivity.\X2\000A000A\X0\Current leakage to an unwanted leading path during normal operation (IEC 151-14-49).',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3301=IFCPROPERTYSETTEMPLATE('0VptKghmz1uBVEfvZlpCQa',$,'Pset_ProtectiveDeviceTypeResidualCurrentSwitch','A residual current switch opens, closes or isolates a circuit and has no short circuit or overload protection.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/RESIDUALCURRENTSWITCH,IfcProtectiveDeviceType/RESIDUALCURRENTSWITCH',(#3302)); +#3302=IFCSIMPLEPROPERTYTEMPLATE('2yztY0YaLDWvPhIEvYj3OK',$,'Sensitivity','Sensitivity.\X2\000A000A\X0\Current leakage to an unwanted leading path during normal operation (IEC 151-14-49).',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3303=IFCPROPERTYSETTEMPLATE('2Ii19NwuD8r9Vd4ShJ7Ctz',$,'Pset_ProtectiveDeviceTypeSparkGap','Spark gap properties used in energy domain. The property set can be used by the predefined type SPARKGAP and VOLTAGELIMITER of IfcProtectiveDevice.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/SPARKGAP,IfcProtectiveDevice/VOLTAGELIMITER,IfcProtectiveDeviceType/SPARKGAP,IfcProtectiveDeviceType/VOLTAGELIMITER',(#3304,#3305,#3306,#3307,#3308,#3310)); +#3304=IFCSIMPLEPROPERTYTEMPLATE('0IPQPggYHAIvro5UCzIvvP',$,'BreakdownVoltageTolerance','Nominal value of the spark gap breakdown voltage tolerance.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#3305=IFCSIMPLEPROPERTYTEMPLATE('3enJps6Vz9kwbR4F_Fsucp',$,'Capacitance','Maximum value of the capacitance between the electrodes at specified frequency and temperature.',.P_SINGLEVALUE.,'IfcElectricCapacitanceMeasure',$,$,$,$,$,.READWRITE.); +#3306=IFCSIMPLEPROPERTYTEMPLATE('0yyJxxVKH0Yx55KqcLVOsy',$,'CurrentRMS','Maximum rms (root mean square) current of an electric-electronic or electromechanical component at specified ambient temperature.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#3307=IFCSIMPLEPROPERTYTEMPLATE('1LOpaYyBL0P8I1Iihx6p7_',$,'PowerDissipation','Permissible power which may be dissipated continuously, at specified conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#3308=IFCSIMPLEPROPERTYTEMPLATE('1sr3OFrMD44x4$Vo6McyRF',$,'SparkGapType','Type of Spark gap.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3309,$,$,$,.READWRITE.); +#3309=IFCPROPERTYENUMERATION('PEnum_SparkGapType',(IFCLABEL('AIRSPARKGAP'),IFCLABEL('GASFILLEDSPARKGAP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3310=IFCSIMPLEPROPERTYTEMPLATE('38AaIzFO17zg$s$ssjtE_6',$,'Resistivity','Electrical resistivity of a rock or soil (Ohm-m).',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#3311=IFCPROPERTYSETTEMPLATE('0QErJJd5X7MA_HtjVMJH8Q',$,'Pset_ProtectiveDeviceTypeVaristor','A high voltage surge protection device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice/VARISTOR,IfcProtectiveDeviceType/VARISTOR',(#3312,#3314)); +#3312=IFCSIMPLEPROPERTYTEMPLATE('2$OlRAtsP3AOOiuSRom5Kk',$,'VaristorType','A list of the available types of varistor from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3313,$,$,$,.READWRITE.); +#3313=IFCPROPERTYENUMERATION('PEnum_VaristorType',(IFCLABEL('METALOXIDE'),IFCLABEL('ZINCOXIDE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3314=IFCSIMPLEPROPERTYTEMPLATE('1K$a6PvO91ZQNc_Zqj6UYZ',$,'CharacteristicFunction','The characteristic function to show the relationship between varistor current and voltage.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3315=IFCPROPERTYSETTEMPLATE('1xL6IQjbnDIwJJ3Hk9mY5z',$,'Pset_ProvisionForVoid','Properties for Provisions For Voids.',.PSET_OCCURRENCEDRIVEN.,'IfcBuildingElementProxy/PROVISIONFORVOID,IfcVirtualElement/PROVISIONFORVOID',(#3316,#3317,#3318,#3319,#3320,#3321)); +#3316=IFCSIMPLEPROPERTYTEMPLATE('2JNt2Nfy9DKRvvdAiRN29F',$,'VoidShape','The shape form of the provision for void, the minimum set of agreed values includes ''Rectangle'', ''Round'', and ''Undefined''.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3317=IFCSIMPLEPROPERTYTEMPLATE('33PpWzmen44g7gU4bN3rEy',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3318=IFCSIMPLEPROPERTYTEMPLATE('3ghr3_yrH30PsZ5GZ6ISsE',$,'Height','Characteristic height\X2\000A000A\X0\Vertical extension in elevation. Only provided if the Shape property is set to "rectangle".',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3319=IFCSIMPLEPROPERTYTEMPLATE('1$gyVXGmn1CeJtUph_6O$N',$,'Diameter','The Diameter of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3320=IFCSIMPLEPROPERTYTEMPLATE('2zQD9GsSb7axzJ_ZgtYx60',$,'Depth','The depth of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3321=IFCSIMPLEPROPERTYTEMPLATE('2kJKkG$uz9oPXe3RGdvke5',$,'System','The building service system that requires the provision for voids, e.g. ''Air Conditioning'', ''Plumbing'', ''Electro'', etc.\X2\000A000A\X0\Reference to the building service is done using the Name attribute.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3322=IFCPROPERTYSETTEMPLATE('1j$T13utDBF9R1C90EXPkX',$,'Pset_PumpOccurrence','Pump occurrence attributes attached to an instance of IfcPump.',.PSET_OCCURRENCEDRIVEN.,'IfcPump',(#3323,#3324,#3326)); +#3323=IFCSIMPLEPROPERTYTEMPLATE('3bKmcCPP11_wDG0dZgd$zT',$,'ImpellerDiameter','Diameter of object - used to scale performance of geometrically similar objects.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3324=IFCSIMPLEPROPERTYTEMPLATE('2nAKlEY5f7_87PIFB3rY$L',$,'BaseType','Defines general types of pump bases.FRAME: Frame.\X2\000A\X0\BASE: Base.\X2\000A\X0\NONE: There is no pump base, such as an inline pump.\X2\000A\X0\OTHER: Other type of pump base.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3325,$,$,$,.READWRITE.); +#3325=IFCPROPERTYENUMERATION('PEnum_PumpBaseType',(IFCLABEL('BASE'),IFCLABEL('FRAME'),IFCLABEL('NONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3326=IFCSIMPLEPROPERTYTEMPLATE('0hpuEKiCX5bOJ$YjoaTllH',$,'DriveConnectionType','The way the pump drive mechanism is connected to the pump.DIRECTDRIVE: Direct drive.\X2\000A\X0\BELTDRIVE: Belt drive.\X2\000A\X0\COUPLING: Coupling.\X2\000A\X0\OTHER: Other type of drive connection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3327,$,$,$,.READWRITE.); +#3327=IFCPROPERTYENUMERATION('PEnum_PumpDriveConnectionType',(IFCLABEL('BELTDRIVE'),IFCLABEL('COUPLING'),IFCLABEL('DIRECTDRIVE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3328=IFCPROPERTYSETTEMPLATE('0Zv0FCrUbCW8525Nrv3cT1',$,'Pset_PumpPHistory','Pump performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcPump',(#3329,#3330,#3331,#3332,#3333,#3334)); +#3329=IFCSIMPLEPROPERTYTEMPLATE('3hhcmOZGH2kP5gfGNtZv_h',$,'MechanicalEfficiency','The objects operational mechanical efficiency.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3330=IFCSIMPLEPROPERTYTEMPLATE('3tOQmTs1XEmQlqH5QRwdAi',$,'OverallEfficiency','Total efficiency of object.\X2\000A000A\X0\The pump and motor overall operational efficiency.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3331=IFCSIMPLEPROPERTYTEMPLATE('1EbnQ5v1zA6xTWnkNOuP_F',$,'PressureRise','The developed pressure.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3332=IFCSIMPLEPROPERTYTEMPLATE('1pOTxLqRD5OPb3eiENfh0a',$,'RotationSpeed','Pump rotational speed.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3333=IFCSIMPLEPROPERTYTEMPLATE('0PMNaMfqTFGgE0nMR_SaTP',$,'Flowrate','The flowrate of the fluid.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3334=IFCSIMPLEPROPERTYTEMPLATE('2Y$ablX8DCXPpZosROcXfy',$,'PowerHistory','The actual power consumption of the pump.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3335=IFCPROPERTYSETTEMPLATE('1EgOQA1Fb6AfcUflXeLo9W',$,'Pset_PumpTypeCommon','Common attributes of a pump type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPump,IfcPumpType',(#3336,#3337,#3339,#3340,#3341,#3342,#3343,#3344)); +#3336=IFCSIMPLEPROPERTYTEMPLATE('1ki$SfvYj80QA8J9qn3YdK',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3337=IFCSIMPLEPROPERTYTEMPLATE('1Gkd$bqcTAjQJOaNrxnYHP',$,'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',$,#3338,$,$,$,.READWRITE.); +#3338=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3339=IFCSIMPLEPROPERTYTEMPLATE('3niewp6kT51QJMiiJ91eDy',$,'FlowRateRange','Allowable range of volume of fluid being pumped against the resistance specified.',.P_BOUNDEDVALUE.,'IfcMassFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#3340=IFCSIMPLEPROPERTYTEMPLATE('1LDvqQxXP7CRh3SQOkaa7E',$,'FlowResistanceRange','Allowable range of frictional resistance against which the fluid is being pumped.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#3341=IFCSIMPLEPROPERTYTEMPLATE('3MH3$O1H1Drue$mBNJk_NL',$,'ConnectionSize','The connection size of the object.\X2\000A000A\X0\The connection to and from the pump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3342=IFCSIMPLEPROPERTYTEMPLATE('2RTK4LtJH7SQuHaEQmwm8Y',$,'TemperatureRange','Allowable maximum and minimum temperature.\X2\000A000A\X0\Allowable operational range of the fluid temperature.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3343=IFCSIMPLEPROPERTYTEMPLATE('1S9SxSNgz6Nvb7l0gVHMd8',$,'NetPositiveSuctionHead','Minimum liquid pressure at the pump inlet to prevent cavitation.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#3344=IFCSIMPLEPROPERTYTEMPLATE('07AgW6LDnDEu4PubnjeQVH',$,'NominalRotationSpeed','Rotational speed of the object under nominal conditions.\X2\000A000A\X0\Pump rotational speed under nominal conditions.',.P_SINGLEVALUE.,'IfcRotationalFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#3345=IFCPROPERTYSETTEMPLATE('0qkGaznpz7XgmF3Il2SsYZ',$,'Pset_QuayCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to QUAY.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/QUAY',(#3346,#3347,#3348,#3350)); +#3346=IFCSIMPLEPROPERTYTEMPLATE('3glLE63rvDixXj9AtBMSH0',$,'StructuralType','Structural type of the object',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3347=IFCSIMPLEPROPERTYTEMPLATE('0ruqynndXCTQAk3cr08vGZ',$,'BentSpacing','Bent (upright) spacing',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3348=IFCSIMPLEPROPERTYTEMPLATE('3MY7CeJF90q96jjVcW7Jry',$,'QuaySectionType','Whether the structure presents a solid/closed barrier to the passage of water or is open.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3349,$,$,$,.READWRITE.); +#3349=IFCPROPERTYENUMERATION('PEnum_SectionType',(IFCLABEL('CLOSED'),IFCLABEL('OPEN')),$); +#3350=IFCSIMPLEPROPERTYTEMPLATE('2LCXqusg1CGRSNxeRt409Q',$,'Elevation','Elevation of the entity',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3351=IFCPROPERTYSETTEMPLATE('0NJ2Qn0an3lf30xuH0NCXw',$,'Pset_QuayDesignCriteria','Properties common to the definition of design criteria of all occurrences of IfcMarineFacility with the predefined type set to QUAY.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/QUAY',(#3352,#3353,#3354,#3355,#3356,#3357,#3358,#3359,#3360)); +#3352=IFCSIMPLEPROPERTYTEMPLATE('0MN_NhHwLDyB_ahbNXfMkf',$,'HighWaterLevel','High water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3353=IFCSIMPLEPROPERTYTEMPLATE('2CFduc96T8ZwwHjjXsDCtf',$,'LowWaterLevel','Low water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3354=IFCSIMPLEPROPERTYTEMPLATE('1qACqVXoP5s9JVGcxrJ7Cl',$,'ExtremeHighWaterLevel','Extreme high water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3355=IFCSIMPLEPROPERTYTEMPLATE('23upb4dh5Fl9vRxVEcv1qJ',$,'ExtremeLowWaterLevel','Extreme low water level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3356=IFCSIMPLEPROPERTYTEMPLATE('1A_VnYU051Ke1kU3K0yarl',$,'ShipLoading','Ship loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#3357=IFCSIMPLEPROPERTYTEMPLATE('2VGY7eX_HENBfJx60vlS06',$,'WaveLoading','Wave loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#3358=IFCSIMPLEPROPERTYTEMPLATE('3FI8ZU2MP2JPDJ2xOsQtI8',$,'FlowLoading','Flow loading force',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#3359=IFCSIMPLEPROPERTYTEMPLATE('0_lbdu$lb9KPVX$mHcq6lS',$,'UniformlyDistributedLoad','Uniformly Distributed Load',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#3360=IFCSIMPLEPROPERTYTEMPLATE('3U6_TYVOjF58CbdDMXKJcM',$,'EquipmentLoading','Loading from equipment',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#3361=IFCPROPERTYSETTEMPLATE('3yv1UHnc19AukeBc_sYKve',$,'Pset_RadiiKerbStone','Properties describing the keb stone radii.',.PSET_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#3362,#3364)); +#3362=IFCSIMPLEPROPERTYTEMPLATE('1aHouksbfDye1E26eB4FoN',$,'CurveShape','Shape according to CurveShapeEnum',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3363,$,$,$,.READWRITE.); +#3363=IFCPROPERTYENUMERATION('PEnum_CurveShapeEnum',(IFCLABEL('EXTERNAL'),IFCLABEL('INTERNAL')),$); +#3364=IFCSIMPLEPROPERTYTEMPLATE('1wx5qKDufFZR9fiikOdCNh',$,'Radius','The radius of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3365=IFCPROPERTYSETTEMPLATE('3OtYaiYNb6$9GTJ_N$fEJL',$,'Pset_RailingCommon','Properties common to the definition of all occurrences of IfcRailing.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRailing,IfcRailingType',(#3366,#3367,#3369,#3370,#3371)); +#3366=IFCSIMPLEPROPERTYTEMPLATE('3M$GJCSJTDn8bz4lRLOe3d',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3367=IFCSIMPLEPROPERTYTEMPLATE('1gi8fTen13Ffc9RnGGsm5W',$,'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',$,#3368,$,$,$,.READWRITE.); +#3368=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3369=IFCSIMPLEPROPERTYTEMPLATE('3A8uossHLAHe7ca9K9adaw',$,'Height','Characteristic height\X2\000A000A\X0\It is the upper height of the railing above the floor or stair.\X2\000A\X0\The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3370=IFCSIMPLEPROPERTYTEMPLATE('1m65CRhI159ABEpDivLoYp',$,'Diameter','The Diameter of the object.\X2\000A000A\X0\Specifically handrail of the railing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3371=IFCSIMPLEPROPERTYTEMPLATE('0NEF6EaHT3$OQMrTGh4TrG',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3372=IFCPROPERTYSETTEMPLATE('3Fvh1Fpk1FluwawoiXtfh5',$,'Pset_RailTypeBlade','Properties common to IfcRail types and occurrences with PredefinedType set to BLADE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRail/BLADE,IfcRailType/BLADE',(#3373,#3374,#3375,#3376)); +#3373=IFCSIMPLEPROPERTYTEMPLATE('1ffA7IyQH4FA9Qdz8obRO8',$,'IsArticulatedBlade','Indicates whether the blade is articulated or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3374=IFCSIMPLEPROPERTYTEMPLATE('3WxQaRYmjBjO5kSQaOfhqL',$,'IsFallbackBlade','Indicates whether the blade always returns to the same position as a trailable turnout or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3375=IFCSIMPLEPROPERTYTEMPLATE('0vcMEMkQj04h8kTW1lz7Kx',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3376=IFCSIMPLEPROPERTYTEMPLATE('3uD$qvx3PA6Qfhgd8wCYEJ',$,'BladeRadius','The radius of the blade bend defined as design parameter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3377=IFCPROPERTYSETTEMPLATE('0hswIxaMX2MuKURlHxSP6F',$,'Pset_RailTypeCheckRail','Properties common to IfcRail types and occurrences with PredefinedType set to CHECKRAIL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRail/CHECKRAIL,IfcRailType/CHECKRAIL',(#3378,#3380)); +#3378=IFCSIMPLEPROPERTYTEMPLATE('218gQr3NfFPPqeZnYr4rsB',$,'CheckRailType','Type of the check rail. Check rail types enumerated in this property are defined based on EN 13674.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3379,$,$,$,.READWRITE.); +#3379=IFCPROPERTYENUMERATION('PEnum_CheckRailType',(IFCLABEL('TYPE_33C1'),IFCLABEL('TYPE_40C1'),IFCLABEL('TYPE_47C1'),IFCLABEL('TYPE_CR3_60U'),IFCLABEL('TYPE_R260'),IFCLABEL('TYPE_R320CR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3380=IFCSIMPLEPROPERTYTEMPLATE('0I7Ie$zJn3mwibufiqEzwR',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#3381=IFCPROPERTYSETTEMPLATE('20mzhvd9fC5wP429dmfk5K',$,'Pset_RailTypeGuardRail','Properties common to IfcRail types and occurrences with PredefinedType set to GUARDRAIL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRail/GUARDRAIL,IfcRailType/GUARDRAIL',(#3382,#3384,#3386)); +#3382=IFCSIMPLEPROPERTYTEMPLATE('0gOb9MpEH63Q$ZicvKgjQj',$,'GuardRailConnection','Indicates how the guard rail is connected along its length, when the fasteners are not explicitly modelled.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3383,$,$,$,.READWRITE.); +#3383=IFCPROPERTYENUMERATION('PEnum_GuardRailConnection',(IFCLABEL('FISHPLATE'),IFCLABEL('NONE'),IFCLABEL('WELD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3384=IFCSIMPLEPROPERTYTEMPLATE('3GIeJAei53SfEQ8qZiTgty',$,'PositionInTrack','Indicates the relative position of the element in track, which lies to the left or right as facing in the direction of increasing stationing values.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3385,$,$,$,.READWRITE.); +#3385=IFCPROPERTYENUMERATION('PEnum_RelativePosition',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3386=IFCSIMPLEPROPERTYTEMPLATE('3eBBAJeUT4wu4PAlSPQre2',$,'GuardRailType','Type of the guard rail.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3387,$,$,$,.READWRITE.); +#3387=IFCPROPERTYENUMERATION('PEnum_GuardRailType',(IFCLABEL('GUARDRAILANDSPOTSLEEPERS'),IFCLABEL('GUARDRAILSONLY'),IFCLABEL('SPOTSLEEPERSONLY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3388=IFCPROPERTYSETTEMPLATE('1pZzvi3MvB3QEGTmrQyaS0',$,'Pset_RailTypeRail','Properties common to IfcRail types and occurrences with PredefinedType set to RAIL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRail/RAIL,IfcRailType/RAIL',(#3389,#3391,#3392,#3394,#3396,#3398,#3400,#3401,#3402)); +#3389=IFCSIMPLEPROPERTYTEMPLATE('0t4q_5MCLDtPx3sNi4HTH4',$,'PositionInTrack','Indicates the relative position of the element in track, which lies to the left or right as facing in the direction of increasing stationing values.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3390,$,$,$,.READWRITE.); +#3390=IFCPROPERTYENUMERATION('PEnum_RelativePosition',(IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3391=IFCSIMPLEPROPERTYTEMPLATE('1xfBfQ7tz0Sxzp0zd$fy1t',$,'TechnicalStandard','The technical standard which the element should comply with.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#3392=IFCSIMPLEPROPERTYTEMPLATE('3$dR4nOjT5593Zp1LaffuM',$,'RailDeliveryState','The delivery state of rail, which indicates the final treatment at the end in manufacturing.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3393,$,$,$,.READWRITE.); +#3393=IFCPROPERTYENUMERATION('PEnum_RailDeliveryState',(IFCLABEL('HEATTREATMENT'),IFCLABEL('HOTROLLING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3394=IFCSIMPLEPROPERTYTEMPLATE('23_lzeGM1EOQBRb3tudhhy',$,'RailCondition','Assessment of the condition of the rail at point of installation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3395,$,$,$,.READWRITE.); +#3395=IFCPROPERTYENUMERATION('PEnum_RailCondition',(IFCLABEL('NEWRAIL'),IFCLABEL('REGENERATEDRAIL'),IFCLABEL('REUSEDRAIL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3396=IFCSIMPLEPROPERTYTEMPLATE('2SaJ6PRivByvuRn1j6Mwt5',$,'DrillOnRail','Indicates if the manufactured rail is drilled at its extremities or not. It can have holes on one, both or none of its extremities.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3397,$,$,$,.READWRITE.); +#3397=IFCPROPERTYENUMERATION('PEnum_DrillOnRail',(IFCLABEL('BOTHENDS'),IFCLABEL('NONE'),IFCLABEL('ONEEND'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3398=IFCSIMPLEPROPERTYTEMPLATE('0IUzfNjV12AR4PI9qioXIp',$,'RailElementaryLength','The standardised length of rail supplied from the manufacturer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3399,$,$,$,.READWRITE.); +#3399=IFCPROPERTYENUMERATION('PEnum_RailElementaryLength',(IFCLABEL('100M'),IFCLABEL('108M'),IFCLABEL('120M'),IFCLABEL('12M'),IFCLABEL('144M'),IFCLABEL('18M'),IFCLABEL('24M'),IFCLABEL('25M'),IFCLABEL('27M'),IFCLABEL('30M'),IFCLABEL('36M'),IFCLABEL('400M'),IFCLABEL('48M'),IFCLABEL('54M'),IFCLABEL('60M'),IFCLABEL('6M'),IFCLABEL('72M'),IFCLABEL('75M'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3400=IFCSIMPLEPROPERTYTEMPLATE('3h2OqKzxD0OQRjHIGr_ejb',$,'MinimumTensileStrength','Indicates the minimum tensile strength.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#3401=IFCSIMPLEPROPERTYTEMPLATE('3PxfOLqST6xB_UmsetdUVq',$,'IsStainless','Indicates whether the rail is stainless or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3402=IFCSIMPLEPROPERTYTEMPLATE('2gYb7TGxL7PO9yb1vVyd74',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#3403=IFCPROPERTYSETTEMPLATE('1T$3zEfXDDbvhb5qXom6PZ',$,'Pset_RailTypeStockRail','Properties common to IfcRail types and occurrences with PredefinedType set to STOCKRAIL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRail/STOCKRAIL,IfcRailType/STOCKRAIL',(#3404,#3405,#3406)); +#3404=IFCSIMPLEPROPERTYTEMPLATE('3aTC$PiVz42ewRu7UTKXrR',$,'StockRailRadius','The radius of the stock rail bend defined as design parameter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3405=IFCSIMPLEPROPERTYTEMPLATE('1B39mzmzT3ePcTvKhp7jCR',$,'InstallationPlan','Reference to external information source about installation or construction plan of the element.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#3406=IFCSIMPLEPROPERTYTEMPLATE('1NtD2q2Tz4JBPbPYJ81GTB',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3407=IFCPROPERTYSETTEMPLATE('0JUs_zTtL29edzaAwm_or5',$,'Pset_RailwayBalise','Properties applicable to a railway balise. This property set is applied to a type or occurrence of IfcCommunicationsAppliance with predefined type TRANSPONDER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/TRANSPONDER,IfcCommunicationsApplianceType/TRANSPONDER',(#3408,#3409,#3410,#3411,#3412,#3413,#3415,#3416,#3417,#3418,#3419)); +#3408=IFCSIMPLEPROPERTYTEMPLATE('3eQM$dcx59wwWuFgqtSVjU',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3409=IFCSIMPLEPROPERTYTEMPLATE('3js5C4tQj8LRUBw5fvi8rl',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3410=IFCSIMPLEPROPERTYTEMPLATE('2rfyDYNBj6NvgQT46Ezy3E',$,'NominalWeight','Nominal weight of the object.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#3411=IFCSIMPLEPROPERTYTEMPLATE('0PzCnIeZT1jfUXUKP_3Ded',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3412=IFCSIMPLEPROPERTYTEMPLATE('2DQGdHrC5CfOcnF3ERuUil',$,'FailureInformation','The information for failure description.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3413=IFCSIMPLEPROPERTYTEMPLATE('06z8yYbSLBqu2mOXguTcwZ',$,'RailwayBaliseType','Type of the railway balise.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3414,$,$,$,.READWRITE.); +#3414=IFCPROPERTYENUMERATION('PEnum_RailwayBaliseType',(IFCLABEL('ACTIVEBALISE'),IFCLABEL('PASSIVEBALISE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3415=IFCSIMPLEPROPERTYTEMPLATE('3Vob2Hmi9B5RiLCPydjg4I',$,'DetectionRange','The detection range of the equipment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3416=IFCSIMPLEPROPERTYTEMPLATE('3yNv_zFuD1XfgGt55IKY0C',$,'InformationLength','Indicates supported bytes of the data Information, e.g.127 bytes.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#3417=IFCSIMPLEPROPERTYTEMPLATE('20xS0T9dr2CBpaPtgHsgNT',$,'TransmissionRate','Data transmission rate between the device and the receiving module in bits per second.',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); +#3418=IFCSIMPLEPROPERTYTEMPLATE('0xwPkyxw98yAq_Pz6aVGxD',$,'OperationalTemperatureRange','The temperature range in which the device operates normally.\X2\000A000A\X0\Allowable operation ambient air temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3419=IFCSIMPLEPROPERTYTEMPLATE('2dsKHq1Rf0CPaSGY7w9_Mw',$,'IP_Code','IP Code, the International Protection Marking, IEC 60529), classifies and rates the degree of protection provided against intrusion.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3420=IFCPROPERTYSETTEMPLATE('2U1LIAmNn49ghROVcG0ri3',$,'Pset_RailwayCableCarrier','Common properties for cable carrier segments constructed in railway projects.',.PSET_OCCURRENCEDRIVEN.,'IfcCableCarrierSegment',(#3421)); +#3421=IFCSIMPLEPROPERTYTEMPLATE('11NO2bofH4Lg1nI1KGBiXB',$,'NumberOfCrossedTracks','Number of tracks crossed in cable route.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3422=IFCPROPERTYSETTEMPLATE('1h0KgWa4f9lfYGr_FNxc0v',$,'Pset_RailwayLevelCrossing','Properties applicable to IfcFacilityPartCommon with PredefinedType set to LEVELCROSSING.',.PSET_OCCURRENCEDRIVEN.,'IfcFacilityPartCommon/LEVELCROSSING',(#3423,#3424,#3425,#3426,#3427,#3428)); +#3423=IFCSIMPLEPROPERTYTEMPLATE('3BXrSdk2n2cvrs6q97eDn0',$,'IsAccessibleByVehicle','Indicates whether the element is accessible by a vehicle or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3424=IFCSIMPLEPROPERTYTEMPLATE('2wSMHHAc5808X4vHkNaBXr',$,'HasRailDrainage','Indicates whether there is rail drainage or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3425=IFCSIMPLEPROPERTYTEMPLATE('0Ej0CKcK9DyfEBVp3I3LE5',$,'IsPrivateOwner','Indicates if the owner of the crossed road is private or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3426=IFCSIMPLEPROPERTYTEMPLATE('21WsjwAAf0JeNpY62p3MvS',$,'PermissiblePavementLoad','Permissible traffic load on the pavement.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#3427=IFCSIMPLEPROPERTYTEMPLATE('13Jw3zVcP3L9NgXQ7ryjGH',$,'IsSecuredBySignalingSystem','Indicates whether the level crossing is secured by a signalling system or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3428=IFCSIMPLEPROPERTYTEMPLATE('1m5eRJOqTB7et9ExM1BJIY',$,'IsExceptionalTransportRoute','Indicates whether the route is suitable for exceptional transport (load, structure gauge, road),',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3429=IFCPROPERTYSETTEMPLATE('34amSNfi1BDx$Vu_stH_em',$,'Pset_RailwaySignalAspect','Properties in this property set are applicable for IfcSignal and IfcSign applied in railways. These properties describe the signal aspect, which is the information on the signal or sign shown to the train driver.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSignal,IfcSign,IfcSignalType,IfcSignType',(#3430,#3431,#3433,#3434)); +#3430=IFCSIMPLEPROPERTYTEMPLATE('2ozKT73yn6MeAveh6xtUYr',$,'SignalAspectSymbol','Content which is shown on the signal or sign, e.g. text, number, arrow or icon.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#3431=IFCSIMPLEPROPERTYTEMPLATE('1xV4R5oOH0LxF83Vix0foA',$,'AppliesToTrainCategory','Sign information relative to train category, e.g. freight, passenger.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3432,$,$,$,.READWRITE.); +#3432=IFCPROPERTYENUMERATION('PEnum_TrainCategory',(IFCLABEL('FREIGHT'),IFCLABEL('PASSENGER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3433=IFCSIMPLEPROPERTYTEMPLATE('2TNTfsHbT8O9kdAEtxJ__K',$,'SignalAspectType','The type of aspect, e.g. 2-display aspect for distant signal, 3-display aspect for block signal.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3434=IFCSIMPLEPROPERTYTEMPLATE('3alvHMahb9SeYsRyBYxFu8',$,'SignLegend','Text information written on the signal or sign.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3435=IFCPROPERTYSETTEMPLATE('1u3QdZzNLFK87l5msgpTne',$,'Pset_RailwaySignalOccurrence','Properties common to the definition of occurrences of IfcSignal applied in railways.',.PSET_OCCURRENCEDRIVEN.,'IfcSignal',(#3436,#3437,#3438,#3439,#3440,#3441,#3442,#3443,#3444,#3445,#3446,#3447,#3448)); +#3436=IFCSIMPLEPROPERTYTEMPLATE('2ufcNxU4r5A9koNM_OFV8Z',$,'ApproachSpeed','The design speed of trains approaching the signal if different from the line speed.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3437=IFCSIMPLEPROPERTYTEMPLATE('0t4eDY7cf51QKY8D_bHZ3f',$,'HandSignallingProhibited','Indicates if hand signalling is prohibited in case of any failure.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3438=IFCSIMPLEPROPERTYTEMPLATE('3TKvYeR2P3TA0ZnUZLR4Ld',$,'LimitedClearances','Special conditions for placing the signal post telephone: tunnels, bridges, viaducts.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3439=IFCSIMPLEPROPERTYTEMPLATE('3scKt$ANn3KgqsJUmdowep',$,'NumberOfLampsNotUsed','Number of lamps which are not needed and blanked out (sealed).',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3440=IFCSIMPLEPROPERTYTEMPLATE('2qqzBG0uPC6xfgktpe0n9W',$,'RequiresOLEMesh','Indicates whether an OLE mesh is required to protect the signal or maintainer.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3441=IFCSIMPLEPROPERTYTEMPLATE('21O5w7hRP24v8XKNXQte6O',$,'RequiresSafetyHandrail','Indicates whether a safety handrail is required.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3442=IFCSIMPLEPROPERTYTEMPLATE('1syDkpckj4LxX1ms9v_hkL',$,'SignalPostTelephoneID','The identifier of the signal post telephone attached to the signal.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3443=IFCSIMPLEPROPERTYTEMPLATE('1UoOFv84jACBiqjmPD44dY',$,'SignalPostTelephoneType','Indicates the type of the signal post telephone, e.g. locked, direct line, dial phone.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3444=IFCSIMPLEPROPERTYTEMPLATE('0OZCMXDOz4sPZujBEtvaF0',$,'SpecialPositionArrangement','Type of special position at which the signal is placed.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3445=IFCSIMPLEPROPERTYTEMPLATE('3$oC6KufH3owSeerLn8T$V',$,'HinderingObstaclesDescription','Description of obstacles that hinder the visibility for the staff in the station.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3446=IFCSIMPLEPROPERTYTEMPLATE('0JCiRt_gX2iwdqHdOjBoa0',$,'SignalWalkwayLength','Indicates the length of the walkway from signal to signal post telephone.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3447=IFCSIMPLEPROPERTYTEMPLATE('3kcW5Z9a17zxsre803gIe0',$,'RequiresBannerSignal','Indicates whether a banner repeater signal is required.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3448=IFCSIMPLEPROPERTYTEMPLATE('1n43b1__jAYRTawj2KkKf4',$,'DistanceToStopMark','Distance from the signal to the nearest stop mark at a platform.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3449=IFCPROPERTYSETTEMPLATE('26V9qgBCP3GBdmr0EnbVb0',$,'Pset_RailwaySignalSighting','Properties that define information about signal sighting or visibility in railways. These properties are applicable to occurrences of IfcSignal and IfcSign.',.PSET_OCCURRENCEDRIVEN.,'IfcSignal,IfcSign',(#3450,#3451,#3452,#3453,#3454,#3455,#3456)); +#3450=IFCSIMPLEPROPERTYTEMPLATE('2QzYqbJCDCwus9kBIl0FVp',$,'SignalSightingAchievableDistance','Reading distance of the signal, which is achievable with the help of mitigation works.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3451=IFCSIMPLEPROPERTYTEMPLATE('3kjliarBr4qOmBNA_qcMO9',$,'SignalSightingAvailableDistance','Reading distance of the signal without having any mitigation works.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3452=IFCSIMPLEPROPERTYTEMPLATE('0Nk9D0FFnD5wVlfOsjA2dM',$,'SignalSightingCombinedWithRepeater','Combined reading distance for the signal and any associated repeaters.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3453=IFCSIMPLEPROPERTYTEMPLATE('0y6q9b2Wv0HB0XIT5UGpAO',$,'SignalSightingMinimum','Minimal distance in which the signal has to be readable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3454=IFCSIMPLEPROPERTYTEMPLATE('3G5jaxTN50f9nY7xArwXbL',$,'SignalSightingPreferred','Preferred distance in which the signal shall be readable.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3455=IFCSIMPLEPROPERTYTEMPLATE('0ezU$mu3vAr9TECTt0uA2b',$,'SignalSightingRouteIndicator','Required reading distance for the route indicator.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3456=IFCSIMPLEPROPERTYTEMPLATE('27Afc$UdP7hQK9fFuWLBO8',$,'SignalViewingMinimumInFront','Smallest distance where the signal has to be readable (for train very close to the signal).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3457=IFCPROPERTYSETTEMPLATE('0Z7dY$OFf7uOgXcnH4WbWd',$,'Pset_RailwaySignalType','Properties common to the definition of occurrences and types of IfcSignal applied in railways.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSignal,IfcSignalType',(#3458,#3460,#3461,#3462,#3463,#3464,#3465,#3466,#3467,#3468,#3469,#3470)); +#3458=IFCSIMPLEPROPERTYTEMPLATE('1Um7Ljh9bC$f43pdvT4AwS',$,'SignalIndicatorType','Type of the indicators on a signal, e.g. route indicator, speed restriction indicator etc.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3459,$,$,$,.READWRITE.); +#3459=IFCPROPERTYENUMERATION('PEnum_SignalIndicatorType',(IFCLABEL('DEPARTUREINDICATOR'),IFCLABEL('DEPARTUREROUTEINDICATOR'),IFCLABEL('DERAILINDICATOR'),IFCLABEL('ROLLINGSTOCKSTOPINDICATOR'),IFCLABEL('ROUTEINDICATOR'),IFCLABEL('SHUNTINGINDICATOR'),IFCLABEL('SWITCHINDICATOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3460=IFCSIMPLEPROPERTYTEMPLATE('2ImSjGJuXDohHxlEKv6WN$',$,'LensDiffuserType','Type of the lens diffuser the signal is equipped with.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3461=IFCSIMPLEPROPERTYTEMPLATE('2pJRaGZ_r4Jwt4DQy2HaO4',$,'HasConductorRailGuardBoard','Indicates if a guard board is provided.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3462=IFCSIMPLEPROPERTYTEMPLATE('2_kPSvz2X4DRkq9LYOM3rx',$,'MaximumDisplayDistance','The maximum distance that can be displayed. The value relates only to the signal type, not to the circumstances at a special position.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3463=IFCSIMPLEPROPERTYTEMPLATE('2qCJn__v1F9Q9dDwX3nY3u',$,'RequiredDisplayDistance','The required distance that has to be displayed. The value relates only to the signal type, not to the circumstances at a special position.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3464=IFCSIMPLEPROPERTYTEMPLATE('38USEiTR18WO6PlhvBNw2J',$,'IsHighType','Indicates if the signal is high (TRUE) or dwarf (ground mounted) (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3465=IFCSIMPLEPROPERTYTEMPLATE('0CbRNJIFrBXvYbx7Ezis2n',$,'SignalHoodLength','Nominal length of the signal hood, which is the signal lamp cover against glaring sun.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3466=IFCSIMPLEPROPERTYTEMPLATE('2xArjwBqvDevHDIDOL51gU',$,'HotStripOrientation','Position of the hot strip, which indicates the direction of the focus of the light beam and is given in terms like "left upper quadrant (LUQ)" or "5 o''clock".',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3467=IFCSIMPLEPROPERTYTEMPLATE('1QVyemqTHDAQAUuggkptPz',$,'LensDiffuserOrientation','Orientation the lens diffuser has to have, which indicates the direction of the lens diffuser and is given in terms like "left upper quadrant (LUQ)" or "5 o''clock".',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3468=IFCSIMPLEPROPERTYTEMPLATE('1rjB9JGwL7yhCKWdsyXEI8',$,'NumberOfLamps','Number of lamps the signal is composed of.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3469=IFCSIMPLEPROPERTYTEMPLATE('32pY7lcGnDkQCUDzZoCTgQ',$,'SignalMessage','All possible message available at this signal, e.g. "3/4- display automatic blocking".',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3470=IFCSIMPLEPROPERTYTEMPLATE('0nP$4111jFmvHoYH$ap6JG',$,'RailwaySignalType','The type of railway signal, e.g. home signal, starting signal, shunting signal, level crossing signal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3471,$,$,$,.READWRITE.); +#3471=IFCPROPERTYENUMERATION('PEnum_RailwaySignalType',(IFCLABEL('APPROACHSIGNAL'),IFCLABEL('BLOCKSIGNAL'),IFCLABEL('DISTANTSIGNAL'),IFCLABEL('HOMESIGNAL'),IFCLABEL('HUMPAUXILIARYSIGANL'),IFCLABEL('HUMPSIGNAL'),IFCLABEL('LEVELCROSSINGSIGNAL'),IFCLABEL('OBSTRUCTIONSIGNAL'),IFCLABEL('REPEATINGSIGNAL'),IFCLABEL('SHUNTINGSIGNAL'),IFCLABEL('STARTINGSIGNAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3472=IFCPROPERTYSETTEMPLATE('0iuYELgd1DHQkmFwO6QJtY',$,'Pset_RailwayTrackStructurePart','Properties applicable to IfcRailwayPart with PredefinedType set to TRACK, or more specialized types including PLAINTRACK, TURNOUTTRACK, DILATATIONTRACK or TRACKPART.',.PSET_OCCURRENCEDRIVEN.,'IfcRailwayPart/DILATIONTRACK,IfcRailwayPart/PLAINTRACK,IfcRailwayPart/TRACK,IfcRailwayPart/TURNOUTTRACK,IfcRailwayPart/TRACKPART',(#3473,#3474,#3475,#3476)); +#3473=IFCSIMPLEPROPERTYTEMPLATE('1ilgmCo8j7EOWSW8wAVNGq',$,'HasBallastTrack','Indicates whether the track has ballast or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3474=IFCSIMPLEPROPERTYTEMPLATE('0I$xFBjhz4YP9myqjReVLX',$,'HasCWR','Indicates if the track has continuous welded rails.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3475=IFCSIMPLEPROPERTYTEMPLATE('2blLReCtf7LhBcu73pUwHj',$,'IsSunExposed','Indicates if the object is in exposed position to sunshine.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3476=IFCSIMPLEPROPERTYTEMPLATE('1JyUTcmxz9uQPaWBq65z_E',$,'TrackSupportingStructure','Indicates the supporting structure for track part.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3477,$,$,$,.READWRITE.); +#3477=IFCPROPERTYENUMERATION('PEnum_TrackSupportingStructure',(IFCLABEL('BRIDGE'),IFCLABEL('CONCRETE'),IFCLABEL('ONSPECIALFOUNDATION'),IFCLABEL('PAVEMENT'),IFCLABEL('SUBGRADELAYER'),IFCLABEL('TRANSITIONSECTION'),IFCLABEL('TUNNEL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3478=IFCPROPERTYSETTEMPLATE('09tMnffqrCeeuO92LZN7Lf',$,'Pset_RampCommon','Properties common to the definition of all occurrences of IfcRamp.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRamp,IfcRampType',(#3479,#3480,#3482,#3483,#3484,#3485,#3486,#3487,#3488,#3489,#3490)); +#3479=IFCSIMPLEPROPERTYTEMPLATE('16z3qK0WP94AIBxpuNmkhp',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3480=IFCSIMPLEPROPERTYTEMPLATE('2StFnkz0z6qR4Ifkp5WQVr',$,'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',$,#3481,$,$,$,.READWRITE.); +#3481=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3482=IFCSIMPLEPROPERTYTEMPLATE('32acOncET1vhR_jDyD7lDi',$,'RequiredHeadroom','Required headroom clearance for the passageway according to the applicable building code or additional requirements.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3483=IFCSIMPLEPROPERTYTEMPLATE('2JlXk3uFP2WwylLMn0MRgV',$,'RequiredSlope','Required sloping angle of the object - relative to horizontal (0.0 degrees).\X2\000A\X0\Required maximum slope for the passageway according to the applicable building code or additional requirements.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#3484=IFCSIMPLEPROPERTYTEMPLATE('2c_taa53X4FhMmWa993yoJ',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. Set to (TRUE) if this object is rated as handicap accessible according to the local building codes, otherwise (FALSE). It is giving according to the requirements of the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3485=IFCSIMPLEPROPERTYTEMPLATE('0Q42OU2Ev88QzOeXGA2Amh',$,'HasNonSkidSurface','Indication whether the surface finish is designed to prevent slippery (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3486=IFCSIMPLEPROPERTYTEMPLATE('0bgSzAYfnAnALSxv4uy9UK',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here it defines an exit ramp in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3487=IFCSIMPLEPROPERTYTEMPLATE('0mb4bWptf5AAqvySH9NM_k',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3488=IFCSIMPLEPROPERTYTEMPLATE('1K1wZmMy9668KbRc7ya9Ss',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#3489=IFCSIMPLEPROPERTYTEMPLATE('38h_xOppr8Kfj05FcWHfgV',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3490=IFCSIMPLEPROPERTYTEMPLATE('3XzjeuYMHDnwuJFYmh8oI3',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3491=IFCPROPERTYSETTEMPLATE('3mKn1ctar2ZAkWRU0__uqX',$,'Pset_RampFlightCommon','Properties common to the definition of all occurrences of IfcRampFlight.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRampFlight,IfcRampFlightType',(#3492,#3493,#3495,#3496,#3497,#3498)); +#3492=IFCSIMPLEPROPERTYTEMPLATE('1Wpbcn2nr0Iu67Pdo$p2rX',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3493=IFCSIMPLEPROPERTYTEMPLATE('3gIcGq009ASAYObzUD34jF',$,'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',$,#3494,$,$,$,.READWRITE.); +#3494=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3495=IFCSIMPLEPROPERTYTEMPLATE('1dJmaTOnz7tvG2WPzIu$SH',$,'Headroom','Actual headroom clearance for the passageway according to the current design.\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3496=IFCSIMPLEPROPERTYTEMPLATE('0r6Ar1CrL3jfJ7O9lerRie',$,'ClearWidth','The clear width.\X2\000A000A\X0\Measured as the clear space for accessibility and egress; it is a measured distance between the two handrails or the wall and a handrail on a ramp.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3497=IFCSIMPLEPROPERTYTEMPLATE('2uDwU50Iz4Uui7pvyBmiFH',$,'Slope','Slope angle - relative to horizontal (0.0 degrees).The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#3498=IFCSIMPLEPROPERTYTEMPLATE('3fL$u5d41AjxOjI0Bb0n99',$,'CounterSlope','Sloping angle of the object, measured perpendicular to the slope - relative to horizontal (0.0 degrees).\X2\000A\X0\Actual maximum slope for the passageway measured perpendicular to the direction of travel according to the current design. The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.\X2\000A\X0\Note: new property in IFC4.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#3499=IFCPROPERTYSETTEMPLATE('0tA8GAe1XEAf3lX1OvHSOD',$,'Pset_ReferentCommon','Specifies common properties for IfcReferent',.PSET_OCCURRENCEDRIVEN.,'IfcReferent',(#3500)); +#3500=IFCSIMPLEPROPERTYTEMPLATE('176h8GxJ5ELBU3MLjQiQ3b',$,'NameFormat','Specifies a reference to or description of the formatting or encoding of the Name attribute of the IfcReferent occurrence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3501=IFCPROPERTYSETTEMPLATE('1IVVhno710GxUN3MpDTd3U',$,'Pset_ReinforcementBarCountOfIndependentFooting','Reinforcement Concrete parameter [ST-2]: The amount number information of reinforcement bar with the independent footing. The X and Y direction are based on the local coordinate system of building storey. The X and Y direction of the reinforcement bar are parallel to the X and Y axis of the IfcBuildingStorey''s local coordinate system, respectively.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFooting,IfcFootingType',(#3502,#3503,#3504,#3505,#3506,#3507)); +#3502=IFCSIMPLEPROPERTYTEMPLATE('1TrUIOQ79FFxGCjjvqiC2N',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3503=IFCSIMPLEPROPERTYTEMPLATE('0WfTQho2T0Yw1OHKDYg3d4',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.\X2\000A000A\X0\A descriptive label for the general reinforcement type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3504=IFCSIMPLEPROPERTYTEMPLATE('3vsKiMu2bFygs2zpVpNzlr',$,'XDirectionLowerBarCount','The number of bars with X direction lower bar.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3505=IFCSIMPLEPROPERTYTEMPLATE('0dW2pqpeTBReepTXVxgLb1',$,'YDirectionLowerBarCount','The number of bars with Y direction lower bar.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3506=IFCSIMPLEPROPERTYTEMPLATE('0C5s8tVlz288rmzidd7veV',$,'XDirectionUpperBarCount','The number of bars with X direction upper bar.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3507=IFCSIMPLEPROPERTYTEMPLATE('0Y6h2cL2r0JwLK520FvjhL',$,'YDirectionUpperBarCount','The number of bars with Y direction upper bar.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3508=IFCPROPERTYSETTEMPLATE('25BiOyWD53WASQm0za0UYI',$,'Pset_ReinforcementBarPitchOfBeam','The pitch length information of reinforcement bar with the beam.',.PSET_TYPEDRIVENOVERRIDE.,'IfcBeam,IfcBeamType',(#3509,#3510,#3511,#3512)); +#3509=IFCSIMPLEPROPERTYTEMPLATE('0K0mDCFRHCkuzTsHtIYdJF',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3510=IFCSIMPLEPROPERTYTEMPLATE('28ItmiLuzB5hzfabEgfbbH',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3511=IFCSIMPLEPROPERTYTEMPLATE('244phsM5T33fLyPEdxqv5J',$,'StirrupBarPitch','The pitch length of the stirrup bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3512=IFCSIMPLEPROPERTYTEMPLATE('2YOb69tuj4r8pLcr8ZYhdY',$,'SpacingBarPitch','The pitch length of the spacing bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3513=IFCPROPERTYSETTEMPLATE('0lmaeLn$f5x9Fi9wCYuznS',$,'Pset_ReinforcementBarPitchOfColumn','The pitch length information of reinforcement bar with the column. The X and Y direction are based on the local coordinate system of building storey. The X and Y direction of the reinforcement bar are parallel to the X and Y axis of the IfcBuildingStorey''s local coordinate system, respectively.',.PSET_TYPEDRIVENOVERRIDE.,'IfcColumn,IfcColumnType',(#3514,#3515,#3516,#3518,#3519,#3520,#3521,#3522)); +#3514=IFCSIMPLEPROPERTYTEMPLATE('1871G2fT55twc8Il_khqVu',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3515=IFCSIMPLEPROPERTYTEMPLATE('0SU66UcRf18QQG7XO3y_LR',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3516=IFCSIMPLEPROPERTYTEMPLATE('14F_dHN_nD3BxxyhD$QHC7',$,'ReinforcementBarType','Defines the type of the reinforcement bar.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3517,$,$,$,.READWRITE.); +#3517=IFCPROPERTYENUMERATION('PEnum_ReinforcementBarType',(IFCLABEL('RING'),IFCLABEL('SPIRAL'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); +#3518=IFCSIMPLEPROPERTYTEMPLATE('239a0tQKnDmBnNx5wQtz8G',$,'HoopBarPitch','The pitch length of the hoop bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3519=IFCSIMPLEPROPERTYTEMPLATE('23HSQwyGX9MBEJJC1Pygdn',$,'XDirectionTieHoopBarPitch','The X direction pitch length of the tie hoop.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3520=IFCSIMPLEPROPERTYTEMPLATE('1feNbvhVfAsOfX1amGm1UA',$,'XDirectionTieHoopCount','The number of bars with X direction tie hoop bars.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3521=IFCSIMPLEPROPERTYTEMPLATE('3exexwkVr15QjxVIN_UAOa',$,'YDirectionTieHoopBarPitch','The Y direction pitch length of the tie hoop.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3522=IFCSIMPLEPROPERTYTEMPLATE('3x31P1ejb4pPPVOIUA13bE',$,'YDirectionTieHoopCount','The number of bars with Y direction tie hoop bars.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3523=IFCPROPERTYSETTEMPLATE('2JJIgV8wjDuwuiIRHHF7Bv',$,'Pset_ReinforcementBarPitchOfContinuousFooting','Reinforcement Concrete parameter [ST-2]: The pitch length information of reinforcement bar with the continuous footing.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFooting,IfcFootingType',(#3524,#3525,#3526,#3527)); +#3524=IFCSIMPLEPROPERTYTEMPLATE('0GEP0Lik5AIAitVPaGLmdB',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3525=IFCSIMPLEPROPERTYTEMPLATE('3SiHj3Q8PCvej2cQEfp5yf',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3526=IFCSIMPLEPROPERTYTEMPLATE('3$sMzFB9bFTOeTFcC7em2B',$,'CrossingUpperBarPitch','The pitch length of the crossing upper bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3527=IFCSIMPLEPROPERTYTEMPLATE('3rZjC2ZqnBo8EPDO78Z1yZ',$,'CrossingLowerBarPitch','The pitch length of the crossing lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3528=IFCPROPERTYSETTEMPLATE('3uz9al$uHBAPamHqhOgsQ9',$,'Pset_ReinforcementBarPitchOfSlab','The pitch length information of reinforcement bar with the slab.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab,IfcSlabType',(#3529,#3530,#3531,#3532,#3533,#3534,#3535,#3536,#3537,#3538,#3539,#3540,#3541,#3542)); +#3529=IFCSIMPLEPROPERTYTEMPLATE('0Jae4RDPrFKuZdsogubzz5',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3530=IFCSIMPLEPROPERTYTEMPLATE('1lK7Tl8CvDSw9irLsqU9yA',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3531=IFCSIMPLEPROPERTYTEMPLATE('1Zt4viA0b8tPDKaSHR1u$$',$,'LongOutsideTopBarPitch','The pitch length of the long outside top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3532=IFCSIMPLEPROPERTYTEMPLATE('26Lb4Uv3b4HRYYqUyK4h8_',$,'LongInsideCenterTopBarPitch','The pitch length of the long inside center top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3533=IFCSIMPLEPROPERTYTEMPLATE('1FI6SA6fb6egjnsgMghare',$,'LongInsideEndTopBarPitch','The pitch length of the long inside end top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3534=IFCSIMPLEPROPERTYTEMPLATE('08UvSVPBbCdfXCxml0z0DB',$,'ShortOutsideTopBarPitch','The pitch length of the short outside top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3535=IFCSIMPLEPROPERTYTEMPLATE('1nhuSoXyjDggFkvVRB0WQY',$,'ShortInsideCenterTopBarPitch','The pitch length of the short inside center top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3536=IFCSIMPLEPROPERTYTEMPLATE('0mQVekt755ygt7pDF4tw2z',$,'ShortInsideEndTopBarPitch','The pitch length of the short inside end top bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3537=IFCSIMPLEPROPERTYTEMPLATE('1Dp6BRPLXFcuXxs5xsoh1E',$,'LongOutsideLowerBarPitch','The pitch length of the long outside lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3538=IFCSIMPLEPROPERTYTEMPLATE('1apOl$4iH8VPPSezvlYyXk',$,'LongInsideCenterLowerBarPitch','The pitch length of the long inside center lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3539=IFCSIMPLEPROPERTYTEMPLATE('0UDpr3jlr2yeTieBucn_Qs',$,'LongInsideEndLowerBarPitch','The pitch length of the long inside end lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3540=IFCSIMPLEPROPERTYTEMPLATE('3DXWgQTLH01B$ZX_78CQyG',$,'ShortOutsideLowerBarPitch','The pitch length of the short outside lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3541=IFCSIMPLEPROPERTYTEMPLATE('0taRn7q$v0tBZoiDu50tXk',$,'ShortInsideCenterLowerBarPitch','The pitch length of the short inside center lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3542=IFCSIMPLEPROPERTYTEMPLATE('14EGvonFXDlxGYQPmBEz7C',$,'ShortInsideEndLowerBarPitch','The pitch length of the short inside end lower bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3543=IFCPROPERTYSETTEMPLATE('2bS03joRT3gxbJQRMJQQiy',$,'Pset_ReinforcementBarPitchOfWall','The pitch length information of reinforcement bar with the wall.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWall,IfcWallType',(#3544,#3545,#3546,#3548,#3549,#3550)); +#3544=IFCSIMPLEPROPERTYTEMPLATE('0f27unQq1FtRczrvSzyCSm',$,'Description','The Description of the object.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3545=IFCSIMPLEPROPERTYTEMPLATE('3nj_78$1T0I8J0O1wZC6p_',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3546=IFCSIMPLEPROPERTYTEMPLATE('3tXfMI3CP04fiIqa13qjzC',$,'BarAllocationType','Defines the type of the reinforcement bar allocation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3547,$,$,$,.READWRITE.); +#3547=IFCPROPERTYENUMERATION('PEnum_ReinforcementBarAllocationType',(IFCLABEL('ALTERNATE'),IFCLABEL('DOUBLE'),IFCLABEL('SINGLE'),IFCLABEL('OTHER'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); +#3548=IFCSIMPLEPROPERTYTEMPLATE('1$r_RT4mL01eKAVhnMsZM5',$,'VerticalBarPitch','The pitch length of the vertical bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3549=IFCSIMPLEPROPERTYTEMPLATE('0asdHBgeLDpBj4cwAwfuof',$,'HorizontalBarPitch','The pitch length of the horizontal bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3550=IFCSIMPLEPROPERTYTEMPLATE('0dAe79dSv6nOpw0y$elrmA',$,'SpacingBarPitch','The pitch length of the spacing bar.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3551=IFCPROPERTYSETTEMPLATE('01gf2rxSX8sBk9_jbxeO$c',$,'Pset_RepairOccurrence','Properties defining repair information for occurrences of element, asset or system.',.PSET_OCCURRENCEDRIVEN.,'IfcAsset,IfcElement,IfcSystem',(#3552,#3553,#3554)); +#3552=IFCSIMPLEPROPERTYTEMPLATE('1Yw568S5r2oQDqSXtykhIy',$,'RepairContent','Content of repair, reason and nature can be given, e.g. display faults, communication failure, display exchange.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3553=IFCSIMPLEPROPERTYTEMPLATE('0AyfqBhIPBovpAkAJkm5E0',$,'RepairDate','Date on which the last repair is done on the asset.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#3554=IFCSIMPLEPROPERTYTEMPLATE('242wu_52j3Jx13_6cdMSO7',$,'MeanTimeToRepair','Mean time to repair.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3555=IFCPROPERTYSETTEMPLATE('3Vc_DaG9rBWP3KCV7Le3Ae',$,'Pset_RevetmentCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to REVETMENT.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/REVETMENT',(#3556,#3557)); +#3556=IFCSIMPLEPROPERTYTEMPLATE('0vTAuBW0L4YQnml0ZeXzhZ',$,'StructuralType','Structural type of the object',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3557=IFCSIMPLEPROPERTYTEMPLATE('3p_fDEKxv4pv1E_rNo9Vqx',$,'Elevation','Elevation of the entity',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3558=IFCPROPERTYSETTEMPLATE('3cEnM7b9LA$g51Yf$zU1xF',$,'Pset_Risk','An indication of exposure to mischance, peril, menace, hazard or loss. Documentation of a potential hazard, likilihood and consequence aligned with AS/NZS 4360 and BS PAS 1192-6:2017, which can be assigned to or associated with a product, activity and/or location. Alternatively it may be assigned to an ISO 3864 annotation symbol.HISTORY Extended in IFC2x3, Revised IFC4x3There are various types of risk that may be encountered and there may be several instances of Pset_Risk associated to an instance or type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcGroup,IfcProcess,IfcProduct,IfcTypeProcess,IfcTypeProduct',(#3559,#3560,#3562,#3563,#3564,#3566,#3568,#3570,#3571,#3573,#3575,#3577,#3578,#3579,#3580)); +#3559=IFCSIMPLEPROPERTYTEMPLATE('2P12m1MIP3E8sz9XjAk12a',$,'RiskName','A locally unique identifier for the risk entry that can be used to track the development and mitigation of the risk throughout the project life cycle',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3560=IFCSIMPLEPROPERTYTEMPLATE('3bdVtb1o106QdmFsRgxAtN',$,'RiskType','Identifies the predefined types of risk from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3561,$,$,$,.READWRITE.); +#3561=IFCPROPERTYENUMERATION('PEnum_RiskType',(IFCLABEL('ASBESTOSEFFECTS'),IFCLABEL('ASPHIXIATION'),IFCLABEL('BUSINESS'),IFCLABEL('BUSINESSISSUES'),IFCLABEL('CHEMICALEFFECTS'),IFCLABEL('COMMERICALISSUES'),IFCLABEL('CONFINEMENT'),IFCLABEL('CRUSHING'),IFCLABEL('DROWNINGANDFLOODING'),IFCLABEL('ELECTRICSHOCK'),IFCLABEL('ENVIRONMENTALISSUES'),IFCLABEL('EVENT'),IFCLABEL('FALL'),IFCLABEL('FALLEDGE'),IFCLABEL('FALLFRAGILEMATERIAL'),IFCLABEL('FALLSCAFFOLD'),IFCLABEL('FALL_LADDER'),IFCLABEL('FIRE_EXPLOSION'),IFCLABEL('HANDLING'),IFCLABEL('HAZARD'),IFCLABEL('HAZARDOUSDUST'),IFCLABEL('HEALTHANDSAFETY'),IFCLABEL('HEALTHISSUE'),IFCLABEL('INSURANCE'),IFCLABEL('INSURANCE_ISSUES'),IFCLABEL('LEADEFFECTS'),IFCLABEL('MACHINERYGUARDING'),IFCLABEL('MATERIALEFFECTS'),IFCLABEL('MATERIALSHANDLING'),IFCLABEL('MECHANICALEFFECTS'),IFCLABEL('MECHANICAL_LIFTING'),IFCLABEL('MOBILE_ELEVATEDWORKPLATFORM'),IFCLABEL('NOISE_EFFECTS'),IFCLABEL('OPERATIONALISSUES'),IFCLABEL('OTHERISSUES'),IFCLABEL('OVERTURINGPLANT'),IFCLABEL('PUBLICPROTECTIONISSUES'),IFCLABEL('SAFETYISSUE'),IFCLABEL('SILICADUST'),IFCLABEL('SLIPTRIP'),IFCLABEL('SOCIALISSUES'),IFCLABEL('STRUCK'),IFCLABEL('STRUCKFALLINFOBJECT'),IFCLABEL('STRUCKVEHICLE'),IFCLABEL('TOOLUSAGE'),IFCLABEL('TRAPPED'),IFCLABEL('UNINTENDEDCOLLAPSE'),IFCLABEL('VIBRATION'),IFCLABEL('WELFAREISSUE'),IFCLABEL('WOODDUST'),IFCLABEL('WORKINGOVERHEAD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3562=IFCSIMPLEPROPERTYTEMPLATE('1S09wrB5H1XuuUg1ZeL75_',$,'NatureOfRisk','A description of the generic nature of the context or hazard that might be encountered.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3563=IFCSIMPLEPROPERTYTEMPLATE('292CI6FNP6Fv5VZRTMAKgq',$,'RiskAssessmentMethodology','An indication or link to the chosen risk assessment methodology, for example PAS1192-6 or a chosen ISO13100 annex.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3564=IFCSIMPLEPROPERTYTEMPLATE('1vyZ9V1$TB0AG0wxo0eEVD',$,'UnmitigatedRiskLikelihood','Identifies the likelihood of the hazard prior to any specific mitigation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3565,$,$,$,.READWRITE.); +#3565=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3566=IFCSIMPLEPROPERTYTEMPLATE('00cDNj5N5FDfRk2HQN7WXL',$,'UnmitigatedRiskConsequence','Identifies the consequence of the hazard prior to any specific mitigation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3567,$,$,$,.READWRITE.); +#3567=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3568=IFCSIMPLEPROPERTYTEMPLATE('0kUeRinZH5mwtZZW2TJqt8',$,'UnmitigatedRiskSignificance','Identifies the significance of the risk given the likelihood and consequence prior to any specific mitigation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3569,$,$,$,.READWRITE.); +#3569=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3570=IFCSIMPLEPROPERTYTEMPLATE('2mKLRc38f8txLNgzq04dRU',$,'MitigationPlanned','The planned (agreed and irrevocable) mitigation of the likelhood and consequences of the hazard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3571=IFCSIMPLEPROPERTYTEMPLATE('1jHMv4eVL4cfkEB0jxr9$S',$,'MitigatedRiskLikelihood','Identifies the likelihood of the hazard given the planned mitigation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3572,$,$,$,.READWRITE.); +#3572=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3573=IFCSIMPLEPROPERTYTEMPLATE('1G$Lo_uyrCnPGIPPGoFkr7',$,'MitigatedRiskConsequence','Identifies the consequence of the hazard given the planned mitigation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3574,$,$,$,.READWRITE.); +#3574=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3575=IFCSIMPLEPROPERTYTEMPLATE('2y$yI8RPT5a80sfyl$FWxJ',$,'MitigatedRiskSignificance','Identifies the significance of the risk given the mitigation of likelihood and consequence.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3576,$,$,$,.READWRITE.); +#3576=IFCPROPERTYENUMERATION('PEnum_RiskRating',(IFCLABEL('CONSIDERABLE'),IFCLABEL('CRITICAL'),IFCLABEL('HIGH'),IFCLABEL('INSIGNIFICANT'),IFCLABEL('LOW'),IFCLABEL('MODERATE'),IFCLABEL('SOME'),IFCLABEL('VERYHIGH'),IFCLABEL('VERYLOW'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3577=IFCSIMPLEPROPERTYTEMPLATE('2v3xOI0eL1SxEJrSEtSVGj',$,'MitigationProposed','Any proposed, but not yet agreed and irrevocable, mitigation of the likelhood and consequences of the hazard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3578=IFCSIMPLEPROPERTYTEMPLATE('3pED_gvAr1aAwoDZ$T6onx',$,'AssociatedProduct','An indication or link to any associated product or material that may trigger the hazard. If used directly on an annotation or semantic object. for an alternative see group use encoding template',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3579=IFCSIMPLEPROPERTYTEMPLATE('1pWPhZsqzAGA7tU6y5mq_c',$,'AssociatedActivity','An indication or link to any associated activity or process that may trigger the hazard. If used directly on an annotation or semantic object. for an alternative see group use encoding template',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3580=IFCSIMPLEPROPERTYTEMPLATE('2IyR_AMejBk9MByKY_oDTr',$,'AssociatedLocation','An indication or link to any associated location or space that may trigger the hazard. If used directly on an annotation or semantic object. for an alternative see group use encoding template',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3581=IFCPROPERTYSETTEMPLATE('3fZ8ADXI13J8ONCwlaO9o2',$,'Pset_RoadDesignCriteriaCommon','Road design criteria that may be attached to road parts.',.PSET_OCCURRENCEDRIVEN.,'IfcFacilityPartCommon/JUNCTION,IfcFacilityPartCommon/LEVELCROSSING,IfcFacilityPartCommon/SEGMENT,IfcRoadPart/BICYCLECROSSING,IfcRoadPart/INTERSECTION,IfcRoadPart/PEDESTRIAN_CROSSING,IfcRoadPart/RAILWAYCROSSING,IfcRoadPart/ROADSEGMENT,IfcRoadPart/ROUNDABOUT,IfcRoadPart/TOLLPLAZA,IfcRoad',(#3582,#3583,#3584,#3585,#3586,#3587,#3588)); +#3582=IFCSIMPLEPROPERTYTEMPLATE('38Wrdy7V5DwungCNZeuRe5',$,'Crossfall','Specifies the nominal crossfall as a ratio measure (slope) at the location of the event.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3583=IFCSIMPLEPROPERTYTEMPLATE('2ZXk24uG5ELfakV_syaR85',$,'DesignSpeed','Speed selected in designing a new road or in modernizing, strengthening or rehabilitating an existing road section, to determine the various geometric design features of the carriageway that allow a car to travel safely at that speed, under normal road surface and weather conditions.NOTE Definition according to PIARC.\X2\000A\X0\NOTE The design speed is not constant, but may vary depending on the conditions of relief (plain, hill, mountain).',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3584=IFCSIMPLEPROPERTYTEMPLATE('1s4AB8y9nCnR8r$gdyyQr6',$,'DesignTrafficVolume','The traffic volume used for planning and design purposes specified as the number of vehicles per day . Typically given as AADT - Average Annual Daily Traffic',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3585=IFCSIMPLEPROPERTYTEMPLATE('3QOj3bISHDFv6aOkXPc$$Z',$,'DesignVehicleClass','A vehicle designator with content according to local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3586=IFCSIMPLEPROPERTYTEMPLATE('1qQyUwrBzDyh6CMpgqi7wF',$,'LaneWidth','Standard nominal width of one trough lane.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3587=IFCSIMPLEPROPERTYTEMPLATE('0wNHVTLwfFWQS6cqflTqiz',$,'NumberOfThroughLanes','The total number of through lanes on the segment. This excludes auxiliary lanes, parking and turning lanes, acceleration/deceleration lanes, toll collection lanes, shoulders etc.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3588=IFCSIMPLEPROPERTYTEMPLATE('3rsVBpqiXE2QaFihLAdthT',$,'RoadDesignClass','A road design class designator with content according to local standards.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3589=IFCPROPERTYSETTEMPLATE('3sCKi$b8bF7wO_tsMNiDnJ',$,'Pset_RoadGuardElement','Properties assigned to IfcWall/PARAPET or IfcRailing/GUARDRAIL when assigned as road guard elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcRailing/GUARDRAIL,IfcWall/PARAPET,IfcRailingType/GUARDRAIL,IfcWallType/PARAPET',(#3590,#3591,#3592,#3593)); +#3590=IFCSIMPLEPROPERTYTEMPLATE('2F4oMarq9DKQUL7AmUvq3x',$,'IsMoveable','True if element is moveable.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3591=IFCSIMPLEPROPERTYTEMPLATE('1kqoOMCo1CQvEAzQkgInT5',$,'IsTerminal','True if element is a terminal. See class Terminal.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3592=IFCSIMPLEPROPERTYTEMPLATE('2ebuU_tuXERvnq1Eg3ZwWq',$,'IsTransition','True if element is a transition. See class Transition.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3593=IFCSIMPLEPROPERTYTEMPLATE('3s0lVdprv3eAONS8CIhdBq',$,'TerminalType','Specifies the kind of terminal if IsTerminal is true.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3594=IFCPROPERTYSETTEMPLATE('34r24KIdX7Hv4hpvePN3bH',$,'Pset_RoadMarkingCommon','Properties for road markings.',.PSET_OCCURRENCEDRIVEN.,'IfcSurfaceFeature/HATCHMARKING,IfcSurfaceFeature/LINEMARKING,IfcSurfaceFeature/PAVEMENTSURFACEMARKING,IfcSurfaceFeature/SYMBOLMARKING',(#3595,#3596,#3597,#3598,#3599,#3600)); +#3595=IFCSIMPLEPROPERTYTEMPLATE('1JOjiVz_TFrxqROa4S5rTV',$,'ApplicationMethod','State the application method used... e.g. spray, extruded',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3596=IFCSIMPLEPROPERTYTEMPLATE('0ozX5CuSrEifWH6gXbVD5u',$,'DiagramNumber','A designator with content according to local standards, e.g. M25.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3597=IFCSIMPLEPROPERTYTEMPLATE('2WgktAiSP8DvtF5Vkan9YN',$,'MaterialColour','Actual colour on the road marking material',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3598=IFCSIMPLEPROPERTYTEMPLATE('0UHmIKDWzBkOTbMkKzEBnx',$,'MaterialThickness','Nominal thickness of the applied material',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3599=IFCSIMPLEPROPERTYTEMPLATE('1$L0aztXz9nglOYn0pav8Y',$,'MaterialType','Material type used... e.g. paint, tape, thermoplastic, stone',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3600=IFCSIMPLEPROPERTYTEMPLATE('21Vvn1Gnr5dAFDMA00Hnt$',$,'Structure','State if marking is Structured or not, and what type... e.g. Kamflex, Longflex, Dropflex',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3601=IFCPROPERTYSETTEMPLATE('2HzyPHNqD5RwV8Qdk5qka5',$,'Pset_RoadSymbolsCommon','Properties for road symbols.',.PSET_OCCURRENCEDRIVEN.,'IfcSurfaceFeature/SYMBOLMARKING',(#3602,#3603)); +#3602=IFCSIMPLEPROPERTYTEMPLATE('32KzMJb3DDSu0KakOdzBg7',$,'Text','Text content',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3603=IFCSIMPLEPROPERTYTEMPLATE('2BmkdPnJn4Cu51T1ZYe2M8',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3604=IFCPROPERTYSETTEMPLATE('2MK0ZcDxz6f8KSc38BjrUh',$,'Pset_RoofCommon','Properties common to the definition of all occurrences of IfcRoof. Note: Properties for ProjectedArea and TotalArea added in IFC 2x3',.PSET_TYPEDRIVENOVERRIDE.,'IfcRoof,IfcRoofType',(#3605,#3606,#3608,#3609,#3610,#3611,#3612)); +#3605=IFCSIMPLEPROPERTYTEMPLATE('0QBAO3uSX7BO5VR5wNcd3_',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3606=IFCSIMPLEPROPERTYTEMPLATE('0poTEq8Lz8dRoTQpfdHlgE',$,'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',$,#3607,$,$,$,.READWRITE.); +#3607=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3608=IFCSIMPLEPROPERTYTEMPLATE('2woLwsp3rFUf3EA9j5qU6I',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3609=IFCSIMPLEPROPERTYTEMPLATE('1HzJSslXD8VvxDGiUupw6o',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3610=IFCSIMPLEPROPERTYTEMPLATE('0a5Ap5JzH4EvBa8dY9VHGD',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#3611=IFCSIMPLEPROPERTYTEMPLATE('3$gM1$UH9A2w29MUH9Hoeo',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3612=IFCSIMPLEPROPERTYTEMPLATE('01oljf6EnDgeuspLC1XrC4',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3613=IFCPROPERTYSETTEMPLATE('2l$wFhX_b1kg5HJkTERUpB',$,'Pset_SanitaryTerminalTypeBath','Sanitary appliance for immersion of the human body or parts of it (BS6100). HISTORY: In IFC4, Material and MaterialThickness properties removed. Use materials capabilities from IfcMaterialResource schema. Datatype of color changed to IfcLabel (still a string value)',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/BATH,IfcSanitaryTerminalType/BATH',(#3614,#3616,#3617)); +#3614=IFCSIMPLEPROPERTYTEMPLATE('1wQAbwVfTAiupYnsuDy1Wm',$,'BathType','The property enumeration defines the types of bath that may be specified within the property set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3615,$,$,$,.READWRITE.); +#3615=IFCPROPERTYENUMERATION('PEnum_BathType',(IFCLABEL('DOMESTIC'),IFCLABEL('FOOT'),IFCLABEL('PLUNGE'),IFCLABEL('POOL'),IFCLABEL('SITZ'),IFCLABEL('SPA'),IFCLABEL('TREATMENT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3616=IFCSIMPLEPROPERTYTEMPLATE('0p_Uweoy9FDuW9sXXTyqyR',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3617=IFCSIMPLEPROPERTYTEMPLATE('2uKUYYV0X6EAr3rOr_AWJG',$,'HasGrabHandles','Indicates whether the bath is fitted with handles that provide assistance to a bather in entering or leaving the bath.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3618=IFCPROPERTYSETTEMPLATE('0uUrEOtAL72wuYXX7RVgwM',$,'Pset_SanitaryTerminalTypeBidet','Waste water appliance for washing the excretory organs while sitting astride the bowl (BS6100). HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialResource schema. Datatype of color changed to IfcLabel (still a string value). BidetMounting changed to Mounting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/BIDET,IfcSanitaryTerminalType/BIDET',(#3619,#3621,#3622)); +#3619=IFCSIMPLEPROPERTYTEMPLATE('073DdpJ7T0T8UXMTo0aoyk',$,'Mounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.Note that BackToWall, Pedestal and WallHung are allowable values for a bidet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3620,$,$,$,.READWRITE.); +#3620=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3621=IFCSIMPLEPROPERTYTEMPLATE('2P4d1U0d18zf1ZOjXy2tGp',$,'SpilloverLevel','The level at which water spills out of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3622=IFCSIMPLEPROPERTYTEMPLATE('2bll0ib1r4XxSnLV$ZeaQQ',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3623=IFCPROPERTYSETTEMPLATE('3c6qNh_t5D_ATQHWWErFy1',$,'Pset_SanitaryTerminalTypeCistern','A water storage unit attached to a sanitary terminal that is fitted with a device, operated automatically or by the user, that discharges water to cleanse a water closet (toilet) pan, urinal or slop hopper. (BS6100 330 5008)',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/CISTERN,IfcSanitaryTerminalType/CISTERN',(#3624,#3626,#3627,#3628,#3630,#3631)); +#3624=IFCSIMPLEPROPERTYTEMPLATE('1ZFUANHozDsOt9DK2W8WMD',$,'CisternHeight','Enumeration that identifies the height of the cistern or, if set to ''None'' if the urinal has no cistern and is flushed using mains or high pressure water through a flushing valve.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3625,$,$,$,.READWRITE.); +#3625=IFCPROPERTYENUMERATION('PEnum_CisternHeight',(IFCLABEL('HIGHLEVEL'),IFCLABEL('LOWLEVEL'),IFCLABEL('NONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3626=IFCSIMPLEPROPERTYTEMPLATE('3xzwijamj9$eFOc33BW_p$',$,'CisternCapacity','Volumetric capacity of the cistern',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3627=IFCSIMPLEPROPERTYTEMPLATE('1r4yyVHubAHwyrf6PodTr9',$,'IsSingleFlush','Indicates whether the cistern is single flush = TRUE (i.e. the same amount of water is used for each and every flush) or dual flush = FALSE (i.e. the amount of water used for a flush may be selected by the user to be high or low depending on the waste material to be removed).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3628=IFCSIMPLEPROPERTYTEMPLATE('1kvVEiDkLBIA$cphzOni$B',$,'FlushType','The property enumeration Pset_FlushTypeEnum defines the types of flushing mechanism that may be specified for cisterns and sanitary terminals where:-Lever: Flushing is achieved by twisting a lever that causes a predetermined flow of water to be passed from a cistern to the sanitary terminal.\X2\000A\X0\Pull: Flushing is achieved by pulling a handle or knob vertically upwards that causes a predetermined flow of water to be passed from a cistern to the sanitary terminal.\X2\000A\X0\Push: Flushing is achieved by pushing a button or plate that causes a predetermined flow of water to be passed from a cistern to the sanitary terminal.\X2\000A\X0\Sensor: Flush is activated through an automatic sensing mechanism.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3629,$,$,$,.READWRITE.); +#3629=IFCPROPERTYENUMERATION('PEnum_FlushType',(IFCLABEL('LEVER'),IFCLABEL('PULL'),IFCLABEL('PUSH'),IFCLABEL('SENSOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3630=IFCSIMPLEPROPERTYTEMPLATE('29DwOoRv57DxQ7Mvqu_FJ8',$,'FlushRate','The minimum and maximum volume of water used at each flush. Where a single flush is used, the value of upper bound and lower bound should be equal. For a dual flush toilet, the lower bound should be used for the lesser flush rate and the upper bound for the greater flush rate. Where flush is achieved using mains pressure water through a flush valve, the value of upper and lower bound should be equal and should be the same as the flush rate property of the flush valve (see relevant valve property set). Alternatively, in this case, do not assert the flush rate property; refer to the flush rate of the flush valve.',.P_BOUNDEDVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3631=IFCSIMPLEPROPERTYTEMPLATE('3VB9rxejPEjhCUK$PxMDeM',$,'IsAutomaticFlush','Boolean value that determines if the cistern is flushed automatically either after each use or periodically (TRUE) or whether manual flushing is required (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3632=IFCPROPERTYSETTEMPLATE('0tufoANdbBKwYZRMaFUTgX',$,'Pset_SanitaryTerminalTypeCommon','Common properties for sanitary terminals.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal,IfcSanitaryTerminalType',(#3633,#3634,#3636,#3637,#3638,#3639)); +#3633=IFCSIMPLEPROPERTYTEMPLATE('3cucqQfLjC5wvdbORXpf6r',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3634=IFCSIMPLEPROPERTYTEMPLATE('1d4Ht2OKDBhOeE5bfubXH5',$,'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',$,#3635,$,$,$,.READWRITE.); +#3635=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3636=IFCSIMPLEPROPERTYTEMPLATE('2JTINRoyX8GQ8qOf6F4$Fy',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3637=IFCSIMPLEPROPERTYTEMPLATE('1VO_ewPCnAufyWEnviD3Ra',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3638=IFCSIMPLEPROPERTYTEMPLATE('2Us3pSIF1E0BQugRaFsC2h',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3639=IFCSIMPLEPROPERTYTEMPLATE('1o6jPmq8n85hDGMap9J7rw',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3640=IFCPROPERTYSETTEMPLATE('3t53W1L9n7KfGD0Ehf5OzP',$,'Pset_SanitaryTerminalTypeSanitaryFountain','Asanitary terminal that provides a low pressure jet of water for a specific purpose (IAI). HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialResource schema. Datatype of color changed to IfcLabel (still a string value).',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/SANITARYFOUNTAIN,IfcSanitaryTerminalType/SANITARYFOUNTAIN',(#3641,#3643,#3645)); +#3641=IFCSIMPLEPROPERTYTEMPLATE('1$6p7jtxH5D9R3HIkbxMtu',$,'FountainType','Selection of the type of fountain from the enumerated list of types where:-DrinkingWater: Sanitary appliance that provides a low pressure jet of drinking water.\X2\000A\X0\Eyewash: Waste water appliance, usually installed in work places where there is a risk of injury to eyes by solid particles or dangerous liquids, with which the user can wash the eyes without touching them.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3642,$,$,$,.READWRITE.); +#3642=IFCPROPERTYENUMERATION('PEnum_FountainType',(IFCLABEL('DRINKINGWATER'),IFCLABEL('EYEWASH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3643=IFCSIMPLEPROPERTYTEMPLATE('0csl4IUIHF$gSRV0fZlbMi',$,'Mounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.Note that BackToWall, Pedestal and WallHung are allowable values for a bidet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3644,$,$,$,.READWRITE.); +#3644=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3645=IFCSIMPLEPROPERTYTEMPLATE('3X3ifEiMnFQPf60sLkh2t0',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3646=IFCPROPERTYSETTEMPLATE('1GN2Yloi1EUeSU3GU3CIwy',$,'Pset_SanitaryTerminalTypeShower','Installation or waste water appliance that emits a spray of water to wash the human body (BS6100). HISTORY: In IFC4, Material and MaterialThickness properties removed. Use materials capabilities from IfcMaterialResource schema. Datatype of color changed to IfcLabel (still a string value)',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/SHOWER,IfcSanitaryTerminalType/SHOWER',(#3647,#3649,#3650,#3651)); +#3647=IFCSIMPLEPROPERTYTEMPLATE('2cUY3HfM9AlBpekfHjIPDq',$,'ShowerType','Selection of the type of shower from the enumerated list of types where:-Drench: Shower that rapidly gives a thorough soaking in an emergency.\X2\000A\X0\Individual: Shower unit that is typically enclosed and is for the use of one person at a time.\X2\000A\X0\Tunnel: Shower that has a succession of shower heads or spreaders that operate simultaneously along its length.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3648,$,$,$,.READWRITE.); +#3648=IFCPROPERTYENUMERATION('PEnum_ShowerType',(IFCLABEL('DRENCH'),IFCLABEL('INDIVIDUAL'),IFCLABEL('TUNNEL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3649=IFCSIMPLEPROPERTYTEMPLATE('1w8ubTeZr2jOLL$3WitvJe',$,'HasTray','Indicates whether the shower has a separate receptacle that catches the water in a shower and directs it to a waste outlet.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3650=IFCSIMPLEPROPERTYTEMPLATE('33wOW$TFb6mwcgswUzQads',$,'ShowerHeadDescription','A description of the shower head(s) that emit the spray of water.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#3651=IFCSIMPLEPROPERTYTEMPLATE('3jjYRJaWnAgOIivETfcQlo',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3652=IFCPROPERTYSETTEMPLATE('06gMNeiTb3zAI2M7qboDFv',$,'Pset_SanitaryTerminalTypeSink','Waste water appliance for receiving, retaining or disposing of domestic, culinary, laboratory or industrial process liquids. HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialResource schema. Datatype of color changed to IfcLabel (still a string value). SinkMounting changed to Mounting.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/SINK,IfcSanitaryTerminalType/SINK',(#3653,#3655,#3657,#3658,#3659)); +#3653=IFCSIMPLEPROPERTYTEMPLATE('1RJZiex0X59flPRdm3E5SZ',$,'SinkType','Selection of the type of sink from the enumerated list of types where:-Belfast: Deep sink that has a plain edge and a weir overflow\X2\000A\X0\.\X2\000A\X0\Bucket: Sink at low level, with protected front edge, that facilitates filling and emptying buckets, usually with a hinged grid on which to stand them.\X2\000A\X0\Cleaners: Sink, usually fixed at normal height (900mm), with protected front edge.\X2\000A\X0\Combination_Left: Sink with integral drainer on left hand side\X2\000A\X0\.\X2\000A\X0\Combination_Right: Sink with integral drainer on right hand side\X2\000A\X0\.\X2\000A\X0\Combination_Double: Sink with integral drainer on both sides\X2\000A\X0\.\X2\000A\X0\Drip: Small sink that catches drips or flow from a faucet\X2\000A\X0\.\X2\000A\X0\Laboratory: Sink, of acid resisting material, with a top edge shaped to facilitate fixing to the underside of a desktop\X2\000A\X0\.\X2\000A\X0\London: Deep sink that has a plain edge and no overflow\X2\000A\X0\.\X2\000A\X0\Plaster: Sink with sediment receiver to prevent waste plaster passing into drains\X2\000A\X0\.\X2\000A\X0\Pot: Large metal sink, with a standing waste, for washing cooking utensils\X2\000A\X0\.\X2\000A\X0\Rinsing: Metal sink in which water can be heated and culinary utensils and tableware immersed at high temperature that destroys most harmful bacteria and allows subsequent self drying.\X2\000A\X0\.\X2\000A\X0\Shelf: Ceramic sink with an integral back shelf through which water fittings are mounted\X2\000A\X0\.\X2\000A\X0\VegetablePreparation: Large metal sink, with a standing waste, for washing and preparing vegetables\X2\000A\X0\.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3654,$,$,$,.READWRITE.); +#3654=IFCPROPERTYENUMERATION('PEnum_SinkType',(IFCLABEL('BELFAST'),IFCLABEL('BUCKET'),IFCLABEL('CLEANERS'),IFCLABEL('COMBINATION_DOUBLE'),IFCLABEL('COMBINATION_LEFT'),IFCLABEL('COMBINATION_RIGHT'),IFCLABEL('DRIP'),IFCLABEL('LABORATORY'),IFCLABEL('LONDON'),IFCLABEL('PLASTER'),IFCLABEL('POT'),IFCLABEL('RINSING'),IFCLABEL('SHELF'),IFCLABEL('VEGETABLEPREPARATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3655=IFCSIMPLEPROPERTYTEMPLATE('3OyBi$UN9Ah9uhuhXaf3TI',$,'Mounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.Note that BackToWall, Pedestal and WallHung are allowable values for a bidet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3656,$,$,$,.READWRITE.); +#3656=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3657=IFCSIMPLEPROPERTYTEMPLATE('0RSFw3ZVL2Dh3x$UbHYOcA',$,'Colour','Colour of this object.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3658=IFCSIMPLEPROPERTYTEMPLATE('3PW7onFRr5P9IU9OVprK5r',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3659=IFCSIMPLEPROPERTYTEMPLATE('1hMbi$$KH4FP_fGeWphZz9',$,'MountingOffset','For counter top mounted basins the vertical offset between the top of the sink and the counter top.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3660=IFCPROPERTYSETTEMPLATE('1UiZDtxsX5ZO3Q$NHbhA4c',$,'Pset_SanitaryTerminalTypeToiletPan','Soil appliance for the disposal of excrement. HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialResource schema. Prefix for color property removed. Datatype of color changed to IfcLabel (still a string value).',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/TOILETPAN,IfcSanitaryTerminalType/TOILETPAN',(#3661,#3663,#3665,#3667)); +#3661=IFCSIMPLEPROPERTYTEMPLATE('3HAwuGZrTCfRzQHC1ifndG',$,'ToiletType','Enumeration that defines the types of toilet (water closet) arrangements that may be specified where:-BedPanWasher: Enclosed soil appliance in which bedpans and urinal bottles are emptied and cleansed.\X2\000A\X0\Chemical: Portable receptacle or soil appliance that receives and retains excrement in either an integral or a separate container, in which it is chemically treated and from which it has to be emptied periodically.\X2\000A\X0\CloseCoupled: Toilet suite in which a flushing cistern is connected directly to the water closet pan.\X2\000A\X0\LooseCoupled: Toilet arrangement in which a flushing cistern is connected to the water closet pan through a flushing pipe.\X2\000A\X0\SlopHopper: Hopper shaped soil appliance with a flushing rim and outlet similar to those of a toilet pan, into which human excrement is emptied for disposal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3662,$,$,$,.READWRITE.); +#3662=IFCPROPERTYENUMERATION('PEnum_ToiletType',(IFCLABEL('BEDPANWASHER'),IFCLABEL('CHEMICAL'),IFCLABEL('CLOSECOUPLED'),IFCLABEL('LOOSECOUPLED'),IFCLABEL('SLOPHOPPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3663=IFCSIMPLEPROPERTYTEMPLATE('2uRrNFiNTETxmjakH95pAQ',$,'ToiletPanType','The property enumeration Pset_ToiletPanTypeEnum defines the types of toilet pan that may be specified within the property set Pset_Toilet:-Siphonic: Toilet pan in which excrement is removed by siphonage induced by the flushing water.\X2\000A\X0\Squat: Toilet pan with an elongated bowl installed with its top edge at or near floor level, so that the user has to squat.\X2\000A\X0\WashDown: Toilet pan in which excrement is removed by the momentum of the flushing water.\X2\000A\X0\WashOut: A washdown toilet pan in which excrement falls first into a shallow water filled bowl.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3664,$,$,$,.READWRITE.); +#3664=IFCPROPERTYENUMERATION('PEnum_ToiletPanType',(IFCLABEL('SIPHONIC'),IFCLABEL('SQUAT'),IFCLABEL('WASHDOWN'),IFCLABEL('WASHOUT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3665=IFCSIMPLEPROPERTYTEMPLATE('2WVG61lN1AO9NYlbY6Ej7k',$,'PanMounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections.\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base.\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3666,$,$,$,.READWRITE.); +#3666=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3667=IFCSIMPLEPROPERTYTEMPLATE('3O563YTgj2dvhMjoolau4x',$,'SpilloverLevel','The level at which water spills out of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3668=IFCPROPERTYSETTEMPLATE('0zWCGktZv0L9Co10aX7I8b',$,'Pset_SanitaryTerminalTypeUrinal','Soil appliance that receives urine and directs it to a waste outlet (BS6100). HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialResource schema. Prefix for color property removed. Datatype of color changed to IfcLabel (still a string value). Mounting property added.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/URINAL,IfcSanitaryTerminalType/URINAL',(#3669,#3671,#3673)); +#3669=IFCSIMPLEPROPERTYTEMPLATE('3GFFDMsn978fSYt0hl98lm',$,'UrinalType','Selection of the type of urinal from the enumerated list of types where:-Bowl: Individual wall mounted urinal.\X2\000A\X0\Slab: Urinal that consists of a slab or sheet fixed to a wall and down which urinal flows into a floor channel.\X2\000A\X0\Stall: Floor mounted urinal that consists of an elliptically shaped sanitary stall fixed to a wall and down which urine flows into a floor channel.\X2\000A\X0\Trough: Wall mounted urinal of elongated rectangular shape on plan, that can be used by more than one person at a time.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3670,$,$,$,.READWRITE.); +#3670=IFCPROPERTYENUMERATION('PEnum_UrinalType',(IFCLABEL('BOWL'),IFCLABEL('SLAB'),IFCLABEL('STALL'),IFCLABEL('TROUGH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3671=IFCSIMPLEPROPERTYTEMPLATE('1hYDGidKz31vQKPbU_xFro',$,'Mounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.Note that BackToWall, Pedestal and WallHung are allowable values for a bidet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3672,$,$,$,.READWRITE.); +#3672=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3673=IFCSIMPLEPROPERTYTEMPLATE('2mA2uq1f10_BAuTUs3FlLl',$,'SpilloverLevel','The level at which water spills out of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3674=IFCPROPERTYSETTEMPLATE('2fwcRoobHBpekQXILFPUyX',$,'Pset_SanitaryTerminalTypeWashHandBasin','Waste water appliance for washing the upper parts of the body. HISTORY: In IFC4, Material property removed. Use materials capabilities from IfcMaterialResource schema. Datatype of color changed to IfcLabel (still a string value).',.PSET_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal/WASHHANDBASIN,IfcSanitaryTerminalType/WASHHANDBASIN',(#3675,#3677,#3679,#3680)); +#3675=IFCSIMPLEPROPERTYTEMPLATE('1i618fsFH6HB2e2Exhsotv',$,'WashHandBasinType','Defines the types of wash hand basin that may be specified where:DentalCuspidor: Waste water appliance that receives and flushes away mouth washings\X2\000A\X0\.\X2\000A\X0\HandRinse: Wall mounted wash hand basin that has an overall width of 500mm or less\X2\000A\X0\.\X2\000A\X0\Hospital: Wash hand basin that has a smooth easy clean surface without tapholes or overflow slot for use where hygiene is of prime importance.Tipup: Wash hand basin mounted on pivots so that it can be emptied by tilting.Vanity: Wash hand basin for installation into a horizontal surface.Washfountain: Wash hand basin that is circular, semi-circular or polygonal on plan, at which more than one person can wash at the same time.\X2\000A\X0\WashingTrough: Wash hand basin of elongated rectangular shape in plan, at which more than one person can wash at the same time.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3676,$,$,$,.READWRITE.); +#3676=IFCPROPERTYENUMERATION('PEnum_WashHandBasinType',(IFCLABEL('DENTALCUSPIDOR'),IFCLABEL('HANDRINSE'),IFCLABEL('HOSPITAL'),IFCLABEL('TIPUP'),IFCLABEL('WASHFOUNTAIN'),IFCLABEL('WASHINGTROUGH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3677=IFCSIMPLEPROPERTYTEMPLATE('3ylOTD1Ij8LgArmr5$GK1h',$,'Mounting','The property enumeration Pset_SanitaryMountingEnum defines the forms of mounting or fixing of the sanitary terminal that may be specified within property sets used to define sanitary terminals (WC\X2\2019\X0\s, basins, sinks, etc.) where:-BackToWall: A pedestal mounted sanitary terminal that fits flush to the wall at the rear to cover its service connections\X2\000A\X0\Pedestal: A floor mounted sanitary terminal that has an integral base\X2\000A\X0\CounterTop: A sanitary terminal that is installed into a horizontal surface that is installed into a horizontal surface. Note: When applied to a wash hand basin, the term more normally used is \X2\2018\X0\vanity\X2\2019\X0\. See also Wash Hand Basin Type specification.\X2\000A\X0\WallHung: A sanitary terminal cantilevered clear of the floor.Note that BackToWall, Pedestal and WallHung are allowable values for a bidet.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3678,$,$,$,.READWRITE.); +#3678=IFCPROPERTYENUMERATION('PEnum_SanitaryMounting',(IFCLABEL('BACKTOWALL'),IFCLABEL('COUNTERTOP'),IFCLABEL('PEDESTAL'),IFCLABEL('WALLHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3679=IFCSIMPLEPROPERTYTEMPLATE('0OecLDdMf2vORE60B2DxVr',$,'DrainSize','The size of the drain outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3680=IFCSIMPLEPROPERTYTEMPLATE('1hQUpD8k52c9DI4uoj8rAH',$,'MountingOffset','For counter top mounted basins the vertical offset between the top of the sink and the counter top.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3681=IFCPROPERTYSETTEMPLATE('0p0gkM4lf3ghwzH9wdGEDj',$,'Pset_SectioningDevice','Properties of sectioning device used in railway. The property set can be used by the predefined type INSULATOR of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/INSULATOR,IfcDiscreteAccessoryType/INSULATOR',(#3682)); +#3682=IFCSIMPLEPROPERTYTEMPLATE('3nkkA9gmvDWfFP77kFyLqq',$,'SectioningDeviceType','Indicates the sectioning device type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3683,$,$,$,.READWRITE.); +#3683=IFCPROPERTYENUMERATION('PEnum_SectioningDeviceType',(IFCLABEL('DIFFERENT_POWER_SUPPLY_SEPARATION'),IFCLABEL('PHASE_SEPARATION'),IFCLABEL('SAME_FEEDING_SECTION_SEPARATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3684=IFCPROPERTYSETTEMPLATE('1tkKoEUAn8SfdnzsnwKBn0',$,'Pset_SectionInsulator','Properties applicable to the insulator type of discrete accessory, indicated that the insulator is a section insulator used in the overhead contact line system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/INSULATOR,IfcDiscreteAccessoryType/INSULATOR',(#3685,#3686,#3687,#3688)); +#3685=IFCSIMPLEPROPERTYTEMPLATE('3QsX1gk1X6fBVpgGmvywqX',$,'ACResistance','The resistance under AC.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#3686=IFCSIMPLEPROPERTYTEMPLATE('0fupevSh9AQxKe71n7IAx3',$,'NumberOfWires','The number of wires used in the element.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3687=IFCSIMPLEPROPERTYTEMPLATE('24czfOweH7i8anTWEJs4Fd',$,'IsArcSuppressing','Indicates whether the element has the ability to suppress an arc.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3688=IFCSIMPLEPROPERTYTEMPLATE('0CPHJ155jFJOp2mClP2mQ9',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#3689=IFCPROPERTYSETTEMPLATE('02tTkRwO9CtAii60OmULsf',$,'Pset_SensorPHistory','Properties for history of controller values. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcSensor',(#3690,#3691,#3692,#3693)); +#3690=IFCSIMPLEPROPERTYTEMPLATE('1qqZdQ1AD3PfAHgCgW6P4q',$,'Value','The expected range and default value.\X2\000A000A\X0\Indicates sensed values over time which may be recorded continuously or only when changed beyond a particular deadband. The range of possible values is defined by the SetPoint property of the corresponding sensor type property set.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3691=IFCSIMPLEPROPERTYTEMPLATE('2dZD4DOkD1C9nwAftHKgFG',$,'Direction','Indicates sensed direction for sensors capturing magnitude and direction measured from True North (0 degrees) in a clockwise direction.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3692=IFCSIMPLEPROPERTYTEMPLATE('05iuvKEHT5JfcmGKODKqet',$,'Quality','Indicates the quality of measurement or failure condition, which may be further qualified by the Status. True: measured values are considered reliable; False: measured values are considered not reliable (i.e. a fault has been detected); Unknown: reliability of values is uncertain.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3693=IFCSIMPLEPROPERTYTEMPLATE('1ZO9BPNO9DFOqdO4vj1U3p',$,'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_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3694=IFCPROPERTYSETTEMPLATE('3YRyseFPj0NhYl8ygNUbQV',$,'Pset_SensorTypeCO2Sensor','A device that senses or detects carbon dioxide.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/CO2SENSOR,IfcSensorType/CO2SENSOR',(#3695)); +#3695=IFCSIMPLEPROPERTYTEMPLATE('2wm2Bfypr7bADiV$FnHYxv',$,'SetPointCO2Concentration','The carbon dioxide concentration to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3696=IFCPROPERTYSETTEMPLATE('31ZVyEhCX66vkJOm1KnzZi',$,'Pset_SensorTypeCommon','Sensor type common attributes. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor,IfcSensorType',(#3697,#3698)); +#3697=IFCSIMPLEPROPERTYTEMPLATE('0AU9CEnM10OPpTats4dTeV',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3698=IFCSIMPLEPROPERTYTEMPLATE('0mEhNZ4RTALg$yUJyMN2Li',$,'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',$,#3699,$,$,$,.READWRITE.); +#3699=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3700=IFCPROPERTYSETTEMPLATE('0zfatw3A56$gOomBNjsS_q',$,'Pset_SensorTypeConductanceSensor','A device that senses or detects electrical conductance. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/CONDUCTANCESENSOR,IfcSensorType/CONDUCTANCESENSOR',(#3701)); +#3701=IFCSIMPLEPROPERTYTEMPLATE('000hAxfW55ChKaN0dRJ9NE',$,'SetPointConductance','The fill level value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcElectricConductanceMeasure',$,$,$,$,$,.READWRITE.); +#3702=IFCPROPERTYSETTEMPLATE('2tfYBnxZf4cBz8Z5giCSSc',$,'Pset_SensorTypeContactSensor','A device that senses or detects contact. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/CONTACTSENSOR,IfcSensorType/CONTACTSENSOR',(#3703)); +#3703=IFCSIMPLEPROPERTYTEMPLATE('0agQGMk5r7Tw8obdiApYC0',$,'SetPointContact','The contact value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#3704=IFCPROPERTYSETTEMPLATE('1wK5v$3UT42u3WrVtT3uzv',$,'Pset_SensorTypeEarthquakeSensor','Properties that are applicable for IfcSensor with predefined type EARTHQUAKESENSOR.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/EARTHQUAKESENSOR,IfcSensorType/EARTHQUAKESENSOR',(#3705,#3706,#3707,#3708,#3709,#3711,#3712,#3713,#3714,#3715,#3717,#3718)); +#3705=IFCSIMPLEPROPERTYTEMPLATE('18A$NwGxP6fhmv3qjv0Iqc',$,'MarginOfError','Indicates the margin of error of the measurement.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3706=IFCSIMPLEPROPERTYTEMPLATE('2GlWH0DKL4HB1GiNUaGfpb',$,'LinearVelocityResolution','Indicates the resolution of the detected linear velocity.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3707=IFCSIMPLEPROPERTYTEMPLATE('1H9b$WZVz57etI3fqqAVFZ',$,'SamplingFrequency','Indicates the sampling frequency of the device.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#3708=IFCSIMPLEPROPERTYTEMPLATE('0OZhfxCFTCnvZs7rXSAaMT',$,'WorkingState','Indicates the working state of device or system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3709=IFCSIMPLEPROPERTYTEMPLATE('14z4TMfDH6SBDsGlOWql6t',$,'DataCollectionType','Indicates the type or manner of data collection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3710,$,$,$,.READWRITE.); +#3710=IFCPROPERTYENUMERATION('PEnum_DataCollectionType',(IFCLABEL('AUTOMATICANDCONTINUOUS'),IFCLABEL('MANUALANDSINGLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3711=IFCSIMPLEPROPERTYTEMPLATE('3GHGxw_pj9L929xHYcU1OO',$,'DegreeOfLinearity','Indicates the degree of linearity of the earthquake sensor or accelerometer.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3712=IFCSIMPLEPROPERTYTEMPLATE('35dqRD2R138hrdNim_cCX1',$,'DynamicRange','Indicates the dynamic range of the sensor.',.P_BOUNDEDVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3713=IFCSIMPLEPROPERTYTEMPLATE('08LM9Qbqb0wBXRvI70rgsE',$,'EarthquakeSensorRange','Indicates the measuring range of the earthquake sensor or accelerometer.',.P_BOUNDEDVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3714=IFCSIMPLEPROPERTYTEMPLATE('2ui6nEcr18MOdJn8lsBx1g',$,'FullScaleOutput','Indicates the full scale output of the earthquake sensor or accelerometer.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3715=IFCSIMPLEPROPERTYTEMPLATE('1LW9NYtTH81hwqPZh0jk4P',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3716,$,$,$,.READWRITE.); +#3716=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3717=IFCSIMPLEPROPERTYTEMPLATE('3WbBU2tlDBKAwdvX0o42SH',$,'TransverseSensitivityRatio','Indicates the transverse sensitivity ratio of the sensor.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3718=IFCSIMPLEPROPERTYTEMPLATE('3Fm8g7oi9ENvjUJr6EknES',$,'EarthquakeSensorType','Indicates the type of earthquake sensor or accelerometer.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3719,$,$,$,.READWRITE.); +#3719=IFCPROPERTYENUMERATION('PEnum_EarthquakeSensorType',(IFCLABEL('2DIRECTION'),IFCLABEL('3DIRECTION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3720=IFCPROPERTYSETTEMPLATE('0t5iMcFTHAIgT7um9xGIwJ',$,'Pset_SensorTypeFireSensor','A device that senses or detects the presence of fire.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/FIRESENSOR,IfcSensorType/FIRESENSOR',(#3721,#3722,#3723)); +#3721=IFCSIMPLEPROPERTYTEMPLATE('2fqi9FKoj5Ewhe1pAAAowt',$,'FireSensorSetPoint','The temperature value to be sensed to indicate the presence of fire.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3722=IFCSIMPLEPROPERTYTEMPLATE('16muQhPJP8d9IKZYhrkABK',$,'AccuracyOfFireSensor','The accuracy of the sensor.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3723=IFCSIMPLEPROPERTYTEMPLATE('1UpbKk7MX168gcNjqFaU8N',$,'TimeConstant','The time constant of the sensor.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3724=IFCPROPERTYSETTEMPLATE('2WZkEN22T8twvPDwpAYRpv',$,'Pset_SensorTypeFlowSensor','A device that senses or detects flow. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/FLOWSENSOR,IfcSensorType/FLOWSENSOR',(#3725)); +#3725=IFCSIMPLEPROPERTYTEMPLATE('2tDSy3U81CmepsyRI_PczK',$,'SetPointFlow','The volumetric flow value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#3726=IFCPROPERTYSETTEMPLATE('1APaAE6HvCdB5ASeBKLANL',$,'Pset_SensorTypeForeignObjectDetectionSensor','Properties that are applicable for IfcSensor with predefined type FOREIGNOBJECTDETECTIONSENSOR.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/FOREIGNOBJECTDETECTIONSENSOR,IfcSensorType/FOREIGNOBJECTDETECTIONSENSOR',(#3727,#3728,#3730)); +#3727=IFCSIMPLEPROPERTYTEMPLATE('3N3XhlU9HFGOFpmLJXsdMp',$,'WorkingState','Indicates the working state of device or system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3728=IFCSIMPLEPROPERTYTEMPLATE('2czBsIckLEKQfxC$y1pPhX',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3729,$,$,$,.READWRITE.); +#3729=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3730=IFCSIMPLEPROPERTYTEMPLATE('1hEY6DUCzDzw6TkYUIhmGI',$,'ForeignObjectDetectionSensorType','Indicates the type of foreign object detection sensor.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3731,$,$,$,.READWRITE.); +#3731=IFCPROPERTYENUMERATION('PEnum_ForeignObjectDetectionSensorType',(IFCLABEL('DUALPOWERNETWORK'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3732=IFCPROPERTYSETTEMPLATE('0fOHVDw$14sA7AyMeE88M4',$,'Pset_SensorTypeFrostSensor','A device that senses or detects the presence of frost.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/FROSTSENSOR,IfcSensorType/FROSTSENSOR',(#3733)); +#3733=IFCSIMPLEPROPERTYTEMPLATE('39REst7BXDVwTBjjB5dwZV',$,'SetPointFrost','The detection of frost.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3734=IFCPROPERTYSETTEMPLATE('3I2xUU8sP4ERWBvMGwIRIv',$,'Pset_SensorTypeGasSensor','A device that senses or detects gas. HISTORY: Changed in IFC4. Gas detected made into enumeration, set point concentration and coverage area added. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/GASSENSOR,IfcSensorType/GASSENSOR',(#3735,#3736,#3737)); +#3735=IFCSIMPLEPROPERTYTEMPLATE('1y6XEapqr3vO4H2zmsIHl5',$,'GasDetected','Identification of the gas that is being detected, according to chemical formula. For example, carbon monoxide is ''CO'', carbon dioxide is ''CO2'', oxygen is ''O2''.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3736=IFCSIMPLEPROPERTYTEMPLATE('12EMpEn4HFSvC$h8HBf5W6',$,'SetPointConcentration','The concentration to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3737=IFCSIMPLEPROPERTYTEMPLATE('2hBZvOhyrEfQJSds30qXmP',$,'CoverageArea','The area that is covered by the object.\X2\000A000A\X0\Floor area (typically measured as a circle whose center is at the location of the sensor).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3738=IFCPROPERTYSETTEMPLATE('0WJBv_LODBKesfkXtKmMnt',$,'Pset_SensorTypeHeatSensor','A device that senses or detects heat. HISTORY: In IFC4, incorporates Fire Sensor. HeatSensorSetPoint changed to SetPointTemperature',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/HEATSENSOR,IfcSensorType/HEATSENSOR',(#3739,#3740,#3741)); +#3739=IFCSIMPLEPROPERTYTEMPLATE('2sfbHzDM91AehDtg3Cza7x',$,'CoverageArea','The area that is covered by the object.\X2\000A000A\X0\Floor area (typically measured as a circle whose center is at the location of the sensor).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3740=IFCSIMPLEPROPERTYTEMPLATE('3gpyAaBmD6dPcpCXZWnpLq',$,'SetPointTemperature','The temperature value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3741=IFCSIMPLEPROPERTYTEMPLATE('0BpBpZqIj6bPXnasxPyPmu',$,'RateOfTemperatureRise','The rate of temperature rise that is to be sensed as being hazardous.',.P_SINGLEVALUE.,'IfcTemperatureRateOfChangeMeasure',$,$,$,$,$,.READWRITE.); +#3742=IFCPROPERTYSETTEMPLATE('14AZGN12vBluCPNsFVfk_C',$,'Pset_SensorTypeHumiditySensor','A device that senses or detects humidity. HISTORY: HumiditySensorSetPoint changed to SetPointHumidity. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/HUMIDITYSENSOR,IfcSensorType/HUMIDITYSENSOR',(#3743)); +#3743=IFCSIMPLEPROPERTYTEMPLATE('3nSv_OLnH4sO7vvupIcmji',$,'SetPointHumidity','The humidity value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3744=IFCPROPERTYSETTEMPLATE('3OQgAU8l52nu7EoyGmgFt_',$,'Pset_SensorTypeIdentifierSensor','A device that senses identification tags.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/IDENTIFIERSENSOR,IfcSensorType/IDENTIFIERSENSOR',(#3745)); +#3745=IFCSIMPLEPROPERTYTEMPLATE('1dT7bWsg973w9zjqyvo$te',$,'SetPointIdentifier','The detected tag value.',.P_BOUNDEDVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3746=IFCPROPERTYSETTEMPLATE('3qZ97g4oj5S9GG4IvMcury',$,'Pset_SensorTypeIonConcentrationSensor','A device that senses or detects ion concentration such as water hardness. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/IONCONCENTRATIONSENSOR,IfcSensorType/IONCONCENTRATIONSENSOR',(#3747,#3748)); +#3747=IFCSIMPLEPROPERTYTEMPLATE('0DWJPRS713tug5IuBXt7xS',$,'SubstanceDetected','Identification of the substance that is being detected according to chemical formula. For example, calcium carbonate is ''CaCO3''',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3748=IFCSIMPLEPROPERTYTEMPLATE('14hhUAkzL6IBFjcQ$YWGnI',$,'SetPointIonConcentration','The ion concentration value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcIonConcentrationMeasure',$,$,$,$,$,.READWRITE.); +#3749=IFCPROPERTYSETTEMPLATE('3gZCgaV9X8WPGQFUm3x2rf',$,'Pset_SensorTypeLevelSensor','A device that senses or detects fill level. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/LEVELSENSOR,IfcSensorType/LEVELSENSOR',(#3750)); +#3750=IFCSIMPLEPROPERTYTEMPLATE('0TZevbW1T9tucvycZr3Pr_',$,'SetPointLevel','The fill level value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3751=IFCPROPERTYSETTEMPLATE('0fal0SOLrAwhBzxAoh8Ozo',$,'Pset_SensorTypeLightSensor','A device that senses or detects light. HISTORY: LightSensorSensorSetPoint changed to SetPointIlluminance. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/LIGHTSENSOR,IfcSensorType/LIGHTSENSOR',(#3752)); +#3752=IFCSIMPLEPROPERTYTEMPLATE('2FMFSxbI1DvAE6BmcHjE3S',$,'SetPointIlluminance','The illuminance value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcIlluminanceMeasure',$,$,$,$,$,.READWRITE.); +#3753=IFCPROPERTYSETTEMPLATE('2ocgcnr5j6jA25a6gYIfZR',$,'Pset_SensorTypeMoistureSensor','A device that senses or detects moisture. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/MOISTURESENSOR,IfcSensorType/MOISTURESENSOR',(#3754)); +#3754=IFCSIMPLEPROPERTYTEMPLATE('3rZviSPmzAfxcDmmugRU5E',$,'SetPointMoisture','The moisture value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3755=IFCPROPERTYSETTEMPLATE('0Ejm_Y68X8awtr$P$8hTKa',$,'Pset_SensorTypeMovementSensor','A device that senses or detects movement. HISTORY: In IFC4, time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/MOVEMENTSENSOR,IfcSensorType/MOVEMENTSENSOR',(#3756,#3758)); +#3756=IFCSIMPLEPROPERTYTEMPLATE('0SJogRnnr9LhCp17Db6eXY',$,'MovementSensingType','Enumeration that identifies the type of movement sensing mechanism.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3757,$,$,$,.READWRITE.); +#3757=IFCPROPERTYENUMERATION('PEnum_MovementSensingType',(IFCLABEL('PHOTOELECTRICCELL'),IFCLABEL('PRESSUREPAD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3758=IFCSIMPLEPROPERTYTEMPLATE('3Bmq1MO4f99unbS6j4IwDG',$,'SetPointMovement','The movement to be sensed.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3759=IFCPROPERTYSETTEMPLATE('0bjv0Q8Zj8rOgyrU8Ssrgf',$,'Pset_SensorTypePHSensor','A device that senses or detects acidity. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/PHSENSOR,IfcSensorType/PHSENSOR',(#3760)); +#3760=IFCSIMPLEPROPERTYTEMPLATE('0_CkiUnzP9lhFVW5nE6aCr',$,'SetPointPH','The fill level value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPHMeasure',$,$,$,$,$,.READWRITE.); +#3761=IFCPROPERTYSETTEMPLATE('1i$VdWB0rFlgqOcO1_4o1C',$,'Pset_SensorTypePressureSensor','A device that senses or detects pressure. HISTORY: PressureSensorSensorSetPoint changed to SetPointPressure. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/PRESSURESENSOR,IfcSensorType/PRESSURESENSOR',(#3762,#3763)); +#3762=IFCSIMPLEPROPERTYTEMPLATE('3AOMjBRIH2fRmtB9e4sHEq',$,'SetPointPressure','The pressure value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#3763=IFCSIMPLEPROPERTYTEMPLATE('3YdxCXMbz2IP5OwK6fymJR',$,'IsSwitch','Identifies if the sensor also functions as a switch at the set point (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3764=IFCPROPERTYSETTEMPLATE('2_x0_UZQrBN8p7GM7UBnjC',$,'Pset_SensorTypeRadiationSensor','A device that senses or detects radiation. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/RADIATIONSENSOR,IfcSensorType/RADIATIONSENSOR',(#3765)); +#3765=IFCSIMPLEPROPERTYTEMPLATE('1qkIOJX1PFKg2PT7bpLse2',$,'SetPointRadiation','The radiation power value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#3766=IFCPROPERTYSETTEMPLATE('061hKq2vD1pfCqpUUC_CfX',$,'Pset_SensorTypeRadioactivitySensor','A device that senses or detects atomic decay. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/RADIOACTIVITYSENSOR,IfcSensorType/RADIOACTIVITYSENSOR',(#3767)); +#3767=IFCSIMPLEPROPERTYTEMPLATE('0IQduplNj8G8XMwVofpwAp',$,'SetPointRadioactivity','The radioactivity value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcRadioActivityMeasure',$,$,$,$,$,.READWRITE.); +#3768=IFCPROPERTYSETTEMPLATE('2Vm6U3YcD9qw8N47bEPmxg',$,'Pset_SensorTypeRainSensor','Properties that are applicable for IfcSensor with predefined type RAINSENSOR.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/RAINSENSOR,IfcSensorType/RAINSENSOR',(#3769,#3770,#3771,#3772,#3774,#3775,#3777,#3778)); +#3769=IFCSIMPLEPROPERTYTEMPLATE('0sr_OgKIDAa9eahPYsyKnK',$,'MarginOfError','Indicates the margin of error of the measurement.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3770=IFCSIMPLEPROPERTYTEMPLATE('0heLxWYcTDSeKGblsHyhEo',$,'SamplingFrequency','Indicates the sampling frequency of the device.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#3771=IFCSIMPLEPROPERTYTEMPLATE('1f68LKLFP4CODXLFaaLeRs',$,'WorkingState','Indicates the working state of device or system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3772=IFCSIMPLEPROPERTYTEMPLATE('0llDwWm7LDdRWehwUEdBHw',$,'DataCollectionType','Indicates the type or manner of data collection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3773,$,$,$,.READWRITE.); +#3773=IFCPROPERTYENUMERATION('PEnum_DataCollectionType',(IFCLABEL('AUTOMATICANDCONTINUOUS'),IFCLABEL('MANUALANDSINGLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3774=IFCSIMPLEPROPERTYTEMPLATE('2js_yew3b7xPuxgtmgNhkj',$,'LengthMeasureResolution','Indicates the resolution for length measure of the device.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3775=IFCSIMPLEPROPERTYTEMPLATE('0_LdjHcmH9GhN_39IPiVXB',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3776,$,$,$,.READWRITE.); +#3776=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3777=IFCSIMPLEPROPERTYTEMPLATE('0Vj38tTgXEEPuuuCo7TL4y',$,'RainMeasureRange','Indicates the measuring range of rain gauge.',.P_BOUNDEDVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3778=IFCSIMPLEPROPERTYTEMPLATE('24yD4r1y54vvBHKuLNiv6C',$,'RainSensorType','Indicates the type of rain sensor or gauge.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3779,$,$,$,.READWRITE.); +#3779=IFCPROPERTYENUMERATION('PEnum_RainSensorType',(IFCLABEL('MICROWAVE'),IFCLABEL('PIEZOELECTRIC'),IFCLABEL('TIPPINGBUCKET'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3780=IFCPROPERTYSETTEMPLATE('2JuylVpn9A7P0CRzw2rKIu',$,'Pset_SensorTypeSmokeSensor','A device that senses or detects smoke. HISTORY: PressureSensorSensorSetPoint (error in previous release) changed to SetPointConcentration. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/SMOKESENSOR,IfcSensorType/SMOKESENSOR',(#3781,#3782,#3783)); +#3781=IFCSIMPLEPROPERTYTEMPLATE('3BYBNCIUzBFRNsWFiwtJOR',$,'CoverageArea','The area that is covered by the object.\X2\000A000A\X0\Floor area (typically measured as a circle whose center is at the location of the sensor).',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3782=IFCSIMPLEPROPERTYTEMPLATE('2HA4DtKu14ZuPb5oIqdTiS',$,'SetPointConcentration','The concentration to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3783=IFCSIMPLEPROPERTYTEMPLATE('2TAFRtU1DF18BAaWHMN0Ip',$,'HasBuiltInAlarm','Indicates whether the smoke sensor is included as an element within a smoke alarm/sensor unit (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3784=IFCPROPERTYSETTEMPLATE('0pXGDgg_zAZR3sYidDrJtg',$,'Pset_SensorTypeSnowSensor','Properties that are applicable for IfcSensor with predefined type SNOWDEPTHSENSOR.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/SNOWDEPTHSENSOR,IfcSensorType/SNOWDEPTHSENSOR',(#3785,#3786,#3787,#3789,#3790,#3792,#3794,#3795,#3796)); +#3785=IFCSIMPLEPROPERTYTEMPLATE('0WJkPmfYn0jAkD5KsXN08$',$,'MarginOfError','Indicates the margin of error of the measurement.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3786=IFCSIMPLEPROPERTYTEMPLATE('2w$YrTuMnFDu8GrTK8v95t',$,'SamplingFrequency','Indicates the sampling frequency of the device.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#3787=IFCSIMPLEPROPERTYTEMPLATE('0msTVOlsvCFQYbXIBEgSg5',$,'DataCollectionType','Indicates the type or manner of data collection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3788,$,$,$,.READWRITE.); +#3788=IFCPROPERTYENUMERATION('PEnum_DataCollectionType',(IFCLABEL('AUTOMATICANDCONTINUOUS'),IFCLABEL('MANUALANDSINGLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3789=IFCSIMPLEPROPERTYTEMPLATE('0liofbQCfAgAU0JrXIdsNe',$,'ImageResolution','Indicates the image resolution of snow depth meter.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3790=IFCSIMPLEPROPERTYTEMPLATE('2hUO0FPKXBbxOFxBBw3B2m',$,'ImageShootingMode','Indicates the type or manner of snow depth meter image shooting.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3791,$,$,$,.READWRITE.); +#3791=IFCPROPERTYENUMERATION('PEnum_ImageShootingMode',(IFCLABEL('AUTOMATIC'),IFCLABEL('MANUAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3792=IFCSIMPLEPROPERTYTEMPLATE('0WkvzM$3v3yfKtm2SbwBat',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3793,$,$,$,.READWRITE.); +#3793=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3794=IFCSIMPLEPROPERTYTEMPLATE('0ofmazEq58oA10nVvNmWNK',$,'LengthMeasureResolution','Indicates the resolution for length measure of the device.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3795=IFCSIMPLEPROPERTYTEMPLATE('0NRODAhEz9LO2fL6yMjuwM',$,'SnowSensorMeasureRange','Indicates the measuring range of snow depth meter.',.P_BOUNDEDVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3796=IFCSIMPLEPROPERTYTEMPLATE('28JLIzNRP4P9MzKC1eEs4Y',$,'SnowSensorType','Indicates the type of snow depth meter.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3797,$,$,$,.READWRITE.); +#3797=IFCPROPERTYENUMERATION('PEnum_SnowSensorType',(IFCLABEL('LASERIRRADIATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3798=IFCPROPERTYSETTEMPLATE('1FvkOPCGr2mOUp$bWPi3V_',$,'Pset_SensorTypeSoundSensor','A device that senses or detects sound. HISTORY: SoundSensorSensorSetPoint changed to SetPointSound. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/SOUNDSENSOR,IfcSensorType/SOUNDSENSOR',(#3799)); +#3799=IFCSIMPLEPROPERTYTEMPLATE('14cXn65nTB4OOzwj59RZbL',$,'SetPointSound','The sound pressure value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcSoundPressureMeasure',$,$,$,$,$,.READWRITE.); +#3800=IFCPROPERTYSETTEMPLATE('0F9xVb1rHFqQF046Ozr3Hp',$,'Pset_SensorTypeTemperatureSensor','A device that senses or detects temperature. HISTORY: TemperatureSensorSensorSetPoint changed to SetPointTemperature. Range, accuracy and time constant deleted.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/TEMPERATURESENSOR,IfcSensorType/TEMPERATURESENSOR',(#3801,#3803)); +#3801=IFCSIMPLEPROPERTYTEMPLATE('1aASqgsTvChuv6UhW3brzw',$,'TemperatureSensorType','Enumeration that Identifies the types of temperature sensor that can be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3802,$,$,$,.READWRITE.); +#3802=IFCPROPERTYENUMERATION('PEnum_TemperatureSensorType',(IFCLABEL('HIGHLIMIT'),IFCLABEL('LOWLIMIT'),IFCLABEL('OPERATINGTEMPERATURE'),IFCLABEL('OUTSIDETEMPERATURE'),IFCLABEL('ROOMTEMPERATURE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3803=IFCSIMPLEPROPERTYTEMPLATE('3AgBBB0714LB$i2_7Tyf0o',$,'SetPointTemperature','The temperature value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3804=IFCPROPERTYSETTEMPLATE('2N7HZDrpn0$xB49GB0nOvp',$,'Pset_SensorTypeTurnoutClosureSensor','Properties that are applicable for IfcSensor with predefined type TURNOUTCLOSURESENSOR.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/TURNOUTCLOSURESENSOR,IfcSensorType/TURNOUTCLOSURESENSOR',(#3805,#3806)); +#3805=IFCSIMPLEPROPERTYTEMPLATE('1CwuA09Ev0fBkC1PZ0$Pm9',$,'DetectionRange','The detection range of the equipment.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3806=IFCSIMPLEPROPERTYTEMPLATE('3CwDmxw1n9HBa_c98LkRq5',$,'IndicationRodMovementRange','Indicates the range of indication rod movement.',.P_BOUNDEDVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3807=IFCPROPERTYSETTEMPLATE('3fP_8k$xbAI94uYWdSDD3S',$,'Pset_SensorTypeWindSensor','A device that senses or detects wind speed and direction. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSensor/WINDSENSOR,IfcSensorType/WINDSENSOR',(#3808,#3810,#3811,#3812,#3814,#3815,#3816,#3817,#3818,#3819,#3820,#3822,#3823)); +#3808=IFCSIMPLEPROPERTYTEMPLATE('0vT1$u4uDAf8FnhVME3Vhs',$,'WindSensorType','Enumeration that Identifies the types of wind sensors that can be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3809,$,$,$,.READWRITE.); +#3809=IFCPROPERTYENUMERATION('PEnum_WindSensorType',(IFCLABEL('CUP'),IFCLABEL('HOTWIRE'),IFCLABEL('LASERDOPPLER'),IFCLABEL('PLATE'),IFCLABEL('SONIC'),IFCLABEL('TUBE'),IFCLABEL('WINDMILL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3810=IFCSIMPLEPROPERTYTEMPLATE('29UmudtUX8WfNPMAzIlUi7',$,'SetPointSpeed','The wind speed value to be sensed. Use IfcPropertyBoundedValue.SetPointValue to set the set point value.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3811=IFCSIMPLEPROPERTYTEMPLATE('2KCA0AV_DEcA8sgYoHWrru',$,'DampingRatio','Indicates the damping ratio of the device.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3812=IFCSIMPLEPROPERTYTEMPLATE('1_p6O1VG980xJUVLP9S5O3',$,'SerialInterfaceType','Indicates the type of serial interface used by the device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3813,$,$,$,.READWRITE.); +#3813=IFCPROPERTYENUMERATION('PEnum_SerialInterfaceType',(IFCLABEL('RS_232'),IFCLABEL('RS_422'),IFCLABEL('RS_485'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3814=IFCSIMPLEPROPERTYTEMPLATE('3LfJRSiaDFc9UH5Zr0cm9c',$,'MarginOfError','Indicates the margin of error of the measurement.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3815=IFCSIMPLEPROPERTYTEMPLATE('35U2C6kYz1QRhe761_vaU2',$,'LinearVelocityResolution','Indicates the resolution of the detected linear velocity.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3816=IFCSIMPLEPROPERTYTEMPLATE('2htwQolwj6Lwm_Tc37VcQp',$,'SamplingFrequency','Indicates the sampling frequency of the device.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#3817=IFCSIMPLEPROPERTYTEMPLATE('1xP16vmEH5TAQh8lB11xy_',$,'StartingWindSpeed','Indicates the starting wind speed of the wind sensor.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3818=IFCSIMPLEPROPERTYTEMPLATE('1etVtJiLj2VO6$KErWLLwQ',$,'WorkingState','Indicates the working state of device or system.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3819=IFCSIMPLEPROPERTYTEMPLATE('05WyzCHZn47fVcuk$d3Xd1',$,'TimeConstant','The time constant of the sensor.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#3820=IFCSIMPLEPROPERTYTEMPLATE('1v4YOFTUX4_vhiSN5Avv5A',$,'DataCollectionType','Indicates the type or manner of data collection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3821,$,$,$,.READWRITE.); +#3821=IFCPROPERTYENUMERATION('PEnum_DataCollectionType',(IFCLABEL('AUTOMATICANDCONTINUOUS'),IFCLABEL('MANUALANDSINGLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3822=IFCSIMPLEPROPERTYTEMPLATE('1OKwz8yBX6OR_Kie1dugXc',$,'WindAngleRange','Indicates the wind angle range the sensor can monitor.',.P_BOUNDEDVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#3823=IFCSIMPLEPROPERTYTEMPLATE('3TCKm2E1f36xihFrOOicsw',$,'WindSpeedRange','Indicates the range of wind speed the sensor can monitor.',.P_BOUNDEDVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3824=IFCPROPERTYSETTEMPLATE('0vlBP6PYXDxvZ36z2F1wJa',$,'Pset_ServiceLife','Captures the period of time that an artifact will last. HISTORY: Introduced in IFC2X4 as replacement for IfcServiceLife.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#3825,#3826)); +#3825=IFCSIMPLEPROPERTYTEMPLATE('0VX8lpeBr5qfFjGCIa4Gms',$,'ServiceLifeDuration','The length or duration of a service life.The lower bound indicates pessimistic service life, the upper bound indicates optimistic service life, and the setpoint indicates the typical service life.',.P_BOUNDEDVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#3826=IFCSIMPLEPROPERTYTEMPLATE('0Tu07l04DFQfzHmc1k1asI',$,'MeanTimeBetweenFailure','The average time duration between instances of failure of a product.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#3827=IFCPROPERTYSETTEMPLATE('2HcqC8pOz86wgY8E0L6Mgs',$,'Pset_ServiceLifeFactors','Captures various factors that impact the expected service life of elements within the system or zone.',.PSET_OCCURRENCEDRIVEN.,'IfcSystem',(#3828,#3829,#3830,#3831,#3832,#3833,#3834)); +#3828=IFCSIMPLEPROPERTYTEMPLATE('3VB1uOpGj26R2YqX9SwbGo',$,'QualityOfComponents','Adjustment of the service life resulting from the effect of the quality of components used.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3829=IFCSIMPLEPROPERTYTEMPLATE('3od_VecJP1_v4JwLKJQ$53',$,'DesignLevel','Adjustment of the service life resulting from the effect of design level employed.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3830=IFCSIMPLEPROPERTYTEMPLATE('3gXIrFxsr1UBGAkxEBSwAh',$,'WorkExecutionLevel','Adjustment of the service life resulting from the effect of the quality of work executed.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3831=IFCSIMPLEPROPERTYTEMPLATE('0cKEt6sMT61RwO_3AYmr3S',$,'IndoorEnvironment','Adjustment of the service life resulting from the effect of the indoor environment (where appropriate).',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3832=IFCSIMPLEPROPERTYTEMPLATE('1p47KEvwfAmedG2RkkWbLZ',$,'OutdoorEnvironment','Adjustment of the service life resulting from the effect of the outdoor environment (where appropriate)',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3833=IFCSIMPLEPROPERTYTEMPLATE('28jJ5D2LXEDgbwBjnCV1CJ',$,'InUseConditions','Adjustment of the service life resulting from the effect of the conditions in which components are operating.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3834=IFCSIMPLEPROPERTYTEMPLATE('38FWvqRUvBHPYdYCpCcA7j',$,'MaintenanceLevel','Adjustment of the service life resulting from the effect of the level or degree of maintenance applied to dcomponents.',.P_BOUNDEDVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3835=IFCPROPERTYSETTEMPLATE('0YGFSfSUfEPhpUGXbWB0Y1',$,'Pset_ShadingDeviceCommon','Shading device properties associated with an element that represents a shading device',.PSET_TYPEDRIVENOVERRIDE.,'IfcShadingDevice,IfcShadingDeviceType',(#3836,#3837,#3839,#3841,#3842,#3843,#3844,#3845,#3846,#3847,#3848,#3849)); +#3836=IFCSIMPLEPROPERTYTEMPLATE('2M1flkJl16JvoKDT2mcYvR',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3837=IFCSIMPLEPROPERTYTEMPLATE('0Z0TQp9MH4t8Rk$7RNw6NT',$,'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',$,#3838,$,$,$,.READWRITE.); +#3838=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3839=IFCSIMPLEPROPERTYTEMPLATE('1OygHdLSv3o8TnucVcpiPa',$,'ShadingDeviceType','Specifies the type of shading device.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3840,$,$,$,.READWRITE.); +#3840=IFCPROPERTYENUMERATION('PEnum_ElementShading',(IFCLABEL('FIXED'),IFCLABEL('MOVABLE'),IFCLABEL('OVERHANG'),IFCLABEL('SIDEFIN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3841=IFCSIMPLEPROPERTYTEMPLATE('0gl3aa5tP8vxZzroX1F8A1',$,'MechanicalOperated','Indication whether the element is operated machanically (TRUE) or not, i.e. manually (FALSE).\X2\000A000A\X0\Indication whether the element is operated mechanically (TRUE) or not, i.e. manually (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3842=IFCSIMPLEPROPERTYTEMPLATE('2uwhgLLLX3xf8RC3VmxZcV',$,'SolarTransmittance','The ratio of incident solar radiation that directly passes through a system (also named \X2\03C4\X0\e). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#3843=IFCSIMPLEPROPERTYTEMPLATE('0pAkcra0n1Ax_jWEGDqPmJ',$,'SolarReflectance','(Rsol): The ratio of incident solar radiation that is reflected by a glazing system (also named \X2\03C1\X0\e). Note the following equation Asol + Rsol + Tsol = 1',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#3844=IFCSIMPLEPROPERTYTEMPLATE('1KYgVv18LDyOClNgZbDiMB',$,'VisibleLightTransmittance','Fraction of the visible light that passes the object at normal incidence. It is a value without unit.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#3845=IFCSIMPLEPROPERTYTEMPLATE('0UBCRj2hP9Jg_qWA1Z31af',$,'VisibleLightReflectance','Fraction of the visible light that is reflected by the glazing at normal incidence. It is a value without unit.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#3846=IFCSIMPLEPROPERTYTEMPLATE('3d0mYI93n18e34zpHhFA5B',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).\X2\000A000A\X0\Thermal transmittance coefficient (U-Value) of a material of a certain thickness for this element.',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#3847=IFCSIMPLEPROPERTYTEMPLATE('2DovRy4L90avAVhGY_gicq',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3848=IFCSIMPLEPROPERTYTEMPLATE('2cy4eFYrTDHv879Jn9G5sX',$,'Roughness','A measure of the vertical deviations of the surface.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3849=IFCSIMPLEPROPERTYTEMPLATE('2JV56R5K92nQihia6fRRJB',$,'SurfaceColour','The colour of the surface.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3850=IFCPROPERTYSETTEMPLATE('3UrenIzq9A6RSgqXInkThq',$,'Pset_ShadingDevicePHistory','Shading device performance history attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcShadingDevice',(#3851,#3852)); +#3851=IFCSIMPLEPROPERTYTEMPLATE('27pO$nN2j0nRbLwzUdPv03',$,'TiltAngle','The angle of tilt defined in the plane perpendicular to the extrusion axis (X-Axis of the local placement). The angle shall be measured from the orientation of the Z-Axis in the local placement.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3852=IFCSIMPLEPROPERTYTEMPLATE('24kx51F7T1jA1kO1yxxHKt',$,'Azimuth','The azimuth of the outward normal for the outward or upward facing surface.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3853=IFCPROPERTYSETTEMPLATE('3wPChUqEDAEgsG5ByGolV2',$,'Pset_ShipLockCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to SHIPLOCK.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/SHIPLOCK',(#3854,#3855,#3856,#3857)); +#3854=IFCSIMPLEPROPERTYTEMPLATE('3XJ70Nvlz0MQ02oy4aOzDy',$,'CillLevelUpperHead','Height of the upper head cill level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3855=IFCSIMPLEPROPERTYTEMPLATE('01fbAnyTH0cOhbo0LhCuQu',$,'CillLevelLowerHead','Height of the lower head cill level',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3856=IFCSIMPLEPROPERTYTEMPLATE('2PUj4rfBzCOAmm2N0uZ8$5',$,'WaterDeliveryValveType','Type of water delivery valve',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3857=IFCSIMPLEPROPERTYTEMPLATE('3BvOIiTBv6$9yYopuJts4p',$,'WaterDeliverySystemType','Type of water delivery system',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3858=IFCPROPERTYSETTEMPLATE('2ExSa3lT196hkvfgW$iGQd',$,'Pset_ShiplockComplex','Properties common to the definition of occurrences of IfcMarineFacility with the predefined type set to SHIPLOCK, where the facility represents a complex of multiple shiplocks.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/SHIPLOCK',(#3859,#3860,#3861,#3862)); +#3859=IFCSIMPLEPROPERTYTEMPLATE('0OXo9sIN54AP9TYccsFQgm',$,'LockGrade','Operational grading of the ship lock complex',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3860=IFCSIMPLEPROPERTYTEMPLATE('2TUt95ILDA8x9l3y$acgcX',$,'LockLines','Number of Parallel lock series',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3861=IFCSIMPLEPROPERTYTEMPLATE('3kOQM1EHf3d8DoZpSlDkKq',$,'LockChamberLevels','Number of steps (chambers) in a lock line',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3862=IFCSIMPLEPROPERTYTEMPLATE('3DndIPF819GeP3alxuwvES',$,'LockMode','Type of lock system used.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3863=IFCPROPERTYSETTEMPLATE('0Zk6H2bQH8Ieg0lObTn$MR',$,'Pset_ShiplockDesignCriteria','Properties common to the definition of design criteria of all occurrences of IfcMarineFacility with the predefined type set to SHIPLOCK.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/SHIPLOCK',(#3864,#3865,#3866,#3867,#3868,#3869,#3870,#3871)); +#3864=IFCSIMPLEPROPERTYTEMPLATE('0M2kepPxL6ZO2mgrNhvGqt',$,'MaximumUpstreamNavigableWaterLevel','Design maximum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3865=IFCSIMPLEPROPERTYTEMPLATE('3L_OPgopfBNP76hUQn6vuz',$,'MinimumUpstreamNavigableWaterLevel','Design minimum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3866=IFCSIMPLEPROPERTYTEMPLATE('3Yb$4L85v6fuHu6B2IFs6V',$,'MaximumDownstreamNavigableWaterLevel','Design maximum downstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3867=IFCSIMPLEPROPERTYTEMPLATE('34gFDuICXEShGg20yj1q0K',$,'MinimumDownstreamNavigableWaterLevel','Design minimum downstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3868=IFCSIMPLEPROPERTYTEMPLATE('3WO0$De1vAPv8ZD8RxoqZl',$,'UpstreamMaintenanceWaterLevel','Design maximum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3869=IFCSIMPLEPROPERTYTEMPLATE('3KERVjqQ96jhvaGwZ_GaT_',$,'DownstreamMaintenanceWaterLevel','Design minimum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3870=IFCSIMPLEPROPERTYTEMPLATE('1Jd$fHVIX37BzoH_a4FO0z',$,'UpstreamFloodWaterLevel','Design maximum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3871=IFCSIMPLEPROPERTYTEMPLATE('1IUsMcsRz56xE9I3lPNfjJ',$,'DownstreamFloodWaterLevel','the design minimum upstream water level for the lock complex',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#3872=IFCPROPERTYSETTEMPLATE('1VGFz8j$f8CR19lHBDony_',$,'Pset_ShipyardCommon','Properties common to the definition of all occurrences of IfcMarineFacility with the predefined type set to SHIPYARD.',.PSET_OCCURRENCEDRIVEN.,'IfcMarineFacility/SHIPYARD',(#3873)); +#3873=IFCSIMPLEPROPERTYTEMPLATE('1GbYIRgyn92ufcyx6QNl29',$,'PrimaryProductionType','Primary type of ship production of the facility',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3874=IFCPROPERTYSETTEMPLATE('3oBZfQpBPCZO7rvSBG0_iG',$,'Pset_SignalFrame','Properties that define signal frame parameters for occurrences and types of IfcSignal applied in railways.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSignal,IfcSignalType',(#3875,#3876,#3877,#3878,#3880,#3881)); +#3875=IFCSIMPLEPROPERTYTEMPLATE('3Q7jZJ3Vr97B7kreQrfi7z',$,'BackboardType','The type of the backboard of the signal frame.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3876=IFCSIMPLEPROPERTYTEMPLATE('1KD3z78Sn4nRs2a4XPDAux',$,'SignalFrameType','Type of frame, e.g. main frame, route indicator, speed indicator, direction indicator, etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3877=IFCSIMPLEPROPERTYTEMPLATE('3fnHQ4Jqj6dvdQud3qpO$a',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3878=IFCSIMPLEPROPERTYTEMPLATE('2p$DjGDkfAJ8D4BgmTQDyR',$,'SignalIndicatorType','Type of the indicators on a signal, e.g. route indicator, speed restriction indicator etc.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3879,$,$,$,.READWRITE.); +#3879=IFCPROPERTYENUMERATION('PEnum_SignalIndicatorType',(IFCLABEL('DEPARTUREINDICATOR'),IFCLABEL('DEPARTUREROUTEINDICATOR'),IFCLABEL('DERAILINDICATOR'),IFCLABEL('ROLLINGSTOCKSTOPINDICATOR'),IFCLABEL('ROUTEINDICATOR'),IFCLABEL('SHUNTINGINDICATOR'),IFCLABEL('SWITCHINDICATOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3880=IFCSIMPLEPROPERTYTEMPLATE('15hedHrO10yhufG_RFsPHf',$,'SignalFrameBackboardHeight','The nominal height of the signal frame backboard.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3881=IFCSIMPLEPROPERTYTEMPLATE('3Jt3V$oJ1EWgW2FpzbX1ac',$,'SignalFrameBackboardDiameter','The nominal diameter of the signal frame backboard.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3882=IFCPROPERTYSETTEMPLATE('2w6CjKY$rBVBgaZD1ortsV',$,'Pset_SignCommon','Common properties for Signs.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSign,IfcSignType',(#3883,#3884,#3885,#3886)); +#3883=IFCSIMPLEPROPERTYTEMPLATE('37gOvb2pL3fOOSxMww3WGI',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3884=IFCSIMPLEPROPERTYTEMPLATE('2wdfWX3Rz0jwcBWdrddxk8',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3885=IFCSIMPLEPROPERTYTEMPLATE('3qdSkpt05Epxez_yEMQ_xh',$,'Category','Designation of the category into which the actors in the population belong.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3886=IFCSIMPLEPROPERTYTEMPLATE('1qrgNNMvT9du9M$SDcHSJq',$,'TactileMarking','The kind of Tactile Marking of the element.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3887=IFCPROPERTYSETTEMPLATE('1TmUbMe0nC5gP4quF_JDt3',$,'Pset_SiteCommon','Properties common to the definition of all occurrences of IfcSite. Please note that several site attributes are handled directly at the IfcSite instance, the site number (or short name) by IfcSite.Name, the site name (or long name) by IfcSite.LongName, and the description (or comments) by IfcSite.Description. The land title number is also given as an explicit attribute IfcSite.LandTitleNumber. Actual site quantities, like site perimeter, site area and site volume are provided by IfcElementQuantity, and site classification according to national building code by IfcClassificationReference. The global positioning of the site in terms of Northing and Easting and height above sea level datum is given by IfcSite.RefLongitude, IfcSite.RefLatitude, IfcSite.RefElevation and the postal address by IfcSite.SiteAddress.',.PSET_OCCURRENCEDRIVEN.,'IfcSite',(#3888,#3889,#3890,#3891,#3892,#3893)); +#3888=IFCSIMPLEPROPERTYTEMPLATE('3mmXo0lfT4PRkcZHfVW8YY',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3889=IFCSIMPLEPROPERTYTEMPLATE('0wePUD1$f7owN_fdoQ0tye',$,'BuildableArea','The area of site utilization expressed as a maximum value according to local building codes.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3890=IFCSIMPLEPROPERTYTEMPLATE('0MZbSd3afE2fofQGI7tTMy',$,'SiteCoverageRatio','The ratio of the utilization, TotalArea / BuildableArea, expressed as a maximum value. The ratio value may be used to derive BuildableArea.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3891=IFCSIMPLEPROPERTYTEMPLATE('0mmSVsfFP9Ke6u_6p5Z0kr',$,'FloorAreaRatio','The ratio of all floor areas to the buildable area as the maximum floor area utilization of the site as a maximum value according to local building codes.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3892=IFCSIMPLEPROPERTYTEMPLATE('24whNwJ5X6NxL3BW8v6drC',$,'BuildingHeightLimit','Allowed maximum height of buildings on this site - according to local building codes.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3893=IFCSIMPLEPROPERTYTEMPLATE('1ZmUfjbBrCof$mq8CViXxP',$,'TotalArea','Total planned area for the site. Used for programming the site space.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3894=IFCPROPERTYSETTEMPLATE('1zn_spWH50xxM0qPNEvKSW',$,'Pset_SiteWeather','Properties for site weather',.PSET_OCCURRENCEDRIVEN.,'IfcSite',(#3895,#3896)); +#3895=IFCSIMPLEPROPERTYTEMPLATE('2BQ2BkcmLErwF2NJ3BNBHU',$,'MaxAmbientTemp','Maximum ambient temperature of the site used as a basis of design',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3896=IFCSIMPLEPROPERTYTEMPLATE('2Gx3sfTkHAe8WnFAQZ$9vt',$,'MinAmbientTemp','Minimum ambient temperature of the site used as a basis of design',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3897=IFCPROPERTYSETTEMPLATE('2U2r4G115BZAkpDWeMDUem',$,'Pset_SlabCommon','Properties common to the definition of all occurrences of IfcSlab. Note: Properties for PitchAngle added in IFC 2x3',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab,IfcSlabType',(#3898,#3899,#3901,#3902,#3903,#3904,#3905,#3906,#3907,#3908,#3909)); +#3898=IFCSIMPLEPROPERTYTEMPLATE('1s3nMy3YDEfezlORffP0Oc',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3899=IFCSIMPLEPROPERTYTEMPLATE('2Xi2gM5ojBXRwla3ru9gLr',$,'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',$,#3900,$,$,$,.READWRITE.); +#3900=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3901=IFCSIMPLEPROPERTYTEMPLATE('3Wctq1_mzDYQznpy9_MlFV',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3902=IFCSIMPLEPROPERTYTEMPLATE('3FRy9pHYj0muF6iTicXw_O',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3903=IFCSIMPLEPROPERTYTEMPLATE('030hWRZ8XDQBjO7MR2bpt9',$,'PitchAngle','Angle of the slab to the horizontal when used as a component for the roof (specified as 0 degrees or not asserted for cases where the slab is not used as a roof component).The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence. For geometry editing applications, like CAD: this value should be write-only.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#3904=IFCSIMPLEPROPERTYTEMPLATE('3YFw_steD44v_q2voYvqQ7',$,'Combustible','Indication whether the object is made from combustible material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3905=IFCSIMPLEPROPERTYTEMPLATE('1CJIMIT7n1Q9jh4igSQxMu',$,'SurfaceSpreadOfFlame','Indication on how the flames spread around the surface,\X2\000A\X0\It is given according to the national building code that governs the fire behaviour for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3906=IFCSIMPLEPROPERTYTEMPLATE('3LmOACfnf91wvNPHrHy1Nr',$,'Compartmentation','Indication whether the object is designed to serve as a fire compartmentation (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3907=IFCSIMPLEPROPERTYTEMPLATE('3QbpARRHH6kB1Ktn2Nr6ay',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3908=IFCSIMPLEPROPERTYTEMPLATE('36N1vd4aD4CeMZZOY7Ic8H',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#3909=IFCSIMPLEPROPERTYTEMPLATE('2Q2tD_iuz8yRNhWmmMg4Bl',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3910=IFCPROPERTYSETTEMPLATE('2ZyvpfQff5OPayse3y3bEF',$,'Pset_SlabTypeTrackSlab','Properties in this property set are generally applicable slabs used in railway tracks, modelled as IfcSlab with PredefinedType TRACKSLAB.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab/TRACKSLAB,IfcSlabType/TRACKSLAB',(#3911)); +#3911=IFCSIMPLEPROPERTYTEMPLATE('0agpnaBLr9fQqUgtlnl2YZ',$,'TechnicalStandard','The technical standard which the element should comply with.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#3912=IFCPROPERTYSETTEMPLATE('387wNjniL6TvtuJrJlINzJ',$,'Pset_SolarDeviceTypeCommon','Common properties for solar device types.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSolarDevice,IfcSolarDeviceType',(#3913,#3914)); +#3913=IFCSIMPLEPROPERTYTEMPLATE('1vdIqss0fCQPGtVx$Bs9UN',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3914=IFCSIMPLEPROPERTYTEMPLATE('1gRR_9nRv5TuBp9RlhLfoL',$,'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',$,#3915,$,$,$,.READWRITE.); +#3915=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3916=IFCPROPERTYSETTEMPLATE('3knZUmdLL0tfCnVXuZwiHk',$,'Pset_SolidStratumCapacity','Properties expressing the capacity of a stratum using physical measures. Regional and National conventions should be captured through classification and specific property sets.',.PSET_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum/SOLID',(#3917,#3918,#3919,#3920,#3921,#3922,#3923,#3924,#3925,#3926,#3927,#3928,#3929)); +#3917=IFCSIMPLEPROPERTYTEMPLATE('2qOIODd5TAAgKiyRnSAgv6',$,'CohesionBehaviour','Cohesive shear strength of a rock or soil that is independent of interparticle friction.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#3918=IFCSIMPLEPROPERTYTEMPLATE('01q0d8XrjDIhJPRdfMHaCu',$,'FrictionAngle','Friction angle is the tested inclination angle from horizontal.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#3919=IFCSIMPLEPROPERTYTEMPLATE('3OCLgh9lX91OTEavLN952i',$,'FrictionBehaviour','Friction shear strength of a rock or soil that is dependent on interparticle friction.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#3920=IFCSIMPLEPROPERTYTEMPLATE('1QdSaZ_HL0jPtFhYijMuOV',$,'GrainSize','Grain size diameter.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3921=IFCSIMPLEPROPERTYTEMPLATE('3uARgHNgX8ku4zcW1Ib7Qt',$,'HydraulicConductivity','Hydraulic Conductivity (permeability) of soil for water, given with the K or Kf value in m/s',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3922=IFCSIMPLEPROPERTYTEMPLATE('0Fp3Yes6P4uP0Y289gZX1S',$,'LoadBearingCapacity','Maximum load bearing capacity of the floor structure throughtout the storey as designed.',.P_SINGLEVALUE.,'IfcPlanarForceMeasure',$,$,$,$,$,.READWRITE.); +#3923=IFCSIMPLEPROPERTYTEMPLATE('0ZTxUs9P9DY8QusDCGphE0',$,'NValue','Blow count from standard penetration testing, to ISO 22476-3, ASTM D1586[1] and Australian Standards AS 1289.6.3.1, which correlates to other engineering properties of soils.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#3924=IFCSIMPLEPROPERTYTEMPLATE('3KJ_fvV1bAJgI9$uKO1RxI',$,'PermeabilityBehaviour','Proportionality constant in Darcy''s law which relates flow rate and viscosity to a pressure gradient applied to the porous media.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3925=IFCSIMPLEPROPERTYTEMPLATE('3sQ3OBp4z1DA0oUBXuCx30',$,'PoisonsRatio','Ratio of transverse contraction strain to longitudinal extension strain in the direction of stretching force.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#3926=IFCSIMPLEPROPERTYTEMPLATE('1g9zn7CVnCL9Nw3NeOgXo8',$,'PwaveVelocity','P-wave velocity of a rock or soil.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3927=IFCSIMPLEPROPERTYTEMPLATE('1Cl2fGy9T729vhR1lA4ZSe',$,'Resistivity','Electrical resistivity of a rock or soil (Ohm-m).',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#3928=IFCSIMPLEPROPERTYTEMPLATE('0qvscusHD3zfS6yh3J1per',$,'SettlementBehaviour','Estimate of the settlement/compaction behaviour of the stratum.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#3929=IFCSIMPLEPROPERTYTEMPLATE('0__tpYtfvALRJ8cGt7yJLb',$,'SwaveVelocity','S-wave velocity of a rock or soil.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#3930=IFCPROPERTYSETTEMPLATE('26nNqT6f1B_ezO5pSXCIiE',$,'Pset_SolidStratumComposition','Properties expressing the composition of a stratum using volume measures, implementing ISO14688 Part 2 Table 1 Primary fractions and composite fractions. Regional and National conventions should be captured through classification and specific property sets. Zero values may be omitted.',.PSET_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum/SOLID',(#3931,#3932,#3933,#3934,#3935,#3936,#3937,#3938,#3939,#3940,#3941,#3942,#3943)); +#3931=IFCSIMPLEPROPERTYTEMPLATE('2qPCfbdDX4pej2veL0r8GI',$,'AirVolume','Relative volume of air stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3932=IFCSIMPLEPROPERTYTEMPLATE('3mv1u41TvDSRK8MABlZ723',$,'BouldersVolume','Relative volume of boulders (typically larger than 200mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3933=IFCSIMPLEPROPERTYTEMPLATE('0dK59KnfbA2wF4x$qtpxKR',$,'ClayVolume','Relative volume of clay (typically smaller than 0.002mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3934=IFCSIMPLEPROPERTYTEMPLATE('1Ky5J9JjDCr9DZ5kTo7BN_',$,'CobblesVolume','Relative volume of cobbles (typically larger than 63mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3935=IFCSIMPLEPROPERTYTEMPLATE('1ZCclT6yT3fgPa6b1USLLu',$,'ContaminantVolume','Relative volume of contaminant stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3936=IFCSIMPLEPROPERTYTEMPLATE('0N9juzaW18cxCNlFm0i9_0',$,'FillVolume','Relative volume of fill (controlled placement of anthropogenic soil) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3937=IFCSIMPLEPROPERTYTEMPLATE('0RqCSdDUXDIeOxaDD9Zqti',$,'GravelVolume','Relative volume of gravel (typically larger than 2mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3938=IFCSIMPLEPROPERTYTEMPLATE('2pZZMfiHXFMOY5SoV3DNN5',$,'OrganicVolume','Relative volume of organic (peat/humus) stratum constituents especially soil.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3939=IFCSIMPLEPROPERTYTEMPLATE('1CoPxB1m5BxO_UaRbmTr52',$,'RockVolume','Relative volume of rock stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3940=IFCSIMPLEPROPERTYTEMPLATE('3IpfZAGor4MgbjyLT17w5F',$,'SandVolume','Relative volume of sand (typically smaller than 2mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3941=IFCSIMPLEPROPERTYTEMPLATE('08zQfPLmTCDuhG_eyw1UiJ',$,'SiltVolume','Relative volume of silt (typically smaller than 0.063mm) stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3942=IFCSIMPLEPROPERTYTEMPLATE('1GXq8BvZb5AgPdwOzjUkRV',$,'WaterVolume','Relative volume of water stratum constituents.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#3943=IFCSIMPLEPROPERTYTEMPLATE('0LH7aRhQTC98suauop523p',$,'CompositeFractions','Denomination into soil groups by composite fractions',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3944,$,$,$,.READWRITE.); +#3944=IFCPROPERTYENUMERATION('PEnum_SoilCompositeFractions',(IFCLABEL('BOULDERS'),IFCLABEL('BOULDERS_WITH_COBBLES'),IFCLABEL('BOULDERS_WITH_FINER_SOILS'),IFCLABEL('CLAY'),IFCLABEL('CLAYEY_SILT'),IFCLABEL('COBBLES'),IFCLABEL('COBBLES_WITH_BOULDERS'),IFCLABEL('COBBLES_WITH_FINER_SOILS'),IFCLABEL('FILL'),IFCLABEL('GRAVEL'),IFCLABEL('GRAVELLY_SAND'),IFCLABEL('GRAVEL_WITH_CLAY_OR_SILT'),IFCLABEL('GRAVEL_WITH_COBBLES'),IFCLABEL('ORGANIC_CLAY'),IFCLABEL('ORGANIC_SILT'),IFCLABEL('SAND'),IFCLABEL('SANDY_CLAYEY_SILT'),IFCLABEL('SANDY_GRAVEL'),IFCLABEL('SANDY_GRAVELLY_CLAY'),IFCLABEL('SANDY_GRAVELLY_SILT'),IFCLABEL('SANDY_GRAVEL_WITH_COBBLES'),IFCLABEL('SANDY_PEAT'),IFCLABEL('SANDY_SILT'),IFCLABEL('SAND_WITH_CLAY_AND_SILT'),IFCLABEL('SILT'),IFCLABEL('SILTY_CLAY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#3945=IFCPROPERTYSETTEMPLATE('1w3EnC9U98IhyCurpo9Gjl',$,'Pset_SoundAttenuation','Common definition to capture sound pressure at a point on behalf of a device typically used within the context of building services and flow distribution systems. To indicate sound values from an instance of IfcDistributionFlowElement at a particular location, IfcAnnotation instance(s) should be assigned to the IfcDistributionFlowElement through the IfcRelAssignsToProduct relationship. The IfcAnnotation should specify ObjectType of ''Sound'' and geometric representation of ''Annotation Point'' consisting of a single IfcPoint subtype as described at IfcAnnotation. This property set is instantiated multiple times on an object for each frequency band. HISTORY: New property set in IFC Release 2x4.',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation',(#3946,#3948,#3949)); +#3946=IFCSIMPLEPROPERTYTEMPLATE('2HXySL$9n86wslbbiHSFEP',$,'SoundScale','The reference sound scale.DBA: Decibels in an A-weighted scale\X2\000A\X0\DBB: Decibels in an B-weighted scale\X2\000A\X0\DBC: Decibels in an C-weighted scale\X2\000A\X0\NC: Noise criteria\X2\000A\X0\NR: Noise rating',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3947,$,$,$,.READWRITE.); +#3947=IFCPROPERTYENUMERATION('PEnum_SoundScale',(IFCLABEL('DBA'),IFCLABEL('DBB'),IFCLABEL('DBC'),IFCLABEL('NC'),IFCLABEL('NR')),$); +#3948=IFCSIMPLEPROPERTYTEMPLATE('28cGZ0WWv2C9W2KmHPYySZ',$,'SoundFrequency','List of nominal sound frequencies, correlated to the SoundPressure time series values (IfcTimeSeries.ListValues)',.P_LISTVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#3949=IFCSIMPLEPROPERTYTEMPLATE('1I38XsWH5FMhHSCk9i2$R4',$,'SoundPressure','A time series of sound pressure values measured in decibels at a reference pressure of 20 microPascals for the referenced octave band frequency. Each value in IfcTimeSeries.ListValues is correlated to the sound frequency at the same position within SoundFrequencies.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3950=IFCPROPERTYSETTEMPLATE('11r3A0JOz4PvyfpN0YAJei',$,'Pset_SoundGeneration','Common definition to capture the properties of sound typically used within the context of building services and flow distribution systems. This property set is instantiated multiple times on an object for each frequency band. HISTORY: New property set in IFC Release 2x4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDistributionFlowElement,IfcDistributionFlowElementType',(#3951)); +#3951=IFCSIMPLEPROPERTYTEMPLATE('1koZcI0fLFIOjq2Ee4Rahh',$,'SoundCurve','Sound curve.\X2\000A000A\X0\Table of sound frequencies and sound power measured in decibels at a reference power of 1 picowatt(10\\^(-12) watt) for the referenced octave band frequency.',.P_TABLEVALUE.,'IfcFrequencyMeasure','IfcSoundPowerMeasure',$,$,$,$,.READWRITE.); +#3952=IFCPROPERTYSETTEMPLATE('0KvplqeQr7$xRlEOedW0q5',$,'Pset_SpaceAirHandlingDimensioning','Properties for Space AirHandling Dimensioning.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialElementType',(#3953,#3954,#3955,#3956,#3957,#3958,#3959,#3960,#3961,#3962,#3963,#3964,#3965)); +#3953=IFCSIMPLEPROPERTYTEMPLATE('2UaQFiGOHCGwnnhsBMJQHX',$,'CoolingDesignAirFlow','The air flowrate required during the peak cooling conditions.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#3954=IFCSIMPLEPROPERTYTEMPLATE('3Sdyepmzz3uRImIZokjEDE',$,'HeatingDesignAirFlow','The air flowrate required during the peak heating conditions, but could also be determined by minimum ventilation requirement or minimum air change requirements.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#3955=IFCSIMPLEPROPERTYTEMPLATE('1iqUWXJCL6Dx9QbTgqbHXX',$,'SensibleHeatGain','The sensible heat or energy gained by the space during the peak conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#3956=IFCSIMPLEPROPERTYTEMPLATE('08lbmRMMz6FfkswB5kUqp_',$,'TotalHeatGain','The total (sensible+latent) amount of heat or energy gained by the space at the time of the space''s peak cooling conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#3957=IFCSIMPLEPROPERTYTEMPLATE('2NCSlxcmH9Zg8x3Dae7Isk',$,'TotalHeatLoss','The total amount of heat or energy lost by the space at the time of the space''s peak heating conditions.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#3958=IFCSIMPLEPROPERTYTEMPLATE('1TGINQE212wRXrOFYVZrUw',$,'CoolingDryBulb','Dry bulb temperature, usually for for cooling design.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3959=IFCSIMPLEPROPERTYTEMPLATE('0YD5vmXoL94A_A1d8GFJ0O',$,'CoolingRelativeHumidity','Inside relative humidity for cooling design.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3960=IFCSIMPLEPROPERTYTEMPLATE('1OMpfaMOTCUeedteFMnmJh',$,'HeatingDryBulb','Dry bulb temperature for heating design.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#3961=IFCSIMPLEPROPERTYTEMPLATE('01djp6fnn3Nu1LIIcBvXXw',$,'HeatingRelativeHumidity','Inside relative humidity for heating design.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#3962=IFCSIMPLEPROPERTYTEMPLATE('3nmg2PoSbAAAmxWIo4vY10',$,'VentilationDesignAirFlow','Ventilation outside air requirement for the space.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#3963=IFCSIMPLEPROPERTYTEMPLATE('1BMN$Inuz9BPoF7wenhv_R',$,'DesignAirFlow','Design air flow rate for the space.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#3964=IFCSIMPLEPROPERTYTEMPLATE('2DFIPrvd5CShtMkG3Zx6Yo',$,'CeilingRAPlenum','Ceiling plenum used for return air or not. TRUE = Yes, FALSE = No.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3965=IFCSIMPLEPROPERTYTEMPLATE('3NrlmnpP58LgXwxJgrDtOY',$,'BoundaryAreaHeatLoss','Heat loss per unit area for the boundary object. This is a design input value for use in the absence of calculated load data.',.P_SINGLEVALUE.,'IfcHeatFluxDensityMeasure',$,$,$,$,$,.READWRITE.); +#3966=IFCPROPERTYSETTEMPLATE('14LYs5HVr7Iv97WL43p8aq',$,'Pset_SpaceCommon','Properties common to the definition of all occurrences of IfcSpace. Please note that several space attributes are handled directly at the IfcSpace instance, the space number (or short name) by IfcSpace.Name, the space name (or long name) by IfcSpace.LongName, and the description (or comments) by IfcSpace.Description. Actual space quantities, like space perimeter, space area and space volume are provided by IfcElementQuantity, and space classification according to national building code by IfcClassificationReference. The level above zero (relative to the building) for the slab row construction is provided by the IfcBuildingStorey.Elevation, the level above zero (relative to the building) for the floor finish is provided by the IfcSpace.ElevationWithFlooring.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialElementType',(#3967,#3968,#3969,#3970,#3971,#3972)); +#3967=IFCSIMPLEPROPERTYTEMPLATE('0b978MxaXCxvSgYFdIx_iP',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#3968=IFCSIMPLEPROPERTYTEMPLATE('0KcPbPOM9CmQSS2kKl5rJo',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3969=IFCSIMPLEPROPERTYTEMPLATE('2U5sZ7fkD28u917p3cGbNJ',$,'GrossPlannedArea','Total planned gross area of the spatial structure element. Used for programming the spatial structure element.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3970=IFCSIMPLEPROPERTYTEMPLATE('0SER8Kydn0xx_C7xpq0i73',$,'NetPlannedArea','Total planned net area of the object. Used for programming the object.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#3971=IFCSIMPLEPROPERTYTEMPLATE('2L6E2zVfv32AE1GB4Zko7k',$,'PubliclyAccessible','Indication whether this space (in case of e.g., a toilet) is designed to serve as a publicly accessible space, e.g., for a public toilet (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3972=IFCSIMPLEPROPERTYTEMPLATE('3Vf3HNUJf4Du3VhrAGhC6H',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. Set to (TRUE) if this object is rated as handicap accessible according to the local building codes, otherwise (FALSE). It is giving according to the requirements of the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3973=IFCPROPERTYSETTEMPLATE('3z88d7dcD2Oem$py9Gh0Tv',$,'Pset_SpaceCoveringRequirements','Properties common to the definition of covering requirements of IfcSpace. Those properties define the requirements coming from a space program in early project phases and can later be used to define the room book information, if such coverings are not modeled explicitly as covering elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialElementType',(#3974,#3975,#3976,#3977,#3978,#3979,#3980,#3981,#3982,#3983,#3984,#3985,#3986,#3987)); +#3974=IFCSIMPLEPROPERTYTEMPLATE('04KfPkxrD3FubSPNVkKlmZ',$,'FloorCovering','Label to indicate the material or finish of the space flooring. The label is used for room book information and often displayed in room stamp.The material information is provided in absence of an IfcCovering (type=FLOORING) object with own shape representation and material assignment. In case of inconsistency the material assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3975=IFCSIMPLEPROPERTYTEMPLATE('2VS0E0EXH0FQ$GHOzOUNLF',$,'FloorCoveringThickness','Thickness of the material layer(s) for the space flooring.The thickness information is provided in absence of an IfcCovering (type=FLOORING) object with own shape representation. In cases of inconsistency between the geometric parameters of an assigned IfcCovering and this attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3976=IFCSIMPLEPROPERTYTEMPLATE('11wA0iX9PBegeMPv8$HWqo',$,'WallCovering','Label to indicate the material or finish of the space cladding. The label is used for room book information and often displayed in room stamp.The material information is provided in absence of an IfcCovering (type=CLADDING) object with own shape representation and material assignment. In case of inconsistency the material assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3977=IFCSIMPLEPROPERTYTEMPLATE('0XCiBhuL58dOWuUxBNUePD',$,'WallCoveringThickness','Thickness of the material layer(s) for the space cladding.The thickness information is provided in absence of an IfcCovering (type=CLADDING) object with own shape representation. In cases of inconsistency between the geometric parameters of an assigned IfcCovering and this attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3978=IFCSIMPLEPROPERTYTEMPLATE('1Hizljlu10ZeADfkNJqxsD',$,'CeilingCovering','Label to indicate the material or finish of the space ceiling. The label is used for room book information and often displayed in room stamp.The material information is provided in absence of an IfcCovering (type=CEILING) object with own shape representation and material assignment. In case of inconsistency the material assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3979=IFCSIMPLEPROPERTYTEMPLATE('1pYC_iRBP0nuVFCJdtAM49',$,'CeilingCoveringThickness','Thickness of the material layer(s) for the space ceiling.The thickness information is provided in absence of an IfcCovering (type=CEILING) object with own shape representation. In cases of inconsistency between the geometric parameters of an assigned IfcCovering and this attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3980=IFCSIMPLEPROPERTYTEMPLATE('0qr9aH849AVvQYntN$xv3z',$,'SkirtingBoard','Label to indicate the material or construction of the skirting board around the space flooring. The label is used for room book information.The material information is provided in absence of an IfcCovering (type=SKIRTINGBOARD) object with own shape representation and material assignment. In case of inconsistency the material assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3981=IFCSIMPLEPROPERTYTEMPLATE('0ETvTf1ZLFAvDXeS2dALUp',$,'SkirtingBoardHeight','Height of the skirting board.The height information is provided in absence of an IfcCovering (type=SKIRTINGBOARD) object with own shape representation and material assignment. In case of inconsistency the height assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3982=IFCSIMPLEPROPERTYTEMPLATE('2gNA4M9Qf4ufOCZwnH0qQx',$,'Molding','Label to indicate the material or construction of the molding around the space ceiling. The label is used for room book information.The material information is provided in absence of an IfcCovering (type=MOLDING) object with own shape representation and material assignment. In case of inconsistency the material assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3983=IFCSIMPLEPROPERTYTEMPLATE('1CwXI$rpjFvge6qofglcPe',$,'MoldingHeight','Height of the molding.The height information is provided in absence of an IfcCovering (type=MOLDING) object with own shape representation and material assignment. In case of inconsistency the height assigned to IfcCovering elements takes precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#3984=IFCSIMPLEPROPERTYTEMPLATE('3j83J7KDjAC8Pi306TJ4rR',$,'ConcealedFlooring','Indication whether this space is designed to have a concealed flooring space (TRUE) or not (FALSE). A concealed flooring space is normally meant to be the space beneath a raised floor.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3985=IFCSIMPLEPROPERTYTEMPLATE('2Lp5dKghX1pvU$JbgKVfKO',$,'ConcealedFlooringOffset','Distance between the floor slab and the floor covering, often used for cables and other installations. Often referred to as raised flooring.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3986=IFCSIMPLEPROPERTYTEMPLATE('1ACIU87CDExgei3wUb06v9',$,'ConcealedCeiling','Indication whether this space is designed to have a concealed flooring space (TRUE) or not (FALSE). A concealed ceiling space is normally meant to be the space between a slab and a ceiling.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3987=IFCSIMPLEPROPERTYTEMPLATE('1ypzIlvqb9JOLxy_t4yuul',$,'ConcealedCeilingOffset','Distance between the upper floor slab and the suspended ceiling, often used for distribution systems. Often referred to as plenum.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#3988=IFCPROPERTYSETTEMPLATE('2VtFYWrOz8IfFzwLOw9liE',$,'Pset_SpaceFireSafetyRequirements','Properties related to fire protection of spaces that apply to the occurrences of IfcSpace or IfcZone.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialZone,IfcZone,IfcSpatialElementType,IfcSpatialZoneType',(#3989,#3990,#3991,#3992,#3993,#3994)); +#3989=IFCSIMPLEPROPERTYTEMPLATE('2BZFzJOBz3wuAHrGubQow8',$,'FireRiskFactor','Fire Risk factor assigned to the space according to local building regulations. It defines the fire risk of the space at several levels of fire hazard.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#3990=IFCSIMPLEPROPERTYTEMPLATE('2OGT2jxnX6jAA087CW6pnQ',$,'FlammableStorage','Indication whether the space is intended to serve as a storage of flammable material (which is regarded as such by the presiding building code. (TRUE) indicates yes, (FALSE) otherwise.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3991=IFCSIMPLEPROPERTYTEMPLATE('0C5I9Uc79DtObDrgsR_QSz',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here whether the space (in case of e.g., a corridor) is designed to serve as an exit space, e.g., for fire escape purposes.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3992=IFCSIMPLEPROPERTYTEMPLATE('0TPJyTa8f0Q9MPW$GaZD66',$,'SprinklerProtection','Indication whether this object is sprinkler protected (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3993=IFCSIMPLEPROPERTYTEMPLATE('0rxW5nsPT7nvkqexG_U6vf',$,'SprinklerProtectionAutomatic','Indication whether this object has an automatic sprinkler protection (TRUE) or not (FALSE).\X2\000A\X0\It should only be given, if the property "SprinklerProtection" is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3994=IFCSIMPLEPROPERTYTEMPLATE('1$rYoBcPjFj9i5pi7wXR2J',$,'AirPressurization','Indication whether the space is required to have pressurized air (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#3995=IFCPROPERTYSETTEMPLATE('0PVgGw2w15meTZEFQn81Ie',$,'Pset_SpaceHeaterPHistory','Space heater performance history common attributes.',.PSET_PERFORMANCEDRIVEN.,'IfcSpaceHeater',(#3996,#3997,#3998,#3999,#4000,#4001,#4002,#4003,#4004,#4005,#4006,#4007)); +#3996=IFCSIMPLEPROPERTYTEMPLATE('2_VJI4Nlj00OrQyJGzdr73',$,'FractionRadiantHeatTransfer','Fraction of the total heat transfer rate as the radiant heat transfer.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3997=IFCSIMPLEPROPERTYTEMPLATE('22TrinrcPE2BBKlOUtwgla',$,'FractionConvectiveHeatTransfer','Fraction of the total heat transfer rate as the convective heat transfer.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3998=IFCSIMPLEPROPERTYTEMPLATE('3DUrAq$ITCLf5HliCI6hqg',$,'Effectiveness','Effectiveness, represented as ratio.\X2\000A000A\X0\Ratio of the real heat transfer rate to the maximum possible heat transfer rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#3999=IFCSIMPLEPROPERTYTEMPLATE('2MXlG_g5zESx_nRd0mKvsM',$,'SurfaceTemperature','Average surface temperature of the component.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4000=IFCSIMPLEPROPERTYTEMPLATE('2$1dyTOUr2H923mEIOS715',$,'SpaceAirTemperature','Dry bulb temperature in the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4001=IFCSIMPLEPROPERTYTEMPLATE('1KEB9LxeHFBPheCp9h8pW5',$,'SpaceMeanRadiantTemperature','Mean radiant temperature in the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4002=IFCSIMPLEPROPERTYTEMPLATE('01B76AupD2uQRm8NwPDcrj',$,'AuxiliaryEnergySourceConsumption','Auxiliary energy source consumption.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4003=IFCSIMPLEPROPERTYTEMPLATE('0230xq_dT9IA2mkeQX_zW5',$,'UACurve','UA value.\X2\000A000A\X0\As a function of ambient temperature and surface temperature; UA = f (Tambient, Tsurface)',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4004=IFCSIMPLEPROPERTYTEMPLATE('0JOb9a0dP5AQJE1pOqCQcM',$,'OutputCapacityCurve','Partial output capacity curve (as a function of water temperature); Q = f (Twater).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4005=IFCSIMPLEPROPERTYTEMPLATE('3vZwIIMw1Erg1TWlwF8K6P',$,'AirResistanceCurve','Air resistance curve (w/ fan only); Pressure = f ( flow rate).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4006=IFCSIMPLEPROPERTYTEMPLATE('27jYoWl8XDYfVGWWelvjF9',$,'CharacteristicExponent','Characteristic exponent, slope of log(heat output) vs log (surface temperature minus environmental temperature).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4007=IFCSIMPLEPROPERTYTEMPLATE('0ztFMT1RP04Pa2iBRj07_n',$,'HeatOutputRate','Overall heat transfer rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4008=IFCPROPERTYSETTEMPLATE('1U8Jfz3zr5SxYGxUhu1tD0',$,'Pset_SpaceHeaterTypeCommon','Space heater type common attributes.\X2\000A\X0\SoundLevel attribute deleted in IFC2x2 Pset Addendum: Use IfcSoundProperties instead. Properties added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpaceHeater,IfcSpaceHeaterType',(#4009,#4010,#4012,#4014,#4016,#4018,#4020,#4022,#4023,#4024,#4025,#4026,#4027)); +#4009=IFCSIMPLEPROPERTYTEMPLATE('0bjNU2EUL6mviNEmnbbsGD',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4010=IFCSIMPLEPROPERTYTEMPLATE('0qXvPDGw94_Bo0$BjMQhHB',$,'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',$,#4011,$,$,$,.READWRITE.); +#4011=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4012=IFCSIMPLEPROPERTYTEMPLATE('2TlciMCTb3OePlpBRgc7rJ',$,'SpaceHeaterPlacement','Indicates how the space heater is designed to be placed.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4013,$,$,$,.READWRITE.); +#4013=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterPlacementType',(IFCLABEL('BASEBOARD'),IFCLABEL('SUSPENDED'),IFCLABEL('TOWELWARMER'),IFCLABEL('WALL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4014=IFCSIMPLEPROPERTYTEMPLATE('3JGJQfLFb27A8TGwYoen5K',$,'TemperatureClassification','Enumeration defining the temperature classification of the space heater surface temperature.\X2\000A\X0\low temperature - surface temperature is relatively low, usually heated by hot water or electricity.\X2\000A\X0\high temperature - surface temperature is relatively high, usually heated by gas or steam.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4015,$,$,$,.READWRITE.); +#4015=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterTemperatureClassification',(IFCLABEL('HIGHTEMPERATURE'),IFCLABEL('LOWTEMPERATURE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4016=IFCSIMPLEPROPERTYTEMPLATE('2uFgXGLqjFW8UGpMOvxP1d',$,'HeatTransferDimension','Indicates how heat is transmitted according to the shape of the space heater.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4017,$,$,$,.READWRITE.); +#4017=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterHeatTransferDimension',(IFCLABEL('PATH'),IFCLABEL('POINT'),IFCLABEL('SURFACE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4018=IFCSIMPLEPROPERTYTEMPLATE('0mPfjnqur2XuKWUNhDs8pY',$,'HeatTransferMedium','Enumeration defining the heat transfer medium if applicable.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4019,$,$,$,.READWRITE.); +#4019=IFCPROPERTYENUMERATION('PEnum_HeatTransferMedium',(IFCLABEL('STEAM'),IFCLABEL('WATER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4020=IFCSIMPLEPROPERTYTEMPLATE('3FSYtd5c50svRt5LT9qgeZ',$,'EnergySource','Enumeration defining the energy source or fuel cumbusted.\X2\000A000A\X0\Note: hydronic heaters shall use UNSET; dual-use hydronic/electric heaters shall use ELECTRICITY.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4021,$,$,$,.READWRITE.); +#4021=IFCPROPERTYENUMERATION('PEnum_EnergySource',(IFCLABEL('COAL'),IFCLABEL('COAL_PULVERIZED'),IFCLABEL('ELECTRICITY'),IFCLABEL('GAS'),IFCLABEL('OIL'),IFCLABEL('PROPANE'),IFCLABEL('WOOD'),IFCLABEL('WOOD_CHIP'),IFCLABEL('WOOD_PELLET'),IFCLABEL('WOOD_PULVERIZED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4022=IFCSIMPLEPROPERTYTEMPLATE('2pKxsJtQHCGRMyLG9e1YOG',$,'BodyMass','Overall body mass of the heater.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#4023=IFCSIMPLEPROPERTYTEMPLATE('06U5obDGr2iv53NEBIQAMf',$,'ThermalMassHeatCapacity','Product of component mass and specific heat.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#4024=IFCSIMPLEPROPERTYTEMPLATE('1R8jH_QNf1HxfiDIbOVsM8',$,'OutputCapacity','Total nominal heat output as listed by the manufacturer.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4025=IFCSIMPLEPROPERTYTEMPLATE('07ijl3AVf498u8ykrk$89n',$,'ThermalEfficiency','Overall Thermal Efficiency is defined as gross energy output of the heat transfer device divided by the energy input.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#4026=IFCSIMPLEPROPERTYTEMPLATE('2sd$UMR6LAFgEddlm74jTe',$,'NumberOfPanels','Number of panels.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4027=IFCSIMPLEPROPERTYTEMPLATE('1hqHiA73v3OxMrtrveKYPK',$,'NumberOfSections','Number of sections.\X2\000A000A\X0\Number of vertical sections, measured in the direction of flow.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4028=IFCPROPERTYSETTEMPLATE('0dCoF$NrP36Af$rC8XnMMe',$,'Pset_SpaceHeaterTypeConvector','Space heater type convector attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpaceHeater/CONVECTOR,IfcSpaceHeaterType/CONVECTOR',(#4029)); +#4029=IFCSIMPLEPROPERTYTEMPLATE('2icAKDClD82AFdhqN1Pnrb',$,'ConvectorType','Indicates the type of convector, whether forced air (mechanically driven) or natural (gravity).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4030,$,$,$,.READWRITE.); +#4030=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterConvectorType',(IFCLABEL('FORCED'),IFCLABEL('NATURAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4031=IFCPROPERTYSETTEMPLATE('1ENa5mKjT2Xu4FLQYur6JE',$,'Pset_SpaceHeaterTypeRadiator','Space heater type radiator attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpaceHeater/RADIATOR,IfcSpaceHeaterType/RADIATOR',(#4032,#4034,#4035)); +#4032=IFCSIMPLEPROPERTYTEMPLATE('2yxq8_Vfn8ze37wa0mGOkE',$,'RadiatorType','Indicates the type of radiator.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4033,$,$,$,.READWRITE.); +#4033=IFCPROPERTYENUMERATION('PEnum_SpaceHeaterRadiatorType',(IFCLABEL('FINNEDTUBE'),IFCLABEL('PANEL'),IFCLABEL('SECTIONAL'),IFCLABEL('TUBULAR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4034=IFCSIMPLEPROPERTYTEMPLATE('1CIznUL0n6p85btviZ2ohB',$,'TubingLength','Water tube length inside the component.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4035=IFCSIMPLEPROPERTYTEMPLATE('0rdzxaeYL9_QcLpj96T26d',$,'WaterContent','Weight of water content within the heater.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#4036=IFCPROPERTYSETTEMPLATE('1JOit5DSfFt81NoG5WC8ze',$,'Pset_SpaceHVACDesign','Properties for HVAC requirements for spaces.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialZone,IfcZone,IfcSpatialElementType,IfcSpatialZoneType',(#4037,#4038,#4039,#4040,#4041,#4042,#4043,#4044,#4045,#4046,#4047,#4048,#4049,#4050,#4051,#4052,#4053,#4054,#4055,#4056)); +#4037=IFCSIMPLEPROPERTYTEMPLATE('213SMyX5D9NRv92r7Ne590',$,'TemperatureSetPoint','The temperature setpoint range and default setpoint.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4038=IFCSIMPLEPROPERTYTEMPLATE('3NUnrtgi9389VNB6vOuRgy',$,'TemperatureMax','Maximal temperature of the space or zone, that is required from user/designer view point. If no summer or winter space temperature requirements are given, it applies all year, otherwise for the intermediate period.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4039=IFCSIMPLEPROPERTYTEMPLATE('09mmRumxz9OPG_pewSU_sO',$,'TemperatureMin','Minimal temperature of the space or zone, that is required from user/designer view point. If no summer or winter space temperature requirements are given, it applies all year, otherwise for the intermediate period.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4040=IFCSIMPLEPROPERTYTEMPLATE('0P$tx4H0L6IfpaLN4JSp_H',$,'TemperatureSummerMax','Maximal temperature of the space or zone for the hot (summer) period, that is required from user/designer view point and provided as requirement for cooling.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4041=IFCSIMPLEPROPERTYTEMPLATE('3kfdd0zWr7TOS8p8Lpzv6O',$,'TemperatureSummerMin','Minimal temperature of the space or zone for the hot (summer) period, that is required from user/designer view point and provided as requirement for cooling.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4042=IFCSIMPLEPROPERTYTEMPLATE('15xiX_QEr7mRT5SYGpf7rp',$,'TemperatureWinterMax','Maximal temperature of the space or zone for the cold (winter) period, that is required from user/designer view point and provided as requirement for heating.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4043=IFCSIMPLEPROPERTYTEMPLATE('20scoWgPX0OAt4oK84pZUd',$,'TemperatureWinterMin','Minimal temperature of the space or zone for the cold (winter) period, that is required from user/designer view point and provided as requirement for heating.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4044=IFCSIMPLEPROPERTYTEMPLATE('0yUseqgSj4YgNyLzinGU$U',$,'HumiditySetPoint','Humidity of the space or zone that is required from user/designer view point. If no summer or winter space humidity requirements are given, it applies all year, otherwise for the intermediate period. Provide this property, if no humidity range (Min-Max) is available.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4045=IFCSIMPLEPROPERTYTEMPLATE('1BvPuUcXj9nfgtKBMGs2Un',$,'HumidityMax','Maximal permitted humidity of the space or zone that is required from user/designer view point. If no summer or winter space humidity requirements are given, it applies all year, otherwise for the intermediate period.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4046=IFCSIMPLEPROPERTYTEMPLATE('0C3IcnaEX3yvQ8ujNLVp4h',$,'HumidityMin','Minimal permitted humidity of the space or zone that is required from user/designer view point. If no summer or winter space humidity requirements are given, it applies all year, otherwise for the intermediate period.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4047=IFCSIMPLEPROPERTYTEMPLATE('3Pn$EYb2f1YBURdrb7C2z3',$,'HumiditySummer','Humidity of the space or zone for the hot (summer) period, that is required from user/designer view point and provided as requirement for cooling.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4048=IFCSIMPLEPROPERTYTEMPLATE('3psSPg2hT9Q8twRf2lPdrw',$,'HumidityWinter','Humidity of the space or zone for the cold (winter) period that is required from user/designer view point and provided as requirement for heating.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4049=IFCSIMPLEPROPERTYTEMPLATE('1A$mSCV91BqhFhKK_X45YA',$,'DiscontinuedHeating','Indication whether discontinued heating is required/desirable from user/designer view point. (TRUE) if yes, (FALSE) otherwise.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4050=IFCSIMPLEPROPERTYTEMPLATE('1YRGI$0CLAV8oaW$7ZR86v',$,'NaturalVentilation','Indication whether the space is required to have natural ventilation (TRUE), or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4051=IFCSIMPLEPROPERTYTEMPLATE('1_CnGzpRLFNA$COAgDIq1H',$,'NaturalVentilationRate','Indication of the requirement of a particular natural air ventilation rate, given in air changes per hour.',.P_SINGLEVALUE.,'IfcNumericMeasure',$,$,$,$,$,.READWRITE.); +#4052=IFCSIMPLEPROPERTYTEMPLATE('3ZZopGz2TFewCiaStlBgpS',$,'MechanicalVentilation','Indication whether the space is required to have mechanical ventilation (TRUE), or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4053=IFCSIMPLEPROPERTYTEMPLATE('2VxPnrlEHDZPDwMe_60lrk',$,'MechanicalVentilationRate','Indication of the requirement of a particular mechanical air ventilation rate, given in air changes per hour.',.P_SINGLEVALUE.,'IfcNumericMeasure',$,$,$,$,$,.READWRITE.); +#4054=IFCSIMPLEPROPERTYTEMPLATE('1l9RUNYgTBROGL75kNyt2f',$,'AirConditioning','Indication whether this space requires air conditioning provided (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4055=IFCSIMPLEPROPERTYTEMPLATE('1TRoz92Zz2SPHsv3$b4wUe',$,'AirConditioningCentral','Indication whether the space requires a central air conditioning provided (TRUE) or not (FALSE).\X2\000A\X0\It should only be given, if the property "AirConditioning" is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4056=IFCSIMPLEPROPERTYTEMPLATE('3PG1T3GNX6ufol7j8nT11G',$,'AirHandlingName','The name of the air side system.IfcRelServicesBuildings should be used to reference the correct AirHandlingSystem (IfcSystem)',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4057=IFCPROPERTYSETTEMPLATE('3FCGzzQmXA_9RMmc9H6XzV',$,'Pset_SpaceLightingDesign','Properties for requirements on Lighting of spaces.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialZone,IfcZone,IfcSpatialElementType,IfcSpatialZoneType',(#4058,#4059)); +#4058=IFCSIMPLEPROPERTYTEMPLATE('2o3jBwZHP4_eBpbyJUeiVR',$,'ArtificialLighting','Indication whether this space requires artificial lighting (as natural lighting would be not sufficient). (TRUE) indicates yes (FALSE) otherwise.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4059=IFCSIMPLEPROPERTYTEMPLATE('07sFGQtbL2ABnbMlwSNLrz',$,'Illuminance','Required average illuminance value for this space.',.P_SINGLEVALUE.,'IfcIlluminanceMeasure',$,$,$,$,$,.READWRITE.); +#4060=IFCPROPERTYSETTEMPLATE('28Uc_Y4x58WBm8HP7LOUYx',$,'Pset_SpaceOccupancyRequirements','Properties concerning work activities occurring or expected to occur within one or a set of similar spatial structure elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialZone,IfcZone,IfcSpatialElementType,IfcSpatialZoneType',(#4061,#4062,#4063,#4064,#4065,#4066,#4067)); +#4061=IFCSIMPLEPROPERTYTEMPLATE('3cYDqHDAL6PvciC_hUbhNU',$,'OccupancyType','Occupancy type for this object.\X2\000A\X0\It is defined according to the presiding national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4062=IFCSIMPLEPROPERTYTEMPLATE('3AvX7xzqT03Q0RqjyTVpWK',$,'OccupancyNumber','Number of people required for the activity assigned to this space.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4063=IFCSIMPLEPROPERTYTEMPLATE('26f04GSVPE1A__0rwkNSzt',$,'OccupancyNumberPeak','Maximal number of people required for the activity assigned to this space in peak time.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4064=IFCSIMPLEPROPERTYTEMPLATE('1sytKM1rbBtRaAJ3$BiGYO',$,'OccupancyTimePerDay','The amount of time during the day that the activity is required within this space.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#4065=IFCSIMPLEPROPERTYTEMPLATE('1Js1TxYVP74eXQPVaDV2jO',$,'AreaPerOccupant','Design occupancy loading for this type of usage assigned to this space.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#4066=IFCSIMPLEPROPERTYTEMPLATE('0KnpBufzv4NgdVuJHPZlhz',$,'MinimumHeadroom','Headroom required for the activity assigned to this space.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4067=IFCSIMPLEPROPERTYTEMPLATE('0gunaZguDF58K5vFIjvXdB',$,'IsOutlookDesirable','An indication of whether the outlook is desirable (set TRUE) or not (set FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4068=IFCPROPERTYSETTEMPLATE('3UEHmM6lv2s9bgZ6Clfzs3',$,'Pset_SpaceParking','Properties common to the definition of all occurrences of IfcSpace which have an attribute value for ObjectType = ''Parking''.NOTE Modified in IFC 2x3, properties ParkingUse and ParkingUnits added.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpace/PARKING,IfcSpaceType/PARKING',(#4069,#4070,#4071,#4072)); +#4069=IFCSIMPLEPROPERTYTEMPLATE('3E4yNYAbz0QBaRRajK2K0O',$,'ParkingUse','Identifies the type of transportation for which the parking space is designed. Values are not predefined but might include car, compact car, motorcycle, bicycle, truck, bus etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4070=IFCSIMPLEPROPERTYTEMPLATE('3niYvZJM51IQX_en3sawPY',$,'ParkingUnits','Indicates the number of transportation units of the type specified by the property ParkingUse that may be accommodated within the space. Generally, this value should default to 1 unit. However, where the parking space is for motorcycles or bicycles, provision may be made for more than one unit in the space.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4071=IFCSIMPLEPROPERTYTEMPLATE('1FLjLSF7H2$eysqlvP9BlK',$,'IsAisle','Indicates that this parking zone is for accessing the parking units, i.e. an aisle (TRUE) and not a parking unit itself (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4072=IFCSIMPLEPROPERTYTEMPLATE('2vouVKW5rF_RWnq60ezcUq',$,'IsOneWay','Indicates whether the parking aisle is designed for oneway traffic (TRUE) or twoway traffic (FALSE). Should only be provided if the property IsAisle is set to TRUE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4073=IFCPROPERTYSETTEMPLATE('0SwtOKZSj7kQzp5TFHhPPl',$,'Pset_SpaceThermalLoad','The space thermal load defines all thermal losses and gains occurring within a space or zone. The thermal load source attribute defines an enumeration of possible sources of the thermal load. The maximum, minimum, time series and app',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialElementType',(#4074,#4075,#4076,#4077,#4078,#4079,#4080,#4081,#4082,#4083,#4084,#4085,#4086,#4087)); +#4074=IFCSIMPLEPROPERTYTEMPLATE('1fD_7A3CT6YfefE1oUnlt3',$,'People','Heat gains and losses from people.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4075=IFCSIMPLEPROPERTYTEMPLATE('1CmR5SXgbCiBmDOx4n2Fke',$,'Lighting','Lighting loads.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4076=IFCSIMPLEPROPERTYTEMPLATE('0JpIMoJAfANuIscTPFpLXF',$,'EquipmentSensible','Heat gains and losses from equipment.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4077=IFCSIMPLEPROPERTYTEMPLATE('2ZtYdJWij6QuZEqLSYOSkD',$,'VentilationIndoorAir','Ventilation loads from indoor air.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4078=IFCSIMPLEPROPERTYTEMPLATE('1zvXYtlUjCgAz00BIvhgjW',$,'VentilationOutdoorAir','Ventilation loads from outdoor air.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4079=IFCSIMPLEPROPERTYTEMPLATE('3lZmlMr5r2MgrsU7WaREyb',$,'RecirculatedAir','Loads from recirculated air.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4080=IFCSIMPLEPROPERTYTEMPLATE('39DZy3EwjEIOarIEoDblVN',$,'ExhaustAir','Loads from exhaust air.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4081=IFCSIMPLEPROPERTYTEMPLATE('24KXfza$z42fInybmCmcr9',$,'AirExchangeRate','Loads from the air exchange rate.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4082=IFCSIMPLEPROPERTYTEMPLATE('10NJyCEEP3deZ8jRR3Qp68',$,'DryBulbTemperature','Dry bulb temperature of the object.\X2\000A000A\X0\Loads from the dry bulb temperature.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4083=IFCSIMPLEPROPERTYTEMPLATE('2WulI0k5zDP81mdPN_w0$C',$,'RelativeHumidity','Loads from the relative humidity.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4084=IFCSIMPLEPROPERTYTEMPLATE('3_fFsmLyD8Zwhsgzq4pwra',$,'InfiltrationSensible','Heat gains and losses from infiltration.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4085=IFCSIMPLEPROPERTYTEMPLATE('20p40YBYnAEhtnqxn_BiEL',$,'TotalSensibleLoad','Total energy added or removed from air that affects its temperature. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4086=IFCSIMPLEPROPERTYTEMPLATE('3gHXn_uDzASeCbKN4C1Rjo',$,'TotalLatentLoad','Total energy added or removed from air that affects its humidity or concentration of water vapor. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4087=IFCSIMPLEPROPERTYTEMPLATE('3M_ZuNFaT4EhDzyIIm7s6J',$,'TotalRadiantLoad','Total electromagnetic energy added or removed by emission or absorption. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4088=IFCPROPERTYSETTEMPLATE('2poKQnrebA1u4G9TpS0szo',$,'Pset_SpaceThermalLoadPHistory','This property set defines actual measured thermal losses and gains occurring within a space or zone. The thermal load source attribute defines an enumeration of possible sources of the thermal load.',.PSET_PERFORMANCEDRIVEN.,'IfcSpatialElement',(#4089,#4090,#4091,#4092,#4093,#4094,#4095,#4096,#4097,#4098,#4099,#4100,#4101,#4102)); +#4089=IFCSIMPLEPROPERTYTEMPLATE('1uJMD5xr1Ayvp5Eq8K5rpK',$,'PeopleHistory','Heat gains and losses from people.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4090=IFCSIMPLEPROPERTYTEMPLATE('1Dz6Q64OrAawfxN6Jq7pag',$,'LightingHistory','Lighting loads.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4091=IFCSIMPLEPROPERTYTEMPLATE('3PahFEgcPEP9yPSmYgFb7m',$,'EquipmentSensibleHistory','Heat gains and losses from equipment.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4092=IFCSIMPLEPROPERTYTEMPLATE('1qN3fGLa1FX86yjfIkgYhq',$,'VentilationIndoorAirHistory','Ventilation loads from indoor air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4093=IFCSIMPLEPROPERTYTEMPLATE('06HkCFAbP6YxQGKeY9vo0u',$,'VentilationOutdoorAirHistory','Ventilation loads from outdoor air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4094=IFCSIMPLEPROPERTYTEMPLATE('0dKv9_bcX008aBWRYfYksa',$,'RecirculatedAirHistory','Loads from recirculated air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4095=IFCSIMPLEPROPERTYTEMPLATE('1GmubDaY19A8459aNcCpL7',$,'ExhaustAirHistory','Loads from exhaust air.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4096=IFCSIMPLEPROPERTYTEMPLATE('1pT7OBc$bDj9EA7EZmCSlq',$,'AirExchangeRateTimeHistory','Loads from the air exchange rate.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4097=IFCSIMPLEPROPERTYTEMPLATE('1t_2Aa_zLC2f$OwQ5qAGNC',$,'DryBulbTemperatureHistory','Loads from the dry bulb temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4098=IFCSIMPLEPROPERTYTEMPLATE('2MM6avKVP7k8fKKIQY134K',$,'RelativeHumidityHistory','Loads from the relative humidity.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4099=IFCSIMPLEPROPERTYTEMPLATE('2DYJX0eG1DZRtUksZ6wkwT',$,'InfiltrationSensibleHistory','Heat gains and losses from infiltration.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4100=IFCSIMPLEPROPERTYTEMPLATE('3MXDwoDkzEUBPzpMBEoo3F',$,'TotalSensibleLoadHistory','Total energy added or removed from air that affects its temperature. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4101=IFCSIMPLEPROPERTYTEMPLATE('22aWngh8f7ROSs8BYEf7Eh',$,'TotalLatentLoadHistory','Total energy added or removed from air that affects its humidity or concentration of water vapor. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4102=IFCSIMPLEPROPERTYTEMPLATE('2LycDo$onD_heUTu2fpD3B',$,'TotalRadiantLoadHistory','Total electromagnetic energy added or removed by emission or absorption. If a value is less than zero (negative), then the thermal load is lost from the space. If a value is greater than zero (positive), then the thermal load is a gain to the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4103=IFCPROPERTYSETTEMPLATE('2R3akwxX5CXP_BxHw9O1ne',$,'Pset_SpaceThermalPHistory','Thermal and air flow conditions of a space or zone. HISTORY: New property set in IFC 2x2.',.PSET_PERFORMANCEDRIVEN.,'IfcSpatialElement',(#4104,#4105,#4106,#4107,#4108,#4109)); +#4104=IFCSIMPLEPROPERTYTEMPLATE('2x8x4HkoL3KfG6XC1Z60BA',$,'CoolingAirFlowRate','Cooling air flow rate in the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4105=IFCSIMPLEPROPERTYTEMPLATE('1vOqEvrFD9OuwUfe731pDP',$,'HeatingAirFlowRate','Heating air flow rate in the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4106=IFCSIMPLEPROPERTYTEMPLATE('2ZzzyojUTF5O0KSJrhEV4V',$,'VentilationAirFlowRateHistory','Ventilation air flow rate in the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4107=IFCSIMPLEPROPERTYTEMPLATE('28tsvNYiT0rBkxKxwwUbjo',$,'ExhaustAirFlowRate','Design exhaust air flow rate for the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4108=IFCSIMPLEPROPERTYTEMPLATE('05cnX91iHEPxYgebFjcaUS',$,'SpaceTemperatureHistory','Temperature of the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4109=IFCSIMPLEPROPERTYTEMPLATE('3$1Q3PUOzEOgFIHz04bCiJ',$,'SpaceRelativeHumidity','The relative humidity of the space.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4110=IFCPROPERTYSETTEMPLATE('1YcwCSDMvCRwhlNhoAXnCg',$,'Pset_SpatialZoneCommon','Common properties for Spatial Zones.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialZone,IfcSpatialZoneType',(#4111,#4112)); +#4111=IFCSIMPLEPROPERTYTEMPLATE('2qaU_I0kT3MfTTb0TtYUNW',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4112=IFCSIMPLEPROPERTYTEMPLATE('2SK_2aU3b2WOpiBThhpksw',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4113=IFCPROPERTYSETTEMPLATE('0LST8cAqP4peETMsfcdO9y',$,'Pset_SpringTensioner','Properties of spring tensioner used in railway. The property set can be used by the predefined type TENSIONINGEQUIPMENT of IfcDiscreteAccessory.',.PSET_TYPEDRIVENOVERRIDE.,'IfcDiscreteAccessory/TENSIONINGEQUIPMENT,IfcDiscreteAccessoryType/TENSIONINGEQUIPMENT',(#4114,#4115,#4116)); +#4114=IFCSIMPLEPROPERTYTEMPLATE('3kHbG45djENBpR5zgrX6MS',$,'TensileStrength','Indicates the ability to withstand breakage apart under applied force.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4115=IFCSIMPLEPROPERTYTEMPLATE('2JG6s0uN1ADPXhehh1U9V3',$,'NominalWeight','Nominal weight of the object.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#4116=IFCSIMPLEPROPERTYTEMPLATE('2YJtEv18TAwO3DzFFWE32I',$,'TensioningWorkingRange','The working range of the tensioning equipment under normal operation.',.P_BOUNDEDVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#4117=IFCPROPERTYSETTEMPLATE('1hbVtJj$D5B9fMHXCEseps',$,'Pset_StackTerminalTypeCommon','Common properties for stack terminals.',.PSET_TYPEDRIVENOVERRIDE.,'IfcStackTerminal,IfcStackTerminalType',(#4118,#4119)); +#4118=IFCSIMPLEPROPERTYTEMPLATE('29pitzh093M8meIulxpl9E',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4119=IFCSIMPLEPROPERTYTEMPLATE('2Rt6rOvrX7_QEfzfvA7aQV',$,'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',$,#4120,$,$,$,.READWRITE.); +#4120=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4121=IFCPROPERTYSETTEMPLATE('1Ej3UfgVHDTB_MsafdMO7S',$,'Pset_StairCommon','Properties common to the definition of all occurrences of IfcStair.',.PSET_TYPEDRIVENOVERRIDE.,'IfcStair,IfcStairType',(#4122,#4123,#4125,#4126,#4127,#4128,#4129,#4130,#4131,#4132,#4133,#4134,#4135,#4136,#4137,#4138,#4139,#4140,#4141)); +#4122=IFCSIMPLEPROPERTYTEMPLATE('2fQ9joX$98agDVo33Jdf7V',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4123=IFCSIMPLEPROPERTYTEMPLATE('1h0o0jRA9DeOP9bGjC$iGL',$,'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',$,#4124,$,$,$,.READWRITE.); +#4124=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4125=IFCSIMPLEPROPERTYTEMPLATE('1ykrYvJf95X8V8sqwK97Rl',$,'NumberOfRiser','Total number of the risers included in the stair or stair flight.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4126=IFCSIMPLEPROPERTYTEMPLATE('0010eGlUz0tg6IS6VkJHav',$,'NumberOfTreads','Total number of treads included in the stair or stairflight.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4127=IFCSIMPLEPROPERTYTEMPLATE('2wia$K0DnFDQqae6AL3jwo',$,'RiserHeight','Vertical distance from tread to tread.\X2\000A\X0\The riser height is supposed to be equal for all steps of a stair or stair flight.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4128=IFCSIMPLEPROPERTYTEMPLATE('3CEN2Z$YD0RRcheK0wmSGC',$,'TreadLength','Horizontal distance from the front of the thread to the front of the next tread.\X2\000A\X0\The tread length is supposed to be equal for all steps of the stair or stair flight at the walking line.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4129=IFCSIMPLEPROPERTYTEMPLATE('2QO$vA40bFnvFJHNvWYB2q',$,'NosingLength','Horizontal distance from the front of the tread to the riser underneath. It is the overhang of the tread.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4130=IFCSIMPLEPROPERTYTEMPLATE('2X$GCskbrAqfy6HblHLSzr',$,'WalkingLineOffset','Offset of the walking line from the inner side of the flight.\X2\000A\X0\Note: the walking line may have a own shape representation (in case of inconsistencies, the value derived from the shape representation shall take precedence).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4131=IFCSIMPLEPROPERTYTEMPLATE('0am0N8G5TC$AlgU_fEUiIi',$,'TreadLengthAtOffset','Length of treads at a given offset.\X2\000A\X0\Walking line position is given by the ''WalkingLineOffset''. The resulting value should normally be identical with TreadLength, it may be given in addition, if the walking line offset for building code calculations is different from that used in design.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4132=IFCSIMPLEPROPERTYTEMPLATE('3SyZkay194IPakk3sVepz2',$,'TreadLengthAtInnerSide','Minimum length of treads at the inner side of the winder.\X2\000A\X0\Only relevant in case of winding flights, for straight flights it is identical with IfcStairFlight.TreadLength. It is a pre-calculated value, in case of inconsistencies, the value derived from the shape representation shall take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4133=IFCSIMPLEPROPERTYTEMPLATE('21WC9tmZrEvhJHjkcS2tuh',$,'WaistThickness','Minimum thickness of the stair flight, measured perpendicular to the slope of the flight to the inner corner of riser and tread. It is a pre-calculated value, in case of inconsistencies, the value derived from the shape representation shall take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4134=IFCSIMPLEPROPERTYTEMPLATE('1SWPpXmX16febnZTKTdngO',$,'RequiredHeadroom','Required headroom clearance for the passageway according to the applicable building code or additional requirements.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4135=IFCSIMPLEPROPERTYTEMPLATE('3aR3NMgmDEogw2ShYUlRiN',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. Set to (TRUE) if this object is rated as handicap accessible according to the local building codes, otherwise (FALSE). It is giving according to the requirements of the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4136=IFCSIMPLEPROPERTYTEMPLATE('24mLVBgzf4EvZKsOm3j$5N',$,'HasNonSkidSurface','Indication whether the surface finish is designed to prevent slippery (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4137=IFCSIMPLEPROPERTYTEMPLATE('0wXk2sibP5fQ1Wyn0Eq4PW',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4138=IFCSIMPLEPROPERTYTEMPLATE('1BjzVre$jEj9uFIrgJCWLk',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#4139=IFCSIMPLEPROPERTYTEMPLATE('3MtEyYVEDBHBZZ87xkpSxL',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4140=IFCSIMPLEPROPERTYTEMPLATE('3zXr0dL1PCuB1Dcn$z6l9q',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4141=IFCSIMPLEPROPERTYTEMPLATE('1zKZ6Gwk1919fBMpEMy_ws',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here it defines an exit stair in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4142=IFCPROPERTYSETTEMPLATE('29ZTW_RGbF7BifLVELOhwl',$,'Pset_StairFlightCommon','Properties common to the definition of all occurrences of IfcStairFlight.',.PSET_TYPEDRIVENOVERRIDE.,'IfcStairFlight,IfcStairFlightType',(#4143,#4144,#4146,#4147,#4148,#4149,#4150,#4151,#4152,#4153,#4154,#4155)); +#4143=IFCSIMPLEPROPERTYTEMPLATE('2EiPbUNa557eEViu$KHLJZ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4144=IFCSIMPLEPROPERTYTEMPLATE('1jahwAOGPDge_TiEeG2tz8',$,'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',$,#4145,$,$,$,.READWRITE.); +#4145=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4146=IFCSIMPLEPROPERTYTEMPLATE('3UtEuu4Lf6Wfkn_KFTEuSy',$,'NumberOfRiser','Total number of the risers included in the stair or stair flight.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4147=IFCSIMPLEPROPERTYTEMPLATE('045hvKnvP5u9mPhpOxlDJJ',$,'NumberOfTreads','Total number of treads included in the stair or stairflight.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4148=IFCSIMPLEPROPERTYTEMPLATE('3q2WpqO3b4s8da1gB8K9dy',$,'RiserHeight','Vertical distance from tread to tread.\X2\000A\X0\The riser height is supposed to be equal for all steps of a stair or stair flight.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4149=IFCSIMPLEPROPERTYTEMPLATE('19CJSqg4X7ag7VKT_$Pj8x',$,'TreadLength','Horizontal distance from the front of the thread to the front of the next tread.\X2\000A\X0\The tread length is supposed to be equal for all steps of the stair or stair flight at the walking line.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4150=IFCSIMPLEPROPERTYTEMPLATE('07kPnkfp11sxwVIgH7RPbY',$,'NosingLength','Horizontal distance from the front of the tread to the riser underneath. It is the overhang of the tread.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4151=IFCSIMPLEPROPERTYTEMPLATE('1RovF7Veb3u9Du7UAOp815',$,'WalkingLineOffset','Offset of the walking line from the inner side of the flight.\X2\000A\X0\Note: the walking line may have a own shape representation (in case of inconsistencies, the value derived from the shape representation shall take precedence).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4152=IFCSIMPLEPROPERTYTEMPLATE('2N4iXmcCj2XfZkQb3CU0$m',$,'TreadLengthAtOffset','Length of treads at a given offset.\X2\000A\X0\Walking line position is given by the ''WalkingLineOffset''. The resulting value should normally be identical with TreadLength, it may be given in addition, if the walking line offset for building code calculations is different from that used in design.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4153=IFCSIMPLEPROPERTYTEMPLATE('18mJXUKj585PBO0OKMHPk_',$,'TreadLengthAtInnerSide','Minimum length of treads at the inner side of the winder.\X2\000A\X0\Only relevant in case of winding flights, for straight flights it is identical with IfcStairFlight.TreadLength. It is a pre-calculated value, in case of inconsistencies, the value derived from the shape representation shall take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4154=IFCSIMPLEPROPERTYTEMPLATE('2tZbplBur8MAnfXwjakcJh',$,'Headroom','Actual headroom clearance for the passageway according to the current design.\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4155=IFCSIMPLEPROPERTYTEMPLATE('1eOK8_4V9BiwszCjCkXo5q',$,'WaistThickness','Minimum thickness of the stair flight, measured perpendicular to the slope of the flight to the inner corner of riser and tread. It is a pre-calculated value, in case of inconsistencies, the value derived from the shape representation shall take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4156=IFCPROPERTYSETTEMPLATE('1F$f5_Hhf2xw2qh9s$FR4c',$,'Pset_Stationing','Specifies stationing parameters for IfcReferent.',.PSET_OCCURRENCEDRIVEN.,'IfcReferent',(#4157,#4158,#4159)); +#4157=IFCSIMPLEPROPERTYTEMPLATE('2TApwUdLTD8RolCiVjaogG',$,'IncomingStation','The optional station value of the incoming segment that ends at this location. This value needs to be set if the intention is to specify a station equation, i.e. a location where stationing changes.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4158=IFCSIMPLEPROPERTYTEMPLATE('3SJGKmkHP6pQ$55WOSKXHO',$,'Station','The station value at this location.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4159=IFCSIMPLEPROPERTYTEMPLATE('1_mIfCwkD73O9AsYmjl1QJ',$,'HasIncreasingStation','Inform on the increasing or decreasing progress of stationing values, for referents nested in a given alignment.If present and true, or if not present, then the relevant subsequently nested referents are expected to have greater Pset_Stationing.Station values (i.e., increasing stations).If present and false, then the relevant subsequently nested referents are expected to have lower Pset_Stationing.Station values (i.e., decreasing stations).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4160=IFCPROPERTYSETTEMPLATE('0oAzHHwe1EnQkLazKke$Rl',$,'Pset_StructuralSurfaceMemberVaryingThickness','Thickness parameters of a surface member (structural analysis item) with varying thickness, particularly with linearly varying thickness. The thickness is interpolated/ extrapolated from three points. The locations of these points are given either in local x,y coordinates of the surface member or in global X,Y,Z coordinates. Either way, these points are required to be located within the face or at the bounds of the face of the surface member, and they must not be located on a common line. Local and global coordinates shall not be mixed within the same property set instance.',.PSET_OCCURRENCEDRIVEN.,'IfcStructuralSurfaceMemberVarying',(#4161,#4162,#4163,#4164,#4165,#4166,#4167,#4168,#4169)); +#4161=IFCSIMPLEPROPERTYTEMPLATE('3VvczbkrnBKwnsvQb_ur97',$,'Thickness1','First thickness parameter of a surface member with varying thickness',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4162=IFCSIMPLEPROPERTYTEMPLATE('2255r43LrD_9OUZ5cNiAbq',$,'Location1Local','Local x,y coordinates of the point in which Thickness1 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4163=IFCSIMPLEPROPERTYTEMPLATE('0Pt7yYz299Cvo4xhCqWSwI',$,'Location1Global','Global X,Y,Z coordinates of the point in which Thickness1 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4164=IFCSIMPLEPROPERTYTEMPLATE('3Zdy8vZyP2Ex6Ddqs1iT9L',$,'Thickness2','Second thickness parameter of a surface member with varying thickness',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4165=IFCSIMPLEPROPERTYTEMPLATE('09lfKrDiLEQ8m0POB4VgVm',$,'Location2Local','Local x,y coordinates of the point in which Thickness2 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4166=IFCSIMPLEPROPERTYTEMPLATE('3E2QvvSBD9LfLujnt6Lhor',$,'Location2Global','Global X,Y,Z coordinates of the point in which Thickness2 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4167=IFCSIMPLEPROPERTYTEMPLATE('1OnW31V1f52h_mxuBdk$II',$,'Thickness3','Third thickness parameter of a surface member with varying thickness',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4168=IFCSIMPLEPROPERTYTEMPLATE('0MGrjw7JP8dP6TBOYsZlla',$,'Location3Local','Local x,y coordinates of the point in which Thickness3 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4169=IFCSIMPLEPROPERTYTEMPLATE('2s4Bfn1k5E9QBnNaBoHGbJ',$,'Location3Global','Global X,Y,Z coordinates of the point in which Thickness3 is given',.P_LISTVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4170=IFCPROPERTYSETTEMPLATE('2Y0xLrs2bDKv_8oF2ZWZgF',$,'Pset_SumpBusterCommon','Properties for a sump buster.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/SUMPBUSTER,IfcElementAssemblyType/SUMPBUSTER',(#4171)); +#4171=IFCSIMPLEPROPERTYTEMPLATE('0ULdDLUnvFPfgd6JahhbGP',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4172=IFCPROPERTYSETTEMPLATE('1vl1Y6Z21ApOr0w7EDXdVp',$,'Pset_Superelevation','Specifies the general properties for a Superelevation event.',.PSET_OCCURRENCEDRIVEN.,'IfcReferent/SUPERELEVATIONEVENT',(#4173,#4175,#4176)); +#4173=IFCSIMPLEPROPERTYTEMPLATE('3x0rV_qQX9CvKMz6WkmkfC',$,'Side','Specifies if the width is measured to the RIGHT or to the LEFT of the curve referenced by the placement, or if the same value is applied to BOTH sides.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4174,$,$,$,.READWRITE.); +#4174=IFCPROPERTYENUMERATION('PEnum_SideType',(IFCLABEL('BOTH'),IFCLABEL('LEFT'),IFCLABEL('RIGHT')),$); +#4175=IFCSIMPLEPROPERTYTEMPLATE('3SNnZVjhX30eJ0rFMXT5CH',$,'Superelevation','Specifies the superelevation as a ratio measure (slope) at the location of the event.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4176=IFCSIMPLEPROPERTYTEMPLATE('3RAKrKd89CE9s_k4_GXbRS',$,'TransitionSuperelevation','The type of transition of superelevation from previous event to this one.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4177,$,$,$,.READWRITE.); +#4177=IFCPROPERTYENUMERATION('PEnum_TransitionSuperelevationType',(IFCLABEL('LINEAR')),$); +#4178=IFCPROPERTYSETTEMPLATE('2Vj8DPUHDC7ft0zh07bMDN',$,'Pset_SwitchingDeviceTypeCommon','A switching device is a device designed to make or break the current in one or more electric circuits.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice,IfcSwitchingDeviceType',(#4179,#4180,#4182,#4183,#4185,#4186,#4187,#4188)); +#4179=IFCSIMPLEPROPERTYTEMPLATE('0LyS2gUK50efLk72PE5Ohg',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4180=IFCSIMPLEPROPERTYTEMPLATE('0iP8MElWD78QT4omMe16aY',$,'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',$,#4181,$,$,$,.READWRITE.); +#4181=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4182=IFCSIMPLEPROPERTYTEMPLATE('1Bg8sOJnj60eb2P4rVMRmG',$,'NumberOfGangs','Number of gangs in the object.\X2\000A000A\X0\Number of gangs/buttons on this switch.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4183=IFCSIMPLEPROPERTYTEMPLATE('2pi7UlE6v5shnMn_otjHJm',$,'SwitchFunction','Indicates types of switches which differs in functionality.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4184,$,$,$,.READWRITE.); +#4184=IFCPROPERTYENUMERATION('PEnum_SwitchFunctionType',(IFCLABEL('DOUBLETHROWSWITCH'),IFCLABEL('INTERMEDIATESWITCH'),IFCLABEL('ONOFFSWITCH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4185=IFCSIMPLEPROPERTYTEMPLATE('2hh59u0zvAsxtRcYo9swFu',$,'HasLock','Indication of whether a switching device has a key operated lock (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4186=IFCSIMPLEPROPERTYTEMPLATE('1eGaYb2KH9wBYdF840SiDc',$,'IsIlluminated','An indication of whether there is an illuminated indicator to show that the switch is on (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4187=IFCSIMPLEPROPERTYTEMPLATE('28lbLs1_n7OhuS0sRllYNP',$,'Legend','A text inscribed or applied to the switch as a legend to indicate purpose or function.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4188=IFCSIMPLEPROPERTYTEMPLATE('0$llPl__fEJBTGCmflwvMC',$,'SetPoint','Indicates the setpoint and label.\X2\000A000A\X0\For toggle switches, there are two positions, 0 for off and 1 for on. For dimmer switches, the values may indicate the fully-off and full-on positions, where missing integer values in between are interpolated. For selector switches, the range indicates the available positions.\X2\000A\X0\An IfcTable may be attached (using IfcMetric and IfcResourceConstraintRelationship) containing columns of the specified header names and types:\X2\000A\X0\''Position'' (IfcInteger): The discrete setpoint level.\X2\000A\X0\''Sink'' (IfcLabel): The Name of the switched input port (IfcDistributionPort with FlowDirection=SINK).\X2\000A\X0\''Source'' (IfcLabel): The Name of the switched output port (IfcDistributionPort with FlowDirection=SOURCE).\X2\000A\X0\''Ratio'' (IfcNormalisedRatioMeasure): The ratio of power at the setpoint where 0.0 is off and 1.0 is fully on.',.P_TABLEVALUE.,'IfcInteger','IfcLabel',$,$,$,$,.READWRITE.); +#4189=IFCPROPERTYSETTEMPLATE('2qW6K8Y8j1NBJpNuf41CJf',$,'Pset_SwitchingDeviceTypeContactor','An electrical device used to control the flow of power in a circuit on or off.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/CONTACTOR,IfcSwitchingDeviceType/CONTACTOR',(#4190)); +#4190=IFCSIMPLEPROPERTYTEMPLATE('2nAqXXpSHAw9kpUXQulI5Y',$,'ContactorType','A list of the available types of contactor from which that required may be selected where:CapacitorSwitching: for switching 3 phase single or multi-step capacitor banks.\X2\000A\X0\LowCurrent: requires the use of low resistance contacts.\X2\000A\X0\MagneticLatching: enables the contactor to remain in the on position when the coil is no longer energized.\X2\000A\X0\MechanicalLatching: requires that the contactor is mechanically retained in the on position.\X2\000A\X0\Modular: are totally enclosed and self contained.\X2\000A\X0\Reversing: has a double set of contactors that are prewired.\X2\000A\X0\Standard: is a generic device that controls the flow of power in a circuit on or off.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4191,$,$,$,.READWRITE.); +#4191=IFCPROPERTYENUMERATION('PEnum_ContactorType',(IFCLABEL('CAPACITORSWITCHING'),IFCLABEL('LOWCURRENT'),IFCLABEL('MAGNETICLATCHING'),IFCLABEL('MECHANICALLATCHING'),IFCLABEL('MODULAR'),IFCLABEL('REVERSING'),IFCLABEL('STANDARD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4192=IFCPROPERTYSETTEMPLATE('0kU033x298Chr6EEXwQ6Qm',$,'Pset_SwitchingDeviceTypeDimmerSwitch','A dimmer switch is a switch that adjusts electrical power through a variable position level action. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/DIMMERSWITCH,IfcSwitchingDeviceType/DIMMERSWITCH',(#4193)); +#4193=IFCSIMPLEPROPERTYTEMPLATE('3RbQ0r5JP1TQMcD9BGFv45',$,'DimmerType','A list of the available types of dimmer switch from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4194,$,$,$,.READWRITE.); +#4194=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceDimmerSwitchType',(IFCLABEL('ROCKER'),IFCLABEL('SELECTOR'),IFCLABEL('TWIST'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4195=IFCPROPERTYSETTEMPLATE('2nEnh9F7vBKf0ki1RL8f4C',$,'Pset_SwitchingDeviceTypeEmergencyStop','An emergency stop device acts to remove as quickly as possible any danger that may have arisen unexpectedly.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/EMERGENCYSTOP,IfcSwitchingDeviceType/EMERGENCYSTOP',(#4196,#4198,#4199,#4200,#4201,#4202,#4203,#4204,#4205,#4206,#4207,#4208,#4209)); +#4196=IFCSIMPLEPROPERTYTEMPLATE('13rA$4gsz1rRwPyH$SgAUc',$,'SwitchOperation','Indicates operation of emergency stop switch.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4197,$,$,$,.READWRITE.); +#4197=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceEmergencyStopType',(IFCLABEL('MUSHROOM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4198=IFCSIMPLEPROPERTYTEMPLATE('3KsE9Lw5H8bwLXoiTWdnwe',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4199=IFCSIMPLEPROPERTYTEMPLATE('3vUjAbouj9FgDCY$n2HPCk',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4200=IFCSIMPLEPROPERTYTEMPLATE('2vL1fcKPrELBMRP4hU4G0e',$,'BreakingCapacity','The current that a fuse, circuit breaker, or other electrical apparatus is able to interrupt without being destroyed or causing an electric arc with unacceptable duration.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#4201=IFCSIMPLEPROPERTYTEMPLATE('1i5BPJzZTBz9MUh04zqlXT',$,'NumberOfEarthFaultRelays','Indicates the number of relays used for preventing earth fault.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4202=IFCSIMPLEPROPERTYTEMPLATE('3_FW9Flzv0Af2guHxnwBcy',$,'NumberOfEmergencyButtons','The number of emergency buttons built in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4203=IFCSIMPLEPROPERTYTEMPLATE('3gfyaolITETvrtHvRcoFT1',$,'NumberOfRelays','Indicates number of relays built in the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4204=IFCSIMPLEPROPERTYTEMPLATE('3mppN2dFDBCu0NA1keQJm7',$,'NumberOfOverCurrentRelays','Indicates number of relays used for preventing over current.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4205=IFCSIMPLEPROPERTYTEMPLATE('1L$J8kSOD5kvfAGAyWJsmp',$,'NumberOfAffectedPoles','Number of poles that the equipment affects.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4206=IFCSIMPLEPROPERTYTEMPLATE('1KQ$p$UPrCv94VlmCAYHTV',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#4207=IFCSIMPLEPROPERTYTEMPLATE('0Dftnj4wP22O7zFSlvXjX2',$,'RatedFrequency','Frequency of the AC electric power supply when the device or system reaches its optimum operating condition.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#4208=IFCSIMPLEPROPERTYTEMPLATE('0AyT9ssTj71QVHHmgUlYdK',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4209=IFCSIMPLEPROPERTYTEMPLATE('0eJeiZDYH9g9jkfhpDWTiz',$,'TransformationRatio','The ratio of the actual primary current or voltage to the actual secondary current or voltage.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4210=IFCPROPERTYSETTEMPLATE('0WVCo1ZVrBd9gVYpRMPM3d',$,'Pset_SwitchingDeviceTypeKeypad','A keypad is a switch supporting multiple functions. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/KEYPAD,IfcSwitchingDeviceType/KEYPAD',(#4211)); +#4211=IFCSIMPLEPROPERTYTEMPLATE('2mzV1HIGb7jAF_EyH92_oE',$,'KeypadType','A list of the available types of keypad switch from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4212,$,$,$,.READWRITE.); +#4212=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceKeypadType',(IFCLABEL('BUTTONS'),IFCLABEL('TOUCHSCREEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4213=IFCPROPERTYSETTEMPLATE('18mwFoiwzEaf9c3xPHMn9E',$,'Pset_SwitchingDeviceTypeMomentarySwitch','A momentary switch is a switch that does not hold state. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/MOMENTARYSWITCH,IfcSwitchingDeviceType/MOMENTARYSWITCH',(#4214)); +#4214=IFCSIMPLEPROPERTYTEMPLATE('3q1T1Se11A5RB3Od4r1RwF',$,'MomentaryType','A list of the available types of momentary switch from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4215,$,$,$,.READWRITE.); +#4215=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceMomentarySwitchType',(IFCLABEL('BUTTON'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4216=IFCPROPERTYSETTEMPLATE('0bC6Bdbz1979WHC6qVBFb2',$,'Pset_SwitchingDeviceTypePHistory','Indicates switch positions or levels over time, such as for energy management or surveillance.',.PSET_PERFORMANCEDRIVEN.,'IfcSwitchingDevice',(#4217)); +#4217=IFCSIMPLEPROPERTYTEMPLATE('3rCeHGUUv6YgyM5_kiLkSk',$,'SetPointHistory','Indicates the switch position over time according to Pset_SwitchingDeviceTypeCommon.SetPoint.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4218=IFCPROPERTYSETTEMPLATE('2tKEFWxG100uCq7nQEdT86',$,'Pset_SwitchingDeviceTypeRelay','Properties in this property set are applicable for IfcSwitchingDevice with PredefinedType RELAY.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/RELAY,IfcSwitchingDeviceType/RELAY',(#4219,#4220,#4221,#4222,#4223,#4224,#4225,#4226,#4227)); +#4219=IFCSIMPLEPROPERTYTEMPLATE('1tAup6AAf6cfHYoTMOVVnN',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4220=IFCSIMPLEPROPERTYTEMPLATE('1WwUpUE9vCeh9NmmhaB9Zt',$,'Current','The actual current and operable range.',.P_BOUNDEDVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#4221=IFCSIMPLEPROPERTYTEMPLATE('3N3_Mzebn5Gx7J3h7ve4UT',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4222=IFCSIMPLEPROPERTYTEMPLATE('1H9H8JHVf4Ew5zD8kt98Dc',$,'InsulationResistance','Minimum resistance between one terminal or several terminals connected together and the case or enclosure of a component at specified voltage.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#4223=IFCSIMPLEPROPERTYTEMPLATE('204CnnjLP2mQMDPTUHNLKz',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4224=IFCSIMPLEPROPERTYTEMPLATE('3VPmXgSG99V8arW7sHD7km',$,'ContactResistance','Resistance when electrical node is closed.',.P_SINGLEVALUE.,'IfcElectricResistanceMeasure',$,$,$,$,$,.READWRITE.); +#4225=IFCSIMPLEPROPERTYTEMPLATE('1XZTwhXP97Nvu9bhkU6GhW',$,'PullInVoltage','Working voltage of relay in excitation state.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4226=IFCSIMPLEPROPERTYTEMPLATE('1s_Ja4znjBXh8fd5p56N36',$,'ReleaseVoltage','The maximum voltage to guarantee the drop of the relay node.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4227=IFCSIMPLEPROPERTYTEMPLATE('30Jav7DTL1ZeE$8KoHo1wE',$,'Voltage','The actual voltage and operable range.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4228=IFCPROPERTYSETTEMPLATE('2vjBexZ_zBIvZSFEI7qg6x',$,'Pset_SwitchingDeviceTypeSelectorSwitch','A selector switch is a switch that adjusts electrical power through a multi-position action. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/SELECTORSWITCH,IfcSwitchingDeviceType/SELECTORSWITCH',(#4229,#4231,#4233,#4235,#4236,#4237,#4238,#4239)); +#4229=IFCSIMPLEPROPERTYTEMPLATE('0xBYoXcivFtRBBq6AN6gU9',$,'SelectorType','A list of the available types of selector switch from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4230,$,$,$,.READWRITE.); +#4230=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceDimmerSwitchType',(IFCLABEL('ROCKER'),IFCLABEL('SELECTOR'),IFCLABEL('TWIST'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4231=IFCSIMPLEPROPERTYTEMPLATE('0eqh3Tq7n4O9QN5F54ncUU',$,'SwitchUsage','A list of the available usages for switches from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4232,$,$,$,.READWRITE.); +#4232=IFCPROPERTYENUMERATION('PEnum_SwitchUsage',(IFCLABEL('EMERGENCY'),IFCLABEL('GUARD'),IFCLABEL('LIMIT'),IFCLABEL('START'),IFCLABEL('STOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4233=IFCSIMPLEPROPERTYTEMPLATE('2rXszjUqL1zOdtGUYO1VpW',$,'SwitchActivation','A list of the available activations for switches from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4234,$,$,$,.READWRITE.); +#4234=IFCPROPERTYENUMERATION('PEnum_SwitchActivation',(IFCLABEL('ACTUATOR'),IFCLABEL('FOOT'),IFCLABEL('HAND'),IFCLABEL('PROXIMITY'),IFCLABEL('SOUND'),IFCLABEL('TWOHAND'),IFCLABEL('WIRE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4235=IFCSIMPLEPROPERTYTEMPLATE('1ZTgDHnhL9UQW9Tz99Qq0G',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#4236=IFCSIMPLEPROPERTYTEMPLATE('2Rp9bzFdvAEQ6YtH5ZbsFs',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4237=IFCSIMPLEPROPERTYTEMPLATE('3fhkiweJn1IRn_8opeY5La',$,'RatedFrequency','Frequency of the AC electric power supply when the device or system reaches its optimum operating condition.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#4238=IFCSIMPLEPROPERTYTEMPLATE('3qwWVUdmT2VhfTR5H$dUZO',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4239=IFCSIMPLEPROPERTYTEMPLATE('37_f$0ci55KeVzitiDgwTo',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4240=IFCPROPERTYSETTEMPLATE('1QHDBQENT5KQMFNbkSH$1$',$,'Pset_SwitchingDeviceTypeStarter','A starter is a switch which in the closed position controls the application of power to an electrical device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/STARTER,IfcSwitchingDeviceType/STARTER',(#4241)); +#4241=IFCSIMPLEPROPERTYTEMPLATE('3jHB6p3uv3B9todARs5vti',$,'StarterType','A list of the available types of starter from which that required may be selected where:AutoTransformer: A starter for an induction motor which uses for starting one or more reduced voltages derived from an auto transformer. (IEC 441-14-45)\X2\000A\X0\Manual: A starter in which the force for closing the main contacts is provided exclusively by manual energy. (IEC 441-14-39)\X2\000A\X0\DirectOnLine: A starter which connects the line voltage across the motor terminals in one step. (IEC 441-14-40)\X2\000A\X0\Frequency: A starter in which the frequency of the power supply is progressively increased until the normal operation frequency is attained.\X2\000A\X0\nStep: A starter in which there are (n-1) intermediate accelerating positions between the off and full on positions. (IEC 441-14-41)\X2\000A\X0\Rheostatic: A starter using one or several resistors for obtaining, during starting, stated motor torque characteristics and for limiting the current. (IEC 441-14-425)\X2\000A\X0\StarDelta: A starter for a 3 phase induction motor such that in the starting position the stator windings are connected in star and in the final running position they are connected in delta. (IEC 441-14-44)',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4242,$,$,$,.READWRITE.); +#4242=IFCPROPERTYENUMERATION('PEnum_StarterType',(IFCLABEL('AUTOTRANSFORMER'),IFCLABEL('DIRECTONLINE'),IFCLABEL('FREQUENCY'),IFCLABEL('MANUAL'),IFCLABEL('NSTEP'),IFCLABEL('RHEOSTATIC'),IFCLABEL('STARDELTA'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4243=IFCPROPERTYSETTEMPLATE('3M9t8Ixkr1xfb2QNetEnFl',$,'Pset_SwitchingDeviceTypeSwitchDisconnector','A switch disconnector is a switch which in the open position satisfies the isolating requirements specified for a disconnector.History: Property ''HasVisualIndication'' changed to ''IsIlluminated'' to conform with property name for toggle switch',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/SWITCHDISCONNECTOR,IfcSwitchingDeviceType/SWITCHDISCONNECTOR',(#4244,#4246)); +#4244=IFCSIMPLEPROPERTYTEMPLATE('3FYfRHawzBfuaiQ3c5dy1c',$,'SwitchDisconnectorType','A list of the available types of switch disconnector from which that required may be selected where:CenterBreak: A disconnector in which both contacts of each pole are movable and engage at a point substantially midway between their supports. (IEC 441-14-08)\X2\000A\X0\DividedSupport: A disconnector in which the fixed and moving contacts of each pole are not supported by a common base or frame. (IEC 441-14-06)\X2\000A\X0\DoubleBreak: A disconnector that opens a circuit at two points. (IEC 441-14-09)\X2\000A\X0\EarthingSwitch: A disconnector in which the fixed and moving contacts of each pole are not supported by a common base or frame. (IEC 441-14-07)\X2\000A\X0\Isolator: A disconnector which in the open position satisfies isolating requirements. (IEC 441-14-12)',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4245,$,$,$,.READWRITE.); +#4245=IFCPROPERTYENUMERATION('PEnum_SwitchDisconnectorType',(IFCLABEL('CENTERBREAK'),IFCLABEL('DIVIDEDSUPPORT'),IFCLABEL('DOUBLEBREAK'),IFCLABEL('EARTHINGSWITCH'),IFCLABEL('ISOLATOR'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4246=IFCSIMPLEPROPERTYTEMPLATE('0UwlUTzxTCzwxNReTU$yZt',$,'LoadDisconnectionType','A list of the available types of load disconnection from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4247,$,$,$,.READWRITE.); +#4247=IFCPROPERTYENUMERATION('PEnum_LoadDisconnectionType',(IFCLABEL('OFFLOAD'),IFCLABEL('ONLOAD'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4248=IFCPROPERTYSETTEMPLATE('3RRU4sFx96NRrYMTKpv_dx',$,'Pset_SwitchingDeviceTypeToggleSwitch','A toggle switch is a switch that enables or isolates electrical power through a two position on/off action. HISTORY: SetPoint added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice/TOGGLESWITCH,IfcSwitchingDeviceType/TOGGLESWITCH',(#4249,#4251,#4253)); +#4249=IFCSIMPLEPROPERTYTEMPLATE('0hH_nkcCv9Wf5iSNIATMcu',$,'ToggleSwitchType','A list of the available types of toggle switch from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4250,$,$,$,.READWRITE.); +#4250=IFCPROPERTYENUMERATION('PEnum_SwitchingDeviceToggleSwitchType',(IFCLABEL('BREAKGLASS'),IFCLABEL('CHANGEOVER'),IFCLABEL('KEYOPERATED'),IFCLABEL('MANUALPULL'),IFCLABEL('PULLCORD'),IFCLABEL('PUSHBUTTON'),IFCLABEL('ROCKER'),IFCLABEL('SELECTOR'),IFCLABEL('TWIST'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4251=IFCSIMPLEPROPERTYTEMPLATE('3NmTgUlbn6jfxpz3BZVyZL',$,'SwitchUsage','A list of the available usages for switches from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4252,$,$,$,.READWRITE.); +#4252=IFCPROPERTYENUMERATION('PEnum_SwitchUsage',(IFCLABEL('EMERGENCY'),IFCLABEL('GUARD'),IFCLABEL('LIMIT'),IFCLABEL('START'),IFCLABEL('STOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4253=IFCSIMPLEPROPERTYTEMPLATE('2Vd$8L0Zv5IeHlmFlHHOm9',$,'SwitchActivation','A list of the available activations for switches from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4254,$,$,$,.READWRITE.); +#4254=IFCPROPERTYENUMERATION('PEnum_SwitchActivation',(IFCLABEL('ACTUATOR'),IFCLABEL('FOOT'),IFCLABEL('HAND'),IFCLABEL('PROXIMITY'),IFCLABEL('SOUND'),IFCLABEL('TWOHAND'),IFCLABEL('WIRE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4255=IFCPROPERTYSETTEMPLATE('0n2vEYWwDB1h2jLJOHekTa',$,'Pset_SymmetricPairCable','Properties applicable to a symmetric pair cable, which is is a copper cable with a variable number of copper twisted symmetric pair conductors used to transmit data by means of electrical signals. this property set is applicable to type or occurrence of IfcCableSegment with predefined type CABLESEGMENT',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableSegment/CABLESEGMENT,IfcCableSegmentType/CABLESEGMENT',(#4256,#4257)); +#4256=IFCSIMPLEPROPERTYTEMPLATE('0mTnslmen079SIPhlKfbDa',$,'NumberOfTwistedPairs','Total number of twisted wire pairs in copper pair cables.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4257=IFCSIMPLEPROPERTYTEMPLATE('3MwGluw0n9RP$mayKmJMgV',$,'NumberOfUntwistedPairs','Total number of untwisted wire pairs in the copper pair cable.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4258=IFCPROPERTYSETTEMPLATE('2aL8cQpDT7AfNQL4bevZAr',$,'Pset_SystemFurnitureElementTypeCommon','Common properties for all systems furniture (I.e. modular furniture) element types (e.g. vertical panels, work surfaces, and storage). HISTORY: First issued in IFC Release R1.5. Renamed from Pset_FurnitureElementCommon',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElement,IfcSystemFurnitureElementType',(#4259,#4260,#4261,#4262,#4263)); +#4259=IFCSIMPLEPROPERTYTEMPLATE('21BB4Z04fFmfpk6JZ9P6CZ',$,'IsUsed','Indicates whether the element is being used in a workstation (= TRUE) or not.(= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4260=IFCSIMPLEPROPERTYTEMPLATE('3frXq3QAbB1fQCOxVjCfKm',$,'GroupCode','e.g. panels, worksurfaces, storage, etc.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4261=IFCSIMPLEPROPERTYTEMPLATE('3bKxl2VN58jBVMjITAjCl2',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4262=IFCSIMPLEPROPERTYTEMPLATE('13Bd9PspXC2xxsmuWjNnvW',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A000A\X0\The nominal height of the system furniture elements of this type. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4263=IFCSIMPLEPROPERTYTEMPLATE('0bdd46cIDCDO3_5MS6BsDt',$,'Finishing','The finishing applied to system furniture elements of this type e.g. walnut, fabric.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4264=IFCPROPERTYSETTEMPLATE('26zmKs7Zb4_hA2CJ_1sShY',$,'Pset_SystemFurnitureElementTypePanel','A set of specific properties for vertical panels that assembly workstations.. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Panel',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElement/PANEL,IfcSystemFurnitureElementType/PANEL',(#4265,#4266,#4268)); +#4265=IFCSIMPLEPROPERTYTEMPLATE('3q4robUfP0z92dd_NSoF_$',$,'HasOpening','indicates whether the panel has an opening (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4266=IFCSIMPLEPROPERTYTEMPLATE('1JvYAtHkX1Owz6S6tFjSsh',$,'FurniturePanelType','Available panel types from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4267,$,$,$,.READWRITE.); +#4267=IFCPROPERTYENUMERATION('PEnum_FurniturePanelType',(IFCLABEL('ACOUSTICAL'),IFCLABEL('DOOR'),IFCLABEL('ENDS'),IFCLABEL('GLAZED'),IFCLABEL('HORZ_SEG'),IFCLABEL('MONOLITHIC'),IFCLABEL('OPEN'),IFCLABEL('SCREEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4268=IFCSIMPLEPROPERTYTEMPLATE('0l0kQlZtrD39NQ$zbB2lcJ',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4269=IFCPROPERTYSETTEMPLATE('0EiCtf24b0g9eQnqSaB6El',$,'Pset_SystemFurnitureElementTypeSubrack','Properties of subrack used in railway telecom. The property set can be used by the predefined type SUBRACK of IfcSystemFurnitureElement',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElement/SUBRACK,IfcSystemFurnitureElementType/SUBRACK',(#4270,#4271,#4272)); +#4270=IFCSIMPLEPROPERTYTEMPLATE('2$vV9Derf63gP7EBJ9Vtbb',$,'NumberOfSlots','Indicates the number of slots.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4271=IFCSIMPLEPROPERTYTEMPLATE('3RjkTcVHn3ARs3tNzVa0am',$,'NumberOfUnits','Indicates the number of vertical units.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4272=IFCSIMPLEPROPERTYTEMPLATE('1ey91kTZf0g9NvKg07nHOm',$,'NumberOfOccupiedUnits','Indicates the number of vertical units occupied by the equipment.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4273=IFCPROPERTYSETTEMPLATE('26Z$zGAfP41eG700H3yhCB',$,'Pset_SystemFurnitureElementTypeWorkSurface','A set of specific properties for work surfaces used in workstations. HISTORY: First issued in IFC Release R1.5. Renamed from Pset_Worksurface',.PSET_TYPEDRIVENOVERRIDE.,'IfcSystemFurnitureElement/WORKSURFACE,IfcSystemFurnitureElementType/WORKSURFACE',(#4274,#4275,#4277,#4278,#4279)); +#4274=IFCSIMPLEPROPERTYTEMPLATE('1GdpXCgz95OQt8v5HPWCk0',$,'UsePurpose','The principal purpose for which the work surface is intended to be used e.g. writing/reading, computer, meeting, printer, reference files, etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4275=IFCSIMPLEPROPERTYTEMPLATE('3ocl1HIvT0of9xTGjxt7zx',$,'SupportType','Available support types from which that required may be selected.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4276,$,$,$,.READWRITE.); +#4276=IFCPROPERTYENUMERATION('PEnum_FurniturePanelType',(IFCLABEL('ACOUSTICAL'),IFCLABEL('DOOR'),IFCLABEL('ENDS'),IFCLABEL('GLAZED'),IFCLABEL('HORZ_SEG'),IFCLABEL('MONOLITHIC'),IFCLABEL('OPEN'),IFCLABEL('SCREEN'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4277=IFCSIMPLEPROPERTYTEMPLATE('2gBq_43vf0WO1c1xBJvwfO',$,'HangingHeight','The hanging height of the worksurface.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4278=IFCSIMPLEPROPERTYTEMPLATE('0i_gj1YAf2lQ8aquVsqqWX',$,'NominalThickness','The nominal thickness of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4279=IFCSIMPLEPROPERTYTEMPLATE('0Wfz15Fjf0YhZy1FqY5T1k',$,'ShapeDescription','A description of the shape of the work surface e.g. corner square, rectangle, etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4280=IFCPROPERTYSETTEMPLATE('1LJxpG8ob0w891TBrzkqIP',$,'Pset_TankOccurrence','Properties that relate to a tank. Note that a partial tank may be considered as a compartment within a compartmentalized tank.',.PSET_OCCURRENCEDRIVEN.,'IfcTank',(#4281,#4283,#4284)); +#4281=IFCSIMPLEPROPERTYTEMPLATE('3Zpu$kS$vADwQijWGR0dVv',$,'TankComposition','Defines the level of element composition where.COMPLEX: A set of elementary units aggregated together to fulfill the overall required purpose.\X2\000A\X0\ELEMENT: A single elementary unit that may exist of itself or as an aggregation of partial units..\X2\000A\X0\PARTIAL: A partial elementary unit.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4282,$,$,$,.READWRITE.); +#4282=IFCPROPERTYENUMERATION('PEnum_TankComposition',(IFCLABEL('COMPLEX'),IFCLABEL('ELEMENT'),IFCLABEL('PARTIAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4283=IFCSIMPLEPROPERTYTEMPLATE('2NMp6BTdH5m9Bauoo5qplK',$,'HasLadder','Indication of whether the tank is provided with a ladder (set TRUE) for access to the top. If no ladder is provided then value is set FALSE.Note: No indication is given of the type of ladder (gooseneck etc.)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4284=IFCSIMPLEPROPERTYTEMPLATE('3aEwQygIDFhe3GpgJud_$U',$,'HasVisualIndicator','Indication of whether the tank is provided with a visual indicator (set TRUE) that shows the water level in the tank. If no visual indicator is provided then value is set FALSE.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4285=IFCPROPERTYSETTEMPLATE('2gVPiM40j5x8KRtkCEar22',$,'Pset_TankTypeCommon','Common attributes of a tank type.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTank,IfcTankType',(#4286,#4287,#4289,#4291,#4293,#4294,#4295,#4296,#4297,#4298,#4299,#4301,#4303,#4304,#4305)); +#4286=IFCSIMPLEPROPERTYTEMPLATE('3BoyHYDRz4fxdHtBY$B_QT',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4287=IFCSIMPLEPROPERTYTEMPLATE('1KoK3cqVT87RPBcuOTAEwD',$,'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',$,#4288,$,$,$,.READWRITE.); +#4288=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4289=IFCSIMPLEPROPERTYTEMPLATE('037GrH1u5FvQKx5mo4aU10',$,'AccessType','Defines the types of access (or cover) to a tank that may be specified.Note that covers are generally specified for rectangular tanks. For cylindrical tanks, access will normally be via a manhole.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4290,$,$,$,.READWRITE.); +#4290=IFCPROPERTYENUMERATION('PEnum_TankAccessType',(IFCLABEL('LOOSECOVER'),IFCLABEL('MANHOLE'),IFCLABEL('NONE'),IFCLABEL('SECUREDCOVER'),IFCLABEL('SECUREDCOVERWITHMANHOLE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4291=IFCSIMPLEPROPERTYTEMPLATE('3Lh6zo2qn6_vSqbY0Z$FzO',$,'StorageType','Defines the general material category intended to be stored.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4292,$,$,$,.READWRITE.); +#4292=IFCPROPERTYENUMERATION('PEnum_TankStorageType',(IFCLABEL('FUEL'),IFCLABEL('ICE'),IFCLABEL('OIL'),IFCLABEL('POTABLEWATER'),IFCLABEL('RAINWATER'),IFCLABEL('WASTEWATER'),IFCLABEL('WATER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4293=IFCSIMPLEPROPERTYTEMPLATE('1CjqjgBQz8wRiSxwdhrMjj',$,'NominalLengthOrDiameter','The nominal length or, in the case of a vertical cylindrical tank, the nominal diameter of the tank.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4294=IFCSIMPLEPROPERTYTEMPLATE('2Tt06yCmD56eDP6Pn26hxf',$,'NominalWidthOrDiameter','The nominal width or, in the case of a horizontal cylindrical tank, the nominal diameter of the tank.Note: Not required for a vertical cylindrical tank.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4295=IFCSIMPLEPROPERTYTEMPLATE('0IwZvw3Pz3lf5B0Y3fq9ZR',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4296=IFCSIMPLEPROPERTYTEMPLATE('1efZr5W795uxxv1$0KHd48',$,'TankNominalCapacity','The total nominal or design volumetric capacity of the tank.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#4297=IFCSIMPLEPROPERTYTEMPLATE('2Abj1mfX9Fr9H0CKhQ$kMZ',$,'EffectiveCapacity','The total effective or actual volumetric capacity of the tank.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#4298=IFCSIMPLEPROPERTYTEMPLATE('0GEtpf_Fz8oAeG86f3AuBc',$,'OperatingWeight','Operating weight of the tank including all of its contents.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#4299=IFCSIMPLEPROPERTYTEMPLATE('1zcGQXQ8n8GxcPHBSEL06Z',$,'PatternType','Defines the types of pattern (or shape of a tank that may be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4300,$,$,$,.READWRITE.); +#4300=IFCPROPERTYENUMERATION('PEnum_TankPatternType',(IFCLABEL('HORIZONTALCYLINDER'),IFCLABEL('RECTANGULAR'),IFCLABEL('VERTICALCYLINDER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4301=IFCSIMPLEPROPERTYTEMPLATE('0Z5FuHqw1F7BGs0$_r3bcv',$,'EndShapeType','Defines the types of end shapes that can be used for preformed tanks. The convention for reading these enumerated values is that for a vertical cylinder, the first value is the base and the second is the top; for a horizontal cylinder, the order of reading should be left to right. For a speherical tank, the value UNSET should be used.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4302,$,$,$,.READWRITE.); +#4302=IFCPROPERTYENUMERATION('PEnum_EndShapeType',(IFCLABEL('CONCAVECONVEX'),IFCLABEL('CONCAVEFLAT'),IFCLABEL('CONVEXCONVEX'),IFCLABEL('FLATCONVEX'),IFCLABEL('FLATFLAT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4303=IFCSIMPLEPROPERTYTEMPLATE('0cxy9eYlD7OR2GdhKRl$l7',$,'FirstCurvatureRadius','FirstCurvatureRadius should be defined as the base or left side radius of curvature value.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4304=IFCSIMPLEPROPERTYTEMPLATE('2odcYQlqTCOReAEolQ44DI',$,'SecondCurvatureRadius','SecondCurvatureRadius should be defined as the top or right side radius of curvature value.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4305=IFCSIMPLEPROPERTYTEMPLATE('0oPlt0MPX81RllrdTjII6$',$,'NumberOfSections','Number of sections.\X2\000A000A\X0\Number of sections used in the construction of the tank. Default is 1.Note: All sections assumed to be the same size.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4306=IFCPROPERTYSETTEMPLATE('3tw7pmmhDAiuxUFohNAqZF',$,'Pset_TankTypeExpansion','Common attributes of an expansion type tank.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTank/EXPANSION,IfcTankType/EXPANSION',(#4307,#4308,#4309)); +#4307=IFCSIMPLEPROPERTYTEMPLATE('07bVjyy7bD_Od5lCZcD4iC',$,'ChargePressure','Nominal or design operating pressure of the tank.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4308=IFCSIMPLEPROPERTYTEMPLATE('0xWsg_Jdz1oR6O_aFlky7R',$,'PressureRegulatorSetting','Pressure that is automatically maintained in the tank.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4309=IFCSIMPLEPROPERTYTEMPLATE('0toZPNTkD6xRPScYfKfoZG',$,'ReliefValveSetting','Pressure at which the relief valve activates.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4310=IFCPROPERTYSETTEMPLATE('22YUwP_0j1$92QaSwWBBM2',$,'Pset_TankTypePreformed','Fixed vessel manufactured as a single unit with one or more compartments for storing a liquid.Pset renamed from Pset_TankTypePreformedTank to Pset_TankTypePreformed in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTank,IfcTankType',(#4311,#4313,#4315,#4316)); +#4311=IFCSIMPLEPROPERTYTEMPLATE('0PX4fROXvEfAuehsChSiVx',$,'PatternType','Defines the types of pattern (or shape of a tank that may be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4312,$,$,$,.READWRITE.); +#4312=IFCPROPERTYENUMERATION('PEnum_TankPatternType',(IFCLABEL('HORIZONTALCYLINDER'),IFCLABEL('RECTANGULAR'),IFCLABEL('VERTICALCYLINDER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4313=IFCSIMPLEPROPERTYTEMPLATE('0NGf7FexL6ER18XUK5nDEV',$,'EndShapeType','Defines the types of end shapes that can be used for preformed tanks. The convention for reading these enumerated values is that for a vertical cylinder, the first value is the base and the second is the top; for a horizontal cylinder, the order of reading should be left to right. For a speherical tank, the value UNSET should be used.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4314,$,$,$,.READWRITE.); +#4314=IFCPROPERTYENUMERATION('PEnum_EndShapeType',(IFCLABEL('CONCAVECONVEX'),IFCLABEL('CONCAVEFLAT'),IFCLABEL('CONVEXCONVEX'),IFCLABEL('FLATCONVEX'),IFCLABEL('FLATFLAT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4315=IFCSIMPLEPROPERTYTEMPLATE('2O5e1O8lvFnP_bRXRBubf3',$,'FirstCurvatureRadius','FirstCurvatureRadius should be defined as the base or left side radius of curvature value.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4316=IFCSIMPLEPROPERTYTEMPLATE('1g0AD_K05Eru0GQBRSfTBk',$,'SecondCurvatureRadius','SecondCurvatureRadius should be defined as the top or right side radius of curvature value.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4317=IFCPROPERTYSETTEMPLATE('31bK1T_I1FHut8nEmWkPBT',$,'Pset_TankTypePressureVessel','Common attributes of a pressure vessel.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTank/PRESSUREVESSEL,IfcTankType/PRESSUREVESSEL',(#4318,#4319,#4320)); +#4318=IFCSIMPLEPROPERTYTEMPLATE('1e3aYfBf527vdl93G2heZM',$,'ChargePressure','Nominal or design operating pressure of the tank.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4319=IFCSIMPLEPROPERTYTEMPLATE('1CCkXJGzvCFAoPOAI9f2r4',$,'PressureRegulatorSetting','Pressure that is automatically maintained in the tank.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4320=IFCSIMPLEPROPERTYTEMPLATE('0xh5gGWQn8If$i0rihTkwR',$,'ReliefValveSetting','Pressure at which the relief valve activates.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4321=IFCPROPERTYSETTEMPLATE('1mETyovUr5bRjoMfMLb9lc',$,'Pset_TankTypeSectional','Fixed vessel constructed from sectional parts with one or more compartments for storing a liquid.Note (1): All sectional construction tanks are considered to be rectangular by default.\X2\000A\X0\Note (2): Generally, it is not expected that sectional construction tanks will be used for the purposes of gas storage.Pset renamed from Pset_TankTypeSectionalTank to Pset_TankTypeSectional in IFC2x2 Pset Addendum.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTank,IfcTankType',(#4322,#4323,#4324)); +#4322=IFCSIMPLEPROPERTYTEMPLATE('2jk4uMIxrD48uxGjORO4_2',$,'NumberOfSections','Number of sections.\X2\000A000A\X0\Number of sections used in the construction of the tankNote: All sections assumed to be the same size.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4323=IFCSIMPLEPROPERTYTEMPLATE('3bP66LqnHDHO7lvarNLYOQ',$,'SectionLength','The length of a section used in the construction of the tank.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4324=IFCSIMPLEPROPERTYTEMPLATE('1yp0osYcbEjeV9gutbXO23',$,'SectionWidth','The width of a section used in the construction of the tank.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4325=IFCPROPERTYSETTEMPLATE('2mvbIqP$P06QNwnO3LViZ2',$,'Pset_TelecomCableGeneral','Properties common to occurrences and types of IfcCableSegment and IfcCableFitting applied in telecommunication domain.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCableFitting,IfcCableSegment,IfcCableFittingType,IfcCableSegmentType',(#4326,#4327,#4328,#4329,#4330,#4331,#4333)); +#4326=IFCSIMPLEPROPERTYTEMPLATE('35stiNH7LBRwiScOUZekjE',$,'Attenuation','Indicates the optical or electrical attenuation of the cable measured in dB, at a certain wavelength or frequency, changing with the length of the cable.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#4327=IFCSIMPLEPROPERTYTEMPLATE('36oGDKeFLBxgeRYr9qKvld',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4328=IFCSIMPLEPROPERTYTEMPLATE('3fUE9RWiL9Af_8vYVxkJ2B',$,'IsFireResistant','Indicates whether the cable is fire resistant.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4329=IFCSIMPLEPROPERTYTEMPLATE('3ofv3QNV98zfLkMHd099tJ',$,'NominalDiameter','Nominal diameter or width of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4330=IFCSIMPLEPROPERTYTEMPLATE('2JDal8NonEv87aJJgB_gXC',$,'JacketColour','Indicates the colour of the cable or fitting jacket.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4331=IFCSIMPLEPROPERTYTEMPLATE('2l_WsY62L5relo6Mj9WXlh',$,'CableFunctionType','Distinguishes between Telecom and Power Supply cables.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4332,$,$,$,.READWRITE.); +#4332=IFCPROPERTYENUMERATION('PEnum_CableFunctionType',(IFCLABEL('POWERSUPPLY'),IFCLABEL('TELECOMMUNICATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4333=IFCSIMPLEPROPERTYTEMPLATE('2t11z6JXT05wmvTgGRwU7Y',$,'CableArmourType','The armour type of the cable for mechanical protection.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4334,$,$,$,.READWRITE.); +#4334=IFCPROPERTYENUMERATION('PEnum_CableArmourType',(IFCLABEL('DIELECTRIC'),IFCLABEL('METALLIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4335=IFCPROPERTYSETTEMPLATE('3x7lOhZgj9ShZoKDbtfBhM',$,'Pset_ThermalLoad','Properties for thermal loads of elements.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSpatialElement,IfcSpatialElementType',(#4336,#4337,#4338,#4339,#4340,#4341,#4342,#4343,#4344,#4345,#4346,#4347,#4348)); +#4336=IFCSIMPLEPROPERTYTEMPLATE('08v3T8HyL1NAtNXZX1L3Ts',$,'OccupancyDiversity','Diversity factor that may be applied to the number of people in the space.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4337=IFCSIMPLEPROPERTYTEMPLATE('3eGaJHl0bDsO55okunGrMP',$,'LightingDiversity','Lighting diversity.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4338=IFCSIMPLEPROPERTYTEMPLATE('1YT0xxj8H7vgsPu6gC3jFg',$,'ApplianceDiversity','Diversity of appliance load.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4339=IFCSIMPLEPROPERTYTEMPLATE('3y0F7kLKDFi88gjgt19Iqe',$,'OutsideAirPerPerson','Design quantity of outside air to be provided per person in the space.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#4340=IFCSIMPLEPROPERTYTEMPLATE('39urscJ9XEe9XE$GVsL3Eb',$,'ReceptacleLoadIntensity','Average power use intensity of appliances and other non-HVAC equipment in the space per unit area.(PowerMeasure/IfcAreaMeasure).',.P_SINGLEVALUE.,'IfcHeatFluxDensityMeasure',$,$,$,$,$,.READWRITE.); +#4341=IFCSIMPLEPROPERTYTEMPLATE('29i$ocSgz7$9ChSv0$HzEp',$,'AppliancePercentLoadToRadiant','Percent of sensible load to radiant heat.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4342=IFCSIMPLEPROPERTYTEMPLATE('0ikRRQ6Wv2DvyTkK1oWrLg',$,'LightingLoadIntensity','Average lighting load intensity in the space per unit area (PowerMeasure/IfcAreaMeasure).',.P_SINGLEVALUE.,'IfcHeatFluxDensityMeasure',$,$,$,$,$,.READWRITE.); +#4343=IFCSIMPLEPROPERTYTEMPLATE('25uOx49q17uf$pOLL3fHNB',$,'LightingPercentLoadToReturnAir','Percent of lighting load to the return air plenum.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4344=IFCSIMPLEPROPERTYTEMPLATE('0pO4ouhJjFgeeu4XSSjEhk',$,'TotalCoolingLoad','The peak total cooling load for the building, zone or space.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4345=IFCSIMPLEPROPERTYTEMPLATE('0x6KTjPvv6Aha6qhTBWFd9',$,'TotalHeatingLoad','The peak total heating load for the building, zone or space.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4346=IFCSIMPLEPROPERTYTEMPLATE('1_BXpBefbDJgaxMZT0yDcK',$,'InfiltrationDiversitySummer','Diversity factor for Summer infiltration.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4347=IFCSIMPLEPROPERTYTEMPLATE('1aFrcm6h9BUxMTe20oyFel',$,'InfiltrationDiversityWinter','Diversity factor for Winter infiltration.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4348=IFCSIMPLEPROPERTYTEMPLATE('2EAb_YR6D9Ggyi2617AuV9',$,'LoadSafetyFactor','Load safety factor.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4349=IFCPROPERTYSETTEMPLATE('06sB9bjAf0K8KdxSTFbQvu',$,'Pset_TicketProcessing','Properties for indicating performance ratings for ticket processing of entry elements (e.g. turnstile, boom barrier).',.PSET_TYPEDRIVENOVERRIDE.,'IfcDoor/BOOM_BARRIER,IfcDoor/TURNSTILE,IfcDoorType/BOOM_BARRIER,IfcDoorType/TURNSTILE',(#4350,#4351)); +#4350=IFCSIMPLEPROPERTYTEMPLATE('1JbKI4SgL2vQqq1Lb88ToA',$,'TicketProcessingTime','Indicates the processing time of a ticket.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#4351=IFCSIMPLEPROPERTYTEMPLATE('2h6AFRLu57FxOFVA8kYjQp',$,'TicketStuckRatio','Indicates the ratio of tickets being stuck or jammed in the appliance.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4352=IFCPROPERTYSETTEMPLATE('3vM4G$$QP7ofNGLr4jVums',$,'Pset_TicketVendingMachine','Properties of ticket vending machine. The property set can be used by IfcElectricAppliance with PredefinedType VENDINGMACHINE.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElectricAppliance/VENDINGMACHINE,IfcElectricApplianceType/VENDINGMACHINE',(#4353,#4354,#4355,#4357,#4358,#4360)); +#4353=IFCSIMPLEPROPERTYTEMPLATE('0nn3S35E5AIRx4_y38VHnt',$,'TicketStuckRatio','Indicates the ratio of tickets being stuck or jammed in the appliance.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4354=IFCSIMPLEPROPERTYTEMPLATE('0VtNAv4JH6wRgkUVjL8$JZ',$,'MoneyStuckRatio','Indicates the ratio of money being stuck or jammed in appliance.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4355=IFCSIMPLEPROPERTYTEMPLATE('3JM$XZBy52zxDLbC_btSbv',$,'PaymentMethod','Indicates the vending machine payment method.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4356,$,$,$,.READWRITE.); +#4356=IFCPROPERTYENUMERATION('PEnum_PaymentMethod',(IFCLABEL('CARD'),IFCLABEL('CASH'),IFCLABEL('E_PAYMENT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4357=IFCSIMPLEPROPERTYTEMPLATE('0r2sSrAafET81IrmeCMYlb',$,'TicketProductionSpeed','Indicates the production speed of the ticket. It is measured by counting the number of tickets that can be produced per hour.',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); +#4358=IFCSIMPLEPROPERTYTEMPLATE('2aZlVtHgD57wwpmK2de5X3',$,'TicketVendingMachineType','Indicates the type of ticket vending machine.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4359,$,$,$,.READWRITE.); +#4359=IFCPROPERTYENUMERATION('PEnum_TicketVendingMachineType',(IFCLABEL('TICKETREDEMPTIONMACHINE'),IFCLABEL('TICKETREFUNDINGMACHINE'),IFCLABEL('TICKETVENDINGMACHINE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4360=IFCSIMPLEPROPERTYTEMPLATE('0_dM1rln97mPgIp3BqOqfc',$,'VendingMachineUserInterface','Indicates the type of vending machine user interface.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4361,$,$,$,.READWRITE.); +#4361=IFCPROPERTYENUMERATION('PEnum_VendingMachineUserInterface',(IFCLABEL('MOUSECHOOSETYPE'),IFCLABEL('TOUCHSCREEN'),IFCLABEL('TOUCH_TONE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4362=IFCPROPERTYSETTEMPLATE('1D43V$VJr5Cw$r5CSgbC$z',$,'Pset_Tiling','Properties about tiles.',.PSET_TYPEDRIVENOVERRIDE.,'IfcPavement,IfcCovering,IfcPavementType,IfcCoveringType',(#4363,#4364,#4365)); +#4363=IFCSIMPLEPROPERTYTEMPLATE('35OVpXVybDzAQYlxC5qDYv',$,'Permeability','Ratio of the permeability of the ceiling.\X2\000A\X0\The ration can be used to indicate an open ceiling (that enables identification of whether ceiling construction should be considered as impeding distribution of sprinkler water, light etc. from installations within the ceiling area).',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#4364=IFCSIMPLEPROPERTYTEMPLATE('3tVk3xaqP3G9Xr3f_66L3z',$,'TileLength','Length of ceiling tiles. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4365=IFCSIMPLEPROPERTYTEMPLATE('1bbBNuWnrEtBPqwrQNlwKC',$,'TileWidth','Width of ceiling tiles. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4366=IFCPROPERTYSETTEMPLATE('2YNsgxY0H6qB0B7j4eobwx',$,'Pset_Tolerance','Properties expressing the tolerance relating to locating and shaping of an intended element or feature. Range diameters are non-negative describing a linear, rectangular or boxed region .',.PSET_TYPEDRIVENOVERRIDE.,'IfcProduct,IfcTypeProduct',(#4367,#4368,#4370,#4371,#4372,#4373,#4374,#4375,#4376,#4377,#4378,#4379,#4380,#4381,#4382,#4383,#4384,#4385)); +#4367=IFCSIMPLEPROPERTYTEMPLATE('2HHu$xJXb8tA7LAeiq4a2a',$,'ToleranceDescription','General description of the tolerance associated to the element or feature, its source and implications.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#4368=IFCSIMPLEPROPERTYTEMPLATE('2HxsJpnGz7OvFVzGYOqt4c',$,'ToleranceBasis','Indication of the basis of the tolerance requirement',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4369,$,$,$,.READWRITE.); +#4369=IFCPROPERTYENUMERATION('PEnum_ToleranceBasis',(IFCLABEL('APPEARANCE'),IFCLABEL('ASSEMBLY'),IFCLABEL('DEFLECTION'),IFCLABEL('EXPANSION'),IFCLABEL('FUNCTIONALITY'),IFCLABEL('SETTLEMENT'),IFCLABEL('STRUCTURAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4370=IFCSIMPLEPROPERTYTEMPLATE('31Icu3Ud96iRLBv11Y7CaK',$,'OverallTolerance','Indicative (95%-100%) range tolerance associated to the intended shape and position in XYZ.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4371=IFCSIMPLEPROPERTYTEMPLATE('3JnG62M1P8IuGHdu6kj$yN',$,'HorizontalTolerance','Indicative (95%-100%) range tolerance associated to the horizontal shape and position in X, if different to the overall tolerance.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4372=IFCSIMPLEPROPERTYTEMPLATE('13w2dFNq582hiOm8gXJ6wA',$,'OrthogonalTolerance','Indicative (95%-100%) range tolerance associated to the horizontal shape and position in Y, if different to the overall tolerance.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4373=IFCSIMPLEPROPERTYTEMPLATE('1AzSap7qH3s9xC56K_zCPF',$,'VerticalTolerance','Indicative (95%-100%) range tolerance associated to the vertical shape and position in Z, if different to the overall tolerance.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4374=IFCSIMPLEPROPERTYTEMPLATE('0ow1315sD7bwoNsgGfZx9e',$,'PlanarFlatness','Indicative (95%-100%) range flatness associated to the intended shape and position in XYZ.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4375=IFCSIMPLEPROPERTYTEMPLATE('1dMnp7O8TFNwS$8jyaqsP2',$,'HorizontalFlatness','Indicative (95%-100%) range flatness associated to the horizontal surface in XY, if different to the overall flatness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4376=IFCSIMPLEPROPERTYTEMPLATE('2N74Xam7b0KgDjKq89Jkw8',$,'ElevationalFlatness','Indicative (95%-100%) range flatness associated to the elevational surface in ZX, if different to the overall flatness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4377=IFCSIMPLEPROPERTYTEMPLATE('3z7uiedar3afMyy8vk0FGT',$,'SideFlatness','Indicative (95%-100%) range flatness associated to the side surface in YZ, if different to the overall flatness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4378=IFCSIMPLEPROPERTYTEMPLATE('3pXVEfJJPEJQlT4iQv$boc',$,'OverallOrthogonality','Indicative (95%-100%) range orthogonality associated to the intended shape and orientation in XYZ.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#4379=IFCSIMPLEPROPERTYTEMPLATE('09lL9gs7TCYw2HsZcoGvCR',$,'HorizontalOrthogonality','Indicative (95%-100%) range orthogonality associated to the horizontal shape and orientation in X, if different to the overall orthogonality.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#4380=IFCSIMPLEPROPERTYTEMPLATE('1hld3GvXP8Q9OLT34F9ZiT',$,'OrthogonalOrthogonality','Indicative (95%-100%) range orthogonality associated to the horizontal shape and orientation in Y, if different to the overall orthogonality.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#4381=IFCSIMPLEPROPERTYTEMPLATE('3avoHm$Zv1O9EpNqcxu5so',$,'VerticalOrthogonality','Indicative (95%-100%) range orthogonality associated to the vertical shape and orientation in Z, if different to the overall orthogonality.',.P_SINGLEVALUE.,'IfcPlaneAngleMeasure',$,$,$,$,$,.READWRITE.); +#4382=IFCSIMPLEPROPERTYTEMPLATE('1IGfUveu1FNPu1LIgElYo9',$,'OverallStraightness','Indicative (95%-100%) range straightness associated to the intended shape.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4383=IFCSIMPLEPROPERTYTEMPLATE('1ZGwfNBFv9VegY6ClIvPys',$,'HorizontalStraightness','Indicative (95%-100%) range straightness associated to the horizontal shape in X, if different to the overall straightness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4384=IFCSIMPLEPROPERTYTEMPLATE('3jQIdqxnHCpueQOS$n1DzK',$,'OrthogonalStraightness','Indicative (95%-100%) range straightness associated to the horizontal shape in Y, if different to the overall straightness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4385=IFCSIMPLEPROPERTYTEMPLATE('3JZtMAmsD08OK4rTcqksbt',$,'VerticalStraightness','Indicative (95%-100%) range straightness associated to the vertical shape in Z, if different to the overall straightness.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4386=IFCPROPERTYSETTEMPLATE('3i_RHtwov52eLYCBtE9dNY',$,'Pset_TrackBase','Properties in this property set are applicable for IfcSlab with PredefinedType BASESLAB, indicated that the base slab is a track base slab.',.PSET_TYPEDRIVENOVERRIDE.,'IfcSlab/BASESLAB,IfcSlabType/BASESLAB',(#4387,#4388)); +#4387=IFCSIMPLEPROPERTYTEMPLATE('2oTazFKjXEJAqn69$djHFo',$,'IsSurfaceGalling','Indicates whether the surface is galling or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4388=IFCSIMPLEPROPERTYTEMPLATE('3F8hOJgln9yPXQyLCh2MEa',$,'SurfaceGallingArea','The galling area of the object surface.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#4389=IFCPROPERTYSETTEMPLATE('1OPgwBNyHCCwXnpHqeHp5G',$,'Pset_TrackElementOccurrenceSleeper','Properties common to the definition to all occurrences of IfcTrackElement with PredefinedType set to SLEEPER.',.PSET_OCCURRENCEDRIVEN.,'IfcTrackElement/SLEEPER',(#4390,#4391,#4392,#4394)); +#4390=IFCSIMPLEPROPERTYTEMPLATE('1JjMRpSQ1BfxJ5_nNww_JY',$,'HasSpecialEquipment','Indicates whether the sleeper has any special equipment for fastening components (e.g. Balise, signum magnet) or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4391=IFCSIMPLEPROPERTYTEMPLATE('2xlmIh0vb7DRsS0cVsqOMF',$,'SequenceInTrackPanel','Sequence of the sleeper within the track panel.',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.); +#4392=IFCSIMPLEPROPERTYTEMPLATE('1Nl4EAJkr35gm2qQco4eF9',$,'UnderSleeperPadStiffness','Indicates the stiffness of the under-sleeper pad as design reference for the sleeper.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4393,$,$,$,.READWRITE.); +#4393=IFCPROPERTYENUMERATION('PEnum_UnderSleeperPadStiffness',(IFCLABEL('MEDIUM'),IFCLABEL('SOFT'),IFCLABEL('STIFF'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4394=IFCSIMPLEPROPERTYTEMPLATE('3LkfLHjuz5WOU1MNHu09Y_',$,'IsContaminatedSleeper','Indicates whether the sleeper is contaminated and requires special disposal or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4395=IFCPROPERTYSETTEMPLATE('2Wxdda0pjBSvfO2DC8BLqc',$,'Pset_TrackElementPHistoryDerailer','Indicates derailer information over time for operation management.',.PSET_PERFORMANCEDRIVEN.,'IfcTrackElement/DERAILER',(#4396)); +#4396=IFCSIMPLEPROPERTYTEMPLATE('26TMOtZr1CzhoEwaKrkbxG',$,'IsDerailing','Indicates whether the derailer is on or not.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4397=IFCPROPERTYSETTEMPLATE('3Okj2xEfnFLhLHHJsOYGDT',$,'Pset_TrackElementTypeDerailer','Properties common to the definition to all occurrences and types of IfcTrackElement with PredefinedType set to DERAILER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTrackElement/DERAILER,IfcTrackElementType/DERAILER',(#4398,#4399,#4400,#4401)); +#4398=IFCSIMPLEPROPERTYTEMPLATE('22ZXb1IlfEye0qaxUmFQTg',$,'AppliedLineLoad','The load of line where the derailer is installed. It is a design parameter and is defined by mass per length.',.P_SINGLEVALUE.,'IfcMassPerLengthMeasure',$,$,$,$,$,.READWRITE.); +#4399=IFCSIMPLEPROPERTYTEMPLATE('3jzbsbH$16X96Ak3hfsVeb',$,'DerailmentMaximumSpeedLimit','Indicates the maximum allowable train speed for the derailer.',.P_SINGLEVALUE.,'IfcLinearVelocityMeasure',$,$,$,$,$,.READWRITE.); +#4400=IFCSIMPLEPROPERTYTEMPLATE('08AOH5UszF_9nR1ANdqn0g',$,'DerailmentWheelDiameter','Indicates the wheel diameter requirement for the derailer.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4401=IFCSIMPLEPROPERTYTEMPLATE('1kPr3qmhPBAR8W5MSeZV7u',$,'DerailmentHeight','Height of derailment block when derailer in protection state.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4402=IFCPROPERTYSETTEMPLATE('2BC7REWjv94Ak1xe6jqwup',$,'Pset_TrackElementTypeSleeper','Properties common to the definition to all occurrences and types of IfcTrackElement with PredefinedType set to SLEEPER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTrackElement/SLEEPER,IfcTrackElementType/SLEEPER',(#4403,#4405,#4407,#4408,#4409,#4410,#4411,#4412)); +#4403=IFCSIMPLEPROPERTYTEMPLATE('3Cw_1EOFz6QBwfygDSfOBA',$,'InstalledCondition','Assessment of the condition of the element at point of installation.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4404,$,$,$,.READWRITE.); +#4404=IFCPROPERTYENUMERATION('PEnum_InstalledCondition',(IFCLABEL('NEW'),IFCLABEL('REGENERATED'),IFCLABEL('REUSED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4405=IFCSIMPLEPROPERTYTEMPLATE('0fhgCs0Sn8XOUqbac4TZcT',$,'SleeperType','Indicates the sleeper type.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4406,$,$,$,.READWRITE.); +#4406=IFCPROPERTYENUMERATION('PEnum_SleeperType',(IFCLABEL('COMPOSITESLEEPER'),IFCLABEL('CONCRETESLEEPER'),IFCLABEL('INSULATEDSTEELSLEEPER'),IFCLABEL('MONOBLOCKCONCRETESLEEPER'),IFCLABEL('NOTINSULATEDSTEELSLEEPER'),IFCLABEL('TWOBLOCKCONCRETESLEEPER'),IFCLABEL('WOODENSLEEPER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4407=IFCSIMPLEPROPERTYTEMPLATE('1EW1q7QAL61Q_7D7fjnnjc',$,'TechnicalStandard','The technical standard which the element should comply with.',.P_REFERENCEVALUE.,'IfcExternalReference',$,$,$,$,$,.READWRITE.); +#4408=IFCSIMPLEPROPERTYTEMPLATE('06kiLtjjb2u91kNuFHzrcA',$,'FasteningType','Indicates the type of fastening used to generate traction between the foot of the rail and the sleeper. It depends on but is not uniquely identified by the type of sleeper. This property shall only be used when sleeper fastening is not modelled as an element.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4409=IFCSIMPLEPROPERTYTEMPLATE('3UwG75xIj9d9OLjHUJ3KPm',$,'IsElectricallyInsulated','Indicates whether the sleeper is electrically insulated due to its design or the running rails or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4410=IFCSIMPLEPROPERTYTEMPLATE('1ZRb1ti5f8YxBPkIvYNgu5',$,'HollowSleeperUsage','Indicates the purpose of using hollow sleeper. The possible value can be eg. cable trenching, protection of turnout mechanism, etc.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4411=IFCSIMPLEPROPERTYTEMPLATE('0AbmXZMKLE0xH41ozIBYx8',$,'NumberOfTrackCenters','Indicates the number of track centers running over the sleepers.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4412=IFCSIMPLEPROPERTYTEMPLATE('1ea5wjoGb1KhszpndOR5nu',$,'IsHollowSleeper','Indicates whether the sleeper is hollowed or not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4413=IFCPROPERTYSETTEMPLATE('06kC866P524QrWU4cptyvv',$,'Pset_TractionPowerSystem','Properties of a traction power system. The property is associated to the predefined type ELECTRICAL of IfcDistributionSystem, and is used to characterise systems such as railway electrical distribution networks used to provide energy for rolling stock.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionSystem/ELECTRICAL',(#4414,#4416,#4418,#4419)); +#4414=IFCSIMPLEPROPERTYTEMPLATE('1Uw73OfH5DMgar9RJIqz9G',$,'PowerSupplyMode','Power supply mode of the equipment or system.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4415,$,$,$,.READWRITE.); +#4415=IFCPROPERTYENUMERATION('PEnum_PowerSupplyMode',(IFCLABEL('AC'),IFCLABEL('DC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4416=IFCSIMPLEPROPERTYTEMPLATE('3L4mynupLF7O4rxaxSc62a',$,'ElectrificationType','Indicates the type of railway electrification.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4417,$,$,$,.READWRITE.); +#4417=IFCPROPERTYENUMERATION('PEnum_ElectrificationType',(IFCLABEL('AC'),IFCLABEL('DC'),IFCLABEL('NON_ELECTRIFIED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4418=IFCSIMPLEPROPERTYTEMPLATE('339oSlpV55MxgirvU$OFjJ',$,'RatedFrequency','Frequency of the AC electric power supply when the device or system reaches its optimum operating condition.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#4419=IFCSIMPLEPROPERTYTEMPLATE('0vrZdFxATFMxyH7HSs2ttg',$,'NominalVoltage','The optimum voltage for the electrical appliance or system.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4420=IFCPROPERTYSETTEMPLATE('3GskYZt2z7EvqctAmstNvq',$,'Pset_TrafficCalmingDeviceCommon','Properties for a traffic calming device.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElementAssembly/TRAFFIC_CALMING_DEVICE,IfcElementAssemblyType/TRAFFIC_CALMING_DEVICE',(#4421)); +#4421=IFCSIMPLEPROPERTYTEMPLATE('1LWMUGpsr3sQLIhnNzy$Fe',$,'TypeDesignation','Type designator for the element. The content depends on local standards. Eg. ''Bull nose'', ''Half batter'', ''Dropper'', ''Chamfer'' etc',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4422=IFCPROPERTYSETTEMPLATE('32MdMDX8XADwdG7XWHZTtn',$,'Pset_TransformerTypeCommon','An inductive stationary device that transfers electrical energy from one circuit to another.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTransformer,IfcTransformerType',(#4423,#4424,#4426,#4427,#4428,#4429,#4430,#4431,#4432,#4433,#4434,#4435,#4437,#4438,#4439,#4440,#4442,#4443)); +#4423=IFCSIMPLEPROPERTYTEMPLATE('151cT0PLX8_uijWnueWZzu',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4424=IFCSIMPLEPROPERTYTEMPLATE('3s6h0BeRfBe9vGj7ywUJB3',$,'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',$,#4425,$,$,$,.READWRITE.); +#4425=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4426=IFCSIMPLEPROPERTYTEMPLATE('2GSIzOZ016Fx2f3K9yr82C',$,'PrimaryVoltage','The voltage that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4427=IFCSIMPLEPROPERTYTEMPLATE('0AM$DbarT4_RKhpbS0KcB$',$,'SecondaryVoltage','The voltage that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4428=IFCSIMPLEPROPERTYTEMPLATE('16TPTtcK15sPdNrnkY_uIj',$,'PrimaryCurrent','The current that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#4429=IFCSIMPLEPROPERTYTEMPLATE('36kB795rD1NO_sPpyRUCs5',$,'SecondaryCurrent','The current that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#4430=IFCSIMPLEPROPERTYTEMPLATE('3Nk44JqNz71BMcYLhz4h50',$,'PrimaryFrequency','The frequency that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#4431=IFCSIMPLEPROPERTYTEMPLATE('2Kc77m2Ur0Txsv6$uAJNw$',$,'SecondaryFrequency','The frequency that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#4432=IFCSIMPLEPROPERTYTEMPLATE('3mj4cEuJHElQSqq$oIlLke',$,'PrimaryApparentPower','The power in VA (volt ampere) that has been transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4433=IFCSIMPLEPROPERTYTEMPLATE('32Y9EKlrX7ggvykmq0CFQu',$,'SecondaryApparentPower','The power in VA (volt ampere) that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4434=IFCSIMPLEPROPERTYTEMPLATE('0KtV7t3G5EIOrSN$MlsEuR',$,'MaximumApparentPower','Maximum apparent power/capacity in VA (volt ampere).',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4435=IFCSIMPLEPROPERTYTEMPLATE('3zC$W7XUbC6RiCI9mR6u1f',$,'SecondaryCurrentType','A list of the secondary current types that can result from transformer output.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4436,$,$,$,.READWRITE.); +#4436=IFCPROPERTYENUMERATION('PEnum_SecondaryCurrentType',(IFCLABEL('AC'),IFCLABEL('DC'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4437=IFCSIMPLEPROPERTYTEMPLATE('07VYsggiP0RwlLPw7wh1hS',$,'ShortCircuitVoltage','A complex number that specifies the real and imaginary parts of the short-circuit voltage at rated current of a transformer given in %.',.P_SINGLEVALUE.,'IfcComplexNumber',$,$,$,$,$,.READWRITE.); +#4438=IFCSIMPLEPROPERTYTEMPLATE('3GL_r$d4b8Efg7MlM_NMyg',$,'RealImpedanceRatio','The ratio between the real part of the zero sequence impedance and the real part of the positive impedance (i.e. real part of the short-circuit voltage) of the transformer.\X2\000A\X0\Used for three-phase transformer which includes a N-conductor.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4439=IFCSIMPLEPROPERTYTEMPLATE('3xN4mr$5b0UebTmEhqoz5S',$,'ImaginaryImpedanceRatio','The ratio between the imaginary part of the zero sequence impedance and the imaginary part of the positive impedance (i.e. imaginary part of the short-circuit voltage) of the transformer.\X2\000A\X0\Used for three-phase transformer which includes a N-conductor.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4440=IFCSIMPLEPROPERTYTEMPLATE('2FensYE3TAcuU1DpiTlLm3',$,'TransformerVectorGroup','List of the possible vector groups for the transformer from which that required may be set. Values in the enumeration list follow a standard international code where the first letter describes how the primary windings are connected,\X2\000A\X0\the second letter describes how the secondary windings are connected, and the numbers describe the rotation of voltages and currents from the primary to the secondary side in multiples of 30 degrees.D: means that the windings are delta-connected.\X2\000A\X0\Y: means that the windings are star-connected.\X2\000A\X0\Z: means that the windings are zig-zag connected (a special start-connected providing low reactance of the transformer);\X2\000A\X0\The connectivity is only relevant for three-phase transformers.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4441,$,$,$,.READWRITE.); +#4441=IFCPROPERTYENUMERATION('PEnum_TransformerVectorGroup',(IFCLABEL('DD0'),IFCLABEL('DD6'),IFCLABEL('DY11'),IFCLABEL('DY5'),IFCLABEL('DZ0'),IFCLABEL('DZ6'),IFCLABEL('YD11'),IFCLABEL('YD5'),IFCLABEL('YY0'),IFCLABEL('YY6'),IFCLABEL('YZ11'),IFCLABEL('YZ5'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4442=IFCSIMPLEPROPERTYTEMPLATE('3_48WbwsvBhBlJa7_8VkxD',$,'IsNeutralPrimaryTerminalAvailable','An indication of whether the neutral point of the primary winding is available as a terminal (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4443=IFCSIMPLEPROPERTYTEMPLATE('22XXCi0XrDOuqshjCViKpj',$,'IsNeutralSecondaryTerminalAvailable','An indication of whether the neutral point of the secondary winding is available as a terminal (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4444=IFCPROPERTYSETTEMPLATE('2S30JOC8nFI8VfSAS3tPMJ',$,'Pset_TransitionSectionCommon','Properties for a transition section.',.PSET_OCCURRENCEDRIVEN.,'IfcEarthworksFill/TRANSITIONSECTION',(#4445)); +#4445=IFCSIMPLEPROPERTYTEMPLATE('30ncGAZnL2w8RNTrXgt9Kp',$,'NominalLength','The nominal overall length of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In case of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4446=IFCPROPERTYSETTEMPLATE('0M_UgXYIr8_vZfkKnX2p$v',$,'Pset_TransportElementCommon','Properties common to the definition of all occurrences of IfcTransportElement or IfcTransportElementType',.PSET_TYPEDRIVENOVERRIDE.,'IfcTransportationDevice,IfcTransportationDeviceType',(#4447,#4448,#4450,#4451,#4452)); +#4447=IFCSIMPLEPROPERTYTEMPLATE('190zApsK524eHUUpL8OPAM',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4448=IFCSIMPLEPROPERTYTEMPLATE('2P4NmU$rH9OhX0GOjDUfn4',$,'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',$,#4449,$,$,$,.READWRITE.); +#4449=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4450=IFCSIMPLEPROPERTYTEMPLATE('3kVg5czQXFnxJvSzldMJ3Y',$,'CapacityPeople','Capacity of the transportation element measured in numbers of person.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4451=IFCSIMPLEPROPERTYTEMPLATE('3dUxBho6f3dhMgLPUuA8Fp',$,'CapacityWeight','Capacity of the transport element measured by weight.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#4452=IFCSIMPLEPROPERTYTEMPLATE('1JViJoMtj69exJeVEvrK0S',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here whether the transport element (in case of e.g., a lift) is designed to serve as a fire exit, e.g., for fire escape purposes.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4453=IFCPROPERTYSETTEMPLATE('0E4xJcLL9FchD5Lk2xLj2j',$,'Pset_TransportElementElevator','Properties common to the definition of all occurrences of IfcTransportElement with the predefined type ="ELEVATOR"',.PSET_TYPEDRIVENOVERRIDE.,'IfcTransportElement/ELEVATOR,IfcTransportElementType/ELEVATOR',(#4454,#4455,#4456,#4457)); +#4454=IFCSIMPLEPROPERTYTEMPLATE('1WsiK5V4r6OBJVL1u4Y8Xi',$,'FireFightingLift','Indication whether the elevator is designed to serve as a fire fighting lift the case of fire (TRUE) or not (FALSE). A fire fighting lift is used by fire fighters to access the location of fire and to evacuate people.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4455=IFCSIMPLEPROPERTYTEMPLATE('0WIouzJc57K9X9pFd5cVdF',$,'ClearWidth','The clear width.\X2\000A000A\X0\It indicates the distance from the inner surfaces of the elevator car left and right from the elevator door.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4456=IFCSIMPLEPROPERTYTEMPLATE('3U9SkkXi94SgnZuevtdkPP',$,'ClearDepth','The clear depth.\X2\000A000A\X0\It indicates the distance from the inner surface of the elevator door to the opposite surface of the elevator car.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4457=IFCSIMPLEPROPERTYTEMPLATE('08wkC8stL29gZDWxZBG3Mk',$,'ClearHeight','Clear height of the object (elevator).\X2\000A\X0\The shape information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the shape properties, provided in the attached property, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4458=IFCPROPERTYSETTEMPLATE('165iSctzb6DemVF3WOPMIX',$,'Pset_TransportEquipmentOTN','Properties in this property set are applied to transport equipment that act in optical transport network (OTN) system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance/TRANSPORTEQUIPMENT,IfcCommunicationsApplianceType/TRANSPORTEQUIPMENT',(#4459,#4460,#4461,#4462,#4463,#4464,#4465)); +#4459=IFCSIMPLEPROPERTYTEMPLATE('3xB4bG6yLDQeNih3IXk3ys',$,'SingleChannelAveragePower','Indicates the average power of a single channel of the transport equipment.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4460=IFCSIMPLEPROPERTYTEMPLATE('2WEyvX6R1ABO_tfjKvzRyX',$,'ChromaticDispersionTolerance','Indicates the tolerance of the transport equipment chromatic dispersion. The value is defined by picosecond per nanometer (ps/nm).',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#4461=IFCSIMPLEPROPERTYTEMPLATE('0lsC9wY518pfG4WJGxp063',$,'SingleChannelPower','Indicates the power range of a single channel of the transport equipment.',.P_BOUNDEDVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4462=IFCSIMPLEPROPERTYTEMPLATE('3u$goNoTP4nRmFhl8_OHOF',$,'MinimumOpticalSignalToNoiseRatio','Indicates the minimum optical signal to noise ratio of the transport equipment.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4463=IFCSIMPLEPROPERTYTEMPLATE('2WymtB5Ib9T9umHkl37iKw',$,'PolarizationModeDispersionTolerance','Indicates the polarization mode dispersion tolerance of the transport equipment. It is usually measured by picosecond.',.P_SINGLEVALUE.,'IfcTimeMeasure',$,$,$,$,$,.READWRITE.); +#4464=IFCSIMPLEPROPERTYTEMPLATE('2Vnp9P9gjDvR6v$VZM$Nzp',$,'SingleWaveTransmissionRate','Indicates the single wave transmission rate of the transport equipment.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#4465=IFCSIMPLEPROPERTYTEMPLATE('2EQq75c7H0PgCdyYF9sLAz',$,'EquipmentCapacity','Indicates the equipment capacity of the appliance. The value is defined in bits/s.',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); +#4466=IFCPROPERTYSETTEMPLATE('0JeLdmK4X9EfzD6Jh3$itb',$,'Pset_TrenchExcavationCommon','Properties for a trench excavation.',.PSET_OCCURRENCEDRIVEN.,'IfcEarthworksCut/TRENCH',(#4467,#4468)); +#4467=IFCSIMPLEPROPERTYTEMPLATE('3qSZk9sjDDQ9gt8tam9viK',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4468=IFCSIMPLEPROPERTYTEMPLATE('0RtJhB$oL7jeEzGYsJKnD8',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4469=IFCPROPERTYSETTEMPLATE('04$JER3JzC$uc9zSnBYB1e',$,'Pset_TubeBundleTypeCommon','Tube bundle type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTubeBundle,IfcTubeBundleType',(#4470,#4471,#4473,#4474,#4475,#4476,#4477,#4478,#4479,#4480,#4481,#4482,#4483,#4484,#4485,#4486)); +#4470=IFCSIMPLEPROPERTYTEMPLATE('0PzPEBo_T16P6fjKscOnQX',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4471=IFCSIMPLEPROPERTYTEMPLATE('0uAC$c0Fr5$hpiG5ZdC8wy',$,'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',$,#4472,$,$,$,.READWRITE.); +#4472=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4473=IFCSIMPLEPROPERTYTEMPLATE('1CSs4aX9bEkQdFf_OaBcji',$,'NumberOfRows','Number of tube rows in the tube bundle assembly.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4474=IFCSIMPLEPROPERTYTEMPLATE('2GY1NHSTjAlxfMrA2kvK7L',$,'StaggeredRowSpacing','Staggered tube row spacing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4475=IFCSIMPLEPROPERTYTEMPLATE('3E4RvPEOf2Vx$eespZErs0',$,'InLineRowSpacing','In-line tube row spacing.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4476=IFCSIMPLEPROPERTYTEMPLATE('3zZRLfPQbAXvcfbqbcu_3N',$,'NumberOfCircuits','Number of circuits.\X2\000A000A\X0\Number of parallel fluid tube circuits.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4477=IFCSIMPLEPROPERTYTEMPLATE('03ZgfoYTDBs90ocWWNv_Nm',$,'FoulingFactor','Fouling factor of the tubes in the tube bundle.',.P_SINGLEVALUE.,'IfcThermalResistanceMeasure',$,$,$,$,$,.READWRITE.); +#4478=IFCSIMPLEPROPERTYTEMPLATE('1uPLQtjrfAbhLrULCkyQHh',$,'ThermalConductivity','The thermal conductivity of the object.',.P_SINGLEVALUE.,'IfcThermalConductivityMeasure',$,$,$,$,$,.READWRITE.); +#4479=IFCSIMPLEPROPERTYTEMPLATE('3ZBmBG1Gj75Qeu9h8NeMFr',$,'Length','The length of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4480=IFCSIMPLEPROPERTYTEMPLATE('0y4qWPmkX6EAQl2ChHHEnh',$,'Volume','Volume of the element.\X2\000A000A\X0\Total volume of fluid in the tubes and their headers.',.P_SINGLEVALUE.,'IfcVolumeMeasure',$,$,$,$,$,.READWRITE.); +#4481=IFCSIMPLEPROPERTYTEMPLATE('00pdDBcbH2A9Ns3C9EzKOl',$,'NominalDiameter','Nominal diameter or width of the object.\X2\000A000A\X0\Nominal diameter or width of the tubes in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4482=IFCSIMPLEPROPERTYTEMPLATE('1YVpjLzMj68Oj59GP5W66d',$,'OutsideDiameter','Actual outside diameter of the tube in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4483=IFCSIMPLEPROPERTYTEMPLATE('3q8$fqFi1EHxY_ndaH9W_X',$,'InsideDiameter','Actual inner diameter of the tube in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4484=IFCSIMPLEPROPERTYTEMPLATE('3GWlishhb5xetsXM9e24J6',$,'HorizontalSpacing','Horizontal spacing between tubes in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4485=IFCSIMPLEPROPERTYTEMPLATE('0EHr2DjR10yPwVgC7JiapC',$,'VerticalSpacing','Vertical spacing between tubes in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4486=IFCSIMPLEPROPERTYTEMPLATE('3zvB8qam93QOzaNwuAHRzQ',$,'HasTurbulator','TRUE if the tube has a turbulator, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4487=IFCPROPERTYSETTEMPLATE('12yhiBPEj9kPrvvjMCHbED',$,'Pset_TubeBundleTypeFinned','Finned tube bundle type attributes.\X2\000A\X0\Contains the attributes related to the fins attached to a tube in a finned tube bundle such as is commonly found in coils.',.PSET_TYPEDRIVENOVERRIDE.,'IfcTubeBundle/FINNED,IfcTubeBundleType/FINNED',(#4488,#4489,#4490,#4491,#4492,#4493,#4494,#4495)); +#4488=IFCSIMPLEPROPERTYTEMPLATE('31ppCjAE94u90Nqc5s8qnS',$,'Spacing','Distance between fins on a tube in the tube bundle.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4489=IFCSIMPLEPROPERTYTEMPLATE('1h0d6RQHzBNw6jHeNtqb_a',$,'Thickness','The geometric thickness of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4490=IFCSIMPLEPROPERTYTEMPLATE('27UoTo0aLAJxVy$yKXTTIp',$,'ThermalConductivity','The thermal conductivity of the object.',.P_SINGLEVALUE.,'IfcThermalConductivityMeasure',$,$,$,$,$,.READWRITE.); +#4491=IFCSIMPLEPROPERTYTEMPLATE('16dOeUhjH4NRAWz3Z0P8Dq',$,'Length','The length of the object.\X2\000A000A\X0\As measured parallel to the direction of airflow.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4492=IFCSIMPLEPROPERTYTEMPLATE('1_HQsMrOv0H8NkhiK3bJsj',$,'Height','Characteristic height\X2\000A000A\X0\Length of the fin as measured perpendicular to the direction of airflow.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4493=IFCSIMPLEPROPERTYTEMPLATE('31PQOgxnTDtwh3F5C8XLFA',$,'Diameter','The Diameter of the object.\X2\000A000A\X0\For circular fins only.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4494=IFCSIMPLEPROPERTYTEMPLATE('3c7H_ZTe52nAiHk_4PM89W',$,'FinCorrugatedType','Description of a fin corrugated type.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4495=IFCSIMPLEPROPERTYTEMPLATE('2gqOubEWv5zO55941cGXZz',$,'HasCoating','TRUE if the fin has a coating, FALSE if it does not.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4496=IFCPROPERTYSETTEMPLATE('2DFcIEtx50ufv_IQ6Qrnio',$,'Pset_Uncertainty','Property set capturing the geometric uncertainty regarding measurements including how the way that uncertainty was assessed.',.PSET_TYPEDRIVENOVERRIDE.,'IfcProduct,IfcTypeProduct',(#4497,#4499,#4500,#4501,#4502,#4503)); +#4497=IFCSIMPLEPROPERTYTEMPLATE('3Left0v$v09PrjfcFwXmo$',$,'UncertaintyBasis','Indication of the basis of the uncertainty',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4498,$,$,$,.READWRITE.); +#4498=IFCPROPERTYENUMERATION('PEnum_UncertaintyBasis',(IFCLABEL('ASSESSMENT'),IFCLABEL('ESTIMATE'),IFCLABEL('INTERPRETATION'),IFCLABEL('MEASUREMENT'),IFCLABEL('OBSERVATION'),IFCLABEL('NOTKNOWN'),IFCLABEL('USERDEFINED'),IFCLABEL('NOTDEFINED')),$); +#4499=IFCSIMPLEPROPERTYTEMPLATE('28yIfMhs15fh8VQYcxYFwZ',$,'UncertaintyDescription','General description of the uncertainty associated to the element or feature, its source and implications.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#4500=IFCSIMPLEPROPERTYTEMPLATE('1gjSdJnH16Vubx1EZNfNFy',$,'HorizontalUncertainty','Indicative (95%-100%) range diameter associated to the vertical shape and position in X, if different to the linear uncertainty.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4501=IFCSIMPLEPROPERTYTEMPLATE('2rjECBL65Fng3TB2pnnSaR',$,'LinearUncertainty','Indicative (95%-100%) range diameter associated to the overall shape and position in XYZ.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4502=IFCSIMPLEPROPERTYTEMPLATE('270OEqMjL4G9wMTP0ET8tI',$,'OrthogonalUncertainty','Indicative (95%-100%) range diameter associated to the horizontal shape and position in Y, if different to the horizontal uncertainty.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4503=IFCSIMPLEPROPERTYTEMPLATE('2951lkDeL85fHPlX9zdLYl',$,'VerticalUncertainty','Indicative (95%-100%) range diameter associated to the vertical shape and position in Z, if different to the linear uncertainty.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4504=IFCPROPERTYSETTEMPLATE('3YKZNUBiP8qQgnm9HqA63Y',$,'Pset_UnitaryControlElementBaseStationController','Properties that are applicable to IfcUnitaryControlElement with the predefined type set to BASESTATIONCONTROLLER.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement/BASESTATIONCONTROLLER,IfcUnitaryControlElementType/BASESTATIONCONTROLLER',(#4505,#4506,#4507)); +#4505=IFCSIMPLEPROPERTYTEMPLATE('3nZbgVyB5EQ8ZmlGfUOGIE',$,'NumberOfInterfaces','Indicates the types of interfaces and their number in the device.',.P_TABLEVALUE.,'IfcLabel','IfcInteger',$,$,$,$,.READWRITE.); +#4506=IFCSIMPLEPROPERTYTEMPLATE('1GUE8uXbf8XAks6CIIcf_z',$,'NumberOfManagedBTSs','Indicates the maximum number of base transceiver stations (BTSs) that can be handled by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4507=IFCSIMPLEPROPERTYTEMPLATE('3BOPWZRqn9ngmc8I$NL8Na',$,'NumberOfManagedCarriers','Indicates how many carrier frequencies can be managed by the device.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4508=IFCPROPERTYSETTEMPLATE('3tNKDrSJXADeiTS8i0RwXK',$,'Pset_UnitaryControlElementPHistory','Properties for history and operating schedules of thermostats. HISTORY: Added in IFC4.',.PSET_PERFORMANCEDRIVEN.,'IfcUnitaryControlElement',(#4509,#4510,#4511,#4512)); +#4509=IFCSIMPLEPROPERTYTEMPLATE('15KUDnK_z6B97ZFqbJ5EB8',$,'Temperature','Temperature of the fluid.\X2\000A000A\X0\Indicates the current measured temperature.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4510=IFCSIMPLEPROPERTYTEMPLATE('3G08jNAC18SRvsGz3l4upp',$,'OperationModeHistory','Indicates operation mode corresponding to Pset_UnitaryControlTypeCommon.Mode. For example, ''HEAT'', ''COOL'', ''AUTO''.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4511=IFCSIMPLEPROPERTYTEMPLATE('35PP0xSpfDSPXGcXmAM3b_',$,'Fan','Indicates fan operation where True is on, False is off, and Unknown is automatic.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4512=IFCSIMPLEPROPERTYTEMPLATE('2K83cdk6f8BBP2XjeYit8N',$,'SetPoint','Indicates the setpoint and label.\X2\000A000A\X0\Indicates the temperature setpoint. For thermostats with setbacks or separate high and low setpoints, then the time series may contain a pair of values at each entry where the first value is the heating setpoint (low) and the second value is the cooling setpoint (high).',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4513=IFCPROPERTYSETTEMPLATE('2SMuIky3525vUt8JoIukv5',$,'Pset_UnitaryControlElementTypeCommon','Unitary control element type common attributes. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement,IfcUnitaryControlElementType',(#4514,#4515,#4517)); +#4514=IFCSIMPLEPROPERTYTEMPLATE('35rRz3FOD1vf7q4Ku8h4nU',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4515=IFCSIMPLEPROPERTYTEMPLATE('271pd3f1L1aQqq8KUawniR',$,'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',$,#4516,$,$,$,.READWRITE.); +#4516=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4517=IFCSIMPLEPROPERTYTEMPLATE('3XtUjMcc171QtT0H2zHJ4o',$,'OperationMode','Table mapping operation mode identifiers to descriptive labels, which may be used for interpreting Pset_UnitaryControlElementPHistory.Mode.',.P_TABLEVALUE.,'IfcIdentifier','IfcLabel',$,$,$,$,.READWRITE.); +#4518=IFCPROPERTYSETTEMPLATE('0aQW6jDIrB6xPuqX1OCHYs',$,'Pset_UnitaryControlElementTypeControlPanel','Properties that are applicable to IfcUnitaryControlElement with the predefined type set to CONTROLPANEL.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement/CONTROLPANEL,IfcUnitaryControlElementType/CONTROLPANEL',(#4519,#4520,#4521,#4522,#4523)); +#4519=IFCSIMPLEPROPERTYTEMPLATE('3NIevTJGjAjAuXqmZdYi_X',$,'NominalCurrent','The nominal current that is designed to be measured.\X2\000A000A\X0\A set of nominal currents in [A] for which the data of this instance is valid. At least one value shall be provided. Any value in the set shall not exceed the value of the\X2\000A\X0\UltimateRatedCurrent associated with the same breaker unit.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#4520=IFCSIMPLEPROPERTYTEMPLATE('1$3LzwW994k8N8$kAwmTUx',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4521=IFCSIMPLEPROPERTYTEMPLATE('11JaLqb3PADhYJraJcCeta',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4522=IFCSIMPLEPROPERTYTEMPLATE('3bYPx3OYD82Q8H_sJXQxzX',$,'ReferenceAirRelativeHumidity','Measurement of the ratio of water vapor in the air.',.P_BOUNDEDVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#4523=IFCSIMPLEPROPERTYTEMPLATE('0s9XuUv$b5VPcBGz4r0RLO',$,'ReferenceEnvironmentTemperature','Ideal temperature range.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4524=IFCPROPERTYSETTEMPLATE('2xExfNWZH2WPF1iq6w3al5',$,'Pset_UnitaryControlElementTypeIndicatorPanel','Unitary control element type indicator panel attributes. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement/INDICATORPANEL,IfcUnitaryControlElementType/INDICATORPANEL',(#4525)); +#4525=IFCSIMPLEPROPERTYTEMPLATE('3vGozh0Ln3W8VkPR_MULs0',$,'UnitaryApplication','The application of the unitary control element.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4526,$,$,$,.READWRITE.); +#4526=IFCPROPERTYENUMERATION('PEnum_UnitaryControlElementApplication',(IFCLABEL('LIFTARRIVALGONG'),IFCLABEL('LIFTCARDIRECTIONLANTERN'),IFCLABEL('LIFTFIRESYSTEMSPORT'),IFCLABEL('LIFTHALLLANTERN'),IFCLABEL('LIFTPOSITIONINDICATOR'),IFCLABEL('LIFTVOICEANNOUNCER'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4527=IFCPROPERTYSETTEMPLATE('0LtsMAH$T5ohCmBY6$gRec',$,'Pset_UnitaryControlElementTypeThermostat','Unitary control element type thermostat attributes. HISTORY: Added in IFC4.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement/THERMOSTAT,IfcUnitaryControlElementType/THERMOSTAT',(#4528)); +#4528=IFCSIMPLEPROPERTYTEMPLATE('3ReGGLHZ11ZupBXOWEE9YU',$,'TemperatureSetPoint','The temperature setpoint range and default setpoint.',.P_BOUNDEDVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4529=IFCPROPERTYSETTEMPLATE('0ixjmS6ET37R5_WBiPWY$n',$,'Pset_UnitaryEquipmentTypeAirConditioningUnit','Air conditioning unit equipment type attributes.\X2\000A\X0\Note that these attributes were formerly Pset_PackagedACUnit prior to IFC2x2.\X2\000A\X0\HeatingEnergySource attribute deleted in IFC2x2 Pset Addendum: Use IfcMaterialProperties instead.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryEquipment/AIRCONDITIONINGUNIT,IfcUnitaryEquipmentType/AIRCONDITIONINGUNIT',(#4530,#4531,#4532,#4533,#4534,#4535,#4536,#4537,#4538)); +#4530=IFCSIMPLEPROPERTYTEMPLATE('356WLlijD3YPsgPKUEmVeO',$,'SensibleCoolingCapacity','Sensible cooling capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4531=IFCSIMPLEPROPERTYTEMPLATE('1SqkejT6XDrubOQszT8J0J',$,'LatentCoolingCapacity','Latent cooling capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4532=IFCSIMPLEPROPERTYTEMPLATE('0Vk5icMNH9Xv4K9NjlRdAA',$,'CoolingEfficiency','Coefficient of Performance: Ratio of cooling energy output to energy input under full load operating conditions.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4533=IFCSIMPLEPROPERTYTEMPLATE('2YuwuAZLz4QRNILhgxaQNw',$,'HeatingCapacity','Heating capacity.',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4534=IFCSIMPLEPROPERTYTEMPLATE('2ysxGea$L5WPmUeAu01oK8',$,'HeatingEfficiency','Heating efficiency under full load heating conditions.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4535=IFCSIMPLEPROPERTYTEMPLATE('1plli4OY16EwvZ4zrzxDWE',$,'CondenserFlowrate','Flow rate of fluid through the condenser.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#4536=IFCSIMPLEPROPERTYTEMPLATE('3tMaQl5lD67v_k7uguOSTJ',$,'CondenserEnteringTemperature','Temperature of fluid entering condenser.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4537=IFCSIMPLEPROPERTYTEMPLATE('2nK97HsUf8GRJ7OQ9hjHSd',$,'CondenserLeavingTemperature','Temperature of fluid leaving condenser.',.P_SINGLEVALUE.,'IfcThermodynamicTemperatureMeasure',$,$,$,$,$,.READWRITE.); +#4538=IFCSIMPLEPROPERTYTEMPLATE('29ha$n_Sr6MAftJCzRdRwv',$,'OutsideAirFlowrate','Flow rate of outside air entering the unit.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#4539=IFCPROPERTYSETTEMPLATE('2uK6EM2xTBZhbZHdnj7R07',$,'Pset_UnitaryEquipmentTypeAirHandler','Air handler unitary equipment type attributes.\X2\000A\X0\Note that these attributes were formerly Pset_AirHandler prior to IFC2x2.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryEquipment/AIRHANDLER,IfcUnitaryEquipmentType/AIRHANDLER',(#4540,#4542,#4544)); +#4540=IFCSIMPLEPROPERTYTEMPLATE('004KsCHff1we8x0Pe0i_1o',$,'AirHandlerConstruction','Enumeration defining how the air handler might be fabricated.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4541,$,$,$,.READWRITE.); +#4541=IFCPROPERTYENUMERATION('PEnum_AirHandlerConstruction',(IFCLABEL('CONSTRUCTEDONSITE'),IFCLABEL('MANUFACTUREDITEM'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4542=IFCSIMPLEPROPERTYTEMPLATE('2VEV92NsDCNfgkoZdACYnn',$,'AirHandlerFanCoilArrangement','Enumeration defining the arrangement of the supply air fan and the cooling coil.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4543,$,$,$,.READWRITE.); +#4543=IFCPROPERTYENUMERATION('PEnum_AirHandlerFanCoilArrangement',(IFCLABEL('BLOWTHROUGH'),IFCLABEL('DRAWTHROUGH'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4544=IFCSIMPLEPROPERTYTEMPLATE('00o7DtdnDFIOuLzr89pwjB',$,'DualDeck','Does the AirHandler have a dual deck? TRUE = Yes, FALSE = No.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4545=IFCPROPERTYSETTEMPLATE('1I3Cvmqq52PxsXHMUY3ZZl',$,'Pset_UnitaryEquipmentTypeCommon','Unitary equipment type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcUnitaryEquipment,IfcUnitaryEquipmentType',(#4546,#4547)); +#4546=IFCSIMPLEPROPERTYTEMPLATE('0zGgr2wh11vA7pvxfW3xuQ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4547=IFCSIMPLEPROPERTYTEMPLATE('33bzdHLd1FUQNcjWxSMuEc',$,'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',$,#4548,$,$,$,.READWRITE.); +#4548=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4549=IFCPROPERTYSETTEMPLATE('3GTW3ctNjBI8unZhcpAKHm',$,'Pset_UtilityConsumptionPHistory','Consumption of utility resources, typically applied to the IfcBuilding instance, used to identify how much was consumed on I.e., a monthly basis.',.PSET_PERFORMANCEDRIVEN.,'IfcBuilding',(#4550,#4551,#4552,#4553,#4554)); +#4550=IFCSIMPLEPROPERTYTEMPLATE('1WxdBOQl9BFACj5vUDl2sF',$,'Heat','The amount of heat energy consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4551=IFCSIMPLEPROPERTYTEMPLATE('2NQIjiAZH6Kxs1qVIqObb7',$,'Electricity','The amount of electricity consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4552=IFCSIMPLEPROPERTYTEMPLATE('0LKZ70utfA$g0iizPjUQPB',$,'Water','The amount of water consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4553=IFCSIMPLEPROPERTYTEMPLATE('0gLGr8de1EAQz6emzScpcb',$,'Fuel','The amount of fuel consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4554=IFCSIMPLEPROPERTYTEMPLATE('1rr2_ndinFM8nlhIRF1o3Y',$,'Steam','The amount of steam consumed during the period specified in the time series.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4555=IFCPROPERTYSETTEMPLATE('1K7lRkNHbCYgEBW6KJm9Ie',$,'Pset_ValvePHistory','Valve performance history common attributes of a typical 2 port pattern type valve.',.PSET_PERFORMANCEDRIVEN.,'IfcValve',(#4556,#4557,#4558)); +#4556=IFCSIMPLEPROPERTYTEMPLATE('1RVNowOOXDfOW9A0Vj5Vo8',$,'PercentageOpen','The ratio between the amount that the valve is open to the full open position of the valve.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4557=IFCSIMPLEPROPERTYTEMPLATE('04G_U8BKz6OuLIL8WfDuxl',$,'MeasuredFlowRate','The rate of flow of a fluid measured across the valve.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4558=IFCSIMPLEPROPERTYTEMPLATE('1gLmdq6Gv2YPsvOp4AekEZ',$,'MeasuredPressureDrop','The actual pressure drop in the fluid measured across the valve.',.P_REFERENCEVALUE.,'IfcTimeSeries',$,$,$,$,$,.READWRITE.); +#4559=IFCPROPERTYSETTEMPLATE('3ArM4FVqD0jOjGOT_qKMqG',$,'Pset_ValveTypeAirRelease','Valve used to release air from a pipe or fitting.\X2\000A\X0\Note that an air release valve is constrained to have a single port pattern',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/AIRRELEASE,IfcValveType/AIRRELEASE',(#4560)); +#4560=IFCSIMPLEPROPERTYTEMPLATE('1fmDD$$bDCkAZTKZKJwrIe',$,'IsAutomatic','Indication of whether the valve is automatically operated (TRUE) or manually operated (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4561=IFCPROPERTYSETTEMPLATE('0v3TMI6l18cOsbOA5EEYnX',$,'Pset_ValveTypeCommon','Valve type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve,IfcValveType',(#4562,#4563,#4565,#4567,#4569,#4571,#4572,#4573,#4574,#4575)); +#4562=IFCSIMPLEPROPERTYTEMPLATE('08v0oddlD189QOHhKASBkO',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4563=IFCSIMPLEPROPERTYTEMPLATE('1gWZV33lHBDeu0zre9sMKh',$,'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',$,#4564,$,$,$,.READWRITE.); +#4564=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4565=IFCSIMPLEPROPERTYTEMPLATE('2Rj_rLcXbD5eZRp8tv4mGC',$,'ValvePattern','The configuration of the ports of a valve according to either the linear route taken by a fluid flowing through the valve or by the number of ports where:SINGLEPORT: Valve that has a single entry port from the system that it serves, the exit port being to the surrounding environment.\X2\000A\X0\ANGLED_2_PORT: Valve in which the direction of flow is changed through 90 degrees.\X2\000A\X0\STRAIGHT_2_PORT: Valve in which the flow is straight through.\X2\000A\X0\STRAIGHT_3_PORT: Valve with three separate ports.\X2\000A\X0\CROSSOVER_4_PORT: Valve with 4 separate ports.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4566,$,$,$,.READWRITE.); +#4566=IFCPROPERTYENUMERATION('PEnum_ValvePattern',(IFCLABEL('ANGLED_2_PORT'),IFCLABEL('CROSSOVER_4_PORT'),IFCLABEL('SINGLEPORT'),IFCLABEL('STRAIGHT_2_PORT'),IFCLABEL('STRAIGHT_3_PORT'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4567=IFCSIMPLEPROPERTYTEMPLATE('2Srq6hgR1BMBVehSK8BknC',$,'ValveOperation','The method of valve operation where:DROPWEIGHT: A valve that is closed by the action of a weighted lever being released, the weight normally being prevented from dropping by being held by a wire, the closure normally being made by the action of heat on a fusible link in the wire\X2\000A\X0\FLOAT: A valve that is opened and closed by the action of a float that rises and falls with water level. The float may be a ball attached to a lever or other mechanism\X2\000A\X0\HYDRAULIC: A valve that is opened and closed by hydraulic actuation\X2\000A\X0\LEVER: A valve that is opened and closed by the action of a lever rotating the gate within the valve.\X2\000A\X0\LOCKSHIELD: A valve that requires the use of a special lockshield key for opening and closing, the operating mechanism being protected by a shroud during normal operation.\X2\000A\X0\MOTORIZED: A valve that is opened and closed by the action of an electric motor on an actuator\X2\000A\X0\PNEUMATIC: A valve that is opened and closed by pneumatic actuation\X2\000A\X0\SOLENOID: A valve that is normally held open by a magnetic field in a coil acting on the gate but that is closed immediately if the electrical current generating the magnetic field is removed.\X2\000A\X0\SPRING: A valve that is normally held in position by the pressure of a spring on a plate but that may be caused to open if the pressure of the fluid is sufficient to overcome the spring pressure.\X2\000A\X0\THERMOSTATIC: A valve in which the ports are opened or closed to maintain a required predetermined temperature.\X2\000A\X0\WHEEL: A valve that is opened and closed by the action of a wheel moving the gate within the valve.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4568,$,$,$,.READWRITE.); +#4568=IFCPROPERTYENUMERATION('PEnum_ValveOperation',(IFCLABEL('DROPWEIGHT'),IFCLABEL('FLOAT'),IFCLABEL('HYDRAULIC'),IFCLABEL('LEVER'),IFCLABEL('LOCKSHIELD'),IFCLABEL('MOTORIZED'),IFCLABEL('PNEUMATIC'),IFCLABEL('SOLENOID'),IFCLABEL('SPRING'),IFCLABEL('THERMOSTATIC'),IFCLABEL('WHEEL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4569=IFCSIMPLEPROPERTYTEMPLATE('3NDNAtwWz04Rryfl2jI7LT',$,'ValveMechanism','The mechanism by which the valve function is achieved where:BALL: Valve that has a ported ball that can be turned relative to the body seat ports.\X2\000A\X0\BUTTERFLY: Valve in which a streamlined disc pivots about a diametric axis.\X2\000A\X0\CONFIGUREDGATE: Screwdown valve in which the closing gate is shaped in a configured manner to have a more precise control of pressure and flow change across the valve.\X2\000A\X0\GLAND: Valve with a tapered seating, in which a rotatable plug is retained by means of a gland and gland packing.\X2\000A\X0\GLOBE: Screwdown valve that has a spherical body.\X2\000A\X0\LUBRICATEDPLUG: Plug valve in which a lubricant is injected under pressure between the plug face and the body.\X2\000A\X0\NEEDLE: Valve for regulating the flow in or from a pipe, in which a slender cone moves along the axis of flow to close against a fixed conical seat.\X2\000A\X0\PARALLELSLIDE: Screwdown valve that has a machined plate that slides in formed grooves to form a seal.\X2\000A\X0\PLUG: Valve that has a ported plug that can be turned relative to the body seat ports.\X2\000A\X0\WEDGEGATE: Screwdown valve that has a wedge shaped plate fitting into tapered guides to form a seal.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4570,$,$,$,.READWRITE.); +#4570=IFCPROPERTYENUMERATION('PEnum_ValveMechanism',(IFCLABEL('BALL'),IFCLABEL('BUTTERFLY'),IFCLABEL('CONFIGUREDGATE'),IFCLABEL('GLAND'),IFCLABEL('GLOBE'),IFCLABEL('LUBRICATEDPLUG'),IFCLABEL('NEEDLE'),IFCLABEL('PARALLELSLIDE'),IFCLABEL('PLUG'),IFCLABEL('WEDGEGATE'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4571=IFCSIMPLEPROPERTYTEMPLATE('3HeRIyCHj9PxEs8f1O9TNa',$,'Size','The size of the connection to the valve (or to each connection for faucets, mixing valves, etc.).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4572=IFCSIMPLEPROPERTYTEMPLATE('0MlwZZ1ybBDBoUsvfPHP2M',$,'TestPressure','The maximum pressure to which the valve has been subjected under test.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4573=IFCSIMPLEPROPERTYTEMPLATE('3Pnq3K7JLC5g5uOZQaRaq1',$,'WorkingPressure','Working pressure.\X2\000A000A\X0\The normally expected maximum working pressure of the valve.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4574=IFCSIMPLEPROPERTYTEMPLATE('1C0761Sdn7SeE1p6fg6YnZ',$,'FlowCoefficient','Flow coefficient (the quantity of fluid that passes through a fully open valve at unit pressure drop), typically expressed as the Kv or Cv value for the valve.',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.); +#4575=IFCSIMPLEPROPERTYTEMPLATE('2$5y2Cm5D3Ee3joX0K8rV4',$,'CloseOffRating','Close off rating.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4576=IFCPROPERTYSETTEMPLATE('30oa3Nu410geSyNxD8mcMm',$,'Pset_ValveTypeDrawOffCock','A small diameter valve, used to drain water from a cistern or water filled system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/DRAWOFFCOCK,IfcValveType/DRAWOFFCOCK',(#4577)); +#4577=IFCSIMPLEPROPERTYTEMPLATE('1Sd87_Bx94TPQhcsABSdmw',$,'HasHoseUnion','Indicates whether the object is fitted with a hose union connection (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4578=IFCPROPERTYSETTEMPLATE('04auzKp0bAIxGuAYU__pQ7',$,'Pset_ValveTypeFaucet','A small diameter valve, with a free outlet, from which water is drawn.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/FAUCET,IfcValveType/FAUCET',(#4579,#4581,#4583,#4585,#4586)); +#4579=IFCSIMPLEPROPERTYTEMPLATE('1243Y$3IrD5PrT2dDMSflF',$,'FaucetType','Defines the range of faucet types that may be specified where:Bib: Faucet with a horizontal inlet and a nozzle that discharges downwards.\X2\000A\X0\Globe: Faucet fitted through the end of a bath, with a horizontal inlet, a partially spherical body and a vertical nozzle.\X2\000A\X0\Diverter: Combination faucet assembly with a valve to enable the flow of mixed water to be transferred to a showerhead.\X2\000A\X0\DividedFlowCombination: Combination faucet assembly in which hot and cold water are kept separate until emerging from a common nozzle\X2\000A\X0\.\X2\000A\X0\Pillar: Faucet that has a vertical inlet and a nozzle that discharges downwards\X2\000A\X0\.\X2\000A\X0\SingleOutletCombination = Combination faucet assembly in which hot and cold water mix before emerging from a common nozzle\X2\000A\X0\.\X2\000A\X0\Spray: Faucet with a spray outlet\X2\000A\X0\.\X2\000A\X0\SprayMixing: Spray faucet connected to hot and cold water supplies that delivers water at a temperature determined during use.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4580,$,$,$,.READWRITE.); +#4580=IFCPROPERTYENUMERATION('PEnum_FaucetType',(IFCLABEL('BIB'),IFCLABEL('DIVERTER'),IFCLABEL('DIVIDEDFLOWCOMBINATION'),IFCLABEL('GLOBE'),IFCLABEL('PILLAR'),IFCLABEL('SINGLEOUTLETCOMBINATION'),IFCLABEL('SPRAY'),IFCLABEL('SPRAYMIXING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4581=IFCSIMPLEPROPERTYTEMPLATE('2Sz7mRzOr6IumOnoE9U8Yi',$,'FaucetOperation','Defines the range of ways in which a faucet can be operated that may be specified where:CeramicDisc: Quick action faucet with a ceramic seal to open or close the orifice\X2\000A\X0\.\X2\000A\X0\LeverHandle: Quick action faucet that is operated by a lever handle\X2\000A\X0\.\X2\000A\X0\NonConcussiveSelfClosing: Self closing faucet that does not induce surge pressure\X2\000A\X0\.\X2\000A\X0\QuarterTurn: Quick action faucet that can be fully opened or shut by turning the operating mechanism through 90 degrees.\X2\000A\X0\QuickAction: Faucet that can be opened or closed fully with a single small movement of the operating mechanism\X2\000A\X0\.\X2\000A\X0\ScrewDown: Faucet in which a plate or disc is moved, by the rotation of a screwed spindle, to close or open the orifice.\X2\000A\X0\SelfClosing: Faucet that is opened by pressure of the top of an operating spindle and is closed under the action of a spring or weight when the pressure is released.\X2\000A\X0\TimedSelfClosing: Self closing faucet that discharges for a predetermined period of time\X2\000A\X0\.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4582,$,$,$,.READWRITE.); +#4582=IFCPROPERTYENUMERATION('PEnum_FaucetOperation',(IFCLABEL('CERAMICDISC'),IFCLABEL('LEVERHANDLE'),IFCLABEL('NONCONCUSSIVESELFCLOSING'),IFCLABEL('QUARTERTURN'),IFCLABEL('QUICKACTION'),IFCLABEL('SCREWDOWN'),IFCLABEL('SELFCLOSING'),IFCLABEL('TIMEDSELFCLOSING'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4583=IFCSIMPLEPROPERTYTEMPLATE('01m2xt$yHBygacLpzdH_69',$,'FaucetFunction','Defines the operating temperature of a faucet that may be specified.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4584,$,$,$,.READWRITE.); +#4584=IFCPROPERTYENUMERATION('PEnum_FaucetFunction',(IFCLABEL('COLD'),IFCLABEL('HOT'),IFCLABEL('MIXED'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4585=IFCSIMPLEPROPERTYTEMPLATE('1BVFAzz0XFZhDLP8$BKuff',$,'Finish','Description of the (surface) finish of the object for informational purposes.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#4586=IFCSIMPLEPROPERTYTEMPLATE('3Xcy29A$rB_OnA1p2LkpMV',$,'FaucetTopDescription','Description of the operating mechanism/top of the faucet.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#4587=IFCPROPERTYSETTEMPLATE('0nRZTGTNr6XfKSZnrZNPwL',$,'Pset_ValveTypeFlushing','Valve that flushes a predetermined quantity of water to cleanse a WC, urinal or slop hopper.\X2\000A\X0\Note that a flushing valve is constrained to have a 2 port pattern.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/FLUSHING,IfcValveType/FLUSHING',(#4588,#4589,#4590)); +#4588=IFCSIMPLEPROPERTYTEMPLATE('3_V2vVltb5p8yJ9pxy6_JE',$,'FlushingRate','The predetermined quantity of water to be flushed.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#4589=IFCSIMPLEPROPERTYTEMPLATE('2Q$3u731f2GBCC96grNRtr',$,'HasIntegralShutOffDevice','Indication of whether the flushing valve has an integral shut off device fitted (set TRUE) or not (set FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4590=IFCSIMPLEPROPERTYTEMPLATE('3SHwRDesT4ouEEiEh4nCXs',$,'IsHighPressure','Indication of whether the flushing valve is suitable for use on a high pressure water main (set TRUE) or not (set FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4591=IFCPROPERTYSETTEMPLATE('1J8VUB5dnF4AVTlrq5qa64',$,'Pset_ValveTypeGasTap','A small diameter valve, used to discharge gas from a system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/GASTAP,IfcValveType/GASTAP',(#4592)); +#4592=IFCSIMPLEPROPERTYTEMPLATE('19eilN1cbDC8sO0muAPRS1',$,'HasHoseUnion','Indicates whether the object is fitted with a hose union connection (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4593=IFCPROPERTYSETTEMPLATE('3DPqn$Hnn1C8kanGA79oZB',$,'Pset_ValveTypeIsolating','Valve that is used to isolate system components.\X2\000A\X0\Note that an isolating valve is constrained to have a 2 port pattern.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/ISOLATING,IfcValveType/ISOLATING',(#4594,#4595)); +#4594=IFCSIMPLEPROPERTYTEMPLATE('0L4PcpxGz1kPm1FF3rAahy',$,'IsNormallyOpen','If TRUE, the valve is normally open. If FALSE is is normally closed.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4595=IFCSIMPLEPROPERTYTEMPLATE('1qFCYn4Vn7ihUQioPkZZg_',$,'IsolatingPurpose','Defines the purpose for which the isolating valve is used since the way in which the valve is identified as an isolating valve may be in the context of its use. Note that unless there is a contextual name for the isolating valve (as in the case of a Landing Valve on a rising fire main), then the value assigned shoulkd be UNSET.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4596,$,$,$,.READWRITE.); +#4596=IFCPROPERTYENUMERATION('PEnum_IsolatingPurpose',(IFCLABEL('LANDING'),IFCLABEL('LANDINGWITHPRESSUREREGULATION'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4597=IFCPROPERTYSETTEMPLATE('27Pj9IjFX3UPflK4DOjlEr',$,'Pset_ValveTypeMixing','A valve where typically the temperature of the outlet is determined by mixing hot and cold water inlet flows.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/MIXING,IfcValveType/MIXING',(#4598,#4600)); +#4598=IFCSIMPLEPROPERTYTEMPLATE('1gJIs$VgP7Y9MP6Ij2MsR2',$,'MixerControl','Defines the form of control of the mixing valve.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4599,$,$,$,.READWRITE.); +#4599=IFCPROPERTYENUMERATION('PEnum_MixingValveControl',(IFCLABEL('MANUAL'),IFCLABEL('PREDEFINED'),IFCLABEL('THERMOSTATIC'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4600=IFCSIMPLEPROPERTYTEMPLATE('3v2pIrt8zCrOZj_iYmHulX',$,'OutletConnectionSize','Size of the outlet connection from the object.\X2\000A000A\X0\The size of the pipework connection from the mixing valve.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4601=IFCPROPERTYSETTEMPLATE('2$icP2dk51$eLfvT3s9c_5',$,'Pset_ValveTypePressureReducing','Valve that reduces the pressure of a fluid immediately downstream of its position in a pipeline to a preselected value or by a predetermined ratio.\X2\000A\X0\Note that a pressure reducing valve is constrained to have a 2 port pattern.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/PRESSUREREDUCING,IfcValveType/PRESSUREREDUCING',(#4602,#4603)); +#4602=IFCSIMPLEPROPERTYTEMPLATE('2t0gFQO9rFquJOgTlQIEgE',$,'UpstreamPressure','The operating pressure of the fluid upstream of the pressure reducing valve.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4603=IFCSIMPLEPROPERTYTEMPLATE('3E2pUwJdnCExk_GrJYGfEP',$,'DownstreamPressure','The operating pressure of the fluid downstream of the pressure reducing valve.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4604=IFCPROPERTYSETTEMPLATE('0yfpBU949APvtiCIPoJjbO',$,'Pset_ValveTypePressureRelief','Spring or weight loaded valve that automatically discharges to a safe place fluid that has built up to excessive pressure in pipes or fittings.\X2\000A\X0\Note that a pressure relief valve is constrained to have a single port pattern.',.PSET_TYPEDRIVENOVERRIDE.,'IfcValve/PRESSURERELIEF,IfcValveType/PRESSURERELIEF',(#4605)); +#4605=IFCSIMPLEPROPERTYTEMPLATE('2jm2NnNI58pgMHbFAbQFQk',$,'ReliefPressure','The pressure at which the spring or weight in the valve is set to discharge fluid.',.P_SINGLEVALUE.,'IfcPressureMeasure',$,$,$,$,$,.READWRITE.); +#4606=IFCPROPERTYSETTEMPLATE('0jsn4HP8nDdOplbJNkJ0Uu',$,'Pset_VegetationCommon','Properties for vegetation and plants, modelled as instances of IfcGeographicElement with the predefined type set to VEGETATION.',.PSET_OCCURRENCEDRIVEN.,'IfcGeographicElement/VEGETATION',(#4607,#4608)); +#4607=IFCSIMPLEPROPERTYTEMPLATE('3ek7T7aLr1lvaA2FsdRKv0',$,'BotanicalName','Formal scientific name conforming to the International Code of Nomenclature for algae, fungi, and plants (ICN)',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4608=IFCSIMPLEPROPERTYTEMPLATE('0iZ3V3$0L0sfCAxGGJcsX7',$,'LocalName','The local name that the plant is known as.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4609=IFCPROPERTYSETTEMPLATE('1EF6VYX1r3sP2ad9Ow6PLj',$,'Pset_VehicleAvailability','Property set for the application of availability data to vehicles and equipment.',.PSET_TYPEDRIVENOVERRIDE.,'IfcVehicle/ROLLINGSTOCK,IfcVehicle/VEHICLEAIR,IfcVehicle/VEHICLEMARINE,IfcVehicle/VEHICLE,IfcVehicle/VEHICLETRACKED,IfcVehicleType/ROLLINGSTOCK,IfcVehicleType/VEHICLEAIR,IfcVehicleType/VEHICLEMARINE,IfcVehicleType/VEHICLE,IfcVehicleType/VEHICLETRACKED',(#4610,#4611,#4612)); +#4610=IFCSIMPLEPROPERTYTEMPLATE('3rupTdRNX5eAxgroj0uJle',$,'VehicleAvailability','Vehicle or Plant availability',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4611=IFCSIMPLEPROPERTYTEMPLATE('3NZA0bNp92W9ijUie043kP',$,'MaintenanceDowntime','Maintenance downtime proportion.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4612=IFCSIMPLEPROPERTYTEMPLATE('3mIF0gQZ5CSO00Rmvvm57L',$,'WeatherDowntime','Weather downtime proportion',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4613=IFCPROPERTYSETTEMPLATE('0cKLy6iebAEOKC9NakmPdN',$,'Pset_VesselLineCommon','Properties for vessel lines and anchoring',.PSET_TYPEDRIVENOVERRIDE.,'IfcMechanicalFastener/ROPE,IfcMechanicalFastenerType/ROPE',(#4614,#4615,#4616,#4617,#4618,#4619,#4620,#4621,#4622,#4623,#4624,#4625,#4626)); +#4614=IFCSIMPLEPROPERTYTEMPLATE('3ixa1bOlf2PuxUF6njWHOh',$,'LineIdentifier','Reference ID relative to a design vessel in the project',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4615=IFCSIMPLEPROPERTYTEMPLATE('2Q_mZT6snE_vV5T8jQpNmH',$,'MidshipToFairLead','Distance from the vessel midship to the fairlead for the line',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4616=IFCSIMPLEPROPERTYTEMPLATE('322Xxtalf9VfzEDpSq3M2C',$,'CentreLineToFairlead','Distance from the vessel centreline to the fairlead for the line',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4617=IFCSIMPLEPROPERTYTEMPLATE('17JVizc3HFdvzDQ6OrOAn$',$,'HeightAboveMainDeck','Height of the fairlead above the main deck of the vessel',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4618=IFCSIMPLEPROPERTYTEMPLATE('25sUx2DqTAnul_U0yVch$D',$,'FairleadToTermination','Distance from the fairlead to the bitt or winch on the vessel where the line terminates',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4619=IFCSIMPLEPROPERTYTEMPLATE('0doRWoMJfAuO0k2S84C61a',$,'WinchBreakLimit','Line force at which the winch starts to release the line (maximum load)',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#4620=IFCSIMPLEPROPERTYTEMPLATE('0DHR0j7b96IwwoZybK42_G',$,'PreTensionAim','Line force that the winch is set to maintain (minimum load)',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#4621=IFCSIMPLEPROPERTYTEMPLATE('2LjrciwkfBuxJpINhDzGjc',$,'LineType','Mooring line type',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4622=IFCSIMPLEPROPERTYTEMPLATE('1IgnuvLaX0gRRLo2fZPVzw',$,'LineStrength','Breaking load of the line (note that ultimate stress is not part of any of the material Psets)',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#4623=IFCSIMPLEPROPERTYTEMPLATE('3okacu2tX8kuHpgmfO2GQK',$,'TailLength','Length of the tail',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4624=IFCSIMPLEPROPERTYTEMPLATE('2iVIsm4Ib2OuZFYqKCCnzc',$,'TailDiameter','Diameter of the tail',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4625=IFCSIMPLEPROPERTYTEMPLATE('2R0ZEfW$D4IuSfUkH6RfRm',$,'TailType','Mooring tail type',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4626=IFCSIMPLEPROPERTYTEMPLATE('3j6noq7Kf2xAfEXZt2Bi15',$,'TailStrength','Breaking load of the tail (note that ultimate stress is not part of any of the material Psets)',.P_SINGLEVALUE.,'IfcForceMeasure',$,$,$,$,$,.READWRITE.); +#4627=IFCPROPERTYSETTEMPLATE('01HdAhykP9Rw8CG2FSlPDR',$,'Pset_VibrationIsolatorTypeCommon','Vibration isolator type common attributes.',.PSET_TYPEDRIVENOVERRIDE.,'IfcVibrationIsolator,IfcVibrationIsolatorType',(#4628,#4629,#4631,#4632,#4633,#4634,#4635)); +#4628=IFCSIMPLEPROPERTYTEMPLATE('10KNOTTOD2ifzlwPGhrLeg',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4629=IFCSIMPLEPROPERTYTEMPLATE('0KMFH0qQ98sgRgqr3HDG8x',$,'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',$,#4630,$,$,$,.READWRITE.); +#4630=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4631=IFCSIMPLEPROPERTYTEMPLATE('24cOHEkeL99OkOZ$vNnYc6',$,'VibrationTransmissibility','The vibration transmissibility percentage.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4632=IFCSIMPLEPROPERTYTEMPLATE('2YfK3ucW93cPAwaVpHyQbj',$,'IsolatorStaticDeflection','Static deflection of the vibration isolator.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4633=IFCSIMPLEPROPERTYTEMPLATE('03ELSlvHn3IhdBrWKPpmv4',$,'IsolatorCompressibility','The compressibility of the vibration isolator.',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4634=IFCSIMPLEPROPERTYTEMPLATE('3VHJC0x4z6peus7UvXAUfy',$,'MaximumSupportedWeight','The maximum weight that can be carried by the vibration isolator.',.P_SINGLEVALUE.,'IfcMassMeasure',$,$,$,$,$,.READWRITE.); +#4635=IFCSIMPLEPROPERTYTEMPLATE('2Sw7aSm3fFGg6WHFnPIvFc',$,'NominalHeight','The nominal height of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.\X2\000A000A\X0\Height of the vibration isolator before the application of load.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4636=IFCPROPERTYSETTEMPLATE('0TJRDLUP95BAkMNDd0h1Ew',$,'Pset_VoltageInstrumentTransformer','Instrument transformers are high accuracy class electrical devices used to isolate or transform voltage or current levels. The main function of instrument transformers is to operate instruments or metering from high voltage or high current circuits, safely isolating secondary control circuitry from the high voltages or currents. Combination instrument transformers are metering voltage.',.PSET_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument/COMBINED,IfcFlowInstrument/VOLTMETER,IfcFlowInstrumentType/COMBINED,IfcFlowInstrumentType/VOLTMETER',(#4637,#4638,#4639,#4640,#4641,#4642,#4643,#4644,#4645,#4646)); +#4637=IFCSIMPLEPROPERTYTEMPLATE('3gRLsoLEbBdAIvGMrRjPSV',$,'AccuracyClass','A designation assigned to an instrument transformer the current (or voltage) error and phase displacement of which remain within specified limits under prescribed conditions of use (IEC 321-01-24).',.P_SINGLEVALUE.,'IfcRatioMeasure',$,$,$,$,$,.READWRITE.); +#4638=IFCSIMPLEPROPERTYTEMPLATE('1SbLjB5xr7bvllpgarTzwZ',$,'AccuracyGrade','The grade of accuracy.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4639=IFCSIMPLEPROPERTYTEMPLATE('00RNe56Oj61xzuGUQrcj$S',$,'RatedVoltage','The range of allowed voltage that a device is certified to handle. The upper bound of this value is the maximum.',.P_BOUNDEDVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4640=IFCSIMPLEPROPERTYTEMPLATE('05Ejv$hHL1UQszxnHcl7LP',$,'NominalCurrent','The nominal current that is designed to be measured.',.P_SINGLEVALUE.,'IfcElectricCurrentMeasure',$,$,$,$,$,.READWRITE.); +#4641=IFCSIMPLEPROPERTYTEMPLATE('38tskyeufCFOFfftIdXIbq',$,'NominalPower','A conventional value of apparent power determining a value of the rated current that may be carried with rated voltage applied, under specified conditions. ( IEV ref 421-04-04)',.P_SINGLEVALUE.,'IfcPowerMeasure',$,$,$,$,$,.READWRITE.); +#4642=IFCSIMPLEPROPERTYTEMPLATE('1E$HevnSzBdg647MLRFZ9G',$,'NumberOfPhases','Number of phases that the equipment operates on.',.P_SINGLEVALUE.,'IfcCountMeasure',$,$,$,$,$,.READWRITE.); +#4643=IFCSIMPLEPROPERTYTEMPLATE('0rsu3AHLDA0wy93GSsX0O_',$,'PrimaryFrequency','The frequency that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#4644=IFCSIMPLEPROPERTYTEMPLATE('3qDNXGMMv3zu6xEnBDBq2O',$,'PrimaryVoltage','The voltage that is going to be transformed and that runs into the transformer on the primary side.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4645=IFCSIMPLEPROPERTYTEMPLATE('176MZZ6Vn7q8eDZphX9gxM',$,'SecondaryFrequency','The frequency that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcFrequencyMeasure',$,$,$,$,$,.READWRITE.); +#4646=IFCSIMPLEPROPERTYTEMPLATE('0WoAtpv5H9v8G4XDQWKewy',$,'SecondaryVoltage','The voltage that has been transformed and is running out of the transformer on the secondary side.',.P_SINGLEVALUE.,'IfcElectricVoltageMeasure',$,$,$,$,$,.READWRITE.); +#4647=IFCPROPERTYSETTEMPLATE('2vP4ZorPL3FeW_6VZnURJO',$,'Pset_WallCommon','Properties common to the definition of all occurrences of IfcWall.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWall,IfcWallType',(#4648,#4649,#4651,#4652,#4653,#4654,#4655,#4656,#4657,#4658,#4659)); +#4648=IFCSIMPLEPROPERTYTEMPLATE('1iq9hEU4PFjg_q$8XuRytx',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4649=IFCSIMPLEPROPERTYTEMPLATE('2FusdziUHCMhtb1xVFLSQj',$,'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',$,#4650,$,$,$,.READWRITE.); +#4650=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4651=IFCSIMPLEPROPERTYTEMPLATE('05XoHA8N55DRciTT3_Wno2',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4652=IFCSIMPLEPROPERTYTEMPLATE('2Du_8RCD1B7gaNaZ_9MZxu',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4653=IFCSIMPLEPROPERTYTEMPLATE('0$cb5vM4b6_QH4eCNiIhI$',$,'Combustible','Indication whether the object is made from combustible material (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4654=IFCSIMPLEPROPERTYTEMPLATE('1zaRQVDnfBX9QOvfebKwkV',$,'SurfaceSpreadOfFlame','Indication on how the flames spread around the surface,\X2\000A\X0\It is given according to the national building code that governs the fire behaviour for materials.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4655=IFCSIMPLEPROPERTYTEMPLATE('3VSFMXgXb7qvn_5rc7zKB_',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#4656=IFCSIMPLEPROPERTYTEMPLATE('23iPvVZWv2cRPylg8cmvfc',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4657=IFCSIMPLEPROPERTYTEMPLATE('0IUJUxCl9AuQmz_t4RETfx',$,'LoadBearing','Indicates whether the object is intended to carry loads (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4658=IFCSIMPLEPROPERTYTEMPLATE('0VWTby18P4qfYHbZuOlNNM',$,'ExtendToStructure','Indicates whether the object extend to the structure above (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4659=IFCSIMPLEPROPERTYTEMPLATE('0t_E5vWvf5QOFGAbZvHlS4',$,'Compartmentation','Indication whether the object is designed to serve as a fire compartmentation (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4660=IFCPROPERTYSETTEMPLATE('1xdhHCWej4dAMGv1LMuPaC',$,'Pset_Warranty','An assurance given by the seller or provider of an artefact that the artefact is without defects and will operate as described for a defined period of time without failure and that if a defect does arise during that time, that it will be corrected by the seller or provider.',.PSET_TYPEDRIVENOVERRIDE.,'IfcElement,IfcElementType',(#4661,#4662,#4663,#4664,#4665,#4666,#4667)); +#4661=IFCSIMPLEPROPERTYTEMPLATE('3ZEBOkDNXDgPEoZYln23tw',$,'WarrantyIdentifier','The identifier assigned to a warranty.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4662=IFCSIMPLEPROPERTYTEMPLATE('3Xvy41E9j3OBlOrGQhBQhY',$,'WarrantyStartDate','The date on which the warranty commences.',.P_SINGLEVALUE.,'IfcDate',$,$,$,$,$,.READWRITE.); +#4663=IFCSIMPLEPROPERTYTEMPLATE('14ah_Av7L08OtGPjNTpl7m',$,'IsExtendedWarranty','Indication of whether this is an extended warranty whose duration is greater than that normally assigned to an artefact (=TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4664=IFCSIMPLEPROPERTYTEMPLATE('1vR7wcunPDXRQ3A3c3kYIc',$,'WarrantyPeriod','The time duration during which a manufacturer or supplier guarantees or warrants the performance of an artefact.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#4665=IFCSIMPLEPROPERTYTEMPLATE('0EdwGbGlPDBf6fGaiv__8c',$,'WarrantyContent','The content of the warranty.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#4666=IFCSIMPLEPROPERTYTEMPLATE('1tNw$dI8b0KvWt$b$_xzJh',$,'PointOfContact','The organization that should be contacted for action under the terms of the warranty. Note that the role of the organization (manufacturer, supplier, installer etc.) is determined by the IfcActorRole attribute of IfcOrganization.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4667=IFCSIMPLEPROPERTYTEMPLATE('0JrCDOEIjAxxStYyvGx9_j',$,'Exclusions','Items, conditions or actions that may be excluded from the warranty or that may cause the warranty to become void.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); +#4668=IFCPROPERTYSETTEMPLATE('0ht9KPUB53XA3CbccQh70A',$,'Pset_WasteTerminalTypeCommon','Common properties for waste terminals.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal,IfcWasteTerminalType',(#4669,#4670)); +#4669=IFCSIMPLEPROPERTYTEMPLATE('17Bt5qtTf1TuJSJ2v3GKDn',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4670=IFCSIMPLEPROPERTYTEMPLATE('1iQVhEOgXFhxmeqYIko1ha',$,'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',$,#4671,$,$,$,.READWRITE.); +#4671=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4672=IFCPROPERTYSETTEMPLATE('2s1zSoZ1PFTwM7hPgOepCm',$,'Pset_WasteTerminalTypeFloorTrap','Pipe fitting, set into the floor, that retains liquid to prevent the passage of foul air.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/FLOORTRAP,IfcWasteTerminalType/FLOORTRAP',(#4673,#4674,#4675,#4676,#4677,#4678,#4680,#4681,#4682,#4684,#4685,#4686,#4687)); +#4673=IFCSIMPLEPROPERTYTEMPLATE('2YXh$5Flb9OgCi13uMBKmZ',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4674=IFCSIMPLEPROPERTYTEMPLATE('3nWfdfhGLAXxJjkrTBXfl1',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4675=IFCSIMPLEPROPERTYTEMPLATE('32RV2p0nvFIfOqLylvPS3T',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4676=IFCSIMPLEPROPERTYTEMPLATE('1YnmEnHnDCB9magpHZO3G6',$,'IsForSullageWater','Indicates if the purpose of the floor trap is to receive sullage water, or if that is amongst its purposes (= TRUE), or not (= FALSE). Note that if TRUE, it is expected that an upstand or kerb will be placed around the floor trap to prevent the ingress of surface water runoff; the provision of the upstand or kerb is not dealt with in this property set.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4677=IFCSIMPLEPROPERTYTEMPLATE('3SjMZPFUHAMhRUNRi4S_WL',$,'SpilloverLevel','The level at which water spills out of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4678=IFCSIMPLEPROPERTYTEMPLATE('27Vs4lkjj2oOf0LJ7sxqqn',$,'TrapType','Identifies the predefined types of trap from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4679,$,$,$,.READWRITE.); +#4679=IFCPROPERTYENUMERATION('PEnum_TrapType',(IFCLABEL('NONE'),IFCLABEL('P_TRAP'),IFCLABEL('Q_TRAP'),IFCLABEL('S_TRAP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4680=IFCSIMPLEPROPERTYTEMPLATE('3$jz2n9bvEMPnPfdyD2QV4',$,'HasStrainer','Indicates whether the gully trap has a strainer (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4681=IFCSIMPLEPROPERTYTEMPLATE('2OEgmhcurAoxVLr$Nf6fWm',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4682=IFCSIMPLEPROPERTYTEMPLATE('1QG1oc4Q99$PcLfj5pNRkX',$,'InletPatternType','Identifies the pattern of inlet connections to a trap.A trap may have 0,1,2,3 or 4 inlet connections and the pattern of their arrangement may vary. The enumeration makes the convention that an outlet is either vertical or is placed at the bottom (south side) of the trap (when viewed in plan). Position 1 is to the left (west), position 2 is to the top (north), position 3 is to the right (east) and position 4 is to the bottom (south).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4683,$,$,$,.READWRITE.); +#4683=IFCPROPERTYENUMERATION('PEnum_InletPatternType',(IFCLABEL('1'),IFCLABEL('12'),IFCLABEL('123'),IFCLABEL('1234'),IFCLABEL('124'),IFCLABEL('13'),IFCLABEL('134'),IFCLABEL('14'),IFCLABEL('2'),IFCLABEL('23'),IFCLABEL('234'),IFCLABEL('24'),IFCLABEL('3'),IFCLABEL('34'),IFCLABEL('4'),IFCLABEL('NONE')),$); +#4684=IFCSIMPLEPROPERTYTEMPLATE('06az8q9$5FE8HkjQGMOKGb',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4685=IFCSIMPLEPROPERTYTEMPLATE('0W$RxjGen73ONjqOOcfyii',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4686=IFCSIMPLEPROPERTYTEMPLATE('0lHVRqzS104O01lEOEfYqH',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4687=IFCSIMPLEPROPERTYTEMPLATE('3r3g5$I$DBNwMSLpUq$su$',$,'CoverMaterial','Material from which the cover or grating is constructed.',.P_REFERENCEVALUE.,'IfcMaterialDefinition',$,$,$,$,$,.READWRITE.); +#4688=IFCPROPERTYSETTEMPLATE('2vTlzsF2v7c8VLcB6O0VCZ',$,'Pset_WasteTerminalTypeFloorWaste','Pipe fitting, set into the floor, that collects waste water and discharges it to a separate trap.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/FLOORWASTE,IfcWasteTerminalType/FLOORWASTE',(#4689,#4690,#4691,#4692,#4693,#4694)); +#4689=IFCSIMPLEPROPERTYTEMPLATE('2UyRx5kfn6sQgUNzW8Y4W_',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4690=IFCSIMPLEPROPERTYTEMPLATE('390SGQS7D0$894lQGzJmKI',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4691=IFCSIMPLEPROPERTYTEMPLATE('056HXvn895H820S0QcTPr6',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4692=IFCSIMPLEPROPERTYTEMPLATE('1f$102Tob8v9BKPgpx2$B2',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4693=IFCSIMPLEPROPERTYTEMPLATE('27wIRntbz9mPYvofmJvuoA',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4694=IFCSIMPLEPROPERTYTEMPLATE('2pYxZVleX8JAZOo4JXvLbd',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4695=IFCPROPERTYSETTEMPLATE('2nuYClaJbD2AOijSfVgy0M',$,'Pset_WasteTerminalTypeGullySump','Pipe fitting or assembly of fittings to receive surface water or waste water, fitted with a grating or sealed cover.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/GULLYSUMP,IfcWasteTerminalType/GULLYSUMP',(#4696,#4697,#4698,#4699,#4701,#4703,#4704,#4706,#4707,#4708)); +#4696=IFCSIMPLEPROPERTYTEMPLATE('3jv8vnSabFlPcZWMYr2EOF',$,'NominalSumpLength','Nominal or quoted length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4697=IFCSIMPLEPROPERTYTEMPLATE('2RlajVvdb4Bxz7JKrTYywm',$,'NominalSumpWidth','Nominal or quoted length measured along the y-axis in the local coordinate system of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4698=IFCSIMPLEPROPERTYTEMPLATE('3rYBwsSHfAXRZmL5S69ejG',$,'NominalSumpDepth','Nominal or quoted length measured along the z-axis in the local coordinate system of the sump.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4699=IFCSIMPLEPROPERTYTEMPLATE('3rfGe4Oi946QOjHcLDS3Da',$,'GullyType','Identifies the predefined types of gully from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4700,$,$,$,.READWRITE.); +#4700=IFCPROPERTYENUMERATION('PEnum_GullyType',(IFCLABEL('BACKINLET'),IFCLABEL('VERTICAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4701=IFCSIMPLEPROPERTYTEMPLATE('1ugsf2niL4Xvn$g$7KTblo',$,'TrapType','Identifies the predefined types of trap from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4702,$,$,$,.READWRITE.); +#4702=IFCPROPERTYENUMERATION('PEnum_TrapType',(IFCLABEL('NONE'),IFCLABEL('P_TRAP'),IFCLABEL('Q_TRAP'),IFCLABEL('S_TRAP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4703=IFCSIMPLEPROPERTYTEMPLATE('0UDPtV_896vh2NGGqcCp0K',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4704=IFCSIMPLEPROPERTYTEMPLATE('03hpGelib7lgZNf5tJAiMo',$,'BackInletPatternType','Identifies the pattern of inlet connections to a gully trap.A gulley trap may have 0,1,2,3 or 4 inlet connections and the pattern of their arrangement may vary. The enumeration makes the convention that an outlet is either vertical or is placed at the bottom (south side) of the gully trap (when viewed in plan). Position 1 is to the left (west), position 2 is to the top (north), position 3 is to the right (east) and position 4 is to the bottom (south).2\X2\000A\X0\ |! |\X2\000A\X0\1-| |-3\X2\000A\X0\ ! ||\X2\000A\X0\ 4',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4705,$,$,$,.READWRITE.); +#4705=IFCPROPERTYENUMERATION('PEnum_BackInletPatternType',(IFCLABEL('1'),IFCLABEL('12'),IFCLABEL('123'),IFCLABEL('1234'),IFCLABEL('124'),IFCLABEL('13'),IFCLABEL('134'),IFCLABEL('14'),IFCLABEL('2'),IFCLABEL('23'),IFCLABEL('234'),IFCLABEL('24'),IFCLABEL('3'),IFCLABEL('34'),IFCLABEL('4'),IFCLABEL('NONE')),$); +#4706=IFCSIMPLEPROPERTYTEMPLATE('15BVGaLRDBLg27AkU9mzIe',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4707=IFCSIMPLEPROPERTYTEMPLATE('0lvSPeb0H8xP5FsQJkOEC5',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4708=IFCSIMPLEPROPERTYTEMPLATE('0xTslDu_jCLfPWy_bnesJ7',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4709=IFCPROPERTYSETTEMPLATE('0RShy0NmLBAhyfMfRNQmDQ',$,'Pset_WasteTerminalTypeGullyTrap','Pipe fitting or assembly of fittings to receive surface water or waste water, fitted with a grating or sealed cover and discharging through a trap (BS6100 330 3504 modified)',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/GULLYTRAP,IfcWasteTerminalType/GULLYTRAP',(#4710,#4711,#4712,#4713,#4715,#4716,#4718,#4719,#4721,#4722,#4723)); +#4710=IFCSIMPLEPROPERTYTEMPLATE('0q9VQVXO9DsA0wjBmMdBe8',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4711=IFCSIMPLEPROPERTYTEMPLATE('3hfoX3cGz9bO4N_BBlrSDn',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4712=IFCSIMPLEPROPERTYTEMPLATE('02OxHbvnb5NP7F2IKFYU2I',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4713=IFCSIMPLEPROPERTYTEMPLATE('2kHzrsS7P7LfAj7D$boQby',$,'GullyType','Identifies the predefined types of gully from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4714,$,$,$,.READWRITE.); +#4714=IFCPROPERTYENUMERATION('PEnum_GullyType',(IFCLABEL('BACKINLET'),IFCLABEL('VERTICAL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4715=IFCSIMPLEPROPERTYTEMPLATE('14Olt7H8H79BlIg0SrYNAu',$,'HasStrainer','Indicates whether the gully trap has a strainer (= TRUE) or not (= FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4716=IFCSIMPLEPROPERTYTEMPLATE('0nqWM5rsb2yf7IjFxo70FT',$,'TrapType','Identifies the predefined types of trap from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4717,$,$,$,.READWRITE.); +#4717=IFCPROPERTYENUMERATION('PEnum_TrapType',(IFCLABEL('NONE'),IFCLABEL('P_TRAP'),IFCLABEL('Q_TRAP'),IFCLABEL('S_TRAP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4718=IFCSIMPLEPROPERTYTEMPLATE('3ID2zP_1f2qeMr6vMUJ$WQ',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4719=IFCSIMPLEPROPERTYTEMPLATE('1UnaJyKJz9EgEOyzXwnOT2',$,'BackInletPatternType','Identifies the pattern of inlet connections to a gully trap.A gulley trap may have 0,1,2,3 or 4 inlet connections and the pattern of their arrangement may vary. The enumeration makes the convention that an outlet is either vertical or is placed at the bottom (south side) of the gully trap (when viewed in plan). Position 1 is to the left (west), position 2 is to the top (north), position 3 is to the right (east) and position 4 is to the bottom (south).2\X2\000A\X0\ |! |\X2\000A\X0\1-| |-3\X2\000A\X0\ ! ||\X2\000A\X0\ 4',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4720,$,$,$,.READWRITE.); +#4720=IFCPROPERTYENUMERATION('PEnum_BackInletPatternType',(IFCLABEL('1'),IFCLABEL('12'),IFCLABEL('123'),IFCLABEL('1234'),IFCLABEL('124'),IFCLABEL('13'),IFCLABEL('134'),IFCLABEL('14'),IFCLABEL('2'),IFCLABEL('23'),IFCLABEL('234'),IFCLABEL('24'),IFCLABEL('3'),IFCLABEL('34'),IFCLABEL('4'),IFCLABEL('NONE')),$); +#4721=IFCSIMPLEPROPERTYTEMPLATE('1ZQjCh0TL2vuOCqa$fKg5p',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4722=IFCSIMPLEPROPERTYTEMPLATE('0whxD61arDZg7$gWN$tWIh',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4723=IFCSIMPLEPROPERTYTEMPLATE('1xStiHHwz3YgTmpaNHzdm0',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4724=IFCPROPERTYSETTEMPLATE('3078tQPb18QgxzqtSfTvkB',$,'Pset_WasteTerminalTypeRoofDrain','Pipe fitting, set into the roof, that collects rainwater for discharge into the rainwater system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/ROOFDRAIN,IfcWasteTerminalType/ROOFDRAIN',(#4725,#4726,#4727,#4728,#4729,#4730)); +#4725=IFCSIMPLEPROPERTYTEMPLATE('1NlfxrVnj6ywXMCOBJGDlP',$,'NominalBodyLength','Nominal or quoted length measured along the x-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4726=IFCSIMPLEPROPERTYTEMPLATE('0D4RQF7xz4j9rL3S_vgX4E',$,'NominalBodyWidth','Nominal or quoted length, measured along the y-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4727=IFCSIMPLEPROPERTYTEMPLATE('1SJTFkPz55$BxetaVpq09K',$,'NominalBodyDepth','Nominal or quoted length measured along the z-axis of the local coordinate system of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4728=IFCSIMPLEPROPERTYTEMPLATE('0k8lyqT6f9hw5UOunsL3cI',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4729=IFCSIMPLEPROPERTYTEMPLATE('0VAQkEoKD6fuikGqMi_mAu',$,'CoverLength','The length measured along the x-axis in the local coordinate system or the radius (in the case of a circular shape in plan) of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4730=IFCSIMPLEPROPERTYTEMPLATE('0jeP6Kkt54CBdi8U6bPFbd',$,'CoverWidth','The length measured along the y-axis in the local coordinate system of the cover of the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4731=IFCPROPERTYSETTEMPLATE('1ONiVEiS5AV9AhvhrrmxsT',$,'Pset_WasteTerminalTypeWasteDisposalUnit','Electrically operated device that reduces kitchen or other waste into fragments small enough to be flushed into a drainage system.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/WASTEDISPOSALUNIT,IfcWasteTerminalType/WASTEDISPOSALUNIT',(#4732,#4733,#4734)); +#4732=IFCSIMPLEPROPERTYTEMPLATE('0WuW6RsFL0R8F7OFLzgFhL',$,'DrainConnectionSize','Size of the drain connection inlet to the waste disposal unit.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4733=IFCSIMPLEPROPERTYTEMPLATE('3qRQpF8ar4eOkp1os4vp4p',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4734=IFCSIMPLEPROPERTYTEMPLATE('2crPsywOjCs8WK68qviOuq',$,'NominalDepth','Nominal Depth of the object',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4735=IFCPROPERTYSETTEMPLATE('3LiqfUKIz9M8fOlWUGgOCU',$,'Pset_WasteTerminalTypeWasteTrap','Pipe fitting, set adjacent to a sanitary terminal, that retains liquid to prevent the passage of foul air.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal/WASTETRAP,IfcWasteTerminalType/WASTETRAP',(#4736,#4738,#4739)); +#4736=IFCSIMPLEPROPERTYTEMPLATE('0DcbGL7_j5qghAYpgT4bzw',$,'WasteTrapType','Identifies the predefined types of trap from which the type required may be set.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4737,$,$,$,.READWRITE.); +#4737=IFCPROPERTYENUMERATION('PEnum_TrapType',(IFCLABEL('NONE'),IFCLABEL('P_TRAP'),IFCLABEL('Q_TRAP'),IFCLABEL('S_TRAP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4738=IFCSIMPLEPROPERTYTEMPLATE('22OUgrpF95hB$o4ug3e8WJ',$,'OutletConnectionSize','Size of the outlet connection from the object.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4739=IFCSIMPLEPROPERTYTEMPLATE('17DrrRKQHCJ9YTVy9B5llQ',$,'InletConnectionSize','Size of the inlet connection.\X2\000A\X0\Note that all inlet connections are assumed to be the same size.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4740=IFCPROPERTYSETTEMPLATE('0frSawCYz3Re7kgg$vwqrN',$,'Pset_WaterStratumCommon','Properties expressing the composition and any variability in the height of the body of water. Ranges are non-negative describing a spread.',.PSET_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum/WATER',(#4741,#4742,#4743,#4744,#4745,#4746)); +#4741=IFCSIMPLEPROPERTYTEMPLATE('3cZgE23vP2owB1xwQCEczD',$,'AnnualRange','Indicative (95%-100%) annual range in levels.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4742=IFCSIMPLEPROPERTYTEMPLATE('2cMk5Y5Vv9EQQJvWrV6pqz',$,'AnnualTrend','Indicative (95%-100%) annual rise in level.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4743=IFCSIMPLEPROPERTYTEMPLATE('0HIMBUONbC0QYVVJE5YmQI',$,'IsFreshwater','Indication of freshwater (true,false or unknown)',.P_SINGLEVALUE.,'IfcLogical',$,$,$,$,$,.READWRITE.); +#4744=IFCSIMPLEPROPERTYTEMPLATE('2KSxY4W5P7zRjHq3NzDCZu',$,'SeicheRange','Indicative (95%-100%) range between peaks and troughts of seiche (resonant) waves.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4745=IFCSIMPLEPROPERTYTEMPLATE('28W2D0APb9pRZINiuggLDl',$,'TidalRange','Indicative (95%-100%) range between high and low tide levels.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4746=IFCSIMPLEPROPERTYTEMPLATE('0qPRtsBkHBwPvKUkZtMaly',$,'WaveRange','Indicative (95%-100%) range between peaks and troughs of waves',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4747=IFCPROPERTYSETTEMPLATE('0ZLsVFSgX84RijpbrFjODo',$,'Pset_Width','Specifies the general properties for a Width event.',.PSET_OCCURRENCEDRIVEN.,'IfcReferent/WIDTHEVENT',(#4748,#4750,#4752)); +#4748=IFCSIMPLEPROPERTYTEMPLATE('074GxfOnH75wDr2CR4KWA4',$,'Side','Specifies if the width is measured to the RIGHT or to the LEFT of the curve referenced by the placement, or if the same value is applied to BOTH sides.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4749,$,$,$,.READWRITE.); +#4749=IFCPROPERTYENUMERATION('PEnum_SideType',(IFCLABEL('BOTH'),IFCLABEL('LEFT'),IFCLABEL('RIGHT')),$); +#4750=IFCSIMPLEPROPERTYTEMPLATE('1HONdaTwv2cgFb8JXHPUFP',$,'TransitionWidth','The type of transition of width used between the previous event and this event.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4751,$,$,$,.READWRITE.); +#4751=IFCPROPERTYENUMERATION('PEnum_TransitionWidthType',(IFCLABEL('CONST'),IFCLABEL('LINEAR')),$); +#4752=IFCSIMPLEPROPERTYTEMPLATE('3IF_k_1CHDYeq0a9g4icwo',$,'NominalWidth','The nominal overall width of the object. The size information is provided in addition to the shape representation and the geometric parameters used within. In cases of inconsistency between the geometric parameters and the size properties, provided in the attached property set, the geometric parameters take precedence.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4753=IFCPROPERTYSETTEMPLATE('2NELxUcbH0OAEY1qcSp5hA',$,'Pset_WindowCommon','Properties common to the definition of all occurrences of Window.',.PSET_TYPEDRIVENOVERRIDE.,'IfcWindow,IfcWindowType',(#4754,#4755,#4757,#4758,#4759,#4760,#4761,#4762,#4763,#4764,#4765,#4766,#4767,#4768,#4769,#4770,#4771)); +#4754=IFCSIMPLEPROPERTYTEMPLATE('21wWSv1KbFb9SuLxRCphPv',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4755=IFCSIMPLEPROPERTYTEMPLATE('2UDB$7XdX9yhhhmRei5_HO',$,'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',$,#4756,$,$,$,.READWRITE.); +#4756=IFCPROPERTYENUMERATION('PEnum_ElementStatus',(IFCLABEL('DEMOLISH'),IFCLABEL('EXISTING'),IFCLABEL('NEW'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4757=IFCSIMPLEPROPERTYTEMPLATE('2CcC80iMf3PvJiVSWwIHx1',$,'AcousticRating','Acoustic rating for this object.\X2\000A\X0\It is provided according to the national building code. It indicates the sound transmission resistance of this object by an index ratio (instead of providing full sound absorption values).',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4758=IFCSIMPLEPROPERTYTEMPLATE('00BBoIfsL5mx4IxDVAarJB',$,'FireRating','Fire rating for this object. It is given according to the national fire safety classification.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4759=IFCSIMPLEPROPERTYTEMPLATE('3t_KLwlunEDval_UYO5qj2',$,'SecurityRating','Index based rating system indicating security level.\X2\000A\X0\It is giving according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4760=IFCSIMPLEPROPERTYTEMPLATE('2U2NZLkAL2vOJSfYPSz$jf',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4761=IFCSIMPLEPROPERTYTEMPLATE('04qK1vtmb98gOpBs9DmjrY',$,'Infiltration','Infiltration flowrate of outside air for the filler object based on the area of the filler object at a pressure level of 50 Pascals. It shall be used, if the length of all joints is unknown.',.P_SINGLEVALUE.,'IfcVolumetricFlowRateMeasure',$,$,$,$,$,.READWRITE.); +#4762=IFCSIMPLEPROPERTYTEMPLATE('32PIo3BNL84OT2lsKM9cYV',$,'ThermalTransmittance','Thermal transmittance coefficient (U-Value) of an element, within the direction of the thermal flow (including all materials).',.P_SINGLEVALUE.,'IfcThermalTransmittanceMeasure',$,$,$,$,$,.READWRITE.); +#4763=IFCSIMPLEPROPERTYTEMPLATE('07PsdMwEX1r9T6OSm3y6kZ',$,'GlazingAreaFraction','Fraction of the glazing area relative to the total area of the filling element.\X2\000A\X0\It shall be used, if the glazing area is not given separately for all panels within the filling element.',.P_SINGLEVALUE.,'IfcPositiveRatioMeasure',$,$,$,$,$,.READWRITE.); +#4764=IFCSIMPLEPROPERTYTEMPLATE('1b$4b12612twYFe92QjChl',$,'HasSillExternal','Indication whether the window opening has an external sill (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4765=IFCSIMPLEPROPERTYTEMPLATE('0syrT5ER1AW89bjEUWP9_0',$,'HasSillInternal','Indication whether the window opening has an internal sill (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4766=IFCSIMPLEPROPERTYTEMPLATE('0X1CMHwajCPgVk0esCyRzn',$,'HasDrive','Indication whether this object has an automatic drive to operate it (TRUE) or no drive (FALSE)',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4767=IFCSIMPLEPROPERTYTEMPLATE('3Vek6GszLCXPold2H2h0KA',$,'SmokeStop','Indication whether the object is designed to provide a smoke stop (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4768=IFCSIMPLEPROPERTYTEMPLATE('1sgaMQr1577gBZiNVG_82U',$,'FireExit','Indication whether this object is designed to serve as an exit in the case of fire (TRUE) or not (FALSE).\X2\000A000A\X0\Here it defines an exit window in accordance to the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4769=IFCSIMPLEPROPERTYTEMPLATE('1xOQCpjIr6WRtRK4AIcBNo',$,'WaterTightnessRating','Water tightness rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4770=IFCSIMPLEPROPERTYTEMPLATE('0Rkk33S6D7mgbaOjVtZLJ5',$,'MechanicalLoadRating','Mechanical load rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4771=IFCSIMPLEPROPERTYTEMPLATE('0kyxdGEJr7QfdwB5da$mz7',$,'WindLoadRating','Wind load resistance rating for this object.\X2\000A\X0\It is provided according to the national building code.',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); +#4772=IFCPROPERTYSETTEMPLATE('19YaS_PPzDB9ASolDTt0ka',$,'Pset_WindowLiningProperties','Properties of the window lining.HISTORY New property set in IFC4.3.2.0 to replace the entity IfcWindowLiningProperties',.PSET_TYPEDRIVENOVERRIDE.,'IfcMember,IfcWindow,IfcMemberType,IfcWindowType',(#4773,#4774,#4775,#4776,#4777,#4778,#4779,#4780,#4781,#4782,#4783)); +#4773=IFCSIMPLEPROPERTYTEMPLATE('1fMyimdDzDTfZDdX$f4jua',$,'LiningDepth','The depth of the lining.\X2\000A000A\X0\For a window, it is the depth of the window lining, measured perpendicularly to window elevation plane.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4774=IFCSIMPLEPROPERTYTEMPLATE('3o3QeBHoTFvfz$ufJIhRIL',$,'LiningThickness','Thickness of the lining.\X2\000A000A\X0\For a window, it is the thickness of the window lining as explained in the figure below. If LiningThickness value is 0. (zero) it denotes a window without a lining (all other lining parameters shall be set to NIL in this case). If the LiningThickness is NIL it denotes that the value is not available.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4775=IFCSIMPLEPROPERTYTEMPLATE('1mo_shrCT9$g$F3ccU5tA7',$,'TransomThickness','Thickness of the transom.\X2\000A000A\X0\For a window, it is the thickness of the transom (horizontal separator of window panels within a window), measured parallel to the window elevation plane. The transom is part of the lining and the transom depth is assumed to be identical to the lining depth. If the TransomThickness is set to zero (and the TransomOffset set to a positive length), then the window is divided vertically without a physical divider.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4776=IFCSIMPLEPROPERTYTEMPLATE('0WCSgtTC56RAYuNNyjjHZ0',$,'MullionThickness','Thickness of the mullion.\X2\000A000A\X0\For a window, it is the thickness of the mullion (i.e., the vertical separator of window panels within a window), measured parallel to the window elevation plane. The mullion is part of the lining and the mullion depth is assumed to be identical to the lining depth. If the MullionThickness is set to zero (and the MullionOffset set to a positive length), then the window is divided horizontally without a physical divider.',.P_SINGLEVALUE.,'IfcNonNegativeLengthMeasure',$,$,$,$,$,.READWRITE.); +#4777=IFCSIMPLEPROPERTYTEMPLATE('23jJtSjuf5Le$RMJzGpQIX',$,'FirstTransomOffset','Offset of the transom centerline, measured along the z-axis of the window placement coordinate system. An offset value = 0.5 indicates that the transom is positioned in the middle of the window.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#4778=IFCSIMPLEPROPERTYTEMPLATE('08HeZ9r_bFdvG7LD6$dlOa',$,'SecondTransomOffset','Offset of the transom centerline for the second transom, measured along the x-axis of the window placement co-ordinate system. An offset value = 0.666 indicates that the second transom is positioned at two/third of the window.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#4779=IFCSIMPLEPROPERTYTEMPLATE('17G_7JmkvFcxQ62TBtg_Xf',$,'FirstMullionOffset','Offset of the mullion centerline, measured along the x-axis of the window placement coordinate system. An offset value = 0.5 indicates that the mullion is positioned in the middle of the window.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#4780=IFCSIMPLEPROPERTYTEMPLATE('2cUiBiyYT9Y8e2OYMBZPR2',$,'SecondMullionOffset','Offset of the mullion centerline for the second mullion, measured along the x-axis of the window placement co-ordinate system. An offset value = 0.666 indicates that the second mullion is positioned at two/third of the window.',.P_SINGLEVALUE.,'IfcNormalisedRatioMeasure',$,$,$,$,$,.READWRITE.); +#4781=IFCSIMPLEPROPERTYTEMPLATE('2U$SAC8OD6w8taEOc_Gnf8',$,'LiningOffset','Offset of the lining.\X2\000A000A\X0\For a window, it is the offset of the window lining, given as distance along the y axis of the local placement (perpendicular to the window plane).',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4782=IFCSIMPLEPROPERTYTEMPLATE('3OyOkAmSrEdxtRCqB$KEUS',$,'LiningToPanelOffsetX','Offset between the lining and the panel, measured along the x-axis of the local placement.\X2\000A000A\X0\For a window, it is the offset between the lining and the window panel. Should be smaller or equal to the LiningThickness.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4783=IFCSIMPLEPROPERTYTEMPLATE('0y5V$H2DfAkvdbdx2COp9Z',$,'LiningToPanelOffsetY','Offset between the lining and the panel, measured along the y-axis of the local placement.\X2\000A000A\X0\For a window, it is the offset between the lining and the window panel. Should be smaller or equal to the IfcWindowPanelProperties.PanelThickness.',.P_SINGLEVALUE.,'IfcLengthMeasure',$,$,$,$,$,.READWRITE.); +#4784=IFCPROPERTYSETTEMPLATE('0SufkeVYzFeBdGkUy9M6B3',$,'Pset_WindowPanelProperties','Properties of the window panel.HISTORY New property set in IFC4.3.2.0 to replace the entity IfcWindowPanelProperties',.PSET_TYPEDRIVENOVERRIDE.,'IfcPlate,IfcWindow,IfcPlateType,IfcWindowType',(#4785,#4787,#4789,#4790)); +#4785=IFCSIMPLEPROPERTYTEMPLATE('0cd6WCuYf7aOrsvWmNefg0',$,'OperationType','Type of operations. Also used to assign standard symbolic presentations according to national building standards.\X2\000A000A\X0\For a window, it is the type of window panel operations. Also used to assign standard symbolic presentations according to national building standards.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4786,$,$,$,.READWRITE.); +#4786=IFCPROPERTYENUMERATION('PEnum_WindowPanelOperationEnum',(IFCLABEL('BOTTOMHUNG'),IFCLABEL('FIXEDCASEMENT'),IFCLABEL('OTHEROPERATION'),IFCLABEL('PIVOTHORIZONTAL'),IFCLABEL('PIVOTVERTICAL'),IFCLABEL('REMOVABLECASEMENT'),IFCLABEL('SIDEHUNGLEFTHAND'),IFCLABEL('SIDEHUNGRIGHTHAND'),IFCLABEL('SLIDINGHORIZONTAL'),IFCLABEL('SLIDINGVERTICAL'),IFCLABEL('TILTANDTURNLEFTHAND'),IFCLABEL('TILTANDTURNRIGHTHAND'),IFCLABEL('TOPHUNG'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4787=IFCSIMPLEPROPERTYTEMPLATE('2O1P9XfSL8xB98HR$4j5A0',$,'PanelPosition','Position of the panel.\X2\000A000A\X0\For a window, it is the position of the panel within the overall window style.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4788,$,$,$,.READWRITE.); +#4788=IFCPROPERTYENUMERATION('PEnum_WindowPanelPositionEnum',(IFCLABEL('BOTTOM'),IFCLABEL('LEFT'),IFCLABEL('MIDDLE'),IFCLABEL('RIGHT'),IFCLABEL('TOP'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4789=IFCSIMPLEPROPERTYTEMPLATE('1YLnYd1er3zhlKK8aaEtKa',$,'FrameDepth','The length (or depth) of the frame.\X2\000A000A\X0\For a window, it is the depth of panel frame, measured from front face to back face horizontally (i.e. perpendicular to the window elevation plane).',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4790=IFCSIMPLEPROPERTYTEMPLATE('07NknO4Xn7mQ8keOWVpQTn',$,'FrameThickness','The thickness of the frame.\X2\000A000A\X0\For a window, it is the width of panel frame, measured from inside of panel (at glazing) to outside of panel (at lining), i.e. parallel to the window (elevation) plane.',.P_SINGLEVALUE.,'IfcPositiveLengthMeasure',$,$,$,$,$,.READWRITE.); +#4791=IFCPROPERTYSETTEMPLATE('3XW$iVfcL6Pu3Z97xXNYCg',$,'Pset_WiredCommunicationPortCommon','Properties used for wired communication port.',.PSET_OCCURRENCEDRIVEN.,'IfcDistributionPort/CABLE',(#4792,#4794)); +#4792=IFCSIMPLEPROPERTYTEMPLATE('0R3oMy24L4$eTIF7dxzTha',$,'CommunicationStandard','Indicates the communication standard supported by the physical wired communication port.',.P_ENUMERATEDVALUE.,'IfcLabel',$,#4793,$,$,$,.READWRITE.); +#4793=IFCPROPERTYENUMERATION('PEnum_CommunicationStandard',(IFCLABEL('ETHERNET'),IFCLABEL('STM_1'),IFCLABEL('STM_16'),IFCLABEL('STM_256'),IFCLABEL('STM_4'),IFCLABEL('STM_64'),IFCLABEL('USB'),IFCLABEL('XDSL'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$); +#4794=IFCSIMPLEPROPERTYTEMPLATE('3sk2O6VjrCdOwWF6nj7M66',$,'MaximumTransferRate','Indicates the transmission rate in bit/s over the wired port.',.P_SINGLEVALUE.,'IfcIntegerCountRateMeasure',$,$,$,$,$,.READWRITE.); +#4795=IFCPROPERTYSETTEMPLATE('2I$aH70lX21gGvw7$UvPIn',$,'Pset_WorkControlCommon','Properties common to the definition of all occurrences of IfcWorkPlan and IfcWorkSchedule (subtypes of IfcWorkControl).',.PSET_OCCURRENCEDRIVEN.,'IfcWorkControl',(#4796,#4797,#4798,#4799,#4800)); +#4796=IFCSIMPLEPROPERTYTEMPLATE('3nvkmLT419VvVnsXwt7K6Z',$,'WorkStartTime','The default time of day a task is scheduled to start. For presentation purposes, if the start time of a task matches the WorkStartTime, then applications may choose to display the date only. Conversely when entering dates without specifying time, applications may automatically append the WorkStartTime.',.P_SINGLEVALUE.,'IfcTime',$,$,$,$,$,.READWRITE.); +#4797=IFCSIMPLEPROPERTYTEMPLATE('30gzeFpuT6qPcl2$M5uMSn',$,'WorkFinishTime','The default time of day a task is scheduled to finish. For presentation purposes, if the finish time of a task matches the WorkFinishTime, then applications may choose to display the date only. Conversely when entering dates without specifying time, applications may automatically append the WorkFinishTime.',.P_SINGLEVALUE.,'IfcTime',$,$,$,$,$,.READWRITE.); +#4798=IFCSIMPLEPROPERTYTEMPLATE('1IYfB1Y7PCrx7SVLqZkeFq',$,'WorkDayDuration','The elapsed time within a worktime-based day. For presentation purposes, applications may choose to display IfcTask durations in work days where IfcTaskTime.DurationType=WORKTIME. This value must be less than or equal to 24 hours (an elapsed day); if omitted then 8 hours is assumed.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#4799=IFCSIMPLEPROPERTYTEMPLATE('3gO13M3Cf9lvI13AXdB_Za',$,'WorkWeekDuration','The elapsed time within a worktime-based week. For presentation purposes, applications may choose to display IfcTask durations in work weeks where IfcTaskTime.DurationType=WORKTIME. This value must be less than or equal to 168 hours (an elapsed week); if omitted then 40 hours is assumed.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#4800=IFCSIMPLEPROPERTYTEMPLATE('2TPxdWhXf7yBumrMk_UPYT',$,'WorkMonthDuration','The elapsed time within a worktime-based month. For presentation purposes, applications may choose to display IfcTask durations in work months where IfcTaskTime.DurationType=WORKTIME. This value must be less than or equal to 744 hours (an elapsed month of 31 days); if omitted then 160 hours is assumed.',.P_SINGLEVALUE.,'IfcDuration',$,$,$,$,$,.READWRITE.); +#4801=IFCPROPERTYSETTEMPLATE('2JHjH65oj1Kfd6Ei9JjM7e',$,'Pset_ZoneCommon','Properties common to the definition of all occurrences of IfcZone.',.PSET_OCCURRENCEDRIVEN.,'IfcZone',(#4802,#4803,#4804,#4805,#4806,#4807)); +#4802=IFCSIMPLEPROPERTYTEMPLATE('2N8RLItvrCderJucFaajeZ',$,'Reference','Reference ID for this specified type in this project (e.g. type ''A-1''), Also referred to as "construction type". It should be provided as an alternative to the name of the "object type", if the software does not support object types and no classification reference to a recognized classification system used.IFC4.3.0.0 DEPRECATION The Reference property is deprecated and shall no longer be used, use attribute Name on the relating type instead.',.P_SINGLEVALUE.,'IfcIdentifier',$,$,$,$,$,.READWRITE.); +#4803=IFCSIMPLEPROPERTYTEMPLATE('2RkUi$gQrAPxErrJN_qfJH',$,'IsExternal','Indication whether the element is designed for use in the exterior (TRUE) or not (FALSE). If (TRUE) it is an external element and faces the outside of the building.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4804=IFCSIMPLEPROPERTYTEMPLATE('0knwJQQWXEHwA7OtkIC43V',$,'GrossPlannedArea','Total planned gross area of the spatial structure element. Used for programming the spatial structure element.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#4805=IFCSIMPLEPROPERTYTEMPLATE('2jY51pnuf4jw8HkXQGJI$m',$,'NetPlannedArea','Total planned net area of the object. Used for programming the object.',.P_SINGLEVALUE.,'IfcAreaMeasure',$,$,$,$,$,.READWRITE.); +#4806=IFCSIMPLEPROPERTYTEMPLATE('3kYa1iU_D1OPYgEu2G0BR2',$,'PubliclyAccessible','Indication whether this space (in case of e.g., a toilet) is designed to serve as a publicly accessible space, e.g., for a public toilet (TRUE) or not (FALSE).',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4807=IFCSIMPLEPROPERTYTEMPLATE('26ljzPZh18dvUT4559ZlSc',$,'HandicapAccessible','Indication that this object is designed to be accessible by the handicapped. Set to (TRUE) if this object is rated as handicap accessible according to the local building codes, otherwise (FALSE). It is giving according to the requirements of the national building code.',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#4808=IFCPROPERTYSETTEMPLATE('0XBuKrD2HAxh7FQFFCdaNT',$,'Qto_ActuatorBaseQuantities','Base quantities that are common to the definition of all occurrences of actuator.',.QTO_TYPEDRIVENOVERRIDE.,'IfcActuator,IfcActuatorType',(#4809)); +#4809=IFCSIMPLEPROPERTYTEMPLATE('3v1jYDkkz1nAwUwhvJ245r',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4810=IFCPROPERTYSETTEMPLATE('0mjd6VFpH4EuToq6pKv81u',$,'Qto_AirTerminalBaseQuantities','Base quantities that are common to the definition of all types of air terminals.',.QTO_TYPEDRIVENOVERRIDE.,'IfcAirTerminal,IfcAirTerminalType',(#4811,#4812,#4813)); +#4811=IFCSIMPLEPROPERTYTEMPLATE('03B5XmOUvELRRVcmYrlY_y',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4812=IFCSIMPLEPROPERTYTEMPLATE('1nQJJWIGn3WhB3Gt$22NTE',$,'Perimeter','Perimeter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4813=IFCSIMPLEPROPERTYTEMPLATE('0QweRGaULCPuG641KDoyoM',$,'TotalSurfaceArea','Total surface area of the element.\X2\000A000A\X0\Concerns the air terminal face plate.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4814=IFCPROPERTYSETTEMPLATE('2zF$LWRiT3ah0CD5mmbIOa',$,'Qto_AirTerminalBoxTypeBaseQuantities','Base quantities that are common to the definition of all types of air terminal boxes.',.QTO_TYPEDRIVENOVERRIDE.,'IfcAirTerminalBox,IfcAirTerminalBoxType',(#4815)); +#4815=IFCSIMPLEPROPERTYTEMPLATE('1LMVAtLzr0$uvRSsBI8hc4',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4816=IFCPROPERTYSETTEMPLATE('3$fH1_8bXC0QJK31lE4w0e',$,'Qto_AirToAirHeatRecoveryBaseQuantities','Base quantities that are common to the definition of all types of air-to-air heat recovery elements.',.QTO_TYPEDRIVENOVERRIDE.,'IfcAirToAirHeatRecovery,IfcAirToAirHeatRecoveryType',(#4817)); +#4817=IFCSIMPLEPROPERTYTEMPLATE('34TS77vJnAr8Oxneinq9lF',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4818=IFCPROPERTYSETTEMPLATE('3TZgjQFAbERAJyVtrAIu8E',$,'Qto_AlarmBaseQuantities','Base quantities that are common to the definition of all occurrences of alarm.',.QTO_TYPEDRIVENOVERRIDE.,'IfcAlarm,IfcAlarmType',(#4819)); +#4819=IFCSIMPLEPROPERTYTEMPLATE('2v1z0xx49C1uMeY689N8oz',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4820=IFCPROPERTYSETTEMPLATE('1mZjqRXp5Bx8flGyKwSHIa',$,'Qto_ArealStratumBaseQuantities','Quantity measures associated to areal stratum such as in a geotechnical slice. Uncertainty is documented in Pset_Uncertainty.',.QTO_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum',(#4821,#4822,#4823)); +#4821=IFCSIMPLEPROPERTYTEMPLATE('2I0qcUdp51nguObT7uKwTs',$,'Area','Calculated area for the object.\X2\000A000A\X0\Area represented, if lower edge of stratum known.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4822=IFCSIMPLEPROPERTYTEMPLATE('0wAjiC7lDE09W9_k$cUYEu',$,'Length','The length of the object.\X2\000A000A\X0\Of upper edge of slice.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4823=IFCSIMPLEPROPERTYTEMPLATE('0waazsJ5r8OBDmnAjtL0Xu',$,'PlanLength','Projected plan length of upper edge of slice.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4824=IFCPROPERTYSETTEMPLATE('2UzJgVBJP5Dhtpa$j6Eq5Y',$,'Qto_AudioVisualApplianceBaseQuantities','Base quantities that are common to the definition of all occurrences of audio visual appliance.',.QTO_TYPEDRIVENOVERRIDE.,'IfcAudioVisualAppliance,IfcAudioVisualApplianceType',(#4825)); +#4825=IFCSIMPLEPROPERTYTEMPLATE('1cFpY5HIX2M8ktmyS2um2q',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4826=IFCPROPERTYSETTEMPLATE('1mJotGWDDFAOPh9vzjaDZb',$,'Qto_BeamBaseQuantities','Base quantities that are common to the definition of all occurrences of beams.',.QTO_TYPEDRIVENOVERRIDE.,'IfcBeam,IfcBeamType',(#4827,#4828,#4829,#4830,#4831,#4832,#4833,#4834,#4835)); +#4827=IFCSIMPLEPROPERTYTEMPLATE('3DmVVB0YLE8u_PpkYf_vwD',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4828=IFCSIMPLEPROPERTYTEMPLATE('2PmSDjXuv8GuCbcAdxetiR',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4829=IFCSIMPLEPROPERTYTEMPLATE('3cS6E3FYrFWfuQcjVULsHg',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4830=IFCSIMPLEPROPERTYTEMPLATE('0QSM65qGnFTw4UGRBAVPYa',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4831=IFCSIMPLEPROPERTYTEMPLATE('2OTBsyKcrAMwCdJgS661aY',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4832=IFCSIMPLEPROPERTYTEMPLATE('3LF8zX5zL4SRVmuzAIuWSD',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4833=IFCSIMPLEPROPERTYTEMPLATE('2AAC7ksCLErBLsVaVgDyCy',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4834=IFCSIMPLEPROPERTYTEMPLATE('2hFEADcLr65xR0NFkCpfjQ',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4835=IFCSIMPLEPROPERTYTEMPLATE('1m0fsqM614894fI__Nkr8_',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4836=IFCPROPERTYSETTEMPLATE('2KS9su6r517uLXTGKwwDdn',$,'Qto_BodyGeometryValidation','Quantities supplied for validating the correct interpretation of the body shape representation at import. In case of multiple representation items, the quantities are summed for each of the items (irrespective of any overlap). Choosing a suitable tolerance value for comparing the supplied numbers to the numbers calculated from the reconstructed geometry is at the discretion of the importing application.',.QTO_OCCURRENCEDRIVEN.,'IfcProduct',(#4837,#4838,#4839,#4840,#4841,#4842)); +#4837=IFCSIMPLEPROPERTYTEMPLATE('3iCdOOLRjCwQ_HRTB41Xh8',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.\X2\000A000A\X0\Total gross surface area of the element before applying product-level geometric features such as openings and projections.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4838=IFCSIMPLEPROPERTYTEMPLATE('0juemEqF5889vg7HwR87Fv',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net surface area of the element after applying product-level geometric features such as openings and projections.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4839=IFCSIMPLEPROPERTYTEMPLATE('1LUuLSnMXFDgGLBCvte8aH',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.\X2\000A000A\X0\Total gross volume of the element before applying product-level geometric features such as openings and projections.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4840=IFCSIMPLEPROPERTYTEMPLATE('0ny7TXUFz8wvnoQ2eU8czF',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the element before applying product-level geometric features such as openings and projections.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4841=IFCSIMPLEPROPERTYTEMPLATE('31g8_gdUv8KRkOWzW48KoP',$,'SurfaceGenusBeforeFeatures','The Surface Genus of the evaluated representation items before applying product-level geometric features such as openings and projections.Surface Genus is a topological measure that represents the number of "holes" or "handles" on a surface. For example, a sphere has genus 0, and a torus has genus 1.Computed using the Euler characteristic:$$\\chi=V-E+F$$With the numbers of vertices (V), edges (E) and faces (F)$$\\chi=2\X2\2212\X0\2g\X2\2212\X0\b$$With surface genus (g) and the number of boundaries (b) the latter zero in case of an enclosed volume.',.Q_COUNT.,$,$,$,$,$,$,.READWRITE.); +#4842=IFCSIMPLEPROPERTYTEMPLATE('3kBBtGUebC09mUggGTKpjj',$,'SurfaceGenusAfterFeatures','The Surface Genus of the evaluated representation items after applying product-level geometric features such as openings and projections.Surface Genus is a topological measure that represents the number of "holes" or "handles" on a surface. For example, a sphere has genus 0, and a torus has genus 1.Computed using the Euler characteristic:$$\\chi=V-E+F$$With the numbers of vertices (V), edges (E) and faces (F)$$\\chi=2\X2\2212\X0\2g\X2\2212\X0\b$$With surface genus (g) and the number of boundaries (b) the latter zero in case of an enclosed volume.',.Q_COUNT.,$,$,$,$,$,$,.READWRITE.); +#4843=IFCPROPERTYSETTEMPLATE('0bGW4$csTD6OEAus6LeP_W',$,'Qto_BoilerBaseQuantities','Base quantities that are common to the definition of all types of boilers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcBoiler,IfcBoilerType',(#4844,#4845,#4846)); +#4844=IFCSIMPLEPROPERTYTEMPLATE('1KlNInP2X9oB1dhIKHT8T0',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4845=IFCSIMPLEPROPERTYTEMPLATE('2Q3voxL3j64grR7xc4etVh',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the element, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4846=IFCSIMPLEPROPERTYTEMPLATE('2K7F9gJr98exVXBqifO$Z7',$,'TotalSurfaceArea','Total surface area of the element.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4847=IFCPROPERTYSETTEMPLATE('0nGE1R71b5xhwffxbnq9FD',$,'Qto_BuildingBaseQuantities','Base quantities that are common to the definition of all occurrences of building.',.QTO_OCCURRENCEDRIVEN.,'IfcBuilding',(#4848,#4849,#4850,#4851,#4852,#4853,#4854)); +#4848=IFCSIMPLEPROPERTYTEMPLATE('2PVoetDtD9lP2rdqNL$MSX',$,'Height','Characteristic height\X2\000A000A\X0\Standard gross height of this building, from the top surface of the construction floor, to the top surface of the construction floor or roof above. Only provided is there is a constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4849=IFCSIMPLEPROPERTYTEMPLATE('3cQmPNtaj41Q5nkgcnuelE',$,'EavesHeight','Standard net height of this storey, from the top surface of the construction floor, to the bottom surface of the construction floor or roof above. Only provided is there is a constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4850=IFCSIMPLEPROPERTYTEMPLATE('1MtjYvS851xhJQpwaUm5Hf',$,'FootPrintArea','Gross area of the site covered by the building(s).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4851=IFCSIMPLEPROPERTYTEMPLATE('0xWEv1hg5C3BQxDr9aySXn',$,'GrossFloorArea','Sum of all gross floor areas within the spatial structure element.\X2\000A000A\X0\Includes the area of construction elements within the building. May be provided in addition to the quantities of the spaces and the construction elements assigned to the building. In case of inconsistencies, the individual quantities of spaces and construction elements take precedence.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4852=IFCSIMPLEPROPERTYTEMPLATE('1t1klEXmn1BhESIFOtxxL5',$,'NetFloorArea','Sum of all net usable floor areas.\X2\000A000A\X0\It excludes the area of construction elements within the building. May be provided in addition to the quantities of the spaces assigned to the building. In case of inconsistencies, the individual quantities of spaces take precedence.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4853=IFCSIMPLEPROPERTYTEMPLATE('2E9lxMppn4kg7CkvlrakDR',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.\X2\000A000A\X0\Sum of all gross volumes of spaces enclosed. It includes the volumes of construction elements within the element. May be provided in addition to the quantities of the spaces and the construction elements assigned to the element. In case of inconsistencies, the individual quantities of spaces and construction elements take precedence.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4854=IFCSIMPLEPROPERTYTEMPLATE('10OBBDSy5BnQoOfE9PRwj0',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Sum of all net volumes of spaces enclosed by the building. It excludes the volumes of construction elements within the building. May be provided in addition to the quantities of the spaces assigned to the building. In case of inconsistencies, the individual quantities of spaces take precedence.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4855=IFCPROPERTYSETTEMPLATE('2$_oarY2j3v8qBbIPdWTL3',$,'Qto_BuildingElementProxyQuantities','Quantity set for Building Element Proxies.',.QTO_TYPEDRIVENOVERRIDE.,'IfcBuildingElementProxy,IfcBuildingElementProxyType',(#4856,#4857)); +#4856=IFCSIMPLEPROPERTYTEMPLATE('2lDu2tXt128hHlstYjsOMK',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4857=IFCSIMPLEPROPERTYTEMPLATE('1uU1iU6d1C7QicHF7EHZyg',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4858=IFCPROPERTYSETTEMPLATE('3r00ySoPj6qBXFt6Otog3m',$,'Qto_BuildingStoreyBaseQuantities','Base quantities that are common to the definition of all occurrences of building storey.',.QTO_OCCURRENCEDRIVEN.,'IfcBuildingStorey',(#4859,#4860,#4861,#4862,#4863,#4864,#4865)); +#4859=IFCSIMPLEPROPERTYTEMPLATE('3YbtmioKj8LPj$Q7UGj_Ex',$,'GrossHeight','Standard gross height of this storey, from the top surface of the construction floor, to the top surface of the construction floor or roof above. Only provided is there is a constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4860=IFCSIMPLEPROPERTYTEMPLATE('1THHvP8XL7Z8R8E_XWcz22',$,'NetHeight','Standard net height of this storey, from the top surface of the construction floor, to the bottom surface of the construction floor or roof above. Only provided is there is a constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4861=IFCSIMPLEPROPERTYTEMPLATE('1VshZhkdnD3P3haoouzMOg',$,'GrossPerimeter','Gross perimeter at the outer contour of the object.\X2\000A000A\X0\Without taking interior slab openings into account.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4862=IFCSIMPLEPROPERTYTEMPLATE('3qvJKNSI9E6Pe5dW1o_F35',$,'GrossFloorArea','Sum of all gross floor areas within the spatial structure element.\X2\000A000A\X0\Includes the area of construction elements within the building storey. May be provided in addition to the quantities of the spaces and the construction elements assigned to the storey. In case of inconsistencies, the individual quantities of spaces and construction elements take precedence.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4863=IFCSIMPLEPROPERTYTEMPLATE('13iHPjYSP0oRKjo4dV$QhE',$,'NetFloorArea','Sum of all net usable floor areas.\X2\000A000A\X0\It excludes the area of construction elements within the building storey. May be provided in addition to the quantities of the spaces assigned to the storey. In case of inconsistencies, the individual quantities of spaces take precedence.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4864=IFCSIMPLEPROPERTYTEMPLATE('2734peH0LEVhs0qUP$yFVB',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.\X2\000A000A\X0\Sum of all gross volumes of spaces enclosed. It includes the volumes of construction elements within the element. May be provided in addition to the quantities of the spaces and the construction elements assigned to the element. In case of inconsistencies, the individual quantities of spaces and construction elements take precedence.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4865=IFCSIMPLEPROPERTYTEMPLATE('1nCZux3vjDUPn0oKUAhzbw',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Sum of all net volumes of spaces enclosed by the building storey. It iexcludes the volumes of construction elements within the building storey. May be provided in addition to the quantities of the spaces assigned to the storey. In case of inconsistencies, the individual quantities of spaces take precedence.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4866=IFCPROPERTYSETTEMPLATE('01z0bbrsTF9unAZyqr6pZd',$,'Qto_BurnerBaseQuantities','Base quantities that are common to the definition of all types of burners.',.QTO_TYPEDRIVENOVERRIDE.,'IfcBurner,IfcBurnerType',(#4867)); +#4867=IFCSIMPLEPROPERTYTEMPLATE('3u75uVzD587woXtBZ6dyx8',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4868=IFCPROPERTYSETTEMPLATE('3H5DtQZbzAG98cGEyTJSrX',$,'Qto_CableCarrierFittingBaseQuantities','Base quantities that are common to the definition of all occurrences of cable carrier fitting.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCableCarrierFitting,IfcCableCarrierFittingType',(#4869)); +#4869=IFCSIMPLEPROPERTYTEMPLATE('2HRSPmvE923gzHJHV178ZF',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4870=IFCPROPERTYSETTEMPLATE('1P$qtdIJPC_x4a79_LxS2Y',$,'Qto_CableCarrierSegmentBaseQuantities','Base quantities that are common to the definition of all occurrences of cable carrier segment.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment,IfcCableCarrierSegmentType',(#4871,#4872,#4873,#4874)); +#4871=IFCSIMPLEPROPERTYTEMPLATE('0RB5DuacfAxe0kf6D6zAZs',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4872=IFCSIMPLEPROPERTYTEMPLATE('2_RAKFOq91Q9Qo6pupg4QE',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section, equal to the distance between inlet and outlet ports.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4873=IFCSIMPLEPROPERTYTEMPLATE('3L1vlQBv55oA48q$lPkRWb',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4874=IFCSIMPLEPROPERTYTEMPLATE('2UBIjkl3PBTBAJktXVW1cF',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4875=IFCPROPERTYSETTEMPLATE('1_c6w2dZrBivoUsNQh9U9N',$,'Qto_CableFittingBaseQuantities','Base quantities that are common to the definition of all occurrences of flow cable fitting.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCableFitting,IfcCableFittingType',(#4876)); +#4876=IFCSIMPLEPROPERTYTEMPLATE('0uC1neWmr8R9f2QzD65eST',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4877=IFCPROPERTYSETTEMPLATE('11cQpcy_18AueU4HI7Utp6',$,'Qto_CableSegmentBaseQuantities','Base quantities that are common to the definition of all occurrences of cable segment.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCableSegment,IfcCableSegmentType',(#4878,#4879,#4880,#4881)); +#4878=IFCSIMPLEPROPERTYTEMPLATE('33UNkY9Hf63QSHZEQHX4V9',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4879=IFCSIMPLEPROPERTYTEMPLATE('2i2vzjec9EVvSzMbm8Ef3s',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section, equal to the distance between inlet and outlet ports.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4880=IFCSIMPLEPROPERTYTEMPLATE('0eCSwkD218nvvuovheNppd',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4881=IFCSIMPLEPROPERTYTEMPLATE('0KXqBjZyfAAenKHxJl3Fis',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4882=IFCPROPERTYSETTEMPLATE('00D5I_wgL8Zhh$x4msdT61',$,'Qto_ChillerBaseQuantities','Base quantities that are common to the definition of all types of chillers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcChiller,IfcChillerType',(#4883)); +#4883=IFCSIMPLEPROPERTYTEMPLATE('3vCvNcnp51V9qqTl46JLkB',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4884=IFCPROPERTYSETTEMPLATE('3SeBTilbz4UvlQcOinHBtl',$,'Qto_ChimneyBaseQuantities','Base quantities that are common to the definition of all occurrences of chimneys.',.QTO_TYPEDRIVENOVERRIDE.,'IfcChimney,IfcChimneyType',(#4885)); +#4885=IFCSIMPLEPROPERTYTEMPLATE('3e1icCoY15U88exoPYnODT',$,'Length','The length of the object.\X2\000A000A\X0\From the foundation (or beginning) to the top not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4886=IFCPROPERTYSETTEMPLATE('2_J$tDmor3dxAzut5PRm64',$,'Qto_CoilBaseQuantities','Base quantities that are common to the definition of all types of coils.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCoil,IfcCoilType',(#4887)); +#4887=IFCSIMPLEPROPERTYTEMPLATE('3iAKZ5QU5CDeArrlc7CZ5F',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4888=IFCPROPERTYSETTEMPLATE('1Dj42Jkgz4pO$RxflOlSRb',$,'Qto_ColumnBaseQuantities','Base quantities that are common to the definition of all occurrences of columns.',.QTO_TYPEDRIVENOVERRIDE.,'IfcColumn,IfcColumnType',(#4889,#4890,#4891,#4892,#4893,#4894,#4895,#4896,#4897)); +#4889=IFCSIMPLEPROPERTYTEMPLATE('0qWdE1PPDAggIMtvYK$mqt',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4890=IFCSIMPLEPROPERTYTEMPLATE('1mcrdX_THBdvwK79m7Zjvd',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4891=IFCSIMPLEPROPERTYTEMPLATE('2dI5qHijv7JxLI9va4XZ0R',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4892=IFCSIMPLEPROPERTYTEMPLATE('37NhO1$y974OghfA81lz$S',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4893=IFCSIMPLEPROPERTYTEMPLATE('1VCqdw6Y98y8E3UiJPhf3X',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4894=IFCSIMPLEPROPERTYTEMPLATE('2O3FI$PHLABRn0cpPF$Ntd',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4895=IFCSIMPLEPROPERTYTEMPLATE('0qh5GUPGr38eYaPmFB6PFj',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4896=IFCSIMPLEPROPERTYTEMPLATE('3G$INUFHf2KPUUS$ArquAs',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4897=IFCSIMPLEPROPERTYTEMPLATE('2o8MsHsfb4b8rBj1dSaS2P',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4898=IFCPROPERTYSETTEMPLATE('2bAdFJtCXCQOb11VJ$9M6O',$,'Qto_CommunicationsApplianceBaseQuantities','Base quantities that are common to the definition of all occurrences of communications appliance.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCommunicationsAppliance,IfcCommunicationsApplianceType',(#4899)); +#4899=IFCSIMPLEPROPERTYTEMPLATE('07GItdScj7rQuaLLRrmSxc',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4900=IFCPROPERTYSETTEMPLATE('2ghjm4AAnDtQA7v_SUFLPf',$,'Qto_CompressorBaseQuantities','Base quantities that are common to the definition of all types of compressors.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCompressor,IfcCompressorType',(#4901)); +#4901=IFCSIMPLEPROPERTYTEMPLATE('3cQqej64PABhZw$kf4UXM$',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4902=IFCPROPERTYSETTEMPLATE('3SN0Q3WAHB2u$kNUjP_cxc',$,'Qto_CondenserBaseQuantities','Base quantities that are common to the definition of all types of condensers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCondenser,IfcCondenserType',(#4903)); +#4903=IFCSIMPLEPROPERTYTEMPLATE('0V2o_KCOHDRvAzkdDF$7Vt',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4904=IFCPROPERTYSETTEMPLATE('3tLdUPl19Bvubj$PfiHig2',$,'Qto_ConduitSegmentBaseQuantities','Quantity set of Conduit Segment Base.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCableCarrierSegment/CONDUITSEGMENT,IfcCableCarrierSegmentType/CONDUITSEGMENT',(#4905,#4906)); +#4905=IFCSIMPLEPROPERTYTEMPLATE('2XKBEhk7XCBB62fvxuiAIe',$,'InnerDiameter','The actual inner diameter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4906=IFCSIMPLEPROPERTYTEMPLATE('2FXvFdB5PB1hT7SWPJGmic',$,'OuterDiameter','The actual outer diameter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4907=IFCPROPERTYSETTEMPLATE('1lwry9zIzBHPBvAPEy0skm',$,'Qto_ConstructionEquipmentResourceBaseQuantities','Base quantities that are common to the definition of all occurrences of construction equipment resources.',.QTO_TYPEDRIVENOVERRIDE.,'IfcConstructionEquipmentResource,IfcConstructionEquipmentResourceType',(#4908,#4909)); +#4908=IFCSIMPLEPROPERTYTEMPLATE('3XO4rYN612C8RHQKR1$vKt',$,'UsageTime','Total time using the equipment including operating time and idle time.',.Q_TIME.,$,$,$,$,$,$,.READWRITE.); +#4909=IFCSIMPLEPROPERTYTEMPLATE('3BeYEM_OnFAvEBkebg6eU0',$,'OperatingTime','Productive time using the equipment including operating time and excluding idle time.',.Q_TIME.,$,$,$,$,$,$,.READWRITE.); +#4910=IFCPROPERTYSETTEMPLATE('0KaTszlBz5CAGSu8gYgtQX',$,'Qto_ConstructionMaterialResourceBaseQuantities','Base quantities that are common to the definition of all occurrences of construction material resources.',.QTO_TYPEDRIVENOVERRIDE.,'IfcConstructionMaterialResource,IfcConstructionMaterialResourceType',(#4911,#4912,#4913,#4914)); +#4911=IFCSIMPLEPROPERTYTEMPLATE('3$m0hRsAf8j9Gv51BaUSRz',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.\X2\000A000A\X0\Including material placed and wasted.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4912=IFCSIMPLEPROPERTYTEMPLATE('29_6$YOlL8z8GBvzqvXitj',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the material, including material placed but excluding material wasted.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4913=IFCSIMPLEPROPERTYTEMPLATE('3bJ8B1h$rAQPacnsbyUl2Y',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Including material placed and wasted.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4914=IFCSIMPLEPROPERTYTEMPLATE('3QOihODWr8IuYTWNOA5$Ge',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net weight of the material, including material placed but excluding material wasted.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4915=IFCPROPERTYSETTEMPLATE('3sMZan$5fEfOE5RNDwtVy8',$,'Qto_ControllerBaseQuantities','Base quantities that are common to the definition of all occurrences of controller.',.QTO_TYPEDRIVENOVERRIDE.,'IfcController,IfcControllerType',(#4916)); +#4916=IFCSIMPLEPROPERTYTEMPLATE('3fv47SNLTCqxRmDBYPsti3',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4917=IFCPROPERTYSETTEMPLATE('3vTwOhRXj30e524NGLj57Q',$,'Qto_CooledBeamBaseQuantities','Base quantities that are common to the definition of all types of cooled beams.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCooledBeam,IfcCooledBeamType',(#4918)); +#4918=IFCSIMPLEPROPERTYTEMPLATE('2rDRGNt1r8ogaBcVSgD0JJ',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4919=IFCPROPERTYSETTEMPLATE('3HUIIgo$978RJeO19gdhej',$,'Qto_CoolingTowerBaseQuantities','Base quantities that are common to the definition of all types of cooling towers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCoolingTower,IfcCoolingTowerType',(#4920)); +#4920=IFCSIMPLEPROPERTYTEMPLATE('3uFDHVNHr289fEbgXA1PXE',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4921=IFCPROPERTYSETTEMPLATE('0t5y0jDlfFVvb964TT5xmQ',$,'Qto_CourseBaseQuantities','Quantity set for Course base.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCourse,IfcCourseType',(#4922,#4923,#4924,#4925,#4926,#4927)); +#4922=IFCSIMPLEPROPERTYTEMPLATE('2orNOXMcHFO8QIp12AYiqJ',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4923=IFCSIMPLEPROPERTYTEMPLATE('3vs4zKVRb23BUV_0ZGeLj1',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4924=IFCSIMPLEPROPERTYTEMPLATE('02eb0PP8X8dh8mfvZuJoCg',$,'Thickness','The geometric thickness of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4925=IFCSIMPLEPROPERTYTEMPLATE('2hzwUK3Xj7uhT4wAgXjK$V',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4926=IFCSIMPLEPROPERTYTEMPLATE('162hYTwfrAD8MQV7iwyHgd',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4927=IFCSIMPLEPROPERTYTEMPLATE('3_jWAuI0P80wVnlso64mwA',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4928=IFCPROPERTYSETTEMPLATE('0Ocdanb5v8u8sLYJuOS9iP',$,'Qto_CoveringBaseQuantities','Base quantities that are common to the definition of all occurrences of coverings applied to spaces.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCovering,IfcCoveringType',(#4929,#4930,#4931)); +#4929=IFCSIMPLEPROPERTYTEMPLATE('3xtOLlygLEYgroQna2T7Nl',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4930=IFCSIMPLEPROPERTYTEMPLATE('3jvdu7jR5EEf3lGtJUjBED',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Sum of all gross areas of the covering facing the space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4931=IFCSIMPLEPROPERTYTEMPLATE('2tZVAWDv5EgO88A9B1ZIMI',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Sum of all net areas of the covering facing the space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4932=IFCPROPERTYSETTEMPLATE('3Pooj545X9lg7f1nUvob4o',$,'Qto_CurtainWallQuantities','Base quantities that are common to the definition of all occurrences of curtain walls.',.QTO_TYPEDRIVENOVERRIDE.,'IfcCurtainWall,IfcCurtainWallType',(#4933,#4934,#4935,#4936,#4937)); +#4933=IFCSIMPLEPROPERTYTEMPLATE('160LvolSD8lxrheynrnOY7',$,'Length','The length of the object.\X2\000A000A\X0\Along center line (even if different to the wall path).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4934=IFCSIMPLEPROPERTYTEMPLATE('0PzvVl4TvAmvHl$LNqouJA',$,'Height','Characteristic height\X2\000A000A\X0\Total height of the curtain wall. It should only be provided, if it is constant along the curtain wall path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4935=IFCSIMPLEPROPERTYTEMPLATE('27Sp8S7oL0UvgcxFE0vAEd',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\Only be provided, if it is constant along the curtain wall path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4936=IFCSIMPLEPROPERTYTEMPLATE('0A9W53HOL6RB1SuTxQtydX',$,'GrossSideArea','Area of the wall as viewed by an elevation view of the middle plane of the wall. It does not take into account any wall modifications (such as openings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4937=IFCSIMPLEPROPERTYTEMPLATE('2uRhDhDbnCKQLUIazu48Y8',$,'NetSideArea','Area of the object as viewed by an elevation view of the middle plane of the object. It does take into account all object modifications (such as openings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4938=IFCPROPERTYSETTEMPLATE('287xOREzX2gRFc2kEhdL5p',$,'Qto_DamperBaseQuantities','Base quantities that are common to the definition of all types of dampers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDamper,IfcDamperType',(#4939)); +#4939=IFCSIMPLEPROPERTYTEMPLATE('3M7otr3199efl5Q2IygiUp',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4940=IFCPROPERTYSETTEMPLATE('3dFaXa1RfBVucpc6zHt0ft',$,'Qto_DistributionBoardBaseQuantities','Base quantities that are common to the definition of all occurrences of electric distribution board.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricDistributionBoard,IfcElectricDistributionBoardType',(#4941,#4942)); +#4941=IFCSIMPLEPROPERTYTEMPLATE('2wzcUZT2j8kANezhyI1x$m',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4942=IFCSIMPLEPROPERTYTEMPLATE('2YG2n0fSvFmgzII8kDtoqI',$,'NumberOfCircuits','Number of circuits.\X2\000A000A\X0\Number of circuits in the distribution board.',.Q_COUNT.,$,$,$,$,$,$,.READWRITE.); +#4943=IFCPROPERTYSETTEMPLATE('2YDlC1Wgr0pwABajbRyXnG',$,'Qto_DistributionChamberElementBaseQuantities','Base quantities that are common to the definition of all occurrences of distribution chamber elements.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDistributionChamberElement,IfcDistributionChamberElementType',(#4944,#4945,#4946,#4947,#4948)); +#4944=IFCSIMPLEPROPERTYTEMPLATE('3iRvHXqX5BSuu7Mi9oJUJj',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4945=IFCSIMPLEPROPERTYTEMPLATE('3$4q8GikL1eAhb8iukiC2C',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net area of the inner surface of the chamber, subtracting any openings such as for pipes, ducts, or cables.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4946=IFCSIMPLEPROPERTYTEMPLATE('2o$Iy31Fr1$AvOP_ubucNL',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4947=IFCSIMPLEPROPERTYTEMPLATE('3z0Xfj4bL1NBIulHweKXVd',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the chamber, subtracting any enclosed elements such as pipes, ducts, cables, or equipment.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4948=IFCSIMPLEPROPERTYTEMPLATE('3bgqmjP4fDyRFIEjDphCXh',$,'Depth','The depth of the object.\X2\000A000A\X0\Indicates the depth of the element.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4949=IFCPROPERTYSETTEMPLATE('150rCYpLz2_RSvGS_cNx1X',$,'Qto_DoorBaseQuantities','Base quantities that are common to the definition of all occurrences of doors.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDoor,IfcDoorType',(#4950,#4951,#4952,#4953)); +#4950=IFCSIMPLEPROPERTYTEMPLATE('2O4tswIqL4owiJBYmGMe97',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\Total outer width of the door lining. It should only be provided, if it is a rectangular door.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4951=IFCSIMPLEPROPERTYTEMPLATE('2Ej2glQxTEaQ9YRy1_R2Vd',$,'Height','Characteristic height\X2\000A000A\X0\Total outer height of the door lining. It should only be provided, if it is a rectangular door.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4952=IFCSIMPLEPROPERTYTEMPLATE('1VRdMds0D6AuWu12wi9hMH',$,'Perimeter','Perimeter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4953=IFCSIMPLEPROPERTYTEMPLATE('0Vs9EaaIn9RhZJ1I$RDnbM',$,'Area','Calculated area for the object.\X2\000A000A\X0\Total area of the outer lining of the door.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4954=IFCPROPERTYSETTEMPLATE('2WGBbPscH8pe7O_skEKvxB',$,'Qto_DuctFittingBaseQuantities','Base quantities that are common to the definition of all types and occurrences of duct fittings.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDuctFitting,IfcDuctFittingType',(#4955,#4956,#4957,#4958,#4959)); +#4955=IFCSIMPLEPROPERTYTEMPLATE('3WQLL97fb3$BL7JOBAL1w8',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section and equal to the distance along the flow path from the port inlet to the port outlet. For junction fittings, it indicates the length of the longest flow path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4956=IFCSIMPLEPROPERTYTEMPLATE('2yqNUpRE12ves0HshG4lYr',$,'GrossCrossSectionArea','Area of the cross section.\X2\000A000A\X0\At the inlet, including the duct fitting itself and the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4957=IFCSIMPLEPROPERTYTEMPLATE('13SwU7ELfCwPmCyoCkHwl8',$,'NetCrossSectionArea','Area of the cross section of the object.\X2\000A000A\X0\Including the duct fitting and excluding the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4958=IFCSIMPLEPROPERTYTEMPLATE('2z1_4M6IfF$gxxIgMmMNTb',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4959=IFCSIMPLEPROPERTYTEMPLATE('1r$_J5hvr56P7xmsfWCNDl',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4960=IFCPROPERTYSETTEMPLATE('1g_fHUXrr2Pu5h9QLSVgJk',$,'Qto_DuctSegmentBaseQuantities','Base quantities that are common to the definition of all types and occurrences of duct segments.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDuctSegment,IfcDuctSegmentType',(#4961,#4962,#4963,#4964,#4965)); +#4961=IFCSIMPLEPROPERTYTEMPLATE('3qtYyFyfH9$95F5h$RuQir',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section, equal to the distance between inlet and outlet ports.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4962=IFCSIMPLEPROPERTYTEMPLATE('0JulA1OsH3cu7pNHlwHNGV',$,'GrossCrossSectionArea','Area of the cross section.\X2\000A000A\X0\Including the duct itself and the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4963=IFCSIMPLEPROPERTYTEMPLATE('0sUV9JwW1FrBgAE0a0ZC5V',$,'NetCrossSectionArea','Area of the cross section of the object.\X2\000A000A\X0\Excluding the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4964=IFCSIMPLEPROPERTYTEMPLATE('1KCslW_ZLCq942XmXGB$bu',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#4965=IFCSIMPLEPROPERTYTEMPLATE('1LzXjnENX30gzqUJPXaqN4',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4966=IFCPROPERTYSETTEMPLATE('30P7_KGZj0UhRyKoA9r7yH',$,'Qto_DuctSilencerBaseQuantities','Base quantities that are common to the definition of all types of duct silencers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcDuctSilencer,IfcDuctSilencerType',(#4967)); +#4967=IFCSIMPLEPROPERTYTEMPLATE('3tt3uFQM9FjvUwMnM80vlW',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4968=IFCPROPERTYSETTEMPLATE('1HNR1rDGn709sGMnr8GeVS',$,'Qto_EarthworksCutBaseQuantities','Quantity set for Earthworks Cut Base.',.QTO_OCCURRENCEDRIVEN.,'IfcEarthworksCut',(#4969,#4970,#4971,#4972,#4973,#4974)); +#4969=IFCSIMPLEPROPERTYTEMPLATE('2PZ672QUb4IhEw6WSr_GbS',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4970=IFCSIMPLEPROPERTYTEMPLATE('01rJmCAfr0hPS56uLMjhIq',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4971=IFCSIMPLEPROPERTYTEMPLATE('23eXo8YZrBSuxCLcjFCv4X',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4972=IFCSIMPLEPROPERTYTEMPLATE('3OAl2dbbj3MgTB4TH3L$dR',$,'UndisturbedVolume','Undisturbed Volume',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4973=IFCSIMPLEPROPERTYTEMPLATE('0iMOq$mBf8pARA_6LWwaXC',$,'LooseVolume','Volume of the earthworks when in a loose piled state',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4974=IFCSIMPLEPROPERTYTEMPLATE('1yNy03eMT0nvcYK0Lw_ygu',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4975=IFCPROPERTYSETTEMPLATE('0BK5X8QQTEQ8wLvaLeHycV',$,'Qto_EarthworksFillBaseQuantities','Quantity set for Earthworks Fill Base.',.QTO_OCCURRENCEDRIVEN.,'IfcEarthworksFill',(#4976,#4977,#4978,#4979,#4980)); +#4976=IFCSIMPLEPROPERTYTEMPLATE('3D0TkWuvXB3vpNa4QdUVtD',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4977=IFCSIMPLEPROPERTYTEMPLATE('1sZA_NEajCaxvUeVWcpaLw',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4978=IFCSIMPLEPROPERTYTEMPLATE('0Q3neW2011O8J2vYTEXGz2',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4979=IFCSIMPLEPROPERTYTEMPLATE('3t0_WquCf3BfUN29yluVc5',$,'CompactedVolume','Volume of the earthworks when finished and compacted in place.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4980=IFCSIMPLEPROPERTYTEMPLATE('38F0$Y0eH4guENPfp9MhFi',$,'LooseVolume','Volume of the earthworks when in a loose piled state',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#4981=IFCPROPERTYSETTEMPLATE('35RTeOCTT6y8xcdydPs$hK',$,'Qto_ElectricApplianceBaseQuantities','Base quantities that are common to the definition of all occurrences of electric appliance.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricAppliance,IfcElectricApplianceType',(#4982)); +#4982=IFCSIMPLEPROPERTYTEMPLATE('1ffUG1iKfAUfTSc_SRUV6B',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4983=IFCPROPERTYSETTEMPLATE('2rQTV_cTT6xw2XtTqW0v7k',$,'Qto_ElectricFlowStorageDeviceBaseQuantities','Base quantities that are common to the definition of all occurrences of electric flow storage device.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricFlowStorageDevice,IfcElectricFlowStorageDeviceType',(#4984)); +#4984=IFCSIMPLEPROPERTYTEMPLATE('3jYatwu2H6HvYsY_FriYRX',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4985=IFCPROPERTYSETTEMPLATE('3oXZcC51H0bvHEESZ9ecwY',$,'Qto_ElectricGeneratorBaseQuantities','Base quantities that are common to the definition of all occurrences of electric generator.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricGenerator,IfcElectricGeneratorType',(#4986)); +#4986=IFCSIMPLEPROPERTYTEMPLATE('0UAau7ciL5VRooFSkDiAa2',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4987=IFCPROPERTYSETTEMPLATE('3A7GyG5_bDWPUTTMEoyNyt',$,'Qto_ElectricMotorBaseQuantities','Base quantities that are common to the definition of all occurrences of electric motor.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricMotor,IfcElectricMotorType',(#4988)); +#4988=IFCSIMPLEPROPERTYTEMPLATE('20fDOrX3X6k9tPmzkphns0',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4989=IFCPROPERTYSETTEMPLATE('2YVZHOUef8b8vypf9Y06Gc',$,'Qto_ElectricTimeControlBaseQuantities','Base quantities that are common to the definition of all occurrences of electric time control.',.QTO_TYPEDRIVENOVERRIDE.,'IfcElectricTimeControl,IfcElectricTimeControlType',(#4990)); +#4990=IFCSIMPLEPROPERTYTEMPLATE('1iK3sBodDD99ffj3E8vi5W',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4991=IFCPROPERTYSETTEMPLATE('2sdDxwugv0jOMy5KDt8qFJ',$,'Qto_EvaporativeCoolerBaseQuantities','Base quantities that are common to the definition of all types of evaporative coolers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcEvaporativeCooler,IfcEvaporativeCoolerType',(#4992)); +#4992=IFCSIMPLEPROPERTYTEMPLATE('1gq9e0JWvDNQKVkixdzwGd',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4993=IFCPROPERTYSETTEMPLATE('2NC9yVbxH9O827r0FY_KUt',$,'Qto_EvaporatorBaseQuantities','Base quantities that are common to the definition of all types of evaporators.',.QTO_TYPEDRIVENOVERRIDE.,'IfcEvaporator,IfcEvaporatorType',(#4994)); +#4994=IFCSIMPLEPROPERTYTEMPLATE('0mN36zjFH1URyXrh0ux2np',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#4995=IFCPROPERTYSETTEMPLATE('11PrRoX3HB2Pq1VTE_Q8bw',$,'Qto_FacilityPartBaseQuantities','Base quantities that are common to the definition of all occurrences of IfcFacilityPart.',.QTO_OCCURRENCEDRIVEN.,'IfcFacilityPart',(#4996,#4997,#4998,#4999,#5000)); +#4996=IFCSIMPLEPROPERTYTEMPLATE('0cOx0kWoj2Ju9w$7OOoZ_n',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4997=IFCSIMPLEPROPERTYTEMPLATE('1ggD4$3mr7aO4h0sSq4dFS',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4998=IFCSIMPLEPROPERTYTEMPLATE('2sxt$lqGrFr9Yq9YeZivc3',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#4999=IFCSIMPLEPROPERTYTEMPLATE('2LtM0o7nHCThl8EGGYYhmf',$,'Area','Calculated area for the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5000=IFCSIMPLEPROPERTYTEMPLATE('1nwloGlpj7nvzbD7TEGv2m',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5001=IFCPROPERTYSETTEMPLATE('2WdXMSwr56l8v7TdvipTod',$,'Qto_FanBaseQuantities','Base quantities that are common to the definition of all types of fans.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFan,IfcFanType',(#5002)); +#5002=IFCSIMPLEPROPERTYTEMPLATE('1eE$XKt4T7gf2Keu9nIvkR',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5003=IFCPROPERTYSETTEMPLATE('0$t3qQ9fb7Bxzu4XttGGeh',$,'Qto_FilterBaseQuantities','Base quantities that are common to the definition of all types of filters.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFilter,IfcFilterType',(#5004)); +#5004=IFCSIMPLEPROPERTYTEMPLATE('0cAY3B9D9AOhKxY5iKX6L2',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5005=IFCPROPERTYSETTEMPLATE('3KydZZ4gvAoOPEXA7Croxm',$,'Qto_FireSuppressionTerminalBaseQuantities','Base quantities that are common to the definition of all occurrences of fire suppression terminal.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFireSuppressionTerminal,IfcFireSuppressionTerminalType',(#5006)); +#5006=IFCSIMPLEPROPERTYTEMPLATE('1P3YbX0q55cR81aauhklcd',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5007=IFCPROPERTYSETTEMPLATE('0K2sSjFI54yeCnskx_qszW',$,'Qto_FlowInstrumentBaseQuantities','Base quantities that are common to the definition of all occurrences of flow instrument.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFlowInstrument,IfcFlowInstrumentType',(#5008)); +#5008=IFCSIMPLEPROPERTYTEMPLATE('2XiwFYXvnCaQZ48v5q6O01',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5009=IFCPROPERTYSETTEMPLATE('03aeifaqL95R0Jd4wbSfbt',$,'Qto_FlowMeterBaseQuantities','Base quantities that are common to the definition of all types of flow meters.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFlowMeter,IfcFlowMeterType',(#5010)); +#5010=IFCSIMPLEPROPERTYTEMPLATE('3xKZuWvlz1HfYCxObsuOxu',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5011=IFCPROPERTYSETTEMPLATE('1oguTMzzD9584qUJZMDfzG',$,'Qto_FootingBaseQuantities','Base quantities that are common to the definition of all occurrences of footings.',.QTO_TYPEDRIVENOVERRIDE.,'IfcFooting,IfcFootingType',(#5012,#5013,#5014,#5015,#5016,#5017,#5018,#5019,#5020,#5021)); +#5012=IFCSIMPLEPROPERTYTEMPLATE('1$RPAL3mP9_AnA6fWaTyqu',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features. For strip footings it is measured along the path, for other footings it is one of the horizontal dimensions. It should only be provided, if it is constant.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5013=IFCSIMPLEPROPERTYTEMPLATE('2SbaOJhj1EQuDc1fcEGCKW',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\For strip footings it is measured perpendicular to the footing path (or longitudial axis). For other footings it is one of the horizontal dimensions. It should only be provided, if it is constant.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5014=IFCSIMPLEPROPERTYTEMPLATE('0jAQ3FfRb2qOJqm25XRfwg',$,'Height','Characteristic height\X2\000A000A\X0\Total nominal height of the footing. It should only be provided, if it is constant.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5015=IFCSIMPLEPROPERTYTEMPLATE('3rNRstkaXBKOVVT228qt$x',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5016=IFCSIMPLEPROPERTYTEMPLATE('1ifYSfsCv7dBaixXx7cgRo',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5017=IFCSIMPLEPROPERTYTEMPLATE('2h9CMQC3n92RP0uYWNHjdO',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5018=IFCSIMPLEPROPERTYTEMPLATE('3BJn5T_v5CMRWxZ8tGyvGm',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5019=IFCSIMPLEPROPERTYTEMPLATE('1N08iDgWr1mPvKQ$6ZoiKN',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5020=IFCSIMPLEPROPERTYTEMPLATE('2PsyV$SAXF1hEoN_M7bA91',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5021=IFCSIMPLEPROPERTYTEMPLATE('0nPNqwkgD6VR5wmsBxTq4C',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5022=IFCPROPERTYSETTEMPLATE('3quYruDv99lvml37CaNNQ3',$,'Qto_HeatExchangerBaseQuantities','Base quantities that are common to the definition of all types of heat exchangers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcHeatExchanger,IfcHeatExchangerType',(#5023)); +#5023=IFCSIMPLEPROPERTYTEMPLATE('0t8piR7yn3LOIuAMT4FH3E',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5024=IFCPROPERTYSETTEMPLATE('3hku9JpTHFlfyIkY5LyBPz',$,'Qto_HumidifierBaseQuantities','Base quantities that are common to the definition of all types of humidifiers.',.QTO_TYPEDRIVENOVERRIDE.,'IfcHumidifier,IfcHumidifierType',(#5025)); +#5025=IFCSIMPLEPROPERTYTEMPLATE('0SHOefspT9zvyMEBFjQPn7',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5026=IFCPROPERTYSETTEMPLATE('2tQA3OVQfDRBN3ZjlKT2jf',$,'Qto_ImpactProtectionDeviceBaseQuantities','Quantity set Impact Protection Device Base.',.QTO_TYPEDRIVENOVERRIDE.,'IfcImpactProtectionDevice,IfcImpactProtectionDeviceType',(#5027)); +#5027=IFCSIMPLEPROPERTYTEMPLATE('02GH20HIb2OhUgJ9vfSAbZ',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5028=IFCPROPERTYSETTEMPLATE('2yL6qP8fzAFw3ZTGr6w$wr',$,'Qto_InterceptorBaseQuantities','Base quantities that are common to the definition of all occurrences of interceptor.',.QTO_TYPEDRIVENOVERRIDE.,'IfcInterceptor,IfcInterceptorType',(#5029)); +#5029=IFCSIMPLEPROPERTYTEMPLATE('3nr$wMVUn6xe67mP9J3Nsu',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5030=IFCPROPERTYSETTEMPLATE('34RvHA6pzAJ86aBwk2nKMd',$,'Qto_JunctionBoxBaseQuantities','Base quantities that are common to the definition of all occurrences of junction box.',.QTO_TYPEDRIVENOVERRIDE.,'IfcJunctionBox,IfcJunctionBoxType',(#5031,#5032,#5033,#5034,#5035)); +#5031=IFCSIMPLEPROPERTYTEMPLATE('3Y2M_hxf51GOY8S8uj5TGG',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5032=IFCSIMPLEPROPERTYTEMPLATE('1BeHmYtJr8kuG14fnNhpyR',$,'NumberOfGangs','Number of gangs in the object.\X2\000A000A\X0\Number of gangs in the junction box.',.Q_COUNT.,$,$,$,$,$,$,.READWRITE.); +#5033=IFCSIMPLEPROPERTYTEMPLATE('13ezle_zD6KRN29maHqHN6',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5034=IFCSIMPLEPROPERTYTEMPLATE('37dOk7MVLF_AhgkvqsP$TD',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5035=IFCSIMPLEPROPERTYTEMPLATE('2nxYS7U29BDA1RE6XDhY8T',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5036=IFCPROPERTYSETTEMPLATE('0GaPKggub2yfi0M3_vHiza',$,'Qto_KerbBaseQuantities','Quantity set for Kerb Base.',.QTO_TYPEDRIVENOVERRIDE.,'IfcKerb,IfcKerbType',(#5037,#5038,#5039,#5040,#5041,#5042)); +#5037=IFCSIMPLEPROPERTYTEMPLATE('3jas1OvYT1$BGvoGoWUy6c',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5038=IFCSIMPLEPROPERTYTEMPLATE('3LW67yDFXFa9KZhmDD5pPV',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5039=IFCSIMPLEPROPERTYTEMPLATE('2bb96WTmr8huE2BSgovcXX',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5040=IFCSIMPLEPROPERTYTEMPLATE('0wQFYQh2nFV9jHcaA12E1r',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5041=IFCSIMPLEPROPERTYTEMPLATE('0U0rHcvs9FIABH4qZ$OCm8',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5042=IFCSIMPLEPROPERTYTEMPLATE('06wlh_xFP7Cf_y976xhSCV',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5043=IFCPROPERTYSETTEMPLATE('0_9i5PhpDE7Aq41Y8B5ccX',$,'Qto_LaborResourceBaseQuantities','Base quantities that are common to the definition of all occurrences of labour resources.',.QTO_TYPEDRIVENOVERRIDE.,'IfcLaborResource,IfcLaborResourceType',(#5044,#5045)); +#5044=IFCSIMPLEPROPERTYTEMPLATE('0iLVd8vOLCAO6jyBbRa007',$,'StandardWork','Work that is performed at regular times, up to a particular limit after which overtime rates may apply.',.Q_TIME.,$,$,$,$,$,$,.READWRITE.); +#5045=IFCSIMPLEPROPERTYTEMPLATE('3dKGgqY2L7pxsGzxND3AOQ',$,'OvertimeWork','Work that is performed after exceeding a particular limit such as hours per day and/or hours per week, after which company or municipal policy requires a different rate to apply. Note: Policies for when overtime takes effect are the responsibility of the user or application; they are not modelled in IFC.',.Q_TIME.,$,$,$,$,$,$,.READWRITE.); +#5046=IFCPROPERTYSETTEMPLATE('2YI4Vd2DrFjvw1WLw_6LQL',$,'Qto_LampBaseQuantities','Base quantities that are common to the definition of all occurrences of lamp.',.QTO_TYPEDRIVENOVERRIDE.,'IfcLamp,IfcLampType',(#5047)); +#5047=IFCSIMPLEPROPERTYTEMPLATE('0dLFU1JQz9m9zInKzup4xW',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5048=IFCPROPERTYSETTEMPLATE('2FB9g8g3j6ihFkMY3giwwK',$,'Qto_LightFixtureBaseQuantities','Base quantities that are common to the definition of all occurrences of light fixture.',.QTO_TYPEDRIVENOVERRIDE.,'IfcLightFixture,IfcLightFixtureType',(#5049)); +#5049=IFCSIMPLEPROPERTYTEMPLATE('25o3KtFRLDme3qmrOsECSA',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5050=IFCPROPERTYSETTEMPLATE('04YgdLJazETgnaolIJsj5L',$,'Qto_LinearStratumBaseQuantities','Quantity measures associated to a linear stratum such as in a borehole. Uncertainty is documented in Pset_Uncertainty.',.QTO_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum',(#5051,#5052)); +#5051=IFCSIMPLEPROPERTYTEMPLATE('3gxTLEmIb1mwEL1RgmX2cn',$,'Diameter','The Diameter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5052=IFCSIMPLEPROPERTYTEMPLATE('0XygQ25sn6wfJhY28Gpri7',$,'Length','The length of the object.\X2\000A000A\X0\Effective length sampled, if lower end of segment known',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5053=IFCPROPERTYSETTEMPLATE('2acs8TLrv2Hht_oTyCp064',$,'Qto_MarineFacilityBaseQuantities','Base quantities that are common to the definition of all occurrences of IfcMarineFacility.',.QTO_OCCURRENCEDRIVEN.,'IfcMarineFacility',(#5054,#5055,#5056,#5057,#5058)); +#5054=IFCSIMPLEPROPERTYTEMPLATE('0BXfR_1cT3GuAbQ_yXPQ34',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5055=IFCSIMPLEPROPERTYTEMPLATE('1zqvnT8ZrBzvf0ui6$kkWB',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5056=IFCSIMPLEPROPERTYTEMPLATE('0zCe92z$z6hQEIcKGr8TRr',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5057=IFCSIMPLEPROPERTYTEMPLATE('0I0_oQEBH5gRJDlbehc$bN',$,'Area','Calculated area for the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5058=IFCSIMPLEPROPERTYTEMPLATE('0UlR4ecVnFUh6q2wcG8Han',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5059=IFCPROPERTYSETTEMPLATE('0s$uiGmmHEcx0tKHTZCeTO',$,'Qto_MemberBaseQuantities','Base quantities that are common to the definition of all occurrences of members.',.QTO_TYPEDRIVENOVERRIDE.,'IfcMember,IfcMemberType',(#5060,#5061,#5062,#5063,#5064,#5065,#5066,#5067,#5068)); +#5060=IFCSIMPLEPROPERTYTEMPLATE('087Xybgez3bx_xum1hPtKu',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5061=IFCSIMPLEPROPERTYTEMPLATE('2Uf$RYF2TDIRJHKWYfT7Ix',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5062=IFCSIMPLEPROPERTYTEMPLATE('2mmpmKsFj0BQHg$Y6Q1t3z',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5063=IFCSIMPLEPROPERTYTEMPLATE('2JZyeco4zECeEiNKCnUAhq',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5064=IFCSIMPLEPROPERTYTEMPLATE('3G4cebOu96XQqeE3wGPzY_',$,'NetSurfaceArea','Net surface area of the object, normally generated as perimeter * length + 2 * cross section area taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5065=IFCSIMPLEPROPERTYTEMPLATE('0vdihba8D0v9JhNIXkTlBF',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5066=IFCSIMPLEPROPERTYTEMPLATE('3mg3hTrO5C0B8t793a6goR',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5067=IFCSIMPLEPROPERTYTEMPLATE('1SFndaJBjBbBr7$mGm6uQ1',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5068=IFCSIMPLEPROPERTYTEMPLATE('31cd1SSez4mAQxlsxZuwHh',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5069=IFCPROPERTYSETTEMPLATE('1LD6xCTTvCKR2W0wQ9BdcS',$,'Qto_MotorConnectionBaseQuantities','Base quantities that are common to the definition of all occurrences of motor connection.',.QTO_TYPEDRIVENOVERRIDE.,'IfcMotorConnection,IfcMotorConnectionType',(#5070)); +#5070=IFCSIMPLEPROPERTYTEMPLATE('3yuKhSMnz1e88goPgy_SUI',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5071=IFCPROPERTYSETTEMPLATE('3vwpMsFMr3uBwRGiRFb0aE',$,'Qto_OpeningElementBaseQuantities','Base quantities that are common to the definition of all occurrences of opening elements.',.QTO_TYPEDRIVENOVERRIDE.,'IfcOpeningElement',(#5072,#5073,#5074,#5075,#5076)); +#5072=IFCSIMPLEPROPERTYTEMPLATE('15YEiobiz2xPK8w2w7njTc',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\Width of the opening, in case of wall openings it is the horizontal dimension in case of slab openings it is one horizontal dimension. Only provided, if the area is rectangular.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5073=IFCSIMPLEPROPERTYTEMPLATE('2u_JsrOv594R4WG3Bw_7$S',$,'Height','Characteristic height\X2\000A000A\X0\Height of the opening, in case of wall openings it is the vertical dimension in case of slab openings it is one horizontal dimension. Only provided, if the area is rectangular.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5074=IFCSIMPLEPROPERTYTEMPLATE('089QortZj8598UuJx0DlaO',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (or thickness) of the opening, in case of openings it shall be identical to the width (or thickness) of the voided element, in case of recesses it shall be less. Only provided, if the depth is constant.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5075=IFCSIMPLEPROPERTYTEMPLATE('0M7PX2b$f0iudaGFXsqnpV',$,'Area','Calculated area for the object.\X2\000A000A\X0\Area of the opening as viewed by an elevation view (for wall openings) or as viewed by a ground floor view (for slab openings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5076=IFCSIMPLEPROPERTYTEMPLATE('3IkxzJVzbE6Qt6nC$f8Ci3',$,'Volume','Volume of the element.\X2\000A000A\X0\Volume of the opening. It is the subtraction volume of the opening from the voided element (e.g. wall or slab). In case that the geometric volume of the opening is bigger then the subtraction volume, only the subtraction volume should be used.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5077=IFCPROPERTYSETTEMPLATE('2Xcpks4zX9DxLtZF1ldlyW',$,'Qto_OutletBaseQuantities','Base quantities that are common to the definition of all occurrences of outlet.',.QTO_TYPEDRIVENOVERRIDE.,'IfcOutlet,IfcOutletType',(#5078)); +#5078=IFCSIMPLEPROPERTYTEMPLATE('2RkQrvTrvEUf714np_u6n1',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5079=IFCPROPERTYSETTEMPLATE('1az2G4doXEsuMDmIf8wAZV',$,'Qto_PavementBaseQuantities','Quantity set for Pavement.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPavement,IfcPavementType',(#5080,#5081,#5082,#5083,#5084,#5085,#5086)); +#5080=IFCSIMPLEPROPERTYTEMPLATE('0lRiFqpy9DTRfArBbkPA3E',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5081=IFCSIMPLEPROPERTYTEMPLATE('1MEsQBMtHFpPB1tPj22PvY',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5082=IFCSIMPLEPROPERTYTEMPLATE('0kFDOUrKXFFgIPyPfTVPRS',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5083=IFCSIMPLEPROPERTYTEMPLATE('3TdWxCHrX9nOwK_GzNBmxX',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Indicates the extruded area of the element. Only given, if the element is prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5084=IFCSIMPLEPROPERTYTEMPLATE('3OE_EjXU90kvBIJpK1VJb6',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Indicates the extruded area of the object. Only given when prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5085=IFCSIMPLEPROPERTYTEMPLATE('0SpLlIjfD8qQ8NuUFYrSkm',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5086=IFCSIMPLEPROPERTYTEMPLATE('3E4hwVRmj7BeCrSWqzUaIu',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the slab. Openings and recesses are taken into account by subtraction, projections by addition.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5087=IFCPROPERTYSETTEMPLATE('1rfvvDq6z4tPeRkGfiwNoi',$,'Qto_PictorialSignQuantities','Quantity set for Pictorial Signs.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSign/PICTORAL,IfcSignType/PICTORAL',(#5088,#5089)); +#5088=IFCSIMPLEPROPERTYTEMPLATE('1MyUF3V29DORWOyANTKumB',$,'Area','Calculated area for the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5089=IFCSIMPLEPROPERTYTEMPLATE('1Pgk1uIf96fhRCKOG90QpY',$,'SignArea','Sign Area',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5090=IFCPROPERTYSETTEMPLATE('3KT9xZMUr8zhAQp6O7cUvG',$,'Qto_PileBaseQuantities','Base quantities that are common to the definition of all occurrences of piles.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPile,IfcPileType',(#5091,#5092,#5093,#5094,#5095,#5096,#5097,#5098)); +#5091=IFCSIMPLEPROPERTYTEMPLATE('0$Wi7t9RPELRJNbSH3K8z8',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5092=IFCSIMPLEPROPERTYTEMPLATE('0umFHic0f5bPD58uc$9q5o',$,'CrossSectionArea','Total area of the cross section (or profile) of the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5093=IFCSIMPLEPROPERTYTEMPLATE('2UVCiDw35Aywbg0enOHxwA',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5094=IFCSIMPLEPROPERTYTEMPLATE('3qde4iPDL94vZJL2VpbYXN',$,'GrossSurfaceArea','Total gross area of the object, normally generated as perimeter * length + 2 * cross section area. It is the sum of OuterSurfaceArea + (2 x CrossSectionArea) and shall only be given, if the OuterSurfaceArea and CrossSectionArea cannot be established separately.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5095=IFCSIMPLEPROPERTYTEMPLATE('3IQ1ouhWbEruCOsp4mfAYh',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5096=IFCSIMPLEPROPERTYTEMPLATE('3ddd07W3P6s9$L$zSHyotT',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5097=IFCSIMPLEPROPERTYTEMPLATE('2v8iLma5X3t9Cl_J9EMrZ$',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5098=IFCSIMPLEPROPERTYTEMPLATE('0_1BJpBA13O8VQMhAiKxRQ',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5099=IFCPROPERTYSETTEMPLATE('2VNCySUF1FqPky8t4wpz4c',$,'Qto_PipeFittingBaseQuantities','Base quantities that are common to the definition of all types and occurrences of pipe fittings.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPipeFitting,IfcPipeFittingType',(#5100,#5101,#5102,#5103,#5104,#5105)); +#5100=IFCSIMPLEPROPERTYTEMPLATE('3Y7hR6jfj2p9IWLFAkPpOp',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section and equal to the distance along the flow path from the port inlet to the port outlet. For junction fittings, it indicates the length of the longest flow path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5101=IFCSIMPLEPROPERTYTEMPLATE('30RGmxRs5E6873u$4_ky05',$,'GrossCrossSectionArea','Area of the cross section.\X2\000A000A\X0\Including the pipe fitting itself and the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5102=IFCSIMPLEPROPERTYTEMPLATE('33dYPMu_9BK9Wxt9JyQXZu',$,'NetCrossSectionArea','Area of the cross section of the object.\X2\000A000A\X0\Including the pipe fitting and excluding the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5103=IFCSIMPLEPROPERTYTEMPLATE('1zrCABITz1KfLkfETGNTrn',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5104=IFCSIMPLEPROPERTYTEMPLATE('3AhWJ0Twb21wG2VSfNO0bR',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5105=IFCSIMPLEPROPERTYTEMPLATE('0Tk8OVUS550wXJNLi8IkYS',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the pipe fitting, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5106=IFCPROPERTYSETTEMPLATE('01Vn$Iz5n0tOTALQlaUxn_',$,'Qto_PipeSegmentBaseQuantities','Base quantities that are common to the definition of all types and occurrences of pipe segments.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPipeSegment,IfcPipeSegmentType',(#5107,#5108,#5109,#5110,#5111,#5112,#5113)); +#5107=IFCSIMPLEPROPERTYTEMPLATE('3olEUNYEv2rgFjh2bGZqJ3',$,'Length','The length of the object.\X2\000A000A\X0\Calculated at midpoint of cross-section, equal to the distance between inlet and outlet ports.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5108=IFCSIMPLEPROPERTYTEMPLATE('3TzbL2YfT7DQwgUIdyMr5k',$,'GrossCrossSectionArea','Area of the cross section.\X2\000A000A\X0\Including the pipe itself and the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5109=IFCSIMPLEPROPERTYTEMPLATE('3R2_MkOcr2bQ52_LdLnvJz',$,'NetCrossSectionArea','Area of the cross section of the object.\X2\000A000A\X0\Excluding the interior flow space.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5110=IFCSIMPLEPROPERTYTEMPLATE('3sFUGo1P50mBdGaP9CeOPX',$,'OuterSurfaceArea','Total area of the surfaces of the object (not taking into account the end cap areas), normally generated as perimeter * length in case of extrusions.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5111=IFCSIMPLEPROPERTYTEMPLATE('3CXkSdkV1CWv6U6Q_ZwHY9',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5112=IFCSIMPLEPROPERTYTEMPLATE('3j2EN1a5j26PZAifalk7aL',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the pipe segment, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5113=IFCSIMPLEPROPERTYTEMPLATE('1xO9ucFcH36wKA6BrLf8bS',$,'FootPrintArea','Gross area of the site covered by the building(s).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5114=IFCPROPERTYSETTEMPLATE('15NdGn7ab2GvPq9q75QeY6',$,'Qto_PlateBaseQuantities','Base quantities that are common to the definition of all occurrences of plates.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPlate,IfcPlateType',(#5115,#5116,#5117,#5118,#5119,#5120,#5121,#5122)); +#5115=IFCSIMPLEPROPERTYTEMPLATE('0a$UCXraLA8uEidPKx1h9h',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5116=IFCSIMPLEPROPERTYTEMPLATE('2DQY9y8OTCQO7vW1Wi8ij2',$,'Perimeter','Perimeter of the object.\X2\000A000A\X0\Perimeter measured along the outer boundaries of the plate. Only given, if the plate is prismatic (constant thickness).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5117=IFCSIMPLEPROPERTYTEMPLATE('2IFfLwuNPDsfRYycSujZLl',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Indicates the extruded area of the element. Only given, if the element is prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5118=IFCSIMPLEPROPERTYTEMPLATE('2KacBbH1z6Jg4do1Tjc$GT',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Indicates the extruded area of the object. Only given when prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5119=IFCSIMPLEPROPERTYTEMPLATE('0HoxmQc_55NuLrWzrW9bpt',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5120=IFCSIMPLEPROPERTYTEMPLATE('1mj6r5kuT4Th7Tlj_A5nxK',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the plate. Openings and recesses are taken into account by subtraction, projections by addition.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5121=IFCSIMPLEPROPERTYTEMPLATE('29xPYyunDAhAdkxzRUFlCA',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5122=IFCSIMPLEPROPERTYTEMPLATE('3puNU3bg12MeoSvnGGrpPT',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5123=IFCPROPERTYSETTEMPLATE('2n6Jt5_vzFxPLgu4kOTk04',$,'Qto_ProjectionElementBaseQuantities','Base quantities that are common to the definition of all occurrences of projection elements.',.QTO_OCCURRENCEDRIVEN.,'IfcProjectionElement',(#5124,#5125)); +#5124=IFCSIMPLEPROPERTYTEMPLATE('1fNELUSAHFzPY2EK4FeG1d',$,'Area','Calculated area for the object.\X2\000A000A\X0\Area of the projection as viewed by an elevation view (for wall projections) or as viewed by a ground floor view (for slab projections).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5125=IFCSIMPLEPROPERTYTEMPLATE('34diKVtLH4pASWs25mT$tz',$,'Volume','Volume of the element.\X2\000A000A\X0\Volume of the projection. It is the additional volume of the projection to the element (e.g. wall or slab).',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5126=IFCPROPERTYSETTEMPLATE('3Cb6CGpmzCm9uW70AksY0M',$,'Qto_ProtectiveDeviceBaseQuantities','Base quantities that are common to the definition of all occurrences of protective device.',.QTO_TYPEDRIVENOVERRIDE.,'IfcProtectiveDevice,IfcProtectiveDeviceType',(#5127)); +#5127=IFCSIMPLEPROPERTYTEMPLATE('06$KC1MkfBCwg7O8l2gMEs',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5128=IFCPROPERTYSETTEMPLATE('1tOdJBSD18_9Xuj0C4s1Bk',$,'Qto_ProtectiveDeviceTrippingUnitBaseQuantities','Base quantities that are common to the definition of all occurrences of protective device tripping unit.',.QTO_TYPEDRIVENOVERRIDE.,'IfcProtectiveDeviceTrippingUnit,IfcProtectiveDeviceTrippingUnitType',(#5129)); +#5129=IFCSIMPLEPROPERTYTEMPLATE('1lZan2$710DBiStrS4fUbL',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5130=IFCPROPERTYSETTEMPLATE('1cAsH9QXX4yOFU8naGoZZm',$,'Qto_PumpBaseQuantities','Base quantities that are common to the definition of all types of pumps.',.QTO_TYPEDRIVENOVERRIDE.,'IfcPump,IfcPumpType',(#5131)); +#5131=IFCSIMPLEPROPERTYTEMPLATE('24JVMPW$XB8uOluZceqH2o',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5132=IFCPROPERTYSETTEMPLATE('2dFVifq3n0iBoBdbNa4zAP',$,'Qto_RailBaseQuantities','Base quantities that are common to the definition of all occurrences of rail.',.QTO_TYPEDRIVENOVERRIDE.,'IfcRail,IfcRailType',(#5133,#5134,#5135)); +#5133=IFCSIMPLEPROPERTYTEMPLATE('0R3PREneLA0OR8JJ$V0gc5',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5134=IFCSIMPLEPROPERTYTEMPLATE('1PaH2onoP10vasWBg8dd03',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5135=IFCSIMPLEPROPERTYTEMPLATE('2qFpWftY98kwCVwnryHc4w',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5136=IFCPROPERTYSETTEMPLATE('0$0TIneCz9RvFarCi$WO8F',$,'Qto_RailingBaseQuantities','Base quantities that are common to the definition of all occurrences of railings.',.QTO_TYPEDRIVENOVERRIDE.,'IfcRailing,IfcRailingType',(#5137)); +#5137=IFCSIMPLEPROPERTYTEMPLATE('2SXiPpAXL49Rf0$0OadZuc',$,'Length','The length of the object.\X2\000A000A\X0\Not taking into account any cut-out''s or other processing features.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5138=IFCPROPERTYSETTEMPLATE('2t6Yjj1f9E$95sgzwc3CcM',$,'Qto_RampFlightBaseQuantities','Base quantities that are common to the definition of all occurrences of ramp flights.',.QTO_TYPEDRIVENOVERRIDE.,'IfcRampFlight,IfcRampFlightType',(#5139,#5140,#5141,#5142,#5143,#5144)); +#5139=IFCSIMPLEPROPERTYTEMPLATE('2UB9GpP4XBlf0BR4W4DTl1',$,'Length','The length of the object.\X2\000A000A\X0\Measured along the walking line.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5140=IFCSIMPLEPROPERTYTEMPLATE('3e7hKL97D6m9mYcli_fbxj',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5141=IFCSIMPLEPROPERTYTEMPLATE('2LYNE1P_98Ev0k$0J3I3V0',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Total area of the ramp flight (not the projected area). Only given, if the element is prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5142=IFCSIMPLEPROPERTYTEMPLATE('240lnUSVv48u3Kd33e6tcC',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Total area of the ramp flight (not the projected area). Only given when prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5143=IFCSIMPLEPROPERTYTEMPLATE('2iPskOEd94kfofzE22Nypl',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5144=IFCSIMPLEPROPERTYTEMPLATE('1CwQ7wNdjCLvhtgVPRRe2p',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the ramp flight. Openings and recesses are taken into account by subtraction, projections by addition.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5145=IFCPROPERTYSETTEMPLATE('2p1dm7O255mhuKX9klzqcs',$,'Qto_ReinforcedSoilBaseQuantities','Quantity sets for Reinforced Soil Base.',.QTO_OCCURRENCEDRIVEN.,'IfcReinforcedSoil',(#5146,#5147,#5148,#5149,#5150)); +#5146=IFCSIMPLEPROPERTYTEMPLATE('2JTwwHeur1QgTZjOWBBaDL',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5147=IFCSIMPLEPROPERTYTEMPLATE('1RyI37SRLAERcFsSs943RF',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5148=IFCSIMPLEPROPERTYTEMPLATE('18LPtH3If18eKgLJuz5Pyv',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5149=IFCSIMPLEPROPERTYTEMPLATE('1uGzUqNN50thWGqdnrGNqJ',$,'Area','Calculated area for the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5150=IFCSIMPLEPROPERTYTEMPLATE('3Epw8FiKj62wqj7CKhl4Uz',$,'Volume','Volume of the element.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5151=IFCPROPERTYSETTEMPLATE('0WWn7TXG5A1Qu4o_k3U8LT',$,'Qto_ReinforcingElementBaseQuantities','Base quantities that are common to the definition of all occurrences of reinforcement.',.QTO_TYPEDRIVENOVERRIDE.,'IfcReinforcingElement,IfcReinforcingElementType',(#5152,#5153,#5154)); +#5152=IFCSIMPLEPROPERTYTEMPLATE('1X_RZfKtb9HhLuOSPLfPYf',$,'Count','Total count of reinforcing items.',.Q_COUNT.,$,$,$,$,$,$,.READWRITE.); +#5153=IFCSIMPLEPROPERTYTEMPLATE('2NJcjVVY91HQ$OsNzNVZy9',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5154=IFCSIMPLEPROPERTYTEMPLATE('0MBPI9rcH7L8mJQGUDMYoA',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5155=IFCPROPERTYSETTEMPLATE('2WV8sBT0TBdQ5_hmVegNaO',$,'Qto_RoofBaseQuantities','Base quantities that are common to the definition of all occurrences of roof.',.QTO_TYPEDRIVENOVERRIDE.,'IfcRoof,IfcRoofType',(#5156,#5157,#5158)); +#5156=IFCSIMPLEPROPERTYTEMPLATE('0tOemvJyT9IvseBKFWKT05',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Indicates the outer surface of the roof and the sum of all roof slab gross areas.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5157=IFCSIMPLEPROPERTYTEMPLATE('2KShU4$Q55185$4pgZF0Rt',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Total net area of the outer surface of the roof. It is the suma of all roof slab net areas.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5158=IFCSIMPLEPROPERTYTEMPLATE('1SB1YQ9pX219Rnyu6oXk1v',$,'ProjectedArea','Total gross area of the outer surfaces of the roof, projected tp the ground. It is the sum of all projected roof slab gross areas. Roof openings, like sky windows and other openings and cut-outs are not taken into account.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5159=IFCPROPERTYSETTEMPLATE('2m$EQaPrHDfPMtNbobO0zZ',$,'Qto_SanitaryTerminalBaseQuantities','Base quantities that are common to the definition of all occurrences of sanitary terminal.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSanitaryTerminal,IfcSanitaryTerminalType',(#5160)); +#5160=IFCSIMPLEPROPERTYTEMPLATE('3pdGWH_tD1mRoq1UvDmwiS',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5161=IFCPROPERTYSETTEMPLATE('3xvT0yuurBI8WJ$qCpQLu8',$,'Qto_SensorBaseQuantities','Base quantities that are common to the definition of all occurrences of sensor.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSensor,IfcSensorType',(#5162)); +#5162=IFCSIMPLEPROPERTYTEMPLATE('0DhgIGZgz3hPUT6tKpS7gU',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5163=IFCPROPERTYSETTEMPLATE('3u4$zb04jAqgHwBiazJd$l',$,'Qto_SignalBaseQuantities','Base quantities for Signals.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSignal,IfcSignalType',(#5164)); +#5164=IFCSIMPLEPROPERTYTEMPLATE('2jxCErhCv77O8$RvSsQw9H',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5165=IFCPROPERTYSETTEMPLATE('1zYhe5$V95I97MourFBvTn',$,'Qto_SignBaseQuantities','Base quantities for Signs.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSign,IfcSignType',(#5166,#5167,#5168,#5169)); +#5166=IFCSIMPLEPROPERTYTEMPLATE('3wVzmBZRz5bgj3pVt11Kj5',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5167=IFCSIMPLEPROPERTYTEMPLATE('014iAArCDBNeO00IZfnctE',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5168=IFCSIMPLEPROPERTYTEMPLATE('2ofs9edbXCoxkL_$kRaaq_',$,'Thickness','The geometric thickness of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5169=IFCSIMPLEPROPERTYTEMPLATE('0K6E1Se0X0XRqJIFl5SdFc',$,'Weight','Total weight of object',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5170=IFCPROPERTYSETTEMPLATE('2g7F0mIbb3AvWHszG9YToO',$,'Qto_SiteBaseQuantities','Base quantities that are common to the definition of all occurrences of site.',.QTO_OCCURRENCEDRIVEN.,'IfcSite',(#5171,#5172)); +#5171=IFCSIMPLEPROPERTYTEMPLATE('2o_Z5Ou792xuKdD5QPoMf$',$,'GrossPerimeter','Gross perimeter at the outer contour of the object.\X2\000A000A\X0\Measured in horizontal projection.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5172=IFCSIMPLEPROPERTYTEMPLATE('0dMWSwB$j75BDKtvUNpQ5m',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Measured in horizontal projections.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5173=IFCPROPERTYSETTEMPLATE('1TOH3iV0X95vJdh4rAfWkh',$,'Qto_SlabBaseQuantities','Base quantities that are common to the definition of all occurrences of slabs.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSlab,IfcSlabType',(#5174,#5175,#5176,#5177,#5178,#5179,#5180,#5181,#5182,#5183)); +#5174=IFCSIMPLEPROPERTYTEMPLATE('2e5q5JuZnFIf80NVKYvLDm',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5175=IFCSIMPLEPROPERTYTEMPLATE('3dH518J916_B9UNOM_sjTU',$,'Length','The length of the object.\X2\000A000A\X0\Only provided if rectangular.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5176=IFCSIMPLEPROPERTYTEMPLATE('0shxT0RpH7awtf98GZx2Md',$,'Depth','The depth of the object.\X2\000A000A\X0\Depth (one direction of the non-projected foot print area) of the slab. It shall only be provided, if the slab is rectangular.NOTE Also referred to as width, but not to be confused with the "Width" quantity, that denotes the thickness in the context of the slab.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5177=IFCSIMPLEPROPERTYTEMPLATE('1_S7NXqxr7Xf1W$HsJgi5K',$,'Perimeter','Perimeter of the object.\X2\000A000A\X0\Perimeter measured along the outer boundaries of the slab. Only given, if the slab is prismatic (constant thickness).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5178=IFCSIMPLEPROPERTYTEMPLATE('0WlTVJ$bf5ef1otvw8egIy',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Indicates the extruded area of the element. Only given, if the element is prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5179=IFCSIMPLEPROPERTYTEMPLATE('3Xm6V8IJ5Bfuv3fxSMEghW',$,'NetArea','Total net area of the object. Openings, recesses and cut-outs are taken into account by subtraction, projections by addition.\X2\000A000A\X0\Indicates the extruded area of the object. Only given when prismatic.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5180=IFCSIMPLEPROPERTYTEMPLATE('2NEI_oMpz66R1A7$Yu9RBT',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5181=IFCSIMPLEPROPERTYTEMPLATE('2SwaZNNf18LgpqNptoO6pD',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the slab. Openings and recesses are taken into account by subtraction, projections by addition.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5182=IFCSIMPLEPROPERTYTEMPLATE('38GaFIbkL2EAKtgzhbEDhL',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5183=IFCSIMPLEPROPERTYTEMPLATE('17xKaP$lT9GvWHmaYDO_tH',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5184=IFCPROPERTYSETTEMPLATE('1t1cU5kz57Z8mpR$zdLivx',$,'Qto_SleeperBaseQuantities','Base quantities common to the definition to all occurrences of IfcTrackElement with PredefinedType set to SLEEPER.',.QTO_TYPEDRIVENOVERRIDE.,'IfcTrackElement/SLEEPER,IfcTrackElementType/SLEEPER',(#5185,#5186,#5187)); +#5185=IFCSIMPLEPROPERTYTEMPLATE('0_io0dS0bEkQDq8icEVLBU',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5186=IFCSIMPLEPROPERTYTEMPLATE('3EX1wlYKX1lvHb2s0KMh4D',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5187=IFCSIMPLEPROPERTYTEMPLATE('3zaKDqCDfCzQoc$BnPn7zo',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5188=IFCPROPERTYSETTEMPLATE('1s_YUjmOz3FhVehEj4BSBQ',$,'Qto_SolarDeviceBaseQuantities','Base quantities that are common to the definition of all occurrences of solar devices.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSolarDevice,IfcSolarDeviceType',(#5189,#5190)); +#5189=IFCSIMPLEPROPERTYTEMPLATE('2sf4FFnzH38PuMR97UYzlo',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5190=IFCSIMPLEPROPERTYTEMPLATE('0RQ$mM_4P6cfcp1MPRL27K',$,'GrossArea','Gross Area of the object. Openings, recesses, projections and cut-outs are not taken into account.\X2\000A000A\X0\Including the outer frame.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5191=IFCPROPERTYSETTEMPLATE('0$EwddC51AZ8uLMXDlSRE5',$,'Qto_SpaceBaseQuantities','Base quantities that are common to the definition of all occurrences of spaces.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSpace,IfcSpaceType',(#5192,#5193,#5194,#5195,#5196,#5197,#5198,#5199,#5200,#5201,#5202,#5203,#5204)); +#5192=IFCSIMPLEPROPERTYTEMPLATE('0aeHrmsq92oxjiT58JaLu_',$,'Height','Characteristic height\X2\000A000A\X0\Total height (from base slab without flooring to ceiling without suspended ceiling) for this space (measured from top of slab below to bottom of slab above). To be provided only if the space has a constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5193=IFCSIMPLEPROPERTYTEMPLATE('2RqrwHBTrAPRy9GroZYe6m',$,'FinishCeilingHeight','Height of the suspended ceiling (from top of flooring to the bottom of the suspended ceiling). To be provided only if the space has a suspended ceiling with constant height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5194=IFCSIMPLEPROPERTYTEMPLATE('3I$Fyh6xzE2fjZUZDOKZLT',$,'FinishFloorHeight','Height of the flooring (from base slab without flooring to the flooring height). To be provided only if the space has a constant flooring height.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5195=IFCSIMPLEPROPERTYTEMPLATE('0X1ECS6oHAaf9QVYggRRDZ',$,'GrossPerimeter','Gross perimeter at the outer contour of the object.\X2\000A000A\X0\Measured at floor level with all sides of the space, including those parts of the perimeter that are created by virtual boundaries and openings (like doors).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5196=IFCSIMPLEPROPERTYTEMPLATE('23yXsZpzX3HRoUPjnpbPo3',$,'NetPerimeter','Net perimeter at the floor level of this space. It excludes those parts of the perimeter that are created by by virtual boundaries and openings (like doors). It is the measurement used for skirting boards and may include the perimeter of internal fixed objects like columns.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5197=IFCSIMPLEPROPERTYTEMPLATE('2xu3Mu17vCUPB7RSgyzIxf',$,'GrossFloorArea','Sum of all gross floor areas within the spatial structure element.\X2\000A000A\X0\Includes the area covered by elements inside the space (columns, inner walls, etc.) and excludes the area covered by wall claddings.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5198=IFCSIMPLEPROPERTYTEMPLATE('32bD6QtMr7pAI1Sv_1YUyk',$,'NetFloorArea','Sum of all net usable floor areas.\X2\000A000A\X0\It excludes the area covered by elements inside the space (columns, inner walls, built-in''s etc.), slab openings, or other protruding elements. Varying heights are not taking into account (i.e. no reduction for areas under a minimum headroom).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5199=IFCSIMPLEPROPERTYTEMPLATE('0nBW9aIFz0me3Thu4o1kwB',$,'GrossWallArea','Sum of all wall (and other vertically bounding elements, like columns) areas bounded by the space. It includes the area covered by elements inside the wall area (doors, windows, other openings, etc.).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5200=IFCSIMPLEPROPERTYTEMPLATE('0UH$r4p6966Blj233icHDZ',$,'NetWallArea','Sum of all wall (and other vertically bounding elements, like columns) areas bounded by the space. It excludes the area covered by elements inside the wall area (doors, windows, other openings, etc.).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5201=IFCSIMPLEPROPERTYTEMPLATE('3hUZ$sDPr24v6Pou1gO$ae',$,'GrossCeilingArea','Sum of all ceiling areas of the space. It includes the area covered by elementsinside the space (columns, inner walls, etc.). The ceiling area is the real (and not the projected) area (e.g. in case of sloped ceilings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5202=IFCSIMPLEPROPERTYTEMPLATE('1HWCY2EkXEuBwLNaqAUB8R',$,'NetCeilingArea','Sum of all ceiling areas of the space. It excludes the area covered by elementsinside the space (columns, inner walls, etc.). The ceiling area is the real (and not the projected) area (e.g. in case of sloped ceilings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5203=IFCSIMPLEPROPERTYTEMPLATE('166GdM$Xn6gPvXEBwYUrH6',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5204=IFCSIMPLEPROPERTYTEMPLATE('1D5EIVPm54LPIJBc9$ZklS',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Net volume enclosed by the space, excluding the volume of construction elements inside the space.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5205=IFCPROPERTYSETTEMPLATE('1fadAYaZP74QXGkq9j7DuZ',$,'Qto_SpaceHeaterBaseQuantities','Base quantities that are common to the definition of all types of space heaters.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSpaceHeater,IfcSpaceHeaterType',(#5206,#5207,#5208)); +#5206=IFCSIMPLEPROPERTYTEMPLATE('2u$iTAupr8WQJ8Jt7pYEUy',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5207=IFCSIMPLEPROPERTYTEMPLATE('3owc3cQhP1ROE7McM9Ce$f',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5208=IFCSIMPLEPROPERTYTEMPLATE('3EbNkqsPn04f6eLFdvFUIS',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the element, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5209=IFCPROPERTYSETTEMPLATE('2$Sh4aPFjFjx7pq$dp$VFt',$,'Qto_SpatialZoneBaseQuantities','Base quantities set for Spatial Zones.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSpatialZone,IfcSpatialZoneType',(#5210,#5211,#5212)); +#5210=IFCSIMPLEPROPERTYTEMPLATE('0cSVfwjM58UAU2oWLW3bZA',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5211=IFCSIMPLEPROPERTYTEMPLATE('1gyVpFpRH8ygAXixmD2BBm',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5212=IFCSIMPLEPROPERTYTEMPLATE('2aA3I8WujELe_olQi9541U',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5213=IFCPROPERTYSETTEMPLATE('2X24wiQxH2bfiJJMviXP_Z',$,'Qto_StackTerminalBaseQuantities','Base quantities that are common to the definition of all occurrences of stack terminal.',.QTO_TYPEDRIVENOVERRIDE.,'IfcStackTerminal,IfcStackTerminalType',(#5214)); +#5214=IFCSIMPLEPROPERTYTEMPLATE('27Lp37Qt10QBhU93V6dyEs',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5215=IFCPROPERTYSETTEMPLATE('2n53tfxPL9OgHdnQ5NjQ1o',$,'Qto_StairFlightBaseQuantities','Base quantities that are common to the definition of all occurrences of stair flights.',.QTO_TYPEDRIVENOVERRIDE.,'IfcStairFlight,IfcStairFlightType',(#5216,#5217,#5218)); +#5216=IFCSIMPLEPROPERTYTEMPLATE('1wJmC8us9ClvOxleY1Zv7l',$,'Length','The length of the object.\X2\000A000A\X0\Measured along the walking line.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5217=IFCSIMPLEPROPERTYTEMPLATE('3u13mdEPbBkxPwpmPtXhYS',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5218=IFCSIMPLEPROPERTYTEMPLATE('3vxEAzMgT8C8qv9Av0Wr23',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Total net volume of the stair flight. Openings and recesses are taken into account by subtraction, projections by addition.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5219=IFCPROPERTYSETTEMPLATE('3TJ1NiBXHEQBG4j9Ar2Fl7',$,'Qto_SurfaceFeatureBaseQuantities','Base quantities for Surface Features.',.QTO_OCCURRENCEDRIVEN.,'IfcSurfaceFeature',(#5220,#5221)); +#5220=IFCSIMPLEPROPERTYTEMPLATE('34ECEfF4X1igF6TQ_q1hNA',$,'Area','Calculated area for the object.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5221=IFCSIMPLEPROPERTYTEMPLATE('05BzuG90X28Aiyg2jGLFsT',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5222=IFCPROPERTYSETTEMPLATE('2PbdRc_yv2gwtcKgJ9v8Rh',$,'Qto_SwitchingDeviceBaseQuantities','Base quantities that are common to the definition of all occurrences of switching device.',.QTO_TYPEDRIVENOVERRIDE.,'IfcSwitchingDevice,IfcSwitchingDeviceType',(#5223)); +#5223=IFCSIMPLEPROPERTYTEMPLATE('2Cv4QbhC93HgAaUQJlBFgc',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5224=IFCPROPERTYSETTEMPLATE('13IpaV9hL4R94nsveVp5MK',$,'Qto_TankBaseQuantities','Base quantities that are common to the definition of all types of tanks.',.QTO_TYPEDRIVENOVERRIDE.,'IfcTank,IfcTankType',(#5225,#5226,#5227)); +#5225=IFCSIMPLEPROPERTYTEMPLATE('0OYQxNdBbAg9pXsAWE5oD4',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5226=IFCSIMPLEPROPERTYTEMPLATE('1zHY2hqML0w8Dp4mZNdCk8',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the element, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5227=IFCSIMPLEPROPERTYTEMPLATE('0SA7HDTWX3G8CDRW_qJjAO',$,'TotalSurfaceArea','Total surface area of the element.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5228=IFCPROPERTYSETTEMPLATE('1wr2urGaj4awgCcymuaD_1',$,'Qto_TransformerBaseQuantities','Base quantities that are common to the definition of all occurrences of transformer.',.QTO_TYPEDRIVENOVERRIDE.,'IfcTransformer,IfcTransformerType',(#5229)); +#5229=IFCSIMPLEPROPERTYTEMPLATE('3b$dfWlE5EcP5_Ro4AYta1',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5230=IFCPROPERTYSETTEMPLATE('0or3PJwtLB_AtaLEuF3tuV',$,'Qto_TubeBundleBaseQuantities','Base quantities that are common to the definition of all types of tube bundles.',.QTO_TYPEDRIVENOVERRIDE.,'IfcTubeBundle,IfcTubeBundleType',(#5231,#5232)); +#5231=IFCSIMPLEPROPERTYTEMPLATE('2bKpu8Xyv5geIrG0Y5p$3Z',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Not including contained fluid.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5232=IFCSIMPLEPROPERTYTEMPLATE('2ZXX6xkM9D4Q4svvK3NGGz',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Weight of the element, including contained fluid as designed.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5233=IFCPROPERTYSETTEMPLATE('373wpFtALEEQbGELp7914t',$,'Qto_UnitaryControlElementBaseQuantities','Base quantities that are common to the definition of all occurrences of unitary control element.',.QTO_TYPEDRIVENOVERRIDE.,'IfcUnitaryControlElement,IfcUnitaryControlElementType',(#5234)); +#5234=IFCSIMPLEPROPERTYTEMPLATE('2wlliyTCr8Mhmtyxva4$J$',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5235=IFCPROPERTYSETTEMPLATE('2YvhplFkP6B9DJmpLwlWeg',$,'Qto_UnitaryEquipmentBaseQuantities','Base quantities that are common to the definition of all types of unitary equipment.',.QTO_TYPEDRIVENOVERRIDE.,'IfcUnitaryEquipment,IfcUnitaryEquipmentType',(#5236)); +#5236=IFCSIMPLEPROPERTYTEMPLATE('0DN9nUmpz1De3JTgAem4nE',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5237=IFCPROPERTYSETTEMPLATE('2341itr3P25uK5YqSLvQou',$,'Qto_ValveBaseQuantities','Base quantities that are common to the definition of all types of valves.',.QTO_TYPEDRIVENOVERRIDE.,'IfcValve,IfcValveType',(#5238)); +#5238=IFCSIMPLEPROPERTYTEMPLATE('0M$wWMxk953fKH1M9IsIxb',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5239=IFCPROPERTYSETTEMPLATE('26VG4bywb5geWqnU3QHEoI',$,'Qto_VehicleBaseQuantities','Quantities for vehicles',.QTO_TYPEDRIVENOVERRIDE.,'IfcVehicle/ROLLINGSTOCK,IfcVehicle/VEHICLEAIR,IfcVehicle/VEHICLEMARINE,IfcVehicle/VEHICLE,IfcVehicle/VEHICLETRACKED,IfcVehicleType/ROLLINGSTOCK,IfcVehicleType/VEHICLEAIR,IfcVehicleType/VEHICLEMARINE,IfcVehicleType/VEHICLE,IfcVehicleType/VEHICLETRACKED',(#5240,#5241,#5242)); +#5240=IFCSIMPLEPROPERTYTEMPLATE('2dqKHeXBj0JwXlGPh_DFHP',$,'Length','The length of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5241=IFCSIMPLEPROPERTYTEMPLATE('1U_O0LWl9AVfyiqqPHl8HO',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5242=IFCSIMPLEPROPERTYTEMPLATE('339ZIFL8nFcwlJBZuGt9Ds',$,'Height','Characteristic height',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5243=IFCPROPERTYSETTEMPLATE('1_qrNR3CvB7vXb4QE5mNGk',$,'Qto_VibrationIsolatorBaseQuantities','Base quantities that are common to the definition of all types of vibration isolators.',.QTO_TYPEDRIVENOVERRIDE.,'IfcVibrationIsolator,IfcVibrationIsolatorType',(#5244)); +#5244=IFCSIMPLEPROPERTYTEMPLATE('2B2rzau0PARvg7qfzlzGIU',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5245=IFCPROPERTYSETTEMPLATE('0a5nlSz4D83A5sUo$Llfru',$,'Qto_VolumetricStratumBaseQuantities','Quantity measures associated to volumetric stratum such as in a geotechnical model. Uncertainty is documented in Pset_Uncertainty.',.QTO_OCCURRENCEDRIVEN.,'IfcGeotechnicalStratum',(#5246,#5247,#5248,#5249)); +#5246=IFCSIMPLEPROPERTYTEMPLATE('286BHJSLPDjR0Ap0Jks0Ov',$,'Area','Calculated area for the object.\X2\000A000A\X0\Actual area of upper surface of shape.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5247=IFCSIMPLEPROPERTYTEMPLATE('1smFKn3Rj3I90dC9Ry58gt',$,'Mass','Mass represented, if lower surface of stratum known.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5248=IFCSIMPLEPROPERTYTEMPLATE('2jGGbIVy19nOvOjP1SRi_z',$,'PlanArea','Projected plan area of upper surface of model.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5249=IFCSIMPLEPROPERTYTEMPLATE('1fXxot$pLBMv4H1YO9zpuU',$,'Volume','Volume of the element.\X2\000A000A\X0\Volume represented, if lower surface of stratum known.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5250=IFCPROPERTYSETTEMPLATE('3bCU5_uufADQ$PBK65hkqM',$,'Qto_WallBaseQuantities','Base quantities that are common to the definition of all occurrences of walls.',.QTO_TYPEDRIVENOVERRIDE.,'IfcWall,IfcWallType',(#5251,#5252,#5253,#5254,#5255,#5256,#5257,#5258,#5259,#5260,#5261)); +#5251=IFCSIMPLEPROPERTYTEMPLATE('0rm9VV3ajBiP0ulkW34NIT',$,'Length','The length of the object.\X2\000A000A\X0\Along center line (even if different to the wall path).',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5252=IFCSIMPLEPROPERTYTEMPLATE('3$qNetIeTBsBhO59ABC0jO',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\Measured perpendicular to the wall path. It should only be provided, if it is constant along the wall path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5253=IFCSIMPLEPROPERTYTEMPLATE('0aGNoGUX54rwljtqEenPSz',$,'Height','Characteristic height\X2\000A000A\X0\Total nominal height of the wall. It should only be provided, if it is constant along the wall path.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5254=IFCSIMPLEPROPERTYTEMPLATE('2fkAxpbdvCJ9F7TJJdMmw8',$,'GrossFootPrintArea',$,.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5255=IFCSIMPLEPROPERTYTEMPLATE('2JhCtIiWT5Yw9uncnpjKoB',$,'NetFootPrintArea',$,.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5256=IFCSIMPLEPROPERTYTEMPLATE('0mV4G6GkD1TA4xzVSStegj',$,'GrossSideArea','Area of the wall as viewed by an elevation view of the middle plane of the wall. It does not take into account any wall modifications (such as openings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5257=IFCSIMPLEPROPERTYTEMPLATE('10p$HtGD9CffG40XCt670Q',$,'NetSideArea','Area of the object as viewed by an elevation view of the middle plane of the object. It does take into account all object modifications (such as openings).',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); +#5258=IFCSIMPLEPROPERTYTEMPLATE('0XaSJ9NN5ECQYJ4WoPaoQo',$,'GrossVolume','Total gross volume of the object. Openings, recesses, enclosed objects and projections are not taken into account.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5259=IFCSIMPLEPROPERTYTEMPLATE('2UeLeY2_976e9VUjS$EAd4',$,'NetVolume','Total net volume of the object, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.\X2\000A000A\X0\Volume of the wall, after subtracting the openings and after considering the connection geometry.',.Q_VOLUME.,$,$,$,$,$,$,.READWRITE.); +#5260=IFCSIMPLEPROPERTYTEMPLATE('1XSNA2cf9EfebDyMIamjTC',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5261=IFCSIMPLEPROPERTYTEMPLATE('0BOsDBabb7kBMDKnY$1OhW',$,'NetWeight','Total net weight of the object without add-on parts, taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5262=IFCPROPERTYSETTEMPLATE('30rEnkpy1FdfTnP0HO4ZVy',$,'Qto_WasteTerminalBaseQuantities','Base quantities that are common to the definition of all occurrences of waste terminal.',.QTO_TYPEDRIVENOVERRIDE.,'IfcWasteTerminal,IfcWasteTerminalType',(#5263)); +#5263=IFCSIMPLEPROPERTYTEMPLATE('3RS5UyHo14Vh45JAYQnsrT',$,'GrossWeight','Total Gross Weight of the object without any add-on parts and not taking into account possible processing features (cut-out''s, etc.) or openings and recesses.',.Q_WEIGHT.,$,$,$,$,$,$,.READWRITE.); +#5264=IFCPROPERTYSETTEMPLATE('1YDhfKnsP5kexG88Ag_0OO',$,'Qto_WindowBaseQuantities','Base quantities that are common to the definition of all occurrences of windows.',.QTO_TYPEDRIVENOVERRIDE.,'IfcWindow,IfcWindowType',(#5265,#5266,#5267,#5268)); +#5265=IFCSIMPLEPROPERTYTEMPLATE('1s3i5dzZ976O09CuN4YqLx',$,'Width','The width of the object. Only given, if the object has constant thickness (prismatic).\X2\000A000A\X0\Total outer width of the window lining. It should only be provided, if it is a rectangular window.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5266=IFCSIMPLEPROPERTYTEMPLATE('1iqg14I8L6GfGdcm7OJR6h',$,'Height','Characteristic height\X2\000A000A\X0\Total outer height of the window lining. It should only be provided, if it is a rectangular window.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5267=IFCSIMPLEPROPERTYTEMPLATE('2LaPVPY1rCeQUbfTt7wvmG',$,'Perimeter','Perimeter of the object.',.Q_LENGTH.,$,$,$,$,$,$,.READWRITE.); +#5268=IFCSIMPLEPROPERTYTEMPLATE('2kQTdm53f2nAc3UYi_lpSI',$,'Area','Calculated area for the object.\X2\000A000A\X0\Total area of the outer lining of the window.',.Q_AREA.,$,$,$,$,$,$,.READWRITE.); ENDSEC; END-ISO-10303-21; From 6806eb0a05abb86644eec5bd56dd6a483fd9540f Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 08:41:43 +1000 Subject: [PATCH 319/429] Create blank ifc4 qto base quantities ruleset --- src/blenderbim/scripts/get_all_qtos.py | 27 + src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json | 628 ++++++++++++++++++++- 2 files changed, 651 insertions(+), 4 deletions(-) create mode 100644 src/blenderbim/scripts/get_all_qtos.py diff --git a/src/blenderbim/scripts/get_all_qtos.py b/src/blenderbim/scripts/get_all_qtos.py new file mode 100644 index 0000000000..ae0787335d --- /dev/null +++ b/src/blenderbim/scripts/get_all_qtos.py @@ -0,0 +1,27 @@ +import json +import ifcopenshell.util.pset +import ifcopenshell.util.type + + +def order_dict(dictionary): + # https://stackoverflow.com/questions/22721579/sorting-a-nested-ordereddict-by-key-recursively + return {k: order_dict(v) if isinstance(v, dict) else v for k, v in sorted(dictionary.items())} + + +results = {} + +psetqto = ifcopenshell.util.pset.get_template("IFC4") +for template in psetqto.templates: + for pset_template in template.by_type("IfcPropertySetTemplate"): + if not pset_template.Name.startswith("Qto_"): + continue + query = pset_template.ApplicableEntity + results.setdefault(query, {}) + results[query].setdefault(pset_template.Name, {}) + for quantity in pset_template.HasPropertyTemplates: + results[query][pset_template.Name][quantity.Name] = None + +results = order_dict(results) +print(results) +with open("results.json", "w") as f: + json.dump(results, f, indent=4) diff --git a/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json b/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json index f0627c19da..b5e5d8b014 100644 --- a/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json +++ b/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json @@ -1,15 +1,635 @@ { "name": "IFC4 Base Quantities", - "description": "This ruleset quantifies every single possible standardised base quantity in IFC4", + "description": "This ruleset quantifies every single possible standardised base quantity in IFC4 using only IfcOpenShell as a geometry processor.", "calculators": { "IOSTriangulation": { + "IfcActuator": { + "Qto_ActuatorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcAirTerminal": { + "Qto_AirTerminalBaseQuantities": { + "GrossWeight": null, + "Perimeter": null, + "TotalSurfaceArea": null + } + }, + "IfcAirTerminalBox": { + "Qto_AirTerminalBoxTypeBaseQuantities": { + "GrossWeight": null + } + }, + "IfcAirToAirHeatRecovery": { + "Qto_AirToAirHeatRecoveryBaseQuantities": { + "GrossWeight": null + } + }, + "IfcAlarm": { + "Qto_AlarmBaseQuantities": { + "GrossWeight": null + } + }, + "IfcAudioVisualAppliance": { + "Qto_AudioVisualApplianceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcBeam": { + "Qto_BeamBaseQuantities": { + "CrossSectionArea": null, + "GrossSurfaceArea": null, + "GrossVolume": null, + "GrossWeight": null, + "Length": null, + "NetSurfaceArea": null, + "NetVolume": null, + "NetWeight": null, + "OuterSurfaceArea": null + } + }, + "IfcBoiler": { + "Qto_BoilerBaseQuantities": { + "GrossWeight": null, + "NetWeight": null, + "TotalSurfaceArea": null + } + }, + "IfcBuilding": { + "Qto_BuildingBaseQuantities": { + "EavesHeight": null, + "FootprintArea": null, + "GrossFloorArea": null, + "GrossVolume": null, + "Height": null, + "NetFloorArea": null, + "NetVolume": null + } + }, + "IfcBuildingElementProxy": { + "Qto_BuildingElementProxyQuantities": { + "NetSurfaceArea": null, + "NetVolume": null + } + }, + "IfcBuildingStorey": { + "Qto_BuildingStoreyBaseQuantities": { + "GrossFloorArea": null, + "GrossHeight": null, + "GrossPerimeter": null, + "GrossVolume": null, + "NetFloorArea": null, + "NetHeigtht": null, + "NetVolume": null + } + }, + "IfcBurner": { + "Qto_BurnerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCableCarrierFitting": { + "Qto_CableCarrierFittingBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCableCarrierSegment": { + "Qto_CableCarrierSegmentBaseQuantities": { + "CrossSectionArea": null, + "GrossWeight": null, + "Length": null, + "OuterSurfaceArea": null + } + }, + "IfcCableFitting": { + "Qto_CableFittingBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCableSegment": { + "Qto_CableSegmentBaseQuantities": { + "CrossSectionArea": null, + "GrossWeight": null, + "Length": null, + "OuterSurfaceArea": null + } + }, + "IfcChiller": { + "Qto_ChillerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcChimney": { + "Qto_ChimneyBaseQuantities": { + "Length": null + } + }, + "IfcCoil": { + "Qto_CoilBaseQuantities": { + "GrossWeight": null + } + }, + "IfcColumn": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": null, + "GrossSurfaceArea": null, + "GrossVolume": null, + "GrossWeight": null, + "Length": null, + "NetSurfaceArea": null, + "NetVolume": null, + "NetWeight": null, + "OuterSurfaceArea": null + } + }, + "IfcCommunicationsAppliance": { + "Qto_CommunicationsApplianceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCompressor": { + "Qto_CompressorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCondenser": { + "Qto_CondenserBaseQuantities": { + "GrossWeight": null + } + }, + "IfcConstructionEquipmentResource": { + "Qto_ConstructionEquipmentResourceBaseQuantities": { + "OperatingTime": null, + "UsageTime": null + } + }, + "IfcConstructionMaterialResource": { + "Qto_ConstructionMaterialResourceBaseQuantities": { + "GrossVolume": null, + "GrossWeight": null, + "NetVolume": null, + "NetWeight": null + } + }, + "IfcController": { + "Qto_ControllerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCooledBeam": { + "Qto_CooledBeamBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCoolingTower": { + "Qto_CoolingTowerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCovering": { + "Qto_CoveringBaseQuantities": { + "GrossArea": null, + "NetArea": null, + "Width": null + } + }, + "IfcCurtainWall": { + "Qto_CurtainWallQuantities": { + "GrossSideArea": null, + "Height": null, + "Length": null, + "NetSideArea": null, + "Width": null + } + }, + "IfcDamper": { + "Qto_DamperBaseQuantities": { + "GrossWeight": null + } + }, + "IfcDistributionChamberElement": { + "Qto_DistributionChamberElementBaseQuantities": { + "GrossSurfaceArea": null, + "GrossVolume": null, + "NetSurfaceArea": null, + "NetVolume": null + } + }, + "IfcDoor": { + "Qto_DoorBaseQuantities": { + "Area": null, + "Height": null, + "Perimeter": null, + "Width": null + } + }, + "IfcDuctFitting": { + "Qto_DuctFittingBaseQuantities": { + "GrossCrossSectionArea": null, + "GrossWeight": null, + "Length": null, + "NetCrossSectionArea": null, + "OuterSurfaceArea": null + } + }, + "IfcDuctSegment": { + "Qto_DuctSegmentBaseQuantities": { + "GrossCrossSectionArea": null, + "GrossWeight": null, + "Length": null, + "NetCrossSectionArea": null, + "OuterSurfaceArea": null + } + }, + "IfcDuctSilencer": { + "Qto_DuctSilencerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcElectricAppliance": { + "Qto_ElectricApplianceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcElectricDistributionBoard": { + "Qto_ElectricDistributionBoardBaseQuantities": { + "GrossWeight": null, + "NumberOfCircuits": null + } + }, + "IfcElectricFlowStorageDevice": { + "Qto_ElectricFlowStorageDeviceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcElectricGenerator": { + "Qto_ElectricGeneratorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcElectricMotor": { + "Qto_ElectricMotorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcElectricTimeControl": { + "Qto_ElectricTimeControlBaseQuantities": { + "GrossWeight": null + } + }, + "IfcEvaporativeCooler": { + "Qto_EvaporativeCoolerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcEvaporator": { + "Qto_EvaporatorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFan": { + "Qto_FanBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFilter": { + "Qto_FilterBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFireSuppressionTerminal": { + "Qto_FireSuppressionTerminalBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFlowInstrument": { + "Qto_FlowInstrumentBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFlowMeter": { + "Qto_FlowMeterBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFooting": { + "Qto_FootingBaseQuantities": { + "CrossSectionArea": null, + "GrossSurfaceArea": null, + "GrossVolume": null, + "GrossWeight": null, + "Height": null, + "Length": null, + "NetVolume": null, + "NetWeight": null, + "OuterSurfaceArea": null, + "Width": null + } + }, + "IfcHeatExchanger": { + "Qto_HeatExchangerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcHumidifier": { + "Qto_HumidifierBaseQuantities": { + "GrossWeight": null + } + }, + "IfcInterceptor": { + "Qto_InterceptorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcJunctionBox": { + "Qto_JunctionBoxBaseQuantities": { + "GrossWeight": null, + "NumberOfGangs": null + } + }, + "IfcLaborResource": { + "Qto_LaborResourceBaseQuantities": { + "OvertimeWork": null, + "StandardWork": null + } + }, + "IfcLamp": { + "Qto_LampBaseQuantities": { + "GrossWeight": null + } + }, + "IfcLightFixture": { + "Qto_LightFixtureBaseQuantities": { + "GrossWeight": null + } + }, + "IfcMember": { + "Qto_MemberBaseQuantities": { + "CrossSectionArea": null, + "GrossSurfaceArea": null, + "GrossVolume": null, + "GrossWeight": null, + "Length": null, + "NetSurfaceArea": null, + "NetVolume": null, + "NetWeight": null, + "OuterSurfaceArea": null + } + }, + "IfcMotorConnection": { + "Qto_MotorConnectionBaseQuantities": { + "GrossWeight": null + } + }, + "IfcOpeningElement": { + "Qto_OpeningElementBaseQuantities": { + "Area": null, + "Depth": null, + "Height": null, + "Volume": null, + "Width": null + } + }, + "IfcOutlet": { + "Qto_OutletBaseQuantities": { + "GrossWeight": null + } + }, + "IfcPile": { + "Qto_PileBaseQuantities": { + "CrossSectionArea": null, + "GrossSurfaceArea": null, + "GrossVolume": null, + "GrossWeight": null, + "Length": null, + "NetVolume": null, + "NetWeight": null, + "OuterSurfaceArea": null + } + }, + "IfcPipeFitting": { + "Qto_PipeFittingBaseQuantities": { + "GrossCrossSectionArea": null, + "GrossWeight": null, + "Length": null, + "NetCrossSectionArea": null, + "NetWeight": null, + "OuterSurfaceArea": null + } + }, + "IfcPipeSegment": { + "Qto_PipeSegmentBaseQuantities": { + "GrossCrossSectionArea": null, + "GrossWeight": null, + "Length": null, + "NetCrossSectionArea": null, + "NetWeight": null, + "OuterSurfaceArea": null + } + }, + "IfcPlate": { + "Qto_PlateBaseQuantities": { + "GrossArea": null, + "GrossVolume": null, + "GrossWeight": null, + "NetArea": null, + "NetVolume": null, + "NetWeight": null, + "Perimeter": null, + "Width": null + } + }, + "IfcProjectionElement": { + "Qto_ProjectionElementBaseQuantities": { + "Area": null, + "Volume": null + } + }, + "IfcProtectiveDevice": { + "Qto_ProtectiveDeviceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcProtectiveDeviceTrippingUnit": { + "Qto_ProtectiveDeviceTrippingUnitBaseQuantities": { + "GrossWeight": null + } + }, + "IfcPump": { + "Qto_PumpBaseQuantities": { + "GrossWeight": null + } + }, + "IfcRailing": { + "Qto_RailingBaseQuantities": { + "Length": null + } + }, + "IfcRampFlight": { + "Qto_RampFlightBaseQuantities": { + "GrossArea": null, + "GrossVolume": null, + "Length": null, + "NetArea": null, + "NetVolume": null, + "Width": null + } + }, + "IfcReinforcingElement": { + "Qto_ReinforcingElementBaseQuantities": { + "Count": null, + "Length": null, + "Weight": null + } + }, + "IfcRoof": { + "Qto_RoofBaseQuantities": { + "GrossArea": null, + "NetArea": null, + "ProjectedArea": null + } + }, + "IfcSanitaryTerminal": { + "Qto_SanitaryTerminalBaseQuantities": { + "GrossWeight": null + } + }, + "IfcSensor": { + "Qto_SensorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcSite": { + "Qto_SiteBaseQuantities": { + "GrossArea": null, + "GrossPerimeter": null + } + }, + "IfcSlab": { + "Qto_SlabBaseQuantities": { + "Depth": null, + "GrossArea": null, + "GrossVolume": null, + "GrossWeight": null, + "Length": null, + "NetArea": null, + "NetVolume": null, + "NetWeight": null, + "Perimeter": null, + "Width": null + } + }, + "IfcSolarDevice": { + "Qto_SolarDeviceBaseQuantities": { + "GrossArea": null, + "GrossWeight": null + } + }, + "IfcSpace": { + "Qto_SpaceBaseQuantities": { + "FinishCeilingHeight": null, + "FinishFloorHeight": null, + "GrossCeilingArea": null, + "GrossFloorArea": null, + "GrossPerimeter": null, + "GrossVolume": null, + "GrossWallArea": null, + "Height": null, + "NetCeilingArea": null, + "NetFloorArea": null, + "NetPerimeter": null, + "NetVolume": null, + "NetWallArea": null + } + }, + "IfcSpaceHeater": { + "Qto_SpaceHeaterBaseQuantities": { + "GrossWeight": null, + "Length": null, + "NetWeight": null + } + }, + "IfcStackTerminal": { + "Qto_StackTerminalBaseQuantities": { + "GrossWeight": null + } + }, + "IfcStairFlight": { + "Qto_StairFlightBaseQuantities": { + "GrossVolume": null, + "Length": null, + "NetVolume": null + } + }, + "IfcSwitchingDevice": { + "Qto_SwitchingDeviceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcTank": { + "Qto_TankBaseQuantities": { + "GrossWeight": null, + "NetWeight": null, + "TotalSurfaceArea": null + } + }, + "IfcTransformer": { + "Qto_TransformerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcTubeBundle": { + "Qto_TubeBundleBaseQuantities": { + "GrossWeight": null, + "NetWeight": null + } + }, + "IfcUnitaryControlElement": { + "Qto_UnitaryControlElementBaseQuantities": { + "GrossWeight": null + } + }, + "IfcUnitaryEquipment": { + "Qto_UnitaryEquipmentBaseQuantities": { + "GrossWeight": null + } + }, + "IfcValve": { + "Qto_ValveBaseQuantities": { + "GrossWeight": null + } + }, + "IfcVibrationIsolator": { + "Qto_VibrationIsolatorBaseQuantities": { + "GrossWeight": null + } + }, "IfcWall": { "Qto_WallBaseQuantities": { - "Length": "net_get_x", - "Width": "net_get_y", + "GrossFootprintArea": null, + "GrossSideArea": null, + "GrossVolume": null, + "GrossWeight": null, "Height": "net_get_z", + "Length": "net_get_x", + "NetFootprintArea": null, "NetSideArea": "net_get_side_area", - "NetVolume": "net_get_volume" + "NetVolume": "net_get_volume", + "NetWeight": null, + "Width": "net_get_y" + } + }, + "IfcWasteTerminal": { + "Qto_WasteTerminalBaseQuantities": { + "GrossWeight": null + } + }, + "IfcWindow": { + "Qto_WindowBaseQuantities": { + "Area": null, + "Height": null, + "Perimeter": null, + "Width": null } } } From c0b86ea01659fcbf151165437f8b05a58ae989ba Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 08:51:27 +1000 Subject: [PATCH 320/429] Fix incorrect colours in Basic FM template --- src/ifcfm/ifcfm/basic.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ifcfm/ifcfm/basic.py b/src/ifcfm/ifcfm/basic.py index 28ed242ee3..03afab8483 100644 --- a/src/ifcfm/ifcfm/basic.py +++ b/src/ifcfm/ifcfm/basic.py @@ -265,7 +265,7 @@ config = { "AreaUnit", "Phase", ], - "colours": "ppppreeeeesss", + "colours": "ppprrreeeeesss", "sort": [{"name": "Name", "order": "ASC"}], "get_category_elements": get_facilities, "get_element_data": get_facility_data, @@ -283,7 +283,7 @@ config = { "ModelID", "Elevation", ], - "colours": "ppreeees", + "colours": "prrreeees", "sort": [{"name": "Elevation", "order": "ASC"}, {"name": "Name", "order": "ASC"}], "get_category_elements": get_storeys, "get_element_data": get_storey_data, @@ -304,7 +304,7 @@ config = { "GrossFloorArea", "NetFloorArea", ], - "colours": "ppprreeess", + "colours": "pprrrreeesss", "sort": [{"name": "StoreyName", "order": "ASC"}, {"name": "Name", "order": "ASC"}], "get_category_elements": get_spaces, "get_element_data": get_space_data, @@ -336,7 +336,7 @@ config = { "PointOfContact", "WarrantyPeriod", ], - "colours": "pppreeeeesssss", + "colours": "pprrreeeeesssss", "sort": [{"name": "ModelObject", "order": "ASC"}, {"name": "Name", "order": "ASC"}], "get_category_elements": get_element_types, "get_element_data": get_element_type_data, @@ -379,7 +379,7 @@ config = { "ModelSoftware", "ModelID", ], - "colours": "pppreee", + "colours": "pprrreee", "sort": [{"name": "Name", "order": "ASC"}], "get_category_elements": get_systems, "get_element_data": get_system_data, From 9d789425ce3d7430db7e74f4cf62a991dcdb00b1 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 11:19:33 +1000 Subject: [PATCH 321/429] Purge guess quantity feature. It will be reintroduced as a separate tool. --- .../blenderbim/bim/module/pset/__init__.py | 1 - .../blenderbim/bim/module/pset/operator.py | 22 --------- .../bim/module/pset/qto_calculator.py | 46 ------------------- .../blenderbim/bim/module/pset/ui.py | 16 ------- src/blenderbim/blenderbim/core/tool.py | 13 +++--- src/blenderbim/blenderbim/tool/qto.py | 26 ----------- 6 files changed, 6 insertions(+), 118 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py index 0efe58e73b..5a7e6ff977 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/pset/__init__.py @@ -27,7 +27,6 @@ classes = ( operator.DisablePsetEditing, operator.EditPset, operator.EnablePsetEditing, - operator.GuessQuantity, operator.CalculateQuantity, operator.RemovePset, operator.TogglePsetExpansion, diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index bef8466d62..6b908de6b3 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -241,28 +241,6 @@ class CalculateQuantity(bpy.types.Operator): return round(quantity, 3) -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): - self.qto_calculator = QtoCalculator() - obj = context.active_object - prop = obj.PsetProperties.properties.get(self.prop) - prop.metadata.float_value = self.guess_quantity(obj, context) - return {"FINISHED"} - - def guess_quantity(self, obj, context): - quantity = self.qto_calculator.guess_quantity(self.prop, [p.name for p in obj.PsetProperties.properties], obj) - return round(quantity, 3) if quantity is not None else None - - class CopyPropertyToSelection(bpy.types.Operator, Operator): bl_idname = "bim.copy_property_to_selection" bl_label = "Copy Property To Selection" diff --git a/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py b/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py index 713f549d81..8cd29eb5bd 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py @@ -66,52 +66,6 @@ class QtoCalculator: return tool.Qto.convert_to_project_units(value, qto_name, quantity_name) or value - def guess_quantity( - self, prop_name: str, alternative_prop_names: list[str], obj: bpy.types.Object - ) -> Union[float, None]: - """guess the value of the quantity by name, returns the value in the project units""" - prop_name = prop_name.lower() - alternative_prop_names = [p.lower() for p in alternative_prop_names] - value = None - if "length" in prop_name and "width" not in alternative_prop_names and "height" not in alternative_prop_names: - value = self.get_linear_length(obj) - elif "length" in prop_name: - value = self.get_length(obj) - elif "width" in prop_name and "length" not in alternative_prop_names: - value = self.get_length(obj) - elif "width" in prop_name: - value = self.get_width(obj) - elif "height" in prop_name or "depth" in prop_name: - value = self.get_height(obj) - elif "perimeter" in prop_name: - value = self.get_net_perimeter(obj) - elif "area" in prop_name and ("footprint" in prop_name or "section" in prop_name or "floor" in prop_name): - value = self.get_net_footprint_area(obj) - elif "area" in prop_name and "side" in prop_name: - value = self.get_side_area(obj) - elif "area" in prop_name: - value = self.get_gross_surface_area(obj) - elif "volume" in prop_name and "gross" in prop_name: - value = self.get_gross_volume(obj) - elif "volume" in prop_name: - value = self.get_net_volume(obj) - - if value is None: - return - - unit_type_keywords: dict[str, QuanityTypes] = { - "length": "Q_LENGTH", - "width": "Q_LENGTH", - "height": "Q_LENGTH", - "depth": "Q_LENGTH", - "perimeter": "Q_LENGTH", - "area": "Q_AREA", - "volume": "Q_VOLUME", - } - - unit_type = next(unit_type_keywords[k] for k in unit_type_keywords if k in prop_name) - return tool.Qto.convert_to_project_units(value, quantity_type=unit_type) or value - def get_units(self, o: bpy.types.Object, vg_index: int) -> int: return len([v for v in o.data.vertices if vg_index in [g.group for g in v.groups]]) diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index 4f63ec8063..0ae542c0b2 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -163,22 +163,6 @@ def draw_psetqto_editable_ui(box, props, prop): if prop.metadata.has_calculator: op = row.operator("bim.calculate_quantity", icon="MOD_EDGESPLIT", text="") op.prop = prop.name - # Old "guess quantity" feature to be removed once new calculator is comprehensive - if ( - "length" in prop.name.lower() - or "width" in prop.name.lower() - or "height" in prop.name.lower() - or "depth" in prop.name.lower() - or "perimeter" in prop.name.lower() - ): - op = row.operator("bim.guess_quantity", icon="IPO_EASE_IN_OUT", text="") - op.prop = prop.name - elif "area" in prop.name.lower(): - op = row.operator("bim.guess_quantity", icon="MESH_CIRCLE", text="") - op.prop = prop.name - elif "volume" in prop.name.lower(): - op = row.operator("bim.guess_quantity", icon="SPHERE", text="") - op.prop = prop.name class BIM_PT_object_psets(Panel): diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index d2a226567f..14f9e8e763 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -636,17 +636,16 @@ class Pset: @interface class Qto: - def get_radius_of_selected_vertices(cls, obj): pass - def set_qto_result(cls, result): pass - def get_applicable_quantity_names(cls, qto_name): pass - def get_applicable_base_quantity_name(cls, product): pass - def get_rounded_value(cls, new_quantity): pass - def get_calculated_object_quantities(cls, calculator, baste_qto, object): pass def add_object_base_qto(cls, object): pass def add_product_base_qto(cls, product): pass + def get_applicable_base_quantity_name(cls, product): pass + def get_applicable_quantity_names(cls, qto_name): pass + def get_calculated_object_quantities(cls, calculator, baste_qto, object): pass def get_new_calculated_quantity(cls, qto_name, quantity_name, object): pass - def get_new_guessed_quantity(cls, object, qto_name, quantity_name, ): pass + def get_radius_of_selected_vertices(cls, obj): pass def get_related_cost_item_quantities(cls, product): pass + def get_rounded_value(cls, new_quantity): pass + def set_qto_result(cls, result): pass @interface diff --git a/src/blenderbim/blenderbim/tool/qto.py b/src/blenderbim/blenderbim/tool/qto.py index 24e565e757..830dce2fef 100644 --- a/src/blenderbim/blenderbim/tool/qto.py +++ b/src/blenderbim/blenderbim/tool/qto.py @@ -95,12 +95,6 @@ class Qto(blenderbim.core.tool.Qto): def get_new_calculated_quantity(cls, qto_name: str, quantity_name: str, obj: bpy.types.Object) -> float: return QtoCalculator().calculate_quantity(qto_name, quantity_name, obj) - @classmethod - def get_new_guessed_quantity( - cls, obj: bpy.types.Object, quantity_name: str, alternative_prop_names: list[str] - ) -> Union[float, None]: - return QtoCalculator().guess_quantity(quantity_name, alternative_prop_names, obj) - @classmethod def get_rounded_value(cls, new_quantity: float) -> float: return round(new_quantity, 3) @@ -158,26 +152,6 @@ class Qto(blenderbim.core.tool.Qto): ) return value - @classmethod - def get_guessed_quantities( - cls, obj: bpy.types.Object, pset_qto_properties: list[ifcopenshell.entity_instance] - ) -> dict[str, float]: - calculated_quantities = {} - for pset_qto_property in pset_qto_properties: - quantity_name = pset_qto_property.get_info()["Name"] - alternative_prop_names = [p.get_info()["Name"] for p in pset_qto_properties] - - new_quantity = cls.get_new_guessed_quantity(obj, quantity_name, alternative_prop_names) - - if not new_quantity: - new_quantity = 0 - else: - new_quantity = cls.get_rounded_value(new_quantity) - - calculated_quantities[quantity_name] = new_quantity - - return calculated_quantities - @classmethod def get_base_qto(cls, product: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: if not hasattr(product, "IsDefinedBy"): From 097c5cee3cdaffe68916ab8e8346ad41612a4b4b Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Tue, 28 May 2024 21:17:23 -0500 Subject: [PATCH 322/429] fix #3802 - Copy array attributes from another array. Big thank you to @brunoperdigao, for the help! --- .../blenderbim/bim/module/model/array.py | 17 +++++++++++++- .../blenderbim/bim/module/model/prop.py | 23 +++++++++++++++++++ .../blenderbim/bim/module/model/ui.py | 2 ++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/array.py b/src/blenderbim/blenderbim/bim/module/model/array.py index 8da6dfb74e..a521ee500b 100644 --- a/src/blenderbim/blenderbim/bim/module/model/array.py +++ b/src/blenderbim/blenderbim/bim/module/model/array.py @@ -83,8 +83,17 @@ class EnableEditingArray(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object element = tool.Ifc.get_entity(obj) - data = json.loads(ifcopenshell.util.element.get_pset(element, "BBIM_Array", "Data"))[self.item] props = obj.BIMArrayProperties + + relating_obj = props.relating_array_object + + if relating_obj: + element = tool.Ifc.get_entity(relating_obj) + parent_globalid = ifcopenshell.util.element.get_pset(element, "BBIM_Array", "Parent") + parent_element = tool.Ifc.get().by_guid(parent_globalid) + data = json.loads(ifcopenshell.util.element.get_pset(parent_element, "BBIM_Array", "Data"))[self.item] + else: + data = json.loads(ifcopenshell.util.element.get_pset(element, "BBIM_Array", "Data"))[self.item] props.count = data["count"] si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) props.x = data["x"] * si_conversion @@ -93,7 +102,9 @@ class EnableEditingArray(bpy.types.Operator, tool.Ifc.Operator): props.use_local_space = data.get("use_local_space", False) props.sync_children = data.get("sync_children", False) props.method = data.get("method", "OFFSET") + props.is_editing = self.item + return {"FINISHED"} @@ -137,6 +148,10 @@ class EditArray(bpy.types.Operator, tool.Ifc.Operator): tool.Blender.Modifier.Array.set_children_lock_state(element, self.item, True) tool.Blender.Modifier.Array.constrain_children_to_parent(element) + + #clears the relating_array_object so it doesn't show again next time + props.relating_array_object = None + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/model/prop.py b/src/blenderbim/blenderbim/bim/module/model/prop.py index 3b55cc945b..96f375fa1a 100644 --- a/src/blenderbim/blenderbim/bim/module/model/prop.py +++ b/src/blenderbim/blenderbim/bim/module/model/prop.py @@ -87,6 +87,21 @@ def update_type_page(self, context): AuthoringData.data["paginated_relating_types"] = AuthoringData.paginated_relating_types() +def update_relating_array_from_object(self, context): + bpy.ops.bim.enable_editing_array(item=self.is_editing) + return + + +def is_object_array_applicable(self, obj): + element = tool.Ifc.get_entity(obj) + if not element: + return False + return ifcopenshell.util.element.get_pset(element, "BBIM_Array") + + + + + class BIMModelProperties(PropertyGroup): ifc_class: bpy.props.EnumProperty(items=get_ifc_class, name="Construction Class", update=update_ifc_class) relating_type_id: bpy.props.EnumProperty( @@ -203,6 +218,14 @@ class BIMArrayProperties(PropertyGroup): description="Regenerate all children based on the parent object", default=False, ) + relating_array_object: bpy.props.PointerProperty( + type=bpy.types.Object, + name="Copy Array Properties", + update=update_relating_array_from_object, + poll=is_object_array_applicable, + ) + + class BIMStairProperties(PropertyGroup): diff --git a/src/blenderbim/blenderbim/bim/module/model/ui.py b/src/blenderbim/blenderbim/bim/module/model/ui.py index 0ad66da688..01727e6887 100644 --- a/src/blenderbim/blenderbim/bim/module/model/ui.py +++ b/src/blenderbim/blenderbim/bim/module/model/ui.py @@ -223,6 +223,8 @@ class BIM_PT_array(bpy.types.Panel): row = col.row(align=True) row.prop(props, "z") row.operator("bim.input_cursor_z_array", icon="CURSOR", text="") + row = col.row(align=True) + row.prop(props, "relating_array_object", icon="COPYDOWN") else: row = box.row(align=True) name = f"{array['count']} Items ({array.get('method', 'OFFSET').capitalize()})" From 9001aa6383eca5575d608dc8b06d9a28c134cdf7 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 12:38:55 +1000 Subject: [PATCH 323/429] Purge calculate quantities operator - to be replaced with new ifc5d qto tool The calculate quantities operator assumes a single mapper, not a configurable calculator. --- .../blenderbim/bim/module/pset/__init__.py | 1 - .../blenderbim/bim/module/pset/operator.py | 27 ----------------- .../bim/module/pset/qto_calculator.py | 13 -------- .../blenderbim/bim/module/pset/ui.py | 3 -- .../blenderbim/bim/module/qto/__init__.py | 1 - .../blenderbim/bim/module/qto/operator.py | 17 ----------- src/blenderbim/blenderbim/bim/prop.py | 1 - src/blenderbim/blenderbim/core/qto.py | 30 ------------------- src/blenderbim/blenderbim/core/tool.py | 2 -- src/blenderbim/blenderbim/tool/pset.py | 1 - src/blenderbim/blenderbim/tool/qto.py | 19 ------------ 11 files changed, 115 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py index 5a7e6ff977..a8b0b94ddd 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/pset/__init__.py @@ -27,7 +27,6 @@ classes = ( operator.DisablePsetEditing, operator.EditPset, operator.EnablePsetEditing, - operator.CalculateQuantity, operator.RemovePset, operator.TogglePsetExpansion, operator.BIM_OT_add_property_to_edit, diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index 6b908de6b3..8896cd3f15 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -214,33 +214,6 @@ class AddQto(bpy.types.Operator, Operator): ) -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): - self.qto_calculator = QtoCalculator() - obj = context.active_object - prop = obj.PsetProperties.properties.get(self.prop) - quantity = self.calculate_quantity(obj, context) - - if quantity is None: - self.report({"ERROR"}, "Could not calculate quantity") - return {"CANCELLED"} - - prop.metadata.float_value = quantity - return {"FINISHED"} - - def calculate_quantity(self, obj, context): - quantity = self.qto_calculator.calculate_quantity(obj.PsetProperties.active_pset_name, self.prop, obj) - if quantity is None: - return - return round(quantity, 3) - - class CopyPropertyToSelection(bpy.types.Operator, Operator): bl_idname = "bim.copy_property_to_selection" bl_label = "Copy Property To Selection" diff --git a/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py b/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py index 8cd29eb5bd..7fc5a17f13 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py @@ -53,19 +53,6 @@ class QtoCalculator: else: self.mapping_dict[key][item] = None - def calculate_quantity(self, qto_name: str, quantity_name: str, obj: bpy.types.Object) -> float: - """calculates the value of the quantity in the project units""" - string = "self.mapping_dict[qto_name][quantity_name](obj" - if isinstance(mapper[qto_name][quantity_name], dict): - args = mapper[qto_name][quantity_name]["args"] - else: - args = "" - string += args - string += ")" - value: float = eval(string) - - return tool.Qto.convert_to_project_units(value, qto_name, quantity_name) or value - def get_units(self, o: bpy.types.Object, vg_index: int) -> int: return len([v for v in o.data.vertices if vg_index in [g.group for g in v.groups]]) diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index 0ae542c0b2..17f14cc86f 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -160,9 +160,6 @@ def draw_psetqto_ui(context, pset_id, pset, props, layout, obj_type, allow_remov def draw_psetqto_editable_ui(box, props, prop): row = box.row(align=True) draw_property(prop, row, copy_operator="bim.copy_property_to_selection") - if prop.metadata.has_calculator: - op = row.operator("bim.calculate_quantity", icon="MOD_EDGESPLIT", text="") - op.prop = prop.name class BIM_PT_object_psets(Panel): diff --git a/src/blenderbim/blenderbim/bim/module/qto/__init__.py b/src/blenderbim/blenderbim/bim/module/qto/__init__.py index 7059281f9f..9924927fa0 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/qto/__init__.py @@ -21,7 +21,6 @@ from . import ui, prop, operator classes = ( operator.AssignBaseQto, - operator.CalculateAllQuantities, operator.CalculateCircleRadius, operator.CalculateEdgeLengths, operator.CalculateFaceAreas, diff --git a/src/blenderbim/blenderbim/bim/module/qto/operator.py b/src/blenderbim/blenderbim/bim/module/qto/operator.py index 88fa33841c..7a12a45123 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/operator.py +++ b/src/blenderbim/blenderbim/bim/module/qto/operator.py @@ -186,23 +186,6 @@ class AssignBaseQto(bpy.types.Operator, tool.Ifc.Operator): return {"FINISHED"} -class CalculateAllQuantities(bpy.types.Operator, tool.Ifc.Operator): - bl_idname = "bim.calculate_all_quantities" - bl_label = "Calculate All Quantities" - bl_options = {"REGISTER", "UNDO"} - bl_description = "Calculate all possible quantities and assign them to selected object" - - @classmethod - def poll(cls, context): - return tool.Ifc.get() and context.selected_objects - - def _execute(self, context): - core.calculate_all_quantities( - tool.Ifc, tool.Cost, tool.Qto, QtoCalculator(), selected_objects=context.selected_objects - ) - return {"FINISHED"} - - class PerformQuantityTakeOff(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.perform_quantity_take_off" bl_label = "Perform Quantity Take-off" diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index 5bb6591ff1..4be21a8ad7 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -263,7 +263,6 @@ class Attribute(PropertyGroup): is_optional: BoolProperty(name="Is Optional") is_uri: BoolProperty(name="Is Uri", default=False) is_selected: BoolProperty(name="Is Selected", default=False) - has_calculator: BoolProperty(name="Has Calculator", default=False) value_min: FloatProperty(description="This is used to validate int_value and float_value") value_min_constraint: BoolProperty(default=False, description="True if the numerical value has a lower bound") value_max: FloatProperty(description="This is used to validate int_value and float_value") diff --git a/src/blenderbim/blenderbim/core/qto.py b/src/blenderbim/blenderbim/core/qto.py index a1fa8ec77d..a1495f3d68 100644 --- a/src/blenderbim/blenderbim/core/qto.py +++ b/src/blenderbim/blenderbim/core/qto.py @@ -49,33 +49,3 @@ def assign_object_base_qto(ifc: tool.Ifc, qto: tool.Qto, obj: bpy.types.Object) product=product, name=base_quantity_name, ) - - -def calculate_all_quantities( - ifc: tool.Ifc, cost: tool.Cost, qto: tool.Qto, calculator: QtoCalculator, selected_objects: list[bpy.types.Object] -) -> None: - if selected_objects: - for obj in selected_objects: - calculate_object_base_quantities(ifc, cost, qto, calculator, obj) - - -def calculate_object_base_quantities( - ifc: tool.Ifc, cost: tool.Cost, qto: tool.Qto, calculator: QtoCalculator, obj: bpy.types.Object -) -> None: - product = ifc.get_entity(obj) - if not product: - return - base_quantity_name = qto.get_applicable_base_quantity_name(product) - if not base_quantity_name: - print(f"There is no base quantity") - return - base_qto = qto.get_base_qto(product) - if not base_qto: - base_qto = ifc.run( - "pset.add_qto", - product=product, - name=base_quantity_name, - ) - calculated_quantities = qto.get_calculated_object_quantities(calculator, base_quantity_name, obj) - ifc.run("pset.edit_qto", qto=base_qto, properties=calculated_quantities) - cost.update_cost_items(product=product) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 14f9e8e763..83b5d16a5d 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -640,8 +640,6 @@ class Qto: def add_product_base_qto(cls, product): pass def get_applicable_base_quantity_name(cls, product): pass def get_applicable_quantity_names(cls, qto_name): pass - def get_calculated_object_quantities(cls, calculator, baste_qto, object): pass - def get_new_calculated_quantity(cls, qto_name, quantity_name, object): pass def get_radius_of_selected_vertices(cls, obj): pass def get_related_cost_item_quantities(cls, product): pass def get_rounded_value(cls, new_quantity): pass diff --git a/src/blenderbim/blenderbim/tool/pset.py b/src/blenderbim/blenderbim/tool/pset.py index 15ae5f3c11..2ed45f2056 100644 --- a/src/blenderbim/blenderbim/tool/pset.py +++ b/src/blenderbim/blenderbim/tool/pset.py @@ -177,7 +177,6 @@ class Pset(blenderbim.core.tool.Pset): metadata.is_null = data.get(prop_template.Name, None) is None metadata.is_optional = True metadata.is_uri = prop_template.PrimaryMeasureType == "IfcURIReference" - metadata.has_calculator = bool(mapper.get(pset_template.Name, {}).get(prop_template.Name, None)) metadata.data_type = cls.get_prop_template_primitive_type(prop_template) special_type = "" diff --git a/src/blenderbim/blenderbim/tool/qto.py b/src/blenderbim/blenderbim/tool/qto.py index 830dce2fef..55e5564109 100644 --- a/src/blenderbim/blenderbim/tool/qto.py +++ b/src/blenderbim/blenderbim/tool/qto.py @@ -91,29 +91,10 @@ class Qto(blenderbim.core.tool.Qto): applicable_qto = qto_name return applicable_qto - @classmethod - def get_new_calculated_quantity(cls, qto_name: str, quantity_name: str, obj: bpy.types.Object) -> float: - return QtoCalculator().calculate_quantity(qto_name, quantity_name, obj) - @classmethod def get_rounded_value(cls, new_quantity: float) -> float: return round(new_quantity, 3) - @classmethod - def get_calculated_object_quantities( - cls, calculator: QtoCalculator, qto_name: str, obj: bpy.types.Object - ) -> dict[str, float]: - return { - quantity_name: cls.get_rounded_value(value) - for quantity_name in cls.get_applicable_quantity_names(qto_name) or [] - if cls.has_calculator(qto_name, quantity_name) - and (value := calculator.calculate_quantity(qto_name, quantity_name, obj)) is not None - } - - @classmethod - def has_calculator(cls, qto_name: str, quantity_name: str) -> bool: - return bool(mapper.get(qto_name, {}).get(quantity_name, None)) - @classmethod def convert_to_project_units( cls, From 1bda47f76ea44fddd858e7e49a65d5eba6864d69 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 12:45:09 +1000 Subject: [PATCH 324/429] Migrate calculator to qto module and mapper to Ifc5D. --- .../pset/calc_quantity_function_mapper.py | 579 -------- .../bim/module/pset/qto_calculator.py | 1262 ----------------- .../blenderbim/bim/module/qto/calculator.py | 1210 ++++++++++++++++ src/blenderbim/blenderbim/tool/pset.py | 1 - src/blenderbim/blenderbim/tool/qto.py | 11 +- src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json | 2 +- .../ifc5d/IFC4QtoBaseQuantitiesBlender.json | 637 +++++++++ src/ifc5d/ifc5d/qto.py | 23 +- 8 files changed, 1864 insertions(+), 1861 deletions(-) delete mode 100644 src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py delete mode 100644 src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py create mode 100644 src/blenderbim/blenderbim/bim/module/qto/calculator.py create mode 100644 src/ifc5d/ifc5d/IFC4QtoBaseQuantitiesBlender.json diff --git a/src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py b/src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py deleted file mode 100644 index e484b97717..0000000000 --- a/src/blenderbim/blenderbim/bim/module/pset/calc_quantity_function_mapper.py +++ /dev/null @@ -1,579 +0,0 @@ -mapper = { - 'Qto_AudioVisualApplianceBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_PlateBaseQuantities' : { - 'Width' : "get_height", - 'Perimeter' : "get_gross_perimeter", - 'GrossArea' : "get_gross_footprint_area", - 'NetArea' : "get_net_footprint_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'GrossWeight' : "get_gross_weight", - 'NetWeight' : "get_net_weight", - }, - 'Qto_OpeningElementBaseQuantities' : { - 'Width' : "get_length", - 'Height' : "get_opening_height", - 'Depth' : "get_opening_depth", - 'Area' : "get_opening_mapping_area", - 'Volume' : "get_net_volume", - }, - 'Qto_MarineFacilityBaseQuantities' : { - 'Length' : "get_length", - 'Width' : "get_width", - 'Height' : "get_height", - 'Area' : "get_net_footprint_area", - 'Volume' : "get_net_volume", - }, - 'Qto_ChillerBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_PileBaseQuantities' : { - 'Length' : "get_length", - 'CrossSectionArea' : "get_cross_section_area", - 'OuterSurfaceArea' : "get_outer_surface_area", - 'GrossSurfaceArea' : "get_gross_surface_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'GrossWeight' : "get_gross_weight", - 'NetWeight' : "get_net_weight", - }, - 'Qto_VibrationIsolatorBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_LampBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_VehicleBaseQuantities' : { - 'Length' : "get_length", - 'Width' : "get_width", - 'Height' : "get_height", - }, - 'Qto_PipeFittingBaseQuantities' : { - 'Length' : None, - 'GrossCrossSectionArea' : None, - 'NetCrossSectionArea' : None, - 'OuterSurfaceArea' : None, - 'GrossWeight' : None, - 'NetWeight' : None, - }, - 'Qto_CableCarrierFittingBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_HeatExchangerBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_DoorBaseQuantities' : { - 'Width' : { "function_name" : "get_length", "args" : ", main_axis = 'x'"}, - 'Height' : "get_height", - 'Perimeter' : "get_rectangular_perimeter", - 'Area' : "get_net_side_area", - }, - 'Qto_DuctSegmentBaseQuantities' : { - 'Length' : "get_length", - 'GrossCrossSectionArea' : None, - 'NetCrossSectionArea' : None, - 'OuterSurfaceArea' : "get_outer_surface_area", - 'GrossWeight' : None, - }, - 'Qto_TransformerBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_FacilityPartBaseQuantities' : { - 'Length' : "get_length", - 'Width' : "get_width", - 'Height' : "get_height", - 'Area' : "get_net_footprint_area", - 'Volume' : "get_net_volume", - }, - 'Qto_ProjectionElementBaseQuantities' : { - 'Area' : "get_net_side_area", - 'Volume' : "get_net_volume", - }, - 'Qto_SignBaseQuantities' : { - 'Height' : "get_height", - 'Width' : { "function_name" : "get_length", "args" : ", main_axis = 'x'"}, - 'Thickness' : "get_width", - 'Weight' : None, - }, - 'Qto_CableSegmentBaseQuantities' : { - 'GrossWeight' : None, - 'Length' : "get_length", - 'CrossSectionArea' : None, - 'OuterSurfaceArea' : "get_outer_surface_area", - }, - 'Qto_BuildingBaseQuantities' : { - 'Height' : None, - 'EavesHeight' : None, - 'FootPrintArea' : None, - 'GrossFloorArea' : None, - 'NetFloorArea' : None, - 'GrossVolume' : None, - 'NetVolume' : None, - }, - 'Qto_ElectricFlowStorageDeviceBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_CommunicationsApplianceBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_RailBaseQuantities' : { - 'Length' : "get_length", - 'Volume' : "get_net_volume", - 'Weight' : "get_net_weight", - }, - 'Qto_PictorialSignQuantities' : { - 'Area' : "get_net_side_area", - 'SignArea' : None, - }, - 'Qto_SpaceHeaterBaseQuantities' : { - 'Length' : "get_length", - 'GrossWeight' : None, - 'NetWeight' : None, - }, - 'Qto_CoveringBaseQuantities' : { - 'Width' : "get_covering_width", - 'GrossArea' : "get_covering_gross_area", - 'NetArea' : "get_covering_net_area", - }, - 'Qto_PipeSegmentBaseQuantities' : { - 'Length' : "get_length", - 'GrossCrossSectionArea' : None, - 'NetCrossSectionArea' : "get_cross_section_area", - 'OuterSurfaceArea' : "get_outer_surface_area", - 'GrossWeight' : "get_gross_weight", - 'NetWeight' : "get_net_weight", - }, - 'Qto_HumidifierBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_ConstructionEquipmentResourceBaseQuantities' : { - 'UsageTime' : None, - 'OperatingTime' : None, - }, - 'Qto_AlarmBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_JunctionBoxBaseQuantities' : { - 'GrossWeight' : None, - 'NumberOfGangs' : None, - 'Length' : "get_length", - 'Width' : "get_width", - 'Height' : "get_height", - }, - 'Qto_ArealStratumBaseQuantities' : { - 'Area' : "get_net_footprint_area", - 'Length' : "get_length", - 'PlanLength' : None, - }, - 'Qto_SiteBaseQuantities' : { - 'GrossPerimeter' : "get_gross_perimeter", - 'GrossArea' : "get_gross_footprint_area", - }, - 'Qto_MotorConnectionBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_RoofBaseQuantities' : { - 'GrossArea' : "get_gross_top_area", - 'NetArea' : "get_net_top_area", - 'ProjectedArea' : None, - }, - 'Qto_ChimneyBaseQuantities' : { - 'Length' : "get_height", - }, - 'Qto_ElectricTimeControlBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_ElectricMotorBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_EarthworksFillBaseQuantities' : { - 'Length' : None, - 'Width' : None, - 'Depth' : None, - 'CompactedVolume' : None, - 'LooseVolume' : None, - }, - 'Qto_ConduitSegmentBaseQuantities' : { - 'InnerDiameter' : None, - 'OuterDiameter' : None, - }, - 'Qto_SignalBaseQuantities' : { - 'Weight' : None, - }, - 'Qto_DuctFittingBaseQuantities' : { - 'Length' : "get_length", - 'GrossCrossSectionArea' : None, - 'NetCrossSectionArea' : None, - 'OuterSurfaceArea' : "get_outer_surface_area", - 'GrossWeight' : None, - }, - 'Qto_UnitaryControlElementBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_ActuatorBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_CurtainWallQuantities' : { - 'Length' : None, - 'Height' : None, - 'Width' : None, - 'GrossSideArea' : None, - 'NetSideArea' : None, - }, - 'Qto_BoilerBaseQuantities' : { - 'GrossWeight' : None, - 'NetWeight' : None, - 'TotalSurfaceArea' : None, - }, - 'Qto_FlowMeterBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_AirTerminalBaseQuantities' : { - 'GrossWeight' : None, - 'Perimeter' : None, - 'TotalSurfaceArea' : None, - }, - 'Qto_DuctSilencerBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_WasteTerminalBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_SlabBaseQuantities' : { - 'Width' : "get_width", - 'Length' : "get_length", - 'Depth' : "get_height", - 'Perimeter' : "get_gross_perimeter", - 'GrossArea' : "get_gross_footprint_area", - 'NetArea' : "get_net_footprint_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'GrossWeight' : "get_gross_weight", - 'NetWeight' : "get_net_weight", - }, - 'Qto_ImpactProtectionDeviceBaseQuantities' : { - 'Weight' : None, - }, - 'Qto_LightFixtureBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_FlowInstrumentBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_BuildingStoreyBaseQuantities' : { - 'GrossHeight' : None, - 'NetHeight' : None, - 'GrossPerimeter' : None, - 'GrossFloorArea' : None, - 'NetFloorArea' : None, - 'GrossVolume' : None, - 'NetVolume' : None, - }, - 'Qto_ReinforcedSoilBaseQuantities' : { - 'Length' : None, - 'Width' : None, - 'Depth' : None, - 'Area' : None, - 'Volume' : None, - }, - 'Qto_DistributionBoardBaseQuantities' : { - 'GrossWeight' : None, - 'NumberOfCircuits' : None, - }, - 'Qto_FootingBaseQuantities' : { - 'Length' : "get_length", - 'Width' : "get_width", - 'Height' : "get_height", - 'CrossSectionArea' : "get_cross_section_area", - 'OuterSurfaceArea' : "get_outer_surface_area", - 'GrossSurfaceArea' : "get_gross_surface_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'GrossWeight' : "get_gross_weight", - 'NetWeight' : "get_net_weight", - }, - 'Qto_PumpBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_CableCarrierSegmentBaseQuantities' : { - 'GrossWeight' : None, - 'Length' : None, - 'CrossSectionArea' : None, - 'OuterSurfaceArea' : None, - }, - 'Qto_InterceptorBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_ColumnBaseQuantities' : { - 'Length' : "get_length", - 'CrossSectionArea' : "get_cross_section_area", - 'OuterSurfaceArea' : "get_outer_surface_area", - 'GrossSurfaceArea' : "get_gross_surface_area", - 'NetSurfaceArea' : "get_net_surface_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'GrossWeight' : "get_gross_weight", - 'NetWeight' : "get_net_weight", - }, - 'Qto_EarthworksCutBaseQuantities' : { - 'Length' : "get_length", - 'Width' : "get_width", - 'Depth' : "get_height", - 'UndisturbedVolume' : "get_net_volume", - 'LooseVolume' : None, - 'Weight' : None, - }, - 'Qto_StackTerminalBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_CoilBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_KerbBaseQuantities' : { - 'Length' : "get_length", - 'Width' : "get_width", - 'Height' : "get_height", - 'Depth' : None, - 'Volume' : "get_net_volume", - 'Weight' : None, - }, - 'Qto_PavementBaseQuantities' : { - 'Length' : "get_length", - 'Width' : "get_width", - 'Depth' : "get_height", - 'GrossArea' : "get_gross_footprint_area", - 'NetArea' : "get_net_footprint_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - }, - 'Qto_ControllerBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_SolarDeviceBaseQuantities' : { - 'GrossWeight' : None, - 'GrossArea' : None, - }, - 'Qto_RampFlightBaseQuantities' : { - 'Length' : "get_stair_length", - 'Width' : "get_width", - 'GrossArea' : "get_gross_stair_area", - 'NetArea' : "get_net_stair_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - }, - 'Qto_ElectricApplianceBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_ValveBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_DamperBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_SurfaceFeatureBaseQuantities' : { - 'Area' : "get_net_footprint_area", - 'Length' : "get_length", - }, - 'Qto_WallBaseQuantities' : { - 'Length' : { "function_name" : "get_length", "args" : ", main_axis = 'x'"}, - 'Width' : "get_width", - 'Height' : "get_height", - 'GrossFootprintArea' : "get_gross_footprint_area", - 'NetFootprintArea' : "get_net_footprint_area", - 'GrossSideArea' : "get_gross_side_area", - 'NetSideArea' : "get_net_side_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'GrossWeight' : "get_gross_weight", - 'NetWeight' : "get_net_weight", - }, - 'Qto_StairFlightBaseQuantities' : { - 'Length' : "get_stair_length", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - }, - 'Qto_SwitchingDeviceBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_BurnerBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_ConstructionMaterialResourceBaseQuantities' : { - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'GrossWeight' : None, - 'NetWeight' : None, - }, - 'Qto_ElectricGeneratorBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_LinearStratumBaseQuantities' : { - 'Diameter' : None, - 'Length' : None, - }, - 'Qto_CableFittingBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_DistributionChamberElementBaseQuantities' : { - 'GrossSurfaceArea' : "get_gross_surface_area", - 'NetSurfaceArea' : "get_net_surface_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'Depth' : "get_length", - }, - 'Qto_CompressorBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_ProtectiveDeviceTrippingUnitBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_EvaporatorBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_SpaceBaseQuantities' : { - 'Height' : "get_height", - 'FinishCeilingHeight' : "get_finish_ceiling_height", - 'FinishFloorHeight' : "get_finish_floor_height", - 'GrossPerimeter' : "get_gross_perimeter", - 'NetPerimeter' : None, - 'GrossFloorArea' : "get_gross_footprint_area", - 'NetFloorArea' : "get_net_floor_area", - 'GrossWallArea' : None, - 'NetWallArea' : None, - 'GrossCeilingArea' : "get_gross_ceiling_area", - 'NetCeilingArea' : "get_net_ceiling_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_space_net_volume", - }, - 'Qto_CourseBaseQuantities' : { - 'Length' : "get_length", - 'Width' : "get_width", - 'Thickness' : "get_height", - 'Volume' : "get_net_volume", - 'GrossVolume' : "get_gross_volume", - 'Weight' : None, - }, - 'Qto_CondenserBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_FireSuppressionTerminalBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_RailingBaseQuantities' : { - 'Length' : "get_length", - }, - 'Qto_TubeBundleBaseQuantities' : { - 'GrossWeight' : None, - 'NetWeight' : None, - }, - 'Qto_BeamBaseQuantities' : { - 'Length' : "get_length", - 'CrossSectionArea' : "get_cross_section_area", - 'GrossSurfaceArea' : "get_gross_surface_area", - 'OuterSurfaceArea' : "get_outer_surface_area", - 'NetSurfaceArea' : "get_net_surface_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'GrossWeight' : "get_gross_weight", - 'NetWeight' : "get_net_weight", - }, - 'Qto_SleeperBaseQuantities' : { - 'Length' : "get_length", - 'Width' : "get_width", - 'Height' : "get_height", - }, - 'Qto_ProtectiveDeviceBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_CooledBeamBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_TankBaseQuantities' : { - 'GrossWeight' : None, - 'NetWeight' : None, - 'TotalSurfaceArea' : "get_outer_surface_area", - }, - 'Qto_AirToAirHeatRecoveryBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_CoolingTowerBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_SensorBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_WindowBaseQuantities' : { - 'Width' : { "function_name" : "get_length", "args" : ", main_axis = 'x'"}, - 'Height' : "get_height", - 'Perimeter' : "get_rectangular_perimeter", - 'Area' : "get_net_side_area", - }, - 'Qto_SanitaryTerminalBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_BuildingElementProxyQuantities' : { - 'NetSurfaceArea' : "get_net_surface_area", - 'NetVolume' : "get_net_volume", - }, - 'Qto_FanBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_OutletBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_UnitaryEquipmentBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_FilterBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_MemberBaseQuantities' : { - 'Length' : "get_length", - 'CrossSectionArea' : "get_cross_section_area", - 'OuterSurfaceArea' : "get_outer_surface_area", - 'GrossSurfaceArea' : "get_gross_surface_area", - 'NetSurfaceArea' : "get_net_surface_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'GrossWeight' : "get_gross_weight", - 'NetWeight' : "get_net_weight", - }, - 'Qto_BodyGeometryValidation' : { - 'GrossSurfaceArea' : "get_gross_surface_area", - 'NetSurfaceArea' : "get_net_surface_area", - 'GrossVolume' : "get_gross_volume", - 'NetVolume' : "get_net_volume", - 'SurfaceGenusBeforeFeatures' : None, - 'SurfaceGenusAfterFeatures' : None, - }, - 'Qto_VolumetricStratumBaseQuantities' : { - 'Area' : "get_net_footprint_area", - 'Mass' : None, - 'PlanArea' : "get_net_footprint_area", - 'Volume' : "get_net_volume", - }, - 'Qto_SpatialZoneBaseQuantities' : { - 'Length' : "get_length", - 'Width' : "get_width", - 'Height' : "get_height", - }, - 'Qto_ReinforcingElementBaseQuantities' : { - 'Count' : None, - 'Length' : "get_length", - 'Weight' : None, - }, - 'Qto_EvaporativeCoolerBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_AirTerminalBoxTypeBaseQuantities' : { - 'GrossWeight' : None, - }, - 'Qto_LaborResourceBaseQuantities' : { - 'StandardWork' : None, - 'OvertimeWork' : None, - }, -} - -mapper["EQto_BodyGeometryValidation"] = mapper["Qto_BodyGeometryValidation"] diff --git a/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py b/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py deleted file mode 100644 index 7fc5a17f13..0000000000 --- a/src/blenderbim/blenderbim/bim/module/pset/qto_calculator.py +++ /dev/null @@ -1,1262 +0,0 @@ -# BlenderBIM Add-on - OpenBIM Blender Add-on -# Copyright (C) 2020, 2021 Dion Moult , Vukas Pajic -# -# This file is part of BlenderBIM Add-on. -# -# BlenderBIM Add-on is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# BlenderBIM Add-on is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with BlenderBIM Add-on. If not, see . - -import bpy, bmesh -import mathutils -from mathutils import Vector, Matrix -from mathutils.bvhtree import BVHTree -import math -from shapely.geometry import Polygon -from shapely.ops import unary_union -import blenderbim.tool as tool -import ifcopenshell -import ifcopenshell.geom -import ifcopenshell.util.element -from blenderbim.bim.module.pset.calc_quantity_function_mapper import mapper -import blenderbim.bim -from typing import Literal, Union, Optional - - -AxisType = Literal["x", "y", "z"] -VectorTuple = tuple[float, float, float] -QuanityTypes = Literal["Q_LENGTH", "Q_AREA", "Q_VOLUME"] - - -class QtoCalculator: - def __init__(self): - self.mapping_dict = {} - for key in mapper.keys(): - self.mapping_dict[key] = dict(mapper[key].items()) - - for key in self.mapping_dict.keys(): - for item in self.mapping_dict[key].keys(): - if self.mapping_dict[key][item]: - if isinstance(self.mapping_dict[key][item], str): - self.mapping_dict[key][item] = eval("self." + self.mapping_dict[key][item]) - if isinstance(self.mapping_dict[key][item], dict): - self.mapping_dict[key][item] = eval("self." + self.mapping_dict[key][item]["function_name"]) - else: - self.mapping_dict[key][item] = None - - def get_units(self, o: bpy.types.Object, vg_index: int) -> int: - return len([v for v in o.data.vertices if vg_index in [g.group for g in v.groups]]) - - def get_linear_length(self, o: bpy.types.Object) -> float: - """_summary_: Returns the length of the longest edge of the object bounding box - - :param blender-object o: Blender Object - :return float: Length - """ - x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length - y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length - z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length - return max(x, y, z) - - def get_length(self, o: bpy.types.Object, vg_index: Optional[int] = None, main_axis: str = "") -> float: - if vg_index is None: - x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length - y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length - z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length - if self.get_object_main_axis(o) == "x" or main_axis == "x": - return max(x, y) - if self.get_object_main_axis(o) == "z": - return max(z, x) - if self.get_object_main_axis(o) == "y": - return max(y, z) - - length = 0 - edges = [ - e - for e in o.data.edges - if ( - vg_index in [g.group for g in o.data.vertices[e.vertices[0]].groups] - and vg_index in [g.group for g in o.data.vertices[e.vertices[1]].groups] - ) - ] - for e in edges: - length += self.get_edge_distance(o, e) - return length - - def get_stair_length(self, obj: bpy.types.Object) -> float: - length = self.get_length(obj) - height = self.get_height(obj) - stair_length = math.sqrt(pow(length, 2) + pow(height, 2)) - return stair_length - - def get_net_stair_area(self, obj: bpy.types.Object) -> float: - OBB_obj = self.get_OBB_object(obj) - OBB_net_footprint_area = self.get_net_footprint_area(OBB_obj) - return OBB_net_footprint_area - - def get_gross_stair_area(self, obj: bpy.types.Object) -> float: - OBB_obj = self.get_OBB_object(obj) - OBB_gross_footprint_area = self.get_gross_footprint_area(OBB_obj) - return OBB_gross_footprint_area - - def get_parametric_axis(self, obj: bpy.types.Object) -> Literal["AXIS2", "AXIS3", None]: - relating_type = ifcopenshell.util.element.get_type(tool.Ifc.get_entity(obj)) - if relating_type: - parametric = ifcopenshell.util.element.get_psets(relating_type).get("EPset_Parametric") - if parametric: - layer_set_direction = None - layer_set_direction = parametric.get("LayerSetDirection", layer_set_direction) - if layer_set_direction == "AXIS2": - return "AXIS2" - elif layer_set_direction == "AXIS3": - return "AXIS3" - else: - return None - return None - - def get_covering_gross_area(self, obj: bpy.types.Object) -> float: - get_parametric_axis = self.get_parametric_axis(obj) - if not get_parametric_axis: - return self.get_gross_footprint_area(obj) - elif get_parametric_axis == "AXIS2": - return self.get_gross_side_area(obj) - elif get_parametric_axis == "AXIS3": - return self.get_gross_footprint_area(obj) - - def get_covering_net_area(self, obj: bpy.types.Object) -> float: - get_parametric_axis = self.get_parametric_axis(obj) - if not get_parametric_axis: - return self.get_net_footprint_area(obj) - elif get_parametric_axis == "AXIS2": - return self.get_net_side_area(obj) - elif get_parametric_axis == "AXIS3": - return self.get_net_footprint_area(obj) - - def get_covering_width(self, obj: bpy.types.Object) -> float: - get_parametric_axis = self.get_parametric_axis(obj) - if not get_parametric_axis: - return self.get_height(obj) - elif get_parametric_axis == "AXIS2": - return self.get_width(obj) - elif get_parametric_axis == "AXIS3": - return self.get_height(obj) - - def get_width(self, o: bpy.types.Object) -> float: - """_summary_: Returns the width of the object bounding box - - :param blender-object o: blender object - :return float: width - """ - x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length - y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length - return min(x, y) - - def get_height(self, o: bpy.types.Object) -> float: - """_summary_: Returns the height of the object bounding box - - :param blender-object o: blender object - :return float: height - """ - return (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length - - def get_opening_height(self, obj: bpy.types.Object) -> float: - if self.is_opening_horizontal(obj): - return self.get_width(obj) - else: - return self.get_height(obj) - - def get_opening_depth(self, obj: bpy.types.Object) -> float: - if self.is_opening_horizontal(obj): - return self.get_height(obj) - else: - return self.get_width(obj) - - def get_opening_mapping_area(self, obj: bpy.types.Object) -> float: - if self.is_opening_horizontal(obj): - return self.get_net_footprint_area(obj) - else: - return self.get_net_side_area(obj) - - def get_finish_ceiling_height(self, obj: bpy.types.Object) -> float: - floor_height = self.get_finish_floor_height(obj) - ceiling_height = self.get_ceiling_height(obj) - finish_ceiling_height = ceiling_height - floor_height - return finish_ceiling_height - - def get_max_global_z(self, obj: bpy.types.Object) -> float: - z_values = [(obj.matrix_world @ Vector(co))[2] for co in obj.bound_box] - return max(z_values) - - def get_min_global_z(self, obj: bpy.types.Object) -> float: - z_values = [(obj.matrix_world @ Vector(co))[2] for co in obj.bound_box] - return min(z_values) - - def get_finish_floor_height(self, obj: bpy.types.Object) -> float: - space_min_z_value = self.get_min_global_z(obj) - space_max_z_value = self.get_max_global_z(obj) - - element = tool.Ifc.get_entity(obj) - decompositions = ifcopenshell.util.element.get_decomposition(element) - flooring_max_z_value = space_min_z_value - for decomposition in decompositions: - if ( - decomposition.is_a() == "IfcCovering" - and ifcopenshell.util.element.get_predefined_type(decomposition) == "FLOORING" - ): - flooring_obj = tool.Ifc.get_object(decomposition) - flooring_z_value = self.get_max_global_z(flooring_obj) - if flooring_z_value > space_min_z_value: - flooring_max_z_value = flooring_z_value - - return flooring_max_z_value - space_min_z_value - - def get_ceiling_height(self, obj: bpy.types.Object) -> float: - space_min_z_value = self.get_min_global_z(obj) - space_max_z_value = self.get_max_global_z(obj) - - element = tool.Ifc.get_entity(obj) - decompositions = ifcopenshell.util.element.get_decomposition(element) - ceiling_min_z_value = space_max_z_value - for decomposition in decompositions: - if ( - decomposition.is_a() == "IfcCovering" - and ifcopenshell.util.element.get_predefined_type(decomposition) == "CEILING" - ): - ceiling_obj = tool.Ifc.get_object(decomposition) - ceiling_z_value = self.get_min_global_z(ceiling_obj) - if ceiling_z_value < space_max_z_value: - ceiling_min_z_value = ceiling_z_value - - return ceiling_min_z_value - space_min_z_value - - def get_net_perimeter(self, o: bpy.types.Object) -> float: - parsed_edges = [] - shared_edges = [] - perimeter = 0 - for polygon in self.get_lowest_polygons(o): - for edge_key in polygon.edge_keys: - if edge_key in parsed_edges: - shared_edges.append(edge_key) - else: - parsed_edges.append(edge_key) - perimeter += self.get_edge_key_distance(o, edge_key) - for edge_key in shared_edges: - perimeter -= self.get_edge_key_distance(o, edge_key) - return perimeter - - def get_gross_perimeter(self, o: bpy.types.Object) -> float: - element = tool.Ifc.get_entity(o) - mesh = self.get_gross_element_mesh(element) - gross_obj = bpy.data.objects.new("GrossObj", mesh) - gross_perimeter = self.get_net_perimeter(gross_obj) - self.delete_obj(gross_obj) - return gross_perimeter - - def get_space_net_perimeter(self, obj: bpy.types.Object) -> float: - pass - - def get_rectangular_perimeter(self, obj: bpy.types.Object) -> float: - length = self.get_length(obj, main_axis="x") - height = self.get_height(obj) - return (length + height) * 2 - - def get_lowest_polygons(self, o: bpy.types.Object) -> list[bpy.types.MeshPolygon]: - lowest_polygons = [] - lowest_z = None - for polygon in o.data.polygons: - z = round(polygon.center[2], 3) - if lowest_z is None: - lowest_z = z - if z > lowest_z: - continue - elif z == lowest_z: - lowest_polygons.append(polygon) - elif z < lowest_z: - lowest_polygons = [polygon] - lowest_z = z - return lowest_polygons - - def get_highest_polygons(self, o: bpy.types.Object) -> list[bpy.types.MeshPolygon]: - highest_polygons = [] - highest_z = None - for polygon in o.data.polygons: - z = round(polygon.center[2], 3) - if highest_z is None: - highest_z = z - if z > highest_z: - continue - elif z == highest_z: - highest_polygons.append(polygon) - elif z < highest_z: - highest_polygons = [polygon] - highest_z = z - return highest_polygons - - def get_edge_key_distance(self, obj: bpy.types.Object, edge_key: tuple[int, int]) -> float: - return (obj.data.vertices[edge_key[1]].co - obj.data.vertices[edge_key[0]].co).length - - def get_edge_distance(self, obj: bpy.types.Object, edge: bpy.types.MeshEdge) -> float: - return (obj.data.vertices[edge.vertices[1]].co - obj.data.vertices[edge.vertices[0]].co).length - - def get_net_floor_area(self, obj: bpy.types.Object) -> float: - decompositions = self.get_obj_decompositions(obj) - if not decompositions: - return self.get_gross_footprint_area(obj) - - total_net_floor_area = self.get_net_footprint_area(obj) - - for decomposition in decompositions: - decomposition_type = decomposition.get_info()["type"] - if decomposition_type == "IfcColumn" or decomposition_type == "IfcColumn": - decomposition_obj = tool.Ifc.get_object(decomposition) - net_footprint_obj_area = self.get_net_footprint_area(decomposition_obj) - total_net_floor_area -= net_footprint_obj_area - - return total_net_floor_area - - def get_gross_ceiling_area(self, obj: bpy.types.Object) -> float: - decompositions = self.get_obj_decompositions(obj) - if not decompositions: - return self.get_gross_top_area(obj) - - total_gross_ceiling_area = 0 - - for decomposition in decompositions: - decomposition_class = decomposition.is_a() - decomposition_predefined_type = ifcopenshell.util.element.get_predefined_type(decomposition) - if decomposition_class == "IfcCovering" and decomposition_predefined_type == "CEILING": - decomposition_obj = tool.Ifc.get_object(decomposition) - total_gross_ceiling_area += self.get_gross_footprint_area(decomposition_obj) - - return total_gross_ceiling_area - - def get_net_ceiling_area(self, obj: bpy.types.Object) -> float: - decompositions = self.get_obj_decompositions(obj) - if not decompositions: - return self.get_net_top_area(obj) - - total_net_ceiling_area = 0 - - for decomposition in decompositions: - decomposition_class = decomposition.is_a() - decomposition_predefined_type = ifcopenshell.util.element.get_predefined_type(decomposition) - if decomposition_class == "IfcCovering" and decomposition_predefined_type == "CEILING": - decomposition_obj = tool.Ifc.get_object(decomposition) - total_net_ceiling_area += self.get_net_footprint_area(decomposition_obj) - - if decomposition_class == "IfcWall" or decomposition_class == "IfcColumn": - decomposition_obj = tool.Ifc.get_object(decomposition) - total_net_ceiling_area -= self.get_net_roofprint_area(decomposition_obj) - - return total_net_ceiling_area - - def get_space_net_volume(self, obj: bpy.types.Object) -> float: - decompositions = self.get_obj_decompositions(obj) - if not decompositions: - return self.get_gross_volume(obj) - - total_space_net_volume = self.get_gross_volume(obj) - - for decomposition in decompositions: - decomposition_type = decomposition.get_info()["type"] - if decomposition_type == "IfcWall" or decomposition_type == "IfcColumn": - decomposition_obj = tool.Ifc.get_object(decomposition) - total_space_net_volume -= self.get_net_volume(decomposition_obj) - - return total_space_net_volume - - def get_net_footprint_area(self, o: bpy.types.Object) -> float: - """_summary_: Returns the area of the footprint of the object, excluding any holes - - :param blender-object o: blender object - :return float: footprint area - """ - area = 0 - for polygon in self.get_lowest_polygons(o): - area += polygon.area - return area - - def get_gross_footprint_area(self, o: bpy.types.Object) -> float: - """_summary_: Returns the area of the footprint of the object, without related opening and excluding any holes - - :param blender-object o: blender object - :return float: footprint area""" - if not self.has_openings(o): - return self.get_net_footprint_area(o) - - element = tool.Ifc.get_entity(o) - mesh = self.get_gross_element_mesh(element) - gross_obj = bpy.data.objects.new("GrossObj", mesh) - gross_footprint_area = self.get_net_footprint_area(gross_obj) - self.delete_obj(gross_obj) - self.delete_mesh(mesh) - return gross_footprint_area - - def get_net_roofprint_area(self, o: bpy.types.Object) -> float: - # Is roofprint the right word? Couldn't think of anything better - vulevukusej - """_summary_: Returns the area of the net roofprint of the object, excluding any holes - - :param blender-object o: Blender Object - :return float: Area - """ - area = 0 - for polygon in self.get_highest_polygons(o): - area += polygon.area - return area - - def get_side_area(self, o: bpy.types.Object) -> float: - # There are a few dumb options for this, but this seems the dumbest - # until I get more practical experience on what works best. - x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length - y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length - z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length - return max(x * z, y * z) - - def get_cross_section_area(self, obj: bpy.types.Object) -> float: - representation = tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) - item = representation.Items[0] - while True: - if item.is_a("IfcExtrudedAreaSolid"): - mesh = self.create_mesh_from_shape(item.SweptArea) - area = self.get_mesh_area(mesh) - self.delete_mesh(mesh) - return area - elif item.is_a("IfcBooleanClippingResult"): - item = item.FirstOperand - else: - area = self.get_end_area(obj) - return area - # TODO handle other types of sections, and then fall back to mesh parsing - - def get_gross_surface_area(self, o: bpy.types.Object, vg_index: Optional[int] = None) -> float: - if vg_index is None: - if not self.has_openings(o): - return self.get_net_surface_area(o) - - element = tool.Ifc.get_entity(o) - mesh = self.get_gross_element_mesh(element) - area = self.get_mesh_area(mesh) - bpy.data.meshes.remove(mesh) - return area - - area = 0 - vertices_in_vg = [v.index for v in o.data.vertices if vg_index in [g.group for g in v.groups]] - for polygon in o.data.polygons: - if self.is_polygon_in_vg(polygon, vertices_in_vg): - area += polygon.area - return area - - def get_net_surface_area(self, obj: bpy.types.Object) -> float: - return self.get_mesh_area(obj.data) - - def get_mesh_area(self, mesh: bpy.types.Mesh) -> float: - area = 0 - for polygon in mesh.polygons: - area += polygon.area - return area - - def is_polygon_in_vg(self, polygon: bpy.types.MeshPolygon, vertices_in_vg: list[bpy.types.MeshVertex]) -> bool: - for v in polygon.vertices: - if v not in vertices_in_vg: - return False - return True - - def get_net_volume(self, o: bpy.types.Object) -> float: - o_mesh = bmesh.new() - o_mesh.from_mesh(o.data) - volume = o_mesh.calc_volume() - o_mesh.free() - return volume - - def get_gross_volume(self, o: bpy.types.Object) -> float: - if not self.has_openings(o): - return self.get_net_volume(o) - - element = tool.Ifc.get_entity(o) - mesh = self.get_gross_element_mesh(element) - bm = self.get_bmesh_from_mesh(mesh) - - gross_volume = bm.calc_volume() - - bm.free() - self.delete_mesh(mesh) - - return gross_volume - - def has_openings( - self, obj: bpy.types.Object - ) -> Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]]: - element = tool.Ifc.get_entity(obj) - return element and getattr(element, "HasOpenings", []) - - def get_obj_decompositions(self, obj: bpy.types.Object) -> list[ifcopenshell.entity_instance]: - element = tool.Ifc.get_entity(obj) - decompositions = ifcopenshell.util.element.get_decomposition(element) - return decompositions - - def get_gross_weight(self, obj: bpy.types.Object) -> Union[float, None]: - obj_mass_density = self.get_obj_mass_density(obj) - if not obj_mass_density: - return - gross_volume = self.get_gross_volume(obj) - gross_weight = obj_mass_density * gross_volume - return gross_weight - - def get_net_weight(self, obj: bpy.types.Object) -> Union[float, None]: - obj_mass_density = self.get_obj_mass_density(obj) - if not obj_mass_density: - return - net_volume = self.get_net_volume(obj) - net_weight = obj_mass_density * net_volume - return net_weight - - def get_obj_mass_density(self, obj: bpy.types.Object) -> Union[float, None]: - entity = tool.Ifc.get_entity(obj) - material = ifcopenshell.util.element.get_material(entity) - if material is None: - return - - if ( - material.is_a("IfcMaterialLayerSet") - or material.is_a("IfcMaterialProfileSet") - or material.is_a("IfcMaterialConstituentSet") - ): - return - - if material.is_a("IfcMaterial"): - material_mass_density = ifcopenshell.util.element.get_pset(material, "Pset_MaterialCommon", "MassDensity") - return material_mass_density - - if material.is_a("IfcMaterialLayerSetUsage"): - material_layers = material.ForLayerSet.MaterialLayers - densities = [] - thicknesses = [] - obj_mass_density = 0 - for material_layer in material_layers: - material_mass_density = ifcopenshell.util.element.get_pset( - material_layer.Material, "Pset_MaterialCommon", "MassDensity" - ) - if material_mass_density is None: - return - densities.append(material_mass_density) - thickness = material_layer.LayerThickness - thicknesses.append(thickness) - obj_mass_density = obj_mass_density + (material_mass_density * thickness) - total_thickness = sum(thicknesses) - obj_mass_density = obj_mass_density / total_thickness - return obj_mass_density - - if material.is_a("IfcMaterialProfileSetUsage"): - material_profiles = material.ForProfileSet.MaterialProfiles - if len(material_profiles) == 1: - material_mass_density = ifcopenshell.util.element.get_pset( - material_profiles[0].Material, "Pset_MaterialCommon", "MassDensity" - ) - return material_mass_density - else: - return - - # The following is @Moult's older code. Keeping it here just in case the bmesh function is buggy. -vulevukusej - - # def get_volume(self, o, vg_index=None): - # volume = 0 - # ob_mat = o.matrix_world - # me = o.data - # me.calc_loop_triangles() - # for tf in me.loop_triangles: - # tfv = tf.vertices - # if len(tf.vertices) == 3: - # tf_tris = ((me.vertices[tfv[0]], me.vertices[tfv[1]], me.vertices[tfv[2]]),) - # else: - # tf_tris = ( - # (me.vertices[tfv[0]], me.vertices[tfv[1]], me.vertices[tfv[2]]), - # ( - # me.vertices[tfv[2]], - # me.vertices[tfv[3]], - # me.vertices[tfv[0]], - # ), - # ) - - # for tf_iter in tf_tris: - # v1 = ob_mat @ tf_iter[0].co - # v2 = ob_mat @ tf_iter[1].co - # v3 = ob_mat @ tf_iter[2].co - - # volume += v1.dot(v2.cross(v3)) / 6.0 - # return volume - - def get_opening_type(self, opening: bpy.types.Object, obj: bpy.types.Object) -> Literal["OPENING", "RECESS"]: - """_summary_: Returns the opening type - OPENING / RECESS - - :param blender-object opening: blender opening object - :param blender-object obj: blender object - :return string: "OPENING" or "RECESS" - """ - polygons = opening.data.polygons - ray_intersections = 0 - - for polygon in polygons: - normal_vector = (polygon.normal.x, polygon.normal.y, polygon.normal.z) - polygon_centre = (polygon.center.x, polygon.center.y, polygon.center.z) - if obj.ray_cast(polygon_centre, normal_vector)[0]: - ray_intersections += 1 - - # If an odd number of face-normal vectors intersect with the object, then the void is a recess, otherwise it's an opening - return "OPENING" if ray_intersections % 2 == 0 else "RECESS" - - def get_opening_area( - self, - obj: bpy.types.Object, - angle_z1: int = 45, - angle_z2: int = 135, - min_area: int = 0, - ignore_recesses: bool = False, - ) -> float: - """_summary_: Returns the lateral area of the openings in the object. - - :param obj: blender object - :param int angle_z1: Angle measured from the positive z-axis to the normal-vector of the opening area. - Openings with a normal_vector lower than this value will be ignored, defaults to 45 - :param int angle_z2: Angle measured from the positive z-axis to the normal-vector of the opening area. - Openings with a normal_vector greater than this value will be ignored,defaults to 135 - :param float min_area: Minimum opening area to consider. Values lower than this will be ignored, - defaults to 0 - :param bool ignore_recesses: Toggle whether recess areas should be considered, defaults to False - :return float: Opening Area - """ - total_opening_area = 0 - ifc = tool.Ifc.get() - ifc_element = ifc.by_id(obj.BIMObjectProperties.ifc_definition_id) - if len(openings := ifc_element.HasOpenings) != 0: - for opening in openings: - opening_id = opening.RelatedOpeningElement.GlobalId - ifc_opening_element = ifc.by_guid(opening_id) - # bl_opening_obj = tool.Ifc.get_object(ifc_opening_element) - # mesh = bpy.data.meshes.new('myMesh') - mesh = self.get_gross_element_mesh(ifc_opening_element) - - bl_opening_obj = bpy.data.objects.new("MyObject", mesh) - - opening_type = ( - ifc_opening_element.PredefinedType - if ifc_opening_element.PredefinedType is not None - else self.get_opening_type(bl_opening_obj, obj) - ) - - if ignore_recesses and opening_type == "RECESS": - continue - - bl_OBB_opening_object = self.get_OBB_object(bl_opening_obj) - opening_area = self.get_lateral_area( - # self.get_OBB_object(bl_opening_obj), angle_z1=angle_z1, angle_z2=angle_z2, exclude_end_areas=True - bl_OBB_opening_object, - angle_z1=angle_z1, - angle_z2=angle_z2, - exclude_end_areas=True, - main_axis="x", - ) - if opening_area >= min_area: - total_opening_area += opening_area - - self.delete_obj(bl_opening_obj) - self.delete_mesh(mesh) - self.delete_obj(bl_OBB_opening_object) - - return total_opening_area - - def get_lateral_area( - self, - obj: bpy.types.Object, - subtract_openings: bool = True, - exclude_end_areas: bool = False, - exclude_side_areas: bool = False, - angle_z1: int = 45, - angle_z2: int = 135, - main_axis: str = "", - ) -> float: - """_summary_ - - :param blender-object obj: blender object, bpy.types.Object - :param bool subtract_openings: Toggle whether opening-areas should be subtracted, defaults to True - :param bool exclude_end_areas: , defaults to False - :param bool exclude_side_areas: , defaults to False - :param int angle_z1: Angle measured from the positive z-axis to the normal-vector of the area. Openings with a normal_vector lower than this value will be ignored, defaults to 45 - :param int angle_z2: Angle measured from the positive z-axis to the normal-vector of the area. Openings with a normal_vector greater than this value will be ignored, defaults to 135 - :param str main_axis: set main axis, for example a wall must have x main axis default 'x' - :return float: Lateral Area - """ - - x_axis = [1, 0, 0] - y_axis = [0, 1, 0] - z_axis = [0, 0, 1] - - if self.get_object_main_axis(obj) == "x" or main_axis == "x": - main_axis = x_axis - side_axis = y_axis - top_axis = z_axis - elif self.get_object_main_axis(obj) == "z": - main_axis = z_axis - side_axis = x_axis - top_axis = y_axis - elif self.get_object_main_axis(obj) == "y": - main_axis = y_axis - side_axis = z_axis - top_axis = x_axis - - area = 0 - total_opening_area = ( - 0 if subtract_openings else self.get_opening_area(obj, angle_z1=angle_z1, angle_z2=angle_z2) - ) - polygons = obj.data.polygons - - for polygon in polygons: - angle_to_top_axis = math.degrees(polygon.normal.rotation_difference(Vector(top_axis)).angle) - if angle_to_top_axis < angle_z1 or angle_to_top_axis > angle_z2: - continue - if exclude_end_areas: - angle_to_main_axis = math.degrees(polygon.normal.rotation_difference(Vector(main_axis)).angle) - if angle_to_main_axis < 45 or angle_to_main_axis > 135: - continue - if exclude_side_areas: - angle_to_side_axis = math.degrees(polygon.normal.rotation_difference(Vector(side_axis)).angle) - if angle_to_side_axis < 45 or angle_to_side_axis > 135: - continue - area += polygon.area - return area + total_opening_area - - def get_gross_side_area(self, obj: bpy.types.Object) -> float: - if not self.has_openings(obj): - return self.get_net_side_area(obj) - - gross_side_area = self.get_lateral_area(obj, exclude_end_areas=True, subtract_openings=False, main_axis="x") / 2 - - return gross_side_area - - def get_net_side_area(self, obj: bpy.types.Object) -> float: - net_side_area = self.get_lateral_area(obj, exclude_end_areas=True, main_axis="x") / 2 - return net_side_area - - def get_outer_surface_area(self, obj: bpy.types.Object) -> float: - outer_surface_area = self.get_lateral_area(obj, exclude_end_areas=True, angle_z1=0, angle_z2=360) - return outer_surface_area - - def get_end_area(self, obj: bpy.types.Object) -> float: - element = tool.Ifc.get_entity(obj) - gross_mesh = self.get_gross_element_mesh(element) - gross_obj = bpy.data.objects.new("MyObject", gross_mesh) - - gross_obj.matrix_world = obj.matrix_world - - end_area = self.get_lateral_area(gross_obj, exclude_side_areas=True) / 2 - - self.delete_obj(gross_obj) - self.delete_mesh(gross_mesh) - - return end_area - - def get_gross_top_area(self, obj: bpy.types.Object, angle: int = 45) -> float: - """_summary_: Returns the gross top area of the object. - - :param blender-object obj: blender object - :param int angle: Angle measured from the positive z-axis to the normal-vector of the area. Values lower than this will be ignored, defaults to 45 - :return float: Gross Top Area - """ - - z_axis = (0, 0, 1) - area = 0 - opening_area = 0 - polygons = obj.data.polygons - - ifc = tool.Ifc.get() - ifc_element = ifc.by_id(obj.BIMObjectProperties.ifc_definition_id) - - # if len(openings := ifc_element.HasOpenings) != 0: - if len(openings := self.has_openings(obj)) != 0: - for opening in openings: - if opening.RelatedOpeningElement.PredefinedType == "OPENING": - opening_id = opening.RelatedOpeningElement.GlobalId - - entity = ifc.by_guid(opening_id) - open_obj = tool.Ifc.get_object(entity) - opening_area += self.get_net_top_area(open_obj, angle=angle) - else: - continue - - for polygon in polygons: - normal_vector = (polygon.normal.x, polygon.normal.y, polygon.normal.z) - angle_to_z_axis = math.degrees(polygon.normal.rotation_difference(Vector(z_axis)).angle) - - if angle_to_z_axis < angle: - area += polygon.area - return area + opening_area - - # curently net top area is larger then projected area, because its taking into account internal polygons, or window sills - def get_net_top_area(self, obj: bpy.types.Object, angle: int = 45, ignore_internal: bool = True) -> float: - """_summary_: Returns the net top area of the object. - - :param blender-object obj: blender object - :param int angle: Angle measured from the positive z-axis to the normal-vector of the area. - Values lower than this will be ignored, defaults to 45 - :param bool ignore_internal: Toggle whether internal areas should be subtracted (Like window sills), - defaults to True - :return float: Net Top Area - """ - z_axis = (0, 0, 1) - area = 0 - polygons = obj.data.polygons - - for polygon in polygons: - normal_vector = (polygon.normal.x, polygon.normal.y, polygon.normal.z) - angle_to_z_axis = math.degrees(polygon.normal.rotation_difference(Vector(z_axis)).angle) - - if angle_to_z_axis < angle: - # offset the raycast, otherwise the raycast will always collide with the object. - offset = polygon.center + Vector((0, 0, 0.01)) - if ignore_internal and obj.ray_cast(offset, (0, 0, 1))[0]: - continue - area += polygon.area - - return area - - def get_projected_area(self, obj, projection_axis: AxisType = "z", is_gross: bool = True) -> float: - """_summary_: Returns the projected area of the object. - - :param blender-object obj: blender object - :param str projection_axis: Axis to project the area onto. Can be "x", "y" or "z" - :param bool is_gross: if True, the projected area will include openings, if False, the projected area will exclude openings - :return float: Projected Area - """ - - odata = obj.data - polygons = obj.data.polygons - shapely_polygons = [] - - axes = {"x": ["y", "z"], "y": ["x", "z"], "z": ["x", "y"]}[projection_axis] - - for polygon in polygons: - if getattr(polygon.normal, projection_axis) == 0: - continue - polygon_tuples = [] - - for loop_index in polygon.loop_indices: - loop = odata.loops[loop_index] - a = getattr(odata.vertices[loop.vertex_index].co, axes[0]) - b = getattr(odata.vertices[loop.vertex_index].co, axes[1]) - polygon_tuples.append((a, b)) - - pgon = Polygon(polygon_tuples) - shapely_polygons.append(pgon) - - projected_polygon = unary_union(shapely_polygons) - if is_gross: - void_area = 0 - voids = projected_polygon.interiors - for void in voids: - void_polygon = Polygon(void) - void_area += void_polygon.area - return projected_polygon.area + void_area - return projected_polygon.area - - def get_OBB_object(self, obj: bpy.types.Object) -> bpy.types.Object: - """_summary_: Returns the Oriented-Bounding-Box (OBB) of the object. - - :param blender-object obj: Blender Object - :return blender-object: OBB of the Object - """ - ifc_id = obj.BIMObjectProperties.ifc_definition_id - bbox = obj.bound_box - # matrix transformation to go from obj coordinates to world coordinates: - obb = [Vector(v) for v in bbox] - obb_mesh = bpy.data.meshes.new(f"OBB_{ifc_id}") - - # list of faces, with each tuple referring to an vertex-index in obb - faces = [ - (0, 1, 2, 3), - (7, 6, 5, 4), - (5, 6, 2, 1), - (0, 3, 7, 4), - (0, 4, 5, 1), - (2, 6, 7, 3), - ] - - obb_mesh.from_pydata(vertices=obb, edges=[], faces=faces) - # obb_mesh.transform(obj.matrix_world) - - # create a new object from the mesh - new_OBB_object = bpy.data.objects.new(f"OBB_{ifc_id}", obb_mesh) - new_OBB_object.matrix_world = obj.matrix_world - - # create new collection for QtoCalculator - collection = bpy.data.collections.get("QtoCalculator", bpy.data.collections.new("QtoCalculator")) - if not bpy.context.scene.collection.children.get(collection.name): - bpy.context.scene.collection.children.link(collection) - - # add object to scene collection and then hide them. - collection.objects.get(new_OBB_object.name, collection.objects.link(new_OBB_object)) - if bpy.context.view_layer.objects.get(new_OBB_object.name): - new_OBB_object.hide_set(True) - - return new_OBB_object - - def get_AABB_object(self, obj: bpy.types.Object) -> bpy.types.Object: - """_summary_: Returns the Axis-Aligned-Bounding-Box (AABB) of the object. - - :param blender-object obj: Blender Object - :return blender-object: AABB of the Object - """ - ifc_id = obj.BIMObjectProperties.ifc_definition_id - aabb_mesh = bpy.data.meshes.new(f"OBB_{ifc_id}") - - x = [v.co.x for v in obj.data.vertices] - y = [v.co.y for v in obj.data.vertices] - z = [v.co.z for v in obj.data.vertices] - - min_x, max_x, min_y, max_y, min_z, max_z = min(x), max(x), min(y), max(y), min(z), max(z) - - vertices = [ - (min_x, min_y, min_z), - (min_x, min_y, max_z), - (min_x, max_y, max_z), - (min_x, max_y, min_z), - (max_x, min_y, min_z), - (max_x, min_y, max_z), - (max_x, max_y, max_z), - (max_x, max_y, min_z), - ] - - faces = [ - (0, 1, 2, 3), - (7, 6, 5, 4), - (5, 6, 2, 1), - (0, 3, 7, 4), - (0, 4, 5, 1), - (2, 6, 7, 3), - ] - - aabb_mesh.from_pydata(vertices=vertices, edges=[], faces=faces) - aabb_mesh.update() - - # create a new object from the mesh - new_AABB_object = bpy.data.objects.new(f"OBB_{ifc_id}", aabb_mesh) - new_AABB_object.matrix_world = obj.matrix_world - - # create new collection for QtoCalculator - collection = bpy.data.collections.get("QtoCalculator", bpy.data.collections.new("QtoCalculator")) - if not bpy.context.scene.collection.children.get(collection.name): - bpy.context.scene.collection.children.link(collection) - - # add object to scene collection and then hide them. - collection.objects.link(new_AABB_object) - if bpy.context.view_layer.objects.get(new_AABB_object.name): - new_AABB_object.hide_set(True) - - return new_AABB_object - - def get_bisected_obj( - self, - obj: bpy.types.Object, - plane_co_pos: VectorTuple, - plane_no_pos: VectorTuple, - plane_co_neg: VectorTuple, - plane_no_neg: VectorTuple, - ) -> bpy.types.Object: - """_summary_: Returns the object bisected by two planes. - - :param blender-object obj: Blender Object - :param tuple(x,y,z) plane_co_pos: Point on upper bisection plane. Example: (0,0,0) - :param tuple(x,y,z) plane_no_pos: Tuple describing the normal vector of the upper bisection plane. Example: (0,0,1) - :param tuple(x,y,z) plane_co_neg: Point on lower bisection plane. Example: (0,0,0) - :param tuple(x,y,z) plane_no_neg: Tuple describing the normal vector of the lower bisection plane. Example: (0,0,-1) - :return _type_: _description_ - """ - ifc_id = obj.BIMObjectProperties.ifc_definition_id - - bis_obj = obj.copy() - bis_obj.data = obj.data.copy() - bis_obj.name = f"Bisected_{ifc_id}" - - collection = bpy.data.collections.get("QtoCalculator", bpy.data.collections.new("QtoCalculator")) - if not bpy.context.scene.collection.children.get(collection.name): - bpy.context.scene.collection.children.link(collection) - - collection.objects.link(bis_obj) - - bpy.ops.object.select_all(action="DESELECT") - bpy.context.view_layer.objects.active = bis_obj - - bpy.ops.object.mode_set(mode="EDIT") - bpy.ops.mesh.select_all(action="SELECT") - - bpy.ops.mesh.bisect(plane_co=plane_co_pos, plane_no=plane_no_pos, use_fill=True, clear_outer=True) - - bpy.ops.mesh.select_all(action="SELECT") - bpy.ops.mesh.bisect(plane_co=plane_co_neg, plane_no=plane_no_neg, use_fill=True, clear_outer=True) - bpy.ops.object.editmode_toggle() - if bpy.context.view_layer.objects.get(bis_obj.name): - bis_obj.hide_set(True) - - return bis_obj - - def get_total_contact_area(self, obj: bpy.types.Object, class_filter: list[str] = ["IfcElement"]) -> float: - """_summary_: Returns the total contact area of the object with other objects. - - :param blender-object obj: Blender Object - :param list [] class_filter: A list of classes used to filter the objects - to be considered for the calculation. Example: ["IfcWall"] or ["IfcWall", "IfcSlab"] - :return float: Total contact area of the object with other objects. - """ - total_contact_area = 0 - touching_objects = self.get_touching_objects(obj, class_filter) - - for o in touching_objects: - total_contact_area += self.get_contact_area(obj, o) - - return total_contact_area - - def get_touching_objects(self, obj: bpy.types.Object, class_filter: list[str]) -> list[bpy.types.Object]: - """_summary_: Returns a list of objects that are touching the object. - - :param blender-object obj: Blender Object - :param list [] class_filter: A list of classes used to filter the objects - to be considered for the calculation. Example: ["IfcWall"] or ["IfcWall", "IfcSlab"] - :return list: List of touching objects - """ - # rotate the object ever so slightly, otherwise bvhtree.overlap won't work properly. https://blender.stackexchange.com/a/275244/130742 - # I still prefer using bhvtree over ifcclash simply because of the considerable speed improvement @vulevukusej - obj.rotation_euler[0] += math.radians(0.001) - obj.rotation_euler[1] += math.radians(0.001) - bpy.context.evaluated_depsgraph_get().update() - - obj_mesh = bmesh.new() - obj_mesh.from_mesh(obj.data) - obj_mesh.transform(obj.matrix_world) - obj_tree = BVHTree.FromBMesh(obj_mesh) - - touching_objects = [] - filtered_objects = [] - - ifc = tool.Ifc.get() - for f in class_filter: - filtered_objects += ifc.by_type(f) - - for o in filtered_objects: - blender_o = tool.Ifc.get_object(o) - if blender_o == obj: - continue - o_mesh = bmesh.new() - try: - o_mesh.from_mesh(blender_o.data) - except: - # i'm too tired to debug this properly. Not sure what causes this error. @vulevukusej - continue - o_mesh.transform(blender_o.matrix_world) - o_tree = BVHTree.FromBMesh(o_mesh) - - if len(obj_tree.overlap(o_tree)) > 0: - touching_objects.append(blender_o) - - # return the objects to their original states - blender_o.rotation_euler[0] -= math.radians(0.001) - blender_o.rotation_euler[1] -= math.radians(0.001) - bpy.context.evaluated_depsgraph_get().update() - - return touching_objects - - def get_contact_area(self, object1: bpy.types.Object, object2: bpy.types.Object) -> float: - """_summary_: Returns the contact area between two objects. - - :param blender-object obj: Blender Object - :param blender-object obj: Blender Object - :return float: contact area between the two objects. - """ - # list of tuples, each tuple containing the index of the polygon in object1 and object2 that are touching - total_area = 0 - - for poly1 in object1.data.polygons: - for poly2 in object2.data.polygons: - total_area += self.get_intersection_between_polygons(object1, poly1, object2, poly2) - return total_area - - def get_intersection_between_polygons( - self, - object1: bpy.types.Object, - poly1: bpy.types.MeshPolygon, - object2: bpy.types.Object, - poly2: bpy.types.MeshPolygon, - ) -> float: - """_summary_: Returns the intersection between two polygons. - - :param blender-object object1: Blender Object - :param blender-polygon poly1: Blender Polygon - :param blender-object object1: Blender Object - :param blender-polygon poly1: Blender Polygon - :return float: intersection area of the two polygons. - """ - # get normal vectors according to world axis - normal1 = object1.rotation_euler.to_matrix() @ poly1.normal - center1 = object1.matrix_world @ poly1.center - normal2 = object2.rotation_euler.to_matrix() @ poly2.normal - center2 = object2.matrix_world @ poly2.center - - angle_between_normals = normal1.rotation_difference(normal2).angle - - if math.degrees(angle_between_normals) < 178: - return 0 - - # touching polygons should be coplanar: - plane_intersection = mathutils.geometry.intersect_plane_plane(center1, normal1, center2, normal2) - - # sometimes coplanar planes will interesect far off into the distance. This is a crude way of filtering out those intersections. - if plane_intersection[0] is None or (plane_intersection[0] - center1).magnitude > 20: - return 0 - - # calculate rotation between face and vertical Z-axis. This makes it easier to calculate intersection area later - rotation_to_z = normal1.rotation_difference(Vector((0, 0, 1))) - center_of_rotation = center1 - - # rotation around face.center in world space / https://blender.stackexchange.com/a/12324/130742 - trans_matrix = Matrix.Translation(center_of_rotation) @ rotation_to_z.to_matrix().to_4x4() - - pgon1 = self.create_shapely_polygon(object1, poly1, trans_matrix) - pgon2 = self.create_shapely_polygon(object2, poly2, trans_matrix) - - try: - return pgon1.intersection(pgon2).area - except: - # TopologicalError - Generated Geometry might be invalid - return 0 - - def create_shapely_polygon( - self, obj: bpy.types.Object, polygon: bpy.types.MeshPolygon, trans_matrix: Matrix - ) -> Polygon: - """_summary_: Create a shapely polygon - - :param blender-object obj: Blender Object - :param blender-polygon polygon: Blender Polygon - :param matrix trans_matrix: Matrix that rotates the polygon to face upwards - :return Shapely Polygon: Shapely Polygon - """ - polygon_tuples = [] - odata = obj.data - for loop_index in polygon.loop_indices: - loop = odata.loops[loop_index] - coords = obj.matrix_world @ odata.vertices[loop.vertex_index].co - rotated_coords = trans_matrix @ coords - x = rotated_coords.x - y = rotated_coords.y - polygon_tuples.append((x, y)) - return Polygon(polygon_tuples) - - def get_gross_element_mesh(self, element: ifcopenshell.entity_instance) -> bpy.types.Mesh: - settings = ifcopenshell.geom.settings() - settings.set(settings.DISABLE_OPENING_SUBTRACTIONS, True) - return self.create_mesh_from_shape(element, settings) - - def create_mesh_from_shape( - self, element: ifcopenshell.entity_instance, settings: Optional[ifcopenshell.geom.settings] = None - ) -> bpy.types.Mesh: - if settings is None: - settings = ifcopenshell.geom.settings() - shape = ifcopenshell.geom.create_shape(settings, element) - geometry = shape.geometry if element.is_a("IfcRoot") else shape - faces = geometry.faces - verts = geometry.verts - - mesh = bpy.data.meshes.new("myBeautifulMesh") - - num_vertices = len(verts) // 3 - total_faces = len(faces) - loop_start = range(0, total_faces, 3) - num_loops = total_faces // 3 - loop_total = [3] * num_loops - num_vertex_indices = len(faces) - - mesh.vertices.add(num_vertices) - mesh.vertices.foreach_set("co", verts) - mesh.loops.add(num_vertex_indices) - mesh.loops.foreach_set("vertex_index", faces) - mesh.polygons.add(num_loops) - mesh.polygons.foreach_set("loop_start", loop_start) - mesh.polygons.foreach_set("loop_total", loop_total) - mesh.update() - return mesh - - def get_bmesh_from_mesh(self, mesh: bpy.types.Mesh) -> bmesh.types.BMesh: - bm = bmesh.new() - bm.from_mesh(mesh) - return bm - - def get_object_main_axis(self, o: bpy.types.Object) -> AxisType: - """_summary_: Returns the main object axis. Useful for profile-defined objects. - - :param blender-object o: Blender Object - :return str: main axis x or y or z - """ - x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length - y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length - z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length - - if x >= y and x > z: - return "x" - if y > z and y > x: - return "y" - if z > x and z > y: - return "z" - else: - return "x" - - def is_opening_horizontal(self, o: bpy.types.Object) -> bool: - x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length - y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length - z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length - - return z < x and z < y - - def delete_mesh(self, mesh: bpy.types.Mesh) -> None: - mesh.user_clear() - bpy.data.meshes.remove(mesh) - - def delete_obj(self, obj: bpy.types.Object) -> None: - bpy.data.objects.remove(obj, do_unlink=True) - - -# # Following code is here temporarily to test newly created functions: - -# qto = QtoCalculator() -# o = bpy.context.active_object -# sel = bpy.context.selected_objects -# -# nl = '\n' -# print( -# f"get_linear_length: {qto.get_linear_length(o)}{nl}{nl}" -# f"get_width: {qto.get_width(o)}{nl}{nl}" -# f"get_height: {qto.get_height(o)}{nl}{nl}" -# f"get_perimeter: {qto.get_perimeter(o)}{nl}{nl}" -# f"get_lowest_polygons: {qto.get_lowest_polygons(o)}{nl}{nl}" -# f"get_highest_polygons: {qto.get_highest_polygons(o)}{nl}{nl}" -# f"get_net_footprint_area: {qto.get_net_footprint_area(o)}{nl}{nl}" -# f"get_net_roofprint_area: {qto.get_net_roofprint_area(o)}{nl}{nl}" -# f"get_side_area: {qto.get_side_area(o)}{nl}{nl}" -# f"get_gross_surface_area: {qto.get_gross_surface_area(o)}{nl}{nl}" -# f"get_volume: {qto.get_volume(o)}{nl}{nl}" -# f"get_opening_area(o, angle_z1=45, angle_z2=135, min_area=0, ignore_recesses=False): {qto.get_opening_area(o, angle_z1=45, angle_z2=135, min_area=0, ignore_recesses=False)}{nl}{nl}" -# f"get_lateral_area(o, subtract_openings=True, exclude_end_areas=False, exclude_side_areas=False, angle_z1=45, angle_z2=135): {qto.get_lateral_area(o, subtract_openings=True, exclude_end_areas=False, exclude_side_areas=False, angle_z1=45, angle_z2=135)}{nl}{nl}" -# f"get_gross_top_area: {qto.get_gross_top_area(o, angle=45)}{nl}{nl}" -# f"get_net_top_area(o, angle=45, ignore_internal=True): {qto.get_net_top_area(o, angle=45, ignore_internal=True)}{nl}{nl}" -# f"get_projected_area(o, projection_axis='z', is_gross=True): {qto.get_projected_area(o, projection_axis='z', is_gross=True)}{nl}{nl}" -# f"get_OBB_object: {qto.get_OBB_object(o)}{nl}{nl}" -# f"get_AABB_object: {qto.get_AABB_object(o)}{nl}{nl}" -# f"get_bisected_obj(o, plane_co_pos=(0,0,1), plane_no_pos=(0,0,1), plane_co_neg=(0,0,1), plane_no_neg=(0,0,1)): {qto.get_bisected_obj(o, plane_co_pos=(0,0,1), plane_no_pos=(0,0,1), plane_co_neg=(0,0,1), plane_no_neg=(0,0,1))}{nl}{nl}" -# f"get_total_contact_area(o, class_filter=['IfcWall', 'IfcSlab']): {qto.get_total_contact_area(o, class_filter=['IfcWall', 'IfcSlab'])}{nl}{nl}" -# f"get_touching_objects(o, ['IfcElement']): {qto.get_touching_objects(o, ['IfcElement'])}{nl}{nl}" -# #f"get_contact_area: {qto.get_contact_area(o)}{nl}{nl}" -# ) diff --git a/src/blenderbim/blenderbim/bim/module/qto/calculator.py b/src/blenderbim/blenderbim/bim/module/qto/calculator.py new file mode 100644 index 0000000000..874bf37e72 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/qto/calculator.py @@ -0,0 +1,1210 @@ +# BlenderBIM Add-on - OpenBIM Blender Add-on +# Copyright (C) 2020, 2021 Dion Moult , Vukas Pajic +# +# This file is part of BlenderBIM Add-on. +# +# BlenderBIM Add-on is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# BlenderBIM Add-on is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with BlenderBIM Add-on. If not, see . + +import bpy +import math +import bmesh +import mathutils +import blenderbim.tool as tool +import ifcopenshell +import ifcopenshell.geom +import ifcopenshell.util.element +from mathutils import Vector, Matrix +from mathutils.bvhtree import BVHTree +from shapely.geometry import Polygon +from shapely.ops import unary_union +from typing import Literal, Union, Optional + + +AxisType = Literal["x", "y", "z"] +VectorTuple = tuple[float, float, float] + + +def get_units(o: bpy.types.Object, vg_index: int) -> int: + return len([v for v in o.data.vertices if vg_index in [g.group for g in v.groups]]) + +def get_linear_length(o: bpy.types.Object) -> float: + """_summary_: Returns the length of the longest edge of the object bounding box + + :param blender-object o: Blender Object + :return float: Length + """ + x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length + y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length + z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length + return max(x, y, z) + +def get_length(o: bpy.types.Object, vg_index: Optional[int] = None, main_axis: str = "x") -> float: + if vg_index is None: + x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length + y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length + z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length + if get_object_main_axis(o) == "x" or main_axis == "x": + return max(x, y) + if get_object_main_axis(o) == "z": + return max(z, x) + if get_object_main_axis(o) == "y": + return max(y, z) + + length = 0 + edges = [ + e + for e in o.data.edges + if ( + vg_index in [g.group for g in o.data.vertices[e.vertices[0]].groups] + and vg_index in [g.group for g in o.data.vertices[e.vertices[1]].groups] + ) + ] + for e in edges: + length += get_edge_distance(o, e) + return length + +def get_stair_length(obj: bpy.types.Object) -> float: + length = get_length(obj) + height = get_height(obj) + stair_length = math.sqrt(pow(length, 2) + pow(height, 2)) + return stair_length + +def get_net_stair_area(obj: bpy.types.Object) -> float: + OBB_obj = get_OBB_object(obj) + OBB_net_footprint_area = get_net_footprint_area(OBB_obj) + return OBB_net_footprint_area + +def get_gross_stair_area(obj: bpy.types.Object) -> float: + OBB_obj = get_OBB_object(obj) + OBB_gross_footprint_area = get_gross_footprint_area(OBB_obj) + return OBB_gross_footprint_area + +def get_parametric_axis(obj: bpy.types.Object) -> Literal["AXIS2", "AXIS3", None]: + relating_type = ifcopenshell.util.element.get_type(tool.Ifc.get_entity(obj)) + if relating_type: + parametric = ifcopenshell.util.element.get_psets(relating_type).get("EPset_Parametric") + if parametric: + layer_set_direction = None + layer_set_direction = parametric.get("LayerSetDirection", layer_set_direction) + if layer_set_direction == "AXIS2": + return "AXIS2" + elif layer_set_direction == "AXIS3": + return "AXIS3" + else: + return None + return None + +def get_covering_gross_area(obj: bpy.types.Object) -> float: + parametrix_axis = get_parametric_axis(obj) + if not parametrix_axis: + return get_gross_footprint_area(obj) + elif parametrix_axis == "AXIS2": + return get_gross_side_area(obj) + elif parametrix_axis == "AXIS3": + return get_gross_footprint_area(obj) + +def get_covering_net_area(obj: bpy.types.Object) -> float: + parametrix_axis = get_parametric_axis(obj) + if not parametrix_axis: + return get_net_footprint_area(obj) + elif parametrix_axis == "AXIS2": + return get_net_side_area(obj) + elif parametrix_axis == "AXIS3": + return get_net_footprint_area(obj) + +def get_covering_width(obj: bpy.types.Object) -> float: + parametrix_axis = get_parametric_axis(obj) + if not parametrix_axis: + return get_height(obj) + elif parametrix_axis == "AXIS2": + return get_width(obj) + elif parametrix_axis == "AXIS3": + return get_height(obj) + +def get_width(o: bpy.types.Object) -> float: + """_summary_: Returns the width of the object bounding box + + :param blender-object o: blender object + :return float: width + """ + x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length + y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length + return min(x, y) + +def get_height(o: bpy.types.Object) -> float: + """_summary_: Returns the height of the object bounding box + + :param blender-object o: blender object + :return float: height + """ + return (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length + +def get_opening_height(obj: bpy.types.Object) -> float: + if is_opening_horizontal(obj): + return get_width(obj) + else: + return get_height(obj) + +def get_opening_depth(obj: bpy.types.Object) -> float: + if is_opening_horizontal(obj): + return get_height(obj) + else: + return get_width(obj) + +def get_opening_mapping_area(obj: bpy.types.Object) -> float: + if is_opening_horizontal(obj): + return get_net_footprint_area(obj) + else: + return get_net_side_area(obj) + +def get_finish_ceiling_height(obj: bpy.types.Object) -> float: + floor_height = get_finish_floor_height(obj) + ceiling_height = get_ceiling_height(obj) + finish_ceiling_height = ceiling_height - floor_height + return finish_ceiling_height + +def get_max_global_z(obj: bpy.types.Object) -> float: + z_values = [(obj.matrix_world @ Vector(co))[2] for co in obj.bound_box] + return max(z_values) + +def get_min_global_z(obj: bpy.types.Object) -> float: + z_values = [(obj.matrix_world @ Vector(co))[2] for co in obj.bound_box] + return min(z_values) + +def get_finish_floor_height(obj: bpy.types.Object) -> float: + space_min_z_value = get_min_global_z(obj) + + element = tool.Ifc.get_entity(obj) + decompositions = ifcopenshell.util.element.get_decomposition(element) + flooring_max_z_value = space_min_z_value + for decomposition in decompositions: + if ( + decomposition.is_a() == "IfcCovering" + and ifcopenshell.util.element.get_predefined_type(decomposition) == "FLOORING" + ): + flooring_obj = tool.Ifc.get_object(decomposition) + flooring_z_value = get_max_global_z(flooring_obj) + if flooring_z_value > space_min_z_value: + flooring_max_z_value = flooring_z_value + + return flooring_max_z_value - space_min_z_value + +def get_ceiling_height(obj: bpy.types.Object) -> float: + space_min_z_value = get_min_global_z(obj) + space_max_z_value = get_max_global_z(obj) + + element = tool.Ifc.get_entity(obj) + decompositions = ifcopenshell.util.element.get_decomposition(element) + ceiling_min_z_value = space_max_z_value + for decomposition in decompositions: + if ( + decomposition.is_a() == "IfcCovering" + and ifcopenshell.util.element.get_predefined_type(decomposition) == "CEILING" + ): + ceiling_obj = tool.Ifc.get_object(decomposition) + ceiling_z_value = get_min_global_z(ceiling_obj) + if ceiling_z_value < space_max_z_value: + ceiling_min_z_value = ceiling_z_value + + return ceiling_min_z_value - space_min_z_value + +def get_net_perimeter(o: bpy.types.Object) -> float: + parsed_edges = [] + shared_edges = [] + perimeter = 0 + for polygon in get_lowest_polygons(o): + for edge_key in polygon.edge_keys: + if edge_key in parsed_edges: + shared_edges.append(edge_key) + else: + parsed_edges.append(edge_key) + perimeter += get_edge_key_distance(o, edge_key) + for edge_key in shared_edges: + perimeter -= get_edge_key_distance(o, edge_key) + return perimeter + +def get_gross_perimeter(o: bpy.types.Object) -> float: + element = tool.Ifc.get_entity(o) + mesh = get_gross_element_mesh(element) + gross_obj = bpy.data.objects.new("GrossObj", mesh) + gross_perimeter = get_net_perimeter(gross_obj) + delete_obj(gross_obj) + return gross_perimeter + +def get_space_net_perimeter(obj: bpy.types.Object) -> float: + pass + +def get_rectangular_perimeter(obj: bpy.types.Object) -> float: + length = get_length(obj, main_axis="x") + height = get_height(obj) + return (length + height) * 2 + +def get_lowest_polygons(o: bpy.types.Object) -> list[bpy.types.MeshPolygon]: + lowest_polygons = [] + lowest_z = None + for polygon in o.data.polygons: + z = round(polygon.center[2], 3) + if lowest_z is None: + lowest_z = z + if z > lowest_z: + continue + elif z == lowest_z: + lowest_polygons.append(polygon) + elif z < lowest_z: + lowest_polygons = [polygon] + lowest_z = z + return lowest_polygons + +def get_highest_polygons(o: bpy.types.Object) -> list[bpy.types.MeshPolygon]: + highest_polygons = [] + highest_z = None + for polygon in o.data.polygons: + z = round(polygon.center[2], 3) + if highest_z is None: + highest_z = z + if z > highest_z: + continue + elif z == highest_z: + highest_polygons.append(polygon) + elif z < highest_z: + highest_polygons = [polygon] + highest_z = z + return highest_polygons + +def get_edge_key_distance(obj: bpy.types.Object, edge_key: tuple[int, int]) -> float: + return (obj.data.vertices[edge_key[1]].co - obj.data.vertices[edge_key[0]].co).length + +def get_edge_distance(obj: bpy.types.Object, edge: bpy.types.MeshEdge) -> float: + return (obj.data.vertices[edge.vertices[1]].co - obj.data.vertices[edge.vertices[0]].co).length + +def get_net_floor_area(obj: bpy.types.Object) -> float: + decompositions = get_obj_decompositions(obj) + if not decompositions: + return get_gross_footprint_area(obj) + + total_net_floor_area = get_net_footprint_area(obj) + + for decomposition in decompositions: + decomposition_type = decomposition.get_info()["type"] + if decomposition_type == "IfcColumn" or decomposition_type == "IfcColumn": + decomposition_obj = tool.Ifc.get_object(decomposition) + net_footprint_obj_area = get_net_footprint_area(decomposition_obj) + total_net_floor_area -= net_footprint_obj_area + + return total_net_floor_area + +def get_gross_ceiling_area(obj: bpy.types.Object) -> float: + decompositions = get_obj_decompositions(obj) + if not decompositions: + return get_gross_top_area(obj) + + total_gross_ceiling_area = 0 + + for decomposition in decompositions: + decomposition_class = decomposition.is_a() + decomposition_predefined_type = ifcopenshell.util.element.get_predefined_type(decomposition) + if decomposition_class == "IfcCovering" and decomposition_predefined_type == "CEILING": + decomposition_obj = tool.Ifc.get_object(decomposition) + total_gross_ceiling_area += get_gross_footprint_area(decomposition_obj) + + return total_gross_ceiling_area + +def get_net_ceiling_area(obj: bpy.types.Object) -> float: + decompositions = get_obj_decompositions(obj) + if not decompositions: + return get_net_top_area(obj) + + total_net_ceiling_area = 0 + + for decomposition in decompositions: + decomposition_class = decomposition.is_a() + decomposition_predefined_type = ifcopenshell.util.element.get_predefined_type(decomposition) + if decomposition_class == "IfcCovering" and decomposition_predefined_type == "CEILING": + decomposition_obj = tool.Ifc.get_object(decomposition) + total_net_ceiling_area += get_net_footprint_area(decomposition_obj) + + if decomposition_class == "IfcWall" or decomposition_class == "IfcColumn": + decomposition_obj = tool.Ifc.get_object(decomposition) + total_net_ceiling_area -= get_net_roofprint_area(decomposition_obj) + + return total_net_ceiling_area + +def get_space_net_volume(obj: bpy.types.Object) -> float: + decompositions = get_obj_decompositions(obj) + if not decompositions: + return get_gross_volume(obj) + + total_space_net_volume = get_gross_volume(obj) + + for decomposition in decompositions: + decomposition_type = decomposition.get_info()["type"] + if decomposition_type == "IfcWall" or decomposition_type == "IfcColumn": + decomposition_obj = tool.Ifc.get_object(decomposition) + total_space_net_volume -= get_net_volume(decomposition_obj) + + return total_space_net_volume + +def get_net_footprint_area(o: bpy.types.Object) -> float: + """_summary_: Returns the area of the footprint of the object, excluding any holes + + :param blender-object o: blender object + :return float: footprint area + """ + area = 0 + for polygon in get_lowest_polygons(o): + area += polygon.area + return area + +def get_gross_footprint_area(o: bpy.types.Object) -> float: + """_summary_: Returns the area of the footprint of the object, without related opening and excluding any holes + + :param blender-object o: blender object + :return float: footprint area""" + if not has_openings(o): + return get_net_footprint_area(o) + + element = tool.Ifc.get_entity(o) + mesh = get_gross_element_mesh(element) + gross_obj = bpy.data.objects.new("GrossObj", mesh) + gross_footprint_area = get_net_footprint_area(gross_obj) + delete_obj(gross_obj) + delete_mesh(mesh) + return gross_footprint_area + +def get_net_roofprint_area(o: bpy.types.Object) -> float: + # Is roofprint the right word? Couldn't think of anything better - vulevukusej + """_summary_: Returns the area of the net roofprint of the object, excluding any holes + + :param blender-object o: Blender Object + :return float: Area + """ + area = 0 + for polygon in get_highest_polygons(o): + area += polygon.area + return area + +def get_side_area(o: bpy.types.Object) -> float: + # There are a few dumb options for this, but this seems the dumbest + # until I get more practical experience on what works best. + x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length + y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length + z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length + return max(x * z, y * z) + +def get_cross_section_area(obj: bpy.types.Object) -> float: + representation = tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) + item = representation.Items[0] + while True: + if item.is_a("IfcExtrudedAreaSolid"): + mesh = create_mesh_from_shape(item.SweptArea) + area = get_mesh_area(mesh) + delete_mesh(mesh) + return area + elif item.is_a("IfcBooleanClippingResult"): + item = item.FirstOperand + else: + area = get_end_area(obj) + return area + # TODO handle other types of sections, and then fall back to mesh parsing + +def get_gross_surface_area(o: bpy.types.Object, vg_index: Optional[int] = None) -> float: + if vg_index is None: + if not has_openings(o): + return get_net_surface_area(o) + + element = tool.Ifc.get_entity(o) + mesh = get_gross_element_mesh(element) + area = get_mesh_area(mesh) + bpy.data.meshes.remove(mesh) + return area + + area = 0 + vertices_in_vg = [v.index for v in o.data.vertices if vg_index in [g.group for g in v.groups]] + for polygon in o.data.polygons: + if is_polygon_in_vg(polygon, vertices_in_vg): + area += polygon.area + return area + +def get_net_surface_area(obj: bpy.types.Object) -> float: + return get_mesh_area(obj.data) + +def get_mesh_area(mesh: bpy.types.Mesh) -> float: + area = 0 + for polygon in mesh.polygons: + area += polygon.area + return area + +def is_polygon_in_vg(polygon: bpy.types.MeshPolygon, vertices_in_vg: list[bpy.types.MeshVertex]) -> bool: + for v in polygon.vertices: + if v not in vertices_in_vg: + return False + return True + +def get_net_volume(o: bpy.types.Object) -> float: + o_mesh = bmesh.new() + o_mesh.from_mesh(o.data) + volume = o_mesh.calc_volume() + o_mesh.free() + return volume + +def get_gross_volume(o: bpy.types.Object) -> float: + if not has_openings(o): + return get_net_volume(o) + + element = tool.Ifc.get_entity(o) + mesh = get_gross_element_mesh(element) + bm = get_bmesh_from_mesh(mesh) + + gross_volume = bm.calc_volume() + + bm.free() + delete_mesh(mesh) + + return gross_volume + +def has_openings( + obj: bpy.types.Object +) -> Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]]: + element = tool.Ifc.get_entity(obj) + return element and getattr(element, "HasOpenings", []) + +def get_obj_decompositions(obj: bpy.types.Object) -> list[ifcopenshell.entity_instance]: + element = tool.Ifc.get_entity(obj) + decompositions = ifcopenshell.util.element.get_decomposition(element) + return decompositions + +def get_gross_weight(obj: bpy.types.Object) -> Union[float, None]: + obj_mass_density = get_obj_mass_density(obj) + if not obj_mass_density: + return + gross_volume = get_gross_volume(obj) + gross_weight = obj_mass_density * gross_volume + return gross_weight + +def get_net_weight(obj: bpy.types.Object) -> Union[float, None]: + obj_mass_density = get_obj_mass_density(obj) + if not obj_mass_density: + return + net_volume = get_net_volume(obj) + net_weight = obj_mass_density * net_volume + return net_weight + +def get_obj_mass_density(obj: bpy.types.Object) -> Union[float, None]: + entity = tool.Ifc.get_entity(obj) + material = ifcopenshell.util.element.get_material(entity) + if material is None: + return + + if ( + material.is_a("IfcMaterialLayerSet") + or material.is_a("IfcMaterialProfileSet") + or material.is_a("IfcMaterialConstituentSet") + ): + return + + if material.is_a("IfcMaterial"): + material_mass_density = ifcopenshell.util.element.get_pset(material, "Pset_MaterialCommon", "MassDensity") + return material_mass_density + + if material.is_a("IfcMaterialLayerSetUsage"): + material_layers = material.ForLayerSet.MaterialLayers + densities = [] + thicknesses = [] + obj_mass_density = 0 + for material_layer in material_layers: + material_mass_density = ifcopenshell.util.element.get_pset( + material_layer.Material, "Pset_MaterialCommon", "MassDensity" + ) + if material_mass_density is None: + return + densities.append(material_mass_density) + thickness = material_layer.LayerThickness + thicknesses.append(thickness) + obj_mass_density = obj_mass_density + (material_mass_density * thickness) + total_thickness = sum(thicknesses) + obj_mass_density = obj_mass_density / total_thickness + return obj_mass_density + + if material.is_a("IfcMaterialProfileSetUsage"): + material_profiles = material.ForProfileSet.MaterialProfiles + if len(material_profiles) == 1: + material_mass_density = ifcopenshell.util.element.get_pset( + material_profiles[0].Material, "Pset_MaterialCommon", "MassDensity" + ) + return material_mass_density + else: + return + +def get_opening_type(opening: bpy.types.Object, obj: bpy.types.Object) -> Literal["OPENING", "RECESS"]: + """_summary_: Returns the opening type - OPENING / RECESS + + :param blender-object opening: blender opening object + :param blender-object obj: blender object + :return string: "OPENING" or "RECESS" + """ + polygons = opening.data.polygons + ray_intersections = 0 + + for polygon in polygons: + normal_vector = (polygon.normal.x, polygon.normal.y, polygon.normal.z) + polygon_centre = (polygon.center.x, polygon.center.y, polygon.center.z) + if obj.ray_cast(polygon_centre, normal_vector)[0]: + ray_intersections += 1 + + # If an odd number of face-normal vectors intersect with the object, then the void is a recess, otherwise it's an opening + return "OPENING" if ray_intersections % 2 == 0 else "RECESS" + +def get_opening_area( + + obj: bpy.types.Object, + angle_z1: int = 45, + angle_z2: int = 135, + min_area: int = 0, + ignore_recesses: bool = False, +) -> float: + """_summary_: Returns the lateral area of the openings in the object. + + :param obj: blender object + :param int angle_z1: Angle measured from the positive z-axis to the normal-vector of the opening area. + Openings with a normal_vector lower than this value will be ignored, defaults to 45 + :param int angle_z2: Angle measured from the positive z-axis to the normal-vector of the opening area. + Openings with a normal_vector greater than this value will be ignored,defaults to 135 + :param float min_area: Minimum opening area to consider. Values lower than this will be ignored, + defaults to 0 + :param bool ignore_recesses: Toggle whether recess areas should be considered, defaults to False + :return float: Opening Area + """ + total_opening_area = 0 + ifc = tool.Ifc.get() + ifc_element = ifc.by_id(obj.BIMObjectProperties.ifc_definition_id) + if len(openings := ifc_element.HasOpenings) != 0: + for opening in openings: + opening_id = opening.RelatedOpeningElement.GlobalId + ifc_opening_element = ifc.by_guid(opening_id) + # bl_opening_obj = tool.Ifc.get_object(ifc_opening_element) + # mesh = bpy.data.meshes.new('myMesh') + mesh = get_gross_element_mesh(ifc_opening_element) + + bl_opening_obj = bpy.data.objects.new("MyObject", mesh) + + opening_type = ( + ifc_opening_element.PredefinedType + if ifc_opening_element.PredefinedType is not None + else get_opening_type(bl_opening_obj, obj) + ) + + if ignore_recesses and opening_type == "RECESS": + continue + + bl_OBB_opening_object = get_OBB_object(bl_opening_obj) + opening_area = get_lateral_area( + # get_OBB_object(bl_opening_obj), angle_z1=angle_z1, angle_z2=angle_z2, exclude_end_areas=True + bl_OBB_opening_object, + angle_z1=angle_z1, + angle_z2=angle_z2, + exclude_end_areas=True, + main_axis="x", + ) + if opening_area >= min_area: + total_opening_area += opening_area + + delete_obj(bl_opening_obj) + delete_mesh(mesh) + delete_obj(bl_OBB_opening_object) + + return total_opening_area + +def get_lateral_area( + + obj: bpy.types.Object, + subtract_openings: bool = True, + exclude_end_areas: bool = False, + exclude_side_areas: bool = False, + angle_z1: int = 45, + angle_z2: int = 135, + main_axis: str = "", +) -> float: + """_summary_ + + :param blender-object obj: blender object, bpy.types.Object + :param bool subtract_openings: Toggle whether opening-areas should be subtracted, defaults to True + :param bool exclude_end_areas: , defaults to False + :param bool exclude_side_areas: , defaults to False + :param int angle_z1: Angle measured from the positive z-axis to the normal-vector of the area. Openings with a normal_vector lower than this value will be ignored, defaults to 45 + :param int angle_z2: Angle measured from the positive z-axis to the normal-vector of the area. Openings with a normal_vector greater than this value will be ignored, defaults to 135 + :param str main_axis: set main axis, for example a wall must have x main axis default 'x' + :return float: Lateral Area + """ + + x_axis = [1, 0, 0] + y_axis = [0, 1, 0] + z_axis = [0, 0, 1] + + if get_object_main_axis(obj) == "x" or main_axis == "x": + main_axis = x_axis + side_axis = y_axis + top_axis = z_axis + elif get_object_main_axis(obj) == "z": + main_axis = z_axis + side_axis = x_axis + top_axis = y_axis + elif get_object_main_axis(obj) == "y": + main_axis = y_axis + side_axis = z_axis + top_axis = x_axis + + area = 0 + total_opening_area = ( + 0 if subtract_openings else get_opening_area(obj, angle_z1=angle_z1, angle_z2=angle_z2) + ) + polygons = obj.data.polygons + + for polygon in polygons: + angle_to_top_axis = math.degrees(polygon.normal.rotation_difference(Vector(top_axis)).angle) + if angle_to_top_axis < angle_z1 or angle_to_top_axis > angle_z2: + continue + if exclude_end_areas: + angle_to_main_axis = math.degrees(polygon.normal.rotation_difference(Vector(main_axis)).angle) + if angle_to_main_axis < 45 or angle_to_main_axis > 135: + continue + if exclude_side_areas: + angle_to_side_axis = math.degrees(polygon.normal.rotation_difference(Vector(side_axis)).angle) + if angle_to_side_axis < 45 or angle_to_side_axis > 135: + continue + area += polygon.area + return area + total_opening_area + +def get_gross_side_area(obj: bpy.types.Object) -> float: + if not has_openings(obj): + return get_net_side_area(obj) + + gross_side_area = get_lateral_area(obj, exclude_end_areas=True, subtract_openings=False, main_axis="x") / 2 + + return gross_side_area + +def get_net_side_area(obj: bpy.types.Object) -> float: + net_side_area = get_lateral_area(obj, exclude_end_areas=True, main_axis="x") / 2 + return net_side_area + +def get_outer_surface_area(obj: bpy.types.Object) -> float: + outer_surface_area = get_lateral_area(obj, exclude_end_areas=True, angle_z1=0, angle_z2=360) + return outer_surface_area + +def get_end_area(obj: bpy.types.Object) -> float: + element = tool.Ifc.get_entity(obj) + gross_mesh = get_gross_element_mesh(element) + gross_obj = bpy.data.objects.new("MyObject", gross_mesh) + + gross_obj.matrix_world = obj.matrix_world + + end_area = get_lateral_area(gross_obj, exclude_side_areas=True) / 2 + + delete_obj(gross_obj) + delete_mesh(gross_mesh) + + return end_area + +def get_gross_top_area(obj: bpy.types.Object, angle: int = 45) -> float: + """_summary_: Returns the gross top area of the object. + + :param blender-object obj: blender object + :param int angle: Angle measured from the positive z-axis to the normal-vector of the area. Values lower than this will be ignored, defaults to 45 + :return float: Gross Top Area + """ + + z_axis = (0, 0, 1) + area = 0 + opening_area = 0 + polygons = obj.data.polygons + + ifc = tool.Ifc.get() + + if len(openings := has_openings(obj)) != 0: + for opening in openings: + if opening.RelatedOpeningElement.PredefinedType == "OPENING": + opening_id = opening.RelatedOpeningElement.GlobalId + + entity = ifc.by_guid(opening_id) + open_obj = tool.Ifc.get_object(entity) + opening_area += get_net_top_area(open_obj, angle=angle) + else: + continue + + for polygon in polygons: + angle_to_z_axis = math.degrees(polygon.normal.rotation_difference(Vector(z_axis)).angle) + + if angle_to_z_axis < angle: + area += polygon.area + return area + opening_area + +# curently net top area is larger then projected area, because its taking into account internal polygons, or window sills +def get_net_top_area(obj: bpy.types.Object, angle: int = 45, ignore_internal: bool = True) -> float: + """_summary_: Returns the net top area of the object. + + :param blender-object obj: blender object + :param int angle: Angle measured from the positive z-axis to the normal-vector of the area. + Values lower than this will be ignored, defaults to 45 + :param bool ignore_internal: Toggle whether internal areas should be subtracted (Like window sills), + defaults to True + :return float: Net Top Area + """ + z_axis = (0, 0, 1) + area = 0 + polygons = obj.data.polygons + + for polygon in polygons: + angle_to_z_axis = math.degrees(polygon.normal.rotation_difference(Vector(z_axis)).angle) + + if angle_to_z_axis < angle: + # offset the raycast, otherwise the raycast will always collide with the object. + offset = polygon.center + Vector((0, 0, 0.01)) + if ignore_internal and obj.ray_cast(offset, (0, 0, 1))[0]: + continue + area += polygon.area + + return area + +def get_projected_area(obj, projection_axis: AxisType = "z", is_gross: bool = True) -> float: + """_summary_: Returns the projected area of the object. + + :param blender-object obj: blender object + :param str projection_axis: Axis to project the area onto. Can be "x", "y" or "z" + :param bool is_gross: if True, the projected area will include openings, if False, the projected area will exclude openings + :return float: Projected Area + """ + + odata = obj.data + polygons = obj.data.polygons + shapely_polygons = [] + + axes = {"x": ["y", "z"], "y": ["x", "z"], "z": ["x", "y"]}[projection_axis] + + for polygon in polygons: + if getattr(polygon.normal, projection_axis) == 0: + continue + polygon_tuples = [] + + for loop_index in polygon.loop_indices: + loop = odata.loops[loop_index] + a = getattr(odata.vertices[loop.vertex_index].co, axes[0]) + b = getattr(odata.vertices[loop.vertex_index].co, axes[1]) + polygon_tuples.append((a, b)) + + pgon = Polygon(polygon_tuples) + shapely_polygons.append(pgon) + + projected_polygon = unary_union(shapely_polygons) + if is_gross: + void_area = 0 + voids = projected_polygon.interiors + for void in voids: + void_polygon = Polygon(void) + void_area += void_polygon.area + return projected_polygon.area + void_area + return projected_polygon.area + +def get_OBB_object(obj: bpy.types.Object) -> bpy.types.Object: + """_summary_: Returns the Oriented-Bounding-Box (OBB) of the object. + + :param blender-object obj: Blender Object + :return blender-object: OBB of the Object + """ + ifc_id = obj.BIMObjectProperties.ifc_definition_id + bbox = obj.bound_box + # matrix transformation to go from obj coordinates to world coordinates: + obb = [Vector(v) for v in bbox] + obb_mesh = bpy.data.meshes.new(f"OBB_{ifc_id}") + + # list of faces, with each tuple referring to an vertex-index in obb + faces = [ + (0, 1, 2, 3), + (7, 6, 5, 4), + (5, 6, 2, 1), + (0, 3, 7, 4), + (0, 4, 5, 1), + (2, 6, 7, 3), + ] + + obb_mesh.from_pydata(vertices=obb, edges=[], faces=faces) + # obb_mesh.transform(obj.matrix_world) + + # create a new object from the mesh + new_OBB_object = bpy.data.objects.new(f"OBB_{ifc_id}", obb_mesh) + new_OBB_object.matrix_world = obj.matrix_world + + # create new collection for QtoCalculator + collection = bpy.data.collections.get("QtoCalculator", bpy.data.collections.new("QtoCalculator")) + if not bpy.context.scene.collection.children.get(collection.name): + bpy.context.scene.collection.children.link(collection) + + # add object to scene collection and then hide them. + collection.objects.get(new_OBB_object.name, collection.objects.link(new_OBB_object)) + if bpy.context.view_layer.objects.get(new_OBB_object.name): + new_OBB_object.hide_set(True) + + return new_OBB_object + +def get_AABB_object(obj: bpy.types.Object) -> bpy.types.Object: + """_summary_: Returns the Axis-Aligned-Bounding-Box (AABB) of the object. + + :param blender-object obj: Blender Object + :return blender-object: AABB of the Object + """ + ifc_id = obj.BIMObjectProperties.ifc_definition_id + aabb_mesh = bpy.data.meshes.new(f"OBB_{ifc_id}") + + x = [v.co.x for v in obj.data.vertices] + y = [v.co.y for v in obj.data.vertices] + z = [v.co.z for v in obj.data.vertices] + + min_x, max_x, min_y, max_y, min_z, max_z = min(x), max(x), min(y), max(y), min(z), max(z) + + vertices = [ + (min_x, min_y, min_z), + (min_x, min_y, max_z), + (min_x, max_y, max_z), + (min_x, max_y, min_z), + (max_x, min_y, min_z), + (max_x, min_y, max_z), + (max_x, max_y, max_z), + (max_x, max_y, min_z), + ] + + faces = [ + (0, 1, 2, 3), + (7, 6, 5, 4), + (5, 6, 2, 1), + (0, 3, 7, 4), + (0, 4, 5, 1), + (2, 6, 7, 3), + ] + + aabb_mesh.from_pydata(vertices=vertices, edges=[], faces=faces) + aabb_mesh.update() + + # create a new object from the mesh + new_AABB_object = bpy.data.objects.new(f"OBB_{ifc_id}", aabb_mesh) + new_AABB_object.matrix_world = obj.matrix_world + + # create new collection for QtoCalculator + collection = bpy.data.collections.get("QtoCalculator", bpy.data.collections.new("QtoCalculator")) + if not bpy.context.scene.collection.children.get(collection.name): + bpy.context.scene.collection.children.link(collection) + + # add object to scene collection and then hide them. + collection.objects.link(new_AABB_object) + if bpy.context.view_layer.objects.get(new_AABB_object.name): + new_AABB_object.hide_set(True) + + return new_AABB_object + +def get_bisected_obj( + + obj: bpy.types.Object, + plane_co_pos: VectorTuple, + plane_no_pos: VectorTuple, + plane_co_neg: VectorTuple, + plane_no_neg: VectorTuple, +) -> bpy.types.Object: + """_summary_: Returns the object bisected by two planes. + + :param blender-object obj: Blender Object + :param tuple(x,y,z) plane_co_pos: Point on upper bisection plane. Example: (0,0,0) + :param tuple(x,y,z) plane_no_pos: Tuple describing the normal vector of the upper bisection plane. Example: (0,0,1) + :param tuple(x,y,z) plane_co_neg: Point on lower bisection plane. Example: (0,0,0) + :param tuple(x,y,z) plane_no_neg: Tuple describing the normal vector of the lower bisection plane. Example: (0,0,-1) + :return _type_: _description_ + """ + ifc_id = obj.BIMObjectProperties.ifc_definition_id + + bis_obj = obj.copy() + bis_obj.data = obj.data.copy() + bis_obj.name = f"Bisected_{ifc_id}" + + collection = bpy.data.collections.get("QtoCalculator", bpy.data.collections.new("QtoCalculator")) + if not bpy.context.scene.collection.children.get(collection.name): + bpy.context.scene.collection.children.link(collection) + + collection.objects.link(bis_obj) + + bpy.ops.object.select_all(action="DESELECT") + bpy.context.view_layer.objects.active = bis_obj + + bpy.ops.object.mode_set(mode="EDIT") + bpy.ops.mesh.select_all(action="SELECT") + + bpy.ops.mesh.bisect(plane_co=plane_co_pos, plane_no=plane_no_pos, use_fill=True, clear_outer=True) + + bpy.ops.mesh.select_all(action="SELECT") + bpy.ops.mesh.bisect(plane_co=plane_co_neg, plane_no=plane_no_neg, use_fill=True, clear_outer=True) + bpy.ops.object.editmode_toggle() + if bpy.context.view_layer.objects.get(bis_obj.name): + bis_obj.hide_set(True) + + return bis_obj + +def get_total_contact_area(obj: bpy.types.Object, class_filter: list[str] = ["IfcElement"]) -> float: + """_summary_: Returns the total contact area of the object with other objects. + + :param blender-object obj: Blender Object + :param list [] class_filter: A list of classes used to filter the objects + to be considered for the calculation. Example: ["IfcWall"] or ["IfcWall", "IfcSlab"] + :return float: Total contact area of the object with other objects. + """ + total_contact_area = 0 + touching_objects = get_touching_objects(obj, class_filter) + + for o in touching_objects: + total_contact_area += get_contact_area(obj, o) + + return total_contact_area + +def get_touching_objects(obj: bpy.types.Object, class_filter: list[str]) -> list[bpy.types.Object]: + """_summary_: Returns a list of objects that are touching the object. + + :param blender-object obj: Blender Object + :param list [] class_filter: A list of classes used to filter the objects + to be considered for the calculation. Example: ["IfcWall"] or ["IfcWall", "IfcSlab"] + :return list: List of touching objects + """ + # rotate the object ever so slightly, otherwise bvhtree.overlap won't work properly. https://blender.stackexchange.com/a/275244/130742 + # I still prefer using bhvtree over ifcclash simply because of the considerable speed improvement @vulevukusej + obj.rotation_euler[0] += math.radians(0.001) + obj.rotation_euler[1] += math.radians(0.001) + bpy.context.evaluated_depsgraph_get().update() + + obj_mesh = bmesh.new() + obj_mesh.from_mesh(obj.data) + obj_mesh.transform(obj.matrix_world) + obj_tree = BVHTree.FromBMesh(obj_mesh) + + touching_objects = [] + filtered_objects = [] + + ifc = tool.Ifc.get() + for f in class_filter: + filtered_objects += ifc.by_type(f) + + for o in filtered_objects: + blender_o = tool.Ifc.get_object(o) + if blender_o == obj: + continue + o_mesh = bmesh.new() + try: + o_mesh.from_mesh(blender_o.data) + except: + # i'm too tired to debug this properly. Not sure what causes this error. @vulevukusej + continue + o_mesh.transform(blender_o.matrix_world) + o_tree = BVHTree.FromBMesh(o_mesh) + + if len(obj_tree.overlap(o_tree)) > 0: + touching_objects.append(blender_o) + + # return the objects to their original states + blender_o.rotation_euler[0] -= math.radians(0.001) + blender_o.rotation_euler[1] -= math.radians(0.001) + bpy.context.evaluated_depsgraph_get().update() + + return touching_objects + +def get_contact_area(object1: bpy.types.Object, object2: bpy.types.Object) -> float: + """_summary_: Returns the contact area between two objects. + + :param blender-object obj: Blender Object + :param blender-object obj: Blender Object + :return float: contact area between the two objects. + """ + # list of tuples, each tuple containing the index of the polygon in object1 and object2 that are touching + total_area = 0 + + for poly1 in object1.data.polygons: + for poly2 in object2.data.polygons: + total_area += get_intersection_between_polygons(object1, poly1, object2, poly2) + return total_area + +def get_intersection_between_polygons( + + object1: bpy.types.Object, + poly1: bpy.types.MeshPolygon, + object2: bpy.types.Object, + poly2: bpy.types.MeshPolygon, +) -> float: + """_summary_: Returns the intersection between two polygons. + + :param blender-object object1: Blender Object + :param blender-polygon poly1: Blender Polygon + :param blender-object object1: Blender Object + :param blender-polygon poly1: Blender Polygon + :return float: intersection area of the two polygons. + """ + # get normal vectors according to world axis + normal1 = object1.rotation_euler.to_matrix() @ poly1.normal + center1 = object1.matrix_world @ poly1.center + normal2 = object2.rotation_euler.to_matrix() @ poly2.normal + center2 = object2.matrix_world @ poly2.center + + angle_between_normals = normal1.rotation_difference(normal2).angle + + if math.degrees(angle_between_normals) < 178: + return 0 + + # touching polygons should be coplanar: + plane_intersection = mathutils.geometry.intersect_plane_plane(center1, normal1, center2, normal2) + + # sometimes coplanar planes will interesect far off into the distance. This is a crude way of filtering out those intersections. + if plane_intersection[0] is None or (plane_intersection[0] - center1).magnitude > 20: + return 0 + + # calculate rotation between face and vertical Z-axis. This makes it easier to calculate intersection area later + rotation_to_z = normal1.rotation_difference(Vector((0, 0, 1))) + center_of_rotation = center1 + + # rotation around face.center in world space / https://blender.stackexchange.com/a/12324/130742 + trans_matrix = Matrix.Translation(center_of_rotation) @ rotation_to_z.to_matrix().to_4x4() + + pgon1 = create_shapely_polygon(object1, poly1, trans_matrix) + pgon2 = create_shapely_polygon(object2, poly2, trans_matrix) + + try: + return pgon1.intersection(pgon2).area + except: + # TopologicalError - Generated Geometry might be invalid + return 0 + +def create_shapely_polygon( + obj: bpy.types.Object, polygon: bpy.types.MeshPolygon, trans_matrix: Matrix +) -> Polygon: + """_summary_: Create a shapely polygon + + :param blender-object obj: Blender Object + :param blender-polygon polygon: Blender Polygon + :param matrix trans_matrix: Matrix that rotates the polygon to face upwards + :return Shapely Polygon: Shapely Polygon + """ + polygon_tuples = [] + odata = obj.data + for loop_index in polygon.loop_indices: + loop = odata.loops[loop_index] + coords = obj.matrix_world @ odata.vertices[loop.vertex_index].co + rotated_coords = trans_matrix @ coords + x = rotated_coords.x + y = rotated_coords.y + polygon_tuples.append((x, y)) + return Polygon(polygon_tuples) + +def get_gross_element_mesh(element: ifcopenshell.entity_instance) -> bpy.types.Mesh: + settings = ifcopenshell.geom.settings() + settings.set(settings.DISABLE_OPENING_SUBTRACTIONS, True) + return create_mesh_from_shape(element, settings) + +def create_mesh_from_shape( + element: ifcopenshell.entity_instance, settings: Optional[ifcopenshell.geom.settings] = None +) -> bpy.types.Mesh: + if settings is None: + settings = ifcopenshell.geom.settings() + shape = ifcopenshell.geom.create_shape(settings, element) + geometry = shape.geometry if element.is_a("IfcRoot") else shape + faces = geometry.faces + verts = geometry.verts + + mesh = bpy.data.meshes.new("myBeautifulMesh") + + num_vertices = len(verts) // 3 + total_faces = len(faces) + loop_start = range(0, total_faces, 3) + num_loops = total_faces // 3 + loop_total = [3] * num_loops + num_vertex_indices = len(faces) + + mesh.vertices.add(num_vertices) + mesh.vertices.foreach_set("co", verts) + mesh.loops.add(num_vertex_indices) + mesh.loops.foreach_set("vertex_index", faces) + mesh.polygons.add(num_loops) + mesh.polygons.foreach_set("loop_start", loop_start) + mesh.polygons.foreach_set("loop_total", loop_total) + mesh.update() + return mesh + +def get_bmesh_from_mesh(mesh: bpy.types.Mesh) -> bmesh.types.BMesh: + bm = bmesh.new() + bm.from_mesh(mesh) + return bm + +def get_object_main_axis(o: bpy.types.Object) -> AxisType: + """_summary_: Returns the main object axis. Useful for profile-defined objects. + + :param blender-object o: Blender Object + :return str: main axis x or y or z + """ + x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length + y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length + z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length + + if x >= y and x > z: + return "x" + if y > z and y > x: + return "y" + if z > x and z > y: + return "z" + else: + return "x" + +def is_opening_horizontal(o: bpy.types.Object) -> bool: + x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length + y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length + z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length + + return z < x and z < y + +def delete_mesh(mesh: bpy.types.Mesh) -> None: + mesh.user_clear() + bpy.data.meshes.remove(mesh) + +def delete_obj(obj: bpy.types.Object) -> None: + bpy.data.objects.remove(obj, do_unlink=True) + + +# # Following code is here temporarily to test newly created functions: + +# qto = QtoCalculator() +# o = bpy.context.active_object +# sel = bpy.context.selected_objects +# +# nl = '\n' +# print( +# f"get_linear_length: {qto.get_linear_length(o)}{nl}{nl}" +# f"get_width: {qto.get_width(o)}{nl}{nl}" +# f"get_height: {qto.get_height(o)}{nl}{nl}" +# f"get_perimeter: {qto.get_perimeter(o)}{nl}{nl}" +# f"get_lowest_polygons: {qto.get_lowest_polygons(o)}{nl}{nl}" +# f"get_highest_polygons: {qto.get_highest_polygons(o)}{nl}{nl}" +# f"get_net_footprint_area: {qto.get_net_footprint_area(o)}{nl}{nl}" +# f"get_net_roofprint_area: {qto.get_net_roofprint_area(o)}{nl}{nl}" +# f"get_side_area: {qto.get_side_area(o)}{nl}{nl}" +# f"get_gross_surface_area: {qto.get_gross_surface_area(o)}{nl}{nl}" +# f"get_volume: {qto.get_volume(o)}{nl}{nl}" +# f"get_opening_area(o, angle_z1=45, angle_z2=135, min_area=0, ignore_recesses=False): {qto.get_opening_area(o, angle_z1=45, angle_z2=135, min_area=0, ignore_recesses=False)}{nl}{nl}" +# f"get_lateral_area(o, subtract_openings=True, exclude_end_areas=False, exclude_side_areas=False, angle_z1=45, angle_z2=135): {qto.get_lateral_area(o, subtract_openings=True, exclude_end_areas=False, exclude_side_areas=False, angle_z1=45, angle_z2=135)}{nl}{nl}" +# f"get_gross_top_area: {qto.get_gross_top_area(o, angle=45)}{nl}{nl}" +# f"get_net_top_area(o, angle=45, ignore_internal=True): {qto.get_net_top_area(o, angle=45, ignore_internal=True)}{nl}{nl}" +# f"get_projected_area(o, projection_axis='z', is_gross=True): {qto.get_projected_area(o, projection_axis='z', is_gross=True)}{nl}{nl}" +# f"get_OBB_object: {qto.get_OBB_object(o)}{nl}{nl}" +# f"get_AABB_object: {qto.get_AABB_object(o)}{nl}{nl}" +# f"get_bisected_obj(o, plane_co_pos=(0,0,1), plane_no_pos=(0,0,1), plane_co_neg=(0,0,1), plane_no_neg=(0,0,1)): {qto.get_bisected_obj(o, plane_co_pos=(0,0,1), plane_no_pos=(0,0,1), plane_co_neg=(0,0,1), plane_no_neg=(0,0,1))}{nl}{nl}" +# f"get_total_contact_area(o, class_filter=['IfcWall', 'IfcSlab']): {qto.get_total_contact_area(o, class_filter=['IfcWall', 'IfcSlab'])}{nl}{nl}" +# f"get_touching_objects(o, ['IfcElement']): {qto.get_touching_objects(o, ['IfcElement'])}{nl}{nl}" +# #f"get_contact_area: {qto.get_contact_area(o)}{nl}{nl}" +# ) diff --git a/src/blenderbim/blenderbim/tool/pset.py b/src/blenderbim/blenderbim/tool/pset.py index 2ed45f2056..9f297753f3 100644 --- a/src/blenderbim/blenderbim/tool/pset.py +++ b/src/blenderbim/blenderbim/tool/pset.py @@ -23,7 +23,6 @@ import blenderbim.core.tool import blenderbim.tool as tool import blenderbim.bim.schema from typing import Union -from blenderbim.bim.module.pset.calc_quantity_function_mapper import mapper class Pset(blenderbim.core.tool.Pset): diff --git a/src/blenderbim/blenderbim/tool/qto.py b/src/blenderbim/blenderbim/tool/qto.py index 55e5564109..99e9317b7f 100644 --- a/src/blenderbim/blenderbim/tool/qto.py +++ b/src/blenderbim/blenderbim/tool/qto.py @@ -16,20 +16,17 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . -from types import ClassMethodDescriptorType import bpy import blenderbim.core.tool +import blenderbim.bim.schema import blenderbim.tool as tool import ifcopenshell -from mathutils import Vector -from ifcopenshell import util import ifcopenshell.util.unit import ifcopenshell.util.element -from blenderbim.bim.module.pset.qto_calculator import QtoCalculator, QuanityTypes -from blenderbim.bim.module.pset.calc_quantity_function_mapper import mapper -import blenderbim.bim.schema +from mathutils import Vector from typing import Optional, Union, Literal +QuantityTypes = Literal["Q_LENGTH", "Q_AREA", "Q_VOLUME"] class Qto(blenderbim.core.tool.Qto): @classmethod @@ -101,7 +98,7 @@ class Qto(blenderbim.core.tool.Qto): value: float, qto_name: Optional[str] = None, quantity_name: Optional[str] = None, - quantity_type: Optional[QuanityTypes] = None, + quantity_type: Optional[QuantityTypes] = None, ) -> Union[float, None]: """You can either specify `quantity_type` or provide `qto_name/quantity_name` to let method figure the `quantity_type` from the templates diff --git a/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json b/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json index b5e5d8b014..3211ee6724 100644 --- a/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json +++ b/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json @@ -1,5 +1,5 @@ { - "name": "IFC4 Base Quantities", + "name": "IFC4 Base Quantities - IfcOpenShell", "description": "This ruleset quantifies every single possible standardised base quantity in IFC4 using only IfcOpenShell as a geometry processor.", "calculators": { "IOSTriangulation": { diff --git a/src/ifc5d/ifc5d/IFC4QtoBaseQuantitiesBlender.json b/src/ifc5d/ifc5d/IFC4QtoBaseQuantitiesBlender.json new file mode 100644 index 0000000000..3dcfd882ac --- /dev/null +++ b/src/ifc5d/ifc5d/IFC4QtoBaseQuantitiesBlender.json @@ -0,0 +1,637 @@ +{ + "name": "IFC4 Base Quantities - Blender", + "description": "This ruleset quantifies every single possible standardised base quantity in IFC4 using Blender.", + "calculators": { + "Blender": { + "IfcActuator": { + "Qto_ActuatorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcAirTerminal": { + "Qto_AirTerminalBaseQuantities": { + "GrossWeight": null, + "Perimeter": null, + "TotalSurfaceArea": null + } + }, + "IfcAirTerminalBox": { + "Qto_AirTerminalBoxTypeBaseQuantities": { + "GrossWeight": null + } + }, + "IfcAirToAirHeatRecovery": { + "Qto_AirToAirHeatRecoveryBaseQuantities": { + "GrossWeight": null + } + }, + "IfcAlarm": { + "Qto_AlarmBaseQuantities": { + "GrossWeight": null + } + }, + "IfcAudioVisualAppliance": { + "Qto_AudioVisualApplianceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcBeam": { + "Qto_BeamBaseQuantities": { + "CrossSectionArea": "get_cross_section_area", + "GrossSurfaceArea": "get_gross_surface_area", + "GrossVolume": "get_gross_volume", + "GrossWeight": "get_gross_weight", + "Length": "get_length", + "NetSurfaceArea": "get_net_surface_area", + "NetVolume": "get_net_volume", + "NetWeight": "get_net_weight", + "OuterSurfaceArea": "get_outer_surface_area" + } + }, + "IfcBoiler": { + "Qto_BoilerBaseQuantities": { + "GrossWeight": null, + "NetWeight": null, + "TotalSurfaceArea": null + } + }, + "IfcBuilding": { + "Qto_BuildingBaseQuantities": { + "EavesHeight": null, + "FootprintArea": null, + "GrossFloorArea": null, + "GrossVolume": null, + "Height": null, + "NetFloorArea": null, + "NetVolume": null + } + }, + "IfcBuildingElementProxy": { + "Qto_BuildingElementProxyQuantities": { + "NetSurfaceArea": "get_net_surface_area", + "NetVolume": "get_net_volume" + } + }, + "IfcBuildingStorey": { + "Qto_BuildingStoreyBaseQuantities": { + "GrossFloorArea": null, + "GrossHeight": null, + "GrossPerimeter": null, + "GrossVolume": null, + "NetFloorArea": null, + "NetHeigtht": null, + "NetVolume": null + } + }, + "IfcBurner": { + "Qto_BurnerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCableCarrierFitting": { + "Qto_CableCarrierFittingBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCableCarrierSegment": { + "Qto_CableCarrierSegmentBaseQuantities": { + "CrossSectionArea": null, + "GrossWeight": null, + "Length": null, + "OuterSurfaceArea": null + } + }, + "IfcCableFitting": { + "Qto_CableFittingBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCableSegment": { + "Qto_CableSegmentBaseQuantities": { + "CrossSectionArea": null, + "GrossWeight": null, + "Length": "get_length", + "OuterSurfaceArea": "get_outer_surface_area" + } + }, + "IfcChiller": { + "Qto_ChillerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcChimney": { + "Qto_ChimneyBaseQuantities": { + "Length": "get_height" + } + }, + "IfcCoil": { + "Qto_CoilBaseQuantities": { + "GrossWeight": null + } + }, + "IfcColumn": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": "get_cross_section_area", + "GrossSurfaceArea": "get_gross_surface_area", + "GrossVolume": "get_gross_volume", + "GrossWeight": "get_gross_weight", + "Length": "get_length", + "NetSurfaceArea": "get_net_surface_area", + "NetVolume": "get_net_volume", + "NetWeight": "get_net_weight", + "OuterSurfaceArea": "get_outer_surface_area" + } + }, + "IfcCommunicationsAppliance": { + "Qto_CommunicationsApplianceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCompressor": { + "Qto_CompressorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCondenser": { + "Qto_CondenserBaseQuantities": { + "GrossWeight": null + } + }, + "IfcConstructionEquipmentResource": { + "Qto_ConstructionEquipmentResourceBaseQuantities": { + "OperatingTime": null, + "UsageTime": null + } + }, + "IfcConstructionMaterialResource": { + "Qto_ConstructionMaterialResourceBaseQuantities": { + "GrossVolume": "get_gross_volume", + "GrossWeight": null, + "NetVolume": "get_net_volume", + "NetWeight": null + } + }, + "IfcController": { + "Qto_ControllerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCooledBeam": { + "Qto_CooledBeamBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCoolingTower": { + "Qto_CoolingTowerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcCovering": { + "Qto_CoveringBaseQuantities": { + "GrossArea": "get_covering_gross_area", + "NetArea": "get_covering_net_area", + "Width": "get_covering_width" + } + }, + "IfcCurtainWall": { + "Qto_CurtainWallQuantities": { + "GrossSideArea": null, + "Height": null, + "Length": null, + "NetSideArea": null, + "Width": null + } + }, + "IfcDamper": { + "Qto_DamperBaseQuantities": { + "GrossWeight": null + } + }, + "IfcDistributionChamberElement": { + "Qto_DistributionChamberElementBaseQuantities": { + "GrossSurfaceArea": "get_gross_surface_area", + "GrossVolume": "get_gross_volume", + "NetSurfaceArea": "get_net_surface_area", + "NetVolume": "get_net_volume" + } + }, + "IfcDoor": { + "Qto_DoorBaseQuantities": { + "Area": "get_net_side_area", + "Height": "get_height", + "Perimeter": "get_rectangular_perimeter", + "Width": "get_length" + } + }, + "IfcDuctFitting": { + "Qto_DuctFittingBaseQuantities": { + "GrossCrossSectionArea": null, + "GrossWeight": null, + "Length": "get_length", + "NetCrossSectionArea": null, + "OuterSurfaceArea": "get_outer_surface_area" + } + }, + "IfcDuctSegment": { + "Qto_DuctSegmentBaseQuantities": { + "GrossCrossSectionArea": null, + "GrossWeight": null, + "Length": "get_length", + "NetCrossSectionArea": null, + "OuterSurfaceArea": "get_outer_surface_area" + } + }, + "IfcDuctSilencer": { + "Qto_DuctSilencerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcElectricAppliance": { + "Qto_ElectricApplianceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcElectricDistributionBoard": { + "Qto_ElectricDistributionBoardBaseQuantities": { + "GrossWeight": null, + "NumberOfCircuits": null + } + }, + "IfcElectricFlowStorageDevice": { + "Qto_ElectricFlowStorageDeviceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcElectricGenerator": { + "Qto_ElectricGeneratorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcElectricMotor": { + "Qto_ElectricMotorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcElectricTimeControl": { + "Qto_ElectricTimeControlBaseQuantities": { + "GrossWeight": null + } + }, + "IfcEvaporativeCooler": { + "Qto_EvaporativeCoolerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcEvaporator": { + "Qto_EvaporatorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFan": { + "Qto_FanBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFilter": { + "Qto_FilterBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFireSuppressionTerminal": { + "Qto_FireSuppressionTerminalBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFlowInstrument": { + "Qto_FlowInstrumentBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFlowMeter": { + "Qto_FlowMeterBaseQuantities": { + "GrossWeight": null + } + }, + "IfcFooting": { + "Qto_FootingBaseQuantities": { + "CrossSectionArea": "get_cross_section_area", + "GrossSurfaceArea": "get_gross_surface_area", + "GrossVolume": "get_gross_volume", + "GrossWeight": "get_gross_weight", + "Height": "get_height", + "Length": "get_length", + "NetVolume": "get_net_volume", + "NetWeight": "get_net_weight", + "OuterSurfaceArea": "get_outer_surface_area", + "Width": "get_width" + } + }, + "IfcHeatExchanger": { + "Qto_HeatExchangerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcHumidifier": { + "Qto_HumidifierBaseQuantities": { + "GrossWeight": null + } + }, + "IfcInterceptor": { + "Qto_InterceptorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcJunctionBox": { + "Qto_JunctionBoxBaseQuantities": { + "GrossWeight": null, + "NumberOfGangs": null + } + }, + "IfcLaborResource": { + "Qto_LaborResourceBaseQuantities": { + "OvertimeWork": null, + "StandardWork": null + } + }, + "IfcLamp": { + "Qto_LampBaseQuantities": { + "GrossWeight": null + } + }, + "IfcLightFixture": { + "Qto_LightFixtureBaseQuantities": { + "GrossWeight": null + } + }, + "IfcMember": { + "Qto_MemberBaseQuantities": { + "CrossSectionArea": "get_cross_section_area", + "GrossSurfaceArea": "get_gross_surface_area", + "GrossVolume": "get_gross_volume", + "GrossWeight": "get_gross_weight", + "Length": "get_length", + "NetSurfaceArea": "get_net_surface_area", + "NetVolume": "get_net_volume", + "NetWeight": "get_net_weight", + "OuterSurfaceArea": "get_outer_surface_area" + } + }, + "IfcMotorConnection": { + "Qto_MotorConnectionBaseQuantities": { + "GrossWeight": null + } + }, + "IfcOpeningElement": { + "Qto_OpeningElementBaseQuantities": { + "Area": "get_opening_mapping_area", + "Depth": "get_opening_depth", + "Height": "get_opening_height", + "Volume": "get_net_volume", + "Width": "get_length" + } + }, + "IfcOutlet": { + "Qto_OutletBaseQuantities": { + "GrossWeight": null + } + }, + "IfcPile": { + "Qto_PileBaseQuantities": { + "CrossSectionArea": "get_cross_section_area", + "GrossSurfaceArea": "get_gross_surface_area", + "GrossVolume": "get_gross_volume", + "GrossWeight": "get_gross_weight", + "Length": "get_length", + "NetVolume": "get_net_volume", + "NetWeight": "get_net_weight", + "OuterSurfaceArea": "get_outer_surface_area" + } + }, + "IfcPipeFitting": { + "Qto_PipeFittingBaseQuantities": { + "GrossCrossSectionArea": null, + "GrossWeight": null, + "Length": null, + "NetCrossSectionArea": null, + "NetWeight": null, + "OuterSurfaceArea": null + } + }, + "IfcPipeSegment": { + "Qto_PipeSegmentBaseQuantities": { + "GrossCrossSectionArea": null, + "GrossWeight": "get_gross_weight", + "Length": "get_length", + "NetCrossSectionArea": "get_cross_section_area", + "NetWeight": "get_net_weight", + "OuterSurfaceArea": "get_outer_surface_area" + } + }, + "IfcPlate": { + "Qto_PlateBaseQuantities": { + "GrossArea": "get_gross_footprint_area", + "GrossVolume": "get_gross_volume", + "GrossWeight": "get_gross_weight", + "NetArea": "get_net_footprint_area", + "NetVolume": "get_net_volume", + "NetWeight": "get_net_weight", + "Perimeter": "get_gross_perimeter", + "Width": "get_height" + } + }, + "IfcProjectionElement": { + "Qto_ProjectionElementBaseQuantities": { + "Area": "get_net_side_area", + "Volume": "get_net_volume" + } + }, + "IfcProtectiveDevice": { + "Qto_ProtectiveDeviceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcProtectiveDeviceTrippingUnit": { + "Qto_ProtectiveDeviceTrippingUnitBaseQuantities": { + "GrossWeight": null + } + }, + "IfcPump": { + "Qto_PumpBaseQuantities": { + "GrossWeight": null + } + }, + "IfcRailing": { + "Qto_RailingBaseQuantities": { + "Length": "get_length" + } + }, + "IfcRampFlight": { + "Qto_RampFlightBaseQuantities": { + "GrossArea": "get_gross_stair_area", + "GrossVolume": "get_gross_volume", + "Length": "get_stair_length", + "NetArea": "get_net_stair_area", + "NetVolume": "get_net_volume", + "Width": "get_width" + } + }, + "IfcReinforcingElement": { + "Qto_ReinforcingElementBaseQuantities": { + "Count": null, + "Length": "get_length", + "Weight": null + } + }, + "IfcRoof": { + "Qto_RoofBaseQuantities": { + "GrossArea": "get_gross_top_area", + "NetArea": "get_net_top_area", + "ProjectedArea": null + } + }, + "IfcSanitaryTerminal": { + "Qto_SanitaryTerminalBaseQuantities": { + "GrossWeight": null + } + }, + "IfcSensor": { + "Qto_SensorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcSite": { + "Qto_SiteBaseQuantities": { + "GrossArea": "get_gross_footprint_area", + "GrossPerimeter": "get_gross_perimeter" + } + }, + "IfcSlab": { + "Qto_SlabBaseQuantities": { + "Depth": "get_height", + "GrossArea": "get_gross_footprint_area", + "GrossVolume": "get_gross_volume", + "GrossWeight": "get_gross_weight", + "Length": "get_length", + "NetArea": "get_net_footprint_area", + "NetVolume": "get_net_volume", + "NetWeight": "get_net_weight", + "Perimeter": "get_gross_perimeter", + "Width": "get_width" + } + }, + "IfcSolarDevice": { + "Qto_SolarDeviceBaseQuantities": { + "GrossArea": null, + "GrossWeight": null + } + }, + "IfcSpace": { + "Qto_SpaceBaseQuantities": { + "FinishCeilingHeight": "get_finish_ceiling_height", + "FinishFloorHeight": "get_finish_floor_height", + "GrossCeilingArea": "get_gross_ceiling_area", + "GrossFloorArea": "get_gross_footprint_area", + "GrossPerimeter": "get_gross_perimeter", + "GrossVolume": "get_gross_volume", + "GrossWallArea": null, + "Height": "get_height", + "NetCeilingArea": "get_net_ceiling_area", + "NetFloorArea": "get_net_floor_area", + "NetPerimeter": null, + "NetVolume": "get_space_net_volume", + "NetWallArea": null + } + }, + "IfcSpaceHeater": { + "Qto_SpaceHeaterBaseQuantities": { + "GrossWeight": null, + "Length": "get_length", + "NetWeight": null + } + }, + "IfcStackTerminal": { + "Qto_StackTerminalBaseQuantities": { + "GrossWeight": null + } + }, + "IfcStairFlight": { + "Qto_StairFlightBaseQuantities": { + "GrossVolume": "get_gross_volume", + "Length": "get_stair_length", + "NetVolume": "get_net_volume" + } + }, + "IfcSwitchingDevice": { + "Qto_SwitchingDeviceBaseQuantities": { + "GrossWeight": null + } + }, + "IfcTank": { + "Qto_TankBaseQuantities": { + "GrossWeight": null, + "NetWeight": null, + "TotalSurfaceArea": "get_outer_surface_area" + } + }, + "IfcTransformer": { + "Qto_TransformerBaseQuantities": { + "GrossWeight": null + } + }, + "IfcTubeBundle": { + "Qto_TubeBundleBaseQuantities": { + "GrossWeight": null, + "NetWeight": null + } + }, + "IfcUnitaryControlElement": { + "Qto_UnitaryControlElementBaseQuantities": { + "GrossWeight": null + } + }, + "IfcUnitaryEquipment": { + "Qto_UnitaryEquipmentBaseQuantities": { + "GrossWeight": null + } + }, + "IfcValve": { + "Qto_ValveBaseQuantities": { + "GrossWeight": null + } + }, + "IfcVibrationIsolator": { + "Qto_VibrationIsolatorBaseQuantities": { + "GrossWeight": null + } + }, + "IfcWall": { + "Qto_WallBaseQuantities": { + "GrossFootprintArea": "get_gross_footprint_area", + "GrossSideArea": "get_gross_side_area", + "GrossVolume": "get_gross_volume", + "GrossWeight": "get_gross_weight", + "Height": "get_height", + "Length": "get_length", + "NetFootprintArea": "get_net_footprint_area", + "NetSideArea": "get_net_side_area", + "NetVolume": "get_net_volume", + "NetWeight": "get_net_weight", + "Width": "get_width" + } + }, + "IfcWasteTerminal": { + "Qto_WasteTerminalBaseQuantities": { + "GrossWeight": null + } + }, + "IfcWindow": { + "Qto_WindowBaseQuantities": { + "Area": "get_net_side_area", + "Height": "get_height", + "Perimeter": "get_rectangular_perimeter", + "Width": "get_length" + } + } + } + } +} diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index ff322073a8..5957abbdc8 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -38,7 +38,8 @@ def quantify(ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_inst calculator = calculators[calculator] for query, qtos in queries.items(): filtered_elements = ifcopenshell.util.selector.filter_elements(ifc_file, query, elements) - calculator.calculate(ifc_file, filtered_elements, qtos, results) + if filtered_elements: + calculator.calculate(ifc_file, filtered_elements, qtos, results) return results @@ -59,15 +60,12 @@ class IOSTriangulation: ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_instance], qtos: dict, - results: Optional[dict] = None, + results: dict, ): import ifcopenshell import ifcopenshell.geom import ifcopenshell.util.shape - if results is None: - results = {} - formula_functions = {} gross_settings = ifcopenshell.geom.settings() @@ -109,8 +107,6 @@ class IOSTriangulation: if not iterator.next(): break - return results - @staticmethod def create_iterator(ifc_file, settings, elements): return ifcopenshell.geom.iterator(settings, ifc_file, multiprocessing.cpu_count(), include=elements) @@ -118,18 +114,23 @@ class IOSTriangulation: class Blender: @staticmethod - def calculate(ifc_file, elements, qtos): + def calculate(ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_instance], qtos: dict, results: dict): import blenderbim.tool as tool + import blenderbim.bim.module.qto.calculator as calculator + + formula_functions = {} for element in elements: obj = tool.Ifc.get_object(element) if not obj: continue - + results.setdefault(element, {}) for name, quantities in qtos.items(): + results[element].setdefault(name, {}) for quantity, formula in quantities.items(): - getattr(tool.Qto, formula) - # TODO + if not (formula_function := formula_functions.get(formula)): + formula_function = formula_functions[formula] = getattr(calculator, formula) + results[element][name][quantity] = formula_function(obj) calculators = {"Blender": Blender, "IOSTriangulation": IOSTriangulation} From 8c3d10a2bd62fd94dfd0c909afd6802473dbbcc0 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 15:14:11 +1000 Subject: [PATCH 325/429] Reimplement manual qty calculator using autodetected calculator functions and redo qto UI --- .../blenderbim/bim/module/pset/operator.py | 2 - .../blenderbim/bim/module/qto/__init__.py | 9 +- .../blenderbim/bim/module/qto/calculator.py | 96 +++++++++++--- .../blenderbim/bim/module/qto/data.py | 30 ++--- .../blenderbim/bim/module/qto/operator.py | 119 ++++------------- .../blenderbim/bim/module/qto/prop.py | 57 ++++---- .../blenderbim/bim/module/qto/ui.py | 125 ++++++++++++------ src/blenderbim/blenderbim/core/qto.py | 23 +--- src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json | 2 +- src/ifc5d/ifc5d/qto.py | 57 ++++++-- 10 files changed, 282 insertions(+), 238 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index 8896cd3f15..b3d55ba5e0 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -27,10 +27,8 @@ import blenderbim.bim.helper import blenderbim.bim.handler import blenderbim.tool as tool import blenderbim.core.pset as core -import blenderbim.core.qto as QtoCore import blenderbim.bim.module.pset.data from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.pset.qto_calculator import QtoCalculator class Operator: diff --git a/src/blenderbim/blenderbim/bim/module/qto/__init__.py b/src/blenderbim/blenderbim/bim/module/qto/__init__.py index 9924927fa0..dada98ae88 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/qto/__init__.py @@ -20,16 +20,17 @@ import bpy from . import ui, prop, operator classes = ( - operator.AssignBaseQto, operator.CalculateCircleRadius, operator.CalculateEdgeLengths, operator.CalculateFaceAreas, operator.CalculateObjectVolumes, - operator.ExecuteQtoMethod, + operator.CalculateSingleQuantity, operator.PerformQuantityTakeOff, - operator.QuantifyObjects, prop.BIMQtoProperties, - ui.BIM_PT_qto_utilities, + ui.BIM_PT_qto, + ui.BIM_PT_qto_manual, + ui.BIM_PT_qto_simple, + ui.BIM_PT_qto_cost, ) diff --git a/src/blenderbim/blenderbim/bim/module/qto/calculator.py b/src/blenderbim/blenderbim/bim/module/qto/calculator.py index 874bf37e72..bb9456cc50 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/calculator.py +++ b/src/blenderbim/blenderbim/bim/module/qto/calculator.py @@ -38,17 +38,19 @@ VectorTuple = tuple[float, float, float] def get_units(o: bpy.types.Object, vg_index: int) -> int: return len([v for v in o.data.vertices if vg_index in [g.group for g in v.groups]]) -def get_linear_length(o: bpy.types.Object) -> float: - """_summary_: Returns the length of the longest edge of the object bounding box - :param blender-object o: Blender Object - :return float: Length +def get_linear_length(o: bpy.types.Object) -> float: + """Returns the length of the longest edge of the object bounding box + + :param o: Blender Object + :return: Length """ x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length return max(x, y, z) + def get_length(o: bpy.types.Object, vg_index: Optional[int] = None, main_axis: str = "x") -> float: if vg_index is None: x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length @@ -74,22 +76,26 @@ def get_length(o: bpy.types.Object, vg_index: Optional[int] = None, main_axis: s length += get_edge_distance(o, e) return length + def get_stair_length(obj: bpy.types.Object) -> float: length = get_length(obj) height = get_height(obj) stair_length = math.sqrt(pow(length, 2) + pow(height, 2)) return stair_length + def get_net_stair_area(obj: bpy.types.Object) -> float: OBB_obj = get_OBB_object(obj) OBB_net_footprint_area = get_net_footprint_area(OBB_obj) return OBB_net_footprint_area + def get_gross_stair_area(obj: bpy.types.Object) -> float: OBB_obj = get_OBB_object(obj) OBB_gross_footprint_area = get_gross_footprint_area(OBB_obj) return OBB_gross_footprint_area + def get_parametric_axis(obj: bpy.types.Object) -> Literal["AXIS2", "AXIS3", None]: relating_type = ifcopenshell.util.element.get_type(tool.Ifc.get_entity(obj)) if relating_type: @@ -105,6 +111,7 @@ def get_parametric_axis(obj: bpy.types.Object) -> Literal["AXIS2", "AXIS3", None return None return None + def get_covering_gross_area(obj: bpy.types.Object) -> float: parametrix_axis = get_parametric_axis(obj) if not parametrix_axis: @@ -114,6 +121,7 @@ def get_covering_gross_area(obj: bpy.types.Object) -> float: elif parametrix_axis == "AXIS3": return get_gross_footprint_area(obj) + def get_covering_net_area(obj: bpy.types.Object) -> float: parametrix_axis = get_parametric_axis(obj) if not parametrix_axis: @@ -123,6 +131,7 @@ def get_covering_net_area(obj: bpy.types.Object) -> float: elif parametrix_axis == "AXIS3": return get_net_footprint_area(obj) + def get_covering_width(obj: bpy.types.Object) -> float: parametrix_axis = get_parametric_axis(obj) if not parametrix_axis: @@ -132,6 +141,7 @@ def get_covering_width(obj: bpy.types.Object) -> float: elif parametrix_axis == "AXIS3": return get_height(obj) + def get_width(o: bpy.types.Object) -> float: """_summary_: Returns the width of the object bounding box @@ -142,6 +152,7 @@ def get_width(o: bpy.types.Object) -> float: y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length return min(x, y) + def get_height(o: bpy.types.Object) -> float: """_summary_: Returns the height of the object bounding box @@ -150,38 +161,45 @@ def get_height(o: bpy.types.Object) -> float: """ return (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length + def get_opening_height(obj: bpy.types.Object) -> float: if is_opening_horizontal(obj): return get_width(obj) else: return get_height(obj) + def get_opening_depth(obj: bpy.types.Object) -> float: if is_opening_horizontal(obj): return get_height(obj) else: return get_width(obj) + def get_opening_mapping_area(obj: bpy.types.Object) -> float: if is_opening_horizontal(obj): return get_net_footprint_area(obj) else: return get_net_side_area(obj) + def get_finish_ceiling_height(obj: bpy.types.Object) -> float: floor_height = get_finish_floor_height(obj) ceiling_height = get_ceiling_height(obj) finish_ceiling_height = ceiling_height - floor_height return finish_ceiling_height + def get_max_global_z(obj: bpy.types.Object) -> float: z_values = [(obj.matrix_world @ Vector(co))[2] for co in obj.bound_box] return max(z_values) + def get_min_global_z(obj: bpy.types.Object) -> float: z_values = [(obj.matrix_world @ Vector(co))[2] for co in obj.bound_box] return min(z_values) + def get_finish_floor_height(obj: bpy.types.Object) -> float: space_min_z_value = get_min_global_z(obj) @@ -200,6 +218,7 @@ def get_finish_floor_height(obj: bpy.types.Object) -> float: return flooring_max_z_value - space_min_z_value + def get_ceiling_height(obj: bpy.types.Object) -> float: space_min_z_value = get_min_global_z(obj) space_max_z_value = get_max_global_z(obj) @@ -219,6 +238,7 @@ def get_ceiling_height(obj: bpy.types.Object) -> float: return ceiling_min_z_value - space_min_z_value + def get_net_perimeter(o: bpy.types.Object) -> float: parsed_edges = [] shared_edges = [] @@ -234,6 +254,7 @@ def get_net_perimeter(o: bpy.types.Object) -> float: perimeter -= get_edge_key_distance(o, edge_key) return perimeter + def get_gross_perimeter(o: bpy.types.Object) -> float: element = tool.Ifc.get_entity(o) mesh = get_gross_element_mesh(element) @@ -242,14 +263,17 @@ def get_gross_perimeter(o: bpy.types.Object) -> float: delete_obj(gross_obj) return gross_perimeter + def get_space_net_perimeter(obj: bpy.types.Object) -> float: pass + def get_rectangular_perimeter(obj: bpy.types.Object) -> float: length = get_length(obj, main_axis="x") height = get_height(obj) return (length + height) * 2 + def get_lowest_polygons(o: bpy.types.Object) -> list[bpy.types.MeshPolygon]: lowest_polygons = [] lowest_z = None @@ -266,6 +290,7 @@ def get_lowest_polygons(o: bpy.types.Object) -> list[bpy.types.MeshPolygon]: lowest_z = z return lowest_polygons + def get_highest_polygons(o: bpy.types.Object) -> list[bpy.types.MeshPolygon]: highest_polygons = [] highest_z = None @@ -282,12 +307,15 @@ def get_highest_polygons(o: bpy.types.Object) -> list[bpy.types.MeshPolygon]: highest_z = z return highest_polygons + def get_edge_key_distance(obj: bpy.types.Object, edge_key: tuple[int, int]) -> float: return (obj.data.vertices[edge_key[1]].co - obj.data.vertices[edge_key[0]].co).length + def get_edge_distance(obj: bpy.types.Object, edge: bpy.types.MeshEdge) -> float: return (obj.data.vertices[edge.vertices[1]].co - obj.data.vertices[edge.vertices[0]].co).length + def get_net_floor_area(obj: bpy.types.Object) -> float: decompositions = get_obj_decompositions(obj) if not decompositions: @@ -304,6 +332,7 @@ def get_net_floor_area(obj: bpy.types.Object) -> float: return total_net_floor_area + def get_gross_ceiling_area(obj: bpy.types.Object) -> float: decompositions = get_obj_decompositions(obj) if not decompositions: @@ -320,6 +349,7 @@ def get_gross_ceiling_area(obj: bpy.types.Object) -> float: return total_gross_ceiling_area + def get_net_ceiling_area(obj: bpy.types.Object) -> float: decompositions = get_obj_decompositions(obj) if not decompositions: @@ -340,6 +370,7 @@ def get_net_ceiling_area(obj: bpy.types.Object) -> float: return total_net_ceiling_area + def get_space_net_volume(obj: bpy.types.Object) -> float: decompositions = get_obj_decompositions(obj) if not decompositions: @@ -355,6 +386,7 @@ def get_space_net_volume(obj: bpy.types.Object) -> float: return total_space_net_volume + def get_net_footprint_area(o: bpy.types.Object) -> float: """_summary_: Returns the area of the footprint of the object, excluding any holes @@ -366,6 +398,7 @@ def get_net_footprint_area(o: bpy.types.Object) -> float: area += polygon.area return area + def get_gross_footprint_area(o: bpy.types.Object) -> float: """_summary_: Returns the area of the footprint of the object, without related opening and excluding any holes @@ -382,6 +415,7 @@ def get_gross_footprint_area(o: bpy.types.Object) -> float: delete_mesh(mesh) return gross_footprint_area + def get_net_roofprint_area(o: bpy.types.Object) -> float: # Is roofprint the right word? Couldn't think of anything better - vulevukusej """_summary_: Returns the area of the net roofprint of the object, excluding any holes @@ -394,6 +428,7 @@ def get_net_roofprint_area(o: bpy.types.Object) -> float: area += polygon.area return area + def get_side_area(o: bpy.types.Object) -> float: # There are a few dumb options for this, but this seems the dumbest # until I get more practical experience on what works best. @@ -402,6 +437,7 @@ def get_side_area(o: bpy.types.Object) -> float: z = (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length return max(x * z, y * z) + def get_cross_section_area(obj: bpy.types.Object) -> float: representation = tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) item = representation.Items[0] @@ -418,6 +454,7 @@ def get_cross_section_area(obj: bpy.types.Object) -> float: return area # TODO handle other types of sections, and then fall back to mesh parsing + def get_gross_surface_area(o: bpy.types.Object, vg_index: Optional[int] = None) -> float: if vg_index is None: if not has_openings(o): @@ -436,21 +473,25 @@ def get_gross_surface_area(o: bpy.types.Object, vg_index: Optional[int] = None) area += polygon.area return area + def get_net_surface_area(obj: bpy.types.Object) -> float: return get_mesh_area(obj.data) + def get_mesh_area(mesh: bpy.types.Mesh) -> float: area = 0 for polygon in mesh.polygons: area += polygon.area return area + def is_polygon_in_vg(polygon: bpy.types.MeshPolygon, vertices_in_vg: list[bpy.types.MeshVertex]) -> bool: for v in polygon.vertices: if v not in vertices_in_vg: return False return True + def get_net_volume(o: bpy.types.Object) -> float: o_mesh = bmesh.new() o_mesh.from_mesh(o.data) @@ -458,6 +499,7 @@ def get_net_volume(o: bpy.types.Object) -> float: o_mesh.free() return volume + def get_gross_volume(o: bpy.types.Object) -> float: if not has_openings(o): return get_net_volume(o) @@ -473,17 +515,18 @@ def get_gross_volume(o: bpy.types.Object) -> float: return gross_volume -def has_openings( - obj: bpy.types.Object -) -> Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]]: + +def has_openings(obj: bpy.types.Object) -> Union[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]]: element = tool.Ifc.get_entity(obj) return element and getattr(element, "HasOpenings", []) + def get_obj_decompositions(obj: bpy.types.Object) -> list[ifcopenshell.entity_instance]: element = tool.Ifc.get_entity(obj) decompositions = ifcopenshell.util.element.get_decomposition(element) return decompositions + def get_gross_weight(obj: bpy.types.Object) -> Union[float, None]: obj_mass_density = get_obj_mass_density(obj) if not obj_mass_density: @@ -492,6 +535,7 @@ def get_gross_weight(obj: bpy.types.Object) -> Union[float, None]: gross_weight = obj_mass_density * gross_volume return gross_weight + def get_net_weight(obj: bpy.types.Object) -> Union[float, None]: obj_mass_density = get_obj_mass_density(obj) if not obj_mass_density: @@ -500,6 +544,7 @@ def get_net_weight(obj: bpy.types.Object) -> Union[float, None]: net_weight = obj_mass_density * net_volume return net_weight + def get_obj_mass_density(obj: bpy.types.Object) -> Union[float, None]: entity = tool.Ifc.get_entity(obj) material = ifcopenshell.util.element.get_material(entity) @@ -546,6 +591,7 @@ def get_obj_mass_density(obj: bpy.types.Object) -> Union[float, None]: else: return + def get_opening_type(opening: bpy.types.Object, obj: bpy.types.Object) -> Literal["OPENING", "RECESS"]: """_summary_: Returns the opening type - OPENING / RECESS @@ -565,8 +611,8 @@ def get_opening_type(opening: bpy.types.Object, obj: bpy.types.Object) -> Litera # If an odd number of face-normal vectors intersect with the object, then the void is a recess, otherwise it's an opening return "OPENING" if ray_intersections % 2 == 0 else "RECESS" + def get_opening_area( - obj: bpy.types.Object, angle_z1: int = 45, angle_z2: int = 135, @@ -625,8 +671,8 @@ def get_opening_area( return total_opening_area + def get_lateral_area( - obj: bpy.types.Object, subtract_openings: bool = True, exclude_end_areas: bool = False, @@ -665,9 +711,7 @@ def get_lateral_area( top_axis = x_axis area = 0 - total_opening_area = ( - 0 if subtract_openings else get_opening_area(obj, angle_z1=angle_z1, angle_z2=angle_z2) - ) + total_opening_area = 0 if subtract_openings else get_opening_area(obj, angle_z1=angle_z1, angle_z2=angle_z2) polygons = obj.data.polygons for polygon in polygons: @@ -685,6 +729,7 @@ def get_lateral_area( area += polygon.area return area + total_opening_area + def get_gross_side_area(obj: bpy.types.Object) -> float: if not has_openings(obj): return get_net_side_area(obj) @@ -693,14 +738,17 @@ def get_gross_side_area(obj: bpy.types.Object) -> float: return gross_side_area + def get_net_side_area(obj: bpy.types.Object) -> float: net_side_area = get_lateral_area(obj, exclude_end_areas=True, main_axis="x") / 2 return net_side_area + def get_outer_surface_area(obj: bpy.types.Object) -> float: outer_surface_area = get_lateral_area(obj, exclude_end_areas=True, angle_z1=0, angle_z2=360) return outer_surface_area + def get_end_area(obj: bpy.types.Object) -> float: element = tool.Ifc.get_entity(obj) gross_mesh = get_gross_element_mesh(element) @@ -715,6 +763,7 @@ def get_end_area(obj: bpy.types.Object) -> float: return end_area + def get_gross_top_area(obj: bpy.types.Object, angle: int = 45) -> float: """_summary_: Returns the gross top area of the object. @@ -748,6 +797,7 @@ def get_gross_top_area(obj: bpy.types.Object, angle: int = 45) -> float: area += polygon.area return area + opening_area + # curently net top area is larger then projected area, because its taking into account internal polygons, or window sills def get_net_top_area(obj: bpy.types.Object, angle: int = 45, ignore_internal: bool = True) -> float: """_summary_: Returns the net top area of the object. @@ -775,6 +825,7 @@ def get_net_top_area(obj: bpy.types.Object, angle: int = 45, ignore_internal: bo return area + def get_projected_area(obj, projection_axis: AxisType = "z", is_gross: bool = True) -> float: """_summary_: Returns the projected area of the object. @@ -814,6 +865,7 @@ def get_projected_area(obj, projection_axis: AxisType = "z", is_gross: bool = Tr return projected_polygon.area + void_area return projected_polygon.area + def get_OBB_object(obj: bpy.types.Object) -> bpy.types.Object: """_summary_: Returns the Oriented-Bounding-Box (OBB) of the object. @@ -855,6 +907,7 @@ def get_OBB_object(obj: bpy.types.Object) -> bpy.types.Object: return new_OBB_object + def get_AABB_object(obj: bpy.types.Object) -> bpy.types.Object: """_summary_: Returns the Axis-Aligned-Bounding-Box (AABB) of the object. @@ -909,8 +962,8 @@ def get_AABB_object(obj: bpy.types.Object) -> bpy.types.Object: return new_AABB_object + def get_bisected_obj( - obj: bpy.types.Object, plane_co_pos: VectorTuple, plane_no_pos: VectorTuple, @@ -954,6 +1007,7 @@ def get_bisected_obj( return bis_obj + def get_total_contact_area(obj: bpy.types.Object, class_filter: list[str] = ["IfcElement"]) -> float: """_summary_: Returns the total contact area of the object with other objects. @@ -970,6 +1024,7 @@ def get_total_contact_area(obj: bpy.types.Object, class_filter: list[str] = ["If return total_contact_area + def get_touching_objects(obj: bpy.types.Object, class_filter: list[str]) -> list[bpy.types.Object]: """_summary_: Returns a list of objects that are touching the object. @@ -1019,6 +1074,7 @@ def get_touching_objects(obj: bpy.types.Object, class_filter: list[str]) -> list return touching_objects + def get_contact_area(object1: bpy.types.Object, object2: bpy.types.Object) -> float: """_summary_: Returns the contact area between two objects. @@ -1034,8 +1090,8 @@ def get_contact_area(object1: bpy.types.Object, object2: bpy.types.Object) -> fl total_area += get_intersection_between_polygons(object1, poly1, object2, poly2) return total_area + def get_intersection_between_polygons( - object1: bpy.types.Object, poly1: bpy.types.MeshPolygon, object2: bpy.types.Object, @@ -1083,9 +1139,8 @@ def get_intersection_between_polygons( # TopologicalError - Generated Geometry might be invalid return 0 -def create_shapely_polygon( - obj: bpy.types.Object, polygon: bpy.types.MeshPolygon, trans_matrix: Matrix -) -> Polygon: + +def create_shapely_polygon(obj: bpy.types.Object, polygon: bpy.types.MeshPolygon, trans_matrix: Matrix) -> Polygon: """_summary_: Create a shapely polygon :param blender-object obj: Blender Object @@ -1104,11 +1159,13 @@ def create_shapely_polygon( polygon_tuples.append((x, y)) return Polygon(polygon_tuples) + def get_gross_element_mesh(element: ifcopenshell.entity_instance) -> bpy.types.Mesh: settings = ifcopenshell.geom.settings() settings.set(settings.DISABLE_OPENING_SUBTRACTIONS, True) return create_mesh_from_shape(element, settings) + def create_mesh_from_shape( element: ifcopenshell.entity_instance, settings: Optional[ifcopenshell.geom.settings] = None ) -> bpy.types.Mesh: @@ -1138,11 +1195,13 @@ def create_mesh_from_shape( mesh.update() return mesh + def get_bmesh_from_mesh(mesh: bpy.types.Mesh) -> bmesh.types.BMesh: bm = bmesh.new() bm.from_mesh(mesh) return bm + def get_object_main_axis(o: bpy.types.Object) -> AxisType: """_summary_: Returns the main object axis. Useful for profile-defined objects. @@ -1162,6 +1221,7 @@ def get_object_main_axis(o: bpy.types.Object) -> AxisType: else: return "x" + def is_opening_horizontal(o: bpy.types.Object) -> bool: x = (Vector(o.bound_box[4]) - Vector(o.bound_box[0])).length y = (Vector(o.bound_box[3]) - Vector(o.bound_box[0])).length @@ -1169,10 +1229,12 @@ def is_opening_horizontal(o: bpy.types.Object) -> bool: return z < x and z < y + def delete_mesh(mesh: bpy.types.Mesh) -> None: mesh.user_clear() bpy.data.meshes.remove(mesh) + def delete_obj(obj: bpy.types.Object) -> None: bpy.data.objects.remove(obj, do_unlink=True) diff --git a/src/blenderbim/blenderbim/bim/module/qto/data.py b/src/blenderbim/blenderbim/bim/module/qto/data.py index 7d5fcc6a66..1be10de8fd 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/data.py +++ b/src/blenderbim/blenderbim/bim/module/qto/data.py @@ -19,9 +19,11 @@ import bpy import blenderbim.tool as tool + def refresh(): QtoData.is_loaded = False + class QtoData: data = {} is_loaded = False @@ -29,9 +31,9 @@ class QtoData: @classmethod def load(cls): cls.data = { - "has_cost_item" : cls.has_cost_item(), - "relating_cost_items" : cls.relating_cost_items(), - } + "has_cost_item": cls.has_cost_item(), + "relating_cost_items": cls.relating_cost_items(), + } cls.is_loaded = True @@ -53,23 +55,13 @@ class QtoData: for relating_cost_item in relating_cost_items: results.append( { - 'cost_item_id' : relating_cost_item['cost_item_id'], - 'cost_item_name' : relating_cost_item['cost_item_name'], - 'quantity_id' : relating_cost_item['quantity_id'], - 'quantity_name' : relating_cost_item['quantity_name'], - 'quantity_value' : relating_cost_item['quantity_value'], - 'quantity_type' : relating_cost_item['quantity_type'], + "cost_item_id": relating_cost_item["cost_item_id"], + "cost_item_name": relating_cost_item["cost_item_name"], + "quantity_id": relating_cost_item["quantity_id"], + "quantity_name": relating_cost_item["quantity_name"], + "quantity_value": relating_cost_item["quantity_value"], + "quantity_type": relating_cost_item["quantity_type"], } ) return results - - - - - - - - - - diff --git a/src/blenderbim/blenderbim/bim/module/qto/operator.py b/src/blenderbim/blenderbim/bim/module/qto/operator.py index 7a12a45123..9be81dfafc 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/operator.py +++ b/src/blenderbim/blenderbim/bim/module/qto/operator.py @@ -23,7 +23,6 @@ import blenderbim.tool as tool import blenderbim.core.qto as core from blenderbim.bim.ifc import IfcStore from blenderbim.bim.module.qto import helper -from blenderbim.bim.module.pset.qto_calculator import QtoCalculator class CalculateCircleRadius(bpy.types.Operator): @@ -85,104 +84,37 @@ class CalculateObjectVolumes(bpy.types.Operator): return {"FINISHED"} -class ExecuteQtoMethod(bpy.types.Operator): - bl_idname = "bim.execute_qto_method" - bl_label = "Execute Qto Method" +class CalculateSingleQuantity(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.calculate_single_quantity" + bl_label = "Calculate Single Quantity" bl_options = {"REGISTER", "UNDO"} - - @classmethod - def poll(cls, context): - return context.selected_objects - - def execute(self, context): - selected_mesh_objects = [o for o in context.selected_objects if o.type == "MESH"] - props = context.scene.BIMQtoProperties - result = 0 - if props.qto_methods == "HEIGHT": - for obj in selected_mesh_objects: - result += helper.calculate_height(obj) - elif props.qto_methods == "VOLUME": - result = helper.calculate_volumes(selected_mesh_objects, context) - elif props.qto_methods == "FORMWORK": - result = helper.calculate_formwork_area(selected_mesh_objects, context) - elif props.qto_methods == "SIDE_FORMWORK": - result = helper.calculate_side_formwork_area(selected_mesh_objects, context) - elif props.qto_methods == "NetFootprintArea": - result = QtoCalculator().get_net_footprint_area(selected_mesh_objects[0]) - elif props.qto_methods == "NetRoofprintArea": - result = QtoCalculator().get_net_roofprint_area(selected_mesh_objects[0]) - elif props.qto_methods == "LateralArea": - result = QtoCalculator().get_lateral_area(selected_mesh_objects[0]) - elif props.qto_methods == "TotalSurfaceArea": - result = QtoCalculator().get_total_surface_area(selected_mesh_objects[0]) - elif props.qto_methods == "OpeningArea": - result = QtoCalculator().get_opening_area(selected_mesh_objects[0]) - elif props.qto_methods == "GrossTopArea": - result = QtoCalculator().get_gross_top_area(selected_mesh_objects[0]) - elif props.qto_methods == "NetTopArea": - result = QtoCalculator().get_net_top_area(selected_mesh_objects[0]) - elif props.qto_methods == "ProjectedArea": - result = QtoCalculator().get_projected_area(selected_mesh_objects[0]) - elif props.qto_methods == "TotalContactArea": - result = QtoCalculator().get_total_contact_area(selected_mesh_objects[0]) - elif props.qto_methods == "ContactArea": - result = QtoCalculator().get_contact_area(selected_mesh_objects[0], selected_mesh_objects[1]) - props.qto_result = str(round(result, 3)) - return {"FINISHED"} - - -class QuantifyObjects(bpy.types.Operator): - bl_idname = "bim.quantify_objects" - bl_label = "Quantify Objects" - bl_options = {"REGISTER", "UNDO"} - - @classmethod - def poll(cls, context): - return IfcStore.get_file() and context.selected_objects - - def execute(self, context): - return IfcStore.execute_ifc_operator(self, context) - - def _execute(self, context): - props = context.scene.BIMQtoProperties - self.file = IfcStore.get_file() - for obj in (o for o in context.selected_objects if o.type == "MESH"): - if not obj.BIMObjectProperties.ifc_definition_id: - continue - result = 0 - if props.qto_methods == "HEIGHT": - result = helper.calculate_height(obj) - elif props.qto_methods == "VOLUME": - result = helper.calculate_volumes([obj], context) - elif props.qto_methods == "FORMWORK": - result = helper.calculate_formwork_area([obj], context) - elif props.qto_methods == "SIDE_FORMWORK": - result = helper.calculate_side_formwork_area([obj], context) - if not result: - continue - result = round(result, 3) - qto = ifcopenshell.api.run( - "pset.add_qto", - self.file, - product=self.file.by_id(obj.BIMObjectProperties.ifc_definition_id), - name=props.qto_name, - ) - ifcopenshell.api.run("pset.edit_qto", self.file, qto=qto, properties={props.prop_name: result}) - return {"FINISHED"} - - -class AssignBaseQto(bpy.types.Operator, tool.Ifc.Operator): - bl_idname = "bim.assign_objects_base_qto" - bl_label = "Assign IFC Object Quantity Set" - bl_options = {"REGISTER", "UNDO"} - bl_description = "Assign IFC quantity set to selected object" + bl_description = "Calculate a single quantity using a function on the selected objects" @classmethod def poll(cls, context): return tool.Ifc.get() and context.selected_objects def _execute(self, context): - core.assign_objects_base_qto(tool.Ifc, tool.Qto, selected_objects=context.selected_objects) + import ifc5d.qto + + props = context.scene.BIMQtoProperties + elements = set() + for obj in context.selected_objects: + element = tool.Ifc.get_entity(obj) + if element: + elements.add(element) + + rules = { + "calculators": { + props.calculator: { + "IfcProduct": {props.qto_name: {props.prop_name: props.calculator_function}}, + } + } + } + + ifc_file = tool.Ifc.get() + results = ifc5d.qto.quantify(ifc_file, elements, rules) + ifc5d.qto.edit_qtos(ifc_file, results) return {"FINISHED"} @@ -199,13 +131,14 @@ class PerformQuantityTakeOff(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): import ifc5d.qto + props = context.scene.BIMQtoProperties elements = set() for obj in context.selected_objects: element = tool.Ifc.get_entity(obj) if element: elements.add(element) - rules = ifc5d.qto.get_rules("IFC4QtoBaseQuantities") + rules = ifc5d.qto.rules[props.qto_rule] ifc_file = tool.Ifc.get() results = ifc5d.qto.quantify(ifc_file, elements, rules) diff --git a/src/blenderbim/blenderbim/bim/module/qto/prop.py b/src/blenderbim/blenderbim/bim/module/qto/prop.py index 8829c6178a..3cc1e9d446 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/prop.py +++ b/src/blenderbim/blenderbim/bim/module/qto/prop.py @@ -17,6 +17,7 @@ # along with BlenderBIM Add-on. If not, see . import bpy +import ifc5d.qto from blenderbim.bim.prop import StrProperty, Attribute from bpy.types import PropertyGroup from bpy.props import ( @@ -31,34 +32,32 @@ from bpy.props import ( ) +def get_qto_rule(self, context): + results = [] + for rule_id, rule in ifc5d.qto.rules.items(): + results.append((rule_id, rule["name"], rule["description"])) + return results + + +def get_calculator(self, context): + results = [] + for name, calculator in ifc5d.qto.calculators.items(): + results.append((name, name, calculator.__doc__)) + return results + + +def get_calculator_function(self, context): + calculator = ifc5d.qto.calculators[self.calculator] + results = [] + for function in calculator.get_functions(): + results.append((function.id, function.name, function.description)) + return results + + class BIMQtoProperties(PropertyGroup): + qto_rule: EnumProperty(items=get_qto_rule, name="Qto Rule") + calculator: EnumProperty(items=get_calculator, name="Calculator") + calculator_function: EnumProperty(items=get_calculator_function, name="Calculator Function") qto_result: StringProperty(default="", name="Qto Result") - qto_methods: EnumProperty( - items=[ - ("HEIGHT", "Height", "Calculate the Z height of an object"), - ("VOLUME", "Volume", "Calculate the volume of an object"), - ( - "FORMWORK", - "Formwork", - "Calculate the exposed formwork for all bottoms and sides (e.g. for beams and slabs) of one or more objects", - ), - ( - "SIDE_FORMWORK", - "Side Formwork", - "Calculate the exposed formwork for all sides only (e.g. for columns) of one or more objects", - ), - ("NetFootprintArea", "Net footprint area", "Calculate the net footprint area"), - ("NetRoofprintArea", "Net roofprint area", "Calculate the net roofprint area"), - ("LateralArea", "Lateral area", "Calculate the lateral area"), - ("TotalSurfaceArea", "Total surface area", "Calculate the total surface area"), - ("OpeningArea", "Opening area", "Calculate the opening area"), - ("GrossTopArea", "Gross top area", "Calculate the gross top area"), - ("NetTopArea", "Net top area", "Calculate the net top area"), - ("ProjectedArea", "Projected area", "Calculate the projected area"), - ("TotalContactArea", "Total contact area", "Get the total contact area"), - ("ContactArea", "Contact area between two objects", "Get the contact area") - ], - name="Qto Methods", - ) - qto_name: StringProperty(name="Qto Name") - prop_name: StringProperty(name="Prop Name") + qto_name: StringProperty(name="Qto Name", default="My_Qto") + prop_name: StringProperty(name="Prop Name", default="MyDimension") diff --git a/src/blenderbim/blenderbim/bim/module/qto/ui.py b/src/blenderbim/blenderbim/bim/module/qto/ui.py index c7a79d1522..c7f4863463 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/ui.py +++ b/src/blenderbim/blenderbim/bim/module/qto/ui.py @@ -20,8 +20,8 @@ import bpy from blenderbim.bim.module.qto.data import QtoData -class BIM_PT_qto_utilities(bpy.types.Panel): - bl_idname = "BIM_PT_qto_utilities" +class BIM_PT_qto(bpy.types.Panel): + bl_idname = "BIM_PT_qto" bl_label = "Quantity Take-off" bl_options = {"DEFAULT_CLOSED"} bl_space_type = "PROPERTIES" @@ -31,9 +31,56 @@ class BIM_PT_qto_utilities(bpy.types.Panel): bl_options = {"HIDE_HEADER"} def draw(self, context): - if not QtoData.is_loaded: - QtoData.load() + layout = self.layout + props = context.scene.BIMQtoProperties + row = layout.row() + if context.selected_objects: + row.label(text=f"Quantifying {len(context.selected_objects)} Selected Objects", icon="MOD_EDGESPLIT") + else: + row.label(text="Quantifying All Objects", icon="MOD_EDGESPLIT") + row = layout.row() + row.prop(props, "qto_rule", text="") + row = layout.row() + row.operator("bim.perform_quantity_take_off") + + +class BIM_PT_qto_manual(bpy.types.Panel): + bl_idname = "BIM_PT_qto_manual" + bl_label = "Manual Quantification" + bl_options = {"DEFAULT_CLOSED"} + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + bl_parent_id = "BIM_PT_tab_qto" + + def draw(self, context): + layout = self.layout + props = context.scene.BIMQtoProperties + + row = layout.row() + row.prop(props, "calculator") + row = layout.row() + row.prop(props, "calculator_function", text="Function") + + row = layout.row(align=True) + row.prop(props, "qto_name", text="") + row.prop(props, "prop_name", text="") + + row = layout.row() + row.operator("bim.calculate_single_quantity") + + +class BIM_PT_qto_simple(bpy.types.Panel): + bl_idname = "BIM_PT_qto_simple" + bl_label = "Simple Quantity Calculator" + bl_options = {"DEFAULT_CLOSED"} + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + bl_parent_id = "BIM_PT_tab_qto" + + def draw(self, context): layout = self.layout props = context.scene.BIMQtoProperties @@ -49,42 +96,44 @@ class BIM_PT_qto_utilities(bpy.types.Panel): row = layout.row(align=True) row.operator("bim.calculate_object_volumes") - row = layout.row(align=True) - row.prop(props, "qto_methods", text="") - row.operator("bim.execute_qto_method", icon="PROPERTIES", text="") - row = layout.row(align=True) - row.prop(props, "qto_name", text="") - row.prop(props, "prop_name", text="") - row.operator("bim.quantify_objects", icon="COPYDOWN", text="") +class BIM_PT_qto_cost(bpy.types.Panel): + bl_idname = "BIM_PT_qto_cost" + bl_label = "Parametric Cost Relationships" + bl_options = {"DEFAULT_CLOSED"} + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + bl_parent_id = "BIM_PT_tab_qto" - row = layout.row(align=True) - row.operator("bim.assign_objects_base_qto") + def draw(self, context): + if not QtoData.is_loaded: + QtoData.load() - row = layout.row(align=True) - row.operator("bim.calculate_all_quantities", icon="MOD_EDGESPLIT") + if not context.selected_objects: + row = self.layout.row() + row.label(text="No Selected Object") + return - if context.selected_objects: - row = layout.row(align=True) - row.label(text=f"Relating Cost Item:") - - if QtoData.data['has_cost_item']: - for relating_cost_item in QtoData.data['relating_cost_items']: - row.label(text=f"\n") - row = layout.row(align=True) - row.label(text=f"Cost item name:") - row.label(text=f"{relating_cost_item['cost_item_name']}") - row = layout.row(align=True) - row.label(text=f"Quantity name:") - row.label(text=f"{relating_cost_item['quantity_name']}") - row = layout.row(align=True) - row.label(text=f"Quantity value:") - row.label(text=f"{relating_cost_item['quantity_value']}") - row = layout.row(align=True) - row.label(text=f"Quantity type:") - row.label(text=f"{relating_cost_item['quantity_type']}") - row = layout.row(align=True) - else: - row = layout.row(align=True) - row.label(text = f"No cost item related") + if not QtoData.data["has_cost_item"]: + row = self.layout.row() + row.label(text="No Related Cost Item") + return + row = self.layout.row(align=True) + row.label(text="Relating Cost Item:") + for relating_cost_item in QtoData.data["relating_cost_items"]: + row.label(text="\n") + row = self.layout.row(align=True) + row.label(text="Cost item name:") + row.label(text=f"{relating_cost_item['cost_item_name']}") + row = self.layout.row(align=True) + row.label(text="Quantity name:") + row.label(text=f"{relating_cost_item['quantity_name']}") + row = self.layout.row(align=True) + row.label(text="Quantity value:") + row.label(text=f"{relating_cost_item['quantity_value']}") + row = self.layout.row(align=True) + row.label(text="Quantity type:") + row.label(text=f"{relating_cost_item['quantity_type']}") + row = self.layout.row(align=True) diff --git a/src/blenderbim/blenderbim/core/qto.py b/src/blenderbim/blenderbim/core/qto.py index a1495f3d68..1b31bd69ad 100644 --- a/src/blenderbim/blenderbim/core/qto.py +++ b/src/blenderbim/blenderbim/core/qto.py @@ -17,35 +17,14 @@ # along with BlenderBIM Add-on. If not, see . from __future__ import annotations -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING if TYPE_CHECKING: import bpy - import ifcopenshell import blenderbim.tool as tool - from blenderbim.bim.module.pset.qto_calculator import QtoCalculator def calculate_circle_radius(qto: tool.Qto, obj: bpy.types.Object) -> float: result = qto.get_radius_of_selected_vertices(obj) qto.set_qto_result(result) return result - - -def assign_objects_base_qto(ifc: tool.Ifc, qto: tool.Qto, selected_objects: list[bpy.types.Object]) -> None: - for obj in selected_objects: - assign_object_base_qto(ifc, qto, obj) - - -def assign_object_base_qto(ifc: tool.Ifc, qto: tool.Qto, obj: bpy.types.Object) -> None: - product = ifc.get_entity(obj) - if not product: - return - base_quantity_name = qto.get_applicable_base_quantity_name(product) - if not base_quantity_name: - return - ifc.run( - "pset.add_qto", - product=product, - name=base_quantity_name, - ) diff --git a/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json b/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json index 3211ee6724..29b9045161 100644 --- a/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json +++ b/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json @@ -2,7 +2,7 @@ "name": "IFC4 Base Quantities - IfcOpenShell", "description": "This ruleset quantifies every single possible standardised base quantity in IFC4 using only IfcOpenShell as a geometry processor.", "calculators": { - "IOSTriangulation": { + "IfcOpenShell": { "IfcActuator": { "Qto_ActuatorBaseQuantities": { "GrossWeight": null diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index 5957abbdc8..a4ddbd617e 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -23,16 +23,20 @@ import ifcopenshell.api import ifcopenshell.api.pset import ifcopenshell.util.selector import multiprocessing -from typing import Optional +from collections import namedtuple +from typing import Iterable -def get_rules(name: str): - cwd = os.path.dirname(os.path.realpath(__file__)) +Function = namedtuple("Function", ["id", "name", "description"]) +rules = {} + +cwd = os.path.dirname(os.path.realpath(__file__)) +for name in ("IFC4QtoBaseQuantities", "IFC4QtoBaseQuantitiesBlender"): with open(os.path.join(cwd, name + ".json"), "r") as f: - return json.load(f) + rules[name] = json.load(f) -def quantify(ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_instance], rules: dict): +def quantify(ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_instance], rules: dict) -> dict: results = {} for calculator, queries in rules["calculators"].items(): calculator = calculators[calculator] @@ -43,7 +47,7 @@ def quantify(ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_inst return results -def edit_qtos(ifc_file, results): +def edit_qtos(ifc_file, results) -> None: for element, qtos in results.items(): for name, quantities in qtos.items(): qto = ifcopenshell.util.element.get_pset(element, name, should_inherit=False) @@ -54,14 +58,17 @@ def edit_qtos(ifc_file, results): ifcopenshell.api.pset.edit_qto(ifc_file, qto=qto, properties=quantities) -class IOSTriangulation: +class IfcOpenShell: + """Calculates Model body context geometry using the default IfcOpenShell + iterator on triangulation elements.""" + @staticmethod def calculate( ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_instance], qtos: dict, results: dict, - ): + ) -> None: import ifcopenshell import ifcopenshell.geom import ifcopenshell.util.shape @@ -89,10 +96,10 @@ class IOSTriangulation: tasks = [] if gross_qtos: - tasks.append((IOSTriangulation.create_iterator(ifc_file, gross_settings, elements), gross_qtos)) + tasks.append((IfcOpenShell.create_iterator(ifc_file, gross_settings, list(elements)), gross_qtos)) if net_qtos: - tasks.append((IOSTriangulation.create_iterator(ifc_file, net_settings, elements), net_qtos)) + tasks.append((IfcOpenShell.create_iterator(ifc_file, net_settings, list(elements)), net_qtos)) for iterator, qtos in tasks: if iterator.initialize(): @@ -108,13 +115,26 @@ class IOSTriangulation: break @staticmethod - def create_iterator(ifc_file, settings, elements): + def create_iterator( + ifc_file: ifcopenshell.file, settings: ifcopenshell.geom.settings, elements: list[ifcopenshell.entity_instance] + ) -> ifcopenshell.geom.iterator: return ifcopenshell.geom.iterator(settings, ifc_file, multiprocessing.cpu_count(), include=elements) + @staticmethod + def get_functions() -> list[Function]: + return [ + Function("get_volume", "Volume", "Calculates the volume of a manifold shape"), + Function("get_x", "X Length", "Calculates the length along the local X axis"), + ] + class Blender: + """Calculates geometry based on currently loaded Blender objects.""" + @staticmethod - def calculate(ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_instance], qtos: dict, results: dict): + def calculate( + ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_instance], qtos: dict, results: dict + ) -> None: import blenderbim.tool as tool import blenderbim.bim.module.qto.calculator as calculator @@ -132,5 +152,16 @@ class Blender: formula_function = formula_functions[formula] = getattr(calculator, formula) results[element][name][quantity] = formula_function(obj) + @staticmethod + def get_functions() -> list[Function]: + return [ + Function( + "get_linear_length", + "Maximum Bounding Length", + "Calculates the length of the maximum local bounding box", + ), + Function("get_length", "Length", "Calculates the length assumed as the maximum of the local X or Y axis"), + ] -calculators = {"Blender": Blender, "IOSTriangulation": IOSTriangulation} + +calculators = {"Blender": Blender, "IfcOpenShell": IfcOpenShell} From f4247c3527d28d73e051c6898af923c25f8b51fa Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 15:56:50 +1000 Subject: [PATCH 326/429] Continue purging tools that were specific to base qtos Base qtos shouldn't be too special, it should be based off a calculation mapping. This means we can also support IFC2X3 better (which has no base qtos) --- src/blenderbim/blenderbim/core/tool.py | 4 --- src/blenderbim/blenderbim/tool/qto.py | 47 -------------------------- src/ifc5d/ifc5d/qto.py | 2 ++ 3 files changed, 2 insertions(+), 51 deletions(-) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 83b5d16a5d..31ddcb2eaa 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -636,10 +636,6 @@ class Pset: @interface class Qto: - def add_object_base_qto(cls, object): pass - def add_product_base_qto(cls, product): pass - def get_applicable_base_quantity_name(cls, product): pass - def get_applicable_quantity_names(cls, qto_name): pass def get_radius_of_selected_vertices(cls, obj): pass def get_related_cost_item_quantities(cls, product): pass def get_rounded_value(cls, new_quantity): pass diff --git a/src/blenderbim/blenderbim/tool/qto.py b/src/blenderbim/blenderbim/tool/qto.py index 99e9317b7f..51118cb61a 100644 --- a/src/blenderbim/blenderbim/tool/qto.py +++ b/src/blenderbim/blenderbim/tool/qto.py @@ -42,52 +42,6 @@ class Qto(blenderbim.core.tool.Qto): def set_qto_result(cls, result: float) -> None: bpy.context.scene.BIMQtoProperties.qto_result = str(round(result, 3)) - @classmethod - def add_object_base_qto(cls, obj: bpy.types.Object) -> Union[ifcopenshell.entity_instance, None]: - product = tool.Ifc.get_entity(obj) - return cls.add_product_base_qto(product) - - @classmethod - def add_product_base_qto(cls, product: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: - base_quantity_name = cls.get_applicable_base_quantity_name(product) - if base_quantity_name: - return tool.Ifc.run( - "pset.add_qto", - product=product, - name=base_quantity_name, - ) - - @classmethod - def get_applicable_quantity_names(cls, qto_name: str) -> list[str]: - pset_template = blenderbim.bim.schema.ifc.psetqto.get_by_name(qto_name) - return ( - [property.Name for property in pset_template.HasPropertyTemplates] - if hasattr(pset_template, "HasPropertyTemplates") - else [] - ) - - @classmethod - def get_applicable_base_quantity_name( - cls, product: Optional[ifcopenshell.entity_instance] = None - ) -> Union[str, None]: - if not product: - return - applicable_qto_names = blenderbim.bim.schema.ifc.psetqto.get_applicable_names( - product.is_a(), ifcopenshell.util.element.get_predefined_type(product), qto_only=True - ) - # See https://github.com/buildingSMART/IFC4.3.x-development/issues/851 for anomalies in Qto naming - # Should be in sync with cls.get_base_qto. - applicable_qto: Union[str, None] = None - for qto_name in applicable_qto_names: - # No need for "Qto_" check since we use qto_only=True. - if "Base" in qto_name: - return qto_name - # Prioritize anomaly named base quantities over Qto_BodyGeometryValidation. - if applicable_qto and "BodyGeometryValidation" not in applicable_qto: - continue - applicable_qto = qto_name - return applicable_qto - @classmethod def get_rounded_value(cls, new_quantity: float) -> float: return round(new_quantity, 3) @@ -134,7 +88,6 @@ class Qto(blenderbim.core.tool.Qto): def get_base_qto(cls, product: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: if not hasattr(product, "IsDefinedBy"): return - # Should be in sync with cls.get_applicable_base_quantity_name. base_qto_definition = None base_qto_definition_name: Union[str, None] = None for rel in product.IsDefinedBy or []: diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index a4ddbd617e..f197bb6c36 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -84,6 +84,8 @@ class IfcOpenShell: for name, quantities in qtos.items(): for quantity, formula in quantities.items(): + if not formula: + continue if formula.startswith("gross_"): formula = formula[6:] gross_qtos.setdefault(name, {})[quantity] = formula From ab1bf7592e329bc7f99cc64897c9b9001be90dbd Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 29 May 2024 11:49:27 +0500 Subject: [PATCH 327/429] fix error exporting schedule of rates #4723 Issue occurred when cost item would have no quantities but had controlled objects with quantities. 1) just added a check to ensure that cost_item.CostQuantities are present 2) removed possible None return value in get_cost_item_quantity as it actually will break process_cost_data and it's never used anywhere else 3) has_changed_name was unused 4) fix possible similar issue in cost.data (though _get_object_quantities method is unused) --- .../blenderbim/bim/module/cost/data.py | 5 ++- src/ifc5d/ifc5d/ifc5Dspreadsheet.py | 31 +++++++++---------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/data.py b/src/blenderbim/blenderbim/bim/module/cost/data.py index f320b71531..1c424cb1d6 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/data.py +++ b/src/blenderbim/blenderbim/bim/module/cost/data.py @@ -202,6 +202,9 @@ class CostSchedulesData: def _get_object_quantities(cls, cost_item, element): if not element.is_a("IfcObject"): return [] + cost_quantities = cost_item.CostQuantities + if not cost_quantities: + return [] results = [] for relationship in element.IsDefinedBy: if not relationship.is_a("IfcRelDefinesByProperties"): @@ -210,7 +213,7 @@ class CostSchedulesData: if not qto.is_a("IfcElementQuantity"): continue for prop in qto.Quantities: - if prop in cost_item.CostQuantities or []: + if prop in cost_quantities: results.append(prop.id()) return results diff --git a/src/ifc5d/ifc5d/ifc5Dspreadsheet.py b/src/ifc5d/ifc5d/ifc5Dspreadsheet.py index 826f610817..b870329d20 100644 --- a/src/ifc5d/ifc5d/ifc5Dspreadsheet.py +++ b/src/ifc5d/ifc5d/ifc5Dspreadsheet.py @@ -171,26 +171,25 @@ class IfcDataGetter: take_off_name = "mixed-takeoff-quantities" return quantity[3] - if not cost_item: - return None take_off_name = "" - has_changed_name = False total_cost_quantity = 0 accounted_for = [] - for rel in cost_item.Controls or []: - for related_object in rel.RelatedObjects: - qtos = ifcopenshell.util.element.get_psets(related_object, qtos_only=True) - for quantities in qtos.values() or []: - qto = file.by_id(quantities["id"]) - for quantity in qto.Quantities: - if not quantity in cost_item.CostQuantities: - continue - total_cost_quantity += add_quantity(quantity, take_off_name) - accounted_for.append(quantity) + cost_item_quantities = cost_item.CostQuantities + if cost_item_quantities: + for rel in cost_item.Controls or []: + for related_object in rel.RelatedObjects: + qtos = ifcopenshell.util.element.get_psets(related_object, qtos_only=True) + for quantities in qtos.values() or []: + qto = file.by_id(quantities["id"]) + for quantity in qto.Quantities: + if quantity not in cost_item_quantities: + continue + total_cost_quantity += add_quantity(quantity, take_off_name) + accounted_for.append(quantity) - for quantity in cost_item.CostQuantities or []: - if not quantity in accounted_for: - total_cost_quantity += add_quantity(quantity, take_off_name) + for quantity in cost_item_quantities: + if not quantity in accounted_for: + total_cost_quantity += add_quantity(quantity, take_off_name) return { "id": cost_item.id(), From 5ea1c948220ef85e2a34614630a95bae44a2dfd8 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 19:29:48 +1000 Subject: [PATCH 328/429] Expose all previous calculation functions in new Qto UI --- .../blenderbim/bim/module/qto/operator.py | 16 +++-- src/ifc5d/ifc5d/qto.py | 72 +++++++++++++++++-- 2 files changed, 75 insertions(+), 13 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/qto/operator.py b/src/blenderbim/blenderbim/bim/module/qto/operator.py index 9be81dfafc..de6d270d89 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/operator.py +++ b/src/blenderbim/blenderbim/bim/module/qto/operator.py @@ -126,17 +126,21 @@ class PerformQuantityTakeOff(bpy.types.Operator, tool.Ifc.Operator): @classmethod def poll(cls, context): - return tool.Ifc.get() and context.selected_objects + return tool.Ifc.get() def _execute(self, context): import ifc5d.qto props = context.scene.BIMQtoProperties - elements = set() - for obj in context.selected_objects: - element = tool.Ifc.get_entity(obj) - if element: - elements.add(element) + + if context.selected_objects: + elements = set() + for obj in context.selected_objects: + element = tool.Ifc.get_entity(obj) + if element: + elements.add(element) + else: + elements = set(tool.Ifc.get().by_type("IfcElement")) rules = ifc5d.qto.rules[props.qto_rule] diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index f197bb6c36..50bce59d22 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -125,8 +125,38 @@ class IfcOpenShell: @staticmethod def get_functions() -> list[Function]: return [ + Function("get_area", "Area", "The total surface area of the element"), + Function("get_bottom_elevation", "Bottom Elevation", "The local minimum Z ordinate"), + Function( + "get_footprint_area", + "Footprint Area", + "The area if the object's faces were projected along the Z-axis and seen top down", + ), + Function( + "get_footprint_perimeter", + "Footprint Perimeter", + "The perimeter if the object's faces were projected along the Z-axis and seen top down", + ), + Function( + "get_max_side_area", + "Max Side Area", + "The maximum side area when seen from either X, Y, or Z directions", + ), + Function("get_max_xyz", "Max XYZ", "The maximum X, Y, or Z local dimension"), + Function("get_min_xyz", "Min XYZ", "The minimum X, Y, or Z local dimension"), + Function( + "get_outer_surface_area", + "Outer Surface Area", + "The total surface area except for the top or bottom, such as the ends of columns or beams", + ), + Function( + "get_side_area", "Side area", "The side (non-projected) are of the shape as seen from the local Y-axis" + ), + Function("get_top_elevation", "Top elevation", "The local maximum Z ordinate"), Function("get_volume", "Volume", "Calculates the volume of a manifold shape"), - Function("get_x", "X Length", "Calculates the length along the local X axis"), + Function("get_x", "X", "Calculates the length along the local X axis"), + Function("get_y", "Y", "Calculates the length along the local Y axis"), + Function("get_z", "Z", "Calculates the length along the local Z axis"), ] @@ -157,12 +187,40 @@ class Blender: @staticmethod def get_functions() -> list[Function]: return [ - Function( - "get_linear_length", - "Maximum Bounding Length", - "Calculates the length of the maximum local bounding box", - ), - Function("get_length", "Length", "Calculates the length assumed as the maximum of the local X or Y axis"), + Function("get_covering_gross_area", "Covering Gross Area", ""), + Function("get_covering_net_area", "Covering Net Area", ""), + Function("get_covering_width", "Covering Width", ""), + Function("get_cross_section_area", "Cross Section Area", ""), + Function("get_finish_ceiling_height", "Finish Ceiling Height", ""), + Function("get_finish_floor_height", "Finish Floor Height", ""), + Function("get_gross_ceiling_area", "Gross Ceiling Area", ""), + Function("get_gross_footprint_area", "Gross Footprint Area", ""), + Function("get_gross_perimeter", "Gross Perimeter", ""), + Function("get_gross_side_area", "Gross Side Area", ""), + Function("get_gross_stair_area", "Gross Stair Area", ""), + Function("get_gross_surface_area", "Gross Surface Area", ""), + Function("get_gross_top_area", "Gross Top Area", ""), + Function("get_gross_volume", "Gross Volume", ""), + Function("get_gross_weight", "Gross Weight", ""), + Function("get_height", "Height", ""), + Function("get_length", "Length", ""), + Function("get_net_ceiling_area", "Net Ceiling Area", ""), + Function("get_net_floor_area", "Net Floor Area", ""), + Function("get_net_footprint_area", "Net Footprint Area", ""), + Function("get_net_side_area", "Net Side Area", ""), + Function("get_net_stair_area", "Net Stair Area", ""), + Function("get_net_surface_area", "Net Surface Area", ""), + Function("get_net_top_area", "Net Top Area", ""), + Function("get_net_volume", "Net Volume", ""), + Function("get_net_weight", "Net Weight", ""), + Function("get_opening_depth", "Opening Depth", ""), + Function("get_opening_height", "Opening Height", ""), + Function("get_opening_mapping_area", "Opening Mapping Area", ""), + Function("get_outer_surface_area", "Outer Surface Area", ""), + Function("get_rectangular_perimeter", "Rectangular Perimeter", ""), + Function("get_space_net_volume", "Space Net Volume", ""), + Function("get_stair_length", "Stair Length", ""), + Function("get_width", "Width", ""), ] From f92a2b3c8e85efc7be9f4f414b5137ad91c1afb9 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 19:37:35 +1000 Subject: [PATCH 329/429] Shift-Q QTO shortcut now works again --- src/blenderbim/blenderbim/bim/module/model/workspace.py | 4 ++-- src/blenderbim/blenderbim/bim/module/pset/ui.py | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index 324bf42e29..36c26f71d2 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -485,7 +485,7 @@ class BimToolUI: cls.layout.separator() add_layout_hotkey_operator( - cls.layout, "Calculate All Quantities", "S_Q", bpy.ops.bim.calculate_all_quantities.__doc__ + cls.layout, "Perform Quantity Take-off", "S_Q", bpy.ops.bim.perform_quantity_take_off.__doc__ ) @classmethod @@ -614,7 +614,7 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator): if not bpy.context.selected_objects: return - bpy.ops.bim.calculate_all_quantities() + bpy.ops.bim.perform_quantity_take_off() def hotkey_C_P(self): if not bpy.context.selected_objects: diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index 17f14cc86f..e546156e47 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -103,8 +103,6 @@ def draw_psetqto_ui(context, pset_id, pset, props, layout, obj_type, allow_remov op.obj_type = obj_type elif not props.active_pset_id: row.label(text=pset["Name"], icon="COPY_ID") - if "Qto" in pset["Name"] and "Base" in pset["Name"]: - op = row.operator("bim.calculate_all_quantities", icon="MOD_EDGESPLIT", text="") op = row.operator("bim.enable_pset_editing", icon="GREASEPENCIL", text="") op.pset_id = pset_id op.obj = obj_name From 435ce8d58a17bba71959fd0bb9aedcfb1dd528c0 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 21:46:23 +1000 Subject: [PATCH 330/429] New qto tool is now unit aware --- .../blenderbim/bim/module/pset/data.py | 1 - .../blenderbim/bim/module/qto/prop.py | 9 +- src/ifc5d/ifc5d/qto.py | 199 +++++++++++------- 3 files changed, 126 insertions(+), 83 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/data.py b/src/blenderbim/blenderbim/bim/module/pset/data.py index 6e9d14b0d5..35a48d6b02 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/data.py +++ b/src/blenderbim/blenderbim/bim/module/pset/data.py @@ -298,7 +298,6 @@ class WorkSchedulePsetsData(Data): @classmethod def load(cls): - props = bpy.context.scene.WorkSchedulePsetProperties ifc_definition_id = bpy.context.scene.BIMWorkScheduleProperties.active_work_schedule_id cls.data = {"psets": cls.psetqtos(tool.Ifc.get().by_id(ifc_definition_id), psets_only=True)} cls.is_loaded = True diff --git a/src/blenderbim/blenderbim/bim/module/qto/prop.py b/src/blenderbim/blenderbim/bim/module/qto/prop.py index 3cc1e9d446..73bf81afc6 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/prop.py +++ b/src/blenderbim/blenderbim/bim/module/qto/prop.py @@ -49,8 +49,13 @@ def get_calculator(self, context): def get_calculator_function(self, context): calculator = ifc5d.qto.calculators[self.calculator] results = [] - for function in calculator.get_functions(): - results.append((function.id, function.name, function.description)) + previous_measure = None + for function_id, function in calculator.functions.items(): + measure = function.measure.split("Measure")[0][3:] + if previous_measure is not None and measure != previous_measure: + results.append(None) + results.append((function_id, f"{measure}: {function.name}", function.description)) + previous_measure = measure return results diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index 50bce59d22..9adb00d58a 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -21,13 +21,13 @@ import json import ifcopenshell import ifcopenshell.api import ifcopenshell.api.pset +import ifcopenshell.util.unit import ifcopenshell.util.selector import multiprocessing from collections import namedtuple -from typing import Iterable -Function = namedtuple("Function", ["id", "name", "description"]) +Function = namedtuple("Function", ["measure", "name", "description"]) rules = {} cwd = os.path.dirname(os.path.realpath(__file__)) @@ -58,10 +58,77 @@ def edit_qtos(ifc_file, results) -> None: ifcopenshell.api.pset.edit_qto(ifc_file, qto=qto, properties=quantities) +class SI2ProjectUnitConverter: + def __init__(self, ifc_file): + self.project_units = { + "IfcAreaMeasure": ifcopenshell.util.unit.get_project_unit(ifc_file, "AREAUNIT"), + "IfcLengthMeasure": ifcopenshell.util.unit.get_project_unit(ifc_file, "LENGTHUNIT"), + "IfcMassMeasure": ifcopenshell.util.unit.get_project_unit(ifc_file, "MASSUNIT"), + "IfcTimeMeasure": ifcopenshell.util.unit.get_project_unit(ifc_file, "TIMEUNIT"), + "IfcVolumeMeasure": ifcopenshell.util.unit.get_project_unit(ifc_file, "VOLUMEUNIT"), + } + for key, value in self.project_units.items(): + if value: + self.project_units[key] = (getattr(value, "Prefix", "None"), value.Name) + + self.si_names = { + "IfcAreaMeasure": "SQUARE_METRE", + "IfcLengthMeasure": "METRE", + "IfcMassMeasure": "GRAM", + "IfcTimeMeasure": "SECOND", + "IfcVolumeMeasure": "CUBIE_METRE", + } + + def convert(self, value, measure): + if measure_unit := self.project_units.get(measure, None): + return ifcopenshell.util.unit.convert(value, None, self.si_names[measure], *measure_unit) + return value + + class IfcOpenShell: """Calculates Model body context geometry using the default IfcOpenShell iterator on triangulation elements.""" + functions = { + # IfcLengthMeasure + "get_x": Function("IfcLengthMeasure", "X", "Calculates the length along the local X axis"), + "get_y": Function("IfcLengthMeasure", "Y", "Calculates the length along the local Y axis"), + "get_z": Function("IfcLengthMeasure", "Z", "Calculates the length along the local Z axis"), + "get_max_xyz": Function("IfcLengthMeasure", "Max XYZ", "The maximum X, Y, or Z local dimension"), + "get_min_xyz": Function("IfcLengthMeasure", "Min XYZ", "The minimum X, Y, or Z local dimension"), + "get_top_elevation": Function("IfcLengthMeasure", "Top elevation", "The local maximum Z ordinate"), + "get_bottom_elevation": Function("IfcLengthMeasure", "Bottom Elevation", "The local minimum Z ordinate"), + "get_footprint_perimeter": Function( + "IfcLengthMeasure", + "Footprint Perimeter", + "The perimeter if the object's faces were projected along the Z-axis and seen top down", + ), + # IfcAreaMeasure + "get_area": Function("IfcAreaMeasure", "Area", "The total surface area of the element"), + "get_footprint_area": Function( + "IfcAreaMeasure", + "Footprint Area", + "The area if the object's faces were projected along the Z-axis and seen top down", + ), + "get_max_side_area": Function( + "IfcAreaMeasure", + "Max Side Area", + "The maximum side area when seen from either X, Y, or Z directions", + ), + "get_outer_surface_area": Function( + "IfcAreaMeasure", + "Outer Surface Area", + "The total surface area except for the top or bottom, such as the ends of columns or beams", + ), + "get_side_area": Function( + "IfcAreaMeasure", + "Side area", + "The side (non-projected) are of the shape as seen from the local Y-axis", + ), + # IfcVolumeMeasure + "get_volume": Function("IfcVolumeMeasure", "Volume", "Calculates the volume of a manifold shape"), + } + @staticmethod def calculate( ifc_file: ifcopenshell.file, @@ -103,6 +170,8 @@ class IfcOpenShell: if net_qtos: tasks.append((IfcOpenShell.create_iterator(ifc_file, net_settings, list(elements)), net_qtos)) + unit_converter = SI2ProjectUnitConverter(ifc_file) + for iterator, qtos in tasks: if iterator.initialize(): while True: @@ -112,7 +181,9 @@ class IfcOpenShell: for name, quantities in qtos.items(): results[element].setdefault(name, {}) for quantity, formula in quantities.items(): - results[element][name][quantity] = formula_functions[formula](shape.geometry) + results[element][name][quantity] = unit_converter.convert( + formula_functions[formula](shape.geometry), IfcOpenShell.functions[formula].measure + ) if not iterator.next(): break @@ -122,47 +193,51 @@ class IfcOpenShell: ) -> ifcopenshell.geom.iterator: return ifcopenshell.geom.iterator(settings, ifc_file, multiprocessing.cpu_count(), include=elements) - @staticmethod - def get_functions() -> list[Function]: - return [ - Function("get_area", "Area", "The total surface area of the element"), - Function("get_bottom_elevation", "Bottom Elevation", "The local minimum Z ordinate"), - Function( - "get_footprint_area", - "Footprint Area", - "The area if the object's faces were projected along the Z-axis and seen top down", - ), - Function( - "get_footprint_perimeter", - "Footprint Perimeter", - "The perimeter if the object's faces were projected along the Z-axis and seen top down", - ), - Function( - "get_max_side_area", - "Max Side Area", - "The maximum side area when seen from either X, Y, or Z directions", - ), - Function("get_max_xyz", "Max XYZ", "The maximum X, Y, or Z local dimension"), - Function("get_min_xyz", "Min XYZ", "The minimum X, Y, or Z local dimension"), - Function( - "get_outer_surface_area", - "Outer Surface Area", - "The total surface area except for the top or bottom, such as the ends of columns or beams", - ), - Function( - "get_side_area", "Side area", "The side (non-projected) are of the shape as seen from the local Y-axis" - ), - Function("get_top_elevation", "Top elevation", "The local maximum Z ordinate"), - Function("get_volume", "Volume", "Calculates the volume of a manifold shape"), - Function("get_x", "X", "Calculates the length along the local X axis"), - Function("get_y", "Y", "Calculates the length along the local Y axis"), - Function("get_z", "Z", "Calculates the length along the local Z axis"), - ] - class Blender: """Calculates geometry based on currently loaded Blender objects.""" + functions = { + # IfcLengthMeasure + "get_covering_width": Function("IfcLengthMeasure", "Covering Width", ""), + "get_finish_ceiling_height": Function("IfcLengthMeasure", "Finish Ceiling Height", ""), + "get_finish_floor_height": Function("IfcLengthMeasure", "Finish Floor Height", ""), + "get_gross_perimeter": Function("IfcLengthMeasure", "Gross Perimeter", ""), + "get_height": Function("IfcLengthMeasure", "Height", ""), + "get_length": Function("IfcLengthMeasure", "Length", ""), + "get_opening_depth": Function("IfcLengthMeasure", "Opening Depth", ""), + "get_opening_height": Function("IfcLengthMeasure", "Opening Height", ""), + "get_rectangular_perimeter": Function("IfcLengthMeasure", "Rectangular Perimeter", ""), + "get_stair_length": Function("IfcLengthMeasure", "Stair Length", ""), + "get_width": Function("IfcLengthMeasure", "Width", ""), + # IfcAreaMeasure + "get_covering_gross_area": Function("IfcAreaMeasure", "Covering Gross Area", ""), + "get_covering_net_area": Function("IfcAreaMeasure", "Covering Net Area", ""), + "get_cross_section_area": Function("IfcAreaMeasure", "Cross Section Area", ""), + "get_gross_ceiling_area": Function("IfcAreaMeasure", "Gross Ceiling Area", ""), + "get_gross_footprint_area": Function("IfcAreaMeasure", "Gross Footprint Area", ""), + "get_gross_side_area": Function("IfcAreaMeasure", "Gross Side Area", ""), + "get_gross_stair_area": Function("IfcAreaMeasure", "Gross Stair Area", ""), + "get_gross_surface_area": Function("IfcAreaMeasure", "Gross Surface Area", ""), + "get_gross_top_area": Function("IfcAreaMeasure", "Gross Top Area", ""), + "get_net_ceiling_area": Function("IfcAreaMeasure", "Net Ceiling Area", ""), + "get_net_floor_area": Function("IfcAreaMeasure", "Net Floor Area", ""), + "get_net_footprint_area": Function("IfcAreaMeasure", "Net Footprint Area", ""), + "get_net_side_area": Function("IfcAreaMeasure", "Net Side Area", ""), + "get_net_stair_area": Function("IfcAreaMeasure", "Net Stair Area", ""), + "get_net_surface_area": Function("IfcAreaMeasure", "Net Surface Area", ""), + "get_net_top_area": Function("IfcAreaMeasure", "Net Top Area", ""), + "get_opening_mapping_area": Function("IfcAreaMeasure", "Opening Mapping Area", ""), + "get_outer_surface_area": Function("IfcAreaMeasure", "Outer Surface Area", ""), + # IfcVolumeMeasure + "get_gross_volume": Function("IfcVolumeMeasure", "Gross Volume", ""), + "get_net_volume": Function("IfcVolumeMeasure", "Net Volume", ""), + "get_space_net_volume": Function("IfcVolumeMeasure", "Space Net Volume", ""), + # IfcMassMeasure + "get_gross_weight": Function("IfcMassMeasure", "Gross Weight", ""), + "get_net_weight": Function("IfcMassMeasure", "Net Weight", ""), + } + @staticmethod def calculate( ifc_file: ifcopenshell.file, elements: set[ifcopenshell.entity_instance], qtos: dict, results: dict @@ -170,6 +245,7 @@ class Blender: import blenderbim.tool as tool import blenderbim.bim.module.qto.calculator as calculator + unit_converter = SI2ProjectUnitConverter(ifc_file) formula_functions = {} for element in elements: @@ -182,46 +258,9 @@ class Blender: for quantity, formula in quantities.items(): if not (formula_function := formula_functions.get(formula)): formula_function = formula_functions[formula] = getattr(calculator, formula) - results[element][name][quantity] = formula_function(obj) - - @staticmethod - def get_functions() -> list[Function]: - return [ - Function("get_covering_gross_area", "Covering Gross Area", ""), - Function("get_covering_net_area", "Covering Net Area", ""), - Function("get_covering_width", "Covering Width", ""), - Function("get_cross_section_area", "Cross Section Area", ""), - Function("get_finish_ceiling_height", "Finish Ceiling Height", ""), - Function("get_finish_floor_height", "Finish Floor Height", ""), - Function("get_gross_ceiling_area", "Gross Ceiling Area", ""), - Function("get_gross_footprint_area", "Gross Footprint Area", ""), - Function("get_gross_perimeter", "Gross Perimeter", ""), - Function("get_gross_side_area", "Gross Side Area", ""), - Function("get_gross_stair_area", "Gross Stair Area", ""), - Function("get_gross_surface_area", "Gross Surface Area", ""), - Function("get_gross_top_area", "Gross Top Area", ""), - Function("get_gross_volume", "Gross Volume", ""), - Function("get_gross_weight", "Gross Weight", ""), - Function("get_height", "Height", ""), - Function("get_length", "Length", ""), - Function("get_net_ceiling_area", "Net Ceiling Area", ""), - Function("get_net_floor_area", "Net Floor Area", ""), - Function("get_net_footprint_area", "Net Footprint Area", ""), - Function("get_net_side_area", "Net Side Area", ""), - Function("get_net_stair_area", "Net Stair Area", ""), - Function("get_net_surface_area", "Net Surface Area", ""), - Function("get_net_top_area", "Net Top Area", ""), - Function("get_net_volume", "Net Volume", ""), - Function("get_net_weight", "Net Weight", ""), - Function("get_opening_depth", "Opening Depth", ""), - Function("get_opening_height", "Opening Height", ""), - Function("get_opening_mapping_area", "Opening Mapping Area", ""), - Function("get_outer_surface_area", "Outer Surface Area", ""), - Function("get_rectangular_perimeter", "Rectangular Perimeter", ""), - Function("get_space_net_volume", "Space Net Volume", ""), - Function("get_stair_length", "Stair Length", ""), - Function("get_width", "Width", ""), - ] + results[element][name][quantity] = unit_converter.convert( + formula_function(obj), Blender.functions[formula].measure + ) calculators = {"Blender": Blender, "IfcOpenShell": IfcOpenShell} From 95daf7efa3cba4a66e31b06f8c7b03f30ca2af51 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 21:58:02 +1000 Subject: [PATCH 331/429] Minor fix to expose both net and gross variants of IfcOpenShell Qto calculator --- src/ifc5d/ifc5d/qto.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index 9adb00d58a..6fb1e080a7 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -89,7 +89,7 @@ class IfcOpenShell: """Calculates Model body context geometry using the default IfcOpenShell iterator on triangulation elements.""" - functions = { + raw_functions = { # IfcLengthMeasure "get_x": Function("IfcLengthMeasure", "X", "Calculates the length along the local X axis"), "get_y": Function("IfcLengthMeasure", "Y", "Calculates the length along the local Y axis"), @@ -129,6 +129,11 @@ class IfcOpenShell: "get_volume": Function("IfcVolumeMeasure", "Volume", "Calculates the volume of a manifold shape"), } + functions = {} + for k, v in raw_functions.items(): + functions[f"gross_{k}"] = Function(v.measure, f"Gross {v.name}", v.description) + functions[f"net_{k}"] = Function(v.measure, f"Net {v.name}", v.description) + @staticmethod def calculate( ifc_file: ifcopenshell.file, @@ -182,7 +187,7 @@ class IfcOpenShell: results[element].setdefault(name, {}) for quantity, formula in quantities.items(): results[element][name][quantity] = unit_converter.convert( - formula_functions[formula](shape.geometry), IfcOpenShell.functions[formula].measure + formula_functions[formula](shape.geometry), IfcOpenShell.raw_functions[formula].measure ) if not iterator.next(): break From d87665de7ef33efc9bdd4e3c00b1ee98d42bab64 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 29 May 2024 22:03:22 +1000 Subject: [PATCH 332/429] Minor fix --- src/blenderbim/blenderbim/bim/module/pset/operator.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index b3d55ba5e0..385a855a2b 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -140,6 +140,8 @@ class EditPset(bpy.types.Operator, Operator): ) else: for key, value in properties.items(): + if value is None: + continue if isinstance(value, float): properties[key] = round(value, 4) elif not isinstance(value, int): From cf9f792a3b07e843e8c0d1ee2075cf6197e0a309 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 29 May 2024 12:23:06 +0500 Subject: [PATCH 333/429] fix issue unlinking objects after d219856 `unlink_style` doesn't need `tool.Style` anymore and `obj` argument was replaced with `style` --- src/blenderbim/blenderbim/tool/root.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/tool/root.py b/src/blenderbim/blenderbim/tool/root.py index e83c470bbd..f1f36d6933 100644 --- a/src/blenderbim/blenderbim/tool/root.py +++ b/src/blenderbim/blenderbim/tool/root.py @@ -315,7 +315,7 @@ class Root(blenderbim.core.tool.Root): obj.data.BIMMeshProperties.ifc_definition_id = 0 for material_slot in obj.material_slots: if material_slot.material: - blenderbim.core.style.unlink_style(tool.Ifc, tool.Style, obj=material_slot.material) + blenderbim.core.style.unlink_style(tool.Ifc, style=material_slot.material) blenderbim.core.material.unlink_material(tool.Ifc, obj=material_slot.material) if "Ifc" in obj.name and "/" in obj.name: obj.name = obj.name.split("/", 1)[1] From 3679fccfbd5f5d94cddfdacdda5bb96e402c7781 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 29 May 2024 15:00:10 +0500 Subject: [PATCH 334/429] reload_representation to support multple objects and optimize the process --- src/blenderbim/blenderbim/tool/geometry.py | 46 ++++++++++++++-------- src/blenderbim/blenderbim/tool/material.py | 10 +---- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 8031433e21..64c99d1c67 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -40,7 +40,7 @@ import blenderbim.bim.import_ifc from math import radians, pi from mathutils import Vector, Matrix from blenderbim.bim.ifc import IfcStore -from typing import Union +from typing import Union, Iterable class Geometry(blenderbim.core.tool.Geometry): @@ -755,21 +755,35 @@ class Geometry(blenderbim.core.tool.Geometry): bpy.context.view_layer.update() @classmethod - def reload_representation(cls, obj): - """reload `obj` active representation""" - if not obj.data: - return - representation = tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) - blenderbim.core.geometry.switch_representation( - tool.Ifc, - tool.Geometry, - obj=obj, - representation=representation, - should_reload=True, - is_global=True, - should_sync_changes_first=False, - apply_openings=True, - ) + def reload_representation(cls, obj_or_objs: Union[bpy.types.Object, Iterable[bpy.types.Object]]) -> None: + """Reload object/objects active representation. + + Ensures that same representations won't be reloaded multiple times. + """ + objs = obj_or_objs if isinstance(obj_or_objs, Iterable) else [obj_or_objs] + + # Filter out unique meshes to avoid + # reloading the same representation multiple times. + meshes_to_objects: dict[bpy.types.Mesh, bpy.types.Object] + meshes_to_objects = dict() + for obj in objs: + mesh = obj.data + if not mesh: + continue + meshes_to_objects.setdefault(mesh, obj) + + for obj in meshes_to_objects.values(): + representation = tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) + blenderbim.core.geometry.switch_representation( + tool.Ifc, + tool.Geometry, + obj=obj, + representation=representation, + should_reload=True, + is_global=True, + should_sync_changes_first=False, + apply_openings=True, + ) @classmethod def remove_representation_item(cls, representation_item): diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index 5c76fa6197..a1bd4a51b8 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -228,14 +228,8 @@ class Material(blenderbim.core.tool.Material): def update_elements_using_material(cls, material): # update elements that are using this material elements = ifcopenshell.util.element.get_elements_by_material(tool.Ifc.get(), material) - # filter only unique representations to avoid reloading same representations multiple times - meshes_to_objects = dict() - for e in elements: - obj = tool.Ifc.get_object(e) - mesh = obj.data - meshes_to_objects[mesh] = obj - for obj in meshes_to_objects.values(): - tool.Geometry.reload_representation(obj) + objects = [tool.Ifc.get_object(e) for e in elements] + tool.Geometry.reload_representation(objects) @classmethod def sync_blender_material_name(cls, material): From 45a16554857336d11b512eed30dc78b1719ccf9a Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 29 May 2024 17:39:41 +0500 Subject: [PATCH 335/429] typing --- .../blenderbim/bim/module/cost/data.py | 5 +- .../bim/module/geometry/operator.py | 1 + .../blenderbim/bim/module/style/operator.py | 1 + src/blenderbim/blenderbim/core/aggregate.py | 38 +++++++-- src/blenderbim/blenderbim/core/material.py | 56 +++++++++---- src/blenderbim/blenderbim/core/style.py | 44 +++++++--- src/blenderbim/blenderbim/tool/aggregate.py | 11 ++- src/blenderbim/blenderbim/tool/material.py | 60 ++++++++------ src/blenderbim/blenderbim/tool/profile.py | 15 ++-- src/blenderbim/blenderbim/tool/root.py | 51 ++++++++---- src/blenderbim/blenderbim/tool/style.py | 82 ++++++++++--------- src/ifc5d/ifc5d/ifc5Dspreadsheet.py | 32 +++++--- .../ifcopenshell/util/element.py | 4 +- 13 files changed, 260 insertions(+), 140 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/cost/data.py b/src/blenderbim/blenderbim/bim/module/cost/data.py index 1c424cb1d6..09698a54be 100644 --- a/src/blenderbim/blenderbim/bim/module/cost/data.py +++ b/src/blenderbim/blenderbim/bim/module/cost/data.py @@ -198,8 +198,11 @@ class CostSchedulesData: # data["DerivedUnitSymbol"] = "?" # print("Total Cost", data["DerivedTotalCostQuantity"], cost_item.Name) + # TODO: dead code? @classmethod - def _get_object_quantities(cls, cost_item, element): + def _get_object_quantities( + cls, cost_item: ifcopenshell.entity_instance, element: ifcopenshell.entity_instance + ) -> list[int]: if not element.is_a("IfcObject"): return [] cost_quantities = cost_item.CostQuantities diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index a26831bff1..385ca383c9 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -28,6 +28,7 @@ import ifcopenshell.util.element import ifcopenshell.util.representation import ifcopenshell.util.placement import ifcopenshell.api +import blenderbim.core.geometry import blenderbim.core.geometry as core import blenderbim.core.aggregate import blenderbim.core.style diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index e8b0479f9c..cf36eee95e 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -22,6 +22,7 @@ import blenderbim.bim.helper import blenderbim.bim.handler import blenderbim.tool as tool import blenderbim.core.style as core +import ifcopenshell.api import ifcopenshell.util.representation from blenderbim.bim.module.style.prop import switch_shading from pathlib import Path diff --git a/src/blenderbim/blenderbim/core/aggregate.py b/src/blenderbim/blenderbim/core/aggregate.py index 58d10814a7..44d4444f79 100644 --- a/src/blenderbim/blenderbim/core/aggregate.py +++ b/src/blenderbim/blenderbim/core/aggregate.py @@ -16,16 +16,30 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Union -def enable_editing_aggregate(aggregator, obj=None): +if TYPE_CHECKING: + import bpy + import ifcopenshell + import blenderbim.tool as tool + + +def enable_editing_aggregate(aggregator: tool.Aggregate, obj: bpy.types.Object) -> None: aggregator.enable_editing(obj) -def disable_editing_aggregate(aggregator, obj=None): +def disable_editing_aggregate(aggregator: tool.Aggregate, obj: bpy.types.Object) -> None: aggregator.disable_editing(obj) -def assign_object(ifc, aggregator, collector, relating_obj=None, related_obj=None): +def assign_object( + ifc: tool.Ifc, + aggregator: tool.Aggregate, + collector: tool.Collector, + relating_obj: Optional[bpy.types.Object] = None, + related_obj: Optional[bpy.types.Object] = None, +) -> Union[ifcopenshell.entity_instance, None]: if not aggregator.can_aggregate(relating_obj, related_obj): return rel = ifc.run( @@ -37,7 +51,13 @@ def assign_object(ifc, aggregator, collector, relating_obj=None, related_obj=Non return rel -def unassign_object(ifc, aggregate, collector, relating_obj=None, related_obj=None): +def unassign_object( + ifc: tool.Ifc, + aggregate: tool.Aggregate, + collector: tool.Collector, + relating_obj: Optional[bpy.types.Object] = None, + related_obj: Optional[bpy.types.Object] = None, +) -> None: related_element = ifc.get_entity(related_obj) container = aggregate.get_container(related_element) if not relating_obj: @@ -52,7 +72,15 @@ def unassign_object(ifc, aggregate, collector, relating_obj=None, related_obj=No collector.assign(related_obj) -def add_part_to_object(ifc, aggregator, collector, blender, obj, part_class, part_name=None): +def add_part_to_object( + ifc: tool.Ifc, + aggregator: tool.Aggregate, + collector: tool.Collector, + blender: tool.Blender, + obj: bpy.types.Object, + part_class: str, + part_name: Optional[str] = None, +) -> None: part_obj = blender.create_ifc_object(ifc_class=part_class, name=part_name) assign_object(ifc, aggregator, collector, relating_obj=obj, related_obj=part_obj) blender.set_active_object(obj) diff --git a/src/blenderbim/blenderbim/core/material.py b/src/blenderbim/blenderbim/core/material.py index bd3eb87748..5a33704ead 100644 --- a/src/blenderbim/blenderbim/core/material.py +++ b/src/blenderbim/blenderbim/core/material.py @@ -16,15 +16,33 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Union -def unlink_material(ifc, obj=None): +if TYPE_CHECKING: + import bpy + import ifcopenshell + import blenderbim.tool as tool + + +def unlink_material(ifc: tool.Ifc, obj: bpy.types.Material) -> None: ifc.unlink(obj=obj) -def add_material(ifc, material, style, obj=None, name=None, category=None, description=None): +def add_material( + ifc: tool.Ifc, + material: tool.Material, + style: tool.Style, + obj: Optional[bpy.types.Material] = None, + name: Optional[str] = None, + category: Optional[str] = None, + description: Optional[str] = None, +) -> ifcopenshell.entity_instance: if not obj: obj = material.add_default_material_object(name) - ifc_material = ifc.run("material.add_material", name=material.get_name(obj), category=category, description=description) + ifc_material = ifc.run( + "material.add_material", name=material.get_name(obj), category=category, description=description + ) ifc.link(ifc_material, obj) ifc_style = style.get_style(obj) if ifc_style: @@ -36,14 +54,16 @@ def add_material(ifc, material, style, obj=None, name=None, category=None, descr return ifc_material -def add_material_set(ifc, material, set_type=None): +def add_material_set(ifc: tool.Ifc, material: tool.Material, set_type: str) -> ifcopenshell.entity_instance: ifc_material = ifc.run("material.add_material_set", name="Unnamed", set_type=set_type) if material.is_editing_materials(): material.import_material_definitions(material.get_active_material_type()) return ifc_material -def remove_material(ifc, material_tool, style, material=None) -> bool: +def remove_material( + ifc: tool.Ifc, material_tool: tool.Material, style: tool.Style, material: ifcopenshell.entity_instance +) -> bool: """returns True after deleting False,\n returns False if material used in material sets and cannot be removed""" if material_tool.is_material_used_in_sets(material): @@ -58,31 +78,33 @@ def remove_material(ifc, material_tool, style, material=None) -> bool: return True -def remove_material_set(ifc, material_tool, material=None): +def remove_material_set(ifc: tool.Ifc, material_tool: tool.Material, material: ifcopenshell.entity_instance) -> None: ifc.run("material.remove_material_set", material=material) if material_tool.is_editing_materials(): material_tool.import_material_definitions(material_tool.get_active_material_type()) -def load_materials(material, material_type=None): +def load_materials(material: tool.Material, material_type: str) -> None: material.import_material_definitions(material_type) material.enable_editing_materials() -def disable_editing_materials(material): +def disable_editing_materials(material: tool.Material) -> None: material.disable_editing_materials() -def select_by_material(material_tool, spatial, material=None): +def select_by_material( + material_tool: tool.Material, spatial: tool.Spatial, material: ifcopenshell.entity_instance +) -> None: spatial.select_products(material_tool.get_elements_by_material(material)) -def enable_editing_material(material_tool, material): +def enable_editing_material(material_tool: tool.Material, material: ifcopenshell.entity_instance) -> None: material_tool.load_material_attributes(material) material_tool.enable_editing_material(material) -def edit_material(ifc, material_tool, material): +def edit_material(ifc: tool.Ifc, material_tool: tool.Material, material: ifcopenshell.entity_instance) -> None: attributes = material_tool.get_material_attributes() ifc.run("material.edit_material", material=material, attributes=attributes) material_tool.sync_blender_material_name(material) @@ -92,11 +114,13 @@ def edit_material(ifc, material_tool, material): material_tool.enable_editing_materials() -def disable_editing_material(material_tool): +def disable_editing_material(material_tool: tool.Material) -> None: material_tool.disable_editing_material() -def assign_material(ifc, material_tool, material_type, objects): +def assign_material( + ifc: tool.Ifc, material_tool: tool.Material, material_type: Union[str, None], objects: list[bpy.types.Object] +) -> None: material_type = material_type or material_tool.get_active_object_material() material = material_tool.get_active_material() for obj in objects: @@ -109,7 +133,7 @@ def assign_material(ifc, material_tool, material_type, objects): material_tool.add_material_to_set(material_set=assigned_material, material=material) -def unassign_material(ifc, material_tool, objects): +def unassign_material(ifc: tool.Ifc, material_tool: tool.Material, objects: list[bpy.types.Object]) -> None: for obj in objects: element = ifc.get_entity(obj) if element: @@ -125,7 +149,9 @@ def unassign_material(ifc, material_tool, objects): ifc.run("material.unassign_material", products=[element]) -def patch_non_parametric_mep_segment(ifc, material_tool, profile_tool, obj): +def patch_non_parametric_mep_segment( + ifc: tool.Ifc, material_tool: tool.Material, profile_tool: tool.Profile, obj: bpy.types.Object +) -> None: element = ifc.get_entity(obj) if not element: return diff --git a/src/blenderbim/blenderbim/core/style.py b/src/blenderbim/blenderbim/core/style.py index 13576cb80f..f22b4b15d9 100644 --- a/src/blenderbim/blenderbim/core/style.py +++ b/src/blenderbim/blenderbim/core/style.py @@ -16,8 +16,16 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from __future__ import annotations +from typing import TYPE_CHECKING, Optional, Any -def add_style(ifc, style, obj=None): +if TYPE_CHECKING: + import bpy + import ifcopenshell + import blenderbim.tool as tool + + +def add_style(ifc: tool.Ifc, style: tool.Style, obj: bpy.types.Material) -> ifcopenshell.entity_instance: element = ifc.run("style.add_style", name=style.get_name(obj)) ifc.link(element, obj) if style.can_support_rendering_style(obj): @@ -33,18 +41,26 @@ def add_style(ifc, style, obj=None): return element -def add_external_style(ifc, style, obj, attributes): +def add_external_style(ifc: tool.Ifc, style: tool.Style, obj: bpy.types.Material, attributes: dict[str, Any]) -> None: element = style.get_style(obj) ifc.run( "style.add_surface_style", style=element, ifc_class="IfcExternallyDefinedSurfaceStyle", attributes=attributes ) -def update_external_style(ifc, style, external_style, attributes): +# TODO: unused `style` argument? +def update_external_style( + ifc: tool.Ifc, + style: ifcopenshell.entity_instance, + external_style: ifcopenshell.entity_instance, + attributes: dict[str, Any], +) -> None: ifc.run("style.edit_surface_style", style=external_style, attributes=attributes) -def remove_style(ifc, material, style_tool, style=None): +def remove_style( + ifc: tool.Ifc, material: tool.Material, style_tool: tool.Style, style: ifcopenshell.entity_instance +) -> None: obj = ifc.get_object(style) ifc.unlink(obj=obj, element=style) ifc.run("style.remove_style", style=style) @@ -54,7 +70,7 @@ def remove_style(ifc, material, style_tool, style=None): style_tool.import_presentation_styles(style_tool.get_active_style_type()) -def update_style_colours(ifc, style, obj=None, verbose=False): +def update_style_colours(ifc: tool.Ifc, style: tool.Style, obj: bpy.types.Material, verbose: bool = False) -> None: element = style.get_style(obj) if style.can_support_rendering_style(obj): @@ -91,7 +107,9 @@ def update_style_colours(ifc, style, obj=None, verbose=False): style.record_shading(obj) -def update_style_textures(ifc, style, obj=None, representation=None): +def update_style_textures( + ifc: tool.Ifc, style: tool.Style, obj: ifcopenshell.entity_instance, representation: ifcopenshell.entity_instance +) -> None: element = style.get_style(obj) uv_maps = style.get_uv_maps(representation) @@ -111,34 +129,34 @@ def update_style_textures(ifc, style, obj=None, representation=None): ifc.run("style.remove_surface_style", style=texture_style) -def unlink_style(ifc, style=None): +def unlink_style(ifc: tool.Ifc, style: ifcopenshell.entity_instance) -> None: obj = ifc.get_object(style) ifc.unlink(obj=obj, element=style) -def enable_editing_style(style, obj=None): +def enable_editing_style(style: tool.Style, obj: bpy.types.Material) -> None: style.enable_editing(obj) style.import_surface_attributes(style.get_style(obj), obj) -def disable_editing_style(style, obj=None): +def disable_editing_style(style: tool.Style, obj: bpy.types.Material) -> None: style.disable_editing(obj) -def edit_style(ifc, style, obj=None): +def edit_style(ifc: tool.Ifc, style: tool.Style, obj: bpy.types.Material) -> None: attributes = style.export_surface_attributes(obj) ifc.run("style.edit_presentation_style", style=style.get_style(obj), attributes=attributes) style.disable_editing(obj) -def load_styles(style, style_type=None): +def load_styles(style: tool.Style, style_type: str) -> None: style.import_presentation_styles(style_type) style.enable_editing_styles() -def disable_editing_styles(style): +def disable_editing_styles(style: tool.Style) -> None: style.disable_editing_styles() -def select_by_style(style_tool, spatial, style=None): +def select_by_style(style_tool: tool.Style, spatial: tool.Spatial, style: ifcopenshell.entity_instance) -> None: spatial.select_products(style_tool.get_elements_by_style(style)) diff --git a/src/blenderbim/blenderbim/tool/aggregate.py b/src/blenderbim/blenderbim/tool/aggregate.py index 66e549f67d..9188e12a32 100644 --- a/src/blenderbim/blenderbim/tool/aggregate.py +++ b/src/blenderbim/blenderbim/tool/aggregate.py @@ -20,6 +20,7 @@ import bpy import blenderbim.core.tool import blenderbim.tool as tool import ifcopenshell.util.element +from typing import Union class Aggregate(blenderbim.core.tool.Aggregate): @@ -46,19 +47,21 @@ class Aggregate(blenderbim.core.tool.Aggregate): return False @classmethod - def disable_editing(cls, obj): + def disable_editing(cls, obj: bpy.types.Object) -> None: obj.BIMObjectAggregateProperties.is_editing = False @classmethod - def enable_editing(cls, obj): + def enable_editing(cls, obj: bpy.types.Object) -> None: obj.BIMObjectAggregateProperties.is_editing = True @classmethod - def get_container(cls, element): + def get_container(cls, element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: return ifcopenshell.util.element.get_container(element) @classmethod - def get_relating_object(cls, related_element): + def get_relating_object( + cls, related_element: ifcopenshell.entity_instance + ) -> Union[ifcopenshell.entity_instance, None]: for rel in related_element.Decomposes: if rel.is_a("IfcRelAggregates"): return rel.RelatingObject diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index a1bd4a51b8..4a72301f2f 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -19,43 +19,45 @@ import bpy import ifcopenshell import blenderbim.core.tool +import blenderbim.core.material import blenderbim.tool as tool import blenderbim.bim.helper import ifcopenshell.util.unit import ifcopenshell.util.element +from typing import Union, Any class Material(blenderbim.core.tool.Material): @classmethod - def add_default_material_object(cls, name): + def add_default_material_object(cls, name: Union[str, None]) -> bpy.types.Material: return bpy.data.materials.new(name or "Default") @classmethod - def delete_object(cls, obj): + def delete_object(cls, obj: bpy.types.Material) -> None: bpy.data.materials.remove(obj) @classmethod - def disable_editing_materials(cls): + def disable_editing_materials(cls) -> None: bpy.context.scene.BIMMaterialProperties.is_editing = False @classmethod - def enable_editing_materials(cls): + def enable_editing_materials(cls) -> None: bpy.context.scene.BIMMaterialProperties.is_editing = True @classmethod - def get_active_material_type(cls): + def get_active_material_type(cls) -> str: return bpy.context.scene.BIMMaterialProperties.material_type @classmethod - def get_elements_by_material(cls, material): + def get_elements_by_material(cls, material: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return ifcopenshell.util.element.get_elements_by_material(tool.Ifc.get(), material) @classmethod - def get_name(cls, obj): + def get_name(cls, obj: bpy.types.Material) -> str: return obj.name @classmethod - def import_material_definitions(cls, material_type): + def import_material_definitions(cls, material_type: str) -> None: props = bpy.context.scene.BIMMaterialProperties expanded_categories = {m.name for m in props.materials if m.is_expanded} props.materials.clear() @@ -89,11 +91,11 @@ class Material(blenderbim.core.tool.Material): new.total_elements = len(ifcopenshell.util.element.get_elements_by_material(tool.Ifc.get(), material)) @classmethod - def is_editing_materials(cls): + def is_editing_materials(cls) -> bool: return bpy.context.scene.BIMMaterialProperties.is_editing @classmethod - def is_material_used_in_sets(cls, material): + def is_material_used_in_sets(cls, material: ifcopenshell.entity_instance) -> bool: for inverse in tool.Ifc.get().get_inverse(material): if inverse.is_a() in [ "IfcMaterialProfile", @@ -105,48 +107,50 @@ class Material(blenderbim.core.tool.Material): return False @classmethod - def load_material_attributes(cls, material): + def load_material_attributes(cls, material: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMMaterialProperties props.material_attributes.clear() blenderbim.bim.helper.import_attributes2(material, props.material_attributes) @classmethod - def enable_editing_material(cls, material): + def enable_editing_material(cls, material: ifcopenshell.entity_instance) -> None: props = bpy.context.scene.BIMMaterialProperties props.active_material_id = material.id() props.editing_material_type = "ATTRIBUTES" @classmethod - def get_material_attributes(cls): + def get_material_attributes(cls) -> dict[str, Any]: return blenderbim.bim.helper.export_attributes(bpy.context.scene.BIMMaterialProperties.material_attributes) @classmethod - def disable_editing_material(cls): + def disable_editing_material(cls) -> None: props = bpy.context.scene.BIMMaterialProperties props.active_material_id = 0 props.editing_material_type = "" @classmethod - def get_type(cls, element): + def get_type(cls, element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: return ifcopenshell.util.element.get_type(element) @classmethod - def get_active_object_material(cls): + def get_active_object_material(cls) -> Union[str, None]: active_obj = bpy.context.active_object if not active_obj: return return active_obj.BIMObjectMaterialProperties.material_type @classmethod - def get_active_material(cls): + def get_active_material(cls) -> ifcopenshell.entity_instance: return tool.Ifc.get().by_id(int(bpy.context.active_object.BIMObjectMaterialProperties.material)) @classmethod - def get_material(cls, element, should_inherit=False): + def get_material( + cls, element: ifcopenshell.entity_instance, should_inherit: bool = False + ) -> Union[ifcopenshell.entity_instance, None]: return ifcopenshell.util.element.get_material(element, should_inherit=should_inherit) @classmethod - def is_a_material_set(cls, material): + def is_a_material_set(cls, material: ifcopenshell.entity_instance) -> bool: return material.is_a() in [ "IfcMaterialConstituentSet", "IfcMaterialLayerSet", @@ -154,7 +158,9 @@ class Material(blenderbim.core.tool.Material): ] @classmethod - def add_material_to_set(cls, material_set, material): + def add_material_to_set( + cls, material_set: ifcopenshell.entity_instance, material: ifcopenshell.entity_instance + ) -> None: if material_set.is_a("IfcMaterialConstituentSet"): if not material_set.MaterialConstituents: tool.Ifc.run( @@ -195,7 +201,7 @@ class Material(blenderbim.core.tool.Material): ) @classmethod - def has_material_profile(cls, element): + def has_material_profile(cls, element: ifcopenshell.entity_instance) -> bool: material = cls.get_material(element, should_inherit=False) inherited_material = cls.get_material(element, should_inherit=True) if material and "Profile" in material.is_a(): @@ -205,11 +211,13 @@ class Material(blenderbim.core.tool.Material): return False @classmethod - def is_a_flow_segment(cls, element): + def is_a_flow_segment(cls, element: ifcopenshell.entity_instance) -> bool: return element.is_a("IfcFlowSegment") @classmethod - def replace_material_with_material_profile(cls, element): + def replace_material_with_material_profile( + cls, element: ifcopenshell.entity_instance + ) -> ifcopenshell.entity_instance: old_material = cls.get_material(element, should_inherit=False) old_inherited_material = cls.get_material(element, should_inherit=True) material = old_material if old_material and old_material.is_a("IfcMaterial") else None @@ -225,14 +233,14 @@ class Material(blenderbim.core.tool.Material): return material_profile @classmethod - def update_elements_using_material(cls, material): + def update_elements_using_material(cls, material: ifcopenshell.entity_instance) -> None: # update elements that are using this material elements = ifcopenshell.util.element.get_elements_by_material(tool.Ifc.get(), material) objects = [tool.Ifc.get_object(e) for e in elements] tool.Geometry.reload_representation(objects) @classmethod - def sync_blender_material_name(cls, material): + def sync_blender_material_name(cls, material: ifcopenshell.entity_instance) -> None: name = material.Name or "Unnamed" obj = tool.Ifc.get_object(material) if obj: @@ -245,7 +253,7 @@ class Material(blenderbim.core.tool.Material): obj.name = name @classmethod - def get_style(cls, material): + def get_style(cls, material: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: for material_representation in material.HasRepresentation: for representation in material_representation.Representations: for item in representation.Items: diff --git a/src/blenderbim/blenderbim/tool/profile.py b/src/blenderbim/blenderbim/tool/profile.py index c0295be0c7..10e8613694 100644 --- a/src/blenderbim/blenderbim/tool/profile.py +++ b/src/blenderbim/blenderbim/tool/profile.py @@ -17,18 +17,23 @@ # along with BlenderBIM Add-on. If not, see . import ifcopenshell +import ifcopenshell.geom import ifcopenshell.util.element import ifcopenshell.util.unit import ifcopenshell.util.placement import ifcopenshell.util.representation import blenderbim.core.tool import blenderbim.tool as tool +import PIL.ImageDraw from blenderbim.bim.module.model.decorator import ProfileDecorator +from typing import Union class Profile(blenderbim.core.tool.Profile): @classmethod - def draw_image_for_ifc_profile(cls, draw, profile, size): + def draw_image_for_ifc_profile( + cls, draw: PIL.ImageDraw.ImageDraw, profile: ifcopenshell.entity_instance, size: float + ) -> None: """generates image based on `profile` using `PIL.ImageDraw`""" settings = ifcopenshell.geom.settings() settings.set(settings.INCLUDE_CURVES, True) @@ -57,11 +62,11 @@ class Profile(blenderbim.core.tool.Profile): draw.line((tuple(grouped_verts[e[0]]), tuple(grouped_verts[e[1]])), fill="white", width=2) @classmethod - def is_editing_profile(cls): - return ProfileDecorator.installed + def is_editing_profile(cls) -> bool: + return bool(ProfileDecorator.installed) @classmethod - def get_profile(cls, element): + def get_profile(cls, element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: representations = element.Representation for representation in representations.Representations: if not representation.is_a("IfcShapeRepresentation"): @@ -74,7 +79,7 @@ class Profile(blenderbim.core.tool.Profile): return None @classmethod - def get_model_profiles(cls): + def get_model_profiles(cls) -> list[ifcopenshell.entity_instance]: return tool.Ifc.get().by_type("IfcProfileDef") @classmethod diff --git a/src/blenderbim/blenderbim/tool/root.py b/src/blenderbim/blenderbim/tool/root.py index f1f36d6933..057644e9f5 100644 --- a/src/blenderbim/blenderbim/tool/root.py +++ b/src/blenderbim/blenderbim/tool/root.py @@ -21,6 +21,7 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.util.representation import ifcopenshell.util.element +import ifcopenshell.util.placement import blenderbim.core.tool import blenderbim.core.aggregate import blenderbim.core.geometry @@ -29,17 +30,17 @@ import blenderbim.core.style import blenderbim.tool as tool from mathutils import Vector from blenderbim.bim.module.model.opening import FilledOpeningGenerator -from typing import Union, Optional +from typing import Union, Optional, Any class Root(blenderbim.core.tool.Root): @classmethod - def add_tracked_opening(cls, obj): + def add_tracked_opening(cls, obj: bpy.types.Object) -> None: new = bpy.context.scene.BIMModelProperties.openings.add() new.obj = obj @classmethod - def assign_body_styles(cls, element, obj): + def assign_body_styles(cls, element: ifcopenshell.entity_instance, obj: bpy.types.Object) -> None: # Should this even be here? Should it be in the geometry tool? body = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") if body: @@ -56,7 +57,7 @@ class Root(blenderbim.core.tool.Root): ) @classmethod - def copy_representation(cls, source, dest): + def copy_representation(cls, source: ifcopenshell.entity_instance, dest: ifcopenshell.entity_instance) -> None: def exclude_callback(attribute): return attribute.is_a("IfcProfileDef") and attribute.ProfileName @@ -80,11 +81,13 @@ class Root(blenderbim.core.tool.Root): ] @classmethod - def does_type_have_representations(cls, element): + def does_type_have_representations(cls, element: ifcopenshell.entity_instance) -> bool: return bool(element.RepresentationMaps) @classmethod - def get_decomposition_relationships(cls, objs): + def get_decomposition_relationships( + cls, objs: list[bpy.types.Object] + ) -> dict[ifcopenshell.entity_instance, dict[str, Any]]: relationships = {} for obj in objs: element = tool.Ifc.get_entity(obj) @@ -96,7 +99,9 @@ class Root(blenderbim.core.tool.Root): return relationships @classmethod - def get_connection_relationships(cls, objs): + def get_connection_relationships( + cls, objs: list[bpy.types.Object] + ) -> dict[ifcopenshell.entity_instance, dict[str, Any]]: relationships = {} for obj in objs: element = tool.Ifc.get_entity(obj) @@ -119,7 +124,9 @@ class Root(blenderbim.core.tool.Root): return relationships @classmethod - def get_element_representation(cls, element, context): + def get_element_representation( + cls, element: ifcopenshell.entity_instance, context: ifcopenshell.entity_instance + ) -> Union[ifcopenshell.entity_instance, None]: if context.is_a("IfcGeometricRepresentationSubContext"): return ifcopenshell.util.representation.get_representation( element, @@ -134,13 +141,13 @@ class Root(blenderbim.core.tool.Root): return ifcopenshell.util.element.get_type(element) @classmethod - def get_object_name(cls, obj): + def get_object_name(cls, obj: bpy.types.Object) -> None: if "." in obj.name and obj.name.split(".")[-1].isnumeric(): return ".".join(obj.name.split(".")[:-1]) return obj.name @classmethod - def get_object_representation(cls, obj): + def get_object_representation(cls, obj: bpy.types.Object) -> Union[ifcopenshell.entity_instance, None]: if obj.data and obj.data.BIMMeshProperties.ifc_definition_id: return tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) element = tool.Ifc.get_entity(obj) @@ -152,19 +159,21 @@ class Root(blenderbim.core.tool.Root): return element.Representation.Representations[0] @classmethod - def get_representation_context(cls, representation): + def get_representation_context(cls, representation: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: return representation.ContextOfItems @classmethod - def is_element_a(cls, element, ifc_class): + def is_element_a(cls, element: ifcopenshell.entity_instance, ifc_class: str) -> bool: return element.is_a(ifc_class) @classmethod - def link_object_data(cls, source_obj, destination_obj): + def link_object_data(cls, source_obj: bpy.types.Object, destination_obj: bpy.types.Object) -> None: destination_obj.data = source_obj.data @classmethod - def recreate_decompositions(cls, relationships, old_to_new): + def recreate_decompositions( + cls, relationships, old_to_new: dict[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]] + ) -> None: for subelement, data in relationships.items(): new_subelements = old_to_new.get(subelement) new_elements = old_to_new.get(data["element"]) @@ -227,7 +236,11 @@ class Root(blenderbim.core.tool.Root): ) @classmethod - def recreate_connections(cls, relationship, old_to_new): + def recreate_connections( + cls, + relationship: dict[ifcopenshell.entity_instance, dict[str, Any]], + old_to_new: dict[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]], + ) -> None: for element, data in relationship.items(): try: new_relating_element = old_to_new.get(data["relating_element"])[0] @@ -244,7 +257,9 @@ class Root(blenderbim.core.tool.Root): ) @classmethod - def recreate_aggregate(cls, old_to_new): + def recreate_aggregate( + cls, old_to_new: dict[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]] + ) -> None: for old, new in old_to_new.items(): old_aggregate = ifcopenshell.util.element.get_aggregate(old) if old_aggregate: @@ -301,7 +316,7 @@ class Root(blenderbim.core.tool.Root): ) @classmethod - def set_object_name(cls, obj, element): + def set_object_name(cls, obj: bpy.types.Object, element: ifcopenshell.entity_instance) -> None: # This disables the Blender name event handler obj.BIMObjectProperties.is_renaming = True name = getattr(element, "Name", getattr(element, "AxisTag", None)) @@ -309,7 +324,7 @@ class Root(blenderbim.core.tool.Root): obj.BIMObjectProperties.is_renaming = False @classmethod - def unlink_object(cls, obj): + def unlink_object(cls, obj: bpy.types.Object) -> None: tool.Ifc.unlink(obj=obj) if hasattr(obj.data, "BIMMeshProperties"): obj.data.BIMMeshProperties.ifc_definition_id = 0 diff --git a/src/blenderbim/blenderbim/tool/style.py b/src/blenderbim/blenderbim/tool/style.py index 9ff8c9aa4c..ae99214599 100644 --- a/src/blenderbim/blenderbim/tool/style.py +++ b/src/blenderbim/blenderbim/tool/style.py @@ -20,11 +20,12 @@ import bpy import numpy as np import ifcopenshell import ifcopenshell.util.element +import ifcopenshell.util.representation import blenderbim.core.tool import blenderbim.tool as tool import blenderbim.bim.helper from mathutils import Color -from typing import Union +from typing import Union, Any, Optional # fmt: off TEXTURE_MAPS_BY_METHODS = { @@ -45,19 +46,19 @@ STYLE_PROPS_MAP = { class Style(blenderbim.core.tool.Style): @classmethod - def can_support_rendering_style(cls, obj): + def can_support_rendering_style(cls, obj: bpy.types.Material) -> bool: return obj.use_nodes and hasattr(obj.node_tree, "nodes") @classmethod - def disable_editing(cls, obj): + def disable_editing(cls, obj: bpy.types.Material) -> None: obj.BIMStyleProperties.is_editing = False @classmethod - def disable_editing_external_style(cls, obj): + def disable_editing_external_style(cls, obj: bpy.types.Material) -> None: obj.BIMStyleProperties.is_editing_external_style = False @classmethod - def disable_editing_styles(cls): + def disable_editing_styles(cls) -> None: bpy.context.scene.BIMStylesProperties.is_editing = False @classmethod @@ -67,39 +68,40 @@ class Style(blenderbim.core.tool.Style): return new_style @classmethod - def enable_editing(cls, obj): + def enable_editing(cls, obj: bpy.types.Material) -> None: obj.BIMStyleProperties.is_editing = True @classmethod - def enable_editing_external_style(cls, obj): + def enable_editing_external_style(cls, obj: bpy.types.Material) -> None: obj.BIMStyleProperties.is_editing_external_style = True @classmethod - def enable_editing_styles(cls): + def enable_editing_styles(cls) -> None: bpy.context.scene.BIMStylesProperties.is_editing = True @classmethod - def export_surface_attributes(cls, obj): + def export_surface_attributes(cls, obj: bpy.types.Material) -> dict[str, Any]: return blenderbim.bim.helper.export_attributes(obj.BIMStyleProperties.attributes) @classmethod - def export_external_style_attributes(cls, obj): + def export_external_style_attributes(cls, obj: bpy.types.Material) -> dict[str, Any]: return blenderbim.bim.helper.export_attributes(obj.BIMStyleProperties.external_style_attributes) @classmethod - def get_active_style_type(cls): + def get_active_style_type(cls) -> str: return bpy.context.scene.BIMStylesProperties.style_type + # TODO: `obj` argument is unused? @classmethod - def get_context(cls, obj): + def get_context(cls, obj) -> Union[ifcopenshell.entity_instance, None]: return ifcopenshell.util.representation.get_context(tool.Ifc.get(), "Model", "Body", "MODEL_VIEW") @classmethod - def get_elements_by_style(cls, style): + def get_elements_by_style(cls, style: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return ifcopenshell.util.element.get_elements_by_style(tool.Ifc.get(), style) @classmethod - def get_name(cls, obj): + def get_name(cls, obj: bpy.types.Material) -> str: return obj.name @classmethod @@ -126,7 +128,7 @@ class Style(blenderbim.core.tool.Style): return style_elements @classmethod - def get_shading_style_data_from_props(cls) -> dict: + def get_shading_style_data_from_props(cls) -> dict[str, Any]: """returns style data from blender props in similar way to `Loader.surface_style_to_dict` to be compatible with `Loader.create_surface_style_rendering`""" surface_style_data = dict() @@ -154,7 +156,7 @@ class Style(blenderbim.core.tool.Style): return surface_style_data @classmethod - def get_texture_style_data_from_props(cls) -> list[dict]: + def get_texture_style_data_from_props(cls) -> list[dict[str, Any]]: """returns style data from blender props in similar way to `Loader.surface_texture_to_dict` to be compatible with `Loader.create_surface_style_with_textures`""" props = bpy.context.scene.BIMStylesProperties @@ -174,7 +176,7 @@ class Style(blenderbim.core.tool.Style): return textures @classmethod - def set_surface_style_props(cls): + def set_surface_style_props(cls) -> None: """set blender style props based on currently edited IfcSurfaceStyle, reset unrelated props to default values""" @@ -241,7 +243,7 @@ class Style(blenderbim.core.tool.Style): props["update_graph"] = prev_update_graph_value @classmethod - def get_surface_rendering_attributes(cls, obj, verbose=False): + def get_surface_rendering_attributes(cls, obj: bpy.types.Material, verbose: bool = False) -> dict[str, Any]: report = (lambda *x: print(*x)) if verbose else (lambda *x: None) def color_to_ifc_format(color): @@ -403,22 +405,22 @@ class Style(blenderbim.core.tool.Style): return attributes @classmethod - def get_surface_rendering_style(cls, obj): + def get_surface_rendering_style(cls, obj: bpy.types.Material) -> Union[ifcopenshell.entity_instance, None]: style_elements = cls.get_style_elements(obj) return style_elements.get("IfcSurfaceStyleRendering", None) @classmethod - def get_texture_style(cls, obj): + def get_texture_style(cls, obj: bpy.types.Material) -> Union[ifcopenshell.entity_instance, None]: style_elements = cls.get_style_elements(obj) return style_elements.get("IfcSurfaceStyleWithTextures", None) @classmethod - def get_external_style(cls, obj): + def get_external_style(cls, obj: bpy.types.Material) -> Union[ifcopenshell.entity_instance, None]: style_elements = cls.get_style_elements(obj) return style_elements.get("IfcExternallyDefinedSurfaceStyle", None) @classmethod - def get_surface_shading_attributes(cls, obj): + def get_surface_shading_attributes(cls, obj: bpy.types.Material) -> dict[str, Any]: data = { "SurfaceColour": { "Name": None, @@ -433,7 +435,7 @@ class Style(blenderbim.core.tool.Style): return data @classmethod - def get_surface_shading_style(cls, obj): + def get_surface_shading_style(cls, obj: bpy.types.Material) -> Union[ifcopenshell.entity_instance, None]: if obj.BIMMaterialProperties.ifc_style_id: style = tool.Ifc.get().by_id(obj.BIMMaterialProperties.ifc_style_id) items = [s for s in style.Styles if s.is_a() == "IfcSurfaceStyleShading"] @@ -441,7 +443,7 @@ class Style(blenderbim.core.tool.Style): return items[0] @classmethod - def get_surface_texture_style(cls, obj): + def get_surface_texture_style(cls, obj: bpy.types.Material) -> Union[ifcopenshell.entity_instance, None]: if obj.BIMMaterialProperties.ifc_style_id: style = tool.Ifc.get().by_id(obj.BIMMaterialProperties.ifc_style_id) items = [s for s in style.Styles if s.is_a("IfcSurfaceStyleWithTextures")] @@ -449,7 +451,7 @@ class Style(blenderbim.core.tool.Style): return items[0] @classmethod - def get_uv_maps(cls, representation): + def get_uv_maps(cls, representation: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: items = [] for item in representation.Items: if item.is_a("IfcMappedItem"): @@ -464,7 +466,7 @@ class Style(blenderbim.core.tool.Style): return results @classmethod - def get_style_ui_props_attributes(cls, style_type): + def get_style_ui_props_attributes(cls, style_type: str) -> Union[bpy.types.PropertyGroup, None]: props = bpy.context.scene.BIMStylesProperties if style_type == "IfcExternallyDefinedSurfaceStyle": return props.external_style_attributes @@ -474,7 +476,7 @@ class Style(blenderbim.core.tool.Style): return props.lighting_style_colours @classmethod - def import_presentation_styles(cls, style_type): + def import_presentation_styles(cls, style_type: str) -> None: color_to_tuple = lambda x: (x.Red, x.Green, x.Blue) props = bpy.context.scene.BIMStylesProperties props.styles.clear() @@ -497,13 +499,13 @@ class Style(blenderbim.core.tool.Style): new.total_elements = len(ifcopenshell.util.element.get_elements_by_style(tool.Ifc.get(), style)) @classmethod - def import_surface_attributes(cls, style, obj): + def import_surface_attributes(cls, style: ifcopenshell.entity_instance, obj: bpy.types.Material) -> None: attributes = obj.BIMStyleProperties.attributes attributes.clear() blenderbim.bim.helper.import_attributes2(style, attributes) @classmethod - def import_external_style_attributes(cls, style, obj): + def import_external_style_attributes(cls, style: ifcopenshell.entity_instance, obj: bpy.types.Material) -> None: attributes = obj.BIMStyleProperties.external_style_attributes attributes.clear() blenderbim.bim.helper.import_attributes2(style, attributes) @@ -514,26 +516,26 @@ class Style(blenderbim.core.tool.Style): return bool(external_style and external_style.Location and external_style.Location.endswith(".blend")) @classmethod - def is_editing_styles(cls): + def is_editing_styles(cls) -> bool: return bpy.context.scene.BIMStylesProperties.is_editing @classmethod - def record_shading(cls, obj): + def record_shading(cls, obj: bpy.types.Material) -> None: obj.BIMMaterialProperties.shading_checksum = repr(np.array(obj.diffuse_color).tobytes()) @classmethod - def select_elements(cls, elements): + def select_elements(cls, elements: list[ifcopenshell.entity_instance]) -> None: for element in elements: obj = tool.Ifc.get_object(element) if obj: obj.select_set(True) @classmethod - def change_current_style_type(cls, blender_material, style_type): + def change_current_style_type(cls, blender_material: bpy.types.Material, style_type: str) -> None: blender_material.BIMStyleProperties.active_style_type = style_type @classmethod - def get_styled_items(cls, style): + def get_styled_items(cls, style: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: ifc_file = tool.Ifc.get() inverses = list(ifc_file.get_inverse(style)) @@ -554,13 +556,15 @@ class Style(blenderbim.core.tool.Style): return items @classmethod - def assign_style_to_object(cls, style, obj): + def assign_style_to_object(cls, style: ifcopenshell.entity_instance, obj: bpy.types.Object) -> None: """assigns `style` to `object` current representation""" representation = tool.Geometry.get_active_representation(obj) tool.Ifc.run("style.assign_representation_styles", shape_representation=representation, styles=[style]) @classmethod - def assign_style_to_representation_item(cls, representation_item, style=None): + def assign_style_to_representation_item( + cls, representation_item: ifcopenshell.entity_instance, style: Optional[ifcopenshell.entity_instance] = None + ) -> None: ifc_file = tool.Ifc.get() if not representation_item.StyledByItem: if style is None: @@ -574,12 +578,14 @@ class Style(blenderbim.core.tool.Style): styled_item.Styles = (style,) @classmethod - def get_representation_item_style(cls, representation_item): + def get_representation_item_style( + cls, representation_item: ifcopenshell.entity_instance + ) -> Union[ifcopenshell.entity_instance, None]: for inverse in tool.Ifc.get().get_inverse(representation_item): if inverse.is_a("IfcStyledItem"): for style in inverse.Styles: return style @classmethod - def reload_material_from_ifc(cls, blender_material): + def reload_material_from_ifc(cls, blender_material: bpy.types.Material) -> None: blender_material.BIMStyleProperties.active_style_type = blender_material.BIMStyleProperties.active_style_type diff --git a/src/ifc5d/ifc5d/ifc5Dspreadsheet.py b/src/ifc5d/ifc5d/ifc5Dspreadsheet.py index b870329d20..31dd3e2d7a 100644 --- a/src/ifc5d/ifc5d/ifc5Dspreadsheet.py +++ b/src/ifc5d/ifc5d/ifc5Dspreadsheet.py @@ -26,7 +26,7 @@ import ifcopenshell import ifcopenshell.util.element import ifcopenshell.util.cost import ifcopenshell.util.date -from typing import Union, Optional +from typing import Union, Optional, Any class IfcDataGetter: @@ -41,17 +41,17 @@ class IfcDataGetter: ] @staticmethod - def canonicalise_time(time): + def canonicalise_time(time: Union[datetime.datetime, None]) -> str: if not time: return "-" return time.strftime("%d/%m/%y") @staticmethod - def get_root_costs(cost_schedule): + def get_root_costs(cost_schedule: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: return [obj for rel in cost_schedule.Controls or [] for obj in rel.RelatedObjects or []] @staticmethod - def get_cost_item_values(cost_item=None): + def get_cost_item_values(cost_item: Union[ifcopenshell.entity_instance, None]) -> Union[list[dict[str, Any]], None]: if not cost_item: return None values = [] @@ -71,14 +71,14 @@ class IfcDataGetter: return values @staticmethod - def process_categories(cost_item, categories): + def process_categories(cost_item: ifcopenshell.entity_instance, categories: set[str]) -> set[str]: for cost_value in cost_item.CostValues or []: if cost_value.Category: categories.add("{}{}".format(cost_value.Category, " Cost")) return categories @staticmethod - def process_cost_item_categories(cost_item, categories): + def process_cost_item_categories(cost_item: ifcopenshell.entity_instance, categories: set[str]) -> set[str]: IfcDataGetter.process_categories(cost_item, categories) for rel in cost_item.IsNestedBy or []: for child in rel.RelatedObjects or []: @@ -86,14 +86,20 @@ class IfcDataGetter: return categories @staticmethod - def get_cost_rates_categories(schedule): + def get_cost_rates_categories(schedule: ifcopenshell.entity_instance) -> set[str]: categories = set() for cost_item in IfcDataGetter.get_root_costs(schedule): IfcDataGetter.process_cost_item_categories(cost_item, categories) return categories @staticmethod - def process_cost_data(file, cost_item, cost_items_data, index, hierarchy="1"): + def process_cost_data( + file: ifcopenshell.file, + cost_item: ifcopenshell.entity_instance, + cost_items_data: list[dict[str, Any]], + index: int, + hierarchy: str = "1", + ) -> None: def listToString(s): return ", ".join([str(i) for i in s]) @@ -134,7 +140,7 @@ class IfcDataGetter: ) @staticmethod - def get_cost_items_data(file, schedule): + def get_cost_items_data(file: ifcopenshell.file, schedule: ifcopenshell.entity_instance) -> list[dict[str, Any]]: cost_items_data = [] index = 0 for cost_item in IfcDataGetter.get_root_costs(schedule): @@ -142,7 +148,7 @@ class IfcDataGetter: return cost_items_data @staticmethod - def format_unit(unit): + def format_unit(unit: ifcopenshell.entity_instance) -> str: if unit.is_a("IfcContextDependentUnit"): return f"{unit.UnitType} / {unit.Name}" else: @@ -152,7 +158,7 @@ class IfcDataGetter: return f"{unit.UnitType} / {name}" @staticmethod - def get_cost_value_unit(cost_value=None): + def get_cost_value_unit(cost_value: Optional[ifcopenshell.entity_instance] = None) -> Union[str, None]: if not cost_value: return None unit = cost_value.UnitBasis @@ -161,9 +167,9 @@ class IfcDataGetter: return IfcDataGetter.format_unit(unit.UnitComponent) @staticmethod - def get_cost_item_quantity(file, cost_item=None): + def get_cost_item_quantity(file: ifcopenshell.file, cost_item: ifcopenshell.entity_instance) -> dict[str, Any]: # TODO: handle multiple quantities, THOSE WHHICH ARE JUYST ASSIGNED TO THE COST ITEM DIRECTLY, NOT THROUGH OBJECTS. - def add_quantity(quantity, take_off_name): + def add_quantity(quantity: ifcopenshell.entity_instance, take_off_name: str) -> float: accounted_for.append(quantity) if take_off_name == "": take_off_name = quantity[0] diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 76366c2f0e..89999deb5b 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -833,7 +833,7 @@ def get_layers( def get_container( element: ifcopenshell.entity_instance, should_get_direct: bool = False, ifc_class: Optional[str] = None -) -> ifcopenshell.entity_instance: +) -> Union[ifcopenshell.entity_instance, None]: """ Retrieves the spatial structure container of an element. @@ -849,7 +849,7 @@ def get_container( example, you may be after the storey, not a space. :type ifc_class: str, optional :return: The direct or indirect container of the element or None. - :rtype: ifcopenshell.entity_instance + :rtype: Union[ifcopenshell.entity_instance, None] Example: From d533ba1e6b72de3748a7b1d221d80a086e83764a Mon Sep 17 00:00:00 2001 From: Gorgious Date: Wed, 29 May 2024 16:11:35 +0200 Subject: [PATCH 336/429] Remove dead code going back to a time immemorial hack --- src/blenderbim/blenderbim/bim/helper.py | 9 --------- src/blenderbim/blenderbim/bim/module/model/workspace.py | 2 +- src/blenderbim/blenderbim/bim/module/search/operator.py | 1 - 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/helper.py b/src/blenderbim/blenderbim/bim/helper.py index 9c60b469ab..9a67c74812 100644 --- a/src/blenderbim/blenderbim/bim/helper.py +++ b/src/blenderbim/blenderbim/bim/helper.py @@ -225,15 +225,6 @@ def get_enum_items(data, prop_name, context=None): return items -# hack to close popup -# https://blender.stackexchange.com/a/202576/130742 -def close_operator_panel(event): - x, y = event.mouse_x, event.mouse_y - bpy.context.window.cursor_warp(10, 10) - move_back = lambda: bpy.context.window.cursor_warp(x, y) - bpy.app.timers.register(move_back, first_interval=0.01) - - def convert_property_group_from_si(property_group, skip_props=()): """Method converts property group values from si to current ifc project units diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index 36c26f71d2..e76c819cd5 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -22,7 +22,7 @@ import ifcopenshell import ifcopenshell.util.unit import blenderbim.tool as tool import blenderbim.bim.module.type.prop as type_prop -from blenderbim.bim.helper import prop_with_search, close_operator_panel +from blenderbim.bim.helper import prop_with_search from bpy.types import WorkSpaceTool from blenderbim.bim.module.model.data import AuthoringData from blenderbim.bim.module.drawing.data import DecoratorData diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index c7eb753fef..2e4f6bb34b 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -27,7 +27,6 @@ import ifcopenshell.util.selector from ifcopenshell.util.selector import Selector import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.helper import close_operator_panel from blenderbim.bim.module.group import ui import blenderbim.core.search as core from itertools import cycle From c7830e9e5b8a8ae359f6c92e5330600b5b002a92 Mon Sep 17 00:00:00 2001 From: Gorgious Date: Wed, 29 May 2024 16:23:05 +0200 Subject: [PATCH 337/429] Using the "Select IFC class" button doesn't throw an error anymore if an object candidate is in an excluded collection + use walrus operator in a few instances --- .../blenderbim/bim/module/search/operator.py | 42 ++++++------------- src/blenderbim/blenderbim/tool/blender.py | 7 ++++ 2 files changed, 19 insertions(+), 30 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index 2e4f6bb34b..b4b56f9f3a 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -121,14 +121,12 @@ class SelectFilterElements(bpy.types.Operator): filter_groups = tool.Search.get_filter_groups(self.module) 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: + if element := tool.Ifc.get_entity(obj): + if global_id := getattr(element, "GlobalId", None): global_ids.append(global_id) if len(global_ids) > 50: # Too much to store in a string property - name = "globalid-filter-" + ifcopenshell.guid.new() + name = f"globalid-filter-{ifcopenshell.guid.new()}" text_data = bpy.data.texts.new(name) text_data.from_string(",".join(global_ids)) filter_groups[self.group_index].filters[self.index].value = f"bpy.data.texts['{name}']" @@ -181,8 +179,7 @@ class Search(Operator): total_selected = 0 for element in results: - obj = tool.Ifc.get_object(element) - if obj: + if obj := tool.Ifc.get_object(element): obj.select_set(True) self.report({"INFO"}, f"{len(results)} Results") return {"FINISHED"} @@ -284,8 +281,7 @@ class ColourByProperty(Operator): else: colourscheme[value] = {"colour": next(colours)[0:3], "total": 1} obj.color = (*colourscheme[value]["colour"], 1) - areas = [a for a in context.screen.areas if a.type == "VIEW_3D"] - if areas: + if areas := [a for a in context.screen.areas if a.type == "VIEW_3D"]: areas[0].spaces[0].shading.color_type = "OBJECT" props.colourscheme.clear() @@ -298,8 +294,7 @@ class ColourByProperty(Operator): return {"FINISHED"} def store_state(self, context): - areas = [a for a in context.screen.areas if a.type == "VIEW_3D"] - if areas: + if areas := [a for a in context.screen.areas if a.type == "VIEW_3D"]: self.transaction_data = {"area": areas[0], "color_type": areas[0].spaces[0].shading.color_type} def rollback(self, data): @@ -449,8 +444,7 @@ class SelectIfcClass(Operator): classes = set() predefined_types = set() for obj in objects: - element = tool.Ifc.get_entity(obj) - if element: + if element := tool.Ifc.get_entity(obj): classes.add(element.is_a()) predefined_types.add(ifcopenshell.util.element.get_predefined_type(element)) for cls in classes: @@ -460,9 +454,8 @@ class SelectIfcClass(Operator): and ifcopenshell.util.element.get_predefined_type(element) not in predefined_types ): continue - obj = tool.Ifc.get_object(element) - if obj: - obj.select_set(True) + if obj := tool.Ifc.get_object(element): + tool.Blender.select_object(obj) return {"FINISHED"} @@ -488,10 +481,7 @@ class ToggleFilterSelection(Operator): def execute(self, context): props = bpy.context.scene.BIMSearchProperties - if self.action == "SELECT": - self.selecting_actionbool = True - else: - self.selecting_actionbool = False + self.selecting_actionbool = self.action == "SELECT" if props.filter_type == "CLASSES": for ifc_class in props.filter_classes: ifc_class.is_selected = self.selecting_actionbool @@ -545,11 +535,7 @@ class ActivateIfcClassFilter(Operator): "filter_classes", context.scene.BIMSearchProperties, "filter_classes_index", - rows=( - 20 - if len(bpy.context.scene.BIMSearchProperties.filter_classes) > 20 - else len(bpy.context.scene.BIMSearchProperties.filter_classes) - ), + rows=min(len(bpy.context.scene.BIMSearchProperties.filter_classes), 20), ) row = self.layout.row(align=True) row.operator("bim.toggle_filter_selection", text="Select All").action = "SELECT" @@ -604,11 +590,7 @@ class ActivateContainerFilter(Operator): "filter_container", context.scene.BIMSearchProperties, "filter_container_index", - rows=( - 20 - if len(bpy.context.scene.BIMSearchProperties.filter_container) > 20 - else len(bpy.context.scene.BIMSearchProperties.filter_container) - ), + rows=min(len(bpy.context.scene.BIMSearchProperties.filter_container), 20), ) row = self.layout.row(align=True) row.operator("bim.toggle_filter_selection", text="Select All").action = "SELECT" diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 11c784881f..3726911796 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -459,6 +459,13 @@ class Blender(blenderbim.core.tool.Blender): obj.select_set(False) context.view_layer.objects.active = active_object active_object.select_set(True) + + @classmethod + def select_object(cls, obj: bpy.types.Object): + try: + obj.select_set(True) + except RuntimeError: # Trying to select a hidden object throws an error + pass @classmethod def set_objects_selection( From a57e063c1427325d241dfd5328f2915b5be0ec11 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 30 May 2024 17:38:14 +0500 Subject: [PATCH 338/429] convert_to_blender to also unlink blender material from ifc material --- src/blenderbim/blenderbim/bim/module/debug/operator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/debug/operator.py b/src/blenderbim/blenderbim/bim/module/debug/operator.py index badec38b69..eb342e9402 100644 --- a/src/blenderbim/blenderbim/bim/module/debug/operator.py +++ b/src/blenderbim/blenderbim/bim/module/debug/operator.py @@ -93,7 +93,8 @@ class ConvertToBlender(bpy.types.Operator): if obj.data: obj.data.BIMMeshProperties.ifc_definition_id = 0 for material in bpy.data.materials: - material.BIMMaterialProperties.ifc_style_id = False + material.BIMObjectProperties.ifc_definition_id = 0 + material.BIMMaterialProperties.ifc_style_id = 0 context.scene.BIMProperties.ifc_file = "" context.scene.BIMDebugProperties.attributes.clear() IfcStore.purge() From b86dab2a767c2d4b00a36cb9f7ad0af3406ab81c Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 30 May 2024 13:59:08 +0500 Subject: [PATCH 339/429] fix removing aggregate's collections (and possible orphaned ifc data) Probably have met this issue before - https://i.imgur.com/EOCSGg2.png It occurred when you would remove e.g. IfcBuildingStorey's (or other aggregate's) collection from outliner. Deletion operator removes objects first and removing aggregate's main object is automatically removing it's collection. Then it would start removing collections and will break meeting an invalid collection. Most of the times it was scary but harmless since all collections are probably removed either way but it's critical for batch removal as it would be never finished, possibly leaving unlinked ifc data (e.g. representations and it's items) that's not removed completely until batch removal is finalized. Traceback: Error: Python: Traceback (most recent call last): File "\blenderbim\bim\ifc.py", line 360, in execute_ifc_operator result = getattr(operator, "_execute")(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "\blenderbim\bim\module\geometry\operator.py", line 720, in _execute bpy.data.collections.remove(collection) ReferenceError: StructRNA of type Collection has been removed --- .../blenderbim/bim/module/geometry/operator.py | 4 ++++ src/blenderbim/blenderbim/tool/blender.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 385ca383c9..2fecf1b793 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -714,6 +714,10 @@ class OverrideOutlinerDelete(bpy.types.Operator): else: bpy.data.objects.remove(obj) for collection in collections_to_delete: + # Removing an aggregate object would also remove it's collection + # making the collection data-block invalid. + if not tool.Blender.is_valid_data_block(collection): + continue bpy.data.collections.remove(collection) if self.is_batch: old_file = tool.Ifc.get() diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 3726911796..a58392b16c 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -196,6 +196,21 @@ class Blender(blenderbim.core.tool.Blender): return False return False + @classmethod + def is_valid_data_block(cls, data_block: bpy.types.ID) -> bool: + """Check if Blender data-block is still valid. + + If Blender data-block (e.g. an Object) is removed then it's + python object gets invalidated and accessing any of it's attributes + leads to ReferenceError: StructRNA of type Object has been removed. + This method helps avoiding try / except ReferenceError constructions. + """ + try: + data_block.bl_rna + return True + except ReferenceError: + return False + @classmethod def show_info_message(cls, text: str, message_type: Literal["INFO", "ERROR"] = "INFO") -> None: """useful for showing error messages outside blender operators From 5466be9b7b309b6422780a9994b4c53d0c2cbe51 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 31 May 2024 10:09:56 +1000 Subject: [PATCH 340/429] Fix #4765. Only run Blender calculator on meshes. --- src/ifc5d/ifc5d/qto.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index 6fb1e080a7..ffdd5cbf3b 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -255,7 +255,7 @@ class Blender: for element in elements: obj = tool.Ifc.get_object(element) - if not obj: + if not obj or obj.type != "MESH": continue results.setdefault(element, {}) for name, quantities in qtos.items(): From dc92b973a0ddf7c132281ba77096afd72f5a65cf Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 31 May 2024 10:15:03 +1000 Subject: [PATCH 341/429] Minor fix --- src/ifc5d/ifc5d/qto.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index ffdd5cbf3b..14088ed86e 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -261,6 +261,8 @@ class Blender: for name, quantities in qtos.items(): results[element].setdefault(name, {}) for quantity, formula in quantities.items(): + if not formula: + continue if not (formula_function := formula_functions.get(formula)): formula_function = formula_functions[formula] = getattr(calculator, formula) results[element][name][quantity] = unit_converter.convert( From 2be0cc697a6d4b6b05a91a069ff25d7be4abf353 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 31 May 2024 11:30:26 +1000 Subject: [PATCH 342/429] Fix #4768. Support Python 3.12 version of BBIM. --- .github/workflows/ci-blenderbim-matrix.yml | 2 +- src/blenderbim/docs/devs/installation.rst | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-blenderbim-matrix.yml b/.github/workflows/ci-blenderbim-matrix.yml index 9da41ae92e..eb55da2ed5 100644 --- a/.github/workflows/ci-blenderbim-matrix.yml +++ b/.github/workflows/ci-blenderbim-matrix.yml @@ -39,7 +39,7 @@ jobs: strategy: fail-fast: false matrix: - pyver: [py39, py310, py311] + pyver: [py39, py310, py311, py312] config: - { name: "Windows Build", diff --git a/src/blenderbim/docs/devs/installation.rst b/src/blenderbim/docs/devs/installation.rst index 31200d4fb2..8523ba0380 100644 --- a/src/blenderbim/docs/devs/installation.rst +++ b/src/blenderbim/docs/devs/installation.rst @@ -25,6 +25,9 @@ You will need to choose which build to download. - Choose ``linux``, ``macos`` (Apple Intel), ``macosm1`` (Apple Silicon), or ``win`` depending on your operating system +For users who don't follow the `VFX Platform `_ +standard, we also provide py312 builds. + Sometimes, a build may be delayed, or contain broken code. We try to avoid this, but it happens. From b7b99b6db7008ff428874c6b366f072ad12ab096 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 31 May 2024 12:54:19 +1000 Subject: [PATCH 343/429] Fix #4773. Bug where two materials that shared a style would cause the Blender <-> IFC link to break --- src/blenderbim/blenderbim/bim/ifc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/ifc.py b/src/blenderbim/blenderbim/bim/ifc.py index 3717451b65..f7fe9904ee 100644 --- a/src/blenderbim/blenderbim/bim/ifc.py +++ b/src/blenderbim/blenderbim/bim/ifc.py @@ -222,7 +222,7 @@ class IfcStore: elif existing_obj: try: existing_obj.name - IfcStore.unlink_element(obj=existing_obj) + IfcStore.unlink_element(element=element, obj=existing_obj) except: pass IfcStore.id_map[element.id()] = obj From a5d123fe833da1e37f77c3e557811ff8bf2d946d Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 31 May 2024 13:09:05 +1000 Subject: [PATCH 344/429] Map a bunch more qto functions for the IfcOpenShell calculator --- src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json | 92 +++++++++++----------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json b/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json index 29b9045161..2784ba2914 100644 --- a/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json +++ b/src/ifc5d/ifc5d/IFC4QtoBaseQuantities.json @@ -38,14 +38,14 @@ "IfcBeam": { "Qto_BeamBaseQuantities": { "CrossSectionArea": null, - "GrossSurfaceArea": null, - "GrossVolume": null, + "GrossSurfaceArea": "gross_get_area", + "GrossVolume": "gross_get_volume", "GrossWeight": null, - "Length": null, - "NetSurfaceArea": null, - "NetVolume": null, + "Length": "net_get_z", + "NetSurfaceArea": "net_get_area", + "NetVolume": "net_get_volume", "NetWeight": null, - "OuterSurfaceArea": null + "OuterSurfaceArea": "net_get_outer_surface_area" } }, "IfcBoiler": { @@ -132,14 +132,14 @@ "IfcColumn": { "Qto_ColumnBaseQuantities": { "CrossSectionArea": null, - "GrossSurfaceArea": null, - "GrossVolume": null, + "GrossSurfaceArea": "gross_get_area", + "GrossVolume": "gross_get_volume", "GrossWeight": null, - "Length": null, - "NetSurfaceArea": null, - "NetVolume": null, + "Length": "net_get_z", + "NetSurfaceArea": "net_get_area", + "NetVolume": "net_get_volume", "NetWeight": null, - "OuterSurfaceArea": null + "OuterSurfaceArea": "net_get_outer_surface_area" } }, "IfcCommunicationsAppliance": { @@ -188,9 +188,9 @@ }, "IfcCovering": { "Qto_CoveringBaseQuantities": { - "GrossArea": null, - "NetArea": null, - "Width": null + "GrossArea": "gross_get_max_side_area", + "NetArea": "net_get_max_side_area", + "Width": "gross_get_min_xyz" } }, "IfcCurtainWall": { @@ -366,14 +366,14 @@ "IfcMember": { "Qto_MemberBaseQuantities": { "CrossSectionArea": null, - "GrossSurfaceArea": null, - "GrossVolume": null, + "GrossSurfaceArea": "gross_get_area", + "GrossVolume": "gross_get_volume", "GrossWeight": null, - "Length": null, - "NetSurfaceArea": null, - "NetVolume": null, + "Length": "net_get_z", + "NetSurfaceArea": "net_get_area", + "NetVolume": "net_get_volume", "NetWeight": null, - "OuterSurfaceArea": null + "OuterSurfaceArea": "net_get_outer_surface_area" } }, "IfcMotorConnection": { @@ -383,11 +383,11 @@ }, "IfcOpeningElement": { "Qto_OpeningElementBaseQuantities": { - "Area": null, - "Depth": null, - "Height": null, - "Volume": null, - "Width": null + "Area": "gross_get_max_side_area", + "Depth": "gross_get_z", + "Height": "gross_get_y", + "Volume": "gross_get_volume", + "Width": "gross_get_x" } }, "IfcOutlet": { @@ -429,14 +429,14 @@ }, "IfcPlate": { "Qto_PlateBaseQuantities": { - "GrossArea": null, - "GrossVolume": null, + "GrossArea": "gross_get_max_side_area", + "GrossVolume": "gross_get_volume", "GrossWeight": null, - "NetArea": null, - "NetVolume": null, + "NetArea": "net_get_max_side_area", + "NetVolume": "net_get_volume", "NetWeight": null, "Perimeter": null, - "Width": null + "Width": "net_get_min_xyz" } }, "IfcProjectionElement": { @@ -507,16 +507,16 @@ }, "IfcSlab": { "Qto_SlabBaseQuantities": { - "Depth": null, - "GrossArea": null, - "GrossVolume": null, + "Depth": "net_get_z", + "GrossArea": "gross_get_footprint_area", + "GrossVolume": "gross_get_volume", "GrossWeight": null, - "Length": null, - "NetArea": null, - "NetVolume": null, + "Length": "net_get_x", + "NetArea": "net_get_footprint_area", + "NetVolume": "net_get_volume", "NetWeight": null, - "Perimeter": null, - "Width": null + "Perimeter": "net_get_footprint_perimeter", + "Width": "net_get_y" } }, "IfcSolarDevice": { @@ -557,8 +557,8 @@ "IfcStairFlight": { "Qto_StairFlightBaseQuantities": { "GrossVolume": null, - "Length": null, - "NetVolume": null + "Length": "net_get_max_xy", + "NetVolume": "net_get_volume" } }, "IfcSwitchingDevice": { @@ -607,8 +607,8 @@ "IfcWall": { "Qto_WallBaseQuantities": { "GrossFootprintArea": null, - "GrossSideArea": null, - "GrossVolume": null, + "GrossSideArea": "gross_get_side_area", + "GrossVolume": "gross_get_volume", "GrossWeight": null, "Height": "net_get_z", "Length": "net_get_x", @@ -626,10 +626,10 @@ }, "IfcWindow": { "Qto_WindowBaseQuantities": { - "Area": null, - "Height": null, + "Area": "net_get_max_side_area", + "Height": "net_get_z", "Perimeter": null, - "Width": null + "Width": "net_get_x" } } } From e2c67c2f37f844ef7c87174d7ad54d13eacaa200 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 31 May 2024 21:11:37 +1000 Subject: [PATCH 345/429] Revert "fixes #4434" This reverts commit cdd332d1ee345e2751ff9dc08c62d9cc910b7783. --- src/blenderbim/blenderbim/bim/module/aggregate/operator.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index b53ab75a10..bec1146be7 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -44,12 +44,7 @@ class BIM_OT_aggregate_assign_object(bpy.types.Operator, Operator): def _execute(self, context): relating_obj = None if self.relating_object: - element = tool.Ifc.get().by_id(self.relating_object) - if element.IsDecomposedBy: - relating_obj = tool.Ifc.get_object(element) - else: - assembly = element.Decomposes[0].RelatingObject - relating_obj = tool.Ifc.get_object(assembly) + relating_obj = tool.Ifc.get_object(tool.Ifc.get().by_id(self.relating_object)) elif context.active_object: relating_obj = context.active_object if not relating_obj: From 77abe9a0a5ee771a1ebcc17fdbf35ff6dd62e1e1 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 31 May 2024 21:15:33 +1000 Subject: [PATCH 346/429] [BBIM docs] change color of ui breadcrumb on dark background #4777 by @dirkolbrich Sorry I messed up this merge and did a force push somehow --- src/blenderbim/docs/_static/custom.css | 2 +- src/blenderbim/docs/conf.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/docs/_static/custom.css b/src/blenderbim/docs/_static/custom.css index 6e5709c7c9..97a77170e9 100644 --- a/src/blenderbim/docs/_static/custom.css +++ b/src/blenderbim/docs/_static/custom.css @@ -63,7 +63,7 @@ section img { background-color: var(--color-admonition-title-background); border-radius: 5px; font-style: italic; - color: var(--color-admonition-title); + color: var(--color-admonition-text); } img.icon { width: auto; diff --git a/src/blenderbim/docs/conf.py b/src/blenderbim/docs/conf.py index aaf5908bf0..5ce2385cac 100644 --- a/src/blenderbim/docs/conf.py +++ b/src/blenderbim/docs/conf.py @@ -99,6 +99,7 @@ html_theme_options = { "color-link--visited": "#39b54a", "color-link--hover": "#d98014", "color-link--visited--hover": "#d98014", + "color-admonition-text": "#651fff", "font-stack": "Nunito, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji" }, "dark_css_variables": { @@ -113,6 +114,7 @@ html_theme_options = { "color-link--visited": "#39b54a", "color-link--hover": "#d98014", "color-link--visited--hover": "#d98014", + "color-admonition-text": "#EEEEEC", "font-stack": "Nunito, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji" }, From b2e7044373cfcb9dd64be65b5b5e085efbb0693e Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 31 May 2024 21:17:51 +1000 Subject: [PATCH 347/429] Fix bug where you couldn't change the aggregate of a spatial element (which has been locked during import) --- src/blenderbim/blenderbim/bim/module/aggregate/operator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index bec1146be7..0e0bd0fed1 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -50,7 +50,7 @@ class BIM_OT_aggregate_assign_object(bpy.types.Operator, Operator): if not relating_obj: return - for obj in bpy.context.selected_objects: + for obj in bpy.context.selected_objects + [bpy.context.active_object]: if obj == relating_obj: continue element = tool.Ifc.get_entity(obj) From e0b11aa66e6cde5b7ea4f871e29450557a4b5226 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 31 May 2024 21:38:51 +1000 Subject: [PATCH 348/429] Fix #4434. User can now explicitly select whether they are choosing a whole or part when changing the aggregate. --- .../bim/module/aggregate/operator.py | 5 ++++ .../blenderbim/bim/module/aggregate/prop.py | 24 ++++++++++++++----- .../blenderbim/bim/module/aggregate/ui.py | 15 +++++++++--- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index 0e0bd0fed1..59ee5c0e95 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -40,11 +40,16 @@ class BIM_OT_aggregate_assign_object(bpy.types.Operator, Operator): bl_label = "Assign Object To Aggregation" bl_options = {"REGISTER", "UNDO"} relating_object: bpy.props.IntProperty() + related_object: bpy.props.IntProperty() def _execute(self, context): relating_obj = None if self.relating_object: relating_obj = tool.Ifc.get_object(tool.Ifc.get().by_id(self.relating_object)) + elif self.related_object: + aggregate = ifcopenshell.util.element.get_aggregate(tool.Ifc.get().by_id(self.related_object)) + if aggregate: + relating_obj = tool.Ifc.get_object(aggregate) elif context.active_object: relating_obj = context.active_object if not relating_obj: diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/prop.py b/src/blenderbim/blenderbim/bim/module/aggregate/prop.py index 5faa2760eb..852eee7abf 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/prop.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/prop.py @@ -34,15 +34,27 @@ from bpy.props import ( def update_relating_object(self, context): def message(self, context): - self.layout.label(text="Please select a valid Ifc Element") + self.layout.label(text="Please select a valid IFC Element") - if self.relating_object is None: - return - if not self.relating_object.BIMObjectProperties.ifc_definition_id: - context.window_manager.popup_menu(message, title="Invalid Element Selected", icon="INFO") + if self.relating_object: + self.related_object = None + if not self.relating_object.BIMObjectProperties.ifc_definition_id: + context.window_manager.popup_menu(message, title="Invalid Element Selected", icon="INFO") + self.relating_object = None + + +def update_related_object(self, context): + def message(self, context): + self.layout.label(text="Please select a valid IFC Element") + + if self.related_object: self.relating_object = None + if not self.related_object.BIMObjectProperties.ifc_definition_id: + context.window_manager.popup_menu(message, title="Invalid Element Selected", icon="INFO") + self.related_object = None class BIMObjectAggregateProperties(PropertyGroup): is_editing: BoolProperty(name="Is Editing") - relating_object: PointerProperty(name="Aggregate", type=bpy.types.Object, update=update_relating_object) + relating_object: PointerProperty(name="Relating Whole", type=bpy.types.Object, update=update_relating_object) + related_object: PointerProperty(name="Related Part", type=bpy.types.Object, update=update_related_object) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py index d3f08557b3..35a1e8161c 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py @@ -53,12 +53,21 @@ class BIM_PT_aggregate(Panel): props = context.active_object.BIMObjectAggregateProperties if props.is_editing: + row = layout.row() + row.prop(props, "relating_object", text="Whole") + row = layout.row() + row.prop(props, "related_object", text="Or Part") row = layout.row(align=True) - row.prop(props, "relating_object", text="") + col = row.column(align=True) + if not props.relating_object and not props.related_object: + col.enabled = False + op = col.operator("bim.aggregate_assign_object", icon="CHECKMARK") if props.relating_object: - op = row.operator("bim.aggregate_assign_object", icon="CHECKMARK", text="") op.relating_object = props.relating_object.BIMObjectProperties.ifc_definition_id + elif props.related_object: + op.related_object = props.related_object.BIMObjectProperties.ifc_definition_id row.operator("bim.disable_editing_aggregate", icon="CANCEL", text="") + return else: row = layout.row(align=True) if AggregateData.data["has_relating_object"]: @@ -73,7 +82,7 @@ class BIM_PT_aggregate(Panel): row.operator("bim.add_aggregate", icon="ADD", text="") op = row.operator("bim.aggregate_unassign_object", icon="X", text="") else: - row.label(text="No Whole relation defined", icon="TRIA_UP") + row.label(text="No Whole Relationship Found", icon="TRIA_UP") row.operator("bim.enable_editing_aggregate", icon="GREASEPENCIL", text="") row.operator("bim.add_aggregate", icon="ADD", text="") From 930feb1d52cbe9a3690183d9ae8c2f5f815a9636 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 31 May 2024 23:06:12 +1000 Subject: [PATCH 349/429] See #4768. Attempt to use pip for lxml packaging. --- src/blenderbim/Makefile | 51 ++++++----------------------------------- 1 file changed, 7 insertions(+), 44 deletions(-) diff --git a/src/blenderbim/Makefile b/src/blenderbim/Makefile index 19d698c75a..4032397b02 100644 --- a/src/blenderbim/Makefile +++ b/src/blenderbim/Makefile @@ -55,10 +55,14 @@ PYLIBDIR:=python3.11 PYNUMBER:=311 PYPI_VERSION:=3.11 endif +ifeq ($(PYVERSION), py312) +PYLIBDIR:=python3.12 +PYNUMBER:=312 +PYPI_VERSION:=3.12 +endif ifeq ($(PLATFORM), linux) PYPI_PLATFORM:=--platform manylinux_2_17_x86_64 -LXML_ARCH:=manylinux_2_28_x86_64 SHAPELY_ARCH:=manylinux_2_17_x86_64.manylinux2014_x86_64 PILLOW_ARCH:=manylinux_2_28_x86_64 endif @@ -67,27 +71,16 @@ ifeq ($(PLATFORM), macos) PYPI_PLATFORM:=--platform macosx_10_9_x86_64 SHAPELY_ARCH:=macosx_10_9_x86_64 PILLOW_ARCH:=macosx_10_10_x86_64 -ifeq ($(PYVERSION), py39) -LXML_ARCH:=macosx_11_0_x86_64 -endif -ifeq ($(PYVERSION), py310) -LXML_ARCH:=macosx_11_0_x86_64 -endif -ifeq ($(PYVERSION), py311) -LXML_ARCH:=macosx_11_0_universal2 -endif endif ifeq ($(PLATFORM), macosm1) PYPI_PLATFORM:=--platform macosx_11_0_arm64 -LXML_ARCH:=macosx_11_0_universal2 SHAPELY_ARCH:=macosx_11_0_arm64 PILLOW_ARCH:=macosx_11_0_arm64 endif ifeq ($(PLATFORM), win) PYPI_PLATFORM:=--platform win_amd64 -LXML_ARCH:=win_amd64 SHAPELY_ARCH:=win_amd64 PILLOW_ARCH:=win_amd64 endif @@ -102,20 +95,6 @@ PILLOW_VER:=9.5.0 SHAPELY_URL:=https://files.pythonhosted.org/packages/cp$(PYNUMBER)/s/$(SHAPELY_NAME)/$(SHAPELY_NAME)-$(SHAPELY_VER)-cp$(PYNUMBER)-cp$(PYNUMBER)-$(SHAPELY_ARCH).whl PILLOW_URL:=https://files.pythonhosted.org/packages/cp$(PYNUMBER)/p/$(PILLOW_NAME)/$(PILLOW_PKG_NAME)-$(PILLOW_VER)-cp$(PYNUMBER)-cp$(PYNUMBER)-$(PILLOW_ARCH).whl -ifeq ($(PLATFORM), macosm1) -ifeq ($(PYVERSION), py39) -LXML_URL:=https://anaconda.org/conda-forge/lxml/4.9.1/download/osx-arm64/lxml-4.9.1-py39h0520ce3_1.tar.bz2 -endif -ifeq ($(PYVERSION), py310) -LXML_URL:=https://anaconda.org/conda-forge/lxml/4.9.1/download/osx-arm64/lxml-4.9.1-py310h02f21da_0.tar.bz2 -endif -ifeq ($(PYVERSION), py311) -LXML_URL:=https://anaconda.org/conda-forge/lxml/4.9.1/download/osx-arm64/lxml-4.9.1-py311h246f609_1.tar.bz2 -endif -else -LXML_URL:=https://files.pythonhosted.org/packages/cp$(PYNUMBER)/l/$(LXML_NAME)/$(LXML_NAME)-$(LXML_VER)-cp$(PYNUMBER)-cp$(PYNUMBER)-$(LXML_ARCH).whl -endif -$(info $$LXML_URL is [${LXML_URL}]) $(info $$SHAPELY_URL is [${SHAPELY_URL}]) $(info $$PILLOW_URL is [${PILLOW_URL}]) @@ -344,6 +323,8 @@ endif cd dist/working && . env/bin/activate && $(PIP) install xmlschema --target=./site-packages cd dist/working && . env/bin/activate && $(PIP) install elementpath --target=./site-packages cd dist/working && . env/bin/activate && $(PIP) install six --target=./site-packages + # Required by drawing module + cd dist/working && . env/bin/activate && $(PIP) install lxml $(PYPI_PLATFORM) --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --target=./site-packages cp -r dist/working/site-packages/* dist/blenderbim/libs/site/packages/ rm -rf dist/working @@ -362,24 +343,6 @@ endif cd dist/working/ && $(PATCH) ../blenderbim/libs/site/packages/behave/reporter/junit.py < junit.patch rm -rf dist/working - # Required by ids - uh, not any more, but I'm trying it out in the drawing module -ifeq ($(PLATFORM), macosm1) - # No wheels available for MacOS M1, but turns out this Anaconda build works - mkdir dist/working - cd dist/working && wget $(LXML_URL) - cd dist/working && tar -xf lxml* - cp -r dist/working/lib/$(PYLIBDIR)/site-packages/lxml dist/blenderbim/libs/site/packages/ - rm -rf dist/working -else - # Wheels are preferred for other OSes. A first attempt at using Anaconda - # builds for everything shows it breaks on windows. See #2422. - mkdir dist/working - cd dist/working && wget $(LXML_URL) - cd dist/working && cp *.whl lxml.zip && unzip lxml.zip - cp -r dist/working/lxml dist/blenderbim/libs/site/packages/ - rm -rf dist/working -endif - # Required by behave mkdir dist/working cd dist/working && wget https://files.pythonhosted.org/packages/f4/65/220bb4075fddb09d5b3ea2c1c1fa66c1c72be9361ec187aab50fa161e576/parse-1.15.0.tar.gz From bda9dfd4cc9a7c576dbe04eb6755301003474863 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 31 May 2024 12:04:02 +0500 Subject: [PATCH 350/429] materials ui - avoid having multiple "Uncategorised" categories Previously it would create multiple same named "Uncategorised" categories for each case when Category was "", None, "Uncategorised", which was confusing and some of them ("" and None) would expand simultaneously when you would try to expand one. Removed `or "Uncategorised"` from ui.py as there shouldn't be a need for this since all cases are handled when items are added. --- src/blenderbim/blenderbim/bim/module/material/ui.py | 2 +- src/blenderbim/blenderbim/tool/material.py | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index e9f369b65c..17ff769851 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -343,7 +343,7 @@ class BIM_UL_materials(UIList): row.operator( "bim.expand_material_category", text="", emboss=False, icon="DISCLOSURE_TRI_RIGHT" ).category = item.name - row.label(text=item.name or "Uncategorised") + row.label(text=item.name) else: row.label(text="", icon="BLANK1") row.label(text=item.name, icon="MATERIAL") diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index 4a72301f2f..6dbb345311 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -24,6 +24,7 @@ import blenderbim.tool as tool import blenderbim.bim.helper import ifcopenshell.util.unit import ifcopenshell.util.element +from collections import defaultdict from typing import Union, Any @@ -67,12 +68,16 @@ class Material(blenderbim.core.tool.Material): elif material_type == "IfcMaterialList": get_name = lambda x: "Unnamed" materials = sorted(tool.Ifc.get().by_type(material_type), key=get_name) - categories = {} + categories = defaultdict(list) if material_type == "IfcMaterial": - [categories.setdefault(getattr(m, "Category", "Uncategorised"), []).append(m) for m in materials] + for m in materials: + # IfcMaterial has Category since IFC4. + category = getattr(m, "Category", None) + category = category or "Uncategorised" + categories[category].append(m) for category, mats in categories.items(): cat = props.materials.add() - cat.name = category or "" + cat.name = category cat.is_category = True cat.is_expanded = cat.name in expanded_categories for material in mats if cat.is_expanded else []: From 468baef5c8ba66eb52741e30dc1a52a03f8c389a Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 31 May 2024 12:11:04 +0500 Subject: [PATCH 351/429] materials ui - make expanding/contracting categories more natural Previously if you had some item active before the category you're trying to expand/cotract it would jump back to that item which was confusing. Now it sets contracted/expanded category as active to prevent that jump. Before - https://imgur.com/a/87ZDnVq After - https://imgur.com/a/B9WOn8I In Blender when we reload materials in collection property it's resetting scroll position in the template_list and setting it based template_list index, so the only way to preserve the scroll position is to manipulate template_list index. --- .../blenderbim/bim/module/material/operator.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 4578562b7e..000aad780f 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -705,8 +705,12 @@ class ExpandMaterialCategory(bpy.types.Operator): def execute(self, context): props = context.scene.BIMMaterialProperties - for category in [c for c in props.materials if c.is_category and c.name == self.category]: + for index, category in [ + (i, c) for i, c in enumerate(props.materials) + if c.is_category and c.name == self.category + ]: category.is_expanded = True + props.active_material_index = index core.load_materials(tool.Material, props.material_type) return {"FINISHED"} @@ -719,8 +723,12 @@ class ContractMaterialCategory(bpy.types.Operator): def execute(self, context): props = context.scene.BIMMaterialProperties - for category in [c for c in props.materials if c.is_category and c.name == self.category]: + for index, category in [ + (i, c) for i, c in enumerate(props.materials) + if c.is_category and c.name == self.category + ]: category.is_expanded = False + props.active_material_index = index core.load_materials(tool.Material, props.material_type) return {"FINISHED"} From ba6cdc967ca461d72a456378e8ef0420f134ee39 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 31 May 2024 12:48:16 +0500 Subject: [PATCH 352/429] materials ui - shift+click to expand/contract all categories #4771 --- .../bim/module/material/operator.py | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 000aad780f..09bc1e0f87 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -700,17 +700,28 @@ class EditMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator): class ExpandMaterialCategory(bpy.types.Operator): bl_idname = "bim.expand_material_category" bl_label = "Expand Material Category" + bl_description = "Expand material category.\n\nSHIFT+CLICK to expand all material categories" bl_options = {"REGISTER", "UNDO"} category: bpy.props.StringProperty() + expand_all: bpy.props.BoolProperty(name="Expand All", default=False, options={"SKIP_SAVE"}) + + def invoke(self, context, event): + # Expanding all categories on shift+click. + # Make sure to use SKIP_SAVE on property, otherwise it might get stuck. + if event.type == "LEFTMOUSE" and event.shift: + self.expand_all = True + return self.execute(context) def execute(self, context): props = context.scene.BIMMaterialProperties for index, category in [ - (i, c) for i, c in enumerate(props.materials) - if c.is_category and c.name == self.category + (i, c) + for i, c in enumerate(props.materials) + if c.is_category and (self.expand_all or c.name == self.category) ]: category.is_expanded = True - props.active_material_index = index + if category.name == self.category: + props.active_material_index = index core.load_materials(tool.Material, props.material_type) return {"FINISHED"} @@ -718,17 +729,28 @@ class ExpandMaterialCategory(bpy.types.Operator): class ContractMaterialCategory(bpy.types.Operator): bl_idname = "bim.contract_material_category" bl_label = "Contract Material Category" + bl_description = "Contract material category.\n\nSHIFT+CLICK to contract all material categories" bl_options = {"REGISTER", "UNDO"} category: bpy.props.StringProperty() + contract_all: bpy.props.BoolProperty(name="Contract All", default=False, options={"SKIP_SAVE"}) + + def invoke(self, context, event): + # Contracting all categories on shift+click. + # Make sure to use SKIP_SAVE on property, otherwise it might get stuck. + if event.type == "LEFTMOUSE" and event.shift: + self.contract_all = True + return self.execute(context) def execute(self, context): props = context.scene.BIMMaterialProperties for index, category in [ - (i, c) for i, c in enumerate(props.materials) - if c.is_category and c.name == self.category + (i, c) + for i, c in enumerate(props.materials) + if c.is_category and (self.contract_all or c.name == self.category) ]: category.is_expanded = False - props.active_material_index = index + if category.name == self.category: + props.active_material_index = index core.load_materials(tool.Material, props.material_type) return {"FINISHED"} From 6e738a0e3ab7d057dd56982a36a3b9ae3b419819 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 31 May 2024 14:22:58 +0500 Subject: [PATCH 353/429] materials ui - fix bug when it was impossible to contract category E.g. it was impossible to contract category "TEST" if there was also a material with name "TEST" (and it's category was expanded). It occurred due to a mixup of materials and categories in expanded_categories. Also changed is_expanded default value to False as it makes more sense (previous value didn't worked for materials and for categories you probably would want it to be False by default. --- src/blenderbim/blenderbim/bim/module/material/prop.py | 2 +- src/blenderbim/blenderbim/tool/material.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/prop.py b/src/blenderbim/blenderbim/bim/module/material/prop.py index 9374ac67cf..d8737ad21e 100644 --- a/src/blenderbim/blenderbim/bim/module/material/prop.py +++ b/src/blenderbim/blenderbim/bim/module/material/prop.py @@ -123,7 +123,7 @@ class Material(PropertyGroup): name: StringProperty(name="Name") ifc_definition_id: IntProperty(name="IFC Definition ID") is_category: BoolProperty(name="Is Category", default=False) - is_expanded: BoolProperty(name="Is Expanded", default=True) + is_expanded: BoolProperty(name="Is Expanded", default=False) has_style: BoolProperty(name="Has Style", default=True) total_elements: IntProperty(name="Total Elements") diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index 6dbb345311..e52b7abbf0 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -60,7 +60,7 @@ class Material(blenderbim.core.tool.Material): @classmethod def import_material_definitions(cls, material_type: str) -> None: props = bpy.context.scene.BIMMaterialProperties - expanded_categories = {m.name for m in props.materials if m.is_expanded} + expanded_categories = {m.name for m in props.materials if m.is_category and m.is_expanded} props.materials.clear() get_name = lambda x: x.Name or "Unnamed" if material_type == "IfcMaterialLayerSet": From 696c6b09b0cb336780905e0723186eec0c655004 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 31 May 2024 16:19:18 +0500 Subject: [PATCH 354/429] materials ui - preserve selected category on expanding/contracting all categories --- src/blenderbim/blenderbim/tool/material.py | 33 +++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index e52b7abbf0..a927e99bd6 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from __future__ import annotations import bpy import ifcopenshell import blenderbim.core.tool @@ -25,7 +26,11 @@ import blenderbim.bim.helper import ifcopenshell.util.unit import ifcopenshell.util.element from collections import defaultdict -from typing import Union, Any +from typing import Union, Any, TYPE_CHECKING + +if TYPE_CHECKING: + # Avoid circular imports. + from blenderbim.bim.module.material.prop import Material as MaterialItem class Material(blenderbim.core.tool.Material): @@ -57,9 +62,25 @@ class Material(blenderbim.core.tool.Material): def get_name(cls, obj: bpy.types.Material) -> str: return obj.name + @classmethod + def get_active_material_item(cls) -> Union[MaterialItem, None]: + """Get active material props item if index is valid, otherwise, return None.""" + props = bpy.context.scene.BIMMaterialProperties + if 0 <= props.active_material_index < len(props.materials): + return props.materials[props.active_material_index] + return None + @classmethod def import_material_definitions(cls, material_type: str) -> None: props = bpy.context.scene.BIMMaterialProperties + + # Store active category name to reselect it later. + # Occurs when we expand/contract all categories. + active_item = cls.get_active_material_item() + previously_selected_category = None + if active_item and active_item.is_category: + previously_selected_category = active_item.name + expanded_categories = {m.name for m in props.materials if m.is_category and m.is_expanded} props.materials.clear() get_name = lambda x: x.Name or "Unnamed" @@ -70,16 +91,23 @@ class Material(blenderbim.core.tool.Material): materials = sorted(tool.Ifc.get().by_type(material_type), key=get_name) categories = defaultdict(list) if material_type == "IfcMaterial": + category_index_to_reselect = None + for m in materials: # IfcMaterial has Category since IFC4. category = getattr(m, "Category", None) category = category or "Uncategorised" categories[category].append(m) + for category, mats in categories.items(): cat = props.materials.add() cat.name = category cat.is_category = True cat.is_expanded = cat.name in expanded_categories + + if previously_selected_category == category: + category_index_to_reselect = len(props.materials) - 1 + for material in mats if cat.is_expanded else []: new = props.materials.add() new.ifc_definition_id = material.id() @@ -88,6 +116,9 @@ class Material(blenderbim.core.tool.Material): ifcopenshell.util.element.get_elements_by_material(tool.Ifc.get(), material) ) new.has_style = bool(material.HasRepresentation) + + if category_index_to_reselect is not None: + props.active_material_index = category_index_to_reselect return for material in materials: new = props.materials.add() From dacb3b101c76c5104e072b55731e996bda51e3bf Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 31 May 2024 16:29:50 +0500 Subject: [PATCH 355/429] small docs fix --- .../ifcopenshell/api/cost/add_cost_item_quantity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py index fd1d793300..55484741bd 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py @@ -69,7 +69,7 @@ def add_cost_item_quantity( schedule = ifcopenshell.api.run("cost.add_cost_schedule", model) item = ifcopenshell.api.run("cost.add_cost_item", model, cost_schedule=schedule) ifcopenshell.api.run("control.assign_control", model, - relating_control=cost_item, related_object=chair) + relating_control=item, related_object=chair) # Let's assume we want to count the amount of chairs to calculate our cost item # Because this is an IfcQuantityCount the count will be automatically set to "1" chair From c05abc4d5b38a9f1743b5683d102085600950732 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 31 May 2024 16:58:10 +0500 Subject: [PATCH 356/429] ifc4x3 support for adding IfcQuantityCount #4776 In IFC4X3 IfcQuantityCount is now more strict and requires only interger values. Error for a reference: TypeError: attribute 'CountValue' for entity 'IFC4X3.IfcQuantityCount' is expecting value of type 'INT', got 'float'. --- src/ifc5d/ifc5d/csv2ifc.py | 2 +- .../api/cost/add_cost_item_quantity.py | 6 ++- .../api/resource/add_resource_quantity.py | 5 +- .../api/cost/test_add_cost_item_quantity.py | 49 +++++++++++++++++++ .../resource/test_add_resource_quantity.py | 47 ++++++++++++++++++ 5 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 src/ifcopenshell-python/test/api/cost/test_add_cost_item_quantity.py create mode 100644 src/ifcopenshell-python/test/api/resource/test_add_resource_quantity.py diff --git a/src/ifc5d/ifc5d/csv2ifc.py b/src/ifc5d/ifc5d/csv2ifc.py index 218a257d48..139de17310 100644 --- a/src/ifc5d/ifc5d/csv2ifc.py +++ b/src/ifc5d/ifc5d/csv2ifc.py @@ -185,7 +185,7 @@ class Csv2Ifc: "cost.add_cost_item_quantity", self.file, cost_item=cost_item["ifc"], ifc_class=quantity_class ) # 3 IfcPhysicalSimpleQuantity Value - quantity[3] = cost_item["Quantity"] + quantity[3] = int(cost_item["Quantity"]) if quantity_class == "IfcQuantityCount" else cost_item["Quantity"] if prop_name: quantity.Name = prop_name diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py index 55484741bd..59a3f1f8a2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/add_cost_item_quantity.py @@ -79,14 +79,16 @@ def add_cost_item_quantity( settings = {"cost_item": cost_item, "ifc_class": ifc_class} quantity = file.create_entity(settings["ifc_class"], Name="Unnamed") - quantity[3] = 0.0 + # 3 IfcPhysicalSimpleQuantity Value # This is a bold assumption # https://forums.buildingsmart.org/t/how-does-a-cost-item-know-that-it-is-counting-a-controlled-product/3564 - if settings["ifc_class"] == "IfcQuantityCount" and settings["cost_item"].Controls: + if settings["ifc_class"] == "IfcQuantityCount": count = 0 for rel in settings["cost_item"].Controls: count += len(rel.RelatedObjects) quantity[3] = count + else: + quantity[3] = 0.0 quantities = list(settings["cost_item"].CostQuantities or []) quantities.append(quantity) settings["cost_item"].CostQuantities = quantities diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py index 5bba6b3ae1..8d3d6de9e9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py @@ -68,7 +68,10 @@ def add_resource_quantity( quantity = file.create_entity(settings["ifc_class"], Name="Unnamed") # 3 IfcPhysicalSimpleQuantity Value - quantity[3] = 0.0 + if settings["ifc_class"] == "IfcQuantityCount": + quantity[3] = 0 + else: + quantity[3] = 0.0 old_quantity = settings["resource"].BaseQuantity settings["resource"].BaseQuantity = quantity if old_quantity: diff --git a/src/ifcopenshell-python/test/api/cost/test_add_cost_item_quantity.py b/src/ifcopenshell-python/test/api/cost/test_add_cost_item_quantity.py new file mode 100644 index 0000000000..49660dc0a9 --- /dev/null +++ b/src/ifcopenshell-python/test/api/cost/test_add_cost_item_quantity.py @@ -0,0 +1,49 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2024 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api + + +class TestAddCostItemQuantity(test.bootstrap.IFC4): + def test_run(self): + schema = ifcopenshell.schema_by_name(self.file.schema) + quantity_types = [t.name() for t in schema.declaration_by_name("IfcPhysicalSimpleQuantity").subtypes()] + schedule = ifcopenshell.api.run("cost.add_cost_schedule", self.file) + item = ifcopenshell.api.run("cost.add_cost_item", self.file, cost_schedule=schedule) + wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + ifcopenshell.api.run("control.assign_control", self.file, relating_control=item, related_object=wall) + + quantities = [] + for quantity_type in quantity_types: + quantity = ifcopenshell.api.run( + "cost.add_cost_item_quantity", self.file, cost_item=item, ifc_class=quantity_type + ) + assert quantity.is_a(quantity_type) + assert quantity.Name == "Unnamed" + if quantity_type == "IfcQuantityCount": + assert quantity[3] == 1 + else: + assert quantity[3] == 0.0 + quantities.append(quantity) + assert item.CostQuantities == tuple(quantities) + + +# CostQuantities was added to IfcCostItem in IFC4. +class TestAddCostItemQuantityIFC4X3(test.bootstrap.IFC4X3, TestAddCostItemQuantity): + pass diff --git a/src/ifcopenshell-python/test/api/resource/test_add_resource_quantity.py b/src/ifcopenshell-python/test/api/resource/test_add_resource_quantity.py new file mode 100644 index 0000000000..bde9451d11 --- /dev/null +++ b/src/ifcopenshell-python/test/api/resource/test_add_resource_quantity.py @@ -0,0 +1,47 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2024 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import test.bootstrap +import ifcopenshell.api + + +class TestAddResourceQuantity(test.bootstrap.IFC4): + def test_run(self): + schema = ifcopenshell.schema_by_name(self.file.schema) + quantity_types = [t.name() for t in schema.declaration_by_name("IfcPhysicalSimpleQuantity").subtypes()] + self.file.create_entity("IfcProject") # add_resource + resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcCrewResource") + + for quantity_type in quantity_types: + quantity = ifcopenshell.api.run( + "resource.add_resource_quantity", self.file, resource=resource, ifc_class=quantity_type + ) + assert quantity.is_a(quantity_type) + assert quantity.Name == "Unnamed" + assert quantity[3] == 0.0 + # previous quantity is reassigned and removed + assert resource.BaseQuantity == quantity + assert len(self.file.by_type("IfcPhysicalSimpleQuantity")) == 1 + + +class TestAddResourceQuantityIFC2X3(test.bootstrap.IFC2X3, TestAddResourceQuantity): + pass + + +class TestAddResourceQuantityIFC4X3(test.bootstrap.IFC4X3, TestAddResourceQuantity): + pass From 162e66b7755383684918962630a644e94d849aff Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 31 May 2024 18:02:20 +0500 Subject: [PATCH 357/429] typing --- src/blenderbim/blenderbim/bim/import_ifc.py | 6 ++-- .../bim/module/geometry/operator.py | 3 +- src/blenderbim/blenderbim/tool/blender.py | 1 + src/ifcopenshell-python/ifcopenshell/file.py | 34 +++++++++---------- .../ifcopenshell/util/schema.py | 30 ++++++++++++---- 5 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 5e427aae3e..cbbb8e7731 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -1703,18 +1703,18 @@ class IfcImporter: self.type_collection.children.link(aggregate["collection"]) continue - def create_materials(self): + def create_materials(self) -> None: for material in self.file.by_type("IfcMaterial"): self.create_material(material) - def create_material(self, material): + def create_material(self, material: ifcopenshell.entity_instance) -> bpy.types.Material: blender_material = bpy.data.materials.new(material.Name) self.link_element(material, blender_material) self.material_creator.materials[material.id()] = blender_material blender_material.use_fake_user = True return blender_material - def create_styles(self): + def create_styles(self) -> None: parsed_styles = set() for material_definition_representation in self.file.by_type("IfcMaterialDefinitionRepresentation"): diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 2fecf1b793..7537a04067 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -40,6 +40,7 @@ from mathutils import Vector, Matrix from time import time from blenderbim.bim.ifc import IfcStore from ifcopenshell.util.shape_builder import ShapeBuilder +from typing import Any class Operator: @@ -729,7 +730,7 @@ class OverrideOutlinerDelete(bpy.types.Operator): IfcStore.add_transaction_operation(self) return {"FINISHED"} - def get_collection_objects_and_children(self, collection): + def get_collection_objects_and_children(self, collection: bpy.types.Collection) -> dict[str, Any]: objects = set() children = set() queue = [collection] diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index a58392b16c..46a435eccb 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -21,6 +21,7 @@ import bmesh import json import ifcopenshell.api import ifcopenshell.util.element +import blenderbim.core.tool import blenderbim.tool as tool import blenderbim.bim import addon_utils diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index cf8e5491a2..000b249c5d 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -24,7 +24,7 @@ import zipfile import functools import ifcopenshell from pathlib import Path -from typing import Optional, Any, Union, Callable +from typing import Optional, Any, Union, Callable, Generator from . import ifcopenshell_wrapper from .entity_instance import entity_instance @@ -59,13 +59,13 @@ class Transaction: value, ) - def batch(self): + def batch(self) -> None: self.is_batched = True self.batch_delete_index = len(self.operations) self.batch_delete_ids = set() self.batch_inverses = [] - def unbatch(self): + def unbatch(self) -> None: for inverses in self.batch_inverses: if inverses: self.operations.insert(self.batch_delete_index, {"action": "batch_delete", "inverses": inverses}) @@ -74,11 +74,11 @@ class Transaction: self.batch_delete_ids = set() self.batch_inverses = [] - def store_create(self, element): + def store_create(self, element: ifcopenshell.entity_instance) -> None: if element.id(): self.operations.append({"action": "create", "value": self.serialise_entity_instance(element)}) - def store_edit(self, element, index, value): + def store_edit(self, element: ifcopenshell.entity_instance, index: int, value: Any) -> None: if element.id(): self.operations.append( { @@ -120,7 +120,7 @@ class Transaction: return False return value == element - def rollback(self): + def rollback(self) -> None: for operation in self.operations[::-1]: if operation["action"] == "create": element = self.file.by_id(operation["value"]["id"]) @@ -153,7 +153,7 @@ class Transaction: for index, value in data: inverse[index] = self.unserialise_value(inverse, value) - def commit(self): + def commit(self) -> None: for operation in self.operations: if operation["action"] == "create": e = self.file.create_entity(operation["value"]["type"], id=operation["value"]["id"]) @@ -260,19 +260,19 @@ class file: file_dict[self.file_pointer()] = weakref.ref(self) - def __del__(self): + def __del__(self) -> None: del file_dict[self.file_pointer()] - def set_history_size(self, size): + def set_history_size(self, size: int) -> None: self.history_size = size while len(self.history) > self.history_size: self.history.pop(0) - def begin_transaction(self): + def begin_transaction(self) -> None: if self.history_size: self.transaction = Transaction(self) - def end_transaction(self): + def end_transaction(self) -> None: if self.transaction: self.history.append(self.transaction) if len(self.history) > self.history_size: @@ -280,19 +280,19 @@ class file: self.future = [] self.transaction = None - def discard_transaction(self): + def discard_transaction(self) -> None: if self.transaction: self.transaction.rollback() self.transaction = None - def undo(self): + def undo(self) -> None: if not self.history: return transaction = self.history.pop() transaction.rollback() self.future.append(transaction) - def redo(self): + def redo(self) -> None: if not self.future: return transaction = self.future.pop() @@ -405,7 +405,7 @@ class file: else: return getattr(self.wrapped_data, attr) - def __getitem__(self, key): + def __getitem__(self, key: Union[numbers.Integral, str, bytes]) -> entity_instance: if isinstance(key, numbers.Integral): return entity_instance(self.wrapped_data.by_id(key), self) elif isinstance(key, (str, bytes)): @@ -501,7 +501,7 @@ class file: return [entity_instance(e, self) for e in fn(inst.wrapped_data, max_levels)] def get_inverse( - self, inst: ifcopenshell.entity_instance, allow_duplicate=False, with_attribute_indices=False + self, inst: ifcopenshell.entity_instance, allow_duplicate: bool = False, with_attribute_indices: bool = False ) -> list[ifcopenshell.entity_instance]: """Return a list of entities that reference this entity @@ -572,7 +572,7 @@ class file: self.transaction.unbatch() return self.wrapped_data.unbatch() - def __iter__(self): + def __iter__(self) -> Generator[ifcopenshell.entity_instance, None, None]: return iter(self[id] for id in self.wrapped_data.entity_names()) def write(self, path: "os.PathLike | str", format: Optional[str] = None, zipped: bool = False) -> None: diff --git a/src/ifcopenshell-python/ifcopenshell/util/schema.py b/src/ifcopenshell-python/ifcopenshell/util/schema.py index 6bba052bf2..77cbbb1ee1 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/schema.py +++ b/src/ifcopenshell-python/ifcopenshell/util/schema.py @@ -22,9 +22,9 @@ import time import ifcopenshell import ifcopenshell.util.attribute import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper +from typing import Union, Any # This is highly experimental and incomplete, however, it may work for simple datasets. -# In this simple implementation, we only support 2X3<->4 right now cwd = os.path.dirname(os.path.realpath(__file__)) @@ -223,7 +223,9 @@ class Migrator: "User": None, } - def migrate(self, element: ifcopenshell.entity_instance, new_file: ifcopenshell.file) -> ifcopenshell.entity_instance: + def migrate( + self, element: ifcopenshell.entity_instance, new_file: ifcopenshell.file + ) -> ifcopenshell.entity_instance: if element.id() == 0: return new_file.create_entity(element.is_a(), element.wrappedValue) try: @@ -241,7 +243,9 @@ class Migrator: self.migrated_ids[element.id()] = new_element.id() return new_element - def migrate_class(self, element, new_file): + def migrate_class( + self, element: ifcopenshell.entity_instance, new_file: ifcopenshell.file + ) -> ifcopenshell.entity_instance: try: new_element = new_file.create_entity(element.is_a()) except: @@ -260,7 +264,14 @@ class Migrator: self.migrate_attribute(attribute, element, new_file, new_element, new_element_schema) return new_element - def find_equivalent_attribute(self, new_element, attribute, element, attributes_mapping, reverse_mapping=False): + def find_equivalent_attribute( + self, + new_element: ifcopenshell.entity_instance, + attribute: ifcopenshell_wrapper.attribute, + element: ifcopenshell.entity_instance, + attributes_mapping: dict[str, dict[str, str]], + reverse_mapping: bool = False, + ) -> Union[Any, None]: # print("Searching for an equivalent", element, new_element, attribute.name()) try: if reverse_mapping: @@ -281,7 +292,14 @@ class Migrator: ) raise e - def migrate_attribute(self, attribute, element, new_file: ifcopenshell.file, new_element, new_element_schema): + def migrate_attribute( + self, + attribute: ifcopenshell_wrapper.attribute, + element: ifcopenshell.entity_instance, + new_file: ifcopenshell.file, + new_element: ifcopenshell.entity_instance, + new_element_schema: ifcopenshell_wrapper.declaration, + ) -> None: # NOTE: `attribute` is an attribute in new file schema # print("Migrating attribute", element, new_element, attribute.name()) old_file = element.wrapped_data.file @@ -349,7 +367,7 @@ class Migrator: if value is not None: setattr(new_element, attribute.name(), value) - def generate_default_value(self, attribute, new_file): + def generate_default_value(self, attribute: ifcopenshell_wrapper.attribute, new_file: ifcopenshell.file) -> Any: if attribute.name() in self.default_values: return self.default_values[attribute.name()] elif attribute.name() == "OwnerHistory": From c303f216adfd9ffc92ad12771a80a38b2e7855fd Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 31 May 2024 18:02:49 +0500 Subject: [PATCH 358/429] Migrate recipe - do not call .migrate twice for each element --- src/ifcpatch/ifcpatch/recipes/Migrate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ifcpatch/ifcpatch/recipes/Migrate.py b/src/ifcpatch/ifcpatch/recipes/Migrate.py index 5280875ce9..8a4c6768cd 100644 --- a/src/ifcpatch/ifcpatch/recipes/Migrate.py +++ b/src/ifcpatch/ifcpatch/recipes/Migrate.py @@ -47,6 +47,6 @@ class Patcher: self.file_patched = ifcopenshell.file(schema=self.schema) migrator = ifcopenshell.util.schema.Migrator() for element in self.file: - migrator.migrate(element, self.file_patched) + new_element = migrator.migrate(element, self.file_patched) print("Migrating", element) - print("Successfully converted to", migrator.migrate(element, self.file_patched)) + print("Successfully converted to", new_element) From 666f8e245932800a1b757ed74d6bbb22f4be34b5 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 31 May 2024 18:28:52 +0500 Subject: [PATCH 359/429] Bump BBIM ifcopenshell build #4580 --- src/blenderbim/Makefile | 2 +- src/ifcopenshell-python/Makefile | 2 +- .../docs/ifcconvert/installation.rst | 10 ++--- .../docs/ifcopenshell-python/installation.rst | 40 +++++++++---------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/blenderbim/Makefile b/src/blenderbim/Makefile index 4032397b02..3d09c43814 100644 --- a/src/blenderbim/Makefile +++ b/src/blenderbim/Makefile @@ -116,7 +116,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-f7c03db-$(PLATFORM)64.zip + cd dist/working && wget https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-$(PYNUMBER)-v0.7.0-c7830e9-$(PLATFORM)64.zip cd dist/working && unzip ifcopenshell-python* cp -r dist/working/ifcopenshell dist/blenderbim/libs/site/packages/ diff --git a/src/ifcopenshell-python/Makefile b/src/ifcopenshell-python/Makefile index dc85b4c4ad..5a55210b03 100644 --- a/src/ifcopenshell-python/Makefile +++ b/src/ifcopenshell-python/Makefile @@ -89,7 +89,7 @@ endif mkdir -p dist/ifcopenshell cp -r ifcopenshell/* dist/ifcopenshell/ - cd dist/working && wget https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-$(PYNUMBER)-v0.7.0-f7c03db-$(PLATFORM)64.zip + cd dist/working && wget https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-$(PYNUMBER)-v0.7.0-c7830e9-$(PLATFORM)64.zip cd dist/working && unzip ifcopenshell-python* cp -r dist/working/ifcopenshell/ifcopenshell_wrapper.py dist/ifcopenshell/ ifeq ($(PLATFORM), win) diff --git a/src/ifcopenshell-python/docs/ifcconvert/installation.rst b/src/ifcopenshell-python/docs/ifcconvert/installation.rst index 8f913327fe..c77d37b7c7 100644 --- a/src/ifcopenshell-python/docs/ifcconvert/installation.rst +++ b/src/ifcopenshell-python/docs/ifcconvert/installation.rst @@ -20,11 +20,11 @@ Pre-built packages | build-linux64_ | build-win32_ | build-win64_ | build-macos64_ | build-macosm164_ | +----------------+----------------+----------------+----------------+------------------+ -.. _build-linux64: https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v0.7.0-f7c03db-linux64.zip -.. _build-win32: https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v0.7.0-f7c03db-win32.zip -.. _build-win64: https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v0.7.0-f7c03db-win64.zip -.. _build-macos64: https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v0.7.0-f7c03db-macos64.zip -.. _build-macosm164: https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v0.7.0-f7c03db-macosm164.zip +.. _build-linux64: https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v0.7.0-c7830e9-linux64.zip +.. _build-win32: https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v0.7.0-c7830e9-win32.zip +.. _build-win64: https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v0.7.0-c7830e9-win64.zip +.. _build-macos64: https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v0.7.0-c7830e9-macos64.zip +.. _build-macosm164: https://s3.amazonaws.com/ifcopenshell-builds/IfcConvert-v0.7.0-c7830e9-macosm164.zip 2. Unzip the downloaded file and run IfcConvert using the command line. diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/installation.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/installation.rst index 77f71fbf34..c12f8a881b 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/installation.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/installation.rst @@ -39,26 +39,26 @@ the API. | Python 3.12 | py312-linux64_ | py312-win32_ | py312-win64_ | py312-macos64_ | py312-macosm164_ | +-------------+----------------+----------------+----------------+-------------------+---------------------+ -.. _py39-linux64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-39-v0.7.0-f7c03db-linux64.zip -.. _py310-linux64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-310-v0.7.0-f7c03db-linux64.zip -.. _py311-linux64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.0-f7c03db-linux64.zip -.. _py312-linux64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-312-v0.7.0-f7c03db-linux64.zip -.. _py39-win32: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-39-v0.7.0-f7c03db-win32.zip -.. _py310-win32: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-310-v0.7.0-f7c03db-win32.zip -.. _py311-win32: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.0-f7c03db-win32.zip -.. _py312-win32: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-312-v0.7.0-f7c03db-win32.zip -.. _py39-win64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-39-v0.7.0-f7c03db-win64.zip -.. _py310-win64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-310-v0.7.0-f7c03db-win64.zip -.. _py311-win64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.0-f7c03db-win64.zip -.. _py312-win64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-312-v0.7.0-f7c03db-win64.zip -.. _py39-macos64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-39-v0.7.0-f7c03db-macos64.zip -.. _py310-macos64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-310-v0.7.0-f7c03db-macos64.zip -.. _py311-macos64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.0-f7c03db-macos64.zip -.. _py312-macos64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-312-v0.7.0-f7c03db-macos64.zip -.. _py39-macosm164: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-39-v0.7.0-f7c03db-macosm164.zip -.. _py310-macosm164: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-310-v0.7.0-f7c03db-macosm164.zip -.. _py311-macosm164: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.0-f7c03db-macosm164.zip -.. _py312-macosm164: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-312-v0.7.0-f7c03db-macosm164.zip +.. _py39-linux64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-39-v0.7.0-c7830e9-linux64.zip +.. _py310-linux64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-310-v0.7.0-c7830e9-linux64.zip +.. _py311-linux64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.0-c7830e9-linux64.zip +.. _py312-linux64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-312-v0.7.0-c7830e9-linux64.zip +.. _py39-win32: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-39-v0.7.0-c7830e9-win32.zip +.. _py310-win32: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-310-v0.7.0-c7830e9-win32.zip +.. _py311-win32: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.0-c7830e9-win32.zip +.. _py312-win32: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-312-v0.7.0-c7830e9-win32.zip +.. _py39-win64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-39-v0.7.0-c7830e9-win64.zip +.. _py310-win64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-310-v0.7.0-c7830e9-win64.zip +.. _py311-win64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.0-c7830e9-win64.zip +.. _py312-win64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-312-v0.7.0-c7830e9-win64.zip +.. _py39-macos64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-39-v0.7.0-c7830e9-macos64.zip +.. _py310-macos64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-310-v0.7.0-c7830e9-macos64.zip +.. _py311-macos64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.0-c7830e9-macos64.zip +.. _py312-macos64: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-312-v0.7.0-c7830e9-macos64.zip +.. _py39-macosm164: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-39-v0.7.0-c7830e9-macosm164.zip +.. _py310-macosm164: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-310-v0.7.0-c7830e9-macosm164.zip +.. _py311-macosm164: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.0-c7830e9-macosm164.zip +.. _py312-macosm164: https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-312-v0.7.0-c7830e9-macosm164.zip 2. Unzip the downloaded file and copy the ``ifcopenshell`` directory into your Python path. If you're not sure where your Python path is, run the following From 61b10a19c7f8191adb0509c5199ac06c2521e921 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 10:21:33 +1000 Subject: [PATCH 360/429] Attempt to make shapely be installed using pip --- src/blenderbim/Makefile | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/src/blenderbim/Makefile b/src/blenderbim/Makefile index 3d09c43814..8d0edeedfc 100644 --- a/src/blenderbim/Makefile +++ b/src/blenderbim/Makefile @@ -63,39 +63,31 @@ endif ifeq ($(PLATFORM), linux) PYPI_PLATFORM:=--platform manylinux_2_17_x86_64 -SHAPELY_ARCH:=manylinux_2_17_x86_64.manylinux2014_x86_64 PILLOW_ARCH:=manylinux_2_28_x86_64 endif ifeq ($(PLATFORM), macos) PYPI_PLATFORM:=--platform macosx_10_9_x86_64 -SHAPELY_ARCH:=macosx_10_9_x86_64 PILLOW_ARCH:=macosx_10_10_x86_64 endif ifeq ($(PLATFORM), macosm1) PYPI_PLATFORM:=--platform macosx_11_0_arm64 -SHAPELY_ARCH:=macosx_11_0_arm64 PILLOW_ARCH:=macosx_11_0_arm64 endif ifeq ($(PLATFORM), win) PYPI_PLATFORM:=--platform win_amd64 -SHAPELY_ARCH:=win_amd64 PILLOW_ARCH:=win_amd64 endif LXML_NAME:=lxml LXML_VER:=4.9.4 -SHAPELY_NAME:=shapely -SHAPELY_VER:=2.0.2 PILLOW_NAME:=pillow PILLOW_PKG_NAME:=Pillow PILLOW_VER:=9.5.0 -SHAPELY_URL:=https://files.pythonhosted.org/packages/cp$(PYNUMBER)/s/$(SHAPELY_NAME)/$(SHAPELY_NAME)-$(SHAPELY_VER)-cp$(PYNUMBER)-cp$(PYNUMBER)-$(SHAPELY_ARCH).whl PILLOW_URL:=https://files.pythonhosted.org/packages/cp$(PYNUMBER)/p/$(PILLOW_NAME)/$(PILLOW_PKG_NAME)-$(PILLOW_VER)-cp$(PYNUMBER)-cp$(PYNUMBER)-$(PILLOW_ARCH).whl -$(info $$SHAPELY_URL is [${SHAPELY_URL}]) $(info $$PILLOW_URL is [${PILLOW_URL}]) .PHONY: bump @@ -270,19 +262,6 @@ endif cp -r dist/working/PyP6Xer-1.13.0/xerparser dist/blenderbim/libs/site/packages/ rm -rf dist/working - # Required by QTOCalculator - mkdir dist/working - cd dist/working && wget $(SHAPELY_URL) - cd dist/working && cp *.whl shapely.zip && unzip shapely.zip - cp -r dist/working/shapely dist/blenderbim/libs/site/packages/ -ifeq ($(PLATFORM), win) - cp -r dist/working/shapely.libs dist/blenderbim/libs/site/packages/ -endif -ifeq ($(PLATFORM), linux) - cp -r dist/working/shapely.libs dist/blenderbim/libs/site/packages/ -endif - rm -rf dist/working - # Required by the BIM tool thumbnail generator mkdir dist/working cd dist/working && wget $(PILLOW_URL) @@ -324,7 +303,9 @@ endif cd dist/working && . env/bin/activate && $(PIP) install elementpath --target=./site-packages cd dist/working && . env/bin/activate && $(PIP) install six --target=./site-packages # Required by drawing module - cd dist/working && . env/bin/activate && $(PIP) install lxml $(PYPI_PLATFORM) --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --target=./site-packages + cd dist/working && . env/bin/activate && $(PIP) install lxml $(PYPI_PLATFORM) --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --only-binary=:all: --target=./site-packages + # Required by qto and drawing module + cd dist/working && . env/bin/activate && $(PIP) install shapely $(PYPI_PLATFORM) --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --only-binary=:all: --target=./site-packages cp -r dist/working/site-packages/* dist/blenderbim/libs/site/packages/ rm -rf dist/working From 116c9a5fd9f97aba1ad3400a1888a459d4136750 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 10:38:04 +1000 Subject: [PATCH 361/429] Continue migrating build deps to pip: pystache, lark, svgwrite, pillow, dateutil, isodate, networkx, deepdiff --- src/blenderbim/Makefile | 117 +++--------------- .../bim/module/drawing/svgwriter.py | 1 - .../bim/module/sequence/operator.py | 1 - 3 files changed, 16 insertions(+), 103 deletions(-) diff --git a/src/blenderbim/Makefile b/src/blenderbim/Makefile index 8d0edeedfc..df60935412 100644 --- a/src/blenderbim/Makefile +++ b/src/blenderbim/Makefile @@ -63,33 +63,20 @@ endif ifeq ($(PLATFORM), linux) PYPI_PLATFORM:=--platform manylinux_2_17_x86_64 -PILLOW_ARCH:=manylinux_2_28_x86_64 endif ifeq ($(PLATFORM), macos) PYPI_PLATFORM:=--platform macosx_10_9_x86_64 -PILLOW_ARCH:=macosx_10_10_x86_64 endif ifeq ($(PLATFORM), macosm1) PYPI_PLATFORM:=--platform macosx_11_0_arm64 -PILLOW_ARCH:=macosx_11_0_arm64 endif ifeq ($(PLATFORM), win) PYPI_PLATFORM:=--platform win_amd64 -PILLOW_ARCH:=win_amd64 endif -LXML_NAME:=lxml -LXML_VER:=4.9.4 -PILLOW_NAME:=pillow -PILLOW_PKG_NAME:=Pillow -PILLOW_VER:=9.5.0 -PILLOW_URL:=https://files.pythonhosted.org/packages/cp$(PYNUMBER)/p/$(PILLOW_NAME)/$(PILLOW_PKG_NAME)-$(PILLOW_VER)-cp$(PYNUMBER)-cp$(PYNUMBER)-$(PILLOW_ARCH).whl - -$(info $$PILLOW_URL is [${PILLOW_URL}]) - .PHONY: bump bump: cd . && $(SED) "s/$(OLD)/$(NEW)/" Makefile @@ -163,49 +150,6 @@ endif cp -r dist/working/site-packages/git dist/blenderbim/libs/site/packages/ rm -rf dist/working - # Provides Mustache templating in construction documentation - # TODO: remove this dependency, it seems overkill and we seem to get by with str replaces - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/3f/e7/8750ba6c6101d6aa5ceeb20c013adf2c6f3554a12c71d75654b468404bfa/pystache-0.6.0.tar.gz - cd dist/working && tar -xzvf pystache* - cd dist/working/pystache-0.6.0/ && $(PYTHON) setup.py build && cp -r build/lib/pystache ../../blenderbim/libs/site/packages/ - rm -rf dist/working - - # Provides SVG export in construction documentation - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/79/e8/7eb2ba188eda14a4b47e33b51f3b4978985f4116655c699bcd18c79279b5/svgwrite-1.3.1.zip - cd dist/working && unzip svgwrite* - cp -r dist/working/svgwrite-1.3.1/svgwrite dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Provides fuzzy date parsing for construction sequencing - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/be/ed/5bbc91f03fa4c839c4c7360375da77f9659af5f7086b7a7bdda65771c8e0/python-dateutil-2.8.1.tar.gz - cd dist/working && tar -xzvf python-dateutil* - cp -r dist/working/python-dateutil-2.8.1/dateutil dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Provides duration parsing for construction sequencing - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/b1/80/fb8c13a4cd38eb5021dc3741a9e588e4d1de88d895c1910c6fc8a08b7a70/isodate-0.6.0.tar.gz - cd dist/working && tar -xzvf isodate* - cp -r dist/working/isodate-0.6.0/src/isodate dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Provides networkx graph analysis for project dependency calculations - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/b0/21/adfbf6168631e28577e4af9eb9f26d75fe72b2bb1d33762a5f2c425e6c2a/networkx-2.5.1.tar.gz - cd dist/working && tar -xzvf networkx* - cp -r dist/working/networkx-2.5.1/networkx dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Required by networkx - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/4f/51/15a4f6b8154d292e130e5e566c730d8ec6c9802563d58760666f1818ba58/decorator-5.0.9.tar.gz - cd dist/working && tar -xzvf decorator* - cp -r dist/working/decorator-5.0.9/src/decorator.py dist/blenderbim/libs/site/packages/ - rm -rf dist/working - # Provides audio playback for costing mkdir -p dist/working git clone https://github.com/Andrej730/aud.git --branch master-reduced-size --depth 1 dist/working/aud @@ -220,41 +164,6 @@ endif cp dist/working/jsgantt* dist/blenderbim/bim/data/gantt/ rm -rf dist/working - # Required by IFCDiff - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/0f/ca/caead2949fbb824c7142e3774fa841aa853bb4d4331b440da8c8514dfc6f/deepdiff-5.8.1.tar.gz - cd dist/working && tar -xzvf deepdiff* - cp -r dist/working/deepdiff-5.8.1/deepdiff dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Required by deepdiff - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/00/55/ce2cbc6d64034b30cad81a29ba61bdba456f190f5e83c09831304bf68d6b/jsonpickle-1.2.tar.gz - cd dist/working && tar -xzvf jsonpickle* - cp -r dist/working/jsonpickle-1.2/jsonpickle dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Required by deepdiff - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/a3/b7/d4d69641cbe707a45c23b190f2d717466ba5accc4c70b5f7a8a450387895/ordered-set-3.1.1.tar.gz - cd dist/working && tar -xzvf ordered-set* - cp -r dist/working/ordered-set-3.1.1/ordered_set.py dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Required by lark - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/00/32/8076fa13e832bb4dcff379f18f228e5a53412be0631808b9ca2610c0f566/pyparsing-2.4.5.tar.gz - cd dist/working && tar -xzvf pyparsing* - cp -r dist/working/pyparsing-2.4.5/pyparsing.py dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Required by IFCCSV and ifcopenshell.util.selector - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/18/4d/8d522136c37d9e1ea74062b41b8d5e1318ebf45063ae46ce72ed60af223b/lark-parser-0.8.5.tar.gz - cd dist/working && tar -xzvf lark-parser* - cp -r dist/working/lark-parser-0.8.5/lark dist/blenderbim/libs/site/packages/ - rm -rf dist/working - # Required by IFC4D mkdir dist/working cd dist/working && wget https://files.pythonhosted.org/packages/b0/bb/9c4dddd3ca173cb56241cfb2eddfae24690dc676d357ac4cab17d0a36d9d/PyP6Xer-1.13.0.tar.gz @@ -262,16 +171,6 @@ endif cp -r dist/working/PyP6Xer-1.13.0/xerparser dist/blenderbim/libs/site/packages/ rm -rf dist/working - # Required by the BIM tool thumbnail generator - mkdir dist/working - cd dist/working && wget $(PILLOW_URL) - cd dist/working && cp *.whl pillow.zip && unzip pillow.zip - cp -r dist/working/PIL dist/blenderbim/libs/site/packages/ -ifeq ($(PLATFORM), linux) - cp -r dist/working/Pillow.libs dist/blenderbim/libs/site/packages/ -endif - rm -rf dist/working - # Required by xerparser and IFC4D # TODO: remove this dependency. It's only used to show a progress bar. mkdir dist/working @@ -306,6 +205,22 @@ endif cd dist/working && . env/bin/activate && $(PIP) install lxml $(PYPI_PLATFORM) --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --only-binary=:all: --target=./site-packages # Required by qto and drawing module cd dist/working && . env/bin/activate && $(PIP) install shapely $(PYPI_PLATFORM) --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --only-binary=:all: --target=./site-packages + # Required by the BIM type manager thumbnail generator + cd dist/working && . env/bin/activate && $(PIP) install pillow $(PYPI_PLATFORM) --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --only-binary=:all: --target=./site-packages + # Provides mustache templating in construction docs and web UI data + cd dist/working && . env/bin/activate && $(PIP) install pystache --target=./site-packages + # Provides SVG export in construction documentation + cd dist/working && . env/bin/activate && $(PIP) install svgwrite --target=./site-packages + # Provides fuzzy date parsing for construction sequencing + cd dist/working && . env/bin/activate && $(PIP) install python-dateutil --target=./site-packages + # Provides duration parsing for construction sequencing + cd dist/working && . env/bin/activate && $(PIP) install isodate --target=./site-packages + # Provides networkx graph analysis for project dependency calculations + cd dist/working && . env/bin/activate && $(PIP) install networkx --target=./site-packages + # Required by IFCDiff + cd dist/working && . env/bin/activate && $(PIP) install deepdiff --target=./site-packages + # Required by IFCCSV and ifcopenshell.util.selector + cd dist/working && . env/bin/activate && $(PIP) install lark --target=./site-packages cp -r dist/working/site-packages/* dist/blenderbim/libs/site/packages/ rm -rf dist/working diff --git a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py index 4f5b40a52f..4af3640c80 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py @@ -22,7 +22,6 @@ import bpy import math import bmesh import shutil -import pystache import mathutils import xml.etree.ElementTree as ET import svgwrite diff --git a/src/blenderbim/blenderbim/bim/module/sequence/operator.py b/src/blenderbim/blenderbim/bim/module/sequence/operator.py index 337a01c11f..d64b0400ed 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/operator.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/operator.py @@ -22,7 +22,6 @@ import json import time import calendar import isodate -import pystache import blenderbim.core.sequence as core import blenderbim.tool as tool import blenderbim.bim.module.sequence.helper as helper From fcf70ad160a79b71310cb9f10d320f9e48b0556d Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 10:48:36 +1000 Subject: [PATCH 362/429] Attempt to bump support to intel mac 10.10 --- src/blenderbim/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/Makefile b/src/blenderbim/Makefile index df60935412..89c015eb29 100644 --- a/src/blenderbim/Makefile +++ b/src/blenderbim/Makefile @@ -66,7 +66,7 @@ PYPI_PLATFORM:=--platform manylinux_2_17_x86_64 endif ifeq ($(PLATFORM), macos) -PYPI_PLATFORM:=--platform macosx_10_9_x86_64 +PYPI_PLATFORM:=--platform macosx_10_10_x86_64 endif ifeq ($(PLATFORM), macosm1) From 64a1a3eb29dc96b10c6a420ef9ad21cb67e5a0ed Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 12:03:41 +1000 Subject: [PATCH 363/429] Migrate PyP6Xer dep to install using pip --- src/blenderbim/Makefile | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/blenderbim/Makefile b/src/blenderbim/Makefile index 89c015eb29..e64e5758b0 100644 --- a/src/blenderbim/Makefile +++ b/src/blenderbim/Makefile @@ -164,21 +164,6 @@ endif cp dist/working/jsgantt* dist/blenderbim/bim/data/gantt/ rm -rf dist/working - # Required by IFC4D - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/b0/bb/9c4dddd3ca173cb56241cfb2eddfae24690dc676d357ac4cab17d0a36d9d/PyP6Xer-1.13.0.tar.gz - cd dist/working && tar -xzvf PyP6Xer* - cp -r dist/working/PyP6Xer-1.13.0/xerparser dist/blenderbim/libs/site/packages/ - rm -rf dist/working - - # Required by xerparser and IFC4D - # TODO: remove this dependency. It's only used to show a progress bar. - mkdir dist/working - cd dist/working && wget https://files.pythonhosted.org/packages/9f/7b/76c4e5ef1a1b528fcaada4133f972e77d33c252831676cf414119ca6093d/tqdm-4.50.0.tar.gz - cd dist/working && tar -xzvf tqdm* - cp -r dist/working/tqdm-4.50.0/tqdm dist/blenderbim/libs/site/packages/ - rm -rf dist/working - mkdir dist/working cd dist/working && $(PYTHON) -m venv env cd dist/working && mkdir site-packages @@ -221,6 +206,8 @@ endif cd dist/working && . env/bin/activate && $(PIP) install deepdiff --target=./site-packages # Required by IFCCSV and ifcopenshell.util.selector cd dist/working && . env/bin/activate && $(PIP) install lark --target=./site-packages + # Required by IFC4D + cd dist/working && . env/bin/activate && $(PIP) install PyP6Xer --target=./site-packages cp -r dist/working/site-packages/* dist/blenderbim/libs/site/packages/ rm -rf dist/working From f67911902f119c6eaee0bb26c304aff247f65204 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 12:29:17 +1000 Subject: [PATCH 364/429] Remove obsolete config option for openlca port --- src/blenderbim/blenderbim/bim/ui.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 664102ac22..01d5c13db5 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -194,7 +194,6 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): layout_svg_command: StringProperty(name="Layout SVG Command", description='E.g. [["firefox", "path"]]') pdf_command: StringProperty(name="PDF Command", description='E.g. [["firefox", "path"]]') spreadsheet_command: StringProperty(name="Spreadsheet Command", description='E.g. [["libreoffice", "path"]]') - openlca_port: IntProperty(name="OpenLCA IPC Port", default=8080) should_hide_empty_props: BoolProperty(name="Hide Empty Properties", default=True) should_setup_workspace: BoolProperty(name="Setup Workspace Layout for BIM", default=True) activate_workspace: BoolProperty(name="Activate BIM Workspace on Startup", default=True) @@ -278,8 +277,6 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): row = layout.row() row.prop(self, "spreadsheet_command") row = layout.row() - row.prop(self, "openlca_port") - row = layout.row() row.prop(self, "should_hide_empty_props") row = layout.row() row.prop(self, "should_setup_workspace") From 128ffc8fd76aaa29f7b2e2372bb26b891d4c5489 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 14:53:55 +1000 Subject: [PATCH 365/429] Fix bug where selector didn't handle "not equals" correctly for locations or groups --- src/ifcopenshell-python/ifcopenshell/util/selector.py | 4 ++-- src/ifcopenshell-python/test/util/test_selector.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 1dcb9a0ba0..52c7176650 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -660,7 +660,7 @@ class FacetTransformer(lark.Transformer): containers = self.get_container_tree(container) result = False if containers else None for container in containers: - if self.compare(container.Name, comparison, value): + if self.compare(container.Name, "=", value): result = True if result is not None: return result if comparison == "=" else not result @@ -675,7 +675,7 @@ class FacetTransformer(lark.Transformer): result = False for rel in getattr(element, "HasAssignments", []): if rel.is_a("IfcRelAssignsToGroup") and rel.RelatingGroup: - if self.compare(rel.RelatingGroup.Name, comparison, value): + if self.compare(rel.RelatingGroup.Name, "=", value): result = True return result if comparison == "=" else not result diff --git a/src/ifcopenshell-python/test/util/test_selector.py b/src/ifcopenshell-python/test/util/test_selector.py index efcc5dfa9c..e361833b34 100644 --- a/src/ifcopenshell-python/test/util/test_selector.py +++ b/src/ifcopenshell-python/test/util/test_selector.py @@ -238,6 +238,7 @@ class TestFilterElements(test.bootstrap.IFC4): assert subject.filter_elements(self.file, "IfcWall, classification=NULL") == {element2} assert subject.filter_elements(self.file, "IfcWall, classification=X") == {element} assert subject.filter_elements(self.file, "IfcWall, classification=Foobar") == {element} + assert subject.filter_elements(self.file, "IfcWall, classification!=X") == {element2} def test_selecting_by_location(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") @@ -255,6 +256,15 @@ class TestFilterElements(test.bootstrap.IFC4): assert subject.filter_elements(self.file, "IfcWall, location=Space") == {element} assert subject.filter_elements(self.file, "IfcWall, location=G") == {element, element2} assert subject.filter_elements(self.file, "IfcWall, location=Building") == {element, element2} + assert subject.filter_elements(self.file, "IfcWall, location!=Space") == {element2} + + def test_selecting_by_group(self): + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") + group = ifcopenshell.api.run("group.add_group", self.file, name="Foo") + ifcopenshell.api.run("group.assign_group", self.file, products=[element], group=group) + assert subject.filter_elements(self.file, "IfcWall, group=Foo") == {element} + assert subject.filter_elements(self.file, "IfcWall, group!=Foo") == {element2} def test_selecting_multiple_filter_groups(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") From 0f9ea1e1e79d6528469e15193243900b895183a4 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 15:09:05 +1000 Subject: [PATCH 366/429] New utility functions to get parent in spatial hierarchy, filled void, and voided element --- .../ifcopenshell/util/element.py | 79 ++++++++++++++++++- 1 file changed, 75 insertions(+), 4 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 89999deb5b..5fe96a2ff0 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -1024,14 +1024,85 @@ def get_groups(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entit return groups -def get_aggregate(element: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: +def get_parent(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: + """Get the parent in the spatial heirarchy + + IFC features a spatial hierarchy tree of all objects. Each spatial element + or physical element must be located inside this hierarchy exactly once. + + The top level parent of this tree is the IfcProject, which has no parent. + + All children may have parent-child relationships of one of the following types: + + - Spatial containment: a physical object is located in a space + - Aggregation: a physical object is broken up into parts, or a spatial location is split into sub locations + - Nesting: components are attached to a host parent + - Filling: the physical element fills an opening, such as a window filling a hole + - Voiding: the opening voids another physical element, such as a hole in a wall + + :param element: Any physical or spatial element in the tree + :return: Its parent. This must exist for any valid file, or None if we've reached the IfcProject. + + Example: + + .. code:: python + + element = file.by_type("IfcWall")[0] + parent = ifcopenshell.util.element.get_parent(element) + """ + return ( + get_container(element, should_get_direct=True) + or get_aggregate(element) + or get_nest(element) + or get_filled_void(element) + or get_voided_element(element) + ) + + +def get_filled_void(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: + """If the element is filling a void, get the void + + Examples include windows and doors which fill a opening inside a wall. + + :param element: The building element, typically a window or door + :return: The IfcOpeningElement that it is filling + + Example: + + .. code:: python + + window = file.by_type("IfcWindow")[0] + opening = ifcopenshell.util.element.get_filled_void(window) + """ + if rel := getattr(element, "FillsVoids", None): + return rel[0].RelatingOpeningElement + + +def get_voided_element(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: + """For an opening, get the building element that the opening is voiding + + For all valid models, this should never return None. + + :param element: The IfcOpeningElement + :return: The building element, such as a wall or slab + + Example: + + .. code:: python + + opening = file.by_type("IfcOpeningElement")[0] + element = ifcopenshell.util.element.get_voided_element(opening) + """ + if rel := getattr(element, "VoidsElements", None): + return rel[0].RelatingBuildingElement + + +def get_aggregate(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: """ Retrieves the aggregate parent of an element. :param element: The IFC element - :type element: ifcopenshell.entity_instance :return: The aggregate of the element - :rtype: ifcopenshell.entity_instance Example: @@ -1045,7 +1116,7 @@ def get_aggregate(element: ifcopenshell.entity_instance) -> ifcopenshell.entity_ return decomposes[0].RelatingObject -def get_nest(element: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: +def get_nest(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance]: """ Retrieves the nest parent of an element. From 6e30cd2ba75f1f299fc23ed736f4373aedf22cd7 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 15:10:45 +1000 Subject: [PATCH 367/429] Fix #4638. You can now filter by parent (in the spatial hierarchy) --- src/blenderbim/blenderbim/bim/helper.py | 3 +++ .../blenderbim/bim/module/search/prop.py | 5 +++-- src/blenderbim/blenderbim/tool/search.py | 7 ++++++ .../ifcopenshell/util/selector.py | 22 ++++++++++++++++++- .../test/util/test_selector.py | 19 ++++++++++++++++ 5 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/helper.py b/src/blenderbim/blenderbim/bim/helper.py index 9a67c74812..0fb911234e 100644 --- a/src/blenderbim/blenderbim/bim/helper.py +++ b/src/blenderbim/blenderbim/bim/helper.py @@ -304,6 +304,9 @@ def draw_filter(layout, filter_groups, data, module): elif ifc_filter.type == "group": row = box.row(align=True) row.prop(ifc_filter, "value", text="", icon="OUTLINER_COLLECTION") + elif ifc_filter.type == "parent": + row = box.row(align=True) + row.prop(ifc_filter, "value", text="", icon="FILE_PARENT") elif ifc_filter.type == "query": row = box.row(align=True) row.prop(ifc_filter, "name", text="", icon="POINTCLOUD_DATA") diff --git a/src/blenderbim/blenderbim/bim/module/search/prop.py b/src/blenderbim/blenderbim/bim/module/search/prop.py index c8c5580e6e..a7f2cc7d25 100644 --- a/src/blenderbim/blenderbim/bim/module/search/prop.py +++ b/src/blenderbim/blenderbim/bim/module/search/prop.py @@ -118,8 +118,9 @@ class BIMSearchProperties(PropertyGroup): ("location", "Location", "", "PACKAGE", 5), ("type", "Type", "", "FILE_VOLUME", 6), ("group", "Group", "", "OUTLINER_COLLECTION", 7), - ("query", "Query", "", "POINTCLOUD_DATA", 8), - ("instance", "GlobalId", "", "GRIP", 9), + ("parent", "Parent", "", "FILE_PARENT", 8), + ("query", "Query", "", "POINTCLOUD_DATA", 9), + ("instance", "GlobalId", "", "GRIP", 10), ], ) saved_searches: EnumProperty(items=get_saved_searches, name="Saved Searches") diff --git a/src/blenderbim/blenderbim/tool/search.py b/src/blenderbim/blenderbim/tool/search.py index 984e359d93..dad303d15b 100644 --- a/src/blenderbim/blenderbim/tool/search.py +++ b/src/blenderbim/blenderbim/tool/search.py @@ -86,6 +86,9 @@ class Search(blenderbim.core.tool.Search): elif ifc_filter.type == "group": comparison, value = cls.get_comparison_and_value(ifc_filter) filter_group_query.append(f"group{comparison}{value}") + elif ifc_filter.type == "parent": + comparison, value = cls.get_comparison_and_value(ifc_filter) + filter_group_query.append(f"parent{comparison}{value}") elif ifc_filter.type == "query": keys = cls.wrap_value(ifc_filter, ifc_filter.name) comparison, value = cls.get_comparison_and_value(ifc_filter) @@ -201,6 +204,10 @@ class ImportFilterQueryTransformer(lark.Transformer): comparison, value = args return {"type": "group", "value": f"{comparison}{value}"} + def parent(self, args): + comparison, value = args + return {"type": "parent", "value": f"{comparison}{value}"} + def query(self, args): keys, comparison, value = args return {"type": "query", "name": keys, "value": f"{comparison}{value}"} diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 52c7176650..cd07e6b074 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -39,7 +39,7 @@ filter_elements_grammar = lark.Lark( filter_group: facet_list ("+" facet_list)* facet_list: facet ("," facet)* - facet: instance | entity | attribute | type | material | query | classification | location | property | group + facet: instance | entity | attribute | type | material | query | classification | location | property | group | parent instance: not? globalid globalid: /[0-3][a-zA-Z0-9_$]{21}/ @@ -51,6 +51,7 @@ filter_elements_grammar = lark.Lark( classification: "classification" comparison value location: "location" comparison value group: "group" comparison value + parent: "parent" comparison value query: "query:" keys comparison value pset: quoted_string | regex_string | unquoted_string @@ -681,6 +682,25 @@ class FacetTransformer(lark.Transformer): self.elements = set(filter(filter_function, self.elements)) + def parent(self, args): + comparison, value = args + + def filter_function(element): + parents = [] + result = False + if parent := ifcopenshell.util.element.get_parent(element): + parents.append(parent) + while parents: + parent = parents.pop() + if self.compare(parent.Name, comparison, value): + result = True + break + if grandparent := ifcopenshell.util.element.get_parent(parent): + parents.append(grandparent) + return result if comparison == "=" else not result + + self.elements = set(filter(filter_function, self.elements)) + def query(self, args): keys, comparison, value = args diff --git a/src/ifcopenshell-python/test/util/test_selector.py b/src/ifcopenshell-python/test/util/test_selector.py index e361833b34..469b8918ef 100644 --- a/src/ifcopenshell-python/test/util/test_selector.py +++ b/src/ifcopenshell-python/test/util/test_selector.py @@ -266,6 +266,25 @@ class TestFilterElements(test.bootstrap.IFC4): assert subject.filter_elements(self.file, "IfcWall, group=Foo") == {element} assert subject.filter_elements(self.file, "IfcWall, group!=Foo") == {element2} + def test_selecting_by_parent(self): + element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall", name="Element1") + element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall", name="Element2") + element3 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall", name="Element3") + space = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSpace", name="Space") + storey = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBuildingStorey", name="G") + building = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBuilding", name="Building") + project = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject", name="Project") + ifcopenshell.api.run("spatial.assign_container", self.file, products=[element], relating_structure=space) + ifcopenshell.api.run("spatial.assign_container", self.file, products=[element2], relating_structure=storey) + ifcopenshell.api.run("aggregate.assign_object", self.file, products=[element3], relating_object=element2) + ifcopenshell.api.run("aggregate.assign_object", self.file, products=[space], relating_object=storey) + ifcopenshell.api.run("aggregate.assign_object", self.file, products=[storey], relating_object=building) + ifcopenshell.api.run("aggregate.assign_object", self.file, products=[building], relating_object=project) + assert subject.filter_elements(self.file, "IfcWall, parent=Project") == {element, element2, element3} + assert subject.filter_elements(self.file, "IfcWall, parent=Space") == {element} + assert subject.filter_elements(self.file, "IfcWall, parent=G") == {element, element2, element3} + assert subject.filter_elements(self.file, "IfcWall, parent=Element2") == {element3} + def test_selecting_multiple_filter_groups(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") element.Name = "Foo" From e26dae67aa17515045733863ccea53c0aa38ba67 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 15:11:29 +1000 Subject: [PATCH 368/429] Convenience function for calculators to get maximum XY length This is useful for 2D profiles --- src/ifcopenshell-python/ifcopenshell/util/shape.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape.py b/src/ifcopenshell-python/ifcopenshell/util/shape.py index 8780d63920..4b45c013e5 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape.py @@ -117,6 +117,17 @@ def get_z(geometry) -> float: return max(z_values) - min(z_values) +def get_max_xy(geometry) -> float: + """Gets the maximum X or Y length of the geometry + + :param geometry: Geometry output calculated by IfcOpenShell + :type geometry: geometry + :return: The maximum possible value out of the X and Y dimension + :rtype: float + """ + return max(get_x(geometry), get_y(geometry)) + + def get_max_xyz(geometry) -> float: """Gets the maximum X, Y, or Z length of the geometry From 00c13c5ea4795e19eaf04bf9169a76338faa9994 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 17:30:21 +1000 Subject: [PATCH 369/429] Fix #4756. You can now use parent as a key in a selector key. --- src/ifcopenshell-python/ifcopenshell/util/selector.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index cd07e6b074..378d60f902 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -370,6 +370,8 @@ def set_element_value( element = ifcopenshell.util.element.get_container(element, ifc_class="IfcBuilding") elif key == "site": element = ifcopenshell.util.element.get_container(element, ifc_class="IfcSite") + elif key == "parent": + element = ifcopenshell.util.element.get_parent(element) elif key == "class": if element.is_a().lower() != value.lower(): return ifcopenshell.util.schema.reassign_class(ifc_file, element, value) From d8b74cf125af5658f7222a137944240591429663 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 20:30:32 +1000 Subject: [PATCH 370/429] Whoops --- src/ifcopenshell-python/ifcopenshell/util/selector.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 378d60f902..fd032b9221 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -1057,6 +1057,8 @@ class Selector: value = ifcopenshell.util.element.get_container(value, ifc_class="IfcBuilding") elif key == "site": value = ifcopenshell.util.element.get_container(value, ifc_class="IfcSite") + elif key == "parent": + element = ifcopenshell.util.element.get_parent(element) elif key in ("types", "occurrences"): value = ifcopenshell.util.element.get_types(value) elif key == "count": From 70064359c398733b54f04a199b11fec04f28713e Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Jun 2024 20:52:05 +1000 Subject: [PATCH 371/429] Whoops x2 --- src/ifcopenshell-python/ifcopenshell/util/selector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index fd032b9221..b142ac3449 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -1058,7 +1058,7 @@ class Selector: elif key == "site": value = ifcopenshell.util.element.get_container(value, ifc_class="IfcSite") elif key == "parent": - element = ifcopenshell.util.element.get_parent(element) + value = ifcopenshell.util.element.get_parent(value) elif key in ("types", "occurrences"): value = ifcopenshell.util.element.get_types(value) elif key == "count": From d28f62d327f360e4c3010b8e9b27adbca5784abb Mon Sep 17 00:00:00 2001 From: Manu Varkey Date: Sat, 1 Jun 2024 16:28:07 +0530 Subject: [PATCH 372/429] Bug fix in editing material set item profile (#4784) Fixes bug: Editing a profile under MaterialProfileSetUsage opened dialog boxes under all profiles. --- src/blenderbim/blenderbim/bim/module/material/operator.py | 2 ++ src/blenderbim/blenderbim/bim/module/material/ui.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 09bc1e0f87..26ec81b5b7 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -562,6 +562,7 @@ class EnableEditingMaterialSetItemProfile(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object self.props = obj.BIMObjectMaterialProperties + self.props.active_material_set_item_id = self.material_set_item self.props.material_set_item_profile_attributes.clear() profile = tool.Ifc.get().by_id(self.material_set_item).Profile blenderbim.bim.helper.import_attributes2(profile, self.props.material_set_item_profile_attributes) @@ -577,6 +578,7 @@ class DisableEditingMaterialSetItemProfile(bpy.types.Operator): def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object self.props = obj.BIMObjectMaterialProperties + self.props.active_material_set_item_id = 0 self.props.material_set_item_profile_attributes.clear() return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index 17ff769851..1db1c7953d 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -228,7 +228,7 @@ class BIM_PT_object_material(Panel): total_items = len(ObjectMaterialData.data["set_items"]) for index, set_item in enumerate(ObjectMaterialData.data["set_items"]): - if len(self.props.material_set_item_profile_attributes): + if len(self.props.material_set_item_profile_attributes) and self.props.active_material_set_item_id == set_item["id"]: self.draw_editable_set_item_profile_ui(set_item) elif self.props.active_material_set_item_id == set_item["id"]: self.draw_editable_set_item_ui(set_item) From e2dc5f4a485d8f3ca8285fa87bc7f1d73125cd38 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sat, 1 Jun 2024 08:19:41 -0500 Subject: [PATCH 373/429] small tweak --- src/ifcopenshell-python/ifcopenshell/util/selector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index b142ac3449..a804ee406a 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -306,7 +306,7 @@ def filter_elements( .. code:: python - # Select all walls in the file. + # Select all the walls and slabs in the file. elements = ifcopenshell.util.selector.filter_elements(ifc_file, "IfcWall, IfcSlab") # Add doors to the elements too. From c5d1801e1e3fc964eef151008f0b563a4e2e1f8b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 2 Jun 2024 17:39:23 +1000 Subject: [PATCH 374/429] Fix #4786. Speed up parent filter. --- .../ifcopenshell-python/selector_syntax.rst | 2 + .../ifcopenshell/util/selector.py | 52 ++++++++++++++----- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst index 5cea364c72..fcc4f7cd7d 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/selector_syntax.rst @@ -102,6 +102,7 @@ elements in your filter group based on their criteria. "Material", "Filter", "``material{{=}}{{value}}``", "``material=Foo`` specifies the criteria that elements must have a IfcMaterial assigned directly or indirectly (such as within a layer set). That IfcMaterial must have either a ``Name`` or ``Category`` attribute with a value of ``Foo``." "Classification", "Filter", "``classification{{=}}{{value}}``", "``classification=Foo`` specifies the criteria that elements must have an IfcClassificationReference with an ``Identification`` attribute with a value of ``Foo``." "Location", "Filter", "``location{{=}}{{value}}``", "``location=Foo`` specifies the criteria that elements must be contained directly or indirectly in a spatial element with a ``Name`` attribute with a value of ``Foo``." + "Parent", "Filter", "``parent{{=}}{{value}}``", "``parent=Foo`` specifies the criteria that elements must be a direct or indirect child in the spatial hierarchy to an element with a ``Name`` attribute with a value of ``Foo``." "Query", "Filter", "``query:{{keys}}{{=}}{{value}}``", "``query:types.count=0`` specifies the criteria that elements must have zero type occurrences. The query keys corresponds to the syntax used in the `Getting element values`_ section" When you specify a filter with a ``{{=}}`` check, you can choose from one of @@ -183,6 +184,7 @@ Valid keys are: "``storey``", "Gets the first IfcBuildingStorey spatial element that an element is contained in." "``building``", "Gets the first IfcBuilding spatial element that an element is contained in." "``site``", "Gets the first IccSite spatial element that an element is contained in." + "``parent``", "Gets the parent element in the spatial hierarchy." "``material`` or ``mat``", "Gets the assigned material, which may be a material set." "``item`` or ``i``", "If the previous key returns a material set, gets the relevant material set items" "``materials`` or ``mats``", "Gets a list of IfcMaterials assigned directly or indirectly (such as via a material set) to the element" diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index a804ee406a..6097b9572c 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -687,21 +687,45 @@ class FacetTransformer(lark.Transformer): def parent(self, args): comparison, value = args - def filter_function(element): - parents = [] - result = False - if parent := ifcopenshell.util.element.get_parent(element): - parents.append(parent) - while parents: - parent = parents.pop() - if self.compare(parent.Name, comparison, value): - result = True - break - if grandparent := ifcopenshell.util.element.get_parent(parent): - parents.append(grandparent) - return result if comparison == "=" else not result + parents = set() + for rel in self.file.by_type("IfcRelAggregates"): + parent = rel.RelatingObject + if parent and self.compare(parent.Name, comparison, value): + parents.add(parent) - self.elements = set(filter(filter_function, self.elements)) + for rel in self.file.by_type("IfcRelContainedInSpatialStructure"): + parent = rel.RelatingStructure + if parent and self.compare(parent.Name, comparison, value): + parents.add(parent) + + for rel in self.file.by_type("IfcRelNests"): + parent = rel.RelatingObject + if parent and self.compare(parent.Name, comparison, value): + parents.add(parent) + + for rel in self.file.by_type("IfcRelVoidsElement"): + parent = rel.RelatingBuildingElement + if parent and self.compare(parent.Name, comparison, value): + parents.add(parent) + + for rel in self.file.by_type("IfcRelVoidsElement"): + parent = rel.RelatingBuildingElement + if parent and self.compare(parent.Name, comparison, value): + parents.add(parent) + + for rel in self.file.by_type("IfcRelFillsElement"): + parent = rel.RelatingOpeningElement + if parent and self.compare(parent.Name, comparison, value): + parents.add(parent) + + children = set() + for parent in parents: + children |= set(ifcopenshell.util.element.get_decomposition(parent)) + + if comparison == "=": + self.elements = self.elements & children + else: + self.elements -= children def query(self, args): keys, comparison, value = args From 23fee9c8c8a6321f054fbffeca808bab02738f3a Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 2 Jun 2024 17:43:25 +1000 Subject: [PATCH 375/429] Bring back formwork calculation feature that uses remesh --- .../blenderbim/bim/module/qto/__init__.py | 1 + .../blenderbim/bim/module/qto/operator.py | 15 +++++++++++++++ src/blenderbim/blenderbim/bim/module/qto/ui.py | 10 ++++++---- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/qto/__init__.py b/src/blenderbim/blenderbim/bim/module/qto/__init__.py index dada98ae88..a86ca04195 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/qto/__init__.py @@ -23,6 +23,7 @@ classes = ( operator.CalculateCircleRadius, operator.CalculateEdgeLengths, operator.CalculateFaceAreas, + operator.CalculateFormworkArea, operator.CalculateObjectVolumes, operator.CalculateSingleQuantity, operator.PerformQuantityTakeOff, diff --git a/src/blenderbim/blenderbim/bim/module/qto/operator.py b/src/blenderbim/blenderbim/bim/module/qto/operator.py index de6d270d89..c07df67466 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/operator.py +++ b/src/blenderbim/blenderbim/bim/module/qto/operator.py @@ -84,6 +84,21 @@ class CalculateObjectVolumes(bpy.types.Operator): return {"FINISHED"} +class CalculateFormworkArea(bpy.types.Operator): + bl_idname = "bim.calculate_formwork_area" + bl_label = "Calculate Formwork Area" + bl_options = {"REGISTER", "UNDO"} + + @classmethod + def poll(cls, context): + return context.selected_objects and context.active_object + + def execute(self, context): + result = helper.calculate_formwork_area([o for o in context.selected_objects if o.type == "MESH"], context) + context.scene.BIMQtoProperties.qto_result = str(round(result, 3)) + return {"FINISHED"} + + class CalculateSingleQuantity(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.calculate_single_quantity" bl_label = "Calculate Single Quantity" diff --git a/src/blenderbim/blenderbim/bim/module/qto/ui.py b/src/blenderbim/blenderbim/bim/module/qto/ui.py index c7f4863463..70c03b1496 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/ui.py +++ b/src/blenderbim/blenderbim/bim/module/qto/ui.py @@ -87,14 +87,16 @@ class BIM_PT_qto_simple(bpy.types.Panel): row = layout.row() row.prop(props, "qto_result", text="Results") - row = layout.row(align=True) + row = layout.row() row.operator("bim.calculate_circle_radius") - row = layout.row(align=True) + row = layout.row() row.operator("bim.calculate_edge_lengths") - row = layout.row(align=True) + row = layout.row() row.operator("bim.calculate_face_areas") - row = layout.row(align=True) + row = layout.row() row.operator("bim.calculate_object_volumes") + row = layout.row() + row.operator("bim.calculate_formwork_area") class BIM_PT_qto_cost(bpy.types.Panel): From 47704b1625a5e393fe1bc1abbd415519854a7efa Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Sun, 2 Jun 2024 09:05:38 -0500 Subject: [PATCH 376/429] =?UTF-8?q?Keeps=20selected=20objects=20selected?= =?UTF-8?q?=20when=20switching=20from=20one=20drawing=20to=20an=E2=80=A6?= =?UTF-8?q?=20(#4745)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keeps selected objects selected when switching from one drawing to another. As discussed: proposed: https://community.osarch.org/discussion/2179/not-unselecting-objects-when-switching-from-one-drawing-to-the-other#latest --- src/blenderbim/blenderbim/core/drawing.py | 4 ---- src/blenderbim/blenderbim/tool/drawing.py | 6 ++++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index 582a80551b..b739401b77 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -484,10 +484,6 @@ def activate_drawing_view( drawing_tool.import_annotations_in_group(drawing_tool.get_drawing_group(drawing)) blender.activate_camera(camera) drawing_tool.isolate_camera_collection(camera) - try: - blender.set_active_object(camera) - except: - raise CameraNotAvailableError() drawing_tool.activate_drawing(camera) diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 01d2c2c51c..85ee719343 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -1752,6 +1752,8 @@ class Drawing(blenderbim.core.tool.Drawing): @classmethod def activate_drawing(cls, camera: bpy.types.Object) -> None: + selected_objects_before = bpy.context.selected_objects + # Sync viewport objects visibility with selectors from EPset_Drawing/Include and /Exclude drawing = tool.Ifc.get_entity(camera) @@ -1839,6 +1841,10 @@ class Drawing(blenderbim.core.tool.Drawing): cls.import_camera_props(drawing, camera) + for obj in selected_objects_before: + obj.hide_set(False) + obj.select_set(True) + @classmethod def get_elements_in_camera_view( cls, camera: bpy.types.Object, objs: list[ifcopenshell.entity_instance] From d408568d01dd59657ee771f1fc11dfe25592c016 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 3 Jun 2024 14:08:46 +1000 Subject: [PATCH 377/429] Fix #4793. Bug where autodetected patch UI failed with new signature typing. --- src/blenderbim/blenderbim/bim/module/patch/operator.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/patch/operator.py b/src/blenderbim/blenderbim/bim/module/patch/operator.py index e6e7e1d795..6f5e2f7e3c 100644 --- a/src/blenderbim/blenderbim/bim/module/patch/operator.py +++ b/src/blenderbim/blenderbim/bim/module/patch/operator.py @@ -121,12 +121,16 @@ class UpdateIfcPatchArguments(bpy.types.Operator): for arg_name in inputs: arg_info = inputs[arg_name] new_attr = patch_args.add() + data_type = arg_info.get("type", "str") + if isinstance(data_type, list): + data_type = [dt for dt in data_type if dt != "NoneType"][0] new_attr.data_type = { + "Literal": "string", "str": "string", "float": "float", "int": "integer", "bool": "boolean", - }[arg_info.get("type", "str")] + }[data_type] new_attr.name = arg_name new_attr.set_value(arg_info.get("default", new_attr.get_value_default())) return {"FINISHED"} From 7e8060b224f64b5919444352da70790c28fc0dc7 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 3 Jun 2024 14:32:01 +1000 Subject: [PATCH 378/429] Fix #4791. Hide irrelevant spatial containment panel for spatial elements. --- .../blenderbim/bim/module/spatial/data.py | 27 ++++++++++++++----- .../blenderbim/bim/module/spatial/ui.py | 24 +++++++---------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/spatial/data.py b/src/blenderbim/blenderbim/bim/module/spatial/data.py index 78d3777295..e1a3a114cb 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/data.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/data.py @@ -31,14 +31,27 @@ class SpatialData: @classmethod def load(cls): - cls.data = { - "parent_container_id": cls.parent_container_id(), - "is_directly_contained": cls.is_directly_contained(), - "label": cls.label(), - "references": cls.references(), - "containers": cls.containers(), - } cls.is_loaded = True + cls.data["poll"] = cls.poll() + if cls.data["poll"]: + cls.data.update({ + "parent_container_id": cls.parent_container_id(), + "is_directly_contained": cls.is_directly_contained(), + "label": cls.label(), + "references": cls.references(), + "containers": cls.containers(), + }) + + @classmethod + def poll(cls): + if not bpy.context.active_object: + return False + element = tool.Ifc.get_entity(bpy.context.active_object) + if not element: + return False + if element.is_a("IfcElement") or element.is_a("IfcAnnotation") or element.is_a("IfcGrid"): + return True + return False @classmethod def containers(cls): diff --git a/src/blenderbim/blenderbim/bim/module/spatial/ui.py b/src/blenderbim/blenderbim/bim/module/spatial/ui.py index 04dfd23926..cc6687ca59 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/ui.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/ui.py @@ -17,7 +17,6 @@ # along with BlenderBIM Add-on. If not, see . from bpy.types import Panel, UIList -from blenderbim.bim.ifc import IfcStore from blenderbim.bim.module.spatial.data import SpatialData import blenderbim.tool as tool @@ -32,14 +31,9 @@ class BIM_PT_spatial(Panel): @classmethod def poll(cls, context): - if not context.active_object: - return False - oprops = context.active_object.BIMObjectProperties - if not oprops.ifc_definition_id: - return False - if not IfcStore.get_element(oprops.ifc_definition_id): - return False - return True + if not SpatialData.is_loaded: + SpatialData.load() + return SpatialData.data["poll"] def draw(self, context): if not SpatialData.is_loaded: @@ -156,12 +150,12 @@ class BIM_UL_containers_manager(UIList): row.label(text="", icon="BLANK1") if item.has_children: if item.is_expanded: - row.operator( - "bim.contract_container", text="", emboss=False, icon="DISCLOSURE_TRI_DOWN" - ).container = item.ifc_definition_id + row.operator("bim.contract_container", text="", emboss=False, icon="DISCLOSURE_TRI_DOWN").container = ( + item.ifc_definition_id + ) else: - row.operator( - "bim.expand_container", text="", emboss=False, icon="DISCLOSURE_TRI_RIGHT" - ).container = item.ifc_definition_id + row.operator("bim.expand_container", text="", emboss=False, icon="DISCLOSURE_TRI_RIGHT").container = ( + item.ifc_definition_id + ) else: row.label(text="", icon="DOT") From 44d180007e0e838c2a6adabf4c91b8b9d4c70eac Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 3 Jun 2024 15:16:27 +1000 Subject: [PATCH 379/429] Migrate test qto tool to new qto calculator --- src/blenderbim/test/tool/test_qto.py | 149 ++++++--------------------- 1 file changed, 30 insertions(+), 119 deletions(-) diff --git a/src/blenderbim/test/tool/test_qto.py b/src/blenderbim/test/tool/test_qto.py index 81f87dad07..4687eb8556 100644 --- a/src/blenderbim/test/tool/test_qto.py +++ b/src/blenderbim/test/tool/test_qto.py @@ -24,8 +24,8 @@ import test.bim.bootstrap import blenderbim.core.tool import blenderbim.core.root import blenderbim.tool as tool +import blenderbim.bim.module.qto.calculator as calculator from blenderbim.tool.qto import Qto as subject -from blenderbim.bim.module.pset.qto_calculator import QtoCalculator class TestImplementsTool(test.bim.bootstrap.NewFile): @@ -45,48 +45,6 @@ class TestSetQtoResult(test.bim.bootstrap.NewFile): assert bpy.context.scene.BIMQtoProperties.qto_result == "123.457" -class TestGetApplicableQuantityNames(test.bim.bootstrap.NewFile): - def test_run(self): - ifc = ifcopenshell.file() - tool.Ifc.set(ifc) - schema = ifc.schema - properties_templates = ( - ifcopenshell.util.pset.PsetQto(schema) - .get_by_name("Qto_WallBaseQuantities") - .get_info()["HasPropertyTemplates"] - ) - applicable_quantity_names = [a.Name for a in properties_templates] - assert subject.get_applicable_quantity_names("Qto_WallBaseQuantities") == applicable_quantity_names - - -class TestGetApplicableBaseQuantityName(test.bim.bootstrap.NewFile): - def test_run(self): - ifc = ifcopenshell.file() - tool.Ifc.set(ifc) - wall = ifc.createIfcWall() - assert subject.get_applicable_base_quantity_name(wall) == "Qto_WallBaseQuantities" - - def test_no_quantities(self): - ifc = ifcopenshell.file() - tool.Ifc.set(ifc) - ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcProject") - product = ifc.by_type("IfcProject")[0] - assert subject.get_applicable_base_quantity_name(product) == None - - def test_anomaly_named_quantities(self): - ifc = ifcopenshell.file() - tool.Ifc.set(ifc) - product = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcBuildingElementProxy") - # Prioritized over Qto_BodyGeometryValidation. - assert subject.get_applicable_base_quantity_name(product) == "Qto_BuildingElementProxyQuantities" - - def test_prioritize_base_over_other_qto(self): - ifc = ifcopenshell.file(schema="IFC4X3") - tool.Ifc.set(ifc) - product = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcWall") - assert subject.get_applicable_base_quantity_name(product) == "Qto_WallBaseQuantities" - - class TestGetRoundedValue(test.bim.bootstrap.NewFile): def test_run(self): quantity = 1.2345 @@ -97,12 +55,14 @@ class TestGetCalculatedObjectQuantities(test.bim.bootstrap.NewFile): def setup_file(self): self.ifc = ifcopenshell.file() tool.Ifc.set(self.ifc) - project = ifcopenshell.api.run("root.create_entity", self.ifc, ifc_class="IfcProject", name="My Project") + ifcopenshell.api.run("root.create_entity", self.ifc, ifc_class="IfcProject", name="My Project") def setup_units(self, units): ifcopenshell.api.run("unit.assign_unit", self.ifc, **units) def calculate_quantities(self, obj): + import ifc5d.qto + context = ifcopenshell.api.run("context.add_context", self.ifc, context_type="Model") bpy.ops.mesh.primitive_cube_add(location=(0.0, 0.0, 0.0), size=2) obj = bpy.context.active_object @@ -115,12 +75,32 @@ class TestGetCalculatedObjectQuantities(test.bim.bootstrap.NewFile): predefined_type="ELEMENTEDWALL", context=context, ) - calculator = QtoCalculator() - base_qto = ifcopenshell.api.run("pset.add_qto", self.ifc, product=element, name="Qto_WallBaseQuantities") - quantities = subject.get_calculated_object_quantities( - calculator=calculator, qto_name="Qto_WallBaseQuantities", obj=obj - ) - return quantities + + rules = { + "calculators": { + "Blender": { + "IfcWall": { + "Qto_WallBaseQuantities": { + "GrossFootprintArea": "get_gross_footprint_area", + "GrossSideArea": "get_gross_side_area", + "GrossVolume": "get_gross_volume", + "GrossWeight": "get_gross_weight", + "Height": "get_height", + "Length": "get_length", + "NetFootprintArea": "get_net_footprint_area", + "NetSideArea": "get_net_side_area", + "NetVolume": "get_net_volume", + "NetWeight": "get_net_weight", + "Width": "get_width", + } + }, + } + } + } + + ifc_file = tool.Ifc.get() + results = ifc5d.qto.quantify(ifc_file, {element}, rules) + return {k: round(v, 3) for k, v in results[element]["Qto_WallBaseQuantities"].items() if v is not None} def test_meters_project_unit(self): self.setup_file() @@ -186,35 +166,6 @@ class TestGetCalculatedObjectQuantities(test.bim.bootstrap.NewFile): assert quantities["NetVolume"] == 282.517 -class TestAddObjectBaseQto(test.bim.bootstrap.NewFile): - def test_run(self): - ifc = ifcopenshell.file() - tool.Ifc.set(ifc) - project = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcProject", name="My Project") - context = ifcopenshell.api.run("context.add_context", ifc, context_type="Model") - bpy.ops.mesh.primitive_cube_add(location=(0.0, 0.0, 0.0), size=2) - obj = bpy.context.active_object - element = blenderbim.core.root.assign_class( - tool.Ifc, - tool.Collector, - tool.Root, - obj=obj, - ifc_class="IfcWall", - predefined_type="ELEMENTEDWALL", - context=context, - ) - assert subject.add_object_base_qto(obj).Name == "Qto_WallBaseQuantities" - - -class TestAddProductBaseQto(test.bim.bootstrap.NewFile): - def test_run(self): - ifc = ifcopenshell.file() - tool.Ifc.set(ifc) - wall = ifc.createIfcWall() - base_qto = subject.add_product_base_qto(wall) - assert base_qto.Name == "Qto_WallBaseQuantities" - - class TestGetBaseQto(test.bim.bootstrap.NewFile): def test_run(self): ifc = ifcopenshell.file() @@ -236,46 +187,6 @@ class TestGetBaseQto(test.bim.bootstrap.NewFile): product = tool.Ifc.get_entity(wall_obj) assert not subject.get_base_qto(product) == True - def test_anomaly_named_quantities(self): - ifc = ifcopenshell.file() - tool.Ifc.set(ifc) - product = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcBuildingElementProxy") - tool.Ifc.run( - "pset.add_qto", - product=product, - name="EQto_BodyGeometryValidation", - ) - tool.Ifc.run( - "pset.add_qto", - product=product, - name="Qto_BuildingElementProxyQuantities", - ) - # Prioritized over Qto_BodyGeometryValidation. - base_qto_name = subject.get_base_qto(product).Name - assert base_qto_name == "Qto_BuildingElementProxyQuantities" - # Ensure methods are in sync. - assert base_qto_name == subject.get_applicable_base_quantity_name(product) - - def test_prioritize_base_over_other_qto(self): - ifc = ifcopenshell.file(schema="IFC4X3") - tool.Ifc.set(ifc) - product = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcWall") - tool.Ifc.run( - "pset.add_qto", - product=product, - name="Qto_BodyGeometryValidation", - ) - tool.Ifc.run( - "pset.add_qto", - product=product, - name="Qto_WallBaseQuantities", - ) - # Prioritized over Qto_BodyGeometryValidation. - base_qto_name = subject.get_base_qto(product).Name - assert base_qto_name == "Qto_WallBaseQuantities" - # Ensure methods are in sync. - assert base_qto_name == subject.get_applicable_base_quantity_name(product) - class TestGetRelatedCostItemQuantities(test.bim.bootstrap.NewFile): def test_run(self): From 6eb3c481445657e2a7937bb058ac6ec60850fb52 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 3 Jun 2024 15:37:24 +1000 Subject: [PATCH 380/429] Fix #3973. Fix #4787. Clarify that you cannot have aggregated physical elements where the whole has a body representation. --- .../bim/module/aggregate/operator.py | 23 +++++++++------- src/blenderbim/blenderbim/core/aggregate.py | 15 +++++++++-- src/blenderbim/blenderbim/tool/aggregate.py | 13 ++++++--- src/blenderbim/test/tool/test_aggregate.py | 27 +++++++++++++------ 4 files changed, 55 insertions(+), 23 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index 59ee5c0e95..f36462a9e7 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -55,21 +55,24 @@ class BIM_OT_aggregate_assign_object(bpy.types.Operator, Operator): if not relating_obj: return - for obj in bpy.context.selected_objects + [bpy.context.active_object]: + for obj in tool.Blender.get_selected_objects(): if obj == relating_obj: continue element = tool.Ifc.get_entity(obj) if not element: continue - result = core.assign_object( - tool.Ifc, - tool.Aggregate, - tool.Collector, - relating_obj=relating_obj, - related_obj=obj, - ) - if not result: - self.report({"ERROR"}, f" Cannot aggregate {obj.name} to {relating_obj.name}") + try: + core.assign_object( + tool.Ifc, + tool.Aggregate, + tool.Collector, + relating_obj=relating_obj, + related_obj=obj, + ) + except core.IncompatibleAggregateError: + self.report({"ERROR"}, f"Cannot aggregate {obj.name} to {relating_obj.name}") + except core.AggregateRepresentationError: + self.report({"ERROR"}, f"Cannot aggregate to {relating_obj.name} with a body representation") class BIM_OT_aggregate_unassign_object(bpy.types.Operator, Operator): diff --git a/src/blenderbim/blenderbim/core/aggregate.py b/src/blenderbim/blenderbim/core/aggregate.py index 44d4444f79..00fd67b3c8 100644 --- a/src/blenderbim/blenderbim/core/aggregate.py +++ b/src/blenderbim/blenderbim/core/aggregate.py @@ -41,9 +41,12 @@ def assign_object( related_obj: Optional[bpy.types.Object] = None, ) -> Union[ifcopenshell.entity_instance, None]: if not aggregator.can_aggregate(relating_obj, related_obj): - return + raise IncompatibleAggregateError + relating_object = ifc.get_entity(relating_obj) + if aggregator.has_physical_body_representation(relating_object): + raise AggregateRepresentationError rel = ifc.run( - "aggregate.assign_object", products=[ifc.get_entity(related_obj)], relating_object=ifc.get_entity(relating_obj) + "aggregate.assign_object", products=[ifc.get_entity(related_obj)], relating_object=relating_object ) collector.assign(relating_obj) collector.assign(related_obj) @@ -84,3 +87,11 @@ def add_part_to_object( part_obj = blender.create_ifc_object(ifc_class=part_class, name=part_name) assign_object(ifc, aggregator, collector, relating_obj=obj, related_obj=part_obj) blender.set_active_object(obj) + + +class IncompatibleAggregateError(Exception): + pass + + +class AggregateRepresentationError(Exception): + pass diff --git a/src/blenderbim/blenderbim/tool/aggregate.py b/src/blenderbim/blenderbim/tool/aggregate.py index 9188e12a32..9d4c6ff09a 100644 --- a/src/blenderbim/blenderbim/tool/aggregate.py +++ b/src/blenderbim/blenderbim/tool/aggregate.py @@ -30,9 +30,9 @@ class Aggregate(blenderbim.core.tool.Aggregate): related_object = tool.Ifc.get_entity(related_obj) if not relating_object or not related_object: return False - if (relating_object.is_a("IfcElement") or relating_object.is_a("IfcElementType")) and related_object.is_a("IfcElement"): - if relating_obj.data: # See #3973 - return False + if (relating_object.is_a("IfcElement") or relating_object.is_a("IfcElementType")) and related_object.is_a( + "IfcElement" + ): return True if tool.Ifc.get_schema() == "IFC2X3": if relating_object.is_a("IfcSpatialStructureElement") and related_object.is_a("IfcSpatialStructureElement"): @@ -46,6 +46,13 @@ class Aggregate(blenderbim.core.tool.Aggregate): return True return False + @classmethod + def has_physical_body_representation(cls, element: ifcopenshell.entity_instance) -> bool: + if element.is_a("IfcElement") or element.is_a("IfcElementType"): # See 3973 + if ifcopenshell.util.representation.get_representation(element, "Model", "Body"): + return True + return False + @classmethod def disable_editing(cls, obj: bpy.types.Object) -> None: obj.BIMObjectAggregateProperties.is_editing = False diff --git a/src/blenderbim/test/tool/test_aggregate.py b/src/blenderbim/test/tool/test_aggregate.py index 6540d2fcb7..9d7f693157 100644 --- a/src/blenderbim/test/tool/test_aggregate.py +++ b/src/blenderbim/test/tool/test_aggregate.py @@ -18,6 +18,9 @@ import bpy import ifcopenshell +import ifcopenshell.api.root +import ifcopenshell.api.unit +import ifcopenshell.api.context import blenderbim.core.tool import blenderbim.tool as tool from test.bim.bootstrap import NewFile @@ -92,16 +95,24 @@ class TestCanAggregate(NewFile): subelement_obj = bpy.data.objects.new("Object", None) assert subject.can_aggregate(element_obj, subelement_obj) is False - def test_aggregates_with_meshes_are_invalid(self): + +class TestHasPhysicalBodyRepresentation(NewFile): + def test_run(self): ifc = ifcopenshell.file() - tool.Ifc.set(ifc) element = ifc.createIfcElementAssembly() - element_obj = bpy.data.objects.new("Object", bpy.data.meshes.new("Mesh")) - tool.Ifc.link(element, element_obj) - subelement = ifc.createIfcBeam() - subelement_obj = bpy.data.objects.new("Object", None) - tool.Ifc.link(subelement, subelement_obj) - assert subject.can_aggregate(element_obj, subelement_obj) is False + assert subject.has_physical_body_representation(element) is False + ifcopenshell.api.root.create_entity(ifc, ifc_class="IfcProject") + ifcopenshell.api.unit.assign_unit(ifc) + context = ifcopenshell.api.context.add_context(ifc, context_type="Model") + body = ifcopenshell.api.context.add_context( + ifc, context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=context + ) + builder = ifcopenshell.util.shape_builder.ShapeBuilder(ifc) + origin = builder.create_axis2_placement_3d() + block = ifc.createIfcCsgSolid(ifc.createIfcBlock(origin, 200, 200, 200)) + rep = builder.get_representation(context=body, items=[block]) + ifcopenshell.api.geometry.assign_representation(ifc, product=element, representation=rep) + assert subject.has_physical_body_representation(element) is True class TestDisableEditing(NewFile): From 3d566cc40162cecc02a0d5166233c70d1adc2356 Mon Sep 17 00:00:00 2001 From: Manu Varkey Date: Mon, 3 Jun 2024 17:00:58 +0530 Subject: [PATCH 381/429] Fix missing code in pull request #4784 (#4794) One line of code was inadvertently missed out in the pull request https://github.com/IfcOpenShell/IfcOpenShell/pull/4784 --- src/blenderbim/blenderbim/bim/module/material/operator.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index 26ec81b5b7..a7cb1904c8 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -596,6 +596,7 @@ class EditMaterialSetItemProfile(bpy.types.Operator, tool.Ifc.Operator): attributes = blenderbim.bim.helper.export_attributes(self.props.material_set_item_profile_attributes) profile = tool.Ifc.get().by_id(self.material_set_item).Profile ifcopenshell.api.run("profile.edit_profile", tool.Ifc.get(), profile=profile, attributes=attributes) + self.props.active_material_set_item_id = 0 self.props.material_set_item_profile_attributes.clear() model_profile.DumbProfileRegenerator().regenerate_from_profile_def(profile) From 70091aa28b14620d72d6d122fa627f68c745edb4 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 16:48:14 +0500 Subject: [PATCH 382/429] typing --- .../blenderbim/bim/module/drawing/operator.py | 1 + src/blenderbim/blenderbim/tool/geometry.py | 4 ++-- .../ifcopenshell/util/element.py | 16 ++++++++++++++-- .../ifcopenshell/util/representation.py | 5 +++-- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index bf5256185f..9f9341f76f 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -29,6 +29,7 @@ import subprocess import numpy as np import multiprocessing import ifcopenshell +import ifcopenshell.api import ifcopenshell.ifcopenshell_wrapper import ifcopenshell.geom import ifcopenshell.util.selector diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 64c99d1c67..8120b69185 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -725,11 +725,11 @@ class Geometry(blenderbim.core.tool.Geometry): return False @classmethod - def should_use_presentation_style_assignment(cls): + def should_use_presentation_style_assignment(cls) -> bool: return bpy.context.scene.BIMGeometryProperties.should_use_presentation_style_assignment @classmethod - def get_model_representations(cls): + def get_model_representations(cls) -> list[ifcopenshell.entity_instance]: return tool.Ifc.get().by_type("IfcShapeRepresentation") @classmethod diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 5fe96a2ff0..33f5643efe 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -648,6 +648,8 @@ def get_styles(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entit return styles +# TODO: ifc_file argument is unnecessary for some methods now +# since we have entity_instance.file, so we can deprecate it. def get_elements_by_material( ifc_file: ifcopenshell.file, material: ifcopenshell.entity_instance ) -> list[ifcopenshell.entity_instance]: @@ -1041,7 +1043,9 @@ def get_parent(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.enti - Voiding: the opening voids another physical element, such as a hole in a wall :param element: Any physical or spatial element in the tree + :type element: ifcopenshell.entity_instance :return: Its parent. This must exist for any valid file, or None if we've reached the IfcProject. + :rtype: Union[ifcopenshell.entity_instance, None] Example: @@ -1065,7 +1069,9 @@ def get_filled_void(element: ifcopenshell.entity_instance) -> Union[ifcopenshell Examples include windows and doors which fill a opening inside a wall. :param element: The building element, typically a window or door + :type element: ifcopenshell.entity_instance :return: The IfcOpeningElement that it is filling + :rtype: Union[ifcopenshell.entity_instance, None] Example: @@ -1084,7 +1090,9 @@ def get_voided_element(element: ifcopenshell.entity_instance) -> Union[ifcopensh For all valid models, this should never return None. :param element: The IfcOpeningElement + :type element: ifcopenshell.entity_instance :return: The building element, such as a wall or slab + :rtype: Union[ifcopenshell.entity_instance, None] Example: @@ -1102,7 +1110,9 @@ def get_aggregate(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.e Retrieves the aggregate parent of an element. :param element: The IFC element + :type element: ifcopenshell.entity_instance :return: The aggregate of the element + :rtype: Union[ifcopenshell.entity_instance, None] Example: @@ -1116,14 +1126,14 @@ def get_aggregate(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.e return decomposes[0].RelatingObject -def get_nest(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance]: +def get_nest(element: ifcopenshell.entity_instance) -> Union[ifcopenshell.entity_instance, None]: """ Retrieves the nest parent of an element. :param element: The IFC element :type element: ifcopenshell.entity_instance :return: The nested whole of the element - :rtype: ifcopenshell.entity_instance + :rtype: Union[ifcopenshell.entity_instance, None] Example: @@ -1159,6 +1169,7 @@ def get_parts(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entity if (is_decomposed_by := getattr(element, "IsDecomposedBy", None)) is not None and is_decomposed_by: if is_decomposed_by[0].is_a("IfcRelAggregates"): return is_decomposed_by[0].RelatedObjects + return [] def get_components(element: ifcopenshell.entity_instance, include_ports=False) -> list[ifcopenshell.entity_instance]: @@ -1188,6 +1199,7 @@ def get_components(element: ifcopenshell.entity_instance, include_ports=False) - elif (is_decomposed_by := getattr(element, "IsDecomposedBy", None)) is not None and is_decomposed_by: if is_decomposed_by[0].is_a("IfcRelNests"): return is_decomposed_by[0].RelatedObjects + return [] ReferenceData = namedtuple("ReferenceData", "inverse_attribute, rel_class, relating_element_attribute") diff --git a/src/ifcopenshell-python/ifcopenshell/util/representation.py b/src/ifcopenshell-python/ifcopenshell/util/representation.py index 9bbfc783c4..fa79605ed0 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/representation.py +++ b/src/ifcopenshell-python/ifcopenshell/util/representation.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import numpy as np +import numpy.typing as npt import ifcopenshell import ifcopenshell.util.placement from typing import Optional, Union, TypedDict @@ -98,12 +99,12 @@ def resolve_representation(representation: ifcopenshell.entity_instance) -> ifco class ResolvedItemDict(TypedDict): - matrix: np.array + matrix: npt.NDArray[np.float64] item: ifcopenshell.entity_instance def resolve_items( - representation: ifcopenshell.entity_instance, matrix: Optional[np.array] = None + representation: ifcopenshell.entity_instance, matrix: Optional[npt.NDArray[np.float64]] = None ) -> list[ResolvedItemDict]: if matrix is None: matrix = np.eye(4) From 4a5d1eba0ba102342ce655ae18d5bc04635cfb05 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 11:30:41 +0500 Subject: [PATCH 383/429] specify exported api methods in __all__ It's py.types requirement, similar to 6e2edbf Example issue without __all__: import ifcopenshell import ifcopenshell.api.project # "create_file" is not exported from module "ifcopenshell.api.project" ifcopenshell.api.project.create_file() --- .../ifcopenshell/api/aggregate/__init__.py | 5 +++ .../ifcopenshell/api/attribute/__init__.py | 4 ++ .../ifcopenshell/api/boundary/__init__.py | 7 ++++ .../api/classification/__init__.py | 9 ++++ .../ifcopenshell/api/constraint/__init__.py | 12 ++++++ .../ifcopenshell/api/context/__init__.py | 6 +++ .../ifcopenshell/api/control/__init__.py | 5 +++ .../ifcopenshell/api/cost/__init__.py | 22 ++++++++++ .../ifcopenshell/api/document/__init__.py | 11 +++++ .../ifcopenshell/api/drawing/__init__.py | 6 +++ .../ifcopenshell/api/geometry/__init__.py | 25 +++++++++++ .../ifcopenshell/api/georeference/__init__.py | 6 +++ .../ifcopenshell/api/grid/__init__.py | 6 +++ .../ifcopenshell/api/group/__init__.py | 9 ++++ .../ifcopenshell/api/layer/__init__.py | 8 ++++ .../ifcopenshell/api/library/__init__.py | 11 +++++ .../ifcopenshell/api/material/__init__.py | 27 ++++++++++++ .../ifcopenshell/api/nest/__init__.py | 7 ++++ .../ifcopenshell/api/owner/__init__.py | 26 ++++++++++++ .../ifcopenshell/api/profile/__init__.py | 8 ++++ .../ifcopenshell/api/project/__init__.py | 7 ++++ .../ifcopenshell/api/pset/__init__.py | 8 ++++ .../api/pset_template/__init__.py | 9 ++++ .../ifcopenshell/api/resource/__init__.py | 15 +++++++ .../ifcopenshell/api/root/__init__.py | 7 ++++ .../ifcopenshell/api/sequence/__init__.py | 41 +++++++++++++++++++ .../ifcopenshell/api/spatial/__init__.py | 7 ++++ .../ifcopenshell/api/structural/__init__.py | 24 +++++++++++ .../ifcopenshell/api/style/__init__.py | 15 +++++++ .../ifcopenshell/api/system/__init__.py | 15 +++++++ .../ifcopenshell/api/type/__init__.py | 6 +++ .../ifcopenshell/api/unit/__init__.py | 13 ++++++ .../ifcopenshell/api/void/__init__.py | 7 ++++ 33 files changed, 394 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py index 21630a9be4..49898908ff 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py @@ -28,3 +28,8 @@ from .assign_object import assign_object from .unassign_object import unassign_object wrap_usecases(__path__, __name__) + +__all__ = [ + "assign_object", + "unassign_object", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py index 6d1164b4bd..d5a7de8ab4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py @@ -27,3 +27,7 @@ from .. import wrap_usecases from .edit_attributes import edit_attributes wrap_usecases(__path__, __name__) + +__all__ = [ + "edit_attributes", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py index 027c2cf00b..3df948a5cf 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py @@ -30,3 +30,10 @@ from .edit_attributes import edit_attributes from .remove_boundary import remove_boundary wrap_usecases(__path__, __name__) + +__all__ = [ + "assign_connection_geometry", + "copy_boundary", + "edit_attributes", + "remove_boundary", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py index 1ad42def0c..05dd99a05c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py @@ -36,3 +36,12 @@ from .remove_classification import remove_classification from .remove_reference import remove_reference wrap_usecases(__path__, __name__) + +__all__ = [ + "add_classification", + "add_reference", + "edit_classification", + "edit_reference", + "remove_classification", + "remove_reference", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py index 3e17e6a708..b78f91f026 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py @@ -34,3 +34,15 @@ from .remove_metric import remove_metric from .unassign_constraint import unassign_constraint wrap_usecases(__path__, __name__) + +__all__ = [ + "add_metric", + "add_metric_reference", + "add_objective", + "assign_constraint", + "edit_metric", + "edit_objective", + "remove_constraint", + "remove_metric", + "unassign_constraint", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py index 556d45145c..5bbb84cf8f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py @@ -31,3 +31,9 @@ from .edit_context import edit_context from .remove_context import remove_context wrap_usecases(__path__, __name__) + +__all__ = [ + "add_context", + "edit_context", + "remove_context", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py index 7aa970005e..bcc0985c15 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py @@ -27,3 +27,8 @@ from .assign_control import assign_control from .unassign_control import unassign_control wrap_usecases(__path__, __name__) + +__all__ = [ + "assign_control", + "unassign_control", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py index 713f243c4a..30321d7a0f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py @@ -46,3 +46,25 @@ from .remove_cost_value import remove_cost_value from .unassign_cost_item_quantity import unassign_cost_item_quantity wrap_usecases(__path__, __name__) + +__all__ = [ + "add_cost_item", + "add_cost_item_quantity", + "add_cost_schedule", + "add_cost_value", + "assign_cost_item_quantity", + "assign_cost_value", + "calculate_cost_item_resource_value", + "copy_cost_item", + "copy_cost_item_values", + "edit_cost_item", + "edit_cost_item_quantity", + "edit_cost_schedule", + "edit_cost_value", + "edit_cost_value_formula", + "remove_cost_item", + "remove_cost_item_quantity", + "remove_cost_schedule", + "remove_cost_value", + "unassign_cost_item_quantity", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py index 0e18a16fee..6560ce9080 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py @@ -35,3 +35,14 @@ from .remove_reference import remove_reference from .unassign_document import unassign_document wrap_usecases(__path__, __name__) + +__all__ = [ + "add_information", + "add_reference", + "assign_document", + "edit_information", + "edit_reference", + "remove_information", + "remove_reference", + "unassign_document", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py index 50c8838cd6..012dce92f6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py @@ -28,3 +28,9 @@ from .edit_text_literal import edit_text_literal from .unassign_product import unassign_product wrap_usecases(__path__, __name__) + +__all__ = [ + "assign_product", + "edit_text_literal", + "unassign_product", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py index e0b6f83319..3e99728f37 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py @@ -61,3 +61,28 @@ from .remove_representation import remove_representation from .unassign_representation import unassign_representation wrap_usecases(__path__, __name__) + +__all__ = [ + "add_axis_representation", + "add_boolean", + "add_door_representation", + "add_footprint_representation", + "add_mesh_representation", + "add_profile_representation", + "add_railing_representation", + "add_representation", + "add_slab_representation", + "add_wall_representation", + "add_window_representation", + "assign_representation", + "connect_element", + "connect_path", + "create_2pt_wall", + "disconnect_element", + "disconnect_path", + "edit_object_placement", + "map_representation", + "remove_boolean", + "remove_representation", + "unassign_representation", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py index 5488015977..49f272b6e0 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py @@ -29,3 +29,9 @@ from .edit_georeferencing import edit_georeferencing from .remove_georeferencing import remove_georeferencing wrap_usecases(__path__, __name__) + +__all__ = [ + "add_georeferencing", + "edit_georeferencing", + "remove_georeferencing", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py index bdbe764870..3b01281460 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py @@ -30,3 +30,9 @@ from .create_grid_axis import create_grid_axis from .remove_grid_axis import remove_grid_axis wrap_usecases(__path__, __name__) + +__all__ = [ + "create_axis_curve", + "create_grid_axis", + "remove_grid_axis", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py index e5f9c9db67..1e89610017 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py @@ -32,3 +32,12 @@ from .unassign_group import unassign_group from .update_group_products import update_group_products wrap_usecases(__path__, __name__) + +__all__ = [ + "add_group", + "assign_group", + "edit_group", + "remove_group", + "unassign_group", + "update_group_products", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py index d06b0189d9..156f0ea551 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py @@ -33,3 +33,11 @@ from .remove_layer import remove_layer from .unassign_layer import unassign_layer wrap_usecases(__path__, __name__) + +__all__ = [ + "add_layer", + "assign_layer", + "edit_layer", + "remove_layer", + "unassign_layer", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py index f5984dbfff..a70ffb0c4c 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py @@ -34,3 +34,14 @@ from .remove_reference import remove_reference from .unassign_reference import unassign_reference wrap_usecases(__path__, __name__) + +__all__ = [ + "add_library", + "add_reference", + "assign_reference", + "edit_library", + "edit_reference", + "remove_library", + "remove_reference", + "unassign_reference", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py index a03ccba9aa..6e57e28210 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py @@ -58,3 +58,30 @@ from .reorder_set_item import reorder_set_item from .unassign_material import unassign_material wrap_usecases(__path__, __name__) + +__all__ = [ + "add_constituent", + "add_layer", + "add_list_item", + "add_material", + "add_material_set", + "add_profile", + "assign_material", + "assign_profile", + "copy_material", + "edit_assigned_material", + "edit_constituent", + "edit_layer", + "edit_layer_usage", + "edit_material", + "edit_profile", + "edit_profile_usage", + "remove_constituent", + "remove_layer", + "remove_list_item", + "remove_material", + "remove_material_set", + "remove_profile", + "reorder_set_item", + "unassign_material", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py index 162f9c07a2..34a676f131 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py @@ -34,3 +34,10 @@ from .reorder_nesting import reorder_nesting from .unassign_object import unassign_object wrap_usecases(__path__, __name__) + +__all__ = [ + "assign_object", + "change_nest", + "reorder_nesting", + "unassign_object", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py index f61689b906..063dc84151 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py @@ -50,3 +50,29 @@ from .unassign_actor import unassign_actor from .update_owner_history import update_owner_history wrap_usecases(__path__, __name__) + +__all__ = [ + "add_actor", + "add_address", + "add_application", + "add_organisation", + "add_person", + "add_person_and_organisation", + "add_role", + "assign_actor", + "create_owner_history", + "edit_actor", + "edit_address", + "edit_organisation", + "edit_person", + "edit_role", + "remove_actor", + "remove_address", + "remove_application", + "remove_organisation", + "remove_person", + "remove_person_and_organisation", + "remove_role", + "unassign_actor", + "update_owner_history", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py index 6b4a5a1efd..e26d7725b1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py @@ -30,3 +30,11 @@ from .edit_profile import edit_profile from .remove_profile import remove_profile wrap_usecases(__path__, __name__) + +__all__ = [ + "add_arbitrary_profile", + "add_arbitrary_profile_with_voids", + "add_parameterized_profile", + "edit_profile", + "remove_profile", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py index 2641ad8ab8..3a438e35b4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py @@ -33,3 +33,10 @@ from .create_file import create_file from .unassign_declaration import unassign_declaration wrap_usecases(__path__, __name__) + +__all__ = [ + "append_asset", + "assign_declaration", + "create_file", + "unassign_declaration", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py index dbb4fb84c2..dd900a473a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py @@ -31,3 +31,11 @@ from .edit_qto import edit_qto from .remove_pset import remove_pset wrap_usecases(__path__, __name__) + +__all__ = [ + "add_pset", + "add_qto", + "edit_pset", + "edit_qto", + "remove_pset", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py index 971067d074..cc3467c1fc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py @@ -33,3 +33,12 @@ from .remove_prop_template import remove_prop_template from .remove_pset_template import remove_pset_template wrap_usecases(__path__, __name__) + +__all__ = [ + "add_prop_template", + "add_pset_template", + "edit_prop_template", + "edit_pset_template", + "remove_prop_template", + "remove_pset_template", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py index 7d318f8900..6ecc13baf4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py @@ -38,3 +38,18 @@ from .remove_resource_quantity import remove_resource_quantity from .unassign_resource import unassign_resource wrap_usecases(__path__, __name__) + +__all__ = [ + "add_resource", + "add_resource_quantity", + "add_resource_time", + "assign_resource", + "calculate_resource_usage", + "calculate_resource_work", + "edit_resource", + "edit_resource_quantity", + "edit_resource_time", + "remove_resource", + "remove_resource_quantity", + "unassign_resource", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py index 8845c8e663..ede54387e4 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py @@ -33,3 +33,10 @@ from .reassign_class import reassign_class from .remove_product import remove_product wrap_usecases(__path__, __name__) + +__all__ = [ + "copy_class", + "create_entity", + "reassign_class", + "remove_product", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py index 1c922c364f..8be9f81a57 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py @@ -67,3 +67,44 @@ from .unassign_recurrence_pattern import unassign_recurrence_pattern from .unassign_sequence import unassign_sequence wrap_usecases(__path__, __name__) + +__all__ = [ + "add_task", + "add_task_time", + "add_time_period", + "add_work_calendar", + "add_work_plan", + "add_work_schedule", + "add_work_time", + "assign_lag_time", + "assign_process", + "assign_product", + "assign_recurrence_pattern", + "assign_sequence", + "assign_workplan", + "calculate_task_duration", + "cascade_schedule", + "create_baseline", + "duplicate_task", + "edit_lag_time", + "edit_recurrence_pattern", + "edit_sequence", + "edit_task", + "edit_task_time", + "edit_work_calendar", + "edit_work_plan", + "edit_work_schedule", + "edit_work_time", + "recalculate_schedule", + "remove_task", + "remove_time_period", + "remove_work_calendar", + "remove_work_plan", + "remove_work_schedule", + "remove_work_time", + "unassign_lag_time", + "unassign_process", + "unassign_product", + "unassign_recurrence_pattern", + "unassign_sequence", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py index 564c91606f..92b2236319 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py @@ -29,3 +29,10 @@ from .reference_structure import reference_structure from .unassign_container import unassign_container wrap_usecases(__path__, __name__) + +__all__ = [ + "assign_container", + "dereference_structure", + "reference_structure", + "unassign_container", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py index d466add6ce..9406c5fc12 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py @@ -46,3 +46,27 @@ from .remove_structural_load_group import remove_structural_load_group from .unassign_structural_analysis_model import unassign_structural_analysis_model wrap_usecases(__path__, __name__) + +__all__ = [ + "add_structural_activity", + "add_structural_analysis_model", + "add_structural_boundary_condition", + "add_structural_load", + "add_structural_load_case", + "add_structural_load_group", + "add_structural_member_connection", + "assign_structural_analysis_model", + "edit_structural_analysis_model", + "edit_structural_boundary_condition", + "edit_structural_connection_cs", + "edit_structural_item_axis", + "edit_structural_load", + "edit_structural_load_case", + "remove_structural_analysis_model", + "remove_structural_boundary_condition", + "remove_structural_connection_condition", + "remove_structural_load", + "remove_structural_load_case", + "remove_structural_load_group", + "unassign_structural_analysis_model", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py index e32e13a5b1..ca84bad55a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py @@ -38,3 +38,18 @@ from .unassign_material_style import unassign_material_style from .unassign_representation_styles import unassign_representation_styles wrap_usecases(__path__, __name__) + +__all__ = [ + "add_style", + "add_surface_style", + "add_surface_textures", + "assign_material_style", + "assign_representation_styles", + "edit_presentation_style", + "edit_surface_style", + "remove_style", + "remove_styled_representation", + "remove_surface_style", + "unassign_material_style", + "unassign_representation_styles", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py index 0d374c830c..bba0ada726 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py @@ -39,3 +39,18 @@ from .unassign_port import unassign_port from .unassign_system import unassign_system wrap_usecases(__path__, __name__) + +__all__ = [ + "add_port", + "add_system", + "assign_flow_control", + "assign_port", + "assign_system", + "connect_port", + "disconnect_port", + "edit_system", + "remove_system", + "unassign_flow_control", + "unassign_port", + "unassign_system", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py index 6707dd9e8a..709e4aa00f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py @@ -30,3 +30,9 @@ from .map_type_representations import map_type_representations from .unassign_type import unassign_type wrap_usecases(__path__, __name__) + +__all__ = [ + "assign_type", + "map_type_representations", + "unassign_type", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py index 058e3f2c72..890af4fbde 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py @@ -36,3 +36,16 @@ from .remove_unit import remove_unit from .unassign_unit import unassign_unit wrap_usecases(__path__, __name__) + +__all__ = [ + "add_context_dependent_unit", + "add_conversion_based_unit", + "add_monetary_unit", + "add_si_unit", + "assign_unit", + "edit_derived_unit", + "edit_monetary_unit", + "edit_named_unit", + "remove_unit", + "unassign_unit", +] diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py index ae02decb95..0c5306e46f 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py +++ b/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py @@ -31,3 +31,10 @@ from .remove_filling import remove_filling from .remove_opening import remove_opening wrap_usecases(__path__, __name__) + +__all__ = [ + "add_filling", + "add_opening", + "remove_filling", + "remove_opening", +] From 499cdbb9b8fedae8f96ed7a3ef8b52b9b1c9923e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 11:32:25 +0500 Subject: [PATCH 384/429] bump old api argument deprecation date --- src/ifcopenshell-python/test/api/test_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/test/api/test_api.py b/src/ifcopenshell-python/test/api/test_api.py index 40e2135127..a0a35794c0 100644 --- a/src/ifcopenshell-python/test/api/test_api.py +++ b/src/ifcopenshell-python/test/api/test_api.py @@ -28,7 +28,7 @@ from typing import Union def deprecation_check(test): def new_test(self): - assert datetime.now().date() < datetime(2024, 6, 1).date(), "API arguments are completely deprecated" + assert datetime.now().date() < datetime(2024, 8, 1).date(), "API arguments are completely deprecated" test(self) return new_test From 08a82c7b576b8e40449637164fe051be9b80191c Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 11:54:58 +0500 Subject: [PATCH 385/429] remove dead code after #4745 --- src/blenderbim/blenderbim/bim/module/drawing/operator.py | 9 +-------- src/blenderbim/blenderbim/core/drawing.py | 4 ---- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 9f9341f76f..06225781bc 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -1538,14 +1538,7 @@ class ActivateDrawing(bpy.types.Operator): if not self.camera_view_point: viewport_position = tool.Blender.get_viewport_position() - try: - core.activate_drawing_view(tool.Ifc, tool.Blender, tool.Drawing, drawing=drawing) - except core.CameraNotAvailableError: - self.report( - {"ERROR"}, - "The drawing view is not available. Ensure you have not excluded it in the active view layer.", - ) - return {"CANCELLED"} + core.activate_drawing_view(tool.Ifc, tool.Blender, tool.Drawing, drawing=drawing) if not self.camera_view_point: tool.Blender.set_viewport_position(viewport_position) diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index b739401b77..f7e3c23d55 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -485,7 +485,3 @@ def activate_drawing_view( blender.activate_camera(camera) drawing_tool.isolate_camera_collection(camera) drawing_tool.activate_drawing(camera) - - -class CameraNotAvailableError(Exception): - pass From d53351d21895851d7a5549ee2adf05d01c999351 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 12:04:55 +0500 Subject: [PATCH 386/429] Remove redundant description repeating the label #4771 --- src/blenderbim/blenderbim/bim/module/material/operator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index a7cb1904c8..faa12e02a4 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -703,7 +703,7 @@ class EditMaterialSetItem(bpy.types.Operator, tool.Ifc.Operator): class ExpandMaterialCategory(bpy.types.Operator): bl_idname = "bim.expand_material_category" bl_label = "Expand Material Category" - bl_description = "Expand material category.\n\nSHIFT+CLICK to expand all material categories" + bl_description = "SHIFT+CLICK to expand all material categories" bl_options = {"REGISTER", "UNDO"} category: bpy.props.StringProperty() expand_all: bpy.props.BoolProperty(name="Expand All", default=False, options={"SKIP_SAVE"}) @@ -732,7 +732,7 @@ class ExpandMaterialCategory(bpy.types.Operator): class ContractMaterialCategory(bpy.types.Operator): bl_idname = "bim.contract_material_category" bl_label = "Contract Material Category" - bl_description = "Contract material category.\n\nSHIFT+CLICK to contract all material categories" + bl_description = "SHIFT+CLICK to contract all material categories" bl_options = {"REGISTER", "UNDO"} category: bpy.props.StringProperty() contract_all: bpy.props.BoolProperty(name="Contract All", default=False, options={"SKIP_SAVE"}) From 5ccdf187d5c312dfba77ba9085989f1d9876ba9a Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 12:25:05 +0500 Subject: [PATCH 387/429] change type of exception when setting non-optional property to TypeError TypeError is more correct since error occurs when user is trying to set some attribute value with None while atttribute doesn't support None type. ValueError is typically raised when provided value has a correct type but unsupported value. --- src/ifcopenshell-python/ifcopenshell/entity_instance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index de3ce535a6..5de590b9f5 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -332,7 +332,7 @@ class entity_instance: self.wrapped_data.setArgumentAsNull(idx) except RuntimeError as e: if e.args == ("Attribute not set",): - raise ValueError( + raise TypeError( "attribute '%s' is not optional for entity instance of type '%s'" % (self.wrapped_data.get_argument_name(idx), self.wrapped_data.is_a(True)) ) From c399eb259a93a865172180c194cb242679f1328b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 12:26:50 +0500 Subject: [PATCH 388/429] resource.add_resource_quantity to ensure quantity type is supported --- .../blenderbim/bim/module/resource/prop.py | 15 +------ .../api/resource/add_resource_quantity.py | 9 ++++ .../ifcopenshell/util/resource.py | 14 +++++++ .../resource/test_add_resource_quantity.py | 42 +++++++++++++------ 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/resource/prop.py b/src/blenderbim/blenderbim/bim/module/resource/prop.py index 8f5f3df6b2..08a6a480ce 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/prop.py +++ b/src/blenderbim/blenderbim/bim/module/resource/prop.py @@ -41,20 +41,7 @@ quantitytypes_enum = {} def setup_quantity_types_enum(): - # https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcConstructionResource.htm#Table-7.3.3.7.1.3.H - resources = { - "IfcCrewResource": ("IfcQuantityTime",), - "IfcLaborResource": ("IfcQuantityTime",), - "IfcSubContractResource": ("IfcQuantityTime",), - "IfcConstructionEquipmentResource": ("IfcQuantityTime",), - "IfcConstructionMaterialResource": ( - "IfcQuantityVolume", - "IfcQuantityArea", - "IfcQuantityLength", - "IfcQuantityWeight", - ), - "IfcConstructionProductResource": ("IfcQuantityCount",), - } + resources = ifcopenshell.util.resource.RESOURCES_TO_QUANTITIES for resource, quantities in resources.items(): quantitytypes_enum[resource] = [(q, q, "") for q in quantities] diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py index 8d3d6de9e9..72eb582af6 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/add_resource_quantity.py @@ -17,6 +17,7 @@ # along with IfcOpenShell. If not, see . import ifcopenshell.util.element +import ifcopenshell.util.resource def add_resource_quantity( @@ -66,6 +67,14 @@ def add_resource_quantity( """ settings = {"resource": resource, "ifc_class": ifc_class} + resource_type = resource.is_a() + supported_quantities = ifcopenshell.util.resource.RESOURCES_TO_QUANTITIES[resource_type] + if ifc_class not in supported_quantities: + raise ValueError( + f"Resource type '{resource_type}' does not support quantity type '{ifc_class}'. " + f"Supported quantities: {','.join(supported_quantities)}" + ) + quantity = file.create_entity(settings["ifc_class"], Name="Unnamed") # 3 IfcPhysicalSimpleQuantity Value if settings["ifc_class"] == "IfcQuantityCount": diff --git a/src/ifcopenshell-python/ifcopenshell/util/resource.py b/src/ifcopenshell-python/ifcopenshell/util/resource.py index bfc1aabed6..adce5bfa3f 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/resource.py +++ b/src/ifcopenshell-python/ifcopenshell/util/resource.py @@ -23,6 +23,20 @@ from typing import Union, Any PRODUCTIVITY_PSET_DATA = Union[dict[str, Any], None] +# https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcConstructionResource.htm#Table-7.3.3.7.1.3.H +RESOURCES_TO_QUANTITIES: dict[str, tuple[str, ...]] = { + "IfcCrewResource": ("IfcQuantityTime",), + "IfcLaborResource": ("IfcQuantityTime",), + "IfcSubContractResource": ("IfcQuantityTime",), + "IfcConstructionEquipmentResource": ("IfcQuantityTime",), + "IfcConstructionMaterialResource": ( + "IfcQuantityVolume", + "IfcQuantityArea", + "IfcQuantityLength", + "IfcQuantityWeight", + ), + "IfcConstructionProductResource": ("IfcQuantityCount",), +} def get_productivity(resource: ifcopenshell.entity_instance, should_inherit: bool = True) -> PRODUCTIVITY_PSET_DATA: diff --git a/src/ifcopenshell-python/test/api/resource/test_add_resource_quantity.py b/src/ifcopenshell-python/test/api/resource/test_add_resource_quantity.py index bde9451d11..e843e5828b 100644 --- a/src/ifcopenshell-python/test/api/resource/test_add_resource_quantity.py +++ b/src/ifcopenshell-python/test/api/resource/test_add_resource_quantity.py @@ -16,27 +16,45 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . +import pytest import test.bootstrap import ifcopenshell.api +import ifcopenshell.api.resource +import ifcopenshell.util.resource class TestAddResourceQuantity(test.bootstrap.IFC4): def test_run(self): schema = ifcopenshell.schema_by_name(self.file.schema) quantity_types = [t.name() for t in schema.declaration_by_name("IfcPhysicalSimpleQuantity").subtypes()] - self.file.create_entity("IfcProject") # add_resource - resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcCrewResource") + resource_types = [t.name() for t in schema.declaration_by_name("IfcConstructionResource").subtypes()] - for quantity_type in quantity_types: - quantity = ifcopenshell.api.run( - "resource.add_resource_quantity", self.file, resource=resource, ifc_class=quantity_type - ) - assert quantity.is_a(quantity_type) - assert quantity.Name == "Unnamed" - assert quantity[3] == 0.0 - # previous quantity is reassigned and removed - assert resource.BaseQuantity == quantity - assert len(self.file.by_type("IfcPhysicalSimpleQuantity")) == 1 + self.file.create_entity("IfcProject") # add_resource + + for resource_type in resource_types: + resource = ifcopenshell.api.resource.add_resource(self.file, ifc_class=resource_type) + available_quantities = ifcopenshell.util.resource.RESOURCES_TO_QUANTITIES[resource_type] + + for quantity_type in quantity_types: + if quantity_type not in available_quantities: + with pytest.raises(ValueError): + quantity = ifcopenshell.api.resource.add_resource_quantity( + self.file, resource=resource, ifc_class=quantity_type + ) + continue + else: + quantity = ifcopenshell.api.resource.add_resource_quantity( + self.file, resource=resource, ifc_class=quantity_type + ) + + assert quantity.is_a(quantity_type) + assert quantity.Name == "Unnamed" + assert quantity[3] == 0.0 + # previous quantity is reassigned and removed + assert resource.BaseQuantity == quantity + assert len(self.file.by_type("IfcPhysicalSimpleQuantity")) == 1 + + ifcopenshell.api.resource.remove_resource(self.file, resource) class TestAddResourceQuantityIFC2X3(test.bootstrap.IFC2X3, TestAddResourceQuantity): From 5fb7e6e375ebe4cc49342f3ef3ebce9a0bc0879f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 12:37:56 +0500 Subject: [PATCH 389/429] resource.remove_resource - fix issue removing resources in ifc2x3 --- .../api/resource/remove_resource.py | 5 +++-- .../test/api/resource/test_remove_resource.py | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/ifcopenshell-python/test/api/resource/test_remove_resource.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py index e5356a9dd9..bf5c46e6f7 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py +++ b/src/ifcopenshell-python/ifcopenshell/api/resource/remove_resource.py @@ -74,8 +74,9 @@ def remove_resource(file: ifcopenshell.file, resource: ifcopenshell.entity_insta file.remove(inverse) if history: ifcopenshell.util.element.remove_deep2(file, history) - if settings["resource"].Usage: - file.remove(settings["resource"].Usage) + # Usage was added in IFC4. + if usage := getattr(settings["resource"], "Usage", None): + file.remove(usage) if settings["resource"].BaseQuantity: ifcopenshell.api.run( "resource.remove_resource_quantity", diff --git a/src/ifcopenshell-python/test/api/resource/test_remove_resource.py b/src/ifcopenshell-python/test/api/resource/test_remove_resource.py new file mode 100644 index 0000000000..514c8bc16f --- /dev/null +++ b/src/ifcopenshell-python/test/api/resource/test_remove_resource.py @@ -0,0 +1,19 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2024 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +# remove_resource tests is partially covered by test_add_resource_quantity. From f4ce2965f91c8ee4cb87fcd485a79f6cb48839b3 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 16:02:19 +0500 Subject: [PATCH 390/429] fix error saving ifc file / assigning classes 6eb3c4814 --- src/blenderbim/blenderbim/tool/collector.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/collector.py b/src/blenderbim/blenderbim/tool/collector.py index 738b7d1cc6..f8d7eaa88c 100644 --- a/src/blenderbim/blenderbim/tool/collector.py +++ b/src/blenderbim/blenderbim/tool/collector.py @@ -95,9 +95,12 @@ class Collector(blenderbim.core.tool.Collector): # NOTE: won't allow assigning IfcElements to the IfcProject directly # and some elements might get missing in other viewers if they're don't support displaying # elements without hierarchy - blenderbim.core.aggregate.assign_object( - tool.Ifc, tool.Aggregate, tool.Collector, relating_obj=parent_obj, related_obj=obj - ) + try: + blenderbim.core.aggregate.assign_object( + tool.Ifc, tool.Aggregate, tool.Collector, relating_obj=parent_obj, related_obj=obj + ) + except blenderbim.core.aggregate.IncompatibleAggregateError: + pass @classmethod def assign(cls, obj: bpy.types.Object) -> None: From ee4e92dfa3f8adc0f788fe1f1840d38442ff96d2 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 16:07:39 +0500 Subject: [PATCH 391/429] remove bim.update_current_style poll as this operator can be executed without any objects selected --- src/blenderbim/blenderbim/bim/module/style/operator.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index cf36eee95e..10af6dfd95 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -161,13 +161,6 @@ class UpdateCurrentStyle(bpy.types.Operator): update_all: bpy.props.BoolProperty(name="Update All", default=False, options={"SKIP_SAVE"}) style_id: bpy.props.IntProperty(default=0, options={"SKIP_SAVE"}) - @classmethod - def poll(cls, context): - if not context.selected_objects: - cls.poll_message_set("No objects selected") - return False - return True - def invoke(self, context, event): # updating all styles on shift+click # make sure to use SKIP_SAVE on property, otherwise it might get stuck From e4eead666294a7adf2cf5ab6189d93da5158a140 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 16:45:47 +0500 Subject: [PATCH 392/429] styles ui - bim.assign_style_to_selected Just a simple operator to explicitly assign selected style to the selected objects from Styles UI https://imgur.com/a/JOLVPz7 --- .../blenderbim/bim/module/style/__init__.py | 1 + .../blenderbim/bim/module/style/operator.py | 47 +++++++++++++++++++ .../blenderbim/bim/module/style/ui.py | 2 + 3 files changed, 50 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/style/__init__.py b/src/blenderbim/blenderbim/bim/module/style/__init__.py index fb1ece3cb0..e2ec666495 100644 --- a/src/blenderbim/blenderbim/bim/module/style/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/style/__init__.py @@ -24,6 +24,7 @@ classes = ( operator.AddPresentationStyle, operator.AddStyle, operator.AddSurfaceTexture, + operator.AssignStyleToSelected, operator.BrowseExternalStyle, operator.RemoveTextureMap, operator.ChooseTextureMapPath, diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index 10af6dfd95..02ad4b2af0 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -23,6 +23,7 @@ import blenderbim.bim.handler import blenderbim.tool as tool import blenderbim.core.style as core import ifcopenshell.api +import ifcopenshell.api.style import ifcopenshell.util.representation from blenderbim.bim.module.style.prop import switch_shading from pathlib import Path @@ -951,3 +952,49 @@ class SaveUVToStyle(bpy.types.Operator, tool.Ifc.Operator): self.report({"INFO"}, f"UV saved to the style {style.Name}") return {"FINISHED"} + + +class AssignStyleToSelected(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.assign_style_to_selected" + bl_label = "Assign Style To Selected" + bl_description = "Assign style to the selected objects' active representations" + bl_options = {"REGISTER", "UNDO"} + + style_id: bpy.props.IntProperty(name="Style ID") + + @classmethod + def poll(cls, context): + if not context.selected_objects: + cls.poll_message_set("No objects selected") + return False + return True + + def _execute(self, context): + if self.style_id == 0: + self.report({"ERROR"}, "No style provided") + return {"CANCELLED"} + ifc_file = tool.Ifc.get() + style = ifc_file.by_id(self.style_id) + + representations: dict[ifcopenshell.entity_instance, bpy.types.Object] = {} + for obj in context.selected_objects: + representation = tool.Geometry.get_active_representation(obj) + if not representation: + continue + representation = tool.Geometry.resolve_mapped_representation(representation) + representations.setdefault(representation, obj) + + if not representations: + self.report({"INFO"}, "No IFC objects with representations selected.") + return {"FINISHED"} + + for representation in representations: + ifcopenshell.api.style.assign_representation_styles( + ifc_file, + shape_representation=representation, + styles=[style], + should_use_presentation_style_assignment=tool.Geometry.should_use_presentation_style_assignment(), + ) + + tool.Geometry.reload_representation(representations.values()) + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/style/ui.py b/src/blenderbim/blenderbim/bim/module/style/ui.py index 571696b187..4fbfee85fb 100644 --- a/src/blenderbim/blenderbim/bim/module/style/ui.py +++ b/src/blenderbim/blenderbim/bim/module/style/ui.py @@ -65,6 +65,8 @@ class BIM_PT_styles(Panel): row.operator("bim.duplicate_style", text="", icon="DUPLICATE").style = style.ifc_definition_id row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF").style = style.ifc_definition_id + op = row.operator("bim.assign_style_to_selected", text="", icon="BRUSH_DATA") + op.style_id = style.ifc_definition_id op = row.operator("bim.unlink_style", text="", icon="UNLINKED") op.style = style.ifc_definition_id op = row.operator("bim.enable_editing_style", text="", icon="GREASEPENCIL") From 94c159ccd06ba9e186cf83b53b33ebcdf40347ff Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 17:41:26 +0500 Subject: [PATCH 393/429] Consider elements with openings reloading representations Before - https://imgur.com/a/MMnGMBo . Occurrences with openings wasn't reloaded if you'd change their representation items (add/remove a style, remove a representation item). Also type/occurrences representations were not always reloading. After - https://imgur.com/a/vBDejb8 Similar thing will be added to switch representation and to representation update to solve issues like this - https://imgur.com/a/0DFIBj2 (issue is still present now). --- src/blenderbim/blenderbim/tool/geometry.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 8120b69185..9888176aa9 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -761,16 +761,25 @@ class Geometry(blenderbim.core.tool.Geometry): Ensures that same representations won't be reloaded multiple times. """ objs = obj_or_objs if isinstance(obj_or_objs, Iterable) else [obj_or_objs] + ifc_file = tool.Ifc.get() + + # Find all objects that use the same representation + # as there are possibility that some of them have openings + # (each representation with opening has a unique Mesh) + # and therefore reloading Mesh of it's type or occurrence + # might not be enough. + elements = set() + for obj in objs: + representation = tool.Geometry.get_active_representation(obj) + if not representation: + continue + representation = tool.Geometry.resolve_mapped_representation(representation) + elements.update(ifcopenshell.util.element.get_elements_by_representation(ifc_file, representation)) # Filter out unique meshes to avoid # reloading the same representation multiple times. meshes_to_objects: dict[bpy.types.Mesh, bpy.types.Object] - meshes_to_objects = dict() - for obj in objs: - mesh = obj.data - if not mesh: - continue - meshes_to_objects.setdefault(mesh, obj) + meshes_to_objects = {(obj:=tool.Ifc.get_object(element)).data: obj for element in elements} for obj in meshes_to_objects.values(): representation = tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) From 2ea3fe4ab9397454586f3b2a89ba909db56ff450 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 3 Jun 2024 22:49:40 +1000 Subject: [PATCH 394/429] Fix qto bug where cubic meter units are incorrectly converted. --- src/ifc5d/ifc5d/qto.py | 2 +- src/ifcopenshell-python/test/util/test_unit.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/ifc5d/ifc5d/qto.py b/src/ifc5d/ifc5d/qto.py index 14088ed86e..8beabe02f4 100644 --- a/src/ifc5d/ifc5d/qto.py +++ b/src/ifc5d/ifc5d/qto.py @@ -76,7 +76,7 @@ class SI2ProjectUnitConverter: "IfcLengthMeasure": "METRE", "IfcMassMeasure": "GRAM", "IfcTimeMeasure": "SECOND", - "IfcVolumeMeasure": "CUBIE_METRE", + "IfcVolumeMeasure": "CUBIC_METRE", } def convert(self, value, measure): diff --git a/src/ifcopenshell-python/test/util/test_unit.py b/src/ifcopenshell-python/test/util/test_unit.py index 52a6a93178..0852019976 100644 --- a/src/ifcopenshell-python/test/util/test_unit.py +++ b/src/ifcopenshell-python/test/util/test_unit.py @@ -16,13 +16,22 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import pytest import test.bootstrap import ifcopenshell.api import ifcopenshell.util.unit as subject from math import pi +class TestConvert(test.bootstrap.IFC4): + def test_run(self): + assert subject.convert(1, None, "METRE", None, "METRE") == 1 + assert subject.convert(1, None, "METRE", "MILLI", "METRE") == 1000 + assert subject.convert(1000, "MILLI", "METRE", None, "METRE") == 1 + assert subject.convert(1, None, "SQUARE_METRE", None, "SQUARE_METRE") == 1 + assert subject.convert(1, None, "SQUARE_METRE", "MILLI", "SQUARE_METRE") == 1000000 + assert subject.convert(1, None, "CUBIC_METRE", "MILLI", "CUBIC_METRE") == 1000000000 + + class TestCalculateUnitScale(test.bootstrap.IFC4): def test_prefix_and_conversion_based_units_are_considered(self): ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") From b68109d32b31d97e08e609587092fa2050453140 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Mon, 3 Jun 2024 12:31:03 -0500 Subject: [PATCH 395/429] small fix for #4745 --- src/blenderbim/blenderbim/bim/module/drawing/operator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 06225781bc..3f236bbe73 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -1632,7 +1632,7 @@ class ReloadDrawingStyles(bpy.types.Operator): if not DrawingsData.is_loaded: DrawingsData.load() drawing_pset_data = DrawingsData.data["active_drawing_pset_data"] - camera_props = context.active_object.data.BIMCameraProperties + camera_props = context.scene.camera.data.BIMCameraProperties # added this part as a temporary fallback # TODO: should remove it a bit later when projects get more accommodated From b3dcfbf0dc584ed71b3bd993c7d244de9bcef6ce Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 4 Jun 2024 12:31:00 +1000 Subject: [PATCH 396/429] See #4796. Fix issue where orphaned aggregate is never shown when loading IFC. --- src/blenderbim/blenderbim/bim/import_ifc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index cbbb8e7731..90c06e2d51 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -1702,6 +1702,7 @@ class IfcImporter: if aggregate["element"].is_a("IfcElementType"): self.type_collection.children.link(aggregate["collection"]) continue + self.project["blender"].children.link(aggregate["collection"]) def create_materials(self) -> None: for material in self.file.by_type("IfcMaterial"): From b14ff94303d26ca7539139d4f3e09e24941949d9 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 4 Jun 2024 13:57:57 +1000 Subject: [PATCH 397/429] Spatial manager renamed to project tree and added icons --- .../blenderbim/bim/module/spatial/__init__.py | 2 +- .../blenderbim/bim/module/spatial/data.py | 56 ++++++++++++------- .../blenderbim/bim/module/spatial/prop.py | 3 + .../blenderbim/bim/module/spatial/ui.py | 28 +++++++--- .../bim/module/spatial/workspace.py | 8 --- 5 files changed, 58 insertions(+), 39 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py index 67e937b77b..261e309834 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py @@ -46,7 +46,7 @@ classes = ( ui.BIM_PT_spatial, ui.BIM_UL_containers, ui.BIM_UL_containers_manager, - ui.BIM_PT_SpatialManager, + ui.BIM_PT_project_tree, workspace.Hotkey, ) diff --git a/src/blenderbim/blenderbim/bim/module/spatial/data.py b/src/blenderbim/blenderbim/bim/module/spatial/data.py index e1a3a114cb..6aa9d8f945 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/data.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/data.py @@ -23,6 +23,7 @@ import ifcopenshell.util.element def refresh(): SpatialData.is_loaded = False + ProjectTreeData.is_loaded = False class SpatialData: @@ -34,13 +35,14 @@ class SpatialData: cls.is_loaded = True cls.data["poll"] = cls.poll() if cls.data["poll"]: - cls.data.update({ - "parent_container_id": cls.parent_container_id(), - "is_directly_contained": cls.is_directly_contained(), - "label": cls.label(), - "references": cls.references(), - "containers": cls.containers(), - }) + cls.data.update( + { + "parent_container_id": cls.parent_container_id(), + "is_directly_contained": cls.is_directly_contained(), + "label": cls.label(), + "references": cls.references(), + } + ) @classmethod def poll(cls): @@ -53,20 +55,6 @@ class SpatialData: return True return False - @classmethod - def containers(cls): - results = {} - if tool.Ifc.get_schema() == "IFC2X3": - spatial_elements = tool.Ifc.get().by_type("IfcSpatialStructureElement") - else: - spatial_elements = tool.Ifc.get().by_type("IfcSpatialElement") - for container in spatial_elements: - results[container.id()] = { - "type": container.is_a(), - "id": container.id(), - } - return results - @classmethod def parent_container_id(cls): container_id = bpy.context.scene.BIMSpatialProperties.active_container_id @@ -94,3 +82,29 @@ class SpatialData: @classmethod def is_directly_contained(cls): return bool(getattr(tool.Ifc.get_entity(bpy.context.active_object), "ContainedInStructure", False)) + + +class ProjectTreeData: + data = {} + is_loaded = False + + @classmethod + def load(cls): + cls.is_loaded = True + cls.data = { + "containers": cls.containers(), + } + + @classmethod + def containers(cls): + results = {} + if tool.Ifc.get_schema() == "IFC2X3": + spatial_elements = tool.Ifc.get().by_type("IfcSpatialStructureElement") + else: + spatial_elements = tool.Ifc.get().by_type("IfcSpatialElement") + for container in spatial_elements: + results[container.id()] = { + "type": container.is_a(), + "id": container.id(), + } + return results diff --git a/src/blenderbim/blenderbim/bim/module/spatial/prop.py b/src/blenderbim/blenderbim/bim/module/spatial/prop.py index d9d8aa6357..59bc311948 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/prop.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/prop.py @@ -105,6 +105,9 @@ class BIMObjectSpatialProperties(PropertyGroup): class BIMContainer(PropertyGroup): name: StringProperty(name="Name", update=updateContainerName) + ifc_class: StringProperty(name="IFC Class") + description: StringProperty(name="Description") + long_name: StringProperty(name="Long Name") elevation: FloatProperty(name="Elevation", subtype="DISTANCE") level_index: IntProperty(name="Level Index") has_children: BoolProperty(name="Has Children") diff --git a/src/blenderbim/blenderbim/bim/module/spatial/ui.py b/src/blenderbim/blenderbim/bim/module/spatial/ui.py index cc6687ca59..90411c4ac1 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/ui.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/ui.py @@ -17,7 +17,7 @@ # along with BlenderBIM Add-on. If not, see . from bpy.types import Panel, UIList -from blenderbim.bim.module.spatial.data import SpatialData +from blenderbim.bim.module.spatial.data import SpatialData, ProjectTreeData import blenderbim.tool as tool @@ -91,13 +91,12 @@ class BIM_UL_containers(UIList): ) -class BIM_PT_SpatialManager(Panel): - bl_label = "Spatial Manager" - bl_idname = "BIM_PT_SpatialManager" +class BIM_PT_project_tree(Panel): + bl_label = "Project Tree" + bl_idname = "BIM_PT_project_tree" bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" bl_context = "scene" - bl_options = {"DEFAULT_CLOSED"} bl_parent_id = "BIM_PT_tab_project_setup" @classmethod @@ -105,8 +104,8 @@ class BIM_PT_SpatialManager(Panel): return tool.Ifc.get() and tool.Ifc.schema().name() != "IFC2X3" def draw(self, context): - if not SpatialData.is_loaded: - SpatialData.load() + if not ProjectTreeData.is_loaded: + ProjectTreeData.load() self.props = context.scene.BIMSpatialManagerProperties row = self.layout.row() row.operator("bim.load_container_manager", icon="FILE_REFRESH", text="Load Spatial Structure") @@ -115,7 +114,7 @@ class BIM_PT_SpatialManager(Panel): row = self.layout.row() row.alignment = "RIGHT" row.operator("bim.select_decomposed_elements", icon="RESTRICT_SELECT_OFF", text="Select Children") - spatial_data = SpatialData.data["containers"].get(ifc_definition_id, None) + spatial_data = ProjectTreeData.data["containers"].get(ifc_definition_id, None) if spatial_data and spatial_data["type"] in ["IfcBuildingStorey", "IfcBuilding"]: row.operator("bim.add_building_storey", icon="ADD", text="Add storey").part_class = "IfcBuildingStorey" row.operator("bim.delete_container", icon="X", text="Delete").container = ifc_definition_id @@ -143,6 +142,7 @@ class BIM_UL_containers_manager(UIList): split1 = row.split(factor=0.7) split1.prop(item, "name", emboss=False, text="") split2 = row.split(factor=1) + split2.alignment = "RIGHT" split2.label(icon="BLANK1", text=tool.Unit.blender_format_unit(item.elevation)) def draw_hierarchy(self, row, item): @@ -158,4 +158,14 @@ class BIM_UL_containers_manager(UIList): item.ifc_definition_id ) else: - row.label(text="", icon="DOT") + row.label(text="", icon="BLANK1") + if item.ifc_class == "IfcSite": + row.label(text="", icon="WORLD") + elif item.ifc_class == "IfcBuilding": + row.label(text="", icon="HOME") + elif item.ifc_class == "IfcBuildingStorey": + row.label(text="", icon="LINENUMBERS_OFF") + elif item.ifc_class == "IfcSpace": + row.label(text="", icon="ANTIALIASED") + else: + row.label(text="", icon="META_PLANE") diff --git a/src/blenderbim/blenderbim/bim/module/spatial/workspace.py b/src/blenderbim/blenderbim/bim/module/spatial/workspace.py index c2e08bd1d0..11b7caa477 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/workspace.py @@ -64,16 +64,10 @@ def add_layout_hotkey(layout, text, hotkey, description): tool.Blender.add_layout_hotkey_operator(*args) -# NOTES before adding new operators: -# - add scene.BIMSpatialProperties -# - add SpatialData - - class SpatialToolUI: @classmethod def draw(cls, context, layout): cls.layout = layout - # cls.props = context.scene.BIMSpatialProperties cls.model_props = context.scene.BIMModelProperties row = cls.layout.row(align=True) @@ -151,12 +145,10 @@ class Hotkey(bpy.types.Operator, Operator): return operator.description or "" def _execute(self, context): - # self.props = context.scene.BIMSpatialProperties getattr(self, f"hotkey_{self.hotkey}")() def invoke(self, context, event): # https://blender.stackexchange.com/questions/276035/how-do-i-make-operators-remember-their-property-values-when-called-from-a-hotkey - # self.props = context.scene.BIMSpatialProperties return self.execute(context) def draw(self, context): From faaea7db495cc9fefe77a515259a90c7f294b827 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 4 Jun 2024 15:10:28 +1000 Subject: [PATCH 398/429] Spatial manager now allows inline editing of names and elevations for a slicker UI --- src/blenderbim/blenderbim/bim/__init__.py | 1 + .../bim/module/covering/__init__.py | 4 -- .../blenderbim/bim/module/spatial/__init__.py | 6 +-- .../blenderbim/bim/module/spatial/prop.py | 45 +++++++--------- .../blenderbim/bim/module/spatial/ui.py | 21 +++----- src/blenderbim/blenderbim/bim/ui.py | 25 ++++++--- src/blenderbim/blenderbim/tool/spatial.py | 54 +++++++++---------- 7 files changed, 76 insertions(+), 80 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 9db15ef2a0..6d2ef80a55 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -142,6 +142,7 @@ classes = [ ui.BIM_PT_tabs, # Project overview ui.BIM_PT_tab_project_info, + ui.BIM_PT_tab_project_tree, ui.BIM_PT_tab_project_setup, ui.BIM_PT_tab_geometry, ui.BIM_PT_tab_stakeholders, diff --git a/src/blenderbim/blenderbim/bim/module/covering/__init__.py b/src/blenderbim/blenderbim/bim/module/covering/__init__.py index 73c39a93af..fed1174854 100644 --- a/src/blenderbim/blenderbim/bim/module/covering/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/covering/__init__.py @@ -29,13 +29,9 @@ def register(): if not bpy.app.background: bpy.utils.register_tool(workspace.CoveringTool, after={"bim.structural_tool"}, separator=False, group=False) bpy.types.Scene.BIMCoveringProperties = bpy.props.PointerProperty(type=prop.BIMCoveringProperties) -# bpy.types.Object.BIMObjectSpatialProperties = bpy.props.PointerProperty(type=prop.BIMObjectSpatialProperties) -# bpy.types.Scene.BIMSpatialManagerProperties = bpy.props.PointerProperty(type=prop.BIMSpatialManagerProperties) def unregister(): if not bpy.app.background: bpy.utils.unregister_tool(workspace.CoveringTool) del bpy.types.Scene.BIMCoveringProperties -# del bpy.types.Object.BIMObjectSpatialProperties -# del bpy.types.Scene.BIMSpatialManagerProperties diff --git a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py index 261e309834..f48afcfa3a 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py @@ -42,7 +42,7 @@ classes = ( prop.BIMSpatialProperties, prop.BIMObjectSpatialProperties, prop.BIMContainer, - prop.BIMSpatialManagerProperties, + prop.BIMProjectTreeProperties, ui.BIM_PT_spatial, ui.BIM_UL_containers, ui.BIM_UL_containers_manager, @@ -56,7 +56,7 @@ def register(): bpy.utils.register_tool(workspace.SpatialTool, after={"bim.annotation_tool"}, separator=False, group=False) bpy.types.Scene.BIMSpatialProperties = bpy.props.PointerProperty(type=prop.BIMSpatialProperties) bpy.types.Object.BIMObjectSpatialProperties = bpy.props.PointerProperty(type=prop.BIMObjectSpatialProperties) - bpy.types.Scene.BIMSpatialManagerProperties = bpy.props.PointerProperty(type=prop.BIMSpatialManagerProperties) + bpy.types.Scene.BIMProjectTreeProperties = bpy.props.PointerProperty(type=prop.BIMProjectTreeProperties) def unregister(): @@ -64,4 +64,4 @@ def unregister(): bpy.utils.unregister_tool(workspace.SpatialTool) del bpy.types.Scene.BIMSpatialProperties del bpy.types.Object.BIMObjectSpatialProperties - del bpy.types.Scene.BIMSpatialManagerProperties + del bpy.types.Scene.BIMProjectTreeProperties diff --git a/src/blenderbim/blenderbim/bim/module/spatial/prop.py b/src/blenderbim/blenderbim/bim/module/spatial/prop.py index 59bc311948..f6480ae31a 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/prop.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/prop.py @@ -36,27 +36,17 @@ import ifcopenshell def update_elevation(self, context): - entity = tool.Ifc.get().by_id(self.active_container_id) - obj = tool.Ifc.get_object(entity) - if not obj: - return - obj.location.z = self.elevation + if ifc_definition_id := self.ifc_definition_id: + entity = tool.Ifc.get().by_id(ifc_definition_id) + obj = tool.Ifc.get_object(entity) + if not obj: + return + obj.location.z = self.elevation -def update_active_container_index(self, context): - if self.active_container_index < 0: - return - self.active_container_id = self.containers[self.active_container_index].ifc_definition_id - self.container_name = self.containers[self.active_container_index].name - self.elevation = self.containers[self.active_container_index].elevation - - -def updateContainerName(self, context): - props = context.scene.BIMSpatialManagerProperties - if not props.is_container_update_enabled or self.name == "Unnamed": - return - tool.Spatial.edit_container_name(tool.Ifc.get().by_id(props.active_container_id), self.name) - props.container_name = self.name +def update_name(self, context): + if ifc_definition_id := self.ifc_definition_id: + tool.Spatial.edit_container_name(tool.Ifc.get().by_id(ifc_definition_id), self.name) def update_relating_container_from_object(self, context): @@ -104,23 +94,24 @@ class BIMObjectSpatialProperties(PropertyGroup): class BIMContainer(PropertyGroup): - name: StringProperty(name="Name", update=updateContainerName) + name: StringProperty(name="Name", update=update_name) ifc_class: StringProperty(name="IFC Class") description: StringProperty(name="Description") long_name: StringProperty(name="Long Name") - elevation: FloatProperty(name="Elevation", subtype="DISTANCE") + elevation: FloatProperty(name="Elevation", subtype="DISTANCE", update=update_elevation) level_index: IntProperty(name="Level Index") has_children: BoolProperty(name="Has Children") is_expanded: BoolProperty(name="Is Expanded") ifc_definition_id: IntProperty(name="IFC Definition ID") -class BIMSpatialManagerProperties(PropertyGroup): +class BIMProjectTreeProperties(PropertyGroup): containers: CollectionProperty(name="Containers", type=BIMContainer) contracted_containers: StringProperty(name="Contracted containers", default="[]") expanded_containers: StringProperty(name="Expanded containers", default="[]") - active_container_index: IntProperty(name="Active Container Index", update=update_active_container_index) - active_container_id: IntProperty(name="Active Container Id") - container_name: StringProperty(name="Container Name") - elevation: FloatProperty(name="Elevation", update=update_elevation, subtype="DISTANCE") - is_container_update_enabled: BoolProperty(name="Is Container Update Enabled", default=True) # TODO:review + active_container_index: IntProperty(name="Active Container Index") + + @property + def active_container(self): + if self.active_container_index < len(self.containers): + return self.containers[self.active_container_index] diff --git a/src/blenderbim/blenderbim/bim/module/spatial/ui.py b/src/blenderbim/blenderbim/bim/module/spatial/ui.py index 90411c4ac1..32fbc6cee9 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/ui.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/ui.py @@ -97,7 +97,8 @@ class BIM_PT_project_tree(Panel): bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" bl_context = "scene" - bl_parent_id = "BIM_PT_tab_project_setup" + bl_parent_id = "BIM_PT_tab_project_tree" + bl_options = {"HIDE_HEADER"} @classmethod def poll(cls, context): @@ -106,18 +107,18 @@ class BIM_PT_project_tree(Panel): def draw(self, context): if not ProjectTreeData.is_loaded: ProjectTreeData.load() - self.props = context.scene.BIMSpatialManagerProperties + self.props = context.scene.BIMProjectTreeProperties row = self.layout.row() row.operator("bim.load_container_manager", icon="FILE_REFRESH", text="Load Spatial Structure") - if 0 <= self.props.active_container_index < len(self.props.containers): + if self.props.active_container: ifc_definition_id = self.props.containers[self.props.active_container_index].ifc_definition_id - row = self.layout.row() + row = self.layout.row(align=True) row.alignment = "RIGHT" - row.operator("bim.select_decomposed_elements", icon="RESTRICT_SELECT_OFF", text="Select Children") + row.operator("bim.select_decomposed_elements", icon="RESTRICT_SELECT_OFF", text="") spatial_data = ProjectTreeData.data["containers"].get(ifc_definition_id, None) if spatial_data and spatial_data["type"] in ["IfcBuildingStorey", "IfcBuilding"]: row.operator("bim.add_building_storey", icon="ADD", text="Add storey").part_class = "IfcBuildingStorey" - row.operator("bim.delete_container", icon="X", text="Delete").container = ifc_definition_id + row.operator("bim.delete_container", icon="X", text="").container = ifc_definition_id self.layout.template_list( "BIM_UL_containers_manager", "", @@ -126,12 +127,6 @@ class BIM_PT_project_tree(Panel): self.props, "active_container_index", ) - row = self.layout.row() - if 0 <= self.props.active_container_index < len(self.props.containers): - row.prop(self.props, "container_name", text="") - row.prop(self.props, "elevation", text="") - op = row.operator("bim.edit_container_attributes", icon="CHECKMARK", text="Apply") - op.container = self.props.containers[self.props.active_container_index].ifc_definition_id class BIM_UL_containers_manager(UIList): @@ -143,7 +138,7 @@ class BIM_UL_containers_manager(UIList): split1.prop(item, "name", emboss=False, text="") split2 = row.split(factor=1) split2.alignment = "RIGHT" - split2.label(icon="BLANK1", text=tool.Unit.blender_format_unit(item.elevation)) + split2.prop(item, "elevation", emboss=False, text="") def draw_hierarchy(self, row, item): for i in range(0, item.level_index): diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 01d5c13db5..eb6a0709d2 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -202,9 +202,7 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): default=True, description="If disabled, the toolbar will only load when an IFC model is active", ) - should_play_chaching_sound: BoolProperty( - name="Play A Cha-Ching Sound When Project Costs Updates", default=False - ) + should_play_chaching_sound: BoolProperty(name="Play A Cha-Ching Sound When Project Costs Updates", default=False) lock_grids_on_import: BoolProperty(name="Lock Grids By Default", default=True) spatial_elements_unselectable: BoolProperty(name="Make Spatial Elements Unselectable By Default", default=True) decorations_colour: bpy.props.FloatVectorProperty( @@ -407,7 +405,7 @@ class BIM_PT_tabs(Panel): if blenderbim.last_error: box = self.layout.box() - box.alert=True + box.alert = True row = box.row(align=True) row.label(text="BlenderBIM experienced an error :(", icon="ERROR") row.operator("bim.close_error", text="", icon="CANCEL") @@ -442,6 +440,20 @@ class BIM_PT_tab_project_info(Panel): pass +class BIM_PT_tab_project_tree(Panel): + bl_label = "Project Tree" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + + @classmethod + def poll(cls, context): + return tool.Blender.is_tab(context, "PROJECT") + + def draw(self, context): + pass + + class BIM_PT_tab_project_setup(Panel): bl_label = "Project Setup" bl_space_type = "PROPERTIES" @@ -490,7 +502,7 @@ class BIM_PT_tab_grouping_and_filtering(Panel): bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" bl_context = "scene" - bl_options = {"DEFAULT_CLOSED","HEADER_LAYOUT_EXPAND"} + bl_options = {"DEFAULT_CLOSED", "HEADER_LAYOUT_EXPAND"} @classmethod def poll(cls, context): @@ -503,8 +515,9 @@ class BIM_PT_tab_grouping_and_filtering(Panel): # Draws help button on the right row = self.layout.row(align=True) row.label(text="") # empty text occupies the left of the row - row.operator("bim.open_uri", text="", icon="HELP").uri = \ + row.operator("bim.open_uri", text="", icon="HELP").uri = ( "https://docs.ifcopenshell.org/ifcopenshell-python/selector_syntax.html" + ) class BIM_PT_tab_geometry(Panel): diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index bd1ecb634b..19ffce1230 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -208,44 +208,44 @@ class Spatial(blenderbim.core.tool.Spatial): @classmethod def load_container_manager(cls): - cls.props = bpy.context.scene.BIMSpatialManagerProperties - previous_container_index = cls.props.active_container_index - cls.props.containers.clear() - cls.contracted_containers = json.loads(cls.props.contracted_containers) - cls.props.is_container_update_enabled = False + props = bpy.context.scene.BIMProjectTreeProperties + previous_container_index = props.active_container_index + props.containers.clear() + cls.contracted_containers = json.loads(props.contracted_containers) + props.is_container_update_enabled = False parent = tool.Ifc.get().by_type("IfcProject")[0] - for object in ifcopenshell.util.element.get_parts(parent) or []: - if object.is_a("IfcSpatialElement") or object.is_a("IfcSpatialStructureElement"): - cls.create_new_storey_li(object, 0) - cls.props.is_container_update_enabled = True + for subelement in ifcopenshell.util.element.get_parts(parent) or []: + if subelement.is_a("IfcSpatialElement") or subelement.is_a("IfcSpatialStructureElement"): + cls.import_spatial_structure(subelement, 0) + props.is_container_update_enabled = True # triggers spatial manager props setup - cls.props.active_container_index = min(previous_container_index, len(cls.props.containers) - 1) + props.active_container_index = min(previous_container_index, len(props.containers) - 1) @classmethod - def create_new_storey_li(cls, element, level_index): - si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) - new = cls.props.containers.add() + def import_spatial_structure(cls, element, level_index): + props = bpy.context.scene.BIMProjectTreeProperties + new = props.containers.add() + new.ifc_class = element.is_a() new.name = element.Name or "Unnamed" + new.description = element.Description or "" new.long_name = element.LongName or "" - new.has_decomposition = bool(element.IsDecomposedBy) - new.ifc_definition_id = element.id() - new.elevation = ifcopenshell.util.placement.get_storey_elevation(element) * si_conversion - + new.elevation = ifcopenshell.util.placement.get_storey_elevation(element) new.is_expanded = element.id() not in cls.contracted_containers new.level_index = level_index - if new.has_decomposition: - new.has_children = True - if new.is_expanded: - for related_object in ifcopenshell.util.element.get_parts(element) or []: - if related_object.is_a("IfcSpatialElement") or related_object.is_a("IfcSpatialStructureElement"): - cls.create_new_storey_li(related_object, level_index + 1) + children = ifcopenshell.util.element.get_parts(element) + new.has_children = bool(children) + new.ifc_definition_id = element.id() + if new.is_expanded: + for child in children or []: + cls.import_spatial_structure(child, level_index + 1) @classmethod def edit_container_attributes(cls, entity): + # TODO obj = tool.Ifc.get_object(entity) blenderbim.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj) - name = bpy.context.scene.BIMSpatialManagerProperties.container_name + name = bpy.context.scene.BIMProjectTreeProperties.container_name if name != entity.Name: cls.edit_container_name(entity, name) @@ -255,21 +255,21 @@ class Spatial(blenderbim.core.tool.Spatial): @classmethod def get_active_container(cls): - props = bpy.context.scene.BIMSpatialManagerProperties + props = bpy.context.scene.BIMProjectTreeProperties if props.active_container_index < len(props.containers): container = tool.Ifc.get().by_id(props.containers[props.active_container_index].ifc_definition_id) return container @classmethod def contract_container(cls, container): - props = bpy.context.scene.BIMSpatialManagerProperties + props = bpy.context.scene.BIMProjectTreeProperties contracted_containers = json.loads(props.contracted_containers) contracted_containers.append(container.id()) props.contracted_containers = json.dumps(contracted_containers) @classmethod def expand_container(cls, container): - props = bpy.context.scene.BIMSpatialManagerProperties + props = bpy.context.scene.BIMProjectTreeProperties contracted_containers = json.loads(props.contracted_containers) contracted_containers.remove(container.id()) props.contracted_containers = json.dumps(contracted_containers) From dc8ea3113800c3f631542448e0c8b10c457312a6 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 3 Jun 2024 21:25:24 +0500 Subject: [PATCH 399/429] Bump ladybug tools build in docs --- src/blenderbim/docs/users/other_addons.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/docs/users/other_addons.rst b/src/blenderbim/docs/users/other_addons.rst index e2b50e3cc4..8a6de7d7f1 100644 --- a/src/blenderbim/docs/users/other_addons.rst +++ b/src/blenderbim/docs/users/other_addons.rst @@ -36,7 +36,7 @@ Some of these add-ons are not shipped with Blender: import GIS data, grab elevation data from the web, and generate TINs from survey points and contours. - `Ladybug Tools for Blender - `__ - Ladybug Tools + `__ - Ladybug Tools is an extension of Sverchok for environmental analysis and building physics simulation. It allows analysis of solar, daylight, energy, and CFD. - `Topologic `__ - Perform spatial and topological From 05ec36a37d71d49f5bd462c9adca256318945809 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 5 Jun 2024 13:04:35 +1000 Subject: [PATCH 400/429] Spatial manager now shows aggregated objects inside selected space --- .../blenderbim/bim/module/spatial/__init__.py | 17 ++-- .../blenderbim/bim/module/spatial/operator.py | 20 ----- .../blenderbim/bim/module/spatial/prop.py | 18 +++- .../blenderbim/bim/module/spatial/ui.py | 82 +++++++++++++++---- src/blenderbim/blenderbim/core/tool.py | 2 +- src/blenderbim/blenderbim/tool/spatial.py | 34 ++++++++ 6 files changed, 127 insertions(+), 46 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py index f48afcfa3a..3aab40cbfc 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py @@ -22,23 +22,23 @@ from . import ui, prop, operator, workspace classes = ( operator.AssignContainer, operator.ChangeSpatialLevel, + operator.ContractContainer, operator.CopyToContainer, + operator.DeleteContainer, operator.DereferenceStructure, operator.DisableEditingContainer, + operator.EditContainerAttributes, operator.EnableEditingContainer, + operator.ExpandContainer, + operator.LoadContainerManager, operator.ReferenceStructure, operator.RemoveContainer, operator.SelectContainer, - operator.SelectSimilarContainer, - operator.SelectProduct, - operator.LoadContainerManager, - operator.EditContainerAttributes, - operator.AddBuildingStorey, - operator.ContractContainer, - operator.ExpandContainer, - operator.DeleteContainer, operator.SelectDecomposedElements, + operator.SelectProduct, + operator.SelectSimilarContainer, prop.SpatialElement, + prop.Element, prop.BIMSpatialProperties, prop.BIMObjectSpatialProperties, prop.BIMContainer, @@ -46,6 +46,7 @@ classes = ( ui.BIM_PT_spatial, ui.BIM_UL_containers, ui.BIM_UL_containers_manager, + ui.BIM_UL_elements, ui.BIM_PT_project_tree, workspace.Hotkey, ) diff --git a/src/blenderbim/blenderbim/bim/module/spatial/operator.py b/src/blenderbim/blenderbim/bim/module/spatial/operator.py index b9c3f00202..1441bbc18a 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/operator.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/operator.py @@ -227,26 +227,6 @@ class DeleteContainer(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): core.delete_container(tool.Ifc, tool.Spatial, tool.Geometry, container=tool.Ifc.get().by_id(self.container)) -class AddBuildingStorey(bpy.types.Operator, tool.Ifc.Operator): - bl_idname = "bim.add_building_storey" - bl_label = "Add Storey" - bl_options = {"REGISTER", "UNDO"} - part_class: bpy.props.StringProperty() - - def _execute(self, context): - active_container = tool.Spatial.get_active_container() - obj = tool.Ifc.get_object(active_container) - blenderbim.core.aggregate.add_part_to_object( - tool.Ifc, - tool.Aggregate, - tool.Collector, - tool.Blender, - obj=obj, - part_class=self.part_class, - part_name="Unnamed", - ) - core.load_container_manager(tool.Spatial) - class SelectDecomposedElements(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.select_decomposed_elements" diff --git a/src/blenderbim/blenderbim/bim/module/spatial/prop.py b/src/blenderbim/blenderbim/bim/module/spatial/prop.py index f6480ae31a..93eb0bfea2 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/prop.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/prop.py @@ -49,6 +49,10 @@ def update_name(self, context): tool.Spatial.edit_container_name(tool.Ifc.get().by_id(ifc_definition_id), self.name) +def update_active_container_index(self, context): + tool.Spatial.load_contained_elements() + + def update_relating_container_from_object(self, context): if self.relating_container_object is None or context.active_object is None: return @@ -105,13 +109,23 @@ class BIMContainer(PropertyGroup): ifc_definition_id: IntProperty(name="IFC Definition ID") +class Element(PropertyGroup): + name: StringProperty(name="Name") + is_class: BoolProperty(name="Is Class", default=False) + is_type: BoolProperty(name="Is Type", default=False) + total: IntProperty(name="Total") + + class BIMProjectTreeProperties(PropertyGroup): containers: CollectionProperty(name="Containers", type=BIMContainer) contracted_containers: StringProperty(name="Contracted containers", default="[]") expanded_containers: StringProperty(name="Expanded containers", default="[]") - active_container_index: IntProperty(name="Active Container Index") + active_container_index: IntProperty(name="Active Container Index", update=update_active_container_index) + elements: CollectionProperty(name="Elements", type=Element) + active_element_index: IntProperty(name="Active Element Index") + total_elements: IntProperty(name="Total Elements") @property def active_container(self): - if self.active_container_index < len(self.containers): + if self.containers and self.active_container_index < len(self.containers): return self.containers[self.active_container_index] diff --git a/src/blenderbim/blenderbim/bim/module/spatial/ui.py b/src/blenderbim/blenderbim/bim/module/spatial/ui.py index 32fbc6cee9..1a32843a7b 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/ui.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/ui.py @@ -102,23 +102,30 @@ class BIM_PT_project_tree(Panel): @classmethod def poll(cls, context): - return tool.Ifc.get() and tool.Ifc.schema().name() != "IFC2X3" + return tool.Ifc.get() def draw(self, context): if not ProjectTreeData.is_loaded: ProjectTreeData.load() self.props = context.scene.BIMProjectTreeProperties - row = self.layout.row() - row.operator("bim.load_container_manager", icon="FILE_REFRESH", text="Load Spatial Structure") + if self.props.active_container: - ifc_definition_id = self.props.containers[self.props.active_container_index].ifc_definition_id row = self.layout.row(align=True) - row.alignment = "RIGHT" - row.operator("bim.select_decomposed_elements", icon="RESTRICT_SELECT_OFF", text="") - spatial_data = ProjectTreeData.data["containers"].get(ifc_definition_id, None) - if spatial_data and spatial_data["type"] in ["IfcBuildingStorey", "IfcBuilding"]: - row.operator("bim.add_building_storey", icon="ADD", text="Add storey").part_class = "IfcBuildingStorey" - row.operator("bim.delete_container", icon="X", text="").container = ifc_definition_id + row.label( + text=f"Active {self.props.active_container.ifc_class}: {self.props.active_container.name}", + icon="OUTLINER_COLLECTION", + ) + row.operator("bim.select_decomposed_elements", icon="HIDE_OFF", text="") + row.operator("bim.delete_container", icon="X", text="").container = ( + self.props.active_container.ifc_definition_id + ) + row.operator("bim.load_container_manager", icon="FILE_REFRESH", text="") + + else: + row = self.layout.row(align=True) + row.label(text="Warning: No Active Container", icon="ERROR") + row.operator("bim.load_container_manager", icon="FILE_REFRESH", text="") + self.layout.template_list( "BIM_UL_containers_manager", "", @@ -126,6 +133,32 @@ class BIM_PT_project_tree(Panel): "containers", self.props, "active_container_index", + rows=10, + ) + + if not self.props.active_container: + return + + # spatial_data = ProjectTreeData.data["containers"].get(ifc_definition_id, None) + # if spatial_data and spatial_data["type"] in ["IfcBuildingStorey", "IfcBuilding"]: + # row.operator("bim.add_building_storey", icon="ADD", text="Add storey").part_class = "IfcBuildingStorey" + + if not self.props.total_elements: + row = self.layout.row() + row.label(text="No Contained Elements", icon="FILE_3D") + return + + row = self.layout.row(align=True) + row.label(text=f"{self.props.total_elements} Contained Elements", icon="FILE_3D") + row.operator("bim.select_decomposed_elements", icon="RESTRICT_SELECT_OFF", text="") + + self.layout.template_list( + "BIM_UL_elements", + "", + self.props, + "elements", + self.props, + "active_element_index", ) @@ -134,11 +167,11 @@ class BIM_UL_containers_manager(UIList): if item: row = layout.row(align=True) self.draw_hierarchy(row, item) - split1 = row.split(factor=0.7) - split1.prop(item, "name", emboss=False, text="") - split2 = row.split(factor=1) - split2.alignment = "RIGHT" - split2.prop(item, "elevation", emboss=False, text="") + row.prop(item, "name", emboss=False, text="") + row.prop(item, "long_name", emboss=False, text="") + col = row.column() + col.alignment = "RIGHT" + col.prop(item, "elevation", emboss=False, text="") def draw_hierarchy(self, row, item): for i in range(0, item.level_index): @@ -164,3 +197,22 @@ class BIM_UL_containers_manager(UIList): row.label(text="", icon="ANTIALIASED") else: row.label(text="", icon="META_PLANE") + + +class BIM_UL_elements(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + if item: + row = layout.row(align=True) + if item.is_class: + row.label(text="", icon="DISCLOSURE_TRI_DOWN") + row.label(text=item.name) + col = row.column() + col.alignment = "RIGHT" + col.label(text=str(item.total)) + elif item.is_type: + row.label(text="", icon="BLANK1") + row.label(text="", icon="DISCLOSURE_TRI_DOWN") + row.label(text=item.name) + col = row.column() + col.alignment = "RIGHT" + col.label(text=str(item.total)) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 31ddcb2eaa..f995b81e49 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -831,7 +831,7 @@ class Spatial: def can_reference(cls, structure, element): pass def contract_container(cls, container): pass def copy_xy(cls, src_obj, destination_obj): pass - def create_new_storey_li(cls, element, level_index): pass + def import_spatial_structure(cls, element, level_index): pass def deselect_objects(cls): pass def disable_editing(cls, obj): pass def duplicate_object_and_data(cls, obj): pass diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index 19ffce1230..23d1076d21 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -206,6 +206,40 @@ class Spatial(blenderbim.core.tool.Spatial): z = src_obj.location[2] src_obj.location = (destination_obj.location[0], destination_obj.location[1], z) + @classmethod + def load_contained_elements(cls): + props = bpy.context.scene.BIMProjectTreeProperties + props.elements.clear() + if not (container := props.active_container): + return + + container = tool.Ifc.get().by_id(container.ifc_definition_id) + + results = {} + for element in ifcopenshell.util.element.get_contained(container): + element_type = ifcopenshell.util.element.get_type(element) + ifc_class = element.is_a() + type_name = element_type.Name or "Unnamed" if element_type else "Untyped" + results.setdefault(ifc_class, {}).setdefault(type_name, 0) + results[ifc_class][type_name] += 1 + + total_elements = 0 + for ifc_class in sorted(results.keys()): + new = props.elements.add() + new.name = ifc_class + new.is_class = True + total = 0 + for type_name in sorted(results[ifc_class].keys()): + new2 = props.elements.add() + new2.name = type_name + new2.is_type = True + new2.total = results[ifc_class][type_name] + total += new2.total + new.total = total + total_elements += total + + props.total_elements = total_elements + @classmethod def load_container_manager(cls): props = bpy.context.scene.BIMProjectTreeProperties From 60ae4e80ceb8bfe470bc9155f49c016b215941e1 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 5 Jun 2024 13:04:50 +1000 Subject: [PATCH 401/429] New get_contained util.element function --- .../ifcopenshell/util/element.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index 33f5643efe..e6c1cf750e 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -1172,6 +1172,27 @@ def get_parts(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entity return [] +def get_contained(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]: + """ + Retrieves the contained elements of spatial element. + + :param element: The IFC element + :type element: ifcopenshell.entity_instance + :return: The parts of the element + :rtype: list[ifcopenshell.entity_instance] + + Example: + + .. code:: python + + element = file.by_type("IfcBuildingStorey")[0] + elements = ifcopenshell.util.element.get_contained(element) + """ + if (rel := getattr(element, "ContainsElements", None)) is not None and rel: + return rel[0].RelatedElements + return [] + + def get_components(element: ifcopenshell.entity_instance, include_ports=False) -> list[ifcopenshell.entity_instance]: """ Retrieves the components of an element that have an nest relationship. From d294be3433e9e102ac1612270916661c00be9b0b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 5 Jun 2024 14:53:31 +1000 Subject: [PATCH 402/429] Support adding a child space using the rules of spatial decomposition for each schema --- .../blenderbim/bim/module/aggregate/data.py | 7 -- .../bim/module/aggregate/operator.py | 6 +- .../blenderbim/bim/module/aggregate/ui.py | 13 ---- .../blenderbim/bim/module/spatial/data.py | 76 ++++++++++++++++--- .../blenderbim/bim/module/spatial/prop.py | 11 ++- .../blenderbim/bim/module/spatial/ui.py | 31 +++++--- src/blenderbim/blenderbim/tool/spatial.py | 12 +-- 7 files changed, 99 insertions(+), 57 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/data.py b/src/blenderbim/blenderbim/bim/module/aggregate/data.py index eb4f8a2504..8eef8b00bd 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/data.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/data.py @@ -36,7 +36,6 @@ class AggregateData: "relating_object_label": cls.get_relating_object_label(), "has_related_objects": cls.has_related_objects(), "total_parts": cls.total_parts(), - "ifc_class": cls.ifc_class(), "total_linked_aggregate": cls.total_linked_aggregate(), } cls.is_loaded = True @@ -68,12 +67,6 @@ class AggregateData: def has_related_objects(cls) -> bool: return bool(cls.get_related_objects()) - @classmethod - def ifc_class(cls) -> str: - element = tool.Ifc.get_entity(bpy.context.active_object) - if element: - return element.is_a() - @classmethod def total_linked_aggregate(cls): element = tool.Ifc.get_entity(bpy.context.active_object) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index f36462a9e7..a719cea549 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -275,23 +275,23 @@ class BIM_OT_add_part_to_object(bpy.types.Operator, Operator): bl_options = {"REGISTER", "UNDO"} part_class: bpy.props.StringProperty(name="Class", options={"HIDDEN"}) part_name: bpy.props.StringProperty(name="Name") - obj: bpy.props.StringProperty(options={"HIDDEN"}) + element: bpy.props.IntProperty(options={"HIDDEN"}) def invoke(self, context, event): self.part_name = "My " + self.part_class.lstrip("Ifc") return context.window_manager.invoke_props_dialog(self) def _execute(self, context): - obj = bpy.data.objects.get(self.obj) or context.active_object core.add_part_to_object( tool.Ifc, tool.Aggregate, tool.Collector, tool.Blender, - obj=obj, + obj=tool.Ifc.get_object(tool.Ifc.get().by_id(self.element)) if self.element else context.active_object, part_class=self.part_class, part_name=self.part_name, ) + tool.Spatial.load_container_manager() class BIM_OT_break_link_to_other_aggregates(bpy.types.Operator, Operator): diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py index 35a1e8161c..ff2292baad 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py @@ -99,19 +99,6 @@ class BIM_PT_aggregate(Panel): op = row.operator("bim.select_parts", icon="RESTRICT_SELECT_OFF", text="") op.obj = context.active_object.name - ifc_class = AggregateData.data["ifc_class"] - part_class = "" - if ifc_class == "IfcBuilding": - part_class = "IfcBuildingStorey" - elif ifc_class == "IfcSite": - part_class = "IfcBuilding" - elif ifc_class == "IfcProject": - part_class = "IfcSite" - if part_class != "": - op = layout.operator("bim.add_part_to_object", text="Add " + part_class.lstrip("Ifc")) - op.part_class = part_class - op.obj = context.active_object.name - class BIM_PT_linked_aggregate(Panel): bl_label = "Linked Aggregates" diff --git a/src/blenderbim/blenderbim/bim/module/spatial/data.py b/src/blenderbim/blenderbim/bim/module/spatial/data.py index 6aa9d8f945..b31545860d 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/data.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/data.py @@ -92,19 +92,71 @@ class ProjectTreeData: def load(cls): cls.is_loaded = True cls.data = { - "containers": cls.containers(), + "subelement_class": cls.subelement_class(), } @classmethod - def containers(cls): - results = {} + def subelement_class(cls): + results = [] + props = bpy.context.scene.BIMProjectTreeProperties + if not (container := props.active_container): + return results + container_class = tool.Ifc.get().by_id(container.ifc_definition_id).is_a() if tool.Ifc.get_schema() == "IFC2X3": - spatial_elements = tool.Ifc.get().by_type("IfcSpatialStructureElement") - else: - spatial_elements = tool.Ifc.get().by_type("IfcSpatialElement") - for container in spatial_elements: - results[container.id()] = { - "type": container.is_a(), - "id": container.id(), - } - return results + results = { + "IfcBuilding": ["IfcBuilding", "IfcBuildingStorey", "IfcSpace"], + "IfcBuildingStorey": ["IfcBuildingStorey", "IfcSpace"], + "IfcProject": ["IfcBuilding", "IfcSite", "IfcSpace"], + "IfcSite": ["IfcBuilding", "IfcSite", "IfcSpace"], + "IfcSpace": ["IfcSpace"], + }[container_class] + elif tool.Ifc.get_schema() == "IFC4": + results = { + "IfcBuilding": ["IfcBuilding", "IfcBuildingStorey", "IfcSpace"], + "IfcBuildingStorey": ["IfcBuildingStorey", "IfcSpace"], + "IfcExternalSpatialElement": ["IfcExternalSpatialElement"], + "IfcProject": ["IfcBuilding", "IfcExternalSpatialElement", "IfcSite", "IfcSpace"], + "IfcSite": ["IfcBuilding", "IfcExternalSpatialElement", "IfcSite", "IfcSpace"], + "IfcSpace": ["IfcSpace"], + }[container_class] + elif tool.Ifc.get_schema() == "IFC4X3": + results = { + "IfcBridge": ["IfcBridge", "IfcBridgePart", "IfcSpace"], + "IfcBridgePart": ["IfcSpace"], + "IfcBuilding": ["IfcBuilding", "IfcBuildingStorey", "IfcSpace"], + "IfcBuildingStorey": ["IfcBuildingStorey", "IfcSpace"], + "IfcExternalSpatialElement": ["IfcExternalSpatialElement"], + "IfcFacility": ["IfcFacility", "IfcFacilityPartCommon", "IfcSpace"], + "IfcFacilityPartCommon": ["IfcSpace"], + "IfcMarineFacility": ["IfcMarineFacility", "IfcMarinePart", "IfcSpace"], + "IfcMarinePart": ["IfcSpace"], + "IfcProject": [ + "IfcBridge", + "IfcBuilding", + "IfcExternalSpatialElement", + "IfcFacility", + "IfcMarineFacility", + "IfcRailway", + "IfcRoad", + "IfcSite", + "IfcSpace", + ], + "IfcRailway": ["IfcRailway", "IfcRailwayPart", "IfcSpace"], + "IfcRailwayPart": ["IfcSpace"], + "IfcRoad": ["IfcRoad", "IfcRoadPart", "IfcSpace"], + "IfcRoadPart": ["IfcSpace"], + "IfcSite": [ + "IfcBridge", + "IfcBuilding", + "IfcExternalSpatialElement", + "IfcFacility", + "IfcMarineFacility", + "IfcRailway", + "IfcRoad", + "IfcSite", + "IfcSpace", + ], + "IfcSpace": ["IfcSpace"], + }[container_class] + + return [(r, r, "") for r in results] diff --git a/src/blenderbim/blenderbim/bim/module/spatial/prop.py b/src/blenderbim/blenderbim/bim/module/spatial/prop.py index 93eb0bfea2..b4586b01a0 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/prop.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/prop.py @@ -18,7 +18,7 @@ import bpy from blenderbim.bim.prop import StrProperty, Attribute -from blenderbim.bim.module.spatial.data import SpatialData +from blenderbim.bim.module.spatial.data import ProjectTreeData from bpy.types import PropertyGroup from bpy.props import ( PointerProperty, @@ -31,10 +31,15 @@ from bpy.props import ( CollectionProperty, ) import blenderbim.tool as tool -import blenderbim.core.geometry import ifcopenshell +def get_subelement_class(self, context): + if not ProjectTreeData.is_loaded: + ProjectTreeData.load() + return ProjectTreeData.data["subelement_class"] + + def update_elevation(self, context): if ifc_definition_id := self.ifc_definition_id: entity = tool.Ifc.get().by_id(ifc_definition_id) @@ -50,6 +55,7 @@ def update_name(self, context): def update_active_container_index(self, context): + ProjectTreeData.data["subelement_class"] = ProjectTreeData.subelement_class() tool.Spatial.load_contained_elements() @@ -124,6 +130,7 @@ class BIMProjectTreeProperties(PropertyGroup): elements: CollectionProperty(name="Elements", type=Element) active_element_index: IntProperty(name="Active Element Index") total_elements: IntProperty(name="Total Elements") + subelement_class: bpy.props.EnumProperty(items=get_subelement_class, name="Subelement Class") @property def active_container(self): diff --git a/src/blenderbim/blenderbim/bim/module/spatial/ui.py b/src/blenderbim/blenderbim/bim/module/spatial/ui.py index 1a32843a7b..9593cbeea1 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/ui.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/ui.py @@ -112,15 +112,23 @@ class BIM_PT_project_tree(Panel): if self.props.active_container: row = self.layout.row(align=True) row.label( - text=f"Active {self.props.active_container.ifc_class}: {self.props.active_container.name}", + text=f"Active: {self.props.active_container.name}", icon="OUTLINER_COLLECTION", ) - row.operator("bim.select_decomposed_elements", icon="HIDE_OFF", text="") - row.operator("bim.delete_container", icon="X", text="").container = ( - self.props.active_container.ifc_definition_id - ) row.operator("bim.load_container_manager", icon="FILE_REFRESH", text="") + if self.props.active_container.ifc_class != "IfcProject": + row = self.layout.row(align=True) + row.operator("bim.select_decomposed_elements", icon="HIDE_OFF", text=f"Isolate {self.props.active_container.ifc_class}") + row.operator("bim.delete_container", icon="X", text="").container = ( + self.props.active_container.ifc_definition_id + ) + + row = self.layout.row(align=True) + row.prop(self.props, "subelement_class", text="") + op = row.operator("bim.add_part_to_object", icon="ADD", text="") + op.element = self.props.active_container.ifc_definition_id + op.part_class = self.props.subelement_class else: row = self.layout.row(align=True) row.label(text="Warning: No Active Container", icon="ERROR") @@ -139,10 +147,6 @@ class BIM_PT_project_tree(Panel): if not self.props.active_container: return - # spatial_data = ProjectTreeData.data["containers"].get(ifc_definition_id, None) - # if spatial_data and spatial_data["type"] in ["IfcBuildingStorey", "IfcBuilding"]: - # row.operator("bim.add_building_storey", icon="ADD", text="Add storey").part_class = "IfcBuildingStorey" - if not self.props.total_elements: row = self.layout.row() row.label(text="No Contained Elements", icon="FILE_3D") @@ -168,7 +172,8 @@ class BIM_UL_containers_manager(UIList): row = layout.row(align=True) self.draw_hierarchy(row, item) row.prop(item, "name", emboss=False, text="") - row.prop(item, "long_name", emboss=False, text="") + if item.long_name: + row.prop(item, "long_name", emboss=False, text="") col = row.column() col.alignment = "RIGHT" col.prop(item, "elevation", emboss=False, text="") @@ -187,7 +192,9 @@ class BIM_UL_containers_manager(UIList): ) else: row.label(text="", icon="BLANK1") - if item.ifc_class == "IfcSite": + if item.ifc_class == "IfcProject": + row.label(text="", icon="FILE") + elif item.ifc_class == "IfcSite": row.label(text="", icon="WORLD") elif item.ifc_class == "IfcBuilding": row.label(text="", icon="HOME") @@ -195,6 +202,8 @@ class BIM_UL_containers_manager(UIList): row.label(text="", icon="LINENUMBERS_OFF") elif item.ifc_class == "IfcSpace": row.label(text="", icon="ANTIALIASED") + elif "Part" in item.ifc_class: + row.label(text="", icon="MOD_FLUID") else: row.label(text="", icon="META_PLANE") diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index 23d1076d21..a0fc21364d 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -246,14 +246,7 @@ class Spatial(blenderbim.core.tool.Spatial): previous_container_index = props.active_container_index props.containers.clear() cls.contracted_containers = json.loads(props.contracted_containers) - props.is_container_update_enabled = False - parent = tool.Ifc.get().by_type("IfcProject")[0] - - for subelement in ifcopenshell.util.element.get_parts(parent) or []: - if subelement.is_a("IfcSpatialElement") or subelement.is_a("IfcSpatialStructureElement"): - cls.import_spatial_structure(subelement, 0) - props.is_container_update_enabled = True - # triggers spatial manager props setup + cls.import_spatial_structure(tool.Ifc.get().by_type("IfcProject")[0], 0) props.active_container_index = min(previous_container_index, len(props.containers) - 1) @classmethod @@ -264,7 +257,8 @@ class Spatial(blenderbim.core.tool.Spatial): new.name = element.Name or "Unnamed" new.description = element.Description or "" new.long_name = element.LongName or "" - new.elevation = ifcopenshell.util.placement.get_storey_elevation(element) + if not element.is_a("IfcProject"): + new.elevation = ifcopenshell.util.placement.get_storey_elevation(element) new.is_expanded = element.id() not in cls.contracted_containers new.level_index = level_index children = ifcopenshell.util.element.get_parts(element) From 9699eb38c54e8c36027280c6a6d123d705947b25 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 5 Jun 2024 15:00:28 +1000 Subject: [PATCH 403/429] Only show Blender tab icon in dropdown, separated. This helps for smaller screens and makes it less overwhelming for users. --- src/blenderbim/blenderbim/bim/prop.py | 1 + src/blenderbim/blenderbim/bim/ui.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index 4be21a8ad7..386db3b82c 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -328,6 +328,7 @@ def get_tab(self, context): ("SCHEDULING", "Costing and Scheduling", "", "NLA", 6), ("FM", "Facility Management", "", "PACKAGE", 7), ("QUALITY", "Quality and Coordination", "", "COMMUNITY", 8), + None, ("BLENDER", "Blender Properties", "", "BLENDER", 9), ] diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index eb6a0709d2..9c58d3db70 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -376,7 +376,6 @@ class BIM_PT_tabs(Panel): self.draw_tab_entry(row, "NLA", "SCHEDULING", is_ifc_project, aprops.tab == "SCHEDULING") self.draw_tab_entry(row, "PACKAGE", "FM", True, aprops.tab == "FM") self.draw_tab_entry(row, "COMMUNITY", "QUALITY", True, aprops.tab == "QUALITY") - self.draw_tab_entry(row, "BLENDER", "BLENDER", True, aprops.tab == "BLENDER") row.operator("bim.switch_tab", text="", emboss=False, icon="UV_SYNC_SELECT") # Yes, that's right. From 18b68353b19f72238ed911fb4982b62bb43b7fe6 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 5 Jun 2024 15:09:23 +1000 Subject: [PATCH 404/429] Minor UI polish: center tabbar, remove Blender tabs as no longer necessary for native IFC --- .../blenderbim/bim/data/workspace.blend | Bin 873296 -> 923124 bytes src/blenderbim/blenderbim/bim/ui.py | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/data/workspace.blend b/src/blenderbim/blenderbim/bim/data/workspace.blend index 1327250c4225a61853eec134ae6a8e7526269c59..2907485149fbde728559201ac6b1deb8754ba500 100644 GIT binary patch literal 923124 zcmeEv31A&nx&Ndo^va?jAZg1|_ON$vx@Av$Te{JfHmqry+%|!p!BeP^39b7!g-)Gey5TYB=Q$>S$1m0;X)oad@8yyqX6N0x=c9O_`o+i^2*{P^)cUNg^@Gt0O0Y&kO@VaClcWDuub^1z?)-9Vpc zOK5j&Ujt1mD=S@`6%`fUS$oCb zWu^t?Q77|AnNE2#&MXlH}ve~d9E7GkQIKg+GEDNkcW zI_;UwPT+&@smqi#)0iIQd-9oev-!g6!SYR6>H{_9z+>{6VOz#7pZSy-O#fqk;XE;r z6k`eNPducxacKj!stwrKO&gLQ6zMfJHLjV)Fv>B@GUH+TAZv~z)J1CQLmGA3>Et(g zg31g^qt2i_>I0oRb?SikeT*gO|L_y~>R_C}7ly57?rgU<9y}M=GKk}(y-b@k%sf!0 zk=pu@9>vdmQd?)3KGu`vn$*<6vY8*G4|&u#nEijS#(%Uc;xn-`4cMydX1g`<*=auJ zfzl>+AGK{q8KhH&X(nYIY`!oV@Y!<>^-&k%2=hcdN}tI`T|qM7gC0=i52pVIYy3yM zLfv_q*i9Q@El@jeR+`V`$9PX0Fdfv?#W?d#-An^Tx@l88&yL$=nEBKf#1mEDsJc;? zEsywM`hPIT{~((M^{L9La<@*d4aiSl(auaaDeRJ~Kcje|6Zz(8mJ{SN>NEMwF!B+n zPUeN_vd1{`Q^#QXA8S7J)qy_IuBK0)?oOXM!<{*Erb{fgP10B^E8N-zv)t;M9mnx7 zyM^g8(-BUWp~nF;jxcz_d|>M`^##=n`l58PZ0ZFK(*s`Q4d(i9u>6nqgf-^G=~LXP z<Qj8i_$56rjA2#T{zQ$NGx2Q|xLI{846 z1{;Ls4W|DwPGbxhj1%MkrcYh!o-%Q~J8PDV>y|Bu8ROnY659KJ!I+F(J8O-^AFvtH16DD|Tz>`io$@4$40V{pa zG*H_H9-r(JhFu@Rmf$gMYU`lhpfQGdq|^h-F!FFB9#m(_lE;({stfY%I-5FdJ>VbA z{y&)G|Fp6)chT}C?x~X}r2TK&5ng5D zN`5nsa@1kQO+JK?7gQI@kcYa0%0n7YTW&D@KiK2{X{Vj$U0Y)PZ`+!7Gwm5<17*Jo zw@$7PE9E+ob~Np3>Og)_Uk#H(x+zb+VLHeQIn7+~t57R)+@(|`}^O1Kj$N$0f zKgR!g=PdW`GXM*1W!i!mX#?ijaV1}=+JJQrnY<=d{C>MLEy&JHGj%Y`I+5D#80p|; zKElLGz04!8$-_L8mt`YuF#G>tj{jKyb@W{Ap0;p7di)1g6DRF~G}DH5x|vryZ}txN zkRfmDHOrzssn^uUw0!!zEe{=(H}mW;;!$;FKIK3M)Bl6L{+m2=x_iQjC;0qNdk0}9 zZt##V$geeW54pNdT^mpalwngIeqo%HIw@mP@{rQ6jDwoxAPjwGn#s#NGoR&C7xIGY ziS!v$2JimwVD0~*T}`hncb9Hl>sBn8=k5QP_z{K;OgqqK$m40JnQ`1du90g*rh!t< zq)4~RL4K59kq;T_G0R{%%s2B`4&@MMn$5>Dm~QgbRaCn3Dg$t;{%VVe%l4vSwb;J!IsYwxnLlndRAhEF-9F)`9Xi5Aw}2 zSgy%OS@Mwwv_@>Qpt8!HUta0fitm{>nCrj69RJ75zHif~KIV>>eLQpjhc+NSP^8)Y z(dI)u$Zp;}KCGp8pxF@gLU}6Q)gem$t5QPcEC}mY0|BfQ@#u?TB=w@$~FurI|bkS5?dX!-zcs z@`ExA{hn-qZ^=hWUe<~6Aiq*Sb(=aUKTrIPzCN#9wE?En|C9k8%>F-E{>Qk2b!*+c zxI1a)v~>Rm9%2OrUSejtiQNv92NbsV$;#dUo+B{#2q5p{F??>;h2=mm!;mw1kjFGr zrx^x6;$|9k&ei>VzWBUK!nSV2gWA(z`hPITf7qa@smYyIH8VZ`(-z1x@gr=!iOUjVJ3siga5C z@&O;E8Yu-bSlA{dmPRcqV zjyf^U@=Q7ECr_1N#JU~l9PvBT!H2LZYnR9Vk96`6X8#||{lD?D?mzLIdG3i7nem_a zOq&oZ@zOp)JZ2jCNNroz#^t`jTxD;{k;jxlnE9ZrBh$%?JcOZxdMJlqB{#z|>3s znrYMxdFp09DD^Up{Bw;ty*gxkH|xkSD9-QS* ze^A}XOUg14H`ADo@_3s0NE=N559atkL7x3v)N_$L`OJB~^`C76;-)Q-k2J*1G&9|n zVV|*O$cJYNYvtKO>RYjLrQ6Zj>0WWwRqo=23%&7)`XOV6A%i&`<2&Z`I%7^Z`4Gkl zex6J-(}|6BGxH!vEX*Iw{eSx3{LOJbVanq=!agTR|1VomEW+Ro%**vzky=g^ujILE!D`%?GHtFQLXE3UlKU9xzwTOrRURp>nmvy9WE zkHhD2?Q`lSwd-vA4{_FkGW4&BlX;-zM?T_%>3@#@_`NuOZ;WTQ@w>37-}-|WzePUm zu)}=6Gsj*6Pqd5i6DPQJSGCIi-^}#MPT2VCm_nyXEqn`s^7q+;VBB^Tg)xIj+;OKWCSf&3~wijnCG>`hwbd)K5L| zKjwfLQa|E}$K!6D%v(6Y2MT<1=FIV~wZNP0#QePWwuwa1~2ZbK+W;=0zhWmf)@7Qa=UMwWToU@JJs$}yybyI&>Jy|c-6O_Ev0cxHooBXE#;p^qgm%B@rEXnHMeEe_rX@n0s z<6e2y)$W|y+VuEOJ=AUMWBpkV9niq zUxe*++s@=C?;KpOiQnhTS`PPHYNd}~v}H@$=cfM=zV`ah%C*3f9r`HraV#?HK>x73 zARNdepH0m?>Lm}$L)`Q~`9Pz5n@gVQf3EfLPAHD=3^UKB;0qi7F|JIUI@v8hYoR;7 zQvLqV#7mq=V>^z2S2=rrQC=f=e#F%x!8; zxC@ufN&AcSpv@U)-A#%-@ZrqH2RZPW@^;wN!7&*=#r%)Hj&UFtA4l<+<3Hcmg}#sR zAM3)fe$RCD|H$=!*%bGN+i!Numd)K^{3l)$C)xqdpggA0zCJmxk7NJ6%AG4=@CNaj zGN+%u)V*l)7PnzlqqnBclq>h_@GOZuV+=iz!3lkgvo5AS@|k6ue3UnJu#P658D_tr zPvA?8VetLwa?Ofsz(sORQ|MX{{^#{S*7}&oF`wi5AHJoZ!zg6%4l!Qyo77wXPoL^u zd3%prwmj~Q|E7&hoMt*~Vz&dE7jf{-7hmH#9nVr!!B=u3&(>$gsVj_+`Cc24Jwuz1 zaq>Yo>SCuepXuOZni)3J?0T|In&Us-iGgcCv;&;D?nhcwKM%`;|1nR)S6J`EmuL@Y z0|?vWy&cE?5BfjkgHEg;Ce0~#PdMpBZ~brLwy~OaV3_T|l*63Peb{Q<4oqDpFVk)R zFrDStGEB#F=D2sjco1K%x@=j>kp`7v`XAThy!OMoj_bQZ`#!E8O#icwW3Iuz5GYQJ zJ@7O0O*(GexKRINEW!Ry!xioBl;H(dTdHvrrcomf6o87j>G*Qj0xzs z+4?@m0>}l;{YaZ2&wosn-{_35P|ttSCdA12T=aGEGfuAKY##EO6k*%ul%rkEIAu-S zn&E7`c*eNyG(5+g8H*@S-KdXQwjB;DgM8G-IP{t8KkWHq|0irsmruI6{)fM@<_E=T zul2&>@V~k4XBh1Y*O8d7(55)|(oS{sx%BfI&+odw>;7cg!L}K7FddZbfN7Lx95g7+ zOsCDwH0mXV@9}(TrBLcKX;_##!}85^lb8O74PnoLIx*H`ea`Wp{TceP{=*yqo@{eK ze(n0_Xu z4wE8`>qEY)jJio}Uc}8b@R_`JKI4?ZoDBbCzQ?(G^=fzR+O=*=ON+Z^%^Htl9~gNU z8_0+K;MUewH<3tq{O6y4zI%q;13^Ca4RD>0{))az|D#PH9c9|SM;!efYeb9{*dIh3 z^7e^#HD#)-B`RmRlTSI-oin>a_GV<<6u;B9rVVHlrZG+%Fm6*jpK+97mP0w_Gag0B zOX}y9HX!e&sg`vC@=;b0pP9z6NfD+j!pvhDDEcAhWKi=&UqwH~+7MypVZOkLboepo z#MmF?fA|)DrSEYqz_!73YSfy&+!X+x?UNx5t098T0xd?F!}N8UgJ9<309=K+z7O#{bDOW?g#e zrRlW_@z^*Sr#(oSZp$$pG%U~5fv_1j$_#Sz9_fpV_`2_u+`@bj$_YpB?U=G3kzp#^S3;N-I zuK7%g_J+9x>rq@+nAiWbQxt`bct-IBeJEoAc%c{R zW?7~V%4DN+=g#$f66Al5`^e*34gD5zuHO(wzYRL!dvp9p7~==pLp~?`Z;vgAd)I&B z|BV|rdgBNEPdfxr`h$6l(~fpLh>vMeG{`sfMVK6A?0mCsSP$}jb>O4Ue5lEbFvfWJ z#qR%zqkUjc7-K&ABK(beLrCY`fN=r7uut}Xd;CXRLi<6PxaQ;BA4Id>{}caXtiW7@ zamltF!zM*5!oQTx9b|FL#JJ<$JYKVqc)Xd9#> zOg@t$kNl=Qd6;HWliw@@Ja(LVY-;Lb*p_8_hN?DDC2av|K`;;f@tF7wf6!umh@ z!D4xC5q;h6|B%6n`P-b6%`kinUvsQB{fWJQJP&|0bNx>qlVbe0#}>xnd(;toKtbcb ziP;X*2DwsG-j=cL4qo!ua*Q)SUuu?x-yfQL1k`O(Q@<&TbX=ovk>{0y*8dn2aB>}h z@f`gPY3y^k^ncs`kj2=~6YYfl#C3s9W!eVG5T=0JTgMxi|fjsLU*urf?)+9jVb z<)dgeeUN3H$jdawZEEIc%9g!Nxh|-#&8#6QXZt!R9dkPT5H$WH4>DNi<3u|EAHwMO z?1N#H*MA)UF`l%yx2N|Pqn`hu|1ma1jsGYE>k(jp|7jOu4Whwz%FqU|VGWr_D?|0&6ZOWX$!Stt&`}S&q%m zJjyX{Qp$kG4BIk{htZlkJWCKf-?O~5tl+Gynd`0TF>eO>AM1MT)xeKj2g2Uq#k?ML z&2Of0{f9LHe2;xU$|4@*cc!6@V13AO0Q~lec7=XlF=M8pdb~f^S&SYGklBofD`LLq=Ayhq-X=?x{_hE zhYA^s&_-uux&9+|+h&N{d5i~9@Y_B$bq2{GEf*fjn!F4%FBe)}BhMwv@8QTx9i$6Z zPInj7Pj}McKDOyI(&~c0iOp&8z3JkcscfCuEKRE_K(r77BpY&wqErucg00_xYcp> zyb|`9asRThvC;eO3fhEe1JhPv;UIo9Ei4?QFN_!IHa~gobi_@5@YE^j~4(+hv2ui&09%i{VE*8xbwwH9oi>j~dOhW^Kxj`bY-IqvP? zL>k9?`rM@SKkA6J2-+#G`B9HW%~!egAHBytebZfT_1q=i?~!mn8uzMkFB*7o;(j!3 zKzz3C?0m+_$GAzE7e!6}ps*>6d^2u`v&q~1RcHfqWKAe-0C|)zUvRctw(??$t2E60 zQ)bFIFiZ7+uJ?A9V$6V_ur7q(v93d3hfg^UfFccTfPTmNA8i9^9RJ(e+Pv`{zF)O! zm3K{0UM*|bn)&jqjC{vY@Nvxp%IjBRwr#_7P}4Sylb><&lh@2=9x3xoYU?4dO({cu z#%;=cQ{Lub9M=ZiBfuDnx!F9?uP(Uwv+l;L-4DH3TVY%P<$Xegv4;cQm>=%G z`)+T(xJur0g8q)*jj-Lo|5*QFKE<^I=44#I!KYXQ@&pgs2gd=EqOEYvXHv*4SaYqL z_}IU>U;gr!-OZafyO&*dnY(GzCU?Vz4c?lC_(5~A6Zy$YIgvF*m{g(`Qw?WpZ-;iMEOMi?UD;v}>G* zBb{yA3{!@A*ymyxc~K|JWjQPheGGkMc2(T1U38uoMjp~IF5!e;)GJIsbVCO7Ud^Hg zcSgBdr`Ih!OP+a}=jpdxnBn#qdc#C`Mu;sd1ekaWc7!)=@U4!lgqD`>>11I<(kGTMC0Xlg9 z3Vj~BxL?I4?K$Q78CNChU!|4R|33ofu!| zE^l!!`P{cXeP|QN2Or7?4#c59s4Vz`^*Zn4-*78WJJ;iHyZmczee*_d?8UPbIPsj` zCqMT!_p@KR$K5F7AD+kKn2WVAcu+^w7xqCOY=F9;UBE}Mm)S1auM6=#WY8v|4{Ln* z34I;@=Jh`2ckc0^ZNUGa=+{^eAdbGzwE^-_U$jfeVcbC7p%Xkf(T-tH)E(ubOpGn4 z5BQ)P?FoEH!@30N;Db)2K_~Jd&wTJO4YmRw%3wLr3t#eNy23osJNU*gINFgPxU;UN;AVIpQMXT{c>i$3ZpEvS=1SrP$%>=)Q2bRj(qe7*aP)KzX3kf z6Js}I5r?TcGqW+8gwsPoON=73~0e(2rpcjQOw!!YB`M_!#;ThA#LP`H+R3 zaH1UnGtv+Sr45jeIx!FFlmV};1H4Ex<;ll1>NokA2A;4m>jnxwT=#&N^+6iK<~rD% z2L~z)8)6J#n?-wozfm?%*cx`mxPfsCe!}>G@tbn+FJuv?94LHv_St89?HqdNE?8W> zWTfLfS9Re%|G3m~zUDYik(}ekO`LSFGqGr23FCh)zeOMYzRuRWSPV$5>H)5m_! z2!#LbS4C?;Cy#HOl9)DWdSc?V@rVx}!xk8}!28z%D;GM>wmoG0c>LX7j2o+q)i{%@ zMOH3c*}8sV8B_F)Q9RFiK{e!O_#p2)n zCKcs~KBp=VGYwl{ceOypGfyu_pBWI{6`624gfuyk*A1E3Jeg*XL21dI3Ix_At#P)5 z_WH?DvmEE*TC@Dxs^wLiC4u8$Q^>g9{lnM2@$HuS1O4NMUQe>16|ISj7Bp^2bTFYn z+V_p;R$_eW)wKR@6))Aa?{*bWw*A!`XH)AH9vZx57xB&BxA}=c;;j@?| z;pCi;c(~qv_8-1+T*)}j+cPd)jrx%GJ-gZ)S7Q(E>&c~#eDHd&z7ME4-U!O8BQY=>$89DM%E^hfJBY&7rj(n6W(Q?#Bxl2d+<;X|5e(iVa%gFibNj}Ow zpyjBKa-_5i`6!pva@0qD$2rIgQjUC-V>_ij%3V6jFGoJgk&pTqzjTxep}bNFmg;)l zqy6{xU8*0DpLV66nNE4~Q$D5Tsh9Sp9$TLLl<(2<)Jr>4k1bDr%D42Y`cp6E!|G3d z%9m+*>ZRTLwVmwp$xr#1mZx6YpL%S0@>8DU5cSfp)MLw&pYqJ7Udjj6{{dm>f4N%XVGIshqjl8{b;K^&4+p*sI4|(p1Xv z_7CDuD{AVE3Uf?Cd)!ADssDbBXN-e?>HyEZBEYg9(mcuk3@CHl^|eZ>ugat2{=*;F zI>ShxT-)IA%D#6=os?STkm|V{`6HZS3^*hAa(=qUSnqTk*emRSUfS5^fd(E}X~Q;? zMvZX})QPcoKkE6Qr0q3tjw7W^p|tI5-#^e8?{From=%G6vG|JmQX{RM-(Sg#JapGXxXBl?e_n7#nvRt?I-YS*Ew$C^jgQ;l?)#iJu z(ln&)AEYf7H5d8xT1C^|Nan83q)|jKW7s=-E_(HkY7EoVQj>SI_ilAPlln&Rb&ahs z`2*Dk?DTB$mLoG`7}|ci?c~_@rAd0n%4LpICQTxFyt*D+m!rHEcUCT|THm^^v8%Ox zy(9kz^tfy%w8eiu?cqUE^{qzb* z;y+)vpJcn=4y!k|wsp0xKczF#mT2l~Slzxk%rYVAJ1Z}v_--z{R zeOZ6{k+|Lq^@nA8pTEbq-^Kc~zN|m3NL=rQ`hQR=)qmZizWXYue^S!vmk&soZHpK{ zF?Oz8*wEG9-qyLLvn#Q#p(C-TVM9mzhD1kKYofCuvA%O-N1~y%8EKuSXka*boN5Q8 zWU|X<{m2(pzW^IIH>~Yw-?)L=bEl<8srr#pGOT{&i>lv>d37r%)ix|%-eB~?0_(^6 zWTUhn+ig_+2GYOrAE0kEisQL}0f0LhA z;|OUs`;jlIego;>)Qzfsq}l36zNq@`3jcC_7dxrY^?gnIx()4}tupzqbq02g_X!%c z0NSh9_oV%|seO0S0#rINLkQzc)cT&~hOY1W26lZew=FQG0VD`^0S6FkA47Yzz_kEnoPgw~iuxK>MFGLNqiBeV0cz|Fhgs|Nr;E`k%P6 z`JeT&{hvIgQ2#F!x3{755BPEAPH2oBv)x;Vk|wqPN%K)nTaiLGoBvsEnE#V653K)* zE1UmWFJfW;Pn}w*|Cc7#HzzvK00#OJ|EhePWbyXz|ElMI(t7QGQj0yOsJ=Dr@n-Ws z%MJ5??A3wwKXGOAKkH@tKQ^II|1WFmXx-q={sX*-=NSVIZpYX^zE;!^&e?IdU;2T z6tda;&vHZk|JuO%pSZI5pY^i+pPW>%|63ZH2Y&4j8-Egi3OrJWEB~jd_J2y#Le$D_ z@$`|+|13Am|H}=Kk*F2);tHJ}pB1uLnP$oK0Vu_V)unQ@`_Qc}UIwz4t4c>`?cw zlAHbav4ZrP_jQBvgVMM!&iY5~`z>8m)zI11u~F`u<$8M~s7Nm@uI)uiM%$;XANj)S zhjh7vTh)lldma6SB1 z9Ja@>J^U8%$A;U-us!@1@W+PR$FM#87VyW0+sCjy{1))Xc2)bpx^UU%wpr zC>Pgq)JM6od!wF3>EC0Lk8&kij`}ikC@&*NKFalfRoR95GIA?qnW^Y@sW>mJz9?XGIBNEb~)w9M>$@XQy=Bt zEcV-ze3T;}^)dctai)EiN+PfK`Mbk1ef>{9O= zLEVqF9=1Q$gY}|3`6=J4<*AqQtcNX6e#&pw^3>a}+gDiq$xr#XmZx6IhuM$(lrPcp z)Ju8du9M?%Tq7q ziNm%Z`6=I`<*AqbKMX(lDPN}Lsh9Hfqg_7vDIe4F)XQ-xto@On@_l;Wk$Nc~*8a#( zdG1?MFXf5Du0Q!H&wT2o--6no_q%JoKg!>_B{%x_Nhx2V`(M9qPxg3l$lh41sJ**0 zWQN6WgO`t}9*H?@$6v?De&6-#_t&JUXZ7!{UkLaOG(kmBv}f-()mjgK$Ci9PNMBox zQuSPwq6gLb;}Hc()-rvA*xSeKzEX6_Z>mXm_#N9m@|)`ABgS}Vuq{v;?Key82K(6u zG-M9`k}Z=mR6_J4{YF2=b-Q3YQF!~s?!Vif!7g#<%EvSD=+GfL`?vsmOIC%PmEH0% zP?0mL_`}kq_jC?*N=M?1_G6j!1?*wZ4A85jb-~UD&UdBLFq^OjeaCL`qztZ z+qc%)_Mwd55Z8WOBm>Aw3?gzIs&CAV(((OOvNKip$0$EuuKegIKTaD_Iud8NAEz7R zS&$!XuX)#gLGxy^Ox?dHjr~Z?Z>b*#&2uaz zoU)%%5Bq7LzV2&fuEQ|^^QJRRbjiG#ruI85@|!o06WhUl_VIq3H|aO}k@lc}RlG%P z|KE=>Pu`Lv4n>3msE99-|<-YgErpH)%oukzy;WxU0^NE~M$nKze@ zc+NY+$6K=>92@Az=d5yuW)%I=`yIaS=WpgX-io1jt0T_$gLWpyEo;J)rG-_0mGdDH zOg9*b$Uu6~+@;h8dt!yf@-EQ!L|ewWMArj+*BkNkg%A1IBf`P=OCPJEPV(r?d!~zp zH};z+)4zws@+5ZC_xe^qBUWC=|7_4s3+zh&NrNYVi)Q8hx3xYPV3XxZDH4u zDESR(JU2+87(ekA!8eP)DJez4*KIeyqJD3oX|hkvJIP<}-26j59Jk^>3(|M0j8i!D z{Il(&{SF$gCFruv)ui-uk?YS`N!|aeSCe^?yvOr?np7d zU>}8kqaWk@D?ie|yCb$8>-<4kqYNeQWf0Pj^c(#cdr^POU_ zex%>%$J8&BAL(DEVpX-{+_OESPU73ndmM2*vOPm*T&(B8n{}M~DATNb9VPMh!;F0t zd6!3-^U-3Q(eon|V12PqdYML*SY?>~Zx7!UxtWuZ*gZq^BmG7{a@|D#Ds+=;oK-h_ zepB(IRJ{Az?O&CIZ)+3$Nc-_t9j6}|XTHuR@%*@#7+3Z+z3aR^MdOc)zba?AAF;;a zIx)K+N6IQZZOGQO*5w)HCdWAHlX^SV{-s+t#8Zfu--2WhU- z@Z&9llyZwDjCOj{O`|Jq9WUNpxiqGj(E|+tq5Jxb81D&ufM+a%BPP- zKkIhmGb#>W^`-K<8HZ}#?uoaRB`UuBw^z!M|ED909=__?jkBkYp8TjpDVU`2TeVlUbL10`rhfcy z+n)UHe$|Z=V~^eXm&dBUQ+i9~8^?UE;WS+V}quYB(Zcl~l}?VHb+PrC1!tqx@>7qwPgH-Ap~Q71j<+3VKjXFhz}5s8WuX1@x1q>m$h(C*pe{{Ods#k93;k96E| z`Xi#_k$sQ2wc@^Czf%6?DGx$N`DcEAjziiu<3LTd~&-f7!bB{xi02xcKg^rtKHMSuNX%%G;y|nf9r#`o}`1h}EMSrvp^xJw_N5u60!*bnkZ9Y4m(Pd*DS0&%E zC?8>rdYBi356Y4TbLE?wsT(AVoRLl}rtVF~Wj)tj!S7r6^vZ`Hii`KyZ$AgWR?pOD zgj~_!z_&TRc+==|?7;3nK~`CkytBVS^AzvKf8Ou-$2T`NjbA-}N@HU3i6Ppsv(-Lc@Oqt#=p<&AS@tfs5<@^n6cVma|SoQR`Zlr%0W1iQ4 zjJPMLU*;^n*=*W|0|E8F53%z5l5IGQ<4|u$BYI~&5->AKQ0klalSo5kZRLKVy15*ncf4L zypKOvRpB12PydqQ;t{S&p)Fx&tgE<=;<}3Oso;8x&uw#k#q|`Q%QnkF`^9soC(EhU zRai*`xB29c)w+r_-mlkHuLrDyJT1|G*#D`A{Xh0vfWB?h-?Qr~+RsM&zFSvmztNAW z-|2OgZYRn4KGn~rV^|y8>#8x%H2IPl?o)-0<5Y!T zBf^*V;h&GOu40e0Id|_k`y>5EKPGkm4(yk^0CJcgxvt91kN*2jy8yb0*H{;AlUi7+Z?A{~5BuAJZkq5nDe#~e9 z=g>XiN35$j-yR`QO*@Anr*FdY-z(|=taX*oW=r-AT~~1(#dQ_!#Pt?`PsisX`J6uY zt;qiex$s8&#r;w~A9>=aZ+e&GL2W+Pqo0q|H2$WZH~$>44q_n@l>MK2*#Bey8>DZ! ze_gfe*Zz1!ImkL;lw!#J`N$LHtDZQ+`#G;rTBcRz+bAL;kw(0@KMru{}grVdnoq<@D%lNAU<|M^Jz zE$zoYs&SS69U6Wd`p-wEwBP8*0jl?_uli7m>+RseUbgSx}pDkB>hG|#`U_1 z{#AZ_?>!%hH6quE+5PChUL8tn9S-`VE@ z=g9Mfae0RDTk_nXsOz30&lX-U&lC2_GlYmgB+nThEzcI7q@E}2u4t&OnzZ>F+q$0n zQ6=^h@jT&%-(CC2Q~#EEp3r^b0~H@RIrBW>y^{~GTv6_So^Zou?cVc*-N${Q{Jt@z z6^pMt-e$=iArL{{64MR{mi1;_v*UZS>=(Capcs>%ZQYhZz;C!BsjI!%+-q5$e@bi(* zd;a-I=cS!_J`!WI_blgtJs-*MYQ*$+KJ)*shWTC9f$d|T5p|`n74}_?&H6odu^+4N zYV`d`(;p}r-=f|(5dWB>VKv8^v5)9?0)%q_n+AMZI^}WwUfZvlU7xP1)U!*2n9Y*)1ptXs!PRe1fu?*YX1^@zWgh~ddH zwcZ^klzfyc(Q?!WUL5v!HONP~{_p7b(C<)g=KBNVL=X8W_kfn8K9q&S{;mf3D3{c7 z)TgBI%$^?~`6ySf<)|+s=dUOEC|9cGs4pXjH<4!SNj}QG{cZhzc`Z-5_I>?w!@=>luU$;^p(T9(Glp`PYF+O(hj2zxU$m?&u=e<{7kCUJNXZvS5>}uH~qg?ThuW%O^kOOSC-oQl9m&<;hR^{vYan2(5?hDy;tGr~Ct2o_Z-C zWLx3{M#=m`%y3DSr5DZ z! z1K-n&y(D}|Nqy&`Cj2`Om+S95kiM;+%Srw{==oLFI-CN}y)vT4v>rZRkos$ozP1{r z3BOChf%hEaU|hw*{_;J?-o6^Y??Af4bCmhLuX?uF4)(K;_uc!dwcqGRwhQ`K*{9$4 zorfYv;^XrF&I8`}A8_Da{0`rFI9|TzCel9mYJ)JO^>@$3vt~ALFf*t2L(Re?h{0@KGh~wou4^e(Jzw;2} zMvMXau?^&kMtY;$ZFBQDjxKmhsE2Gm(O<|{)@_eRNYIrzw;oU-x~3(@CCJLh@1T& z==n+|?JH{hNcTL1hVBNAUMHVeb|2kFEaS+YD-j|H;bfNBWI^WHspD z;rBz(BJWKKKYH(n(DUsPQceHrA-LYd?}t!!;d{4yHj8>cgkDE+UB%~Ed411)blwl( z^*#65O>bZ<`d29!*Y)y3X1Qm3o411%G>X=;>SSM3|H4l)Y~3A6uG5Bq=e z0|ENFkE>N`^#1pI=zXSP?}vE5y?2X#qaWjY>vffGC(3`7HIDO;@t&=7B;MrhtG*x% zFY31PDX$gkh(UfHo$u|38~dp8{Pv5^r;BlhU)NX2v&QTPLD%(4nw1#(@4=+s=*O7u z-}JAt1b&ac$97t!$U$8Bae^fBM`2-pCO*U&?nl-I<5`d&{p+fs|9f=$ zjeewk=wHVfS0z2JMxF!`-=%6MUv=fAj&m>*lDEpy(* zy(NieJ@C!Y_wr%CZ%a2RU1j?>s5>Izua4R~7PU7gmUko)JMt8gvdI#H{k`W8^zVeY z-Xa_Kv$%i7br;uJ+|MFEDCQZwH~S`WqAEB?iZl%J^cRoZm}5bXCLpo^_KP<{TTnSUT9W1h7jcC7F(rANmxBD5(cq~WvVSl?diz**z2x=t{(TX ze0l@kAD{l+`G2eRP5!?-pPOi3m+0!)G7byCPG5OD8M#*ETYgvA@6LPmbFn?osppeh zH0|vgeJ_6h9Q(Ms|Cw?(td9CUG}>GtzhOc9O&ayb93Iqup?e^IcOLt_vKOhS_YS*k z){lH)^+WoA{O0c(7fS#_$@bVk70ZGE#Qw0 zw~t|a_$}a%4Y!YBd-yHjj}5nv_l7;Nt{x{<;q?c9pSxLKkN9henE!X#a`s8QO8O(Xqs4#h<*AqQcKf3|`6=J`hlxM%9U06Q( zDIeGJ)XR249JW09DPN-Hsh9G!qb*N<%J*;8@0rkgC{G-=JozdAfR?A;(vW^a{N$&6 z%Nn(>LcNq{J?!$yPx-gCJoUb<+f$hR$xr!It16#*DIaEk@>72EdL>W2lqU|m{^X~8 zua>9Yl&*ijwxcaie#-Z>tMaLr@?rHSKjljZLq!Fdyv)_i?%Z#{0M_y&p$D+KuwmXV(YcB5U7Q?G1fjMn?RO{EQLbD#m_S&>nm2 zi~4uunx+m?_vzxJ1Ma)BG7%Jb?v=u*hxZ$j2M6i1en(!J-|xtmk5CoK{deSNj2I)< zi2AM)?RU4>4)(JTCCya-T_mOs1xi2CZ}cPE1^uhA`hQ0*&+Jq=&KmEzxm;{kWCMWht?+VbXq``?}=>LwKexn~1ZuxGW*)P4{k@q~t zynnd+*8bg1cz(>~cjVJ_e~j{@@%*Fwj=XF{PchDLKjK{g9M6LMsH9orfuk*n!|Sm> z-`k|#thue;v+wCGfsS+EsYxz4HqP~>;%NY#KrmopZ6XBJj z$n`w{T<37zle|R#4pXmxc)gX>>qf4hxgIjh9IeOuq}Ud}7Z|hmMsGw4nj@0G)X%SJ z8XK$EJ>!DbDP}3bVa}J-!*MosNPxb|Sgq2ce=l&$ggRe5xQKKraN_XRJuiJs(2zNX{LqaTxpDL>M`$`<&2z_%aE*ah)l zZO_D`L;StKqju*}V&1yPm@mEG3p`fzqVt&W2eoO4p>41qtPk*`-*ZF%_j~jk{TSE% zoBma%KBwCJy@2aBR6E-~;;nmBe)M1dUf`?%dy8a%AIqGxN8k+iBTK~kHM<{&{_h3o zH~NwGp?@9cPU&}dO8>j|G34EI&F3GNv-YJQetf%}HTz4yz;k4HZi0T|IEpkJjH`V0 z{Al#=1;*@s_6VHOevImmN?Mgal>cIW#P0<-?+%sU3)nvMKW~RN6n*e%vGlJ62Kn~_ zTwig$6@OPf@5Oaksa|Kjt@q2g-^O(p(R@)BrfApKNZaT4ySw-NuEd<8pt&h_gZ_Ru z>5+OqJw9N4#6luydcCFfa9l_o6{OGlez)_SfBh9v4ze!QHxt!&K+aa{Er*ojgnG_g z%p&Wp?mfqNXZW~4`-S~J6B;syf7Z^V@BShBk$$5elONIFeb)X}NUiU8?~EV2*D61f z2CkcP_hZ=iyZwF~`rq%S-{{A9iSi@;yZg6TAQ<}J@221A$K)|;T%~`9h98Ii_q*vg z`Z0c-@+1AL{OJFFxA%MLZQ~wCp80#}%Q3qL9K8Ms$q&5#`Gj2md?I4qjQR0-IkCP7 z`tGxmW@T{wlR1Jfr!)DxQ;72;{YF2=^ty@u-PM?a)_kZF)`(mu2KmvyvhnXn3`IZE zZ}cPmM*lLtt7w=Xxn4zo40?Y-_nu!4869>NlHAITt$M97>US8n7W7B&``ubD>igZ_ zKlt2ATR!aj-LvKU+Y{xR+Yifkwjnc5zQw&ozQ28>d~+M|ljOVHcgVN6kDUD~zOm^z z6n{#eg%rq#aEdF%G6vr;v`D2i934(jyK4gYzcSm5mP zX%#acdTHyMPknCdp1*%>>$u-vFYQqsfBV_$8Qm}cWVZ9|^6xqOTreA{_V>Gy_R(kV zEw6qlzIFQO{;jvh7d#R)Z=m0L-|yD@5BYz;8zuP+!0n`qN%N zIck>UTwLp~wHM3j``!CZ@XyWxdWMsRE%1J@K-BlUZT#N+&G`)P8RE&bpz+C8l6U+i ze7~DgFI6(cG8F|!dY<*d&piFKtS3|&#xs$tShHqLT9eje$200fLKtto_tWV8W$rig z_r=_Y=6!uW*UEio?n9gEd-U}n_L~nrSl+WTGGf2^l(&{)T^G|db%MI?O?@S3f7mP~ zILzxX>f!o5c~X$R8|6L}4t;-r+`s5CSjSan=wIN(;q5n9ju%s48fc}LH*x4iu{ zQk@)1#3g|T>Ve_2|FwFhW5_ZuGaST&VS#04|%9_2OfEF7(7_#a$U=HE_iXIpRcf~T z*GD_^`yJ;t(IxBLG)-Tpc>P%XE9>0cf4>v9&V9fAeusXeAL)7eSH-RGS$TfEcRTWG zr7bM%vXNACcQq|N59@af(T%uAR{LLK5=aGKj z-LDFL-`#@7E$th-oKwb+pGc(xM6VM)z54xa`Ks(MQ|pkD1)ulcXIHjR(cZ<1CW|lh z(ql12!}S+=@4KVTQYrs;BCmgQ8MAyU(9V)Z{plwklSJ@n;XuCcuH{$ieRrfR&#olv zN4~K7A$>sJcemfWy;1jBL*I9& zW5exZ*dBfh_+!KEW7r<11+cCjCked%;CskQuK!!ebB1bFOF8mUu20KRAIrLQlwXc~ zlxz8{Dv$aoC)dN?Rw>IPALV*#)%6keQSQ=FemU|{?rkkceUzKHr@x-$qg?MiRUY+a z9M-amHNChvO#Bc<>96GKdp???XLcJ$vx~~*jxqm^r!*e?O z$o-3jMPt1)eBYb)gY9tI2gZ!dftWn^RWv4@8vEX6pM5jD|J+dTUtf&;zCpIy(2w*R z{g~A4g8o%{`o(|OY^P4weN*BaA4mMdavr8LUMSW9iyRuAUm@9*-O{FuoKeN1PwrnF z=KQc2XS5&TOZEe+NY8JXG`xRof9Fu=8^!!iNo;GdANw2C`>04WItC}y|9sfGCAae6 z$8EyO`rapd(Pj&#me`|vf85+3T(WfWlDehK=hZE1ShBofedDIqwT-wh+pxN^gECRH z|4*6r_xpEU7d}2v3MPdt_Ve>S`W{!~2-_#yBikqSvE6!cZ(NCa?Gf=kCH{eJANAsO zQYYSDdqcO+QQAOk3mj*d&oVUi+NbfJ7-^pvad8TVYjNu+$C498jH1D{&!i@A|G$uR zb%rM>)H7kO_uK&6C+p4j+562meEZe0*Zuv`-#(k#*LNj0cLfy`lD7Fj4^EHMKbPkS z&<2hXUQ&qhT@oR~R-opdCo=7Gn{W^Zai#82xQI8_HQx8VAKB|ihwExwUD&6KTHeX@ zyMNKR;!+Rb0>wdG0n?je2>4s_)1UhMMI6Lcdbh$wys;TaTw;zV8C(q;I@-@qG<7w! zu3yt0P*QMG%vHEzlKmwaPi6@oyuS&Q2XUqEK1xRaH&nf1nv$2aWW<4Ypq^}pm$ zE_TPnAb)90)S5eOF>u|laXl*Hzy*qfxKu2+zdgTu!khnzi#UjjT8K9`G48`PZ%)nJ zdCSohH#DwKw2?h$n$-Qv^cRFP{u=4*tM7{%F3hUG-tqg3?T)zmJK8)PY@e}>-q}{8tC8t zrkd}8YkU@5dG)Wq`f(8laiwloxQI9QpMkhmcQ!X?jFm^IXY`xiyboL-$$~2%xApwR zkBc~ni|vbhvX-&FgX_C$HmnA zDR8~2aXl(w-~ui5DEUu6F5)0A>Lp&rNq2U=K|Q9wke2b6w7vq?8+}jtak1SISL$r# zXSPq)gVgV@hP>uv>Hr02XU32sr#4iXSQ06tEs)Mt#NgG zhqpIi^W+i-t{bx8TAYg_%~SuZ9~W^DS4`s}UR$-sb>YUww$`pK4Y;uEXwQH7>-lR_ z7FSS#X_h7akGs`+*-9aS&H> zh3;R`?QnHRYtsdtO)ZIajS+=KWT73FXTh~JLf+2m`Jo>daS&I_N`;GfZTV$2b&Kk7 z`PH<=a;xXVlG7GL{cHt56`XBpo5eISgo}q9NudOPLtFtMwKChLAUlVYh zp>drl;h^y_?iY!SmGt>>5eISgFH^XP*H)IswQ+rGKKoF%9^kq`)`uP*nUjNX&9j9f z;(b5$<01~?N-bBoh}Tw?#udOPLt8rsNNT*PauT6V^wC5yd#m`e)U$EH5u`d$`XrDV>5 z_Wah5i#UiYUZeY$_M5FT-Lp2eCNA30-qF?2+}bI-H+gK0dMbhID_L+IZxi_7+MI6MHs!+Iy*H&%gTHV&(zRqUKAr4$0%!2Eb9Q2T-FU~i#Uj@f11KYytYOgmsb0N0ucSd->(@#H_qHz#ce2VfH@!G0vT=M$3+~(m7Jt-5wESo#RtSInEC81|e@(XwkBHZg^5Y^7;z~_WxQN$QmBF=k zLt=eXYXP^uJe9z;H2{}6Zp^R?kBFCiz>kYKh^w^y4=eB-AMx6%GPu^rLZh>5OIsnk zHmZN!8i336*G#+chayfzlhgXmBA&qV%s|!WaesIn^-58DmG_y9R9j0 z0GH`6d6{+2N6$WfT*N_K@%74I#A_?g;PR&9Jkeyd0oU7lJbY5Z7&k!8!+Wv0nGg}K z|DYciaS&JU1qv7O+Num(9gXW`soS`IZ6PfYxH>hiRtW=_eV<%?s6f@AWu2-Qsa>y< z{rtGdM_e|)9nawEY86_6>y$^}w|})$MIoOYj z{vocIwg>$fj;pgvw%F|Koa4ZCIQ=EzAY4^BYm;B0)baoatZWL$1Rc#j@5$_q}$3+~(RobF(5wEREKX22iwlNxHXTGqf9pJC7chvP4 zu5#cn`)a4gE<7S$e~2F!aS&I_8ik8^ZB;Ag)va7mb*9?NmfH=9g03pnI_eX8{}Ag6 z;Ih{jwRYhV@sh**xQK(elIJO0#A~bC5tsb%p|dk#+uD}1GMsgp zpwru|?Y&A-Bg+f+9qz|P{xq&cupIUHaH%bN&ubc8Lvv$SBYC4JaJ{1Euk$4gT%d&> zJxBO)B{dG>N;N55#A}z64VQP>Yzqa%f$McWZoDXA-~u%dNy_=CKgy4bIEbsILE$1^ zTX8mAi8X6vNXgzRf$MV`7uFTPWv?&vcAH&=z<9|qeq6*sTyfogiPu)*!{uv%O&wb{ z$P;eZ%eI9A;=uK1-M_AoFmQpIM?TNb_Z{oUMI6LMy~N8nX*jON_Dy8UfdUuD4Q#0b zm%X(*G6y|m=_&Q&;`m2gz2~ZS$Z?W#qye}Jx+4o*=W2gJH*l##(C7v@hePv$Q?XY+9>gw!k#*mFHf zPV(a-4&o|3OOJ=zZ?;|&(T0u$o(iy8a*CtQ)dBbQ%zc0lBH(&P z<3brh{YyRpn)6XV!Hfss(|aqe^dU#?|gv^)I9bv zBU!>Fll-`dgSdKEC|tyAt26tTJl~LL>?rJ#8Mq$OxKKurzxK5YkBIk8_TwTB;!3Vm zxQN$QW#ZzaL^e+@ap1Z+3$735qDb@fO!ea;4&sU}SGb7RR&C-cXyVcef$Q=txISbT z9ucoE^W!28;!2&Na1pPq3ir)?vsR+B#pcO1p6xlJ{c=?#d?hpdxQK(eT25EEh}Tw4 zT$>Ud@+OCdwH@sn3;w;sG(CTXt)uu}54#RQ@xGaUT*N_Kspqd%zc<%@vvm-c+^5`- zXpo1^^Bf1M&+A|M`U~p~j2ocl@nJKPCEPRHkBc~ntG7yz8`^KSI^x>6Nq#oExocxb zE{k_tiNwAB6|gUAt~U+{kPAzyukhm{4&q9FOurvM`_0xvT)G{4yN89i47jpA4{)Ge zctpIU%8!dUh^ut7!bQBcD&oRZ*s|0usBb|haAkWQ0PnQP_2{ei<01~?>ffSp5wES6 zxYo%y*dW)C9j&W3cICZmqi|(=9su7$%Jt}}_2VKA;_B^ExQN%*OI+*mFiKk?El_EM zzp_0Kz;6fHbqI>r&++3T4&o}kP~jq8TL*FJK|?+8Wi#av2d-?-1C->Thb$#=KQ7`R zu9$uw2k}yll(;(N-fQ7AvTBDx&jXm_;b<0`1MQpV$3+~()qjC*huUwpO5##$s9bjo zZ7m8{w&wxNFJSJd!JpD|njaT&5LZm&B3{3=df$(?jxv5;*-(J%&<=y12Qd9L)-F6E zUcb95y{1!TTWLqB|Viz6}FInuzMI6MH zxNC+aMR0txaut&tjW3F06Zj3)DRL9!4`QEZnoykBc~nE1p#T zB3@e$$BlLE&8_kXc1NLY5PGwuBjWYT{kVvOxLS_-jrZMR;3y+BRtn%X` z4&v(9<00|dsxr9rFE}&?U4o7nRek3@%q(%T*N_KEuG3=#A~a{;M&yM z*}A$FZ@IB~a)|@iZ?imab5<^jG*3yh9~W^DSG-H%B3@f{23KLfgQY&;dL|35v&ozT z?MwJ^5eIQ4I}|SBwN++t?aW;V)ei5=g6kZ+@Q8TNT0bu0Agl@azHRf{<4DE1*-pA(i zy`bhX&WvOUmt5e-MI6Lcx>5Oycx`olT!oMI!1X&l9^!drtT*iEmXELtkBIlR`Ed~k zakX5m#|`Z_Ta_P|?qhgpRL{{ie^?y2=4xC?2?H0Xc^qj*vV?oq`*9HmaV57XT*Pau z^W)0k$@hIyz;$Al`RgdV@Q8T*20t$1Ag>tvVBX2>xPTx0b(50RkjuY8`dtF}nU`-^;JA<>%~w7be(Wy+AMp@hvRjY$x?NKj@n!DA77lSR zak0L{M?A!rx%~9TF%MLI)EUizGhcAwK34H{+g1@zvHF9Z_e*~+1~-<_q_OhFV^!6slWvJfB^2L<2zJE692_W?~5`ru1ex< z)_1%<{fbwwn5OZ&)%yct-%*r$N$V5pJLQ|*67PFnu|KKrq0ooGgYS4z55KPyyC*h+mq`%vB%fI^LEHs3^s2hcM|8La|A}inVA`SeG*Dpqn6>H$Wnwn{LR80H*wmA4Z zUP@ZYDUUnOT_e>UNZ24&c9Hjen3A4OAKkH}{8Hkh)pvDL2j}>G9sT`+{7R8|f0X(@ z8~sSXrTsW&l=mJ6`d8^ctwzxS@Z&8L>O4P^?%+p9zQ>lkAOB1I*e|Dj`2Dz#HwO9q zI8FQUIrY7S5>0JA`Nm_~f60S#^yB|!zRQzOSxNo9y|f>--{{BGSmj6hHy_>qOkVa! zjAud52cZvUjt|OD1B$#+0jXYpoUZ(s;n_Vy^dtS2_TxA8c&+`rd!mD{Oh10exm+HE zxNBsIm+JX(#t`$P_8a|}yifU&{#Ab5Q0;V|{&>cx60cnE#V1SRES>Ry9^Y=(aXzOy z)5_OTk_rh_`oBLn%XzREr{rL*5OAPBUN0y5;xhr`s+RU7i<~{=`-qM+!}%AF)AQq0 zJ+6LDe}7KXmdo`1jiv!bM<%5XRO4yy0lAHtC~{|~y|-oXJtV)6LK~PP)+L38e0~SO5=*vZuK%%qV|!%#jQ_iCpSs;D zxo&Ag-H%X*gwyf21Fj`*)r@SP8M(la=yEEr*#l$4DDQiqdwQdUf26P_vG(QqH>iF3 zrANwJ#L+6%T;a9PDMM?Vq2K67uIuSvWxtXd$JzF%3ghoMiKo2yU&N10$Mqq@CjB=Z z33+bP^P_*9xy2bRS4H0Qh=Cd%=dn=nNWamKv_JjJ z_^zVCEknMwAP!-F4EioIuT4>J_zuTiBaQEsP97XTruNg{3vR4d zymQ-^wqA9?E8c5+)*Y}{#sA#!r}Brcp703r&%g4HR_;FXmy+?9{u0)Su1|EHF;HySN{X=Y^?a>+6&7^ zZGL_$@~^t)s&CDG_S}k>Z*e_)Aq@xZQT)nr6@R?plaGAz>Y7JH$0LW{|D}p8s}HCc zv*mf{DF4Ze4}I&-3r1B=yw%+*Iy{|_Cmw{~562bv-{aZW#F}fG=`T}0_i%T`pFVbG z#e>(qx;4?a$JU1*xMVBZ66ODR(-&qiOp1Ll^T2p@PWiNovWH&U`ubC!+gkkl*S1g(>%siJ@fQ}@)4qk2i7;i2W3fvx$;fT)D4nF&PXQ~ zQ*(FR>rZ?A5Dgq+g`ZOijK1V~q=rjw7!dGP8NA{?=XL z@3$FkI~97V$f>N@&w1wQr)N9POO+X2svfHBO0Q0tevkS+E%Rr(u9!gNi^p&6_u3cz zNWamKlxI6p@m8^Y&tuGUJU?#q_U#skftJgO8UKZ1#X-Mu6~H+2GkOqGe!NDQ;Yayu z_{cp);}45*`Z?_w^r9aG-48LP;X@pAioTK77@Mg5xIz0-Q^i^M-_$$Ge=$w7Y3jYR zuzkCJ!;fVGkp28kS*HLm`+HdVX+wlD?Bev^g|635Nn_LB^6u;IY_(Q7zPD7!t2kuj zIB4$DUVZ(Heu4Kru)GVjJ!Q!(yT6XJpRNb^mKgE#g%A0qa>4_=KYpx^CyyTE-DmW2 zM@ar}o=oGxC=0hN%?l(K{ zY|p6w=iPq}yPtr%;J$X)eIfJyGgcT_x0&~!AwLuj`jLL4ALEZIKhnPnt9Q-tNCtN% zKG^qZ!~BRf4$d$?s+A3EoVibnl%Y63(r@%*Y`Y#;b-z@W*md`5!~BTn4shn?$IN|N z;2Da3q~GXA;KV`ys@Sgk8|FvUi2X5Wf1oj7cVU^aKd|c%MVB1A_vQ3;Vl=19#klI- zr`2-2PrKg}n<{PjpnJFP)%&#PKC`&;#v6XRmG@~c8NEm4Q$IOAeV?|sga#;F)~+b#Hxjx8C>9 zRm-xa3)|(*S_QuKC%TmDB|G-Ax-T2exnpkMVs#%m`Pt{Z`-T0Q)_+dLlOIsO+e_`O z=#CmPDe@?C-q$!-e)ud-yHjj}5nvVSD&3;ExTrk70ZGE#Qw0w~t|a_$}a%?W*>Hb?Z2( z3a>xDp|7W6*Q@Iee=QL^z)PYW`6ySW<*1MH?fd%W$Va&rEk}KnbDSzXuH~>i@=-3O z<*1Kx?fd%W$Va*V&)&BH)=`!DPm{C^eLw+$(iTYpF<>bzZD~qqZqlaoR**+qOBFN? z$t?+lrY0#AP`M!JU3`Ej(6T&Aaoqrlyu^yw*0#cB#TDIEDyWMKXhbONDr@zx^#6Tx zzTZ5~ow=Dz651x`v^QtY%=sSY`_Ah-&kC`xfDdpJMjb+S&oGxB;sI`%zyY5JS3BGf zhj@U4T?c#~+|n{X9O3~E@qiEEwlPa-L7b8cuVw2Nz8)0)t+_dBR=4p1s-_8w=PG}M|{Aq z6?otU-6(j(2Yg=OffxMeL{Cb3p8OCW@Vf*acx_346g=VszCy+gfERp6!6QE4G424o z&|g&kL43d?eZUL(Lyq{)^5=E;7~jCUds`dl0KA?K$OZT&(&d3|v=Nj!zgJi9|>T`0op zZPeezRMy!!;}F^F2^XD11ixVYAg=>mQZnB8h0B6*L4K!^+*p3PV+@`Pu9ooL@B2^C zBlHG6B40qiDy7{d_h0(fD^b|GetTRgOq7W450N*0;`yPPEUmkz{d%QzXBw@$Khmlw z<6m(-R#I8ua!?h5S3wJ5Ykyj=)SKJ$0Jr!1&?EE)J%V%S*9m9G)cN;M?A|=4Zujo% zw)3~yRHoiU_uduZ{xjAaT8hkse+PC~QVeMR0D!lh7r@(`98j3IbrT%L- zty!wwbbV)yqBAG&?VpI>ZoZ#n$MVzNP-{1#H|P=afPPiDnPmT)t@x(;Kj%2@=o|F% z9s2Pdp?6AzGo-%dxfOQk|NKM+wZBS_w+HvDl{`oNpXVrMSe|AC{&H|!s2&-5@H;M# zyk8CF8~fFIN_lBd5%#k0Y3x_)$doT`T-~~=GZ}+wznYt2X!9CXq_kfR*jS$2!va0* zSL3|QzjJ*1)o${IdA}NekF#H`v={r;2qo3+QlL0Mt~X({KWJ~z{wPe`POEup*o&|q z(GJ0$LwxqfOMjK?Pd+ze!l)BzOeMUm+F3b2R{Y#&RJ)V@Lf_gS;6c5WzCHwB_PRR7 zx7cY9@!6s5;@NGSPIivnhJAbRL+!Q+qsEgo*z$_1w-_JejcR`sG{<76Yg)Y>41dv& zfZm`-dy?As1^qf{&E8Ax54(QQqxBT!39`RkU++io{=N8m97AOwto;e{ zIxn_%yC)h7m*4G#r_oC+zTQ=)V%#MWF^)1z!uT#hc+Pm3Zyd!MVO3gxE#qJD_L1@O zc-UySn+BAYgTV`_{d))x#(EWcgC27?NO_cUsnYJWVVfZbIRnHA-%BqalMg?aPX7i8 zLysO@=#!&IK2IdV!G3@L6cC!?~iT6MULr9-(;jF*}oR-9+$R z1jFGc2=B3kYqEmRX8+}q+82(0Zp%vxEwW{@smGr=DD~FacWnOA-REv59yX7ev>|oO zLx-gfJMp{BL-iM5zxBzNj+#=lwEC4z#Dl{VGl6qSKUHyC^;HuqQh&K>;**=N`Tof> zKf2$h)K%Bcso8pK_2z5leEZ`^R&M{`*EY=i_2v0(ZDr}LzyHImy8pav!?yoS<>##) zuFi#2?G9t5`SL!>qp#^vTnzrdVf*spzVquVnWVBQ{ft!qIjiMQm!S*kq7OS~)%{rH zf$dD^oK+b|()aI0fqH#H?j!k~*}vzP#$bLn`}fTLJ+ptWcO@MA_v}}a?%!LKS=p3n z=M8+bdq=v**k7g?-QCId@8x8@-Huz-x<~s~<#*qv{M=|YA7UR+eE%M|D@oP@b32yv z@y~NcUK>RLag4h^_wS`eUhqLjrw#rPFN!~Y-!J?3wkF)aCveOM+orlpq8lAYe}oMm zK`9z}7O~UA4VQQ2?RrXDt~alx|~>n{egXB8^s<8 za>=3KK0L$&TsO`e(cty{dx!_PabouXpGP;i4-fGGmlinS1Dw8p5AguEM&N)CaJ+wy z9pr*|fa?-C;Pc>ud?Fs;b_g8s0nV~6b5>J<9^wHG@qiEE38OqXUfTzI5&Neq#ePJ5 z$W`Z?=`uXx1HM_{fp=U4|A0q)z^@f};00Yh{eVY&z~==Xc)>sTK)L{r_<-Lf@W6}w z5k(*I0be0@H}K{pKO-GFeZ&X+GJywP!0UPh|A-IxoWKJw_>Y1|e86uMc;H34cZeQ! z{t+MW-2xB1NOu%G;sYM|ffsy-!Sg-@jBj8aXnIU=oCEZcj&YI>@G)+g`Zvjq?4WAitL;oE!n??tTx9di2+L~qa| z@&)v(@&)hT`=f7t1cjGx@U34eo_nx=@8Iy6ZfAXjzJKqK;YV6LGafas&gB66_rm7Y z6*Tx7{QLKyH|P;550uL-ynk=Jr#B9Z9w$jq=v#M2>s)4)95S4L z(R%dn-wV^Df<|fvug~@BE=ry)_4Lj`vwu(NOds#w9drL4+DWvVm>)oUs`oq4{-Qng z=NPQRSxqlTkLLXo7doHA>X_WCYW@X&`YY0It_^GF{8Yl9(QX0{%Bg)z2)-?|shqOw zhjsTaZ6;i_?jC-@{)yhLyT5?AV)^MVxb8lUQo{i-ykX&s^e zzBvxh*cz4or{x3Bt*}FQvI=T{)&2>a-m3fNN~pfgTPHfd==v5&xc_)Q0zN;eIl>$| zOXdUEM<1a_=nZL%vNzs|R3JqFkL?&&o3Cw=G@6X2Z{e=%;~uwLj4OokZ!>`wU@8hi<~Y?M?4+kK#b_ zggpfTnVmDDv}CuUi1#dK9*;mj3jHeZh5i=CGcYcLaS8OV5TAX{zn7EG;}Iihpm)Nk ze=FnnVRe_ixK0%Mr8}yi#dK&swDWv_2)1AbjZJGJwo!_E`{kaSRQ#lqo+OZ30U@BA9{q|phu(#`c>h#>XiSv zx`Ph7YV$wk{*ik66B9STQu*(!gB~6CpV_fqdh2?sSEKYeVN?=oz2$Dt$7emRIiC7$ z(trAUNxc3s=H2a^y?ePiH3V)oMJ8*ytHB0e9FEVw?DGu$R_*QU)>Wr}du59K&y4>} zb=Mb9NnMk*0>4s*A4~;`)05DBv1ZX}7ku`*ITNzuX0JQEWcH{3F`kxaXH%a%>-brt z>K>idFk^1zr;qx@tcsJKo^|(a>no4@`1s0(8Cz$aKK{j7Kdat2i{e%C^G`1Qyc37x ze!TG(C;Xjbe>&@}n6 z_4%1$K6%!Cv))*Cw-cA~)vg&<$={eBe`EM3-u{R4{kG<@mFs4If7S=AKhL^jdOyoJ@q~Rb70k<(+jI^ePTh?;>~APRV*UX`HlruB-5(J*B?@K;Li@O`sV1vs-A!Bh^lY?`S7Y|&O5s5jb%qw&HZvk z)o%_tuIjb>PON%$!<4GS{J$37GP4%KxCv+$Lc?O2CwVQ~rC*BqoB9fRTWa zz@U-<&Vb3LcqlM>+_C3GV?6PNW4>5zenti+512e)@_@+$CJ&fAVDf;;111lcJYe#G z$pa=24DLLj&d^nRpv<$8gUJI!F%PKm!d{Li2G+8=OB4AbMOur;VgAuFaOX#!24-uUB6FuPV2a}>O9u;KP$gW{M>pK&dd3% z_Tj>cvpeswvq0{a8!gQmqE33ADy;5nv<2e>r?2Yi6n&uK+Gz;(g?DWI#Je=6Srw?o3f z=g|woAs*oDbz)~}^z?ID5f5;c0tbAcH(^we9^wIRt-t}F2X~rd;zAFI2e`bz0UzMn z#suLI4{*B#4)_2!VboEMDGhpv2e@Uoi@hoEfNL8QghM>Q}ucx+|JS<9O3~Eb~*3?j&8mqc@A^W^+i0u zAs+A{ytCAU<8yLh@8g`)9l|H#qnzpaj?>BTh!1%Cj^H=~%9o!10FU^9uM~LT1ze?; zF947DfNvIf;01j>KLQ@{0iPFm;04_%c*F<%E`bML$PMX$TtOf40bg;almo~?>IsxH z9Uk!kzf9nP7yL)TBR=4B0uQ`M_pS)}BR=3a3Ow*4|3twfKH$3r9(cib6g=Vse%xJ3 ze!x3UaV3%XJ8h!6N(0uQ`^*Xu#h zM|{9nVBAyiKz~v2h!6N>0uQ{9JL+e>{31T!G42YyNOu%G;sYM|ffsy-!SlIL7~jRY zQ0YU0>MXhiS}8a z&N(n_ILVIXr@J9{PPOO_dPKgkMZZcuA?H-roVHz;T~rw7RKLZ? zTNFCy92)(c>i;P@()u5YAC{*Xh5wxDvJgEgXb>9$=Tu91h8~gfK)DP#r+Rlv>Ct~q z^?OB6QRh?_)1&WPDCeB&|0$VOQcREjbE?DisGyOW!RvFq>YP(8_4H2Cfj&nTmU_&e zhJD+c-sx$HeNMHslV~^X_o#Lg?P;a-m(hQVvO~~r&LM&Ed5Wb}XDlfxbFOa=t7Git z^~;?59mG#}$vJEHhqZG(OB(Ga@SvR9VfeCNnx`*}?6((lJ!W-e$`?1TZe7)xECI`{0|}5SPUR>-8R*aji|~Tw zIhF#TcZtZ8^D_UQ6FxZJO}_BO6pz327#FvAIM4Su3FnR-@0@GP!O{}?{=27DdYsr4 zUgw>^#%B-OlfC%Cvj`b`uoWs6W^I$RhaCxf+)0M~d4nx65r61^Rv z{4B!f&wG_+DV5m^0M>k#H@oofs{LVA52M}``P7f#9L>L;^@wu7`29{n``--CXV&9X zN*c=d8zjIuIhLvo$CZhXdJ6Rt>Z#nJs-Nukm!+SK{_*KxXCzq4%tB8o|C$n`J zuG4gb>LZv~Tle3>8TvSiN53Q%-_mht%*|Gd| zH{|-sqBrOf@_>F-c>X*q`!Cz@P4$znal&U%xmd!L3^~VGBOm=@?l-VQ7~j=f{8jbT z4b*i}_qnKka>=kICDffLI=;mA4wr*Tp?YNK!SA?!;eIm8_h9WO+owuDxsNJcZgCCW zb3YmM&`-XHp!hdd_+Yt@rN#0Hb3d8Cv*W&v|J-2?=S~Rrd-Z;>eVw`=!i7Ihi?8*g z9YXR)?@NV+3;N|f^uzuAdM7=-q~CqrQO@{`o1PQ2^v%%1)mk{Mg%@ez3$*YGE&QA& zzZbOdD_VG`7T%?WOD4E>jw6rJTKF(6T&{&r(87<62;!TeeXrKSX)U}+3tymxS7_l? zTKGyWe4Q5lk``X8g*Ry7Z)oAiweS`#{BK(LKeh00v~af;{$DNpcP%_(Vo<(gweWZ? ze5@9pqJ=B9@LVl?rWRhRg_mpLi?wj47XGvr&S~MBweTHU`0HBurr|+(+^&VcriCBW z!W*^lRxSLj7XF16en|_zriK5kh2PP_wpLya*1{9D@Nrsry%xS-3zxm>j9c((DW`l( znC&2c`2AYgt>5%`ioepi-IHi5H>KDP!KO*-3#=hDAzyrH6_gDzN?2Gdh-(vq~U#$y- zk*Em&12UMR#wp|6J2rX0@g$96eC%zuJeLgWnB|$xoa_)TziMG$bf*zqa=+Tz)9a=8;K&r#) zCT4@{GX71W=dk(CUP9*250N{!{u=qjRm2- z{RcgJy`$*VVyrYg#%P|+B^N$|8V+OL4ps@ALkZh;%r?hfMgJ20N%SvqP6hg%SpST5 z+~{ZO>!Dd@Jg>Nbe%!z09JjOdZ%!5ttHbTv7dU*t&wp3?4_iX|gE16>_6&GX59YoX zhVR2pJw>Y*RR6@CKgE1gae|mXb^4dfZzf#SFM(gsFX44qJ4?qqzvy}p@{8(UG6v5D zTQ~3hzW)S0LT|1fkKNB1hk|}pN}Du00rTJq^yuUPo+o4+{uOT@8J_zWqn%N!Al6`uIQZ`;hTfpZy!4yWqF*JQ8S|{= zcWw71b&LvUzqIXMdij`q_&Ldx-3H}Z&?Cb5E}!8!dK^hQ8%A^Eyxw^PVf;nuz4VLL zBln%qPwZKbLA!l0)vzd!&>Qp!;X=O%?@PfcA?9fvwQ zviV1MpSziO*gR&^hSVEpj!hkQ;&+*c>My>2>yzhgI<97E^(&i*hfOb!n|sRrnTNO3 zK6zs;@lZRt;Ga(Y3sJV?^pjj@6pmUwKv{=7EWHT<-tJYCjG3yD`A^}+{Dqh3~t57ImiNeN7CYG|B# z;nbN8nHe*hrZ!cca?13^sWWCbHZ^5tPrdNu#!SnK-7w*qXnNxnWdcl$~f6Fq=9Q@G61H;zQA{ zad=YC9E16LmiiMeuiUp_{^iH-9S2{6J$qc=I{U8V9Au0)1JWIbmh+)7?u>C}?7u>M z_PPK07WwnZKbQ=Voux~i+9|9J$aSlAFRs5;?B4BR@99u{3## z;{Hlly^43c9{kE0JzSiDH>nC80#PR7fA^1niOntzwH?#aK>qPAlj0oR5EATM#B!#@(NH3FKc@@`8_a>9oNg z;zjYt@B8I0fv+dLOF-b54_;@cyCk~Nar8&n@DY@vk%y5-Py)e_$sa}@K?wvyCVv=t z1SJp*nfzho5tKkMw5Re1_p8f^71$p*1AW{*%I*kq$)Vuc@Q4Svw7>x$;Ptx%5D#!` z1P=HBXIa5B=MufNL8QghM>Q?GQNN1Dt-B0OA487P}1iJh&h|!~-1cI^gr* zmh#Ypdlo(70S@ti58<{k9vqK-z+S{z#%sHR`Wq+d)%j-qGd$u0J}>aV3pwfh10L}K zzf0hO7j*S>03PuHUvZz}A9z7G3LfzRzf9nP7yLuMkR#|LKHzf#54__WnR5gg|LoGwS`1^95*5!>D$rjn)3(w{B$?e&N_nLpvRo#3+PwLr<>M}|8biqD+*iJZ}-B* zpKzA;`$ObSkUZa3lcnVZw5Fhx#+B(z&?BviGX90TVaPY0)L`{+Fv!NuAim-9OdfgC}vn+kP-OHLD<@6 z1+9@9ghAFLpAm@iJy_2OOyi8ecj+u`(8C#loR|4`j_-`Xn|$HD{VZ*?H)wxQ6kxx> z?$hl@*mH=_zWC zEo-_Snl?WWR)NUBoKAM}_YhAQHJ+qV?2H=5$9SXm5G!bo#cuGg>4M&%N4rAy5KBIB z#E`wU|MX}*MYwqHFnrbiFdaUlmbz867d*ZmqxKL7^*H$V5JPX!WBz#ALmXBv9i{Gz ze+K^^V(1NeO#e*PtI+ShsI@|#hrk|U(Hrz=|EJO;^s8h-dxp!mZujKF;k%viN%XQ( zKHw~&yCjUgr`SV`?;alK$r%s3mTXjS?`fs=*E0S^_v;yw@$$HE*xpkG&9T_=9%9dl z+2Os|ho4;gO!Njl=6|mAh;pft=(J&*z2th~d+B9Qdx$-_&?iTaH>hz<*+b0z64f^e z>+>-d?&F}J7^cTy&t?ehAr`$skLdrRTq?;|&ZE`QKk&3rPT?(1_%FLXNz>zQFOK(g zw>%#1z4AXfdc2kjjFd+j*IaLnbAHj~k?R2dMU}^(9&Or9cce>mFqTK?4SGakQ7#eQ zQ+{~PP~4zAhK-ldd^*+C`<}BOdb7d5N1&$^aJ}m61sAwtd%^$jhPgF5zNo$6J0AU5 zs{1o#n_fHpFV0?XDx%f@cYUV%&G#+c%sBp>I`7dxo_=}ikDs~D`F_XL{ZD@TjGYmaHO3|~wCtM8AFdSyQZxOE76@2!ep02OC{MjFDxn;+j^gWw;`t5b8 zXD)hX(@E*SFb|t1JUuNnp>;~ie*e-G@sQeZly`a@OCy6djnL_BP|`-bY1$2|4Y z^dIj3`x@e*X3{-JrM4{ESp8J?ut!H6@%eB6`obySe`)w_bH+Woq52(AF>y`ukzsZJo?B#ZMu1}m!6T?oz<^S z_0qHa3ajSP8@%*9@{M)VzjN+yo%E2*hJ=f|?>j6W=bOF>DVzH0iFK*vxx+S}aNeX% z=gwQSiSrV0mOou~D$(HlJcE8&e&6T4;4+RhIQN2&wrv)Y)#G09v2pf-kDW#*UeWwp zU1mkY>efyN^HBUV)YE@qLq|(v{WR_I2x0 z{KGzQ_JLy{`n7Xk-MjXJWB(rRf=IA`ueqU#ckfM|I=!DOov#wU3fYg=Thwc0yO~U zA4VQQ2?RqXe;9cLB@hhlsrT+TQ_6PQjb%{L^<5&c1AKtf_wOMd;3@?U_yDKx-$OjWH47Z@0Z!k)hj@Tn`=H_z_&m7a{yoG4TwdUS z&x7;!;g!=%!~@(efdf9k`S5!~BS&yx?0ehoF!6fbSM~;Dy|y;1M72<76BSc)@oRJmLdBE%3k#`J;Y8 zy#W3ZAMhB*1775xD0svNJn#cA_zr{L$n}qm7h+v?{>b2dSkTwY5y~a#VLtN?5k&Ly-(bHOhR^JWjVsr8J0A21y+Mz8$rs2ciZ8Pt z_TAP`Tzb$W^aecw9{P2{y#Frm)hvn1faii8)SCn!0!=jx;yP12h%)3c@iuMxie^fsh?PlElu=z%{9~OS@H?p4g zrLcC+O;+Rs$|>-moTkI@nf zUBc(N4-4J9ZohSeb4RM{|F>#)>_7Ca{jmiP>aG0CA^5V}X+Hrw+`U>_7YwUV)L%{~ zJ7+&^_7{YU_EExj){?6Aq~1Qt(Iw+a8a?fYWxS`*kL9O31&z1C-3E9&7<{xp&>Qra zdsXs>=vSrnp<3nlhaSHydKABpdYni)oY|uu2mgLp=nZ;I|6b`4`rXrcHfo;;mqpZP z6GHSDEP;c6-xl-+J))k5ew7~i?$w93dOGEBiL;N=e;4b1A@XDx?4ykM&g)TYeCJWo zy2DD#F5zGFzAf;=?NZNr90GT-O8W{uLO#&13TLH#WPikF%i2b=AHLbj{=2g#7%)-( zXwmP{5qge-=k%W?a-=6D)Mk^a-)Nyhrx)vy#r&G*w5WUDC* zzFKNmQT@4>uPOY6g(y^6@^u`c}RMJgijRcGYj0B7Xj0B7Xj0B7Xj0B7Xj0B7Xj0B7Xj0B7X zj0B7X5=fwTLDD8!12X99JfOsrbAe(>eb@_RU})O}<8*n~MFM z*e`?qGdM>9=OPF?YYeUD#Qg-k4}=c5whq{z_tAu}jkVu+V=UDmLxcf1-TKJ*B^L67O3vj0N#tCD*^t@FNro0s$%6n@(m_P&HY z@xk`&{tzxqUNc_fyKjZo?LTI{HjIDad75$g@68EY?;X@!aQ_9v4;BYKLT}KcE#({f zRq5sZ7Q=mdqj1*V&fom|FD5y)Nuh+W|03eM(qrKMqe|;&+JC_-@1xf3b9v++@4x6- zk3(Sph3E}>gchJ*%POz6tY1<2dzAEe>%2QZy=MD4S3g$w`1-52oqx{V^M+HMc>w*m z>V%$9k4kmw)~o6}&U*jb>6Z1k)A{`Nkm@LLv;W_JVToPKF4+-&;cVJ+)o}WaE_sVW zR_Hy%xmxL$il6@<)gQ?HEv$d%rxN~*_6c}UujT#}hVL-a0lR+Kulv%Q(q9xmw7(dC z-*wbI#6xZ0HS`8Orr(zSqT~~$Kc`LEte*L=7v4pecZHQlFK&-ds-Hpm*t;*2dwZ(K z7uC-IRxSr&_qql9i@|;dU`roCnG!pL=k_RxjNg{(=)OB{^ar=X@_h z;EC%UcIx{VschHHwJi9SzrR>|FvS}|7*BV8(ftg@$9R8By^=6JG6v6;QLf;g<=}JB zBlHG6=65MQLce=DIl|6SM}m9-%kr5$!GX8&6IH7ps5tID(9cKGyyNm&86{ zMtOwZphqBuekDxx=(F4KjqEH6AG@8y{(ALBsXy0BMA&brSMlA$!%xbdV^BU{hJ3oe zc67;2CH(8TUgh@jC8}F>r=az>gD=c_Tu;eDKlpDXk2pD&x+CILY`a|9KX}{UK6RtW zd03h63Y+X6q5Bu%dvU{Mney6>^0}>JQ)cX z2_%yMbq+Rj4*?EXYUshXY`R{$)EV6$OMM1*+<$Q9spURTj615YzVS%yo)erqjQMKB z$2=>>9r-@%1NL{u9Yg1W?A!u1Pc44>?_$T6mOA6kz#G>`e;jzwAGhC8c!PMB)TwYk z%u_GFnQ+lOHT;5c$I)dYojK}w^VCt}jzevp8hV2sb065x$rsSC(qCh6{J1ac4VK>{ zdKAAvk5;erIED;_u<@#(9*4krkD@o|F@2)aBlH_Am-}ky0J6Q~SdIH$`rLX|^aefV zcgy&(=y%^sSs2F$TGxiX9t7{8N9YZD%neiREy|@zDz6)P&^KPi;gh!WH~+ek@6nh8 zyStQU9V9;1jo`byhUcFLu+%(2rS&AO8+nrO`Nuc_z&_TEaQ|YoH~8X4DK?)om`Wz} z2)#j%Y3VmXze+H)Zfp5nj^0%G7!}TbY1_T@;xUol&r8+A1_?ut2;;kahUe&UBnj7> zmwU|mMd`iti`FC7amCYPa2?lR)Fbo;Jwmw9FT#7uFIFB|m#oL|e$FrG%f9FAoBrz9 zC2=|D^0=PzJK)ZyXU?Y+pMIFjN5Ex%|HYcX3kq~u+08VDPe0`@d;Z=h`RPw@SgA*z ze_+$)|8|Ch=h@>wmb&kw>FRIa{>CQ$e(SKAGb>)XB(?t^o^sAwUG>z>n@(P~Ve_WU zmw&)>0u28Q!Mw9OHIt%eA0k{`1pj`5Vff1k?<0iER`A&){&8V#z5UJ>>l>xD48QiE z>8aXlH*LQ5M`vs%9yY&r%evIq_kKL}#y`KoJXHT6bJfiM{=v012fX&wCgNe!cV76> zrVW34bj#=Fe7Tl*sNMCo?^chSeN<}H|C=z&x@+N#d)~SI`@6qAW6n9-moUHCSI(Wb zy}JFWd1q|=@wWT_--4|#95t=(H?yAFcF*U2Jnx~uFPO_bs2_7n_UfBIt)Bkyk2h_+ z>s*Kb(=TsH-T1-NtB;xdT}K`pmVD&NuTRRPPMGtGBM${dYvO*^=E&pmXAVlux~O$? z`+etbCLEi`Oxloo_|=!I@0|Hv#!>yn*Kd6?|3GQYj`S;=2#14{aUAtPYc1g*nG6kg z-Qy2B^7W@S?mNG}{P6Lgv#BwEs!Ww$`Szw0Mt*VA@X!6{rmJ4L(UtvoetGn%Ro@v= zecJIq-PH2GcWq|8JkH>EQT3HS4nK3bT}J%~j6*Dua;wMF!yY-#pMFdc1Bj2TT+n<`H^WqRY(8M7OknliJeUU+h2rfF7Y#mt$r>!;PvoH}(4{RUk| zNm03Qe=7HL*>TE`Rxel*R^Pci;iuxOy+!?9g3_-HvuaXfsr)`Whi3R|JpAC3{Tkt! zpV?(8P0v#Msp1fy+?Mh;`5~SYW`Njk@mWNTDyZB}wLj?_RF4GftKz5@FItjW)494m zQ+`fE%gWB;k$d^|7K-2f@;|zG-&Aj1m)y&{?0f2dpMEzS2uRnw=}J4Z(G$tFB7`7$O}Hu=(NEf;zjYt z@8>T3P;Gmr;T+;D)85&VNy46e!>tz<(<84cbM}`B!%qL5nm)iWA7LxcSblqhGkgTK zVB}%s5tKkMWb%iRM^FO6kjWoL9zh8NLneP1c?2a84DG4>!Tr{9Vg>fcH^rXXA@)d+ zOAa04yaF8J0nUC**(<;Y__i@YIK%^7rN99n;4G`wnWY0g!~aVi*%!W==>u-;CBf;@FLw&@Q4q1;0Ipt9R|1!nR9CT6_iJBIxM;m)R(u(&-z0pxcJjV`TYJ6dDABzW3I`n^JI8`FzsVI(yA!qUvWKFQd!_JyQ&bp3R(!$DJiAa z-hT21cl~k1RFItbYef3$G9u>4pW6(aZ9(PgdP+#vPS;wh+LbCo|CZhu^{->v9 z_ob!Q`XZdNJhaiwsH6k`n^LxUI%+8{n(u$g@os#*rEUP6BX3{Dm~s# z?I!DyR>x9(yQJhf=NDby`pZGs`aQ-l6daewN|HCq`I|B8TN3m>UyxBv`WB;1}3!yuYet_;}|RE(?WC z$uFw?VGN$rHS2xZ*Pl3FvfT!~L67N!B!5Uganf0STTpL((qoP2QT#sYF>0S&P>+Lu zpB(fCJ=%vTJwm@Kzg|G)ah0zhLE)N`lBqd`#GRD=n?fa^s7|B`>8&=P1Hdih0E`D^yuGTwX4jF;eW#Zs)+9) zdaShmTE@RV>^t%^7(k750Knny}N4Vd>GpY^!rc`ug-yA^ToHq==7o!oY)d!s&4#__FWFI$`XidAv@cj(7gSL$YGm*++wWrr;Os zzu@x^9;RI|{0o-_(}w(__R%P4#iiO|h3CQLLyyoK^k|=??kR$Pom7`U64YCHAN088 zgM^FsLy2FYN8S$=Uyo7yXo7ki{QGF2H|Q}xRqhQ7E0_ChRv!HKO+jzaqdi{LtI+R0 ztGWQ=ga5uM=nZ*ks;0_8HoK*+&qOU)v4pd?2|ujQ97dJ-%UmKE{IkrlRy1 z+#x*p_a{Pc&?EZ4D3?m|mDFF|_ybQ19X(!K z%Du|{SdVmG#d>R;^Na4UZlJQrzj%7I3Gx#HHEa^R2PyccOmG5lo zbh>9NO?PWOLicGA!R$=BbL%F$XRC|u*5dFJbpO_|bm!J&bR#%To6oF&_|CQhAtr!yv(Ue%w34!s7Y$6_1)8E1SBYdRD6PiI+CL z@uRP9Dt-O6O`Mky>x~<(ITg?F`+RShj3W)sd&BIw_l6zb)4gGIB2}q=Zy0ni)O_5V zHq_FM^qPCaEcebZzCR3dk^0XUcD_hho$rP_!`N5x2j<=|>!rQ(-Y~mdorBf;d&54w zw0wS3OJ~cfe4lF!BgWAQ&?F!^k5jfndnw4*g>-YJO(xSWK65AgcEVTcE~wZBkyP9a_IzN&IUhIoL>3mouy z^n!4R2e@U=D|)~OIQ`x*!~0}u29`iKwsT>=lhD8G8S0zBdazTyQXKj4M@AxE7);sZV>@W6}w2R?Lo#0Px0 zzymMn1CI`m_<&E#I1BKOlYA7Fe#8en#%X{T=>{I1KH>u&-+>o=hr#pt^B51py4l=< z;J6Udujd0jKjGd79;=9TZ`fM7Hw^wHweBN#tn!hLxIX76KDXQ!Jea@EA039z+#42G zuJ3j{=n;B@9+5AgU&R;S8}`d>9*^eUFi#eH_6d4~-k?Wt1^qfup72mP<8emMF)aqoRguTb~C zx&Cpo-nAmEpVG6iQO~9Y59(Pv44=98t!IJmp%~C3^aeeG9q3nu&Ao4s%iiX*9{Juk zl<&cM@0(rq?%w+bdiuR@V}%cvJKy_;@ZNs!8`>MRKUj}}b_wGZ7&n0Z4tw68@9&WH z>$vyr&SLkzW#!&C@$<*4b|*izZ|x88px(-TAOzo*`rtmt^^XR_{zQd5b2{0n`?}8} zSlZ{96+d*JT&SzSB2i7NBbnDN9b4SkMDiEf2(@t zzZA}1wcQIBf5N?QZ_s{&5Xb8bYkc>0JNLfrqdLA1{?`yak>FmvzQ-lAye5qg6j!5{Ri!oGXo)*rIPTEDo) z+Vak3Yx(>d#4qOGDeYsDo7ketBhy294BJ;l^MFFN7-#$bH`b$b@0;|S`g-phOQb1M zEau*~NYR)NMgm3xMgm3xMgm3xMgm3xMgm3xMgm3xMgm3xMgm3xMgm3xkrLoJlIU^A zNHFukNWe(INWe(INWe(INWe(INWe(INWe(INWe(INWe(INWe&7h)SS$bz{+ zU9+9=-Z$)S|I*iw2D=~_w7@~?tQ!e|D5wxZSiv_%li7+ zA^ToHq==7o!oY)d!s!_y__Ej4DOA{h@vUIE2p#_PNm;QQ|K7Jx(HUo9GRC%+FGKgnpGc zX#Z19?RHNz#rH$K8~46(`}lMEMcp%1Y5ld#<9E2leIq!xkAxTdu#ff;dV?Nw(r-e! zR7spM&su($Pmjl_aP~{v?xhHii5#NtecPaYmmoZ6f8t0IuG|+!`x76teo=Za{i6Fh z=H53YKIjp8gB~GV=ojHV4&gO4_^5P@5|LywE&3kj? zziyjorMLd(lq2evFZZjH)d95tj>muGFC&&%HGlsi(gt^?!3N@{&si$ zz~L(_p8s8McxE{JICWl>A4mLWuRack@xFsE_VMh8v8N7Oa@W-?|6u?2$Im`HhwJ#` zFF4ToO`kr!8g)MV2bGjtA3adD1%7-{&u6uflKS8lcQ&kSYG`lj0}2B5N) z-cfOe@)3ottwP6jJG(-^)S>B~Z<+d2+04!S`?LIZ$h}z#-ux{t0j~`WwyT9ub>HB3 z+0=@!KR_c`*_5)=)w{yj;cxVNN_ra(#~OTVAG5oQ$9JM#*0IY+L}yh8blck#e}Hj< zLR|8trtphphrEmN%IRk`mY-NYx1l3bKCf+MXM00OXAD4za(YYar7ewp-IAY8*^7ef zMEg2k)K_?20=Y?Q91*^KOmJM0HN#^-r~dem6n;Fm$9SlpSlu@z-M< z&p0E2Au0ja4r80F2O0R>3+;o3Ih_n@fXWFFWt&ECYq(tBzHS|j z+dn&ppKItx!@JHqD)&_Oo%yP2ibM55d98xY&*iG1hJHvh!}1UHg%6hC)>G8{T&_nL z2SJkWwWETA5BW+d{(~V6M^+iy8OT&;)B1uz=J{NZ|=emozvd7D%0NC zlIg&Q0rtTk_yK>-52*BkZ;!u=GmV|^9-H6~{D43Edm?|4BlB0+*4S^1+20WSe^?dJ zuPQ5^QotYLgTK56$M2ik8!m5Ic~N~w=M}9<6>QH5_M<#b)DzcXPCX_cn7_4DAOOdF z_`gdu83RM8?|v8L_bnwyU<{*;Z|wJXIc!4Jpv?UGDm^U9XShE{q;8o)Eske9rG zv@u+JW@S^Ry}t8`ReeqhVGBCFtl}&913%yo-@!MB*;*q0oFa?wz4h(4e^+$v!%@^u z^AC>sE2pp@j%9V#(HE||VoFm(XTy}s+uB>3I?kW^u_=vht!?c`pIUzYw8`cC|6`NO zk9Jz+DN3|cGAl1?S(%|2M`IlOyt5abF?ar1^U_D_aaWMFS5Fq=%8peH1l~zdD;iom zGH$%4mX1}e4OdK|>qVQWDkHz`^7^(5xlO2VTiw~JD0Q~4?g6B+;j)&_D|$q)qB*(4 zNx<1ld_3#CG_G#Htf6ytd#1jFlKRc1&?Xj)YdUwO`6iVMT=}Or46;apI__pIN&kI+~+NH?4~op0(i2`O&dEh@I9< zeYE;@E*w>{-r6qj=uz-0UVY2T&dkaVrKzb?W){fNNm+eUOFQYmrEMjlJ>Q9jKVD`G zN^x}uaZc*W)L+`LY89o#&(Nxd#>|wq%QEdMqfrLCoCvIFr`nDgN9GDdb7RzZHn(Re zsjW>Ebt*F)i024lMQfXrFWjtM7^PuNOGo{h;#@g#0(m$B&y~gTp!l@6P(cl-rVw9y zrnP}3-O=2#s-8=m8~;;Yy^A&v^_s1Os%Y( zF=OhCX_Y6>m|PzBrPoP}v{;;#H(rG%@p`mYf}PI7uDhDt^6={INVs+5RwJQpj{}p; zydk^n%(`f9BJCRzbV1LYt6?_KJRse|DF)?QECb#2Or26W)p66N%|3bR?2~76w(0qm zmt{g#rrIF4YaA(@KDAY|W=)?t_2ikAl_$?4&dD|+qbJ5YkM&^g?2Ad{=E#7-5Z&E7Zd-t{SiP>rm@U_DB!bngP4zrP zTi=vvY-?9$7OKSo@zEAwEF1i#pOmpe8H1Ox_Ybu-Wm@}ffICKtz#sSlfA+8c;jD!K z-^^df>Xr4Y+B)i2^}_^4x1_%-9bD7nwSrlFld`_e1ywC6U zBPk9iEGIiNe(tPaDj3dcVXMz!k8x)$jVqs?6Q50~H6c#SQfFxhsOt%F#7ruKP2Os*>D0Rqx z>?3~y-$3Qh<}Ot({Zcc}Q4&CY(*45t$e)mJ-291r6(@ggB(mt=+>HA3j)_iw&RtZ$ zjO*P=8f$i4Fn{iDYRYmR<~+xJykPmGwKtSMxm;zv0|nfAl3^@5Y|`=6a}A%vtKK^= zoVLRIPVGRAqMx1{szAlGmX9rwWhy;esy1u=jj{rjjM0eKLe%jeB1h>bAN>?8Om>TJtJHw6SQZL zZybHwRKC#;aeFq&ht`&M%KnaAJNVN&p?$! z`w(OIgy|#v9m<{V7sf_8gnZ+aL+-jEKe_!%$!GQ|$+v0cBVS^C>{jH<<3>3B$}U-# zhx~?onOo4ie0e_SOWR8y@+I&LSiU^mc_cdeEW!BKi)@ABaVoDT^%9P%OX3{*bsy3g3%ka^EO@}2G%LLwhR zzH##*@{^knC7&T5Vt!yP^5J8uKFmerL;H;0<-?D0KEyyJJt7|h&p_qF{4a~|(J7Sh zP=2H5KZFZqf_w=1#?6PwPi{Vxe1`mhc_rkB-kwFm*^EYW<|&S|1!s}iV_zw{rcc3{ zzmQ*WysUVBSVBOMFXsoP3ui9H**i`1P1T>6Gm__utkqvxTmAaE8=Yqg%DA{?(HXBP zyq`1jycFUyA2j#q;6Yx=$=qYoywcOTHC^W18dgI%XtO!4A3#X za`S|)`!s#TyxXnx%>62Kahj!k+ouNm9~{S>m38O;m{)e5&%Dv>u?0N0(6hpgIKzew z`|HE0;jcWs>76kX*?00V_+e}c->_l)P2y}~82*BIOo#6$!Mx#mX?Hmex@-s1Gs^|} z9dqKy@32uA#(M^zg}$UCvTn>Bdg4RH)|E3I;~)W+Z`cptJ)iZ*HY(&Br>&ey@v%07 z+sY9X#+nIxtBldyF8(VrMzca}T^Z|Py6b7fG0xY1R`OW6oVQ&gzQ<|tr}SytoVK&# zxL_N4(n(XMc>n7%9hY>rnM0I|%hG%`5-<`l5-<`l5-<`l5-<`l5*YjvD6ds(u!^UY z?UrQ}1@^|jiQUpA_6MNnH8-qWnQ1L&Td6M&^nf4q(o>ba13o}+T0&y5(LoRRL9a{b zfe+B*HP%U-viH^a0m~EkK`(cbq)+IA-t;8I2nJ&~NFVTnUboN#AD}lQAw5hdfFAIJ zUhX~0P6Z#JH!~qUXMs4uf*$aLUWL#DAE0+iLV9fTvjaWg2fgM)Bz-~`^kylrUjM~- zE$9J1=;ehT_yE1iUQ<#4w!ncN@Pl6SG?hQW2k6aCNDp-n=m9_Ir4Lr}1RtO`Enx+N z@kY=Ce$cZ;p5Vi!m#~5vrO6ZcL9YVkUDD~&OIX41S$6D@KHvwv{1l}>@Zr)+Siy`@ zf)4}7@v5>_w=X!L*|^tw(|=>s1wy@VAEkN2{JJb@qdY)K#ZaOowiV8$wP zEec;2Tm#~7tTprQ~{GeAM^uUKpFJT39u$DgH2fgN_RQkY&OD|ysbBIO{ z_(3l%`2~D{-pL8;7oI<02YCWN=;dWD1bn#k64oz=DsnD8;0L{mgH-(qK3sYU>zBhc zdcY5Q&2yyuNjhD63G0``HG04gdil@)le5{H%aIyA;0L{&&;cKyH$7qf@?MP|@Pl4j(g!|VdI{^7qcnQJ4|@3zD0zYp zmtMm9rCg&2{Git?^uUKpFJb*MNuvk+pl1s`@Zr)+Sic;t(F1gXU50_rT`sIC!oJ$Y*K`&RO=z$NHUc&n2 zIE^0ggPtwv10OEEg!Rk&HG04gdfk#f@Bw-=64oyj8a?0#z4UA)Pw?T=OIW`guh9d3 z(5sO2fe)8n!usU|jUMoWUanH|r=-)Rm#}{MfJP7aL9bcz3;1y9C9Gd2YxIC0^zyS* z`oM=vFJb+1qDBw+L9a{X2tHhT3G0_B8a?0#JzLTTK3sYU>la+#i24lpL9bi#3;1y9 zC9GdiY(WqBK`(uZls`$QOD|#lf?^ALzz=#Al0NVOdNaYO=p(L&Vheh}4|=(oQvM{J zEO?P;5aD_(88i(g!|VdSJAd^iGxdpa=Y*mpfU?pQO{J2S$5IuS%l_{Git? zas(fscS^$g#aWC@G?6~w2fYeOANX+TC9GfOXz2rf(CZR8f)AHo!ukb^vyndF2fc1d zANX+TC9Gd$F|I35;CJaAuks7{aOowiUuraYb_;&c%Sjk~xbza%FSQyy;0L{Yg-Rdz zaOowiU*>A`fFJZKBz@q+rI)aNk%h&s{(v9!Y?;piA1=Lw^-G9WAD}lYVf}KtPEYWIo-JYU;nGW3zbw$`0YB({H%OZ^)@VoR5SMmfOF1>{H%VM3L;0L{KtVfY_y7Us(FH1Cfzz=%1 zw0}9_!=;z7e)+IQ5BNbZ{czs7(+GUH^b*!DOEr4H4|?5_F7V;fOIW|0r_lp`&`Tey z$^-at=_RaRmTB~WAN2B~Kk(twOIW{rM571%pqCye^S6>t(3_pGe)*_I5BNc^OXz_Q zmtMm9<$R4E@PnRxgrraCy7Us(FBfR^fFJalg&z2D=_RaRKBmzFe$dMcJ@DbuOIW{r zT%!m4pjRUnuywC$59=&80%nFSj@Pl5(ky8GIu17Cf1#^)`5BNbZC-lIFM=x0g z!~2-o!Ttk&(CZd@;KQSrtb%D#yOm#l)hRHFy{pqCeV;KQYtZ~^a1jUMoW zUPZZ-KcVZdi0XjFP$1a;0L{Cp$9%ZddcdS z)fzqE2fe(|10No}WcABs8a?0#y^3R`{0Uu;Ub6b-a*ZDFgI-SPfe)8n!Ueo*GX)lDdcY5Q_WPv# z30;p~vijwd8a?0#y=I{YK0JEK>X%Px^nf4q@sYT(38(J-m3KI(MwjpWCbD9TT9Q~3)S6I*U`o~-m6z}h6+nGt2MI%RW4rj z%CE7Yx|oBP6W{UTuOo6r36S?Km6b!H&<`&qsR(GPnD;rq{G zQdGTjj7of`9I0=?zj?WXCHOWv)FZx2dw14$Px$Pyy*ry#;VW{MU7ya_3_H6BvJT3O z^*4@QLB4F4QW4P{@F{!Fi7)bt8z1tC9beKPCqAzg-XZ6?as0ykX3_Ekq(7LJG-cM@ zBz4Bp-wBrUuI`q$WG+9m;ff6Uoci~k!q{7yll!n-|EDiI_X+`i?TT(E48OU0fivd5 zn<`J?D`h*UMFB$jd95zPSHB){x7TYGht+g_NY#Dt5x>9uUD@T%dEcD3c=QM9eVd-c zEYFhw2bw7U5HE^9hU4pYn=&igS~}>KWFYJ(U*`*GS$XAKtsM&Lhe%{N1}% z3{GziJ>q>7-rTX_coi1!uOII@#31nGf<=q@>hAJ+$uE;E3u2_YxZHBy zaUU$Hv&({gHQ=#-^_FvH9eljk{c@4J{yu4#^;b^7pxa2#VRF{>H<$WcYi)v)d%Mn! zfTP!;ZtkMmrY5U-%G9aJY(zrpZxRAD)&)X+4p4hb_4Q)aC#0JP`;0IO!LSmqwfEwn zjaO|x-S1aZ*#7(D_@5bzf>XZ!j4e5{L5Fp9*`Z&(~nGr zd3>SR&kup;Y%2F*)oyb?hsSo%j$>>G=>#td61pk$RhIC^Iu3aL)0Wdxu6`s4e_ zdt;~gVT(Tx)^tIN#y1i$5-<{oApxp_v#H7Sw@eHbu9FMvWo4&S&^OpAFaGr%wgFP` zi__xz*zdya6pj%_+Xu;b^q=#Y;V`GeFF4$Pc1o7|fydAm=<*uNs?pNI)Pimj1@Xfd zG~hpe_Dn}^?|Ja)YW}f2@yzlJw^M*c`T1sbAAIm_Hf4V#Xs4hZ*ZZf;3(H42=%&!u z?Ua{xU%h#9{q85&KfGc06ZUCuoBPEe#vXl^Z`iL85OxaW8)c_FfA1>Ei#4emx2}$~ zQ;;w8e880B~ZS#|d)ag?OG2XZ+&r^y!bf`1UJTZG)G`IaW4>dXGb4bogEF0#$FNKd$`zN0o0c zmvDpfbB)SRXXN`u^1WI4OoLtSgy1|O%f+$Rg$~LAugNKN&_$u|PfH;jt*Pqenw&5k zL+4%Z%K_vYryQ`pk)H-i-#K$HdM~nT@AVD&#??3KjRDj5&&~b1@fDsx-y+|*`bPUO zQ2OrrrWt=7NPR=TarK>-e!xKKyW)PM?}5}eK8f@ol;LcVeJZHxUjQ2K73V8$hankp9ReSZz|jjQjx*y#hM?|d)! zoD`GB;Q!WpeM7!I>D!$zuTDH)ep#ly;Ub(tkw6!bLpA@L09g?bXZ$sHu^N9GtnN(fYM(;noBc5>L#&YU?d!?~c;tEWUw%5q-k${nakwCNr zxChc7c8V2gFDTmR`+}43b-ld*Fnp~Q;2b(k%l%>hA@{dpuIml(%KbmDujbO})59c! z#*ZGIwQoT?#X(PeU>&a>=00JupA%pElTGE@f_4hpalL=ayx1-@bW`Z}WT)heo#INd z=LeQ=*sl4;ki$!`fi}l6Dj1>ufyK% zKV)psH}K${Kg?y*E1iWr^zF^S*(rKjkS6$j;2PUXM)=gc7?ufrxcu%V(b(px>$eFPV0UlFzl3k4|Yo2b5f8m z^nAdSy~0+gf5lnPc1rWF%{tyfEk?c3^^b62eAp?FZ)`i|g2Z-8+v=4~4edC*zmTP# z-UO=_U+lYl&;9V|)LHgwGoO-FmIG&}AU_xLlX7j~j0B7XhMoktSyA&TNIUmiyuJ(G z_H>@3rP~i4p!39amfwZXr*Mq-`lA&-Gamit#NzpZnDZ$Ctnubk`v07i>C-#-48AHk z7bT^IwfU3)%Mk&ZPq{2;r=T6z`=_jR?>uzqrqI{zl!9|o=9qI*B9syGn&lhzD~t*| z#TNPYc|Jw*g`N+XvRBp%^{+VV*-o)n_U?|A!W0jsH(_}IvJc7ub_(Ph+fG@L)J~b# z+Hl3dtoynRc(zkY5d?a$EL;b=SM;4mcKJFn}rB1)a>$`Z|jG)ITJB2=RyWzAQ9)$l%Z->L}6oxp$4_5dreLa_+OOtty zX{Q9R#U>7;qqldM{V9c7jCvE62O#qx4D1xhH@2Pf zN^(1;ZDpn}3%?@mlnue8^)=+w`}Sv4eYbDzH|L~7-^dGi=MQt)^h#%61*XFfoSmYl z1!;n>b7I0q0!9Kx0>vaSmOsk5#3~-wjA6CoyKyctulr)!yv8iTxps+scjr^|_>5;S zIhQza-q)9}dY$fDMV%d(PjQkEevfY)yM^|rTo<%c(2nc<(_m+Ud0|)R>+>o4K6<;_ z>`zg$i}TmhxnKWbkg!uA-zYmJ?ml|t3q2n&ZLh2s>R<8J^Zt}(b01ci8YABIE+6o@ z#E@@nJ7s5|>=a)3)pkj;OH_hYi%$ag`kwpY(W$d?pEdI-No6^3c1l$K_P1zJ5Jn_uB2)9#$!mux{Uv}5k!FLRs&IRohwBvgJlsglUv+6T5 zF4jxX*XT*H zTu2;#pZ~n7w{l-pzI}u8(>F@^%gWE+to+GjeXa6C&^xbKE?qD$~B z7OCCB4+-=w@{Ox+v=0NN@BAUAJ}=a3)SKSx8}f~-Z(I5S1EufuFHJu-O1p*cd#`WE zH?F?X-y1M}n|<|#YK?r8K;I(YxcWxFexUT-W!C*gYPax1@AVD&#?^OP?6-l^cg1pZ zzF(nUqu%sh-;i%yecNKE5178kn*Lgpb_?Gp(6`99Cw(uzuSl?)BXzV_`+>`UlgEd`!P=^6E5-<`NauVQXMb4d%F<;)p z{=*{Df`_sGrsdJC7$d~)4YV873LRrdI$DJ=nzR>dlV?&FC9IDG=Q*}#8an#20Ws1}`IkaL z^yQ6{N7Hv2J0+k6eZxN}(2`-h|}=$UX?e`M_D%EAowPr;JW&r_?pH zUy@mAO+6*ZNc>Qwo$~egIO4=~>hSz}Ro@Ntc_M`j`E_VnFCO?zP0-Hwf7hQG8}yBD zc;^pu+4M>$$LLQtaCQoFiFAbd{h11b%SgaTV6aPIxHX!SxYwPNQbg_n8-sa=oub2V z4L{V*Ny%*p+9_zq_5NwFGr?^MyFy>LQwq*WNtts}lj{CELSN;VXgj51wwX@}YOq+Sclm(r6v#KWopM-WJEgtha%;-eL|0=u zX%1E`J~8~O@3|iyojNQ1wRgu(@yZA|_v_HuDM7o0W#pHS{tOu!-$=knz(^pD1Ux&% zDpOaxa-CdQFRStQ=yhLQ7Zr2*_vrbQFxo!MI-PyiPQlqI@y*eR~`dwyW~hW!d5VW&X8QFcn) zbzjIAdOl#vUU@6jzv8Ut`4sy-WVQ_zm<{ZsBt^vnJfW2ZzZBjkOSbRPCAj0!s?*TZ~DTssB%LeB?Gxj*cbE_0q^ zp%NqCgyjK#SLk4;K)$ip8{vs3JE2JIBI<9h$JzwDH}u~Qty#rxxLr~S``(6Cb=-#*W$ zNWReX0aNY|JEi$>GoMnZ#i%!a-TR*loP0a+Al5S zsK+;vcFO%dg7zwc)86DCG=d6c%%hQjk-%Oo0nbhWlY4qT=gSP zvp+@GLUh>QC-pxULcmUeeEVvrAYbVDfGPKfol^0@n+@i?uR=YBzwztd|6CXwb_(Ph z+fJ!YY^Su-abNA_>4x^ELU!W3iL_H5hyxuzj#KZaA2D`He31oX8apK@4-+yHFcR2n zB|zPjZ0fzl-rjYOZ)9`l+9e`UH|+Jd)E5r#CHv?dhL9q4-WSa$_2C}h^d;f<_}Y&J z?G&`*djFJp@#MvQC3b~=*#4BsvOnc;-k)OZ6eYS?fBk(@|8pTQ>=ekiuXYOZg`N+X za-4ji@-EgNW>flkUlr#5vqB|CzVYkc|6B;*+9@L6p6nEk&k9BT5WL41v#HmHw{s^WRp!{XGdksr=j~<)^pE z_pS1MoALvQeF2t>bFZt=K{@FCJ-)>yl{fc%`lQ~|qd%|wfA+ovK$4gy*OUJ%q%@_ z%b_0tUzdKsd_$k|;=6S7-Tr&*HeD$xI>&n4&JMnTuPfgeH}c|p(SO&{CMz{X=U9*1 z0^l3?y7GUeaH>m2KGTMB#wUst}HY8{Xl-;<}Fw%*@wxA{s= z(K*)Rc5d(ud|mm*dM_`&hd<)|D>hqcDLTh`+|Ccafv+pySl8#p_o9D4$tEi`Mdw(L z+XCPl_`32PDElohz60++waH3N(K*)RwgC7BzOH;Xm7Sg!-=&ZG@!V!BEk);8kK6gd zH}LJocl&pIOMUvwPn)SuH|+K}q~LbDmGxs*N?!@$K38~yy#KURzbCR(ud6TSy|72X zBe1(6KzEhzm;UlS_e`Gg+Wv7xRQuTUWbpA)^_PcJ$^P=vjdI@R^^Ncksd*ghQ((l< zBA(UX~T1^Y8dVFHAk)Qe5;v zcExmmdGIlBrwB@%{^;E6aa$O63h?b_r*M8I6yrl){_^wca7+}qQ`AP^aJ4Q(htP^r}QZ=zJqUgf11r!T8hrG9=G#@Z{X|7H^z;;_+EH| z@833CX(>9#dfd(rzJaeR-*5h`5@C|%j`Nq0FFTP9r z`T5&sD=kImSdZKJ!8h=A<-4Tpx4ifcy**}=m71b+tjBEu@C|%j`3{two)_PX@AvC9 zo2|4Iont+2=Lg@ww;SJWfBBj|{pD+CCVF$1ix0rt7eXl?PfYDOQQV7d?vnSPma1QQ zsa{vltb0L^fJb0=M1b5C-d`U13=kuH{bvNB#9{S%ulu$YS)w$Q>wlM4z;M>hk;rvV}#s}M9UT8mGq}LYdfSwwU z2ihUVGMOa(<%bFdHLnM{BXd4PD+5ukJNTg-x0*kaVd?ua41cVSe=5V^-(=XlTb*B2 z=YJtXlxc<-4^a>L!Jz%+P5=Ii34MoSU03wDErNakd|mp1nE#YM<;8dD2mXG$%~o29 z&aoc1^Mh~T>&iFAjlB2{HhF)V%~o29&aoc1^Mh~T>&iFghu-qSH7{{%Zu-D!TVQiw$f5`j`g^m zAAAE}SH7{X&x`Mp|9*r`R%(jQu^zVtz&G%98$87=d4Sc)t-S(HitY3e5qc*d#VmGLJO8gd;mj7}sK7gpW zpBDU5-hW!Ee&wZlT?63X7vT}`2<$!xkh{YB%U%3MSybX6%8VUyn7{|&FArvt{pHR7 zl=C*PZ`faec^vCgTqm~$@lJlyZvOJ%MgDiAz;E|ZUz6%_Tax)>e>w2w^=Uu;a_EJr z2VAp@9!TBo;4dE@KhwXL!)Ur}I`?|qmW7=XDtx=yDV(1P#rRe)$Law{?Uvk_Eek;T9*D`GWP96VVhNXLD82nM4|6g_f|755Y z8;fE*L_O#SgZ7s%9_IT&4ET-*y6)?7TL}FC_`381G5;xj%8l>GH2t_|)0L8}|dkzOH;@+{laX;6Tr}%~o29&aoc1^Mh~T>&iFghu-aI>&n4&JVtU zuPfhJ*XPFf|MPs?Y^9~>9P4pAf17WGuPfh8WxwUcchmE2la-pHbF9a00q_lcUHJ}` zot_up!%y=4+h!{*Mdw(L+xfva@a@KT+h0D>tH1pC>eQ6ojtnW$?I}a(6UK3$hvI%( zsU`0}Juv;sjDXI+87~x;>UH(Wy%+Zgcm#GU1ooq=oi83te_ejR{DqWnVq&6r>n*pe zvd7p?!0{NYZ}fh(eyHN~{q!RHPa@x-mB}clU>>&xxSadr_t@X|s$UB1`gy;+eUY)q zd@Q1K>1X1nd;x>ujgY_G70E9bK!G z;|*~?O0`q2a4*9prx^E}d&=?dfw`Vf(}O5|sa}^0!9I^iz$4%hPzca6Wxlu%9k|#j z!;}wp%AJ4sv-qA9!p?}A^Ki1A!ez*H(;l=XmT1}~?PD`LAKxGCltDb#TbfONt~cB} zZl_=#H`k|wvQt8Drz9$Aa$>aph}$c6ZrCZnw_iI2dSU7T*Btd5^iezPW~YSSPO(W$ zP06MQ%cvaS+s#g4yfryIALDg zcS5cQBcg>|M-a$ytNCCVmiCol_)vBHa2W=Vlwor}b$)+!{s0+j#m1tHi+Ijc)q{R8 z=;wM%r+s;?f4)5ieTM^GSM<0o0(%|!y7U9)8~T(N-wU2^o2=9nont+23xIFn>&iFA zjlB47dcJM4Qd4w}^|&nnzJaeR-v3BOd;?!szDsHy zkQd*jHJ)#qt+W)KV?A!?2j9Tgm2a%~^5Q%6eA{HDrsy2&aa#a<17BCZv98aH?_jO( z-!@xmDLTh`+|Ccafv+pyp|aod;(OThZIhLnqI0arZ2|BNd|ml2DLXwcz85{;Hd(1D zI>&n4769MCw;SK>=Xzh+kH7pG$5kq`mFdFahaX`#sar~_zx&iy8&+QTL2<+Yn@U$YI>)rPd`Q#w`FLXZ%@L_*R+H<`tR;+0It&u+-@_ejs z$^LSFt~bf2qDgW&v7LN8~%Yc1hG?8v=0+F`^)#g z;GAN8@=+sKzW3Lw`1u3#m^eAM^PbeQ`C{{Na^B|kjqnetc^vCgTqn0BXcqx)?6BK& zy-n{gZ=={f!uTfbwj}e%&-DUdUZ3{!Trc#()B~;=Iw9M}DYhO+-A#Y4H#ptjhhXH~ zwj><@=J66>rvP7PJLSTj?UboA9((Sk^?j70>t>;F=Ob@g9Ul+$^Zmq8pAS6(9s!R)Hw1WE8N~aCh1lBPu9e3$ zeM`4f^ykNP2^HsZV!O9ffYN-i^n|#bf_dCrpAO1S3D)@U^#c9wVcNWIOTtb8zWv%M z&} z{`Eus=SBTYxk3FWYE`-Jbgjy`2Jj9m2T&OWc8ZTpa!s z;M=dA0=+QxfNOQp1F5^|c1r2R{<*I>gPo4D=>gj*z_**7!g|AmVtl}NQqY=9wr>~r zba0F?(gCE{;p6P2SjxV!BOJ^ZG4634Uq!MOa(eTx<+v3dD#PFq8J3=^j-MvO=F?>u z9;VJ8uFfARL#^0YlyMQ?%~18AA7uYdN~~DxVDb##4=hkp6SDUM;Oo*4m~ZG)UVJZj zzEjz?Ph{sC_`33qaU(Cj7d_uLt*I&5`3AnOd}Dsdi|^qx{dk^AuXQ3j-@wqK_Gfv+pySl8#pcggc@v6`Ncop0dl z%6CcGZ+Y<@dcM=?wa#Sc8~D2N9Vk0JFTNK%-xjOs3EBAuzTNn4e<$Swz52^foSvXJ z5G(Yl6cJ{B#22@ntjqtjmC{#&xOd)MA@4se)$fTc)$8huc`xh{@CfW?2=KIW|9by0 z`W{3g6_&sJf%#moxHh_$`J#NT*F0w5WT!m|oB3jRl$^KQ{vkDwV|@z07_%O<@q0{JFjy-RwcFJdZE;3P2j9H~;dpji&9fw5!T(1L2K8r`d zBXEB}fR-uqMS5WMK6tKIzue^Sq;QUC-K6Jl$JLtJJ~rj}IOTheZDEeMJ=Yr(>3VPw z<-m^2n7{||TyL|M{9JGFw{bfK^SHS_<+en4+4hNS^L(+Jof53|-$?<#-9vL-iep=n z*Qac!0AF68M)rG~FZbVRS9)RU0oUxJ2U2&_?Udl}ynmdrblbqY8QRjYQ-E(bJB9Nz zp%@?VT(5lJ0rlDSL^@!fLkhoV!SA5!+lm!ewVxCIYjNWPb<7uM_TTHdJhx!nV>vyJ za=7mBd2-w;jmWV192o|y)$!3X43Cvz>G|sX3F>@FhA7hv85i-Kr>Y12AnS9z@(YMj zKe+6Vn|8kBsxMso^w(Z}?b_<}&XwQ4$N&DJ34ZEvq${i^(QXSce}_;q@a2ABzV}nw z^kgdII;D>&uTTK@(5+s%-%}eY?G_da!+s1*f+Zyl{FtGgo%!Q?HNe+p3>44st1%=m zzDu5Oo2=9nlV=>;0^l3?y7G;=qIbUSw&*FL=Ua!POC0=~p)Cf!fv+pyO|>S-i|+-` zw@p@RipevMZ2|BNd|mm*+AlA@o1Sl*tke|nYlgM}_y)eNd}EED7vGDXZ=0;t6q9Eh z+XCPl_`32PC|fQszJpPJkHTgvEd~6Vp`9Om17BCZo62U-i|>->+a@bD#pD^swgC7B zzTNn4KjZtEK7HpyYi8y)u(o90l5RVRLOz?hsEz`{Hxa%--iunQ&%!R%>*~m?Kj{(h z2zUhI2$1W-`_5f_M{(FXA00%eu_GrY@Im;_gGRFNymXSBw|RXdd_`&=$NCi4$!$Sg z`YgDWyk3fj-F)XI?>m=}IsL_Y)C_H5=1+XPSK-U+(|&yC&rkMQW*cO1D0(`sKDV(1P#rOcx|C*=DaVvb041-f-SX!%&Uo6As88Qslsq-&Y=U*m6E-z`r zc!+w?5Bl|;f9_f9cCLTagLi)M=xeS$>xY|mPI}*Y68tG?x~}MPJ3I5ozH{Kq{lL_v zTW@(7y)SdO@SR_>{UxM-QU}33bgNhHyZO!+{1|8xmztvUt;cNv=8t{nz}ICA}PR6DyB}M00kK5V7H}G}k8*@ePeA{i&Q-(d?Ivic%I>&n476aeF*Ol); ztqJntJGkO*-@k3TQc`q|^|+lKd;?!szOnYpi|=92w@p@Riq5efw*|mA@O9-IYy7X&uSdZHR;2Ze5@*OCfJukjP&$mrh zYKqRW9=8R+H}LJociVS*Tfsq6z$m*GkEu^w&l{)4N*d?R@%Z>uL@kS8iP$df&N(&grkd zCe`D%F!RU0bKuMCQ^^JAZS&>)-g&6>!qfvU4LYHfYw3g3-AE5i-}!>KQy5CeP3K;Z z+v2cOfUmQia&ymiN_E3zgT9Y-l-(G&6by4#?$22%eI*DTEtTbXw}+<1eU+LZ%-@l+ zw>WQiKJup3@&2QqH{)Cyry(@sIOe_?^-h_8aDVgrK9+u6=Cw!HHn=PCC3yrq0!tZz zy$cWH%PSsCfA&@jAs!i%M#pY;3Kx{Vnd4Ksosv|yR<0V~+bKnS$G4rLB3#b>$5*sm9`l;8({5fZAI}$qvACUrdE8u|#upRd#tuz8tG%2@z$365B0$TO`Qks)h3~Bl6<)VQYnKQS zwo`^_=XEsuE$;lopK1L)Uql$?Op0L*gmcMu3ZG4?8&VWnb_&j!a(sM0u~S47F@X=_ zUBuE{^1F!PMBGlnJZ`Q}xh)Z1;KmM3JH_;;1gHD&_(K1>hm3F1ZcD;W0lsN=%I%lU zw(XR+TtAm;r$8@EJ>Z&M^g!xvx}CDIB#@qN#F5Rx5A=ADaQI2yj+f3&5bfFP0BFb zq>g7~7`#G;&6+yjQ0F(xFjla3(6-lAJ?IBn-$mS8v^MGoC+sz|b8Os1fBy_Xn#(!a-&#A9+A_%TB}H^xKY>oOklb0rv0^5T2g^KFxrnqu;dV_N`x17BCZ zF>mzFx7`*!rR4e6;ph?vzh-EQfp6gJ%6Cbv5Ax!B((`STm6~GmjAL5>d;?!szOfF> zi|^3$ZIhLn0)EZV769MC*OhOq_w(X=!SijCm6~GmjAL5>d;?!szC&f#<;8c?^KFxr zngV{!&=vsSz}J=UlCt0P;(O8aZIhLnV)Be*TL63m-)?-j-%I>qpMLaXC#&_!l-;22 zDYy-9<@~&r(pQ4G_YiE6_obHV`+H0Ey82??3ws1S0=pXmbeGZl(b<rpebMVUYGUZTR6*Qb#W zlI3}ucYZGsdSU7Tmja!TzARBL%5R6={OG}z-fzUnxosx@IJTu>rvTq>b_(ZbLNPwT zk1k7&>iKB-iOj9ySJwf%4M^cPLrg!q?w3C_;GC!<`S)=5L19|R`d9jUIc^2#$uNAC z44d=n_iipIs1+NFVmw4W=m%N-=;rU?9{J55UHg`iiJc$*+?hM? z{_cZ!Zu8&tjp5$;Akr0GZ<1t~zeDH*@a2ABzb!gH621F_vLoL)bgNhH&1WcHwpiKu z#v^}x?E&vQZ|CfHMz3l5xiE>klr->ThIV%5p65c~8=nhh{xv(^*M5fL_rp&t((@GU zxeN0e#sG{hz3M@?XDEjKTxgS+nqu;gV_Sgv6TgeB@O7CB#kV=s9MU`Ac3bq6lIL58 zqe~q8nxQQQzJaeR-=SJ7>_i2EN_+Zu`_1d-ti=H`?vUkb+zCmdF>Zl)e&#En0e$ zyhpWEea}nvy82??3ws1S0=pRk`_uK}Tffq4$3Bk8&lbVa`5Rh=wtps)&|^Fo>s#`> z>HMwVM^m;W-;0vwa?D+v;x@~7FlA0YPI)&y))v0%r0bQX^!E2462p!XFo8>-`f6%} z+~qg3%;Qeq&%(QrC>bGrL+c;pyv^$y@lKYS$FV-eb#hxC1To)rGh`*+jZFm{bFu1UKs$o#P%AyD}8`c!hkdE5Lr`_!QqrXFx<&t4EtR+2f80M@3uCY@3N)S5QyjYHRd4ChvZmG^; zq2Ryu8^0A`n?bAl>6*kzu{Zsb_(WkbA1|LOkj;>?Mp+0ma8E7i?TnWx`;IQV&m!q95z2ZOmC2jx`&SMf^&-X$w!S``QBfzVm!@b!q)gr5|q*@B!9{~<8}(>adUmjZ5f0=CG>VmCqj&K zSdW^ak&O;vrvTqHJH_=|zt9U)54h&2ucMFJq14^TuV(&s;-t4zY!XvbO#X3f3&2hR zzRq^azE3>;ediSlFN*PNmv5#Vv*u*BQ)Z{OnrEDkG0a&4JFS$y5_s${G~ea@DZQeY zpPj-jf=(xey|&oPc?3KHyCVX7`QJ_~xY;S$v;#H@hqT>y{*-@;+bNjG&Gl(~F~M^Q zZ+6(tpVIVpiiFPTZ_=C%%;N>XP657Yc8aqkDRBZj9%a)5et#VJ zI@>Ax^<}5jD)ph`s&(?Jj8!&OrW-@gua)bSTE~mR$@tKMR0^-t;sc0^F{`xQ`%`+w zGCw;dO~3W@UR&+uJOUnp-46ktRw922Uq7!~qO}XB$gT7HDaq?C$VO{mq@?>(o`fvP zAt^up8wt}E*6=)-m>bvNCgvf%9$hSG7iIQ%KV z*V#^a{9x^rwVNtsH#4PxVa~dkFIp*mB?vpE`5tel^opXlQ+h?t%XtJm0{1NfJgrDO zr66yfr`joVyeC-)#G+%*eSrbUpobQVd??bJP13b>FpGo#MBg>dp&Loz)k_a&UVTnz1k_K z%#ClT6b?W92)i+EDXDhK^=|U6xx~0%y42e#u7H{Oyq#hq;*UK79)bHO0+F4v_ukS_ z;dM*2c8OZu*`HEq+Y6C|9^?5~-;(VV{@&L^^=x*W%Zcsy-3)HCqdz6qmizj-FZ_nq ziWPNw=jF2J%I|%#ofkVc-cNCPUxoZBABfv2n8(faDYG85u?07FXg>F4e(x*vc1jz? z?h(c}X}2X|rvTr6?G)&RsRvwh)YonPWy|J^a`Bn&Pg(SKicMl_N|Fu$`?wJ76yWP@ zrySO+opM^aI^BpjBHNKvl?0hDC8YI{B*yUOW!_Hd6+>^Q^opF9^9XnZ?pp+OJ4M#q zi=A@G_5+L3UeM=T#4#`HSC(w2aE>SH+3a}CMxoPfn9R8F8F28Yvcg7QO##8xM z41Wqrkzw=P(RKVipZG@pl#j&i6wKr1`jp!e;RSB&u$w<6IMctM66c`P5!Rz-Xv@G( z0lxj(DbNd354dI*J?Lhq40}7pCNVX|+LM)&Y6(-Sm8SWjV@_op0dl$~V?~dGWpI`Htx98q3Z% z@O9-I>-xO-4nFPuXRAp&NuMw#`iI63WaR}J+psIAO7;O>QrHx|Max!x1C}I+z>nJ`#{`J3$K>rFvcc@Zn`W0v>_g4gvBaNZ+;hmk*BngQzI%C>0aL?$-;Wg_V>=Ez?>~083dce(wPH293@=qe2!S%5`bVrsIeS1$H^ItAE__iFkn%|LO>6> z0DN8g0sG6LPkHgZ==rwEN=-3&#<48`zJaeR-xxRY;yd`P_ovxxrKNyhGqm%AZ{X|7 zH|B@D_#XCr+hnDtm^|ay769MC*Ol**S_kCCcggc@la-nRe$CJp0N=pZm2a%~^5T2a z^KFxrnqu;dV_N`x17BCZv98aH@6hvYla-nRe$CJp0N=pZmG4m5Z+Y>(;Q6-6N=-3& z#<48`zJaeR-z8NP{2C`%g>Nue?;RD+A9yt4F{i;1QsCWxjYM;gG+-JU%ZUkb*sY zH~S`^=lRLpMNXF6UHs+YtCIcY&7a75o7Xq&FTgyG^(n9&l)t>`{pHD8nwT2b|F~Z< zF2MY;za04T`m`T^IrPHR1FjW1A=|?#+|GC?7oX|=@S{^p{gniraWYBOQpR>qn2*4-(=@zHrth7%p7L*AnD7y>z!6w}M3(hCh>G^XKaL zKV(??PZNF1sVUj{2EML*W8BD#?~>;`m0kNpcD{kHE8mzO^5T2a^KH|bnv$Jw;OokFsMY~_ z@f~`;Q`xmoWak_By7G+)pe0PTqf7s($6AdR=`n?}a@A9)aBq0iIUoiwDzR z7k~K+DIb2nT>8~8=N1zEFcFxXPv4S%znp$=yttR1&5m<9v7LP6;+;wMyEyvGV{LJJ zzuay}r<8-}BzB65_F)3Y_t;mgs23k{`(@8nzgJ!~j*Z_hXJ4hhC)G~BU;cYJZ@2wJ zY97b>lriFs+Y*Qv{{c64D1Ee%pY*QQc{`sz+Pa#<$CX=G2kZRrm$zZ;8ex2sc3Tks za^TDB(|-Kr&r!>bO3!XF2s7k{&L{! zY^S`uXFFx4-rMuMXgG#B9Jj-p+OdH|#2DWEA8)7hisoPP_po|xvzPM-cm#Gw1bAAJ zb_!qp!)WJqOSE?3RJrjtQ1Z4@xTeR->eBwkY!u4WwmG=Xj&@3{Y&Sb)@ZZ5Q?2;~a zO03B#2lK`74{xbeNNcRK%oR{+mcm(ca1Zc@RUp$a1b@8VRQ$F}p?)<}_$xkp}MA*6A z_T1d<{ln<~ajfJeW2f}-Nur);OVtWUeyDWSJhV#?Y1!0rRm zZn33crvTr6?G)&RsRvxMiypAPP+Q5TC&HrXPnq;~iiF1LZ#F$(e+uyJW~Z>;FrgS9 z%=Zs3*}lE!@AYy!I&IN?4?P!bT&ZWb=%-Yi^)D>!BfhU&+Ea$jKg)3}*jpX%Bg61P zD&K=;7(7&+f0zstiWfG`&4O-;$pH}G}kyQ%E-y!Z}1->K}{C$jSme7o`8e*f?_z52`7l&8mMHdS9) z>Ghkv@|LB2(S@%jr1g;`{N>>zK3a}j;bUYN>@UO8pLg`apd@p*w z6L?Ka%FZ|Nb>$o5MqYdepZET>G&iFQdwKCa>G`&4O-;$pH}G}k8|(VK_zpeasqES(vhxjmUHL94 z`zPkLtqLOq1yep>S&dH-pt`jwaJb@jlv7x4&q1a?~lcv>06_j-Bm?X;Qa)4$jI zh)%^A-|D5TMgP5C07l=zI#|xzZU2y($FV+zUyNA~ASS-e#0TIg3cI~u9=ybVueS|j z*9ha9wA+HrAN$LJFRxGg@s~p{Og-S5p%Y2`^Lb8}i_dg_`J%T|Bvej+lXL)mE?xlZ z0sG5=ud|)<_FnCjwPUsNY~>lJRmvOdz5J|5`ggEyjbB>7M`FGy{k6AKdIi#d2dh`) zyqrhCBXHj$5ZNjF9wJvlyl#osE>UavIoq`F^{!a4VqkU(e;2sJ#`VPZ2cn&_{{`n1 z>ywWfx$?cgUd7)PGmmL)X#9?dd7Ok0{jSKNaXSU`xVb(Zl$}!Yc1jWvDQVf(r);MH z-+t{B=!K~V+|a16W36n5-RzX$3;ubh6w(utv*`ibDZtm+PI*u7cFNq;Y~#3E`P_tt zyCg|fNyz!NgtR`A#C+2n_I66I7%PjqIFXu z5-}Tv>%G6*DVLsmiogaFxcvP?acz`7UzERpXdat(iFura4f#`+$L$o% z_PSJ-K40wSPYJ!9l0-yGTDJ8m+bO`eUpobQVd?=lH0p2ZdLVU|b&$7t>wCS!-cFIw zIQ`A02W+PRUuQezUwXDvs+(q~_$S(X-7w5q@=5O=TAADv#F$!oy0=r@A&ckqc1j!% zf8-JH2;5&0;Av$L&wUldypevDSOXzP@^fE&_L0bv9CAJ8E^_jE>w)w8hpXut94mE*vRV*JL-PC7bf&DyEzcx7l!WvaX- zDMRa>~XlkJr2cU)QIx>F}RX`|>B zwV(Ua6FJW1Pa?{-M9IdZR`FXedz6!BpOrF zvgrZew*kJ+cFG5Pw^L?j8k2n(D)FI3L*QFld;n3Q_swU?>s+ee#agP@H30s75gq}L zz;1&8Pb+xtOI|duTcWi~1jIfRO|w%5`5t}hL?@fV^HXg93%{Qt+M-OnHdwGxIHWCR zr||nJ=6mzzF>zw}Q_N#oaQrX%Q&z_96wKr1`jjya+QRAUQ`1hlt99Par;oO-=J0Xl z*43f6Q`#tYk7Qe)iuY3#zG-%f>+fShFHAk)Hb;FuT@PfRWF6$qem`Zw+bI$nr@z_s zfbA6E>ujf7-k+V)>yP+SQ&WfUZ#!Y*oJrUzrRR7%#ThXpV}AaWH2v1ojmG#xkAO$O zBan^&%`5Z81L?fWd-TJUkMH;MdmwlI;m_==C?ZU+g3stc5;MeX6v`py zE6&Ms51jW?$e(oijU&7>o`^F}$^I0+!e}d8tBB68oEA`&)3$`%)DZsa1I|X`S>H*j6q6gjVl%}^+Y!XvbvgrZaDZsazox*y< zgkpR!f5-Qd?b{Q5%8?GFHoEZW^i$$Y^uC*(QTpO|9N{{e`Y9FX^sp$$tOnsk^zZmC`hJi`K|*@=egJ%3`T_F| zeaegP;2Qs(!vtbelCtv+d|mm*xRDp%!=CRHZj+L;^9_7m`NsT^7vCk%cM`EFY1#P( zzOH;X)jA+Az9&83DcmL{XXhLEy7GMzZCM9R*8~AqPyZt-9JLG+t z9=?+@UEWw3D$UGn?D5&&RDbz*lA!24P24*VPnOrYRG)ucs@K&!?OxI&;1Srp5a9We zrxiTcE4`!azu?{6_&eok&-F&WR#OVcT$jG3zkm2}J)0fpa$@^m__jmmW4@FU_4aX(76Q@-n7hD%PNqrr>hbw04ZC&HHpzM%_9 z(~r4tM!nMolq`Ajd#=~K7F-j;EUol;Jpvv9kAVAkQtm4|g-7NNqqAB=wVCtZNohkd zUu>?4+bNjG&Gl(~F~Rc(Z+2+fDb{yVyqzMUbNY*U+6--B*eNB2Z^c#csoVtp4%U+N6pZdhMf|2u~VG=DM~L)J>Z&M^g#B- z^zWpUyq#i`n3`hpk7HW^b_($AW~Xp|CKThtAm2ZHjNQCgip%?lH^n660qbA$C34&f z&yr!VPKKqk)$yndo9D$oDy}bAi zcKYYQY_`%;OrCLU=Lg@w*OhOq>+|A!*z;|Zm6`&6&CnJA-@w_YZHA_hou`|8Q=7qgEbk z*llr4NpT+(3b#8J;FwML%bOeIb>{v2tKBA@yF%g4N8YqL{=AWX-i&i;oQBYhzgXosf1+HXzx^t(qG-=y7^Wd8VfMSw4_Pm|t1bbYQD zdSU7T*9@JAubuczqz~Qv<)ODz7%;~zNe6&+ya?DSz}MMMxvN(@<@Cyy<7(w|Pk^HO5HC$BY9*A9@5l0v-Vu1Y++W1}wp2 zvOO*r3f@j}!Bgfrhyv^sjeRF2>37<@|E`GJ?;i%6;&uw=adUmji;2BtQ|T|(NOox2 zDduy%!OQ%2Qra+fjhOQ_j%`8MDZn?)PH}y%7kXjp0oNS$b(??LvhMF6E_ge|CNVVy zyqlpd06PWvI@>9~=-E!0td4D*uGH(jzJQo&r+m-8yna%Iozk3^*SS>R(_5<7)erGr z)+68%*zFLYdFB53{$aF!igCj8levowoPT$D|FHSmK7j%_LQ1K{h@ z55)5XN}uxLJGjojzhJYKmI8jw(9RFOfv+py7&r3bd)V`Bla-oc@{D6!0DJ>qSH3Yn zViDnxQQKzJaeR-&oh@#rJ~e+a@bD#pD^swgC7BzOH@22P5CMz`s{FcRB8OOE&_y)e+_-?;{_&a%DCj0w`r%%ppTHoVOABy&; z`pfUIFRz~zaX&3MUtZ@@^(!yc>*|MiFY6KT2<&bM@U${tLtB#hH*gbo#^y@cQ=1|@I~)8Vl3S@lYboB z(y&v2ud|)<=br79>U8hlNZ|`ewNvi2FRz~zF`tANc{`<75cB&^3iP>C*lVl3oJYVT zup1&k%ar@-xn3RJWIKg($aPcncAPFn@tBRGjzt!h+g+aP4K7H2uDA61xSfJ|++3gX zV!~y8+U>dCrnggs?z#O*o40Lg*eSrbUpobQVd??b?4k$V?37_|r`RN>rexCt{+)K< z+s#g4yu$bLj$7fIWf;6c zhNX+u@!|WP{=V}l-w`qlSIDq*lnjGs%P^sMk;J%&=R8$C=m&#-uD9g-K^g@K>Dl`M z@O9}2%s2EYFTN)|-wC{?C1vLu_`33qaU(CjL(g{_xe4jn`3AnOd}Dsdi|+-`cLJ|z zN!j@ZzOH-+Y8{Xl-%ZbV8o3GS+4%;(u6$#?mlxlQp6>)+(~`3D4SZes#=1T)zK5^( z{UT?CRCZ*baAbOTIo*({l;LGdNexB=v zUYL5owL&MNws1Rni^6XH^3dBU5;CX1+4O+@<-oU_odSP3#s|}1e#!Rj;@jb7Gb0@^ z&qT)uM$yDrH-9{X>U>F^e}N1WiWf;3 z4^a>L!Jz%+3%(zuQIL?Hy&nKymwq6gk5KxQ7vD|KcLJ|zN!j@ZzOH;@+{laXMbCE{ zxe4jn`3AnOd}Dsdi|^n|-oKJSY)VpgzJaeR-zBvU$cyh`&vy#9Ny*vy2EML*W4)Ib z-zCp?60s?1+4%;(u6$!%pBLYgp6?WHlajOZ4SZes4we0u7vG`hJBiqowCsEXUst|M z%1+OV?*-3y3b#qg+4%;(-S}?%%lDV}WwQIrTIl`TU@Z?4qJ8!Aby?~<14FaJRo z!HlQHz0%+$d7Vquue?;RD_xjNwJe z{_^I@a^7zHhtxcd^(p*fgYuV`yuVym>MrqY>r?&?7VzcuX+QpQ=!K~V++gU0?jPrL z{kWUIyy@)}37OO1YIS{R~Wak_By7G;2BQL&(J>Twhi|6fD`r~dNDjTdLf`^yQB=IfIEe= z;&-DIzPvu|$6pS;F!g|&3!TvY;1K)0ZxBcZ$k@sbK_Lm=5E1#Rx^zLb?{_-Dnm(7wx+#?NZ@;aBQ zUwNrsR~DjuUXOrBV7EsgxS#sV(}?l@azZ8ull|qThMc$C{vkDwV|@zW=%D=NP46#H z)6<0XZ0l3@mjhp3pZ4P~hhCU^z>S1X^y4otc{_!nblkG(0sG5=Z#O#y{&I{DgY=gt z{r0$i!7l#taa};gS^t{n%5f{)D#Kv23`?(4$A2%w=4)ga&a3n1tMeDiFrj#ngz*sd zpdSp{Uq0#kK^g@K>Dl`M@O9}2;`hsyKIO%C==o0IH7zMS-@wrP9rxV zJv-mP*OhO~4|(z3^n54qnwFHEZ{X|7cc9h*dGWpI`A#D@Aw4_az}J;;toQQbJGjyN z(-MeHNy^SQ@O9-I>-xO-9`<~vaGR8zop0dl%6CcGZ+Y=u@_Z)|o068DZ{X|7ccAR_ zy!f8{NLy={1X_3)0h4{pEM*x%!U_e|hsF zd7Vquue?;RtAF}^2_6BDz;1*02`tg^C-cDgC9k*v-)xv~BQZ<6Cy^UX3Wy+MZI#p?L2G7R1>!{$5G`FE-F|0F}R zY#d`eL_O#SgZ7s%_Q`Q>*X6*k&*BmA2zUg5 zKyW|xmq+eFv{Z)PUrsoLZ%p==H!qR%cH2Ls=5ee~;Ts*4zr5uA<#Fxoc$DpaBKymM zFRxFd4#DN{Ha~LvWwR>2y7-ps=T@n7l~yP~51<#O9&mo>L_hxWrngfh^iF@X=>hx8 zfp0fE1^#l34}Ra^vz(Bs!VfKCid|mp1`2BLFPkHej z+~oafofwXv%g#6Ob>$o5MqYdmd%ok8c09_?H}G}k8}mb6e3v}m9T|?F%+5FPb>%x$ z>wvuYp7eajDeZWaop0dl$~V?~dGWpA`R>SY{A6~%fv+pySl8#pchmD7r?lfycD{kH zE8k6JzvadEqUXCK!|{{Z`3AnOe22$;MC)-(&wtCrGlN6ZeKnf0Ea^RQ<|J^}4dt?Ik<{9)aB$0dm957Y`%=_TF21 z5!? zw+ngs`1&1JavMi>J@O`!nWwnD@l|)JlXA=#A9DM_&npy$Ru>AZ#T;pu6r~(QQS3;C zujSTTP7=5saQTfRyfdDNb3J@a;j!@@rO2@PreuG4@Mk%1xBWwE9>@9=*U4=`oa>aO z+M(14ZVPYo#k*SP?R@%Z>uL@kS8iP$dVjfu#_2EPo3z`)%%AxEa)mFiPbC+ex6PBY zzZ`mD>H(MLq6boUBR%---bd}^{dZ~~_I3(G>9{57062{o!Fs^{a^Ty|PT~AaD8`3D z`pcgfZ<=+~&0o%X_Vh^E+VY$f?(v}0-*+DQ&G(XFvn9u|U>|k7uMERL<$H(>gNLc} z50_!PP$Poz5cQxR4BB5l>HC3!e5b?g{Q&s7^aJtx&iFA zjlB3?@O&Gbb~?wvuYUi5q$oOU|Q&NuLN zisL77>=LI&NuLN<-4TT^?C6vU+VLnm-@w=X8oE-1wNl&@n%}=?Enm;B-^vh@e1B<(4sd=g#rb;gRrx8ZHXU>M zKGP7LK|aWZKal04yx;w%R>aN)p+4k;+zus&@)qx&C}P*;kPmW;N)F}S`MsAEvFmck z2f1ZGl0)zE-3FG-u$p4c3lqnAh%Mx7;#)>K*mXJNgWNhL zhw`>>+ctt-mqR|tg-Q@f^8W9CUse3oFQu=M9@lrx(zu@O*Kd;1BsA z7b-cF$9UfTv+?4mu38b3Lq5puP;w}b<-UK%ON(Fl{BvV+$OpMaC5Q4@?#tI7Q+&(C zkBG@3ALN$(O!Yq{f5)zM#kaoYk;PA3et8T}-iDz0X&fpatlfh<#AoCpP&BJGh^*UKFIA-awu=tZMTiQ|I#5brs?fO zKF9_Cruv_fC%qnd+gsnd>iX+e$NDYuL2jjzLwP^{_YK8czxqOfsa_xQL2gpXp}cQ@ z^F=~exX5E4ful(c@#X^gpHHq{Z`5@O+awzY6x1U+0@w)iQD-Mrc zAM!!&UL}X}cpMbiDKjeel@ZGBaDS6gUT$?V3e2`nGzXcye309sKNrw z{~6)AoyPju^&ubRno17!^7`ZbmtM-(7n4Ii$la^tP@a6YWxn{QKmIW$hkTG5{<-RZ zN*;2I32*2}$OpM~N)F`-IW@NEa>xg{P|2Y@mg6>>?LgbCZ#QGLhF zTdCww-Z#H~s<5X`9*_@mlS&Td{p&}U7jL@p1e(X<{2?FYwkbK3ch9eWH6qqnh8*%i zuBqfu9<3u+(HK7>v59a&KFHmx^9Z+B#}oM=H~dT0|CIbSUw9sm6C=O+ zu7k(j4}I{1F*)ReT&Uzw-cRm2XBF@7dglQ#Ipl-f4kd^3?)lYp z@qhk%uK1gKt@*4E& z&;4yo4*4KgQgSHoj$OM(F8}!7&>Hmkm>lv!Zi|vbc^6%H;mAin^3>uLpLj-04*4Lr zpyW^<^C0@JvCcw1$n8>cDDNF_fBVQczV@||&+XU|;{o{~7yL@~KPCUU9V7sC_z zAlFoKsF$u!$gr;I*N1$NyI0AfyiZ(yn7DuTnNJ@TlS4kp4gXs8KPAuoj%_%$ANBf> z4|4029Li&xBYgdXEc*!gAQvh*l*cyCd*1y7%YH{b$n8*aD38Y$uFtglkq>fnA?`#ay4R82Ux?`o@&?BdB&gbE1I|`I%Ro$^PRlD&%%{#+b(=?D|z8O^#RknJ8|a zGmkl^o~Fmmb12o!(47R{*Ob!yIFy?Gez+_(7Mz)7{X z3cq{)7>^OH2lz&pB(8zE#HH})%lpG=H@Dz>5A5sa>%nz$m~`DdewkbN{Rj4S>(|V2 zzCNUZZw}2Z*!Bmp_CsEmkjrq%cVFk>>(lGpi;j8UkM@2xE;Csk^TB+P>iOo|AF{9b zmILx8kDrvf#~y`k%m4Sbr_lJa?zjz)J(NPf^@jk~D3~WYtx*QKh8jLi&Pxb!6(;v+ zAM$l-AFZKIuGA;*!xfbD8Sq?)d6BP!uOWE4yobW==LF1)+vyzlH~y|dr)_qoUKRII zI%RS=x8w3wSzoiSyZ*n$xOF7S^8B5)9agXKot)9lv=&Xvg3ns@1kup_(J=RC%#yJ_Mx4>xxg55 zoHveh8m|pm*Lf~sJA%*iF{ks!an8r*IgRu1&Ksw3Im`#wqqj@vi)rIL^OT4=nK@(m zhtl3@J8W#GHeIRpt>eR=i1)Ew>U$|%KdvXK9jL!w&bAr#Z&Q7oZ^3rbnHQgNa(OnX zVHwjVe{yk5XV)p6WnRvqvVhO?i6gcZcw=02{eWJuK0tRk59 z2hMyB^#T{v%ePT@{@{AK9JGPUV4OJQ^IRTpTo!W(4568{(Er=B@en;P$$ua^w}-iwfP)%5n$(K2a>!g$SMj(lGtaan?$H!0QI zc%59&1S&N1=XK0uG;hO~+$Qc%$)o7+vORug`EsJOc5K-Pe=72`eoT@=;5x5W`hn|( zWcWI%XTcki^-c83p;PA?vvWPIw|{m1yN^1SG&AB)mX)=)uRiTHV!Hc#G~7A-$72fx z-XBJL^B8BbE*XFNp(hlvbJoKZf6IoB`3UPPZ z97k;JQ3$V|5dDsO+}fG3jg^LE5czy45$JWi*!5QVjY{YV`XBTJ_(Fehe8$Yw+@>A| z>p{t*oV^OGy`BJ!9K&UAkMxAcbBx~@&rvnT`S4A091q{B#`Sl^!(+;08#mNu=B9gG zYOVgi2krOh*m&MsiI*O6o*2*1#|1ctynf1mJRib%e#N4=PlbL8e9=#Xi<9R~dg5rN z=6p?d#(w2d;-0FX2A?s<^WJI*{Wl~4Z7f{(j;NoqT?CwNQu97+1P*!q4}F6EK%dZW zp=YRMEv?a~H#8=3oHguMKB`ZS`@x@XX!1HIS|1!gHB-*ML|pLt6hW)Sw!Jg1Pr&I0 zrB5=ev?B|LG){y*L4Tl6C=z;xWBH34ILaROD<9QZ66=UT=~L6|Qv|IR+x4!vJ^`n= zKC!>`Jo1j7cOLX9Q0oU%pR}Syw6|42R7$_{D2eTt)+6`y_6q>XDO~nXkv^@YI$#G~ z7aO0V%CT<6Iu&{a`-V(qv9aE*rWo#nJ(}WFq_we)%Ku!qlh)FGN~$EdP_EaGOlfCY zc_*zssXAR*+t@nQhw+tC_|H?)dr#(hVfAW-PI1p+i6I~FB?>j}gRFky@#b^DoL9=L zIVPbos{DjA54@z3@<$_NJ>%n!l8*4`(SJ)YyYaSC75v4+Z z@VrNM{W-bZsMMp3?#@f3GjH1_z~r2{Rt@**WKxPp+P>+6r3q>Mu>))mw@&mU#Ir{#hwYL z`5V05pZs0F1gL$4=%<7BckNp!li%Y{M~8o-{9MnFVW|9E2>WPyCQ+>OR;Ky8_KEwu z_IXU_;+GZV^R8mPCZ)!8;{Ir$t{0_*m#F)pABgvVoX4owtIO+C7yR9ell)yM7xi=t z=hsSq*Q>i_w9el*{;p-XKl;#6JY&Q73xAiw7xrTC-ejEn^;h*P57@lF3rM(yy^a^_ zwng?L>k0G%dJ_J#)D!eiw8s0pfW+<*ZrdK$6X*r>Bv9iv^arRMSFO)Z(GyjhD%06- zLQ^6A%A*~76s{vXjr`|N_=<6V{0w?*IlD_}(cjMmw6Sp4C6S)+^Jl>6Mp^@yYg-ny z?rSPNf?lC;=o^ktpRA5;oUYV+eR{fId9;HpPoY@`=3i zILvp@ALvu~Dm6Z-aSAmYJvBR7#z7BZzw%L)gB_omUY{apwb-_U;`#)fpigqXgP%+r zpOpSUpMne2_@u@uRB_5oZBsu!#(w3|j)C8|@%jX4W8tnRNBSi0+bEoz@7pLnYU|a9 z)w*2i8!GGf`NV$Z(GHr?2YTP8WV{C-)w6rYwml`%E3uAJIANRuI@Wzar9aT8@FP;6 zFkV4!?cDmhd_`-hC)Maz9_^s#x&~_JmAsu7L94~qeK>CC0Vn8FnwQUp=qf9@Tcu$1fZH@ADh7TYt_<1ja zR*P+WOQcsk?*S)_Q~T3wK{}=MY3OL^6Z8lA6ns+6drHqxg{BWZ-3sVe9_<+Pytm-T zsR&vvw(MUGeNs3a4Ihoh&f^%;6T zc{a;OSo)PmI|i*!O|MT8v|4Q4$Kv_~oOFGPvPbt10;NCDr*MZFpVT-7nYFW(vAL;o zZHPvvp_3|`D;b|x?pGe|7_>eG{(gA`trpvLd0d}>lc7)c{c@#0ZGE~%>66kkRMFOl z)2lr_NYt-9+R@EFoYkKR$#qS#cC-{fW_X;rIg-U;*Pr*6re!0>!RMMX0 zdUO%@E01;zdVHGn`V>K{#kTDq*C*g)j895Jo9~qVK%c^SrB6!FP=%%sLu+Ol<*eUg z?N=V{7_>fxUY{apwb-sl$Mp#~b<-#45A-RRQTL&go}r4<%hMZrd}LM>(XTw(F=+qG zu)kjbXk+2JzmD{Y??VBn_uDR{XWr<9(dieu^HGQH^0pyW}`p!I3d z&wCNHT5Q|n;`#)fy6F@2r>#%h)O{$WXQ)ExQ}nQ0<|pp@l}9@Utxtg;pCV|r*s{mR z^$9rX`t+9T|6BcbleR8b`qS2@e^BF-8mCZ&(1)JxkjoPKl}9_;`ZS>D>_WeeilEhE z>n@JphXPK}CzX7DCBbun_iz1 zq1yJe`1k~zy4{Bgl>R`U!u3j@l%An7p%3a|xn7>Q>sKD_7_^-iczpu2v2fWTkv_4V z2b^5(Jm^tduU?__O6eOaTRT~)^km?v0{WFlJKFQ!fZl&u@aysjS}nHhF_B)0=M5B2 znD#ySa1e^?gviy0_ zpSC_Vls+jvLlsgVdS6KOE01<`TSsN}=QaKK1ZZR7y2r-#2{?6KM=AY*K85N%ZRi;) zc|PuG_V^BQzw&5DH+@1r*D&K9&AmZ}q(hQ=hb=MYN}nM`(rgE03c5 zcbI`hzTvJzBYirYs>1g%uAz_Mi0@@k8h;Px5h~>0Yvbd`s*r!@jgN;^$j`T|q&U9w zbse4L^X7){>b1Xbg72BA@4w+Ye_Y;b62|v6@jd4uRUksHhsS( zf9JQmRXKm6g=yWjop*6UyY`c}1CZN2!# zFK(T7+G(xf;o-j9v3~vf`I~OKsde+sH;bL)H{N(->&svMvS;3-szaQK6cAyQ+1?vav zL$ldz^KjKwSBXBs7@T|VxuQRubkYk24$pn=b9Z*aU}|b=p6mYM4}aL+fAE7Jw0P%q zZX094ZD5>q9)JP&%a4Ej570zVxLpiT?PhPkpM*!Q9-O=!@OzfA+JVy_&C+>;CbNf1J3Z4a@^$z`DqK zfWE*STzl=cVm#o!xPANf)~jFr>ed-&oY8v03trITHazD!&q>q)uAj?C-9P!sPg=bH z^rt^_@4K?r}f&`zP9z!m%g-JKaU4VI>`0o z+ReIu_OqY0c;|F(BkQ7GKlerG0N4My&wWnx!}q=KePS$n*~?zmI`PC4MH~M1Z~xZ$ z`f=@9>SrB9{X8ddA2{o*v%1#Lm@F(T>|~5_{W|^}2mYO|U$399|AGrHXuaemFKLxZ zC2{>vdCF7flknH;H`~C+yfgOP2TcA={COPYF@X7>pPv`=A?oim2F}dP%tHrICx@KI zb+hha9MZ=CUH^D}!20*E|N5^&|F>@4D*8Xy&-$Ns?MMd)s8_EW{h#}vJ`S7xkJkiL zPU{`-ct?w_Nnp?Qcfua^0|Tx%scs#6jKTW&gL#n0KVA!*efHU{#*8x2CFy<$ma6(ty%{DO)XoHSBcsH+|*JQj7;rZ`FANr6O z`^)9BxOQ3#o@bWta*Q_UV;<%{eca_Wh^cq8v$JBpS-yOEPj#bxANj~fc5*uygS0UZ z^WG;u@rf4qc^-3l%tIOdhCDXYx@srs)J`7rdERH8<8=qmd5k;Hx$l4f`^9*(a^=dt zuDMftd2LGb+RlIc$A8@Uwzs`)C#|`6(ipds*8I8E*{MDLTz?3hcryJKGu`+I-hP9) zkMJuhF3Wv^6Hi`KndaX`UsI{iP4)CC>C_AO&(t&igh#+5;1T%CBhVa{zrQm1H0^g- zf&zUBdT*<7l$^S4E6d+a78zKS_T+JxeI59ITxxNdPb{e4Jwj*}Q2NX(&g9>(UHQ9v z67M(TzBR6+(|v0$J9yqt63a2`ZQr-n@+aeBO8R4ufJeY1;1Tc$cmzBG9s!SlN5CWC z5%36j1Rm%J@O=TkpMv`m7tsTB`h5XD&%Ymy`x*S3!}|Gd*Z=dqC`ZTpFx^V%e4g94 zjs}JR)K9r1hi2C?}+djABPC5FB$-DO`Y`OcceNYtlzqNGYl%r36{$uFD z-{lk4TD?(NK2_$wZ}%H$*)E!S%0t%cap=u~C8u&GLWc}t-_Gtn63 z0~z6zMrF1wAj_>x&utp5HY%IyqZBJFkB()NR-9d!tyRXV{6(RtYSpIk(WvduqPEY@ z(B~Ve;Tvi*bFeD`wFZewi6g0IDv>W@v{sp@)GG9e>rsJSJAG<~KFclB?5tIC zJrX#o2$@x;wdJF7tK(5^Dl4Thm9yo>WTD-_y2OtfC(h9acO_WM+eHzuoV!u2)C1%jPoUr%}}Pw zcspslN|ZI)hjcA6p;p;co@F}D<*S>}iSv*Xxyr#8whPJW}DTZljcm$|+BcsbF-D zu3=_$ZhCxXbat*jiRAJGk*+1z>4#fMT}J1)7X2b;HdksjQt(l#nyz+hVfjq0x`FFi zKD%|aI<3A=&Mo89qvux28zV{!fI{?(QN9$GoT$>zce2Ka_8)QhkpvN^F&(4j_4Tu4 z((>6dDF&-yd2C~4oO4J_4?l}8nRI8C8o+u$ZRFOA45SnKA=-uFRnbVUjtdPt>seIb zxn~jcll+I3oWrq6{^%QZ8Df(zbki&+k~WMrL}bJ4T!XsFT&*H9&zwa)Pj;v}_k|6l zTO?I$j84>eR3LY`ijB=o&D1#eRCT&C+GziBt`Z*Iynd#ze0{kwHc7BglSaw7=&Pi7 ztXBnrmFSuxCdLU7qwk545{l^NYUNzfVa3t<^2SPZRG*M}Dk@w*CXdS$@|eKQqaTW< z_Dzdl9*T}B`81+YrqS^^>ankwD>n-3*Uyk-y|RISX1cBpsk88C zN4SuN&~LcbxQ7cyMJHJN6W9AhnqWkt*Wl4K=8h$SD%*l_{JbuazaHqP61ea=zHY^0CS4)HoH{ zs8uS3x(b(XV(jVU91RaNSj%vABdY0BdC^2Efz_mmAR>k z)TNm*K3}iCvce&ybHHry2t@gh-cqe|5=W;uP+y|RrkU}IP;&;D@^Mz+tq#ZO2g9|q z;;>P!PHAZZsOt1)y@1II&5l%?D2?;;!BllqwL$Y+6fbY#c%7!t3I4PcA5=FIKNV7b zicu5KtyDKmHYiSALB(q`Q&UG!^QUO08k?(auADf%4w0A0$f3jga|?;tw8f_jYBb55DhXcZxNxAov2jC*VA~* z>kp&}L?@`UJlQS?Zf*?2ZNQA`MO zmGNxS^~wgC7zE;VnnfyNz$8W5I4b02J{tQsA4yGMFlotD9lrRCh-<<;34ZJaq4kV*XzSdp6W1W1dd%9hzO z&kVeFHfk0<#Nf)%MI#O+&b>lVoDSZDCm<2V@%8EF}X@)WgHbE zw6HFS&ZFjN8k=a~o~|>VJb1|gP&9?{KkKNoX)VVT(!f40n5Kb=XK12MEZepgCTMZW z+C3_+yg;+_hDxJ;*2=TFTa2nhq0M3?T&tD|_IiOhqG^fO7-t=M6tm0;qhmAN-9@xs zCB$jrUl|iCgYg>m%9^?^?g`7+S6)fXP0TjXDK=KNO6`|R7-}VV16Hrm`X*XWPFANk z6a=|yks}5W$pLGkn3hK;59+6^&4mfoFGZSI#>f>3uSK{avKLZ>k873L z3QgT|LK500pp`9aqkM$8z&d56EVn*C{JVr+JAcMkvvJMNAY& z5YR;m#g|bmHpNPWNtEkbDp#|?)C!LIrS38#%A_mcVNg!B4VrT4+NY<=qogil8zmMp zE?|+(lN{9xsFbqN(9OK5v6u=OjbPv-4GKPtdh7D?c!L@}RcSPMM&S#V!y^y-ymSys zDHaG~EaIuFfEf~#qgXQWG`!+$9`mcyla*SvAy-(c@6j3yQe}!mlH<|*%}1gF8k`yh zHDzug`+?RWuarTJ3==M>z!5H`K!X@5tg&FD_4+I^BrE4GcH~(!rpjfSP&v`btf7b}X`rV?vR6i$GG~iJ>@lqQL0LnUiC3<`knY^}umnFAKWFLQGIaX|yPt zrrE4cV=I|HYzNVR!ZL?5zC2Bf_RHm@Xb&rph|r|mCJs}xksyq3Ef-I2bR}fgp^IxL z+lnl39-XU`=_jK!H1XP#j>}sr^-)?bRmCjC&94hfgy&pZSwgQwT-LLEJy$_yp)i&C zVpu0>>Y=G+YDQRTh{^#f8c3JZNHa+b61vXWtz^;B3X5#GvC1^vt{^+TJ$JLsPO||i z38kqOY1?=biZ0DjqzOcoiHbD+{z$FDOIe~;ifN|=L@UU^s?my;29ouK37YmX!quxA zrpdS<0;gtXHjb8s_R^9{ta-);BZ*iG?Fgh{!%2$$&R<9Q} z&rHpcna5KM4aGz+*)h~4St40dG>LCeW4p*dDHpcu%hMZqte>s&lDE8JgPLi$QFAnY zZKY1i7G1eo<6A?c@-oCxd5dvGA~GMHDQ}iCbiblL!`O)h5H*Vy8!w+D+gTPQj%k5s z9&%Cbb6l1|pAwWtYl0`HoM)-`+Y~uA9u^{rO6dLH|nnRW@rq!vhI|3Ds%3eK1<*r5YhNw|P`Hy0E?`1}nb9NcWfOG#v?fHB?IU_zdZmyt>f|aoE0% zK*t+sT<7JX9<4JEqIuPct#pDHc$F;xQXPq^>hwcFvn0zaQWfWPnZPKc1IVTdG=-po zeUff|f`R|f*t=xMkz{F_nq4`lVGetk!zhe`qeJu<|5rp+4WM@)cfv%jh>D8JlF%UOD& zbfYq@tYb9v%M8T*!VR)1&MwehG@wVmI%sL{P-0WVLi?v8gJ;Y%QrYIq!l|9B^)dTt z;rU~;g6I~jv*q=X#FwlbDcw+!RBv5_IkSeY7_g{?Q23d6T*3~vwPdDgSTD11y~2h1 zyq??%?^I1uO<#Vb`2&Ssfj3x<>_l`e^l3GT;S#6xt&{u3R(*=$#Km8l>*5 zmmDC-(<5jEax%%bt84dIk2Y?~_Cal|Tkk!S9q27$kXe>SR~DO-Jy1i&QX=t)3q+MJ{k~3@?I^O2GUZ4^|^hKkwR-I~tDap7Dz>1?TiAFRMrN2?b+O`4g6@p%a zl#23xad>bn77$@|?>NG(gyDH*-hoEBKGOQMSzEK>h6JWBlal4zk55b6({OAe@r(9J zrc85KSf7l_<&C>Ope13Oo`_qUK52d613<~HF03srWtCgnM2EQgGU}6EPlgEiA+utA z2&XM~VB0M7s`XAVBns*2bAgzlVX>H-%UepzUSBTIJfMPXB)}jeO3_CoA}J!^?s`%v9xTS9F$+}L1B^P5RjG9T zkI+Wbg0Z4|-C(oYI}OLd30*PCjbrH;uEVE0Z+}mm3@Qb_;NiZm(n4Yq&pLjnA|ufO zo6>L-ZE_dV_+~I9Dkd3zH_R+D95P$ki!>_HNl3i??Ylqz1r62~F&8$5Vr%S4UY%gT zl0pC-4BvE!L?xXhJK`2^&01gxdBG58w!! z*#`oxV!C}~jekolqF%KSSDddqRNOa@p_^XsYdo*d*;PH)1?`HdO1{CU; z;?D{-AFVbghxd%j`i5nnwBINsE+x4=F2)Sh8>abqQZ(i$YfVVqe!f0~?O%NPGis4T?vZm#1#7MQRsJ=3D!p}f&p8zzI4#PC7K<{*KohA+C!FD@wUCsHd(*Rp~D9|Y;7Z_r{~T#~fw ziY+BJ0xMPXM|JlEJ4F-&1y`O%4k`;JwNiQ^xf;UaXY?oS4@w?gu2AOo{T*`Eg`eWD znk+=WBk)Tv25mwP(&LiiX#t~LX!7QS?jsAy(Wa72EQkaQS9%0*B&#&?ibZL68iH+H zB&tPx2%7kCW97EVu(7bv>Yrp5s!{GexLG6UF7^*mfMlJE&--wA`Np0Cyu=DzhA|_- zas@BQwij-r-sAbIv}d={HGM7TPvlEM0O;AldF&Q_2bK?%{`{aqJvsvQv(v)0W3kV& zun31wP`)cG2Kp(o2_`)AXeh1q(cnr?%L?vqpFR|T+f33(IGQRiFEvym@nc13ZzREK zZqvO~3NBYOtwa6cX|L3HFK9Jqz-eu(gY8iT8^`c5TPu(RNavIl-qu)8^o2%ot19yf z>MpOThP0UrfN2H2<^|&>{qZD;KyJsZngH5kX}1rCI4HM&%DPS?N!q{(f<+2Gm2@sI z66+WzTJ1*dgF1@zhw3)39yytaWrV#st_sn+uWz9e(vucA3Tmnj2iI5`F(}%QZ?;65 zWBa*CY`NY@Ehxo_-C`_ex11*f$=Zyyc&}b>Rs!aM@s~!(vP!suyFr8j3UV*T$9#{l z;gzg+TANA8LV-CSI;ND2`6PEzCi}A(Uq6ww%so|q0;tEpR`%#C_98OCHRjc9C|Sv8 zoqmo-LU<&vuA;MtX9YFJgB?f`x&GeTPr06iX6Q+>F2h)Cz`nl%8dnvN4Q-wX32t_?ls^DoAGeGhQ#snkK{q1@Y*7Ht zpS7hut%Zk#gvFw<=J_t{laGDxg3sf9`FK4tW@4&$Q*=meCmp9M+AFA1fwj77XIj7I z^UO5oH8ZIz3zTMg_H>8T^RqlH^nB()&(Z-oqz!lU5ro8_uld8ekOD-ASJC@nmf zV`{`k7OJGj+V7T|OE)e*kXZ3yVE1HYm#$h~K_^d!6C{9V;5K#%+Doz2_P0WOThT2E z{^eFtydG__>BUMu`R$388|pu{Ep++Xe{Zy5AP@PuVFA;r>--?`KxD7|7i-6t^R=GJ zubkH|&~l?}HHE#XezqL@8o~Z9K4s#h=oF%1btsrcx?&cyJ0+G2E291E0`+tS>ZH~J zCeZNKqU)&Erl8V1l?T(|8q9$Q{N5EqyTnelS7 zhTw=QabnMuUtIauRuf4QtP@6AibNp*kALVWLzW9}wEyakkXbY0O{Thw=a`UOXY_4k|V~iR67M8a2JbS3Q%*`vCqmc zS2QeTY;{+p09@fK+7$OaUl>2uIAK=%@stIc6@!!Qtd#jBxsa#`i8%->1XbW*0{}md@a+Y!y`?Ne;K;&qtg#_6y>b!nM z-!^hAlHQYd!Y=5qJPPzHDpy%Ot)-6~!5)-~fDMflC=n>TPume%g=`rHVvt0tRjfz# zYez68!d$9#p%GA;YTEl|wXbb3fOzO0eWeOZlnyE(g8TIR@Yq|=xGuQwrZftfeAmd&IgF3OOeO`(6oN;`4HB?t=M9JH18EYmJo9TAySW(EOiaFCdo;GP&p-#0a^^p{`+BjAwNUERDr)PoQHvM=akR>+9;r zYR5qEkkOBPHSY_)0YLEjum~kMzSVgTr#rijX%aBs^zQAf_w}H3_6i zD^3S0TWz~sp+GQI44y<+s(TM<>0g}p2)lDzgm<|sTF)Gxy(&su3O zHt(5cqa$NsuJzd*VI%A>k-2*vrb^yR69Bfr833=w162L;IfmxPdvZcdM_5PqN9O2k znu3UEy@psY4sLp4b}tD|eg94@>W$nm>>(BBEERkoq!S}|)9;QI?MggmC6k}SpbYSU zCyeqrHrGQAPa@LHL8uNIsQ0kMJ3ksyc6cspbDr!F;oa2n$UBK~QC<$P5$f~5h&k@f znh^C|7=q3DL5E!JU2D%EJm71w1!nC$29~?T-lMf215+E-;3G}XpIF+Ph@d5W^8@kk1Sh zZ`$?ceJMy%(JMU3m5>mf(d7#Lp}b%n`b+hvc!+3+n%=B;hkCf3RGkS_MopMBB*-YO%yD#fB}0c5 z;r!-6E;^$PQ6jxvrdpxbTc$<}U}JGPS46F522$a%|=X>sf!s zt41IEoqE<#nKfNqhcW!eivJ6Tkr3*VpP~hKos8Q*l?%lL#5oeUhpT&Zd@OB=%922F zELb1-SOrqrzB~%yjP_2CWz0J{Lqy@UQ^(*3UoIETZdyK`F-W*+*{#1y%0%j92kpS^ zN%h2evAZPDu1E}#Pd(~#r{s<3NvT@F3ayDF)UNL&b=i0`}8IGVB6^ldxx!qFiJ zzrDRy2XjVvk0T(RhfrU}$U>d_ByFmO!LP>2)c#W%DN{+*hK&aw^D!G_B<=I4;Y6d} zkEGKakm62!OdkEQ4!~tyX?_m$eUq`zbf`oML=R-_ZQsXn43*aUTOog#}C9;NXl%zo(E6!U~Lo~5OcB`hpqO3+x2fA8@VXeqY+OfaBG#Y z@z`yWVioa3+fb?oEyP8vywII+}R(K?TvNvq4{x|Z0G=791|*ATxD_@K~{SSH;$`R!8KD;z?m%sF=_C*FNHe}vN(4&3Zd-{u*X*I{h{}OU=KA}SjklQx z<33cvr$-Rc)HPHcGB-5$h%lgF2HcP+tm8m!$iTdE+ z(kHS)Q6AalSW1vk{+$D6T8C=}eXUQ~REskgeeg3afX@nhYb1pCtjqKIYHH(}iEJEt zj?%QJH4oK#7`s21?_*KO)+hhIoB#5M{}OMfAYAAYMqXGNy%5}4xju{y(2%`6vDTN; zl8Ah^FA+=7&~{O2Z}m>JLuc`EZQQucmL9bJoOJ>@l_lj$Z4D>2H!N6;+*I*#kzYek zB?I`gIhlwV4)#{@jKt+;mnE&XDp&{J+OeO<+YE{93Mb~~2h%Fm25MObpiaia++=C? z-BWpE29w?DUeQgfU=8Q$zg}#_G7RXTI@KJ z`b7O|=TbynrJ^^xIineqdGz56r~u52Cs(_*dGk+L{1LYOi4RJ&a3-JK8zYdOl^cr- z8MybZQEbMyKD4nphr^fDI2~!_T8m(a7Z^=MTi2VUud>G}<=d z7E#s8WpfjJt&DZpwB;g?^E&FJQYFN}9J>wdlY@bjTfAjOq9`#zXx>o=jKSa}KYJ#^ za9Z~Wp$I(_k`1qlcu!yC_^71=qKIq^3mfrZgWomiiC_gI#KBa;zE`P`SU4`1DXVxD z=>ZIo;tEc45eRo2l^{kQ4Ziz^P^Q>3Ey#jl@zF53uXqP-GbWqn#M3_$G75L018vrD zcY&O^FS6N~*5ah1XfTn4Y{0<_9|js?iqi?BA(6Sb5f#g-twVPb#u*AJoQbujb0dcN z8^iEU^1+@Z5Ww3p_?P7x!6O_G00@PaSHq zIy8KgX3m!BpC1@e-a0YE4R-_Rx$}zYTtBaG8C#xi8Fva>-##qglJgr)!2{njZdR8{g zkP{yc=&hi;L||lN>v`1$bN;4K6i!PXac?mX>QIk1!BZkPp#(X%1J*5JhwP2z9~`ih zyLH^mYyV9Q&0G8CfOc@l!Y}I<_F*`<84g(ZSbQT4a|%U{QnHL$=w(7}v;|Y(FE}BY zntM>!vEoBW=sS&xlwo3eogXWMU<4*mC>F6OZiYYbEr*9j+XB=SGOGT+9qQ|~r%wr?qX29gSDS4?=;ILfm;prhd(-ESY@-;|~3XQ43 zm1h;29V;!u34mL1@{l1^e1UY#Su^@xgam2q<%j`}(Hh4S$q6F7987X}sEh)o+Zg3` z(Fe6Ufj}#^AYTJf{LFr`-*uXj)-N-JP{FK$^u>T^gC_u?!%3FG6bmu702hJ59`}}! zvvWg^kRhemx8P+Kb7lLxFfVqHn?S(J6=xQf34Xo_UYw=atd=YBI1acM&3pO2dlh5O zv@|NdV>(S*43j(?c2t{r>PE=^jSd}dH_SjvfqV|fZ1Ki%A}4Rkkd5U&R&17w&%&PN&%AyEUqA?6=BFpPDb#qDp%PgM_DkjC=aU*WGq_57LAviUCT;h zSnprqBp`)!4oKrW43DM575YG#ClxcKk`5%oyxX~=nXoHYDuc?kMk*F5R&ebESXdu4 zUf}bs1IHk){OZJ0lMP`R&^{P{PBdq2>rOzCa%2wZ@+2so?cchq0j!>Dgen=4G!!J& zrH6S^kD`}pNr9h^;Fc8l*$5^neZ812A!rz-s3l_o|a~>0zvP<4Z9``JFAdBHvPE8(m)7S!V?B) z9Y%VE4a3Z{A3{BG&U&g7BijN1q)!fEC3}}qEJt#ZiJGZ#o3o*+wxu7IzmLt7tY_xN zy>qvaei`hF$8}85CYy-#(MXiqBQjO%SI6)5tJAjHN{XIqZL4$=c!|JGn$9Lvy*!NY z0QO(oEz!U#dh=P7dupgs`ZyLroIPO=RLzGvB(6sz#r{$#eih*csH5OsQ!|L&7(+MJ zn#A%=)D$EknA^ZQk=kXSV8FglEoA!0>UKfB)ys6h80^?JSai{@d5sgwTqCw~mI1T# z133>Th_^mDKWDszGG~rFW{gkOAh^*XO7CKOsHlY)6)R`(Zzb&?4XXi5_4kB_3b(+= z>Cn>-!ZHojfy8Wov17or24QjZvoUAG0V~+s;pWM3^K^*bl@qqni|Y%b%cdWa^M{*f z!_9Y0lQj_p_0}o9JN-c+aCh;Q9p_-FPx&YvWs*B|v;&dbttj9q5)&(RL3Xf{Vb`S< zgq}$aad>yQ@1wjqtO#|1&4O$wqK!OXvPqG06PygXAVXcDAHDvfDb|$~yJ6bX{QQZ2 zD`ZEReQ7e0pKP*@CO>`qF&UZeeO5q$;;rIr4s#8@b9nYreq_8kzglPVO$xiBuSHr$ zZboz0qx7KdkqHF`Ls|!Xvz3T7REO(on~_Y!6p3*VhzhG&rCxL0HlkTt;_}Mg8eb!c z7;-8p2XgA8c;{?O%v_^Ug$ft&y0ek4`Oy(3<9O0BnP-Apvx1^D@(mRf~5AN(CR;aD+YdX zn=qR(BKjOL2ND{#Yi>MSoqQOSOw))$L$vCf#TpY#av4uHZa!%9jvb*tCLOBh+`J*GE3YK z;5FlkX~tK{V#Z-Rc*|nkEI6~He70$2_QC16VC#7$&4un9+@Grnu=YJxg7Imx?%z-q z{0`EZl$y)R#erOJqt_xBPzt|1c)Y!w7yrTFqwDhsz20&@5x~9|m6bMC2LwziLb^mW zLcN^Q0v>#Rsf~7%*0%HA(#rabk9v#p+4311_+i#~l=9>Gt4OXCj@ zMG+jq9dB&!c;QX9IU4&iww=hia~nqyD)9lVkT{=(!$A{fatw>3i)UCtIEUYyBeE2y z@J@xom7q5T)d#hf2{pL2G78qn3W0w!j@IwOFbCus1>|5_bP_l65EI$5m#u>=W=PqA zI36<6m#FE~+zt`TurKE)I0$Ug+BK4!_*o(T4U4MmuXdOlyUea&TtN&w)i_i1aG0W(y54*P?Y`- zl>RbIk5Z83c)w1L0IF>-%)aV4$+&kv2YCz#{W1}j#qj9v0I*pluv(~});u?5x{W6- zLpTI$N(40j;@nlaVKPcApr$6VuT>~6OV2!P@o_u*;(^RqINI*W8o<=fa2~#LOgo>i zGag9t4;HL}Fiw(l?bsK6f~rn*G7wN{c;@!xXY? zkjXbMh;%+11kP4i`Xp2WXrsT z6pv|IQtm}r^UWBt2a!G#DlfR7`IU2y=%5HjW&NPrD0QNCJW4eG5J%D8I%W^c479nF zJFH~f%Y6@jTd@aVO&5@Gfdj*MpnY`7sD!BzvNY5INn*E6GK`YO47d3imj@D;1y4jf z9_F}Jx3F#tPD9}+ULs73w=CpUpD%963?+=L)?r@WQykSU7)Q4&?O}sU>0!XP) z8kH3nPMycmsqPUp4uC&Fgn`-C*dUwDff^TpT8v>AeJ)x{FW)4wx<0Rm87uRM7oaJ) z?(kj|=?KU}gE|any$Ag5l zD6W}fDN%V_s~xt9xzag&k8K%$$24Cd(-m{5*j(LSF8;N7;P@qD^TxgI7{*=DF!~kn zOI_fYG^n$Yl}uqaU7>xeLGazj^vc=}U(|%chK|HB6s|JJ-`D{RgyjOu%ca~ZXU48a ztHJW}_T-L&NM{@EY*2F($CA!nG+`wOIeG>-0Eq_>B*)QiDm{36JM$t3RPc{dpJBXK z4=V>BG|5F>M`@$gqpTgNnF0UpPdcl9#U}QtU=iVzC4Yt4QY$jrOmsyxK6=ZTi;IMw zHEKA%IFN#3KQYu=N(4nu8|~ivGgg6IYe~z^{lOMc04Ilbr== zrw6;{nt4HEN{A*Lcjc7WcqKS`4wZ^;VwzcE@@f#brzxWdQ$eMsZK^_a6>_V9tU#Tm zlTb=tgmk#1|E{oV!801Q^L+`U7Hh1R?OknHG~C%yyM*VkTU62@1P+LR?&Ilfzo-}u zYO9-B=fW6*zDeVP(LZk_0k6qIF^+Jr^R9e=baGY_A?i!M7~hdyWWgDVM;pum-z=jU zBcut=E15l$lDH2zj2$vV^Fo^5d?XtKQOD{z;sm7u`K^B$bnBI_l)y>D-Q_G7k@!qc zqeFPYgh`ixHq5`z>i0W2j40+Qt|VdGn^zC#`lU0lYKk8FW{+vEc}s|i6GG$z*ZCDh zqa=ubo3odKPSjM@fD4hzcAy}|_HO_;VmtG;8OgJnWmoc{UU&87<_w$Ws*pmOe;yAl)9qbkOPU;U<}NB3*SnBU~aWqZVvA#0laBQ~8Zf zpzq0DK(2w_6m@vkl=-)3sPu?=MZ~MCXL4wzo@~yzw=2Xl>s88<@qk@n3@6|@BLS_g z#dqI}8X$(UZ5?J${2}iESym)S5)p_FwTLl(AVJD)dhO>Q3TcAJ(x5V#R6m7^6&t1Kt;9dgpg5A zzX%LLZ5Jw#>#8S3LlrCPZ%u-n9)=CL7Tww;jUF0r9oaZ_-Uq+RQ+*W|dCB;icMF@GU5lG%eP_2@ z*60H@D2|a1jy8?9H6e5m1fe#pJhVe(&!A0+lDI^ou9$1GlP9POk(_F3BR<01MW-=U z;uM2B=Q11yN&B?SVp9J*USBcLnRQ-{zyTKdnz1wE#V3{7#>*?BtZ_~P-mt0>xzIpD z=CmvupWL#o*w%;n{RdOfsOoZnG{=~A)Y*lj%rZSToQm1>+cYx>`lBG&0PU2FZ!2K$ z;|Iiv4m6>N7-mj8(wD(5{2*KmD{ia!3{^j}e{MY}zs?!#guqMSx8*$=Pw@f{*dtD7 zr-4S}M%D{PA@*9v(NicUUD9j0sc>?LhPdI7#VNIrb{_g5bY@B!!9xXQ$V0sW>meqm zSf`T%FfFt_F8XE*5F3vSrtN8@p` zl38UGq)%~>@P4orCCGPt3ggLyr!|{8vYLDp-vFnqlfT-p@%%`ary+{9cu}rJWhPx| zP?nXD;I_CFnM*2VP4Q~(SNO^hDXI0{A%?(8NKJA$ItU07U-}{rw|;| z5-8^L9tX_ir^Zs+5Q6qXLvDkK^s46 zM&!k~`h0kLSHJRhQvNI0{?f+r4{XAs?aQT`)muq|JUudq4R36p%<}t*rMxfi^LXUG zW70oKniAUEC5l46jtUAcaQKP+Di^4h|4>#6Mw<6iwrdNp@NxtARHKv>v2VOPKT=nw z`RC>`I4|`^A*)Y+Q+E`8~79@wBwZOv?!k^=njW~q?6xE~RyfL>RM{^pZS z!8HPL5vy^~_ewf~0X4gmXmvZ6EEK#kbeh*kj#!IN#B1vK5ow3xs5I}2CZA8%LVf^_ zp>~H6Y_yn<#*8U0GCKa>p3rnfCDVQsXO6lw_aZh(~YCPfFZ4m+Q_F# z0udsbjqthjAezooyqPqOr%}r}*>rNw@S-T3L=ZWvFJO!LuX_k237;M6Xcyw6%~U$H zxdnyoJJi(<2wL?_oREP;l+^<|u2a<*u6~fzs#+>eVX>MDc|Fmer~32E-Vt|rGr?Eh z$?091+{#EGAiYM}y~0~XiNvS)qwt6$hY<@E>6oipk?}CJ>3S)sX8Dn-m-OLC)-WCY z!;4!OMhu4!;(+n!-*CV>)d1PXo`kG@PLz!e`jgqjN zZ2qmRks=)tiD8vUPss2&xVK+#1dK+*zlKOD{7gQBd- z7^h`9MmUA|bJ~i?XzSztYzKzv>7%T1>9s_E(d4n@S(14E$JUItBwQ7o8%M?YBYqKl zarkApU0*uxr51%24C@4$N;%&e0@lv`$1az>toY+b*2Ayqd(~(=k0qtng}rod)#8yo z^&p&KZFG58I85mS&4}4)h2<@G8xZmu)(~%9xwV+HJ~+#l5aFi@qjt>6XTf>u>|Rji zmxil!4#hJgbM3u2447tKJ1uV#QHooxGjR(XFOPAkXe=JbXcgm5SX5|Rk?qE`kAiEn zc6oVuy}pM5l}<@mGgytaq|YM?CG;IZ0W#q=&!~HcgATaK`$pWn_JjX~H&7O3P6D|4 z8TbkTTwrXV8gf1m+nR)j$skCCe1j-VaLf3LC5=Ne3}xKsF|@D{jK7vRH?W$Bm%dcA zX$b@{-2ipQmR|!{??*zW`BNeU$}YA#}sRFi4Tz znsC(I`+|_pn!(Bwc}GefaUi-1$}7evKJ-?cZ>m2+0Rh8C_N$3n&@A~&d4Fjgt0_d; z`a$yruJ$wtf}~IHwEUSN0bH(x-lvhOmtOhdOr@KxU=p`ZfHMW z`cyCO11eC?DL3epUOUaf467kUw^ z{y^m+Z^sIt9gVA_eCCTvMsy4hi9$=zICC`o=2SDSSdp!<>w17Dags zSXr2*FTZRpD(OjuNRY9dG|vfMR(wB2Qeg)m(TBm|+C2E!7#TU>&X*+}_BN4aJj(47 zs~Q9o#qK#K${}Y|mau*^iEJ0Rt%buTEysl&DqNieU+(O9Z6wpdC|wJSxWHM)L!pfe ztJ*AHIVASVX7l+=Sy1x5kh(y=3bvRb=9H;$DA&W{NR=?i8dr%;Do$` zT{`J+z0U4*RQBvyXpS<3F)!CP4#mq}8$Y$*p0HK9UQUrxFVSj;A5iS(h6ETllX=jW z(6Sv4nG_NJ0!ZMHjdudV^vM}hW*EX`{!};HXAHW0XScUS>u;=x`m2Cb-f0HGT|}_- zN==fLS_vjGDRD2v7KIq_B9h1<5Jf31Mq5du3xGbPEM!VOij@C629Bd*pDksWDwlYG3McfO9yG=ewU9g}OCl3hMAK}V zU!erpvzA-Mu|SD>TJR0WDBFFlE}Q|lUQ#>-9JRTW^^z-{)=Ms<0A-5-nz(Eg-8HSW zRE9V}IERGVlu}=Z)eK3L-VuTx&~o?`vR&uvgF0U;+HaoHXU*Rg$g~|n=I;t*yUzSw zs?*+8-#9WNSQo->jG)eej35+8+qK-g$H9*@;6Ak4B5WG^{_Y0o4>mx5Zv)KUIt4y> zG;c)j3x}XtEBw$jIG8h4qFRra=oz>Qg5F$QpF-lt`cr7%ALDj_rM`G0Lj=h8^x}gZ z%J-KA*sJ`ZIoifPQkElBf)SJ-mOTz4;nZ6#t;xrn5S@eSxZ4mo@HYJ00A< ziEi%poy^GSg>UL1v=!1s?^{=%2#m^d#}B4d2%FM3XmQsPz1WA?#9T7ZVKAGNl^qZJ zw5vt~$VGe{bdnNE!?Em0r92+RJcHiBM{?9ZBIqdb;Mv%4ewT1-jICdwG>^A5w1p^u z)hsc496v?hLS@ z_1AK=j!SbhFCjppF&CwiZAe_BN_3tEF~@`RNAX>wL9tfs-3F!Az5Xb^j0BBSDbTK$ ztIV;OIB5WpZkYnw%_06jiQ?cA<&QhMlq(|}QCe(6^uj+%?kE>jmMqJ1xWj2-xYwV0 z#Gy~{vA9N`SW|ioPa)k4pxHF* z&%K5w0rSCm@I%BXp;=Y`m7{C-h2Q*)W4zKu{V?_%F=6`#g4tnr(a2pIve~p8Q zJOs2SwN+ptR{LKp;(KCsJ-A5DqyTG~0^!)%4Yo)+eWp)S;dS@tW?ot#S~t%d)`NCI z4jFlTBAqAx<5|p`F=duNdiySMUMOEHOc{GrqQrq1cP5ULIfCqQ^`B4kUSU^kLOHHe zWOBlGOqw@DOh91+y?~4KrSc_f)EQlFQ2~QaGeRGl@NVktflRv3wgw@QxtbKthH)Dh zEH=8QE~0{iN@2Z&=PwKb*~Tzmc5HO&qpCnrpQIe6pT5wlvhEG7XUD+%>K3WSaPmpc z8eNnR5PModTx67&$Z@HAjFrH+tCXX;dQzP7&13F4!=jNmgjoa^cqhe!*-Jwbn4gk6 zN~4)leiOl^P+T;t-K85*&nG)L2d51|^cqR1rie9;5XXtUk{? z>5MqHqsT~#szw~i$;5IlR4Tnds%JuTirCFjM^c;fvgBgBhVF>U#xUZ!aj^qjRav!R zG-+4P?UR){tVyqJykYWW`sX|ic0H7Jd293aRj4fsIhX7oA?%*11D4JsXDRY^1R-dQ z4zGZQ4CEH9YY*oZ+=9P610ZiFqvy*!8#Hd0dh`RH37w6>d94k)HEdZsEZP1}e@fJH z^)&p75rv7Z)|!v%yZcg-O9IlQ8^D#lNH=oi=dCunqeRzzY*A(yZ)maT)<>D-DGf3y zAQ+fKLvxUpj%XZ4SdSD2>R2bMRjmx2MH%0dAfgeejRAtW6Y$YXybQVvGd>AnGLf;; z88LuTUeH-1qe|xXLwB^51|-!?Yq#`=v*^Yee|!#z?k*?cp3_^#j5LHJqNZq)o0T<6 zsm-f{R%)iFgG@OuD<~URDZ$tc;bNRJdT*;D!=egmMf_-aJ(MBwCMa*`wtk6ROjyke zb|}q+%0Vqh8FY0Y!uY>Yi?uOueQ5kp0(+0si zT+zf?m%UO4^_jzgKBlm()zQJdr(74n26_ZuL!__`87xxfJoYKuElAmKtQ9XEqA;rmPD4UIEszNBX=-3sW%i-i9D+M%Pua<;s0OG@DUb!s zaz!i{2}OKpvYJMyU+UFpAJ1_W%9)AAvSy{6pJerr-EC6pENs~%XKlWlrJeB|5u#IX z?1MW!RuXHBstr>wDk^c^KK?$ApyxsK9DJo8@}X?9KliHshr?_WAjYg_lR-QFG@MzsW1rD^ zk}-HDouE_ZLdJS_i*z^sWaYUG+s*t~M%?_2biIrT;@8n)papQsr{j~tzA9y19L4anq4-8>tt4ZL;044P5-yz&UY+9S@UB`Jg#(lx9N zv|%Al(^wyo1SUMtW^>s)r1X3&1(^&wxw<6K9_%VT!cF;z&_PmQL}1nV0T!g}JrjVq zrb$*>i+t?_*gE5IWt~pEKhS zq@H(!4{10&tE68PC!E>v@Oi$H9S>wDf3EmD458VyfZBr80OG!rFtxND0`ERjKO20%Bq6^;1xDl#L5XS&pWeNbj{^WLIMJxc10u=|IPU zCQiXLW-pAcS?>@^J8rN;b(U<{DN~flFEmQhHhMGGkqn$V{k2A2U#iW`-Vxr%@|lYA zdfP`DVPOnl7{!Nan6=5^GW=OFfziA|B;q_EO}+epbdUmkNbtQ5Q{V%(dGazEVgd8P zyYVD3h4{LOQvOMA5zT;|3y-L;=_wAH&VAZk1Rd|ukkOH~qsL8+Dg^WZEHnh^(kPbu8u}^w zul4Ubxd*%Y^tD~x#Q8d*nR9}e7AP5!d~sPJ(68hWL}%sn3p#{4oHWn^D&xZ+RVB<+ zEtLl2S;!v&`ZHri46m0Q1ji|=rsk56>tH`ei5FXdvk?jvq%hW6ST>CC9LKv=_!}Y+ z5&3I}&|id&mi>h~(rPL?zm8)17^CenK5C%OyA}>$I{mmosU!|n8yL5RmL%4;4&x~< z2rC_2sgqgNKP$e|I^U>hUSiLnr(7m0t*lKKRqn1B&bq~YF?DcxxkxHX2UO#(<6H(| zRj1?@%lqE>qN<*UN~?337{%Vn&WBHdyAgvUL$v(;s!z-XRO}A!v<}wkqa#r}0n&_E z=uuXbqQ)&UzR&pg9sBEA{;C{4l`+9zH_b?rGLV&XN0hX44%gx8j|il(gn?%|@1_V2MIUn`HH7e7QjGUS3`+MLE)mAv`)PTWEaPkr#TO0?KQO_1hj2 z%Fxi)v(*jv$e(K?O=%4rgI(Vkwu_UsSrS=B@=x?>{@!#ZO9yZ@fj)^_gZ`i{AG`W` zwsuePY1I<1#jOtO#w}mPmGMG*B{iNZd01eR@u4^CP_-9rKeMBdeeRjQmwxHz3<`~nB5+ND3j7P6_c4@6akzo< zD(-nme=H<(8&6ZF`xKZlLq3zQ6&Yn=dAD`Bb;fKd3%>@tk@YP= z&SMi+N?l|g6=15H%jJ4S?@jy=!-?&!HPuC6lnv`IasjU|BvnhF)!rL{?}8S~FU)as z)gF5)SMeZ2mPt+^56K9EQsZU5oo{PXSO%j@l%+cUuxCwaHk}L0DhYn$MitwP*nZdr zbzHrLep>3=nm{ZZLQh#)qTj#fBJTC&Enzr7h!?@pNAIEJ!_iAK%11BOYVqI|7;89a z-VV#3)-QE&>aHaCyLVJ~>Ru^lox+t;0Qe-kl!aB6$q8zMhZ~FSJ%~71eb=YLGqa-K zAmK7NsvxVds|qHdYCx)?@O|F`d-Xa<$E<E=nw-s79XydGe9r zWw4$-4svQmBWM5Kcw1MLOYuM0fiBRTi>Mqd7+nGnb7aFmgo3IB21g_jY@3RYF3rBa z61S-F%j*tY(3=KD5sa*cWR514D%?+oiylePQ%fy&vm(EdR%bmPm2Lt~MSC_rW&7F2 z1%GBok^`ah>D2)`7PWBj0*T;G#JZ3;sXICatkuO9Wz0n46Pw*<+y>4-h5e2SuQ42Q zOCdg%{;u<5tsxwsOu{&~5OvUTJ#f^4@1S8OPD{$w;y0+j+Np;Mtf9xGa#J)R?Mz2Q zF*g-0uId@z7F{hO#A`}XFC@SbrpBn*i{2+5VVb2m2;bIjiDD^dxgDRdIb&HCt;GjD zEc7R>z$7{K$F(B%yb;1uqeMeEgf}oY0kNhj^A+x6I1eY&gyy!9|FAxoS$Tu)=MCWJ zy$1>s{cv_m(ZQ(V{sOHI&if0&3YdQo!AQlEFE+I@jDC%bkVU9{8!9s@=1>Yk<>F}6 z=or>QdL}3*95~7ukeO2Ap|LT6JwX zGI-E!uB#x8uNw7a*efhKd$ilCU{6F zc5$ih8;fA2*;qsK5^0+wKx~xQYXmK1O`x5&XitmpyxLn92|>{2vK`10Zfd93@R)oB zTSiO$96>{Au)`J7k5~VRbtG=@mMg1u12F0W+ekR$3oi*`6mLoZM7f>yd}xXA?)8~4 zOpZ!9k&_|U|+Xj8MmkqF3y#C0vrxVblq%RQV-(PN^)=$WW}$Y62PR9K)kUip#Q4|XW2ZR2 zMz3wxo~i)RR-|De0dt{F!GShJ;~oT~7`bqYa{tTvXt=LmeQW1OSU!@Y6NwgfhZZLQ zw1+ypRW{mgjl%t>F_Ru+aRw{~Mc2WyV6QNaI3tlmkUX+|IOM2^+@ixX8mF=gJDMPG zmcMAUR^WD?&4;G(aWZ`fmNH$b#-Vqmo@$TiVi>X_Iw)C^;czpKvXiuHPV&!0>XQ#s z!19US8R~o2lVziiwLD-(dQ-UK2m5Bu;QVlGYVvVwp4m^g;&)*4jz+W$&zkeC4}3HKi{q4&tV zeqe+{&be{s6ptf&hvqnzKC-q9gE5>PFMiM;Q110Pv7O+o$hDh!l*|D)QsyYN5L+bO zbB>##v65gj+z@1nivsxj)PJA(FBe8BYU$mDe)TAq2>Pl>kFP&%^3@}7^0`hvmES_x zEEEiPFuFwZBx+ns5Un3tX$T1+&A5v0am@H`xT_1S@9P)UJ>l}=%|;7hzI{E`{(8BW zrCxkKE0vh*+Tl9S?rjLqBlbosTUzOJRE4FU35l*KUA`ODif;%9&+o5rIgC%4kVgk8 z^X19#<>~O{8SRVpp>-f*`YB$A_2+FT8LU>x zyQ2E*bo0ewO_f&;XB2hN0z!3dsGUrf~DM8a4ia9Ke@{1dUJamnTo zfvvak!%5mqj_ycf3S@&Tr#=8Z&S)Ha@tvli`*4D~?&p9kWwCAw7gMyhy*0 z8;1_iZ!0suo*_DvfPt3aTARnQ($%lRR@IY(yQUI;+#$Wy$T{YQqv(2a%v~ZNdVO9xRZS$$-WCaDosZvsCr{vr> z$=5quv9MR(sYR}eUhMs`SsG z17JDj@K*$NV3Vp7QcUUB%chi3%Im7I_G>MYGGI=qnNqUI7!pSoB^_QyiBL$T#*s7? z63B_^kRzo!4513+3_GTT7VCv6nmkwlJC07CK&8}9nE1P7T~e|AqsQi)75_PTMOE1| zy+}qL`~7J|JC3B9Hn}u+yY%AT6V($`zmw*j-Fl^AC>HSx#|&=VV^CXk&Y+><{?69m zK?3QpP>8PKejvEJ6C=dRff43b9))3;RkgTrDOIC70x&yr+n3ZD{_xy9u_j!AYCDHC z;?M1w$s`#jJryJ_tcf0zN++vFiOCSjvUujkq?8bCo&#{UpThbP+>C>mKQ%vs{oxG^ z)rrH7afsI8xj(|MD#o#KB-^m+V<`7IL2?(@t*Uc3Eys#?haQQ_$^(5;Dp%@Bw&VLr?YOn3%LUepx7rnGt8I60-o9(0VD>_rG-khe zdw1qNT*)C8N0IvZ5^}IFa{x-8HdaifR1&i(Z7?lwjv=d+267ArF&)UQ)=~ zqG2NxdK*PqF0sTW2~U5l6Q)f`n)gW3lbEC~+Qfn*OUC|~^!x>CdZ$Gr{|SZWQ!NzH zoFG7dBvSz^5I1T*1P!PPM_B32XRtbkFoTJQz;S>6u<51WJ~kL5#=Kr>4(7mk(#>H_ zZ$5{jFUnQL4ZLt$i2oHoCEZ0)r=CI`E!&8LE=WB zl(}Df87n835abfK-N9QLwG%%B#XxSuN3OTlK2qG)t zgg|bX0lbu)-8*7C=`GIn&)=%m;k|m;C>vb#bkAbk#Zq>~hX~w{`qj~dcJgnltRt#s zI%^z8%j0W?j!@H)o|g+|frT#o33ITf=Miuol1Ao{Lc-qrRo^HcmjHHEZNRmo{8=fd z*80kle~3+8+&8T0XG0{gWCAT zV~Y-=MOiqmT!}$F@919YtRYgFO)?6|fC}&-L`%Iv+g4NqN>9t|&($hA(@Ig^t!u+H z&BFxX%j5K%t95!Z=H?af&*G}g$aiYD^7Bf1xHsvRgkC%3;Ba|8w&2|Sd2|Atq`E4_ z3~y(y{2iEFsx zr0H-4eZi2YGv-o~@|P7eTroidw{8E2Y-^T6 zJP1a!n%57Pmv_=Og_lzblW@ZIP1WP?__}hYz{>Bg$E`q-^EvoCfy9eMo}y+beC(Ye zR78l|y;EG_wvxhntfR=l<%jWiMWSv#8DP)2$;fOAJ&21G$`_lef+S?TLN8iAOm=Yh zcrt_+@K(7$L&md7HkWcChj6f;V4y_v3eyc%pRbM&RKddyC9*C+gT9^lk9xY%F*0os=2Z2QR{1&?zJUZ&?MyKzdh+M7 zD5kpTN2`4`WrYujHE*0iz#+%F_a0Xk6GSa|n48p_Ks0$p>F^BkE5T0UU;_Sm3eR($an|ttS;2^KQw>B*+vbes zX@e!>PO)sn7@F5Tz&#T84yWzI?Nm8#I9&p(5npU*J|}_v5rOI8VioIH!y5$eU?mqf ztEFvAwO@IIGbIOQ6G_8ziMU6cxsqm>taxLz!giydS9rto>webl$vpei->T&z8;p^z zvAcS!b)#R8tyiw?8+eY488Gn?2OhLmQ4=0;>VO{*jr56L(|DHIajQ^3oby=49Eqe` zO|_UK9rD}T-WxEoc?YD(-3xlGyz?PLuXKWqy5~hDY-14ySh(UmA^2 zN9ZmcO*HW`2}*qlRA6{{@A#K_4)?_UYJfeQ)-roRyI*Nzl5avzyvd3r#D>AKZe~|f ziCo`=SCn4pTx2^XTm}>$b_CaKh_ke&v*n>CRX#DN7JKYYVIN1S>AQ$EBB!bXcjqG3 z7Qp~*i@-Gm=NtppT!O_cZi87+2a?QF$rx#UjHt+MG2CydSXmfweI=Ydkc)jeKDA=R z{GEoAF$k(sqFfg{#_=eAZ;Xcc5rw~BWE>n)z}cm443IiGYztO;@WHgx3n(N?6$a(o zH6(@T@&29b%aU7jt|-6QjtuNpKfr5+^VV zoUtx$0tJw?G<*%#GZ!#4hrZNtEKwt3^t9Kk@Dl1b5hu~pZA)$Er>bkPtZ6>)-qM zW;%pZCH2M&ha}THax2J2KKF&lH7Jb!97JO__bWeg|B=UYwX#xgyJqRFHO zp-AIUO>x*E<5G|Jybv3MsH#dTD2}e6F@UIgtBWOvehj?99oEF4@YvO)i&v;(6dqn9 z3d!x++`ltsQ76ii(5MK@rJ8dO;RdW=p!0ak=&#)R@4Q0Ed9-O>o#zfC|8-aV(mG~) zc&l|YToTS*%S`14w1mQN9LT}efqyjPSGU6SUi`i~XE;^e)|b<~$FP*-8~r+MmOqR0 zmwQ%`ZKdQ5zyKJXYs;xIG*l!t!X4Z%X6=v%Po`1OLPdz`DcIO{*I_ni7!}dmSj7UZ z0DtBK^hC4@DU(z)5#^=~PdU05*Aoq$1qRj}!D&()#UA*i`2i?=ql^nOU+eqRVmLF6 z5TTvTR0T42bq1a^H?6GTAJO_X1OE6PA{XD6z0wB#t5NeWslW@j8mSbNiGSZ{9D?a0Fg=XY=jsvb3{OK8UgXX!?LPFlAwaS%l0js;f)V9E^Fxqs*xOd1Y&_b=mI?vnT*itZQOU0MIXc8CK zobast$RrRKOW-J>yzItCSpF!+7#ogw8?_>kWpQ(M4r?P4nqv)EnU#;3LQs6>p4Le% zb0X79L1vR0pnvqlwpaRHnq^rNbv+i>G9*B5O=+7<#WOiv6H3re^jtMH=6%;I_ZG6o z3mNpX(k_)%w6(`}W)xD4X)J%+P?WTYj^g~r9ng_> zHc5qZ6@I+z*M*jR(wIKug9>roFHtH!S_4%p0}hCp)BQ&RW<^Nqmcu;`P&$+7v#3dO zBwmWfa46yeI1?K-RX8C5#dqLbw1O?ED3h0pp~3i*_@tSKu!iW?pu!i#SW|QsII5F& z?ls3{X<1fz=`X-G%_g8AbVNU2vF$kr&50B4fS%^n9}O_Q-3)(UFLfM^FUpEVKZSV1 zH8x$h!GWo`n@cj#c~=xENlI1Xls{UI&~WMhxp3`W?dg$yrq)ha8Y-j2o!C%GyDG|sA1) z;vTX(0fgO@j{ZsX8&cnM6PL{B10R8FF1`V-fJz7RVn`&%W*t7Mg8hVxnZ5FnN_Y2S z@^=2es##1)Eum;dm(UekKGNGev?G?%HCtlA^cN3>UVictSv>YmLr?JK>+y-$Be2$| zEU6kgmZMIE>7^_dx8M#~^s)*zhh`TD3!*tW7uWQ19fIvZ_i*lCaZ(L?=&;_}A1czK@!0~=68cX*$@0j>XnE+cI!5UD|E51(*{^E~f z+UxLxf9q8`!Y?~e59yin`+-((0wT1zkvS6Jr3BAo{aK=Qy+Hchtn^3LLjPLZDZt5! zi0#hpt-%48$39BPoqg=I3cZ*E<56#Gcy$n@R46-RzG(0W085$Hh({lx5jBLwji`0= zfa7N9at%YH?YDeLXF1jGq&0oAK|c8l`;7G{1Rnvx8^Z@nr3xb2fDV36v_zKMOq|{C zX}1h$Vv+i3%b-{nYq8VbI@fcvJlH3V8`El;WEWcPK>QjJCB!kOIsHu(%}H4YZ`S?JSO4EQQIn_SmXBh4AMFV&!;l zz%Sn~Uc>mG(l5`ZA8U|2^-_V8Hc5Z50e8^E2JoYfb8;S^tH=ZR$+ug(nO&lCUcfoN z(pja;Pgob>WRv*}lBn(nFucCIxcqScxUmc&Eh+zm(NRf>yVo6Haoq- z@EQ}E7t6fHdtb}!R>w&l_mQ{SCm6#d;8xzrA7}ZCmZf2}DYqV(@5UG4#gF*M@R}sv za-a5dW6K6{PCf8R;$HC$koE14jvCm3&zTT5>8|}vS_5w!Ku$Rini9Ka8=Y!<@r6$L zzx1Uf+2{tmjRvCcST92Ggxnpq=g^d+CC{^3pPOB)A$on64DVT3!@Dyf18c@Khfmbu! zZ?&jiT2N;>BYO892l(P`2El)Sktz568sX=qoThrp@YH|x^P8;}`npR6VZm9Y)AiNK z?&NM}A%dU8#L%z+Pg6WGRc^xn629q8$4uhy4U@G8crN6XxRIrd(>d?}@( zFP(14Zvq-7>B2V4AguARVfj}yENE+1`%~a9oX+{-yT49h4KYk%MmwJf?AE$5EI-=5 zDa18}{wQ`7T0e*Gq8obvV{v^}Sd-cFyy$$hUG@Fy{QchD^fjRxQwT5q;$BXHuVCdK z0D~B`Bc@fsurl9oeWUIHf5AQA|4k@)THO)w=9RsMemfx`sn4Fb#X*?(P~eXcE6RVJHo^Y##T zlq-0lmkuy(9G*v7N%2L6+Qw?x*w1kyMzX%%Ja2CQ?_O2acaj9qt?lv!U=V%8gGOHC z8;8R(NdCunc;w(s2WLILWAPqc%6n{+o8grr@UHfa*LQt^-Qf)O($`q^O+T&YkMc)* zkj0419&KEZ>rLNd`Z8$}B{y8nuETQ`CLLZV7Aja30&;oPepPMw6)l+nA{uWKVRyM3 z?bNPi?>D+N_Z3%AtPK4zAFKNc zDQXMeKK+p*H};-eFV>e^54q$AG{}#^;hcQ);$vk$JHpXpCA)S+d#t1}1&@`zm%r7; z>7#@B3A*{%Ga?08J|8OzUk9SU`*!Jb8K)mBu66!9MIN@@P9PtvIhK9`>-d2t8a`J2 zEt>nyVfK`SXDEf$AdkR@M_{#S8{_@3u~9&pK0RydjgFhmAf{~wZ(v$?%c?nTz%`6o z9zgZk=CvO!iKzde=;7~5-`vkq~$ka~?lClmLwM4iJ7X3(wby*rsLpyXL7>QRJ zB1%0wc$27fC@@M3K*}tOB>ETVPQMI=Y|INOJ$OlVapbixB=yqNl1uiJOadNSaAlL@ z$46d&e*N026jyov^XD;RIZ3`I7wEqbnVgJ(k1ayMoYAOADBjRM!JP^6d~m2$lIm<$ zVtD&WCmYS7rMKw*CRrzI^XGv{p`U%>d)@tIV}tKN)|`LEth-h48KGZcf3EJg3ZVYy z687Xox>e)>-h%aRW+#nr4j0@ysX@R^zL7<~pdcnr4ZL_RjV}@f9KcxRxqKggzlzDF z!fyP2wfV~=0cd325Z1C}>E5mRJAbd{!&m=a?Qi#>MC<<_J=m`K`#spMJ@0`wPrQ4c zz53ROKVIkITOY4Ce_ynH-}uO_!iR6zsxWW*r3ruu+&91Eu__N=^Jq)+mwkfI#X9z_ z7du=z<}c_fuy2gj!}5o(cvz(l#VU4hwxr+vGH01Z-Q(h3u)BY#FQ|IZc@S(q3rRy4g zr&h7LtJp!uiVqjkOYF@nbahS;c(^a$6q)E=pJL0jp-Va=L0&L_ zXqR(Tujb8~b}43Na3oS)DLaD|M>T^P9n2t>{$>z$eg?4QIDab~9=d-Jh*c)$*N9wXnh}W`r zK7HPL78XW@6_(cJrGh@IjV$C@ZFBQoHTG!HyE<$!E5v?x3NJi^Ss=!SzmyChvAu?dSdNK{RCW-|)b{5`b&= zOwhsSw?E9$&ckSi%nrws|o%mCO$;ahZj-F&Ei+!NWR?6FOu zIJ%Mt4paE*@bqdgpY(F8X!fpOK0o+ktsp-+tJq)u$ehR`Zl&JriC+&-4`u*uolv~P z%UQus4)^t7gw>JV!~b~LmtFes0>_m>3Db<)G>`P{71ubMCJvdf!-KqSs{$>21cC2f<3MHLD5I&AmfZ#r7a4^hkjbeTGV>sX99W@ho%LQ`J>lQx3(`8-@?vKu z>IwK4t~7#AvSU=&T6FNPe0)*EYwd{;^@1$Yhww+L&X=kmK~sVXC&|eh@-}N}TxK40 zQtOeH+>dx8xMICuiXP`5d8Cmknbnp*VMWo7K0x<{!^k9$RF`Im}YZm=}Q2R3|TmDDtz@!n|p5;RHpy2I` z=MR8kaUXz7qp;nC)qM{ti+vIKc;uZ;o3-6gWB4Dm^`2wqd)Pbj1x0=f}OJAFdB~aYO4bwBwvR7-eX$XqY)D zSLqLQP}YH4dU*m!H&TeX~hOJL`auTMzaXZZi=0c<+IcT=qnH9>q{y)-)95jYNef_EG?^j`E5Q$Zl`6`K4rUK?pyV7%7MR3Amvu}g3H1( z<&IM1SETKuinu=`fX>nM!obuQ&pPALkQ+?gm zDorgu>fP(zNws{Ql=*J{`uqh~d*Uo{dC$paq{S=Hi=87zz_`~ZwHhIJGZVP;%!b_? z^$L3VQCdS6kRlj}QMmKZ_xG>Q%$UDf!QC46PFEn>-&l`3C&JJ(h2wkPD|{?2?5*NP zj&QlS#64S_o$EDtFuIfhGqBgtrty!nBHmSK{ozwhJefT(dd3B2!m+f#A3o9 zJoj>SDQ}DEC#t!Z_owjisO}yV$a8lN#K-i-y>L=TLv2vhlGICnVE0x*1)XeEr)OBq z4#EJ5Q`@3alj^NGYfPdVGt)5b2Dr<`p<`?!htLaRoj-qgl{$}>X-2+T%mznhM2y2< z(fyn?+)MixKVBSVa5KA4zri2Sn|Wkr<`wX*&MKe12c3r$((_63gU~cQHy?H!kv3>> z*3PGO*6zdlR(Q|b4?5jOx2?TA@Q(F#H*4+V-n}($55_<}oz=_=f22blzrW=C1V;VY zQ?fkUd;XwTo0S_M$h-a<<=Ost+R4*qzFZLD53f2>n6>(f8#bg6K9mv>k~V)3>JPv2 zjYmyEL9-9OM26I@&G^gbU(S6aphgdkj4&T8qJ@p=fKG~p3};;(%O;fS;~`<(uO75h z;0J94Ue9}uvvYd`6WHwK!Wap4n|XbA9t7t~&21iriSf#`K46|gmeBFc+LhGbU*49W zRRLCmg|>aJgR8cggMGB`hmSwK9d=)&!XOQ#+%Ffrg-gVH9(~`zy?gA`?uB&NJO=5_ zL5dLOI4UfqVHRx-c@Sohs@*1DGANghiy5E6uzBmic%7vfJ~mg-pO<4A-mY4m3qn6H zrA!?pA$k2x%xJ^mwf5wJ51+PI2ys%HT8*rVSPFHP6^_R>}DY_2K+= zeaWTUHNSJ{IL<#WTaD*8tC#Gxee+yz-n_p!JRbAU73Iq%_E(5sN4T8{!0sSgi>{eU zlOzg`BRPA>4XxA0o)^UO1mz#pVy~qpSUSx~3T#8#R%OJVW1^lo`orP?8I;Pa}{l$Q+|L}qI!$pU4 z0*YhWvE+2%M4kyn)Mp;2DX3jop1l$l5(^ZxuK~pL=^Igu&UCBgV>F zBu;{z9`*ShL6cH9l5w7tOCu1@kds|wT9pIF!wUJ`+7hRXc%6EQX)>jK%9Hg%Zt}aU zM#br*7Vk#|3Si#b8)`W>n$ec`u-x@c+A>sTawyRPIfdY~QyaB}wx7lN`32W29*BmN zIdU+;|F&KZzpgG0IW~qh71wDe`Ug0Nl?@LoX%~{!(I)5;&PS(tZ10*dWP9h*+2nC} z8z=k_lsnJWXElYYSHyH|<^|@)W*`(irJI_8Q99rS<_>L}CELhxC}zvT`s>N+>agZy z)>?n0)G@Qd*Z*ov#G2FTt1M|v$!kJ3;oGofQwihp<}UTDs7R)-=T{$pExZy&LL)eP z%ELp$GvFJvYcqi6Z3g(Do2_S%kDPOw^k7hC>meAr%lSi6xy+x^&a@osJ^DgHv7KT; zx9~Q7<*Dw^ih%7Ju#Q@$m;KufMIm%?G6(6*rOP;rIAZp~DLR07x_3Xq+w$)PdMk67 zCP?(gwFKO*`>(wn_XjAX)ENQ<55V*9gF8EvLoJBNK83{*5Y-Drc(FcCK$jR--k$yJ zqsJh06%?lRyOr-fN^j&fI_rHDY%Y|LkS|ece9$Vy`oyHI8WtO6CA=S&cra^NfErp- zy)||Y5dt_pg#_;h3y{n&oV*jVs3M)dOV`#HFF0!Iv}nxrCRtGZfrFN_bh%KPlbEoW zb67nzf=vW@jqC?$a4hTHoHX-seak?~7nWm|uvwRbhQ}Z9@`ZPsO+0vd_%sSt`Gy+n9;bhepkT9e`F!K|Y^SSI_-VOep z5LD+qsVSm*>BIbBfT5pOmoNPQ#x{l5;aE6pqDhBKtwozQddd>uEVuX><6Nt#Vva{) z44H$3t^#sT+u40rdaX$0imHjo3nminvmnP&rPD7z?X@_pgWiD<*w<&v`&+#T8$_G_ zAr!ZcG03Ig3=?F_fV>D4`?#Jro2M|8`%hQ;`z(JA`R*tu*g|4_wnDhp;z- z;Iyir$Ra}wzk#P_(hXfC*FP=U$u2e1^X`@4*|r8WQn>{-X%p_*f{$v6e@EN6RTzE4 zBL%7VNOMy|{r!+!eQs$S3YK6F#cOGjFF_r!xSJ~imlIp|E|G$6&;Ay>loCbMJj{Q) zEQ!7E{M)l%R|;H}qqkz$lP7_E3p&-Qv0tdc_JO6oJ$t`7et|g%380arjn%4_>2J?o zJC=~paK$k4dkfCv@7}*I2+hNcco$d>KD_++)API*_$%V`xXk?!r@VyUp7zR^eWX|B zi5pYir@wczC>iw?D+koxOU9Hs_OV?j{Wp$#a$HeCU5woSc9~RwN355uP)U;p$E!#@oF8~^=d{r8^-{Wk#pC;tA^@Xy14<==L2xlYX4XN{XrRO|MT!aXzPIV|N2k=*FXH<|2WXbfB%0udkgp| zj`#6@cK333xl1kq0tpgGf(4flT!Op1yGx}gOk5bP3$53 zZ>MG(IWQtU}8KJl>S#~w$Ba{LWJay#5|+Lg9S>m%to z&k)jS995~%^Ngybf`h|s&HQmBTst&;UTz)jD}lvshQDe7^kY);t9yu4`e@3mc=OXG!0 zQY*K#U~M)oyYTO-HN#d;+kk&g2-BP@CwT}~ae4qbj6h}_@hs{1W2t6~u+_tq_8`~t z&q>)x2@V!H#F6|sDU)iLO7+p4dYrb1@`@l&Ir$r5mewlLX-1y9k~2YC&|swY@!G}J za`%OiE2#_1-LlKIgp^j&6^ZDiZKbq=waaKS8D^83=onz88bIoCR7MDH(sPt1{YYxh zX2uTYN+YZddCjOzTD3Ntk~@lK@^=*}y;5DZXzeI1=Zu<-*@sYRYu(+Ai9I#g^&EN2BZ0#6VqwrB!;3sq|YCv^-FIqN6a`}@zWKpN6MrfQl%Uu z|CUW^U&3jI1K{(<^BsB18TP;xBoUvIwAu zN!f*|%VwD>bgXAyOKYe{Yv7+IWt)z&&yN{L4kD=WQfjLqp7Jk(HvEYA5yVi`ay4vQ ziA!5aBqO5KgUFKj8}N}dntA`r$X5;jRi>P1N_>?e`b4NR#s-5CU9)Pjo))JT1#BP{ zNk>NXoS3`hl7H3ENdEOfvXtm5QjwaMT*$vZv|s7{PV;X7If_uVRG4iv;~ni%%juVs znBpt{tWiY5ptnwMKzf)SrdvIBGU27)itJTrFq^izfe_NF={58O+Nma~y~4-To~vLL z?X2d^kKZCQ9)Ixblc}E0DCZYPOsic-(=WTKMOrlSozT_H$82gL8j0m7wP;!wGXhtu zaP5PZQWCdtr;pH1oy=U)CZfyCR$)dv@^uRx7isluqe)-#Byz)4HRDx&u}d$o`q3go zv}#6}dVUdv`S@S@#9(@UPW&Gc>Xxy~uMeYv{EIOEO1+EyD1YmjF4EfbYtgt2)~cxp zjr+n{HA?m-b|CH3Ll}?JRFINHWj!FK^i&yO1iRPWfvZy`Qf|WfV|RfYWV8ze4+Md< z@I;UpTN3{Inc)Mx;g#9n6X9dYaVEIil*5dh)GP}pGM&hD5?fLYK{rWPsbnfCI*MIa zpT5TzbfWtc=7CfN)4nxM(x1t}+oe zGh~6Rgv|!oNhJs5BqaxggQSs*^m7wW;=~Xx4_Y_~7mIsd%zTia&;{@lJqi*_+D9QM z3`L+QnrgTgBWwsc2#3_z=o*i=29-Qy&@-uPQR6T{MJ75JQPc z8)yto2-6grVQ)^!wZJURwN(z8usKvq+#)GSH?FO)w}v**7Qc3w?IDs}a2rV6cxq}8 z42B{24JGa{GtC&vG=_4Iq1?mNaO!RZ;iE`15=O!(7>(N)7z^WIJfx+@ClIeTOeEeU zm`t9h&;q97HjT8W!wi@SvtTyNfiGY#%!B#JUx2(A>hA!pT;{obv~n3I_7OHI@ejfw?1$k9_M@gu zhdRdfaX0}d=@kwLht$YFMf^xOP1;fPmfz?tRyz)5RuTO|)mb>_4R;>%cfv}WxBwSv zvzO>uPTKxuGkl!7g8x-QT!TMA9|WCZ_wis(c{8FbhwGzEw~MLXeoEm;T|&Y zBmaS!2c;h3_Xr-t6L^Zes`LmaghOib^Nd#g9Cq5UA^HtjI`duJ9rNt;7?k(AEwe+Q-BT+P1zL~za7fZ7`?#{?D(ZI{VJMq0`Lz6 zhsJsc{IyEBS0ru5c*48E3R4*uT?G&(5Ihj1Rl%hy>t*RH)fgkHt3=3`va>O|NZN^s zp9Df6DRGiPs8-WVJIr)*Fcvr%3nX4Ga-BjY*JM0ZDg|LvVowF(*rgAq7X2ZDxRF|I z%C$CSR+}=DvZ|$`2%8qHGIOYOS{=fKs`R*J(A+AcR+p8zxJx>#HVCK;pkh2EJ zY=F#A6{{6hd6AjVlq>H9+LvLDE+b%<#C`NEMgoDg2Qr2aOp9WdwAd+$v-E(0t4;8e=)PG~bH#TKe zBzz@Pj#8B|s}Q%U8P6A9+GrE%w+V5Y5XUEvHpWa5X!e<++*^jK>gZVmooiyR1+}$u zs*X1=($?xCw;uVfuQlUJ=B%cwftHWD3Q!F-js96gHPV_h#)PWIS{_E)JfxY2G^IV} zp;d&cCZ?{WjGSiB99nqOh*vVk@l{yDgrHq3{8~dBXbbJ2J#>K9_;Ll+oBzQ$@TNV6sL zdrQi)rCEPbl;b$kA8(eqO-&%|M6=JgLAN%9YeP7h|Jrihmg}}$w^Wm~c3ijPx}8@} zBsJHbT^m`WbWl@Be=1A^8FQy&&OpbR=sF8#b8TZqVBjljxZibtaw8q~q(;O3l~0&<{GR1zN0HNZi!qZxQBVIK_&>F#Rm|C9LQFR6Gz4(*M_!&#zzu z@#iDIIx%Ga*+`tP6Le(G=6bW%lNh3>O>N=&8~7Hs!gnC)Yy%l*x5Ezj9(KYHunT^K zpI|rq413@g*ozMPv|dQ>t$yWtKO8_O8>^`N8G^brMd&Y4{Dd zGsHd1KG`|UaP&P7zrzK%2(n(iM7Yb?ufSF8*WeGh&UGYd-oSnnZozHb?!aBRM;iCx z0qzgs5j=(`_&wG7s%P*VUcgIu1+U=^yoGm!eUD!8tPDSB{nVdYfAjuB>CBrTY3n-k zCD^$3(=}zMVTQ36-@cR@BQNq>Eya^ddQ<5hqz>x)4uP#>&3#0f%1FeK7- zl^Bv>Z;zgdLF!q`C4@9CVJ5{d8TL>JgXE9`x0H|y!r=hAr^ZYJ5fBMcgiDK=4$?yg z$cS4sWWwH;bTXq$7RUq1y>k3d2DnVu3s$f>dtOnJw*TAd^wV*cCfx5WY!>kVtpdr_d zpfNOorqB%c=9n#@CH7XBtufm`TWAOEp#$z6p%eDb&;|P$^!*I8D|Ca;p*!@@`>39J zf7Od{y}9l~UH8?8nClg(2l?L*vp)>bhf=~r>C;2$(^fq>xRapvXeXg+ATr`9KO3`= z+)WK4&S2VyD&Sn;D^xLh{G4f21C& zMj?MVjD|5V7RHf|tQW>(PT*SR(n!Wk8AB&>Jqacwa|%qwJ`JYB41Khki8)Ijqh{-4 z84sDSknsiWcP`8Wkt1vW`M598$1$FdL(g&O*;_5t$E!v91hrV7sFvU_V~Oao6#D`C zt*qac>64gSV%2ieS%LdXSOu$L4f=eUkj7-Q%-7<+4%Wk0utA@~ovW`5tUPTr<1lXG zzX>+O7Wf9fg{|-%Y=iBvgS5YgogjJn0k>W7Bm4xr;b+(bzrbGD2fymFZjV*_^{MIr z`8Y`VAEKNN>yw!?r?IM^u8t7yC>(?1Z~{)kDL4(k!5KIU=iog24j14eT!PDR1+Kz1 z_yexP4Y&!n;5OWWyKoQg!vlB-kKi$7@`U_7#r_PQQ?@T)Jmbwv%vboohBxpQ-obnL z0DpoqW+=_jl@5l%cnE%A2M0L8A6(#u0Kx^bNl={n_HZ2p!H@{IwA}F~rfd>(odiN4 zDI|kX2!rJ8mW`*4q(Dwe;@DK2N`*ZfQgdArxoHR&Va%cxX)4mt7?)?$MrPCgX4C#; zj-REXkTXJ`gZmuZ=inZv(h|pV|AO^Es7hyWKL8nw0xBbNWUt}|;eyR}l|n`1mkBZ( zGN#Mg$f2?jPF62j(IqqKXX83MRwJ!8;Y+It>jKJ&h=V$Ex7 zZqAE;KFALRjCsr@^Hf31LR=SyB7`kUI$@09vbQFEzZm(7gW^VYRRT&Pw-jMZLm4Ow z<%n0_jJLpyC-=-1aIXlJpfXf}s!$E86aFE(iF_HqYZwdJnPV&_omx;E>Oftn2lb%= z@nntB5VH|9h9<@W)fBTCG=~<@5?UFH7(+yVsZXU^qgxx?+d?~|uWE0&RR?1+rKwa$ zV~J@-vCH8H;gH(APZs@@>SQdVewN|B40pLV_T3jN)fu^6$jckrz-QRIg4|DaBc0C; z>9dUO*n1euiMbpZ%gy%ElW@Io?@io3AoV5pjeT)zk5a7oh*?$jGvt24s)zoxivdQg zvf{2}_fYJ*8t9E5k2%Pc8>EqThe8Jjj*#R zzZo#c*upx`r>{+Yf!|#8n+Ja_TS@O5`m2PEWgk!OC7A07w*VHxB3KMdU@0tv<)k6y z8^(^B@ku)8wXJ_CCm9=7nEHQ5SV=?D)745?g?%-wfiGb#tb_IN6-b$EAgzt?HEe>- zum!$>Z(%EZ2ist~vCW&dq`|mD8sD3GZa3%kow&&u@B>tbUGSsnud_DYL3wfifZKnE zvD#AzyM?k&_}^i762g~X>%RIYZ(7o(Y}|!Q{p=>acFX}klixk?3)g!w_kon}ub3nB zUC5F(hEn^fM`^nUa6d?W9fHHgkJN$q`})XFw2M!#C9Kqggx^iB*+)p#k{|0BkscGz!Y3eNQ=iofyeg}iF7r4F%A?%7uxm-$+Bk`2F zOuoFN*Mufq+v3Af-ja_+!gV~@Ir-dQQT z`?xvUTeFYg(evgfPrkgcCaocm_1ZY7-Vn#yw-$YsdW-BE==~1&_wa$V|0GRrpxBO-I^dqlM%jQ3H(x&du-ox> zfRh2nA6(#u00@K;tV2A+OV0Ww2vgQh!I+64F(iQyND9f26AEFF98y4f^h;?wq*5U( z+;&){hBOcXk+yv*iZE#*oo%m54;hdnd)gT>qluFVGD8-wv)YcRY}m6y4jWGuY)4tg zemd7H+J~ZjI8-je=O&zuo$eUhLE1L!0P-74T5-lvm6x~$G4pXP?N{dX{I=?6rRv&Tsvgvb2GG!UjwcD{Xy@l>=jT-;+waWZajLOR)|eMm6Y|#-In78{ z_Pd)?R?-(*V77!-&>DYPySBk>3+=%745_{CqUu20j<|J#&Xj)__zb#2H~1X7Ll5W) zy`VSrfxgfW`ojR^l%$^ylrn%pFxYmUG31gOf}TUsWf=J8*x|Oz^kMP4qDGLm=r|HN zqhK_Q0l9Y{i#ZO)!vxzPH4!EuXEIEIsiY%w>ookQ!wi^dyGpuODYvT$UgfvflAjBO8Q+Z+x-hv$sZ?bKnconF}%x&qM$DumBd~wg?u(5?Bh$ zU^%RSm9Pp{!y5FFvF1zcYmvDQ*27n@0XD+dun9K9dB&+NnBTy+#N7(t5qF#Iy4r4& zb^i_4dN3;kVKvmlvo{8O62W|J%AvjF9Bj|M$j=^zTv^oJN;S`*P z-{1_Kg>!HoeuoQi5iZ$c)n&82b8m-!SK%7`0oUOMI^4v(1-D@v+=07r55N2H03O04 zc#QiKD2o11F`wb~9A035iTMg%!y6b+*_>cLd`lU~m@VU(w8?k)Nnd#nAF%(4sr(#D z104*ofgjkx0Zu=g@&^}(1KeB(U=IWj1aU2GJQy<(B!(oohxq9#DdCfG9f}!-nH*B! zml87-ghOhs(?A475+{nVX|bn+^!R6hj1Uc(ATwmaFDqojo*i;PPRNB@Ziqof9*70G z7tV`YKK%1z79fp+xEI1+7>YnqCMx5X*EOLQ)P_2KgH&D2dQcx4Kttp-g2vDUnnE*Z4lST1w1U>q2HHY9 zXiwY@q|p(x6W5)g3)i1vcJ;fUy7`5w&$;dnJ#gy@z5MRe9;BT=P`&+R{JN<65Wg>B z`eF8m0Wc8a2_H`%k0L+vOluHsgJB2^g<-@QjyVEG64p0{x+&vPAmjOH%w^2!V=%`O ze!TXOwZAX@kLeCI{Y0MCUZ0X)f9&IsdscfyzkbBn@QATN<_l}g9gqJ6{N)+JMB-0^ z$uPy#MaGoJYO3E8=BFpbeL`G$ZpnQJ{$V_&m1l(02`|r0XJAU7nMqz|!EDNIj^8ul z`sRD~#BiTWxWw9X)|)TXJnZw4l@_}^PxY;_B-~)iO!np-=qBr-1-LDQMX=b^?>XAM zWRA6|C4R36@d_PZnfY5vn7Ocw{K*AhkDYCH||t@ne`V{7GXq@z>z~C9H*YupYAM@6}g+a?k#r^es}8-&W|p0soEg zHL^CD@^t1ir`k;Zw%{)7+Ha8S+uQ#Z`&Rf4w!wDTLAdV;ztiu7`hj#xQ)avT-l`w{ z-cdeo^^@P9l(kLmCfv_{O4|eS)H@ucEPla#uQ%;|gssZcaE|`sui?-AgV%3AX|N}% ziLBDNbLvSu;Ad#*FvCG)9YppaZ}`LLX4QdGM{tw;9rcSgf8b8P(W>&)K9qc4_sgPgz)j9a z-tv2|ZX@pw+=Y9Dl{SALc@K!Y3m(EFt{=k_cxtBeOg-}(pq~5rX)pZj+Dku&_R7ym z`B?q=HF5T{?un-~Jj{WN@>)c~8dLU}t+nbK!o7ue^ojRSOy&-*{{$BFN`u4b_18Qz zpV)nCQ=N4qdy00Mhd9MUc-b5C<3WoZy945EPR(hzk$;!w58>c@t|#}4X&Fmo9V6!< zqQKwo){+p$MH(N-gB#fa5Qwa!JZ+OhULAax3T7LI}Um)>kF9 z2WYN;$n(jfzfj&G#Fe=;jMEUDZu_5UCqwQg^avp>8+&@8b`Rw)x(8`t_$7xFkP=ea zgEY@yoFS_{jX8)8#BS6k5h%WKylGL6^ z3;auZ|5kRN#^c$OUE(F?sk7ueRz)S0yDu%tuS2Cp*K`nqe|mcoEzw`XbM_8Dshb_# zGs)T~BlQvunb3`vL0yPEUw!f{%aj$u)8kLe+X@q4`uWb1ur5GOYi~P|JTi}Jf)WSFLfk)N51m^*q^L+EIM$HNx4m8ek+ZBWneRHv@GqToITaQ zv@2hF(jTq8XRF^?=PNoPXSo*sx3c_axy$}TdD4>c@?)E^%2WDA1@cu9EIm{IOP~0d z7i(qYD^zUV9tx2k&qnrnjep?lLHK=Zn z)Pnz3#(y8LWE_(IE_=i>Zb`j|GybMA`|BW8!ye`BOaDFI)g;~y%BL1)ZKz|G2WM)` za%as+KG^;6mW{OikFq`;H|v}6SeqiFq1o5d{eO(3t45^N2i+Un(`%W{JR7PB={ALC z_%(+X$ZQF%ptU_twLy=z__u@h5J!;GskRVZ1{{YU7;I%4&C7~Y4#vY zPv`}`$wMEIHC}LOK@V}Oev@O=Y$QVl8 zVKAKQ5tt)k6ogTCqe*j&J(}?$(?8nF$1=9Y^DF2qW2THLW6d(Rsd32R39Y%0xRSmx zo-`)FM385ylL$8%rr0yHmI*NDBN^K{OUrd;`n>E7W#xoWHd?V z&yqPTgp+IHw%wLPn~uA6Mj@Bx$0@LIkhRkcyJ7bCF!NMfZrpR@9>WPdIU_D|H0}#T zW*$m8H)-Y6X4(T-16h05r&%k^vd5xJ47!QGJYUPpbw2D;p8>RYP0c3HF^t!9DBCZ{ z=UkYFTS+ZDGuzXta&G1tO6kaJs+Jhd=@licLLptjy# zh**WVE@YOItVf3Hg_++A<5n0qIakdZ8d+ZkSaTv=1e{h90!?&10u-1ovh_!aiU0py(3 zBu}i7?bh?rL;tB4=Z4Vlh<%AVO1xt*g8P-@m?wyH5>CNs^!N?V*h_0?$wyUHhVql= zxvV2e^E}A?qs%wI`jyp^a$+$YQnSZy?R!^OzuT*;3xxB9zlhyM{L`#0FJYIsnQ3R% z^A4N3j9ypZDx}lOXqmM#_)2+&s%yw9Mm&-A2V6(r7*0n90cS!?JhF!5%xYNJJ;%gU7k~>P!Dli!1`G9 z71@u7yPFV??d3_=7hhLb(eD~OG1Jx6Q_N@Z9C>n{;|1nRc!j*z$an*9;T^n(5Adgb zk5UdvSN8Yio=f!o*jLhW`crerUUx;>Vny;^5glY6tf=V@?wTB;r><<6eqaX&w*keq zN{k(q2w#ctl{F_a^3yi`9aUJfRKdLp?r}Vqm;Eg?nnS)r4rz*@*RZC8s6pm_IO3YLa(#70KS)_Ip zP-z^sw2%GG*IunT{L{VQ2-1=HJQ6dCw9-O4?CBu`WQ1tQ1eqZVWF<^C$c{Y+_|CZG z#GVUsqkjx$9*Bj!kPq@h0VoKCpfD71NT02(6*cRfwI*(l>~*xX32n=2chdgiq%NTZ z3}#d>N!U^#YdoJ0rMWHxWuY8;l!ppX5h~$U8LB{4s0P)c2GoRFP#fw%T}Pa%hgsh& z`?{pSnuF`&&=BHa8Ev)^W@AS^`Xc8JNTVsp`l=c3&7lRfgjUcR+CW=q2koH)bad2b ze2G?_NK4MScgE}jpFs>KjOAS>XxGQo&T3PaslTHk za@jK@je!skgJ3WWaWtZ({oSvz={6MqVK5v z6pY4y4C#$U?l?zdZ9MTNpqI?!6X|c09L?!7)CGNdGVW6#Gbf;@I$BU#E$A~X68e%n zSo;oA(;TgE5xbms6n~N5nmm5$#`6mFo?)il#v5MZvVR7%9Buy* z-f|aN?YPhRt1Qd!Q8bqklJVp5=M66-Vl3 zq3!d(l^{*=+on0b+r6_I`;gezI%D)`^r;f^!|r@D{tZ_qoHk^+NM{U_x0eBERyCJ;ZE>@d@tYCeJ|@ zn>q~gwhNwHdBZnm4irBr_jq$8v(o!_{~-zKFE!I2nsB|$ydIWtZRs~W;X0|Q*9dR= zR(UK(hoz*w0#?E*$H)Y|eeZc#d&Q%??bXIPOP*&DZw)l2T)xCy3+v4EM<=AW-n<@@ zAkV57&Pkf?k9qdzTQ4~N@jO!Yqc$LOBRa`g_ci7w5Pdg;uZ?WM{tfQmGXHFa?_e8j zhaK=eemmg@!tLVvN3iB9xd-Ce8`rzxXV?S3z+S@da|~3!I%FOSRr}!p9E3xTv9!mr zj89`3pT?2baoERUmo-%=65Y&9Zbr!QtR;N;ll5(=I*i;Sa1^ZlG0B^>(+SjxtS)3c zx88XoU>jqGKv^%vAiR;xFr&P<4sCUq=2F z;$KA%IfI{=@Yj&P8T&;{iTj6R8hyz+YkM8H8*mfZx8Sy8x|STjI}Y*Z*&%Z7!F|eH z)@fxZ*$3Dk;`Rt0!xQ4m9`sY}&)_+{fS2$JUL#lbRNi2Ji~SvDJ^KvG$C?l1-upc= zKEMdQ-zWDRR{8vi`(?(kPuD=o$umaK!2o#{X~XmbJ2=3}23U6D`a7-mm4KCnppO%t#`e`Ii!*r(m;gsxQc`*NDJwZW1Y{Cd(fF$dgm-H1K~14G;%YMrgdh< zIxmyiDfiN>?QqWu*$9^%a-dgE$OR=Ct8$YchBXz#bvnv94`!@$wwBj9N6Y8@Ld)-* zs}*p{x_zEj&^cc#<_jD~)tol7urb1ub?=bpqX=Uj%H#<_;&m;v~$Fyoa+c6;pu&u3O> z6-c8ZMDmslcLb`EX_sAd_D1+K8pgB^zwee3GxP@RKszz<$LB z`uGO=_(rV(@qPEOlJ=+12j$)0hLm3;XberDDabnpa*m@J_U6v7k>?xlLRAaeTuZ04 zQ)#1C9_3txC?sdHkQ_38Dw;!tUhyY;eJuV@Xj{!y20ll z=exUO_JE$IY`5y=bgSM@d80|f%e|$fCHr93_z^?9?XSs6k5B#CS44)?tGxT)U)#!< zDE`*FlfHfbzUZ>hCT~btar=?xEp)QZJX5};-Cx_rSZw(ZAU^{k9tKfX@?1jpnC0ES z!N?i{LqXPJ8AxlGb9+KQWv^5E^m@j};T-fEL0WQVa~N_)B5#zL)(+aVrRQi<&i6du zv#zDRjq#SzSj=%^hY2tdCc$Kw0#jic@~6WH+QB=+ z<@GC~{lpw>r5QyXtRcSKPbX$@@P)DRwwvcf|5x5()t3pfWnYUrXJ6;v&KAkJBDwF~ zg*lHt=H~hITBp28Cu#Ve6G$0+d`>XSxyM_+R=bvGDbi-;nThNVe|%;l&r8@Nq-@ud zpR#5jkox&W(@gn$x&M=N_Gw=^r>PCjnQEi+g8G^k{SDT|-sqT`^p$9af8#rrR~?`00_?ROYA)@|^s z^9a3D^f|;{-O+?L5M`G=9iAg2Bbt25S4a+EmpmUd`j-BEOgl=N$B1(rQ{KBi;XJOLbRN@AaeW$ogTwfrfwOQ9&cpBYfeX%) zUj5{J%L8?hyj&vuWw-)Yz3Euv%&CO>lD)@k-ZtlZj`0UFuY>Hp-@v>Hx5(FRxMTM3 z)84U>_Z7Wy?-Axc{trOTRCX|a^VTKb3c&3VJccLm6yzRT_P=F}l(ACA$+OxS@3?VR zduFC{&U!IFKZDJ(v~&t*6zQ*B)}l;3u4o?rt6C7@ zgCP+lCQcHN{u+Xrj2@a)ObCTANDeXvroc=IsfZU2snItLL_j1&L0YkspGWlZbm*O) zaB?g+f7x8kVPmKRXl?VB;T<7IFA7*}kDW~hK87w&ka4SfhLQojH zyk}7a^A3Idf6I|}Yn8z?{YHYkSx(V~^Kwv(wB!CyeMAmxCc>34^CSCFmpD@;`pKE# z%c>-@WY62CZhG6M%+Ydh&%PtNCZlgiT}b#E&61F_a~ ztdD5Za)w&&ZMz|B2iIxM@#~p4pT2iJcveh0vOeqJ=X>wtIr_85OPc-I8w9@$@e z%j(l|(#>~G+Bn~6@&&yLys^&qgNjGbLH@F5A^R6n&hO|O-19)B>=WZJdjmsA=K^jQ zVJP-t{%^J6{_o8>)(ZQtNV)>psNLW$#+T=cat+EXr)s zoMVRZ)2;ggD~#OZ$i3tjW;*sy{65A_!#z$19&B0nFA~q{_ab{Pa%GN`^=3QsIhgEw z%D1YV-u(M?k#KURMCwb%VSn9PXZ!qZ>MZR+?#+DXSmq&nJ}jVINq^0)TjQX_wdzsIidps_IwvD*@F3A#K-4$`Z#GZsX>)THmPBg}gE3O4vB z(Kq_XtFK`bvNxmO7Wf9gZ~a5`t@wY3`!@fiw8x}+IDC9BLaFWe?SSuza|-!8>Dvpn zWO_2b&JYgPo}V?|{6Lsp{&N2TTKArxez)gGWc>tx{eF*9yJ^Qi`^)!)LV4QG znvCmsQwFfhHg?qoF3g=79H^#XiR!cDuA_tLEQF0FTIkCVm;I0>iVH2g+-tc>&&5DwONb$G`K z_bBwpk8akUhOW*M{+xem{XBk^7!#7=_dE6run(BNIHN#5v0sAy=yMsa_@~jY`lr&b z`A48zq%LjlF#gg;Ll|LFL%3;%sy`^R>-a^PVXXXC($bQqrN<4-n{bOVzYTZHaZ~h^ z_jjXoIj?&c_j@4kjmWOTee4gAxsCdh^D7ViBlSoA>Ch!TZCG|{(ooK6&>@Yf%VYm2 z{fU3L{uG{}zl>qe{WDOHynDg*OaF{!9;%~1y9D|x|Jv-a`1Wn&-STK}8A)4b&L>ZA z;4N`we0pcf4q!4Zo}Wtl~K35GV2bP?2TqY z|E$zKdzB!23-bIhkQ3aN8|z>GTlJrvd~ytcuY&meoIH%T{Bq*Q8r_x4G+nOTX5J!9 zUAPB!#o!*R0$h18dt=68#$o2gyoi|(vma)DGoI+-aum>$@Kq8i+ep4H!WRb2HXi6I z#CU9-!;!svkBe`pKrqDc^%1!jO@v;Fp&e~E31$d>tXS|XtS5C9){{XfgyEMQQn-pT zX30GSCmXp=1>um|Rm_y<+k=z)IqO{_kr($r{ED0PEN4>FxJu~3=pNxhe@M!{dK6|_ zkh37^Fw>Kk>`!FC%*b^#`euT5>?voa&a${l(ze(G#y=a#SwXqq$&Nh-;bo76FA`EO ztoL!tmEcwyjrpz&vwLpj#Nd|)Vv(H}LR1;b+nQ(d;hx`B*1Rr&y&$ACzsw@%fy(QJ zh;KbBsX)G!D(ot+H)sCwJwGXeJXX!<$u|i|zZlnXAm0!vZieN20M}==O3d4w5kP(^ zC=K$iW*N+~P>#6ep@OTjDXSv(N>CZ9;9nK0L3OC%szN#Y_DHMJR;15Y!%bsdrm32) z>U?9G?^cqoeAA{jW*y{69n>YhoRh1ESs$$LkH|b)gZOUMz~xpAT{W3c6?2%ihL&=c zJt&bS`$&zD*O<6Xpee|Dr5R>(+~fI5jnr8Su4OGOZLu`|ExDHG8m%bLH0D=qcxMrv z+CW?4#qd=diPw&Bvai@4vjgr@w;i!}g3hkG)B)$ri1QiOU7;I%4&7b#&>x+N)6-So zER)Sz1KjxbC296{H8kBG@|7H&ujKS`HPQRJnleu|GS^f6kkKCoz(9zHK`aLH3*$`vo0G1DX+dAJ(i)H71j0%AOmwv*Pk)yo z@g?uAXqQ%;HxwUd3ld~Za%q&KrX~|EhA;Za*MDSPI0@NPK)%T}8FQ*Br)`3qX}C>t zwM&pQg|<8$w;3?g)jlDd+)K)rfw)C5=M(F`v!gi%$~ZiW@UuG7vY`R_MCj6;B%R%$f1bnY4H0M-kS>7m$nucX1ocwY*!xnu~ZlT|=-* zTMJb`5NA5`@-FoG5xb4BRn<^4k3Vs}+ck{3(m1!Hsh_2-pl7%?99_gs-W<35_P9ox zZojxjVcOJQ*Jw<>=i?ecv_JLH<~HD`FunWp)WuPgb+vBR#}rrQzM9P;8@_gU*7S{ZJ0 z^rN(yL$ot<{pOlWd3~WDC%7rwv8UKW9zE}1FQ}#*xAMylP(y{D|y#9;5<`S>D z)N3yDn#;ZB3a`1+Yp(K|tIaZ(xAsoC0!$qq8}ijAu?MI^N_DjNf}0a%Ru_oV`Ddd zlDD7f%U0Q3BtMtnGF%}(-Wu4nCA$vKf~`iynvUu zzruVCZ(MS}#P_Cfdk61v`#|_VF*%H>G(P^IgY1bJT-(6Uy;ry6=3*{!aP0(taDf{F zAP|2KW{`WIF7+b!Ou=qlC4$Ww>mq43a|%j+CS&&6LuuX+sjJm@QX$g$Y-LO#-$z0v%b z^8Ba(ZUwP3YjM9P@2;|Mi(6rImoYnrFOW$cUNR2Qwte4EIH>0(MlADE5%(dzsQa*9 z3>k9XI*xe7iC;qGW0r!_PzK7vbw*wJwwQdk>@xg;)H!sJa>Of-e+8&W+)D72^rz9E zE4%mWRmewGSU_H?5vDrSfSSas1+}3L)P;Ib9~wYI_Yu7j;Tl5|_W`}B+n0wp)yys5 zgkY_OUkhl7{8sLxwB@7BCr6o2thq$W;Rat>^Mi2stNTVx%BQvaIR31`NK^LUdN8la zIhBi!6S%unTenNKb8D(Sbbv74-Zm)jj_x?s$$f(PCYHS&-@TjcU!2lABTM?p3HAuP zpxbBAm2x?5z7HC!wz6l?%^j;ghwg4`f8ZW_1U=mORZq9vYs-C~d>dQ74bJm#w|oaW zl&f98pQ-fz6hC%-Q(2~;w^<`u$;PDfw|Hx_qxaRRL&aOD)&i!wY#~t z#(jo+-?Oam&(bc=(k`s`bS2NS2W!2fX07?G=dHZsfqqh_WhtAo_H$;Nk!ug*os1=G z-Ln6Bp0>f03GOA=xzFjZRR(i^Ox~4QZ`SMYjKy-MM4m0l^G#i4Ht*j!kLSLCOv~>o zW8DVwv=JQIMciZ6*Y55r9sVcidz;8tTD}?}_ivl2?=A3+TY4pXSlG`ncWfo@cd!k% zo8hmpPQOBaubBCjZ{7NyUCKVT=(EEuUlY7an5*6}I%gQH{K(ZiH@l!(j*0ZqP=pp+DKU0=cW_#R!=<*#U*(?2pu$y5o z?1NunKOBIAa0m{=5jcu$*;6@&9C>~m#^^LHp%3;{$B}!;CS!z*71mtmo4Z!B7C%8e zIfHl-a{+ps!aPm5-;jL<`&l@Lt|h6T^Vo;;9@+1h7vLgXg3E9Pu7Z4{M7~`jYy4|m z{{g;vm5d0{ctk zzCu@dMz@GKzHhO-ChQw{3-91Pe1JcJ7bcVj^1VrUMyX?8i)momzz^(vV2R}#XBhbQ z5_W&wGEh%0Og98TAb21Maw69^p9OQBh&YLfzf;~<<2nSALNW-2Fh~w5ASI-Na7Ybl zAOa#G3erM4JCUh}0;CxnBzk7vaxYXx~0 zC(rnskk_W9mz?!PI7k@LU*6AcMw-o`1+;`#&>H=uzl#hR@BJu?%;X~q+TeGDJ+k7g z@!Ar$9oO>BgZ2TwGQP*Xu5Vto(upEL?_<6vA$!as}2G88P6qe4;T}D<>6Kx z10FKQTjM|~&OCIYeRMW;;u&JVgHP5J%+Zu*SLlW=vbMaWpVkvo2QtPdHpdX&@4&x1 z@#P*_`c6{%Ll4TeC-j2e&^0XBl1h5H(F z6KsYp@C|$mTS>dW_SD?B`HpzoU_0!#SRs}sDhcpUo)I2o`=oeEg2 zP6sSezXiNt?vuS$*&kttoB88g`bbYR&&)%}JBxnjh<6@-hYN5KF2QA>XQ?XzFZH^n zoX7fA>g5`7mQmi;-Yn~MuCK!lxCysR`OH(SF>aH_9o+6B>mKg+LH0J~drA**e+ZA@ zG4A_dFFXOs|5M^T!|%C-qwHRA{SsaUR9CMVCq|K{H(blNe&3SLJ9rNt2>&N0A3^82 zG`kO&Iv8LJ)PGYT_pU|*Fk@D*+I747Dg*>2_& zH$8qCAS1FQf6*=f~T2bs z0%7Fa?-hw#343MCDo_=waa|ri>)Yyo|2DjQYrU_k9vG`?1nP!n$~3&D%`m)a$h`EB z8Rz4*IS+D zIYVCx{U!Z+_|+%8e9xr;_1O?vjRM{1+E+CW3@{?_k@c5+cV6Caknf1f_v15=clqYO zj5V_N-vl{Lk=YEhIc5vYme2}&Ys@yJ(H7c4d+2~$NBlZrc7`tS8FYni@Huo33^aNK zdJKZAp8S!tdSUj4y7V>K9qmK7zR(Z)!vGiv@qs~RJSm6bj2DA&8w^8WC=5f!aF|A3 zMsPh6M#1R7U_+kY$@eA3(0<0E<2V=(69N+%4f$gD#6YJpiMG<&Z5WdSZN`*9KVxd3 z-Ix~WFs4)AGmtYAW+8tz%z-lS1ozRgjo+?5q<+*#Cg*gp)RK1N%+51-HS**Vv^E z%C`ZfP2a&SEnjCBx4Wcu5AMT*z@+pO?qje&g2(U#o}%Y7;yi~Jz;E#xF9SpAC%ij^ z|7&fcu}IJlwZ{4hA2fvSIpx9lHaZ;Lo)S+zi1pq=qyQ0g(^|X(1h?hYXMr8JpRsjK<6anQ_~~ z9GeAuR>%g~AqV7yT=?ha0i&#sV?3co9!~=;7V_ej4?p>yNq$dq?p8T7Vuq8i-t#SN z;%3uRQvTNZs}O!>z44uj{0Zx2*@u#OCzVmyb6XYhgmUCo-e;G!R=80V8M0<7MqIg{ zkoeh|6K1;Q-Ko?@oF|b{+#_e#LyQuhm-;B%Q@tcI&apl(q0HDtHR0 zipZ;k?8=0#;z?{&^~gS!d{;S%QH?OwJ!e%7sOkB*4yxsOsMq$$9!;pKGr6TWAOE;jxj%=-`PkI-*-APo&Y=)FX;9D$3wIiNU!Nql+i4@fk8@-plMv z$BI84e(6lVuAV5P8-A}@6G<6zhsu2NscsnzKkk~tLDs9Ed*t^4WWLR4B;{8H!XY)M zJ-T}`89mUaC-frUy`c|8(4HcpFZO<<)8DHH&5Cm1w+hjFAo2m0qAehyQf z+{ca~94#34oVe#S-N&NWx0>9e=A!J_1LS%Uo+c*0{htbc?vtkud{i!Yty>hE}Fr_MoxHsJ!HjUss?k=9=vx zRL#Sj@5yacT9Bu||?B?>t9KuG_#$Smnu&4xwr_tbs3KEvy64Wxc0>@fB@tgQuXe5xHMecbh!< z(612Va3S<4gdQE$X2Nd4{~P!gxm)2o?D6KWJ`^TgVZzDzsUoCT$Qa2QdK>;>{2GM( z+Ua&rVPl7<7;B6;{EJiO#fej#IC6fj1mgz%f^ygiKQPYh@{}~kk{`ML33kKJo>H`P ze%l29U%>aCv7CX~i~nqUX>{g%A`S85xr9&8ElB&4c2dS%J1yp!(ms!*|M6VlujFe# z96*QwWC zjOjOsbJJ77xCOW24(@m16u-c64}I?AzlrqajkE{YAL8~1xsTxq$oC?jdaU0Vk#FUk zWt~`x`!)F{(Fv|Q1jzSs9M7Wof$GO1rw7W|5)k>5_CCVaH zy+ViA=<|j&-g+w2XDZ`Y89%FhHJtfB~;7XNf0-}y|BnE^6FG-N`y zwE2ld;MRxsT;H6pGvnv6H=w^XpgbE;o>n`Pu+r|bAUA7J1tVL~crANSL;7n2!$tqf zLA;znjgTSNeO0cY#-G@mc*C)VAY5WsQ|d*+HA`@hG4tBoOjq7x`1CANIoTH>e|d-- zOZsW}H5R_FfPO8|Ptt1XO^e?p4$8?10hh`b)CyUx2-7Md4-d)1Kfkltnzkd)o}{eX z82N+R7zLnUko=-cE29u;7A8&UZ?ZqLlzUpHdh8!E=a~7YaA($J~Eb6z^n+%HF?g- zT&hVvoT^d~-!12~Z)Hqb&s8Ch>)E5J8dQ?A5C8SMwq4Qfzx;Urg|>Im(Tz3Ee}$3x zmOX6xb`7WrwLs43$^0bsT^oJ!vd=q=GOQDnLe=HEUeM>Pak`V||0Oq6)ekzO8lZ#B zpR#Uii0nqt7`G-6hWw`FQ@$hDjO*t3wFv5g?4I-kEB%Y?2el09Wd#4vw2G-##FhQ8 z$KH0-nlf&K?6%0|D?qf*-h9F8zx0)OzO|#sl5&yLVpbie8ACkECw*< z%DiQT?}}eHn91{!&w~aUDJZAzT=#%|gy~6Iy|6Rds@~L9Y1&sGuKRL8w;ww6hXF7U z;t4wlKlvt_?1f7m4aTh@a)#hOjd^x9WB*X>!-C@J6$6doK^@fy!i>Z%Ov&$p^86Wl z7TX~79L%^h*qp0I<0f@CCMZ;m4H|-;|5f%pwrii2BcT*8|3?|f?^bbkjyZofWiQW2Wo%eQ{ME=@17E^gSO@FjE7$;u*#q8)`8E09gt^Q< zhB6q-_$lL&TWzKsx4<{>Eo?=m%(dSUb{lLD8uvf?#aKhWyDqxyAgsLK@_o>F#+>og z^LXl6?o-q2JMoi!h}Wzyf55&gXo9y6$Wze7|D(Ui^LqJ~p4I<;B7Qo?YTs|g6tv%@f3whm3xP9;|?)%NUn?M;)BJc7R+GO;bjDGyy5aH8PZwE2uemf1n zl;!!)Ho-S-XlI9!djyUWN9y1h9ETG@Q<;1JyB(iopZz59P6bWlp60*9Nn4S3pL}^d zO&j|Sa=7H399gF(*5{C(^hX)f??TXQI<}!cJC5^eH!5$dlqFL$4+>@DHUMK7g@^q8D z-U2z_eH-%*+{HbfUk3a5twve9vloWneRu#5LFV2^@ED$ewXV0?+f#lq%nsoo=^sSq zQ__?+lUB(}*qYbv*q-4o?|i3a&F!(xH=YO0H(ucO5?%#4)$5>vDkJsvhWdC5?~rwt zGh$JEv!N4hSKcdskJ|_M6Hd#9HZPuO!905jW_l?I*vr(N|>%zNiYDRQ z@qI&UUHtcUBjcELMyf1w%LU83Z%ueUHb|A{`eWHxb5RA{KBtXdG1qkqSzF1wg6zvP z&Ngu@V%Lfb*^hbO{fL6p$^oAdQcx4KtpH*jiCuN z4NhX7wQ7dFIkbS5l$m_TH+J+Su-UdmdU^%ZIKMt&d6zR(Z)!vGiv@%Uw9-8TsPYV;pW z+#xU&hKato4aYtL`$!lSyo~j&m8a3TkAbl;4!`liA^HUD6R}T%$slvU6wIkG4Zqox z72bSWVTy8YaaJ&A`j9^-c!}{v@N#1=aV%X| zn&bbx;8m;*RuOj3|&V0^1G+Y%`#6!yI;ya+9G2G?v`$%(=uZvI@ZvZ7^`q!jm$Oh zW$;SF<5**?4gQk+F-Lma>3U>;1sh-^d<~oMlkW*{ro6Tg_nY9gMq+-oF&wOR_oeYI za<;;Eu#IrriMIp3hn?^P?1CTRC)f=?n{wAtMyyM){{nkqAN&gY;Q-t~zk`H7gxtfy z>(Q6>1@1@T7#xQaa1u_zY4{D!5MI73mzH0ZlyX0d+c`K7d>6`y;a4Yr4_;?nfQxVm zF2fbL3fJHdxDGeqCftJCa0l+fJ-81K;32v_LiS_QeS*GEu|I?7@B&`KWoq#i{;#pW zfw%Au-opp@6Zla^#YZs|2P+hd1Z4w1u!94f;18}u%wZ6Ky`;90mcelZ?B{~NHtu1U zyn46}g2Bu~!I)C6i7=%s5@RNT5J(EiAQZwNIi!G;kP5;fHKc(Eh=iy_Um0l=Z8Xwh zPY)R&BSb?c$P8H^D`bQ0kOOi;F31frkOyKRFXV&#Pyh--At($*pePiBI4BM!pd^%n z(ohDH14tk`>35K*xg6hyFqVgpf{6;V`_jtEGv(p?3m z3hdHZKzdQX`TqsqyL-obACt^vCi#=>B$-SS?%+=D;%@HYUK-Pc`)JDjG~)ptxddoZfuFmwZJZzUCYIZC_zO z`ZIum3}P@t_?Dr3$1sL7g6|p0C`L1e`u6X!!f}je0u!0UWTx-~Q<=teW-yak%;rZ5 z`H7#I!(4vhSLQLF1uSF{i}{TuEM*x*6tkQatYj6dS;Jb^QNnsQu(47-&p$YKHhdhl zD}_2f)Vl*R$C7Tj153j}u7d}udk1Ce-X1x9<4u+N$D7&0R<^O79qeQmyZM7ZiIVa%QG zelk3hKTLO!w1X{Mfv|?J{5qRe?ubme)s3qs**iUsn_H?ghQ2) zoo3|T<9?MyJFD~gs=`I_D0!W48$OI`98Ps=l$O6L^A%y&+sZ4B#$?*ujxZd`UFA(F z;oj1b=F`f#<59xa!f@VIvrM)v>1c7sB;%YD+0ODE%W>4?cut@ewK-J9JUEFQ>9`2>F z@g_`j&3B*tP36CzW;|g0LHpQ4H0NO+;ZYvrah~8wp5kfKKO=3U;S zi?ptEqdPr#U%n6I`%wBvd@OE>{w$vu?#ZXpdhr>b)0;2k`BK_f^fCUmu%A5N2>Z(4 zPuO2LfPvBnF*s=z4H16JQ1Ra}jNy#ndqygEl=RW^k6|q17|#SIQbUC`$+V$Q%w*vd zevoe})1*&lhB9V~pT%r`q%av3|CEf0e@@26bL{_flhNV+hxQWpVv{)fm3caF&SwD& zlN#y*&;R?sPCU{7uF?GE*NGTU221Mw~=s- z`Fk=g-jq~}Hz(8Mn#Q*%b1U1}&JK36i{1RepGm)*D4ibXq%-0&>CDpn+D%ed7UWWv za+Ifu>!b?8eaR!Vuk4qq+o?!shd)4gAeBf6-y=$O49({tc@7p=KxO{HA>t0DN?O&F z)}`%G)%ZU-jB4^#QFny?Rn^ps;W%-)eATHTE!3_5GJFI_aui1sp8Y#U_-~F?&T-V_ zcut@ewK?I^vC#&|J(NX_x8Eg z@?J-4>#Va2sot(-uUF0u)>TFNWcp8ezgpTTx=EQiroCDGEyB=0`Yij}t;Rz=bDQvX z?%++=>Hz-0LKXXVhi&R_cFqJ%AQqL z2W5x#`CR(<^Bx_`%#T~9^YjgKPH+0AE^Iql*G;`|wbnihwe5yC7ZpU$%io$82>XW~ zRdJhiaojcyUm9Ivx~1`p>9V*=W?72jm(rs6<+LDrMQ7)B%H5`2r@ig*DzAy}!0Tzd z=neZ^i=0LAo5tVbZ938^Eso!zGw&LIFRd1LNtef6mDP=frmNyX>FRheL((kG7A+t*ZI%8sBFs7iKyxaLvrF@ER%j^`z6 zO&7LjXwTZ>?`n&F1u*me`n7i0=hx=&18DElyd!nHZ z*yeg*n{u`(C(mOzAadEmeUM^gbR*Azm4zhoLp?y1?^V@#< zGObjutN=yFIhs z{z!MY@3_PGj?(q0J;-_sA8E?TcLrnz;n*J=-zR^kygN<1Gc#>&{;u#`g7IB@^M?8} z+(RxaU%C9sQThCJu~)-I`;y0g>@TgN@($oYDv3+P_4K!r=I^#Wb}MstX_;Xkc5Ihk PIXdsM2IrW;|NQ$4<=QN$ literal 873296 zcmeEP3t$~Zx!yE|9w{h@z=84zAhdv#mcG)a$;q=lt$op?4-ie$(9mjd0=HdI_S}z{CinM!EXnk{Hbpnz7 zyc+828zP@^oYXl_J$kC4zgP6l5I1`C==A&E_rCNQXPl89H*Q?|w9`&YA9vhwIo(Mo zo#gUE9&)Fje!5G?j2V+tcG9Ft>61@B+2ud;%rjj&e*F0K@y8#ZQ#PNn?JYbdB_-*x zW5=e?I_oUg0b_8% za-hJCX`sM}VN;I0;DWcUvia6v$JWL8)k3IHS z*Iwvv1LaOR<&;cWSl)r6C_ma5+NbHtswbo;O;K@Zhj3G-OmSUlX{j4#Jmle!jx_kE zO`GP1&9tdgr)Ky}UEqZr<4g(}hT*rvOfxBTm6erc%7QeO1C(WiA8BS7ajcg~sUPVk zPVj>d;{e(P#1?7r|IFS-B+JTt4a+W=i2Agnf29N1zL&{Po!lvJrfj-EZ@szR4gLsyMX`p6( zsEctX7W5M@@&LDeas0=4!gg%diGJ31>hwwJvdW1WoLFyQH+}ka7kd*=_<=RBq#rgU zwqf=}d^UTUHm1HXU2Fs7qwP^1mdh-&shjmPDbf+946y-zh#yS*59au9+8=cy4y+$B zD4jMbU0&_A0q_CaFgzI#o**09apdFpz_volbWppE*t%FYwoTTFwll-f&-Q@2B8_z> zg&gxBE+z%vVA_8$$A6Tab%7ssH7WdbQ%WbN%WGvm5E~FPVrqtoFZjsII8yL44fdoT z@w6}ebVx5RFVBP-4~jH6=r;WfGf$H;50;-4JSGMVg8~O)Wm2RK=KPOw8gunPJLolS zje4_Q@UzaeKWN$XY3Yg?GEPiY_k$*Gumxmj6Zqj^6Eh8dIM{%8U>qoI$T;v&M-V^w z(AVuW=FM_2OkIp;9av}RW13la#3O8CMA?1O{#^f~4rblVIs*sR5xCJ`UOOp0wanWS zAYQNm9K)oDBkrKIl^KsR&>=p^rZzuyfl@zpfHIzx)s0Z6LuwdA%H*f;(X5Ha0uaWVfT#XaNllT!^gz0Ecq%jWEv?=ofFC4;j;AJ{w zOgZW?^)e26;HRxgp$mS>z>j(%Y}OT6AdMIhn}3!42W$Pu@t^fTy-;t|m31_+v2g)k zd6ldQs{DP4SOH(k({8jW;t@xOc;HKF#?wy<9;^izHYwW#D4dxO%L2+Wf(L#&+y00L zKjVoDDX>F2_PYmb{|EEFxo&!TWi4$-&+XrRJrkAE;GjOl$&FSPN z_OuDY6%`d3n=qYrMA-Dx{)jgn;=xCG=r`?e^1{!ulCpfDh+`e;XT42+6Epb1voDVS zm{-iYppL)+7|{N#Kk*?25Bv-hAKV{S$FWxO=63MV4)Eu)tJ&Wv2Wqwf>L4W_%M{cu zz+;w|GN81#X@Azq!~^ocgmy<7`1VEnWBzA-Sufffbu!xk!X{3{26Due6#c()hO_}` z3rMHSWmnjeb|ZyOI;3OFKpNvf%`n>oDAJfWsmW{Bfqqc(f)XEMfjIE6O|Tv8tK&cF z#X7N$q{M{jZ0ig&oi;$c=_>0=)6*+dyP-X3AJcw_i^XETaRG6#HThvTI>u24c}?50 zOrR(eDCJm2mLFlHnenJA!n8kmp@;Zz>_qsiL0tb2*8M;9qF!vnv@h$2G~!1b$isM0 z@Bu6M8P9Ol4B0QN_R^3}JAl%rq-GlYXctH`|HC*v(0jkshkCL;q^P4=XJUbPI^abd$qyM~4N8AS z_0)8%Mztm44I7$v1h3f!On(qxP`fbO3H_kVllEj9;#p7lSvT@A4)v!4Pwmuc>6%iR z(nzG z;txtcW!Nsvc=CZF-3(I>)Rtx0SQhd!o@FK_AM3_CgI0^JYh5Q}nc%{{LW*-*gJu80 z8vnWeXB~)xZFAzmbl?X+;u%MKF%4KE4q-U>V^!1BRWsGI8rlN!rrpdibs!!6owjE@ zcNBdI`;t>ama$`K7F>SiIvUH8~ zch(n_^`f7Ywr4-t7sr3hD=0tf!g?c)^|WmcJb)vyLzs9HQ`&@Kq%)4TLR@uR?hPtc z-$XiW3kN?PZ3)UWQt&_z!f@b07><7GAw`+!W=t8e_<4|yYrS~_HigYi+rm#>rr)$T+X?uP zAJeMDA4gvoS5>Z_IiRdTjuaz<_?Fv+scJtK+|Ie}-va+TFwhe&9&l5Qg8xmSIr(ZJWbpv?0H(f5e*aj#^UgjMa*;y5_^bE0ix!50hgNJ1RAHuAk zSr_miOdFf_MjHDBDENpC!u#U$ANGH?W3#@j8~XslsI!d`!lq-pV4Q6qhDq%Dsi?xgiV_>FO#yo zpom9V;YU45%{s%*bVz60K-^&V|G`}UW8FGl-u0b4UF~O}zGfYP3F6rQQExcfoR}dF z7}Cy&H~mPXO=tsz>DUJ5%$bw1`K8HAUH_#UHl!CWSdflM9<#*7W$j)owy%t-`vS;P zo_U&OVLGT;ZkB^}AT{ep8=Gyyj3ZWq+5ZP~|M%=k6VhcfW9hR?)w?~Yk6l;bfjBtg z$2i&@STc=%+Q764;$U;ckk2>cq5UC;FviZo?Eizg|BH9m=gphv+5+`Lomfv$I$%JD zxP0tx;!Jzd2Bw|h=en-Gp}}YW&q^D(D*37O`t`l(8sRIKyep)PwmkJC9u9fKF+Y}t z@u(;Lv@h#~G{&+1tTQlTp9c@yg4zG^4G+FoXHsBohV${`8v=uAf0X;9S8qt4J$Yhg zEyKE^esqXKT|tQ*(-5Wu-ozSlCjPdceV6fdGM;~E>AC6Tm7h+3?(<(rUvur3(${|J z`t-HeZA@P$bi?IWq-WIBx@~}VHYx3iIO;?k{7hp!%g%U|m2oCTJZ+4+(-8}{1=IeB z!#ZZsqDATR&O6Vg=bn46>;K>fKbU_1``@1_5AzSAC@b2?V2%IKi}@dRI8FR`j?Ma! z5*LKw4+|=N^}UxUyTkUDyYkbYP0to= zp@Vv;n_~#{GR~wdC(Fe0B21ezE~x&nE8^K6AcHuJ|EB#Braqfeza1YI#+Wgf{U0{3 znpNlaf7Au#VB0n^AV!D-55lYq{RqPk%uT;(1J^G+aaq637B|DaXS4PJq&;5HzAAl< z^n26(S0t}=Ab?Ee5W#8+0zo*SH_BleQ)n#0j$KFXsL~a6~-IfO50!h(j8jotGU35BmRLjsLj+ zhyE#3OBI!J+x115aV#^!v@7dEig?tK*w%`jVe`1`$6>5z8f;|SiDA>8@S9=s#A0Xz zg0Vb9hEBvY4PoYE`dK!VmE~idfIZ@9U&OQCjI+ZWFG0=mAK`dBo?fkS6QphteP}}y1L*3w5uduK=FTx*Y zfAoLkUt3$7o-t!adZw&t=n#kJ8O$RWMgJV^{lC)MiuBo2)q5p32Ce^DRCe!CPkWUf8bbMU7emid$v0dpdDb31@=c z?5*Pc72FG;Zf1SyH_KV&+FZ^{iQT7*A8970@Y9~e+@$oIwuB$?aJl@Z9Qk3x${IOK zB4-KUr!M+IO+U*E%JQ?0h(o9;-<RJr^nG<8U6fLa2!qF=V}nHSrFz1>(qO+MB$fjJNGg z9;P!NP<6)G+aEUbK|0DxYTBK)pv_r#P~u_QpMKaLe$)Pl!}yPWwQ%7=_kNEQ`$5P* zABVCJ_V_;z-*8z}mmVkm2JMz@+QmWYRqHyLU&ZEboYCKjAF(rOQ2lIs(T>?DWx!+l zO&P|MR>b5i$xQDah4v<88$kJ42l_!-Pf**LZ2@);vOjP{`Ox>dhDF}+n;7NeAMEiT z{eSGViRt&rI>4=qoO!O%u3FAPvptyj*nYbn#2M6dzy#rpopcy+w5RE39H=QnKPdgw zOiu&G@ygxMBMyVGyl-(LSAKg|EwTfv?W<^#kP>d^lO>;4~l z$BO-@o>QHkEbr*W@GhI!z6?%}@ofJ=*bqNriLmLi)z!2u_=3WWr;TZE#)rvx`RX zpLH-X3W}rsNo}kdrd<%GA2y_YO+RhTG}@drm+g@Uct9&_)j4yP1LcGsvtIPGezv`k zPFo|*90L%B{ZA=5F+Ezo1CKK`Snt=@*QXmB8`FtIB14;+n%sLpq~l%?4m>R_E$)8N ziWMu;OP4Nn<1v2VcLD~>{-??LU$ifj7x~!pzgb`6Vq!?lNSPKyX>U-ZGi=(CHaFvJ zJ~K>z7-c@wWe$kdNE?uM5Lq^q8Ge@CtRMVlnu!DLPD;#R|JpOpN|(LwOczhg{aEW` z-v?_!><9850Q*059a+p$_*^ger@}+{tGN zoAxr}gY3sRwh@L+YU*RWsTY2RnGTBgjVkoJ=tyTBP$&3d2eZEH115zZ4s8IoZ;&%9 zzz@IEa_Xt4y7r~*gDC6@+-(OPri1O_25tP8`5$Fivu2GuW(C=w^|ozJyoettF*j{P z8!*ido3??U>5NA>s2$jRN>((ke)7C+hbvG&PP6|1k=Kzjq4?O!ryQ6QT zeW3rt4~O{{dqbELFdiU|<2=TCI?l_3IsT))VLrl`1pCv@VbsJ4emLT5`WZ)?+F{0% zBAvD~{fq+*Y6n4W&D6;<^`X<{xlyg`-N<=jq_I8Q^``9+Pd_Lf)^S~3U2ebS`~UX% zk1+za2F09?{twK#9{>vdxQ8?y+R(pZ{6{-OzQ~XDVts)P9qdAX5T%XnG{&2DVH|kr z2PF@v=}bG*PdUmkY*OmC%fxVnw1F~t28uB1%y@<_yGZ`1+$P`~hQZwE3 zGab~l2mPjP!~Ed2ZOgDJL!CBd85qwn%fztzZJKhg4WJ&TBOb(twnse1am=5v*BPgr znm%2=sc80p*q-MAG0x-p5A2WiAMOhTDvq_mo zO8iKHGyOKD4NPj8Me#Cy5JkeW##_*Bh9Qo?Qh4yM!*s4 zdyEC9{n4i|Mu5^`{71h7?)Dnc472|a=K3FbVEw|f5f7WP&cwt_2c`%UTjFio1L;UJ z`Ak33C__qJxhVNb?Yx)|Da&itV|t~We~)?Zc%sfoC#4@@jsfWZm&yBy9J_(1X@B%_ zJp1AKAMhg`{T{fZZ=3ggrl0qJgSq}gdjlrO18u-=<0d}zgP(p-Vj4tkyOGC^M;K|0 zhaGLlG@F-l)XgyY%=m16w=VczVN8t!cAF$(iW|wdtud7Nw^Oc4gvVfBg2NegBVjKl(h@Sm^WE4}|SO zQO0b)wjQNTu8x7EEq=`W(&mA9-#Cy-VEo`L3vQqwqbH8 zTTmLy%ycuX{L%*GyY{RvsOtCfZ2z1I=^6DCxD_mr^*h;{;7qu+Di7ZiKFs9PZp<1)v8v;(xQvI%FVr%q7w4b~S}LyR6j zHa&Wr`VDD>!yNL449Ww&vzs=g+b+K&z4*eLcuGkJ2!GhdsUI?OcM*rsI_G7d~r_xsaJr>191Kbcb7ke+nz z#pwkXjCSpf@gMi}zzX)q{XWlq;=Ta)emD<=d;R{}A7}Kij+`OqwQA%y88JU#{>B_K zdXmf&6V<(9nC;PaIM2hzu>bp;E=@1}=&k8<*4`rakGuNuEE2A@wbgwl35t7E;KDJG zHYa{|nDHhB?g*38PkRK}*_J0SsjY+Ypr)+pr+v*h_!&>ix`N_&j;2mi>tn2wC)d`e z$Dh-kxo^Tcn)`p?NB_rs0Ngm1qD{c|W*M{jfd|Kb*dFccy6diU^+6|}5n>&gZ5_e1 zcKMbH$^_fv-2`_$k+ExvwCB=k@?5S~-UF`m&Z(dd$P;*&Smg2(zc31UJ1rJ#31;bjm5GxOTw(KH}lPgFat~ z-N}ow0c{92h0WnddC=A{#v@PI5cvi<`@R8sA&0hteogzMjZT;-zXMcOCF5D&-#JJ7 z1rMD?Mj%OS-mB?dKy7xWXpD6}+^cNwGfQI2=SxUizUA za?p*n1j>kY8~m_6?lqDB2`8Ko=&%+w#{-NVC?DDt<^r?@;E#9IfLUi}r#miVor3WO zZ5Q{fv@O~*_N`$X#G{=uo889cIUT6m>3*=$vnGLP!Ph4}S zi$D4i+97zcmPS47c9|&C^y?7;?Snd zwuv$#9_@*IkU3e-!XXVh5RWo}4|pJq{6GIFIG2|N%7 zeS_&>7qnU6fHI*TC!KVXYY&uxc0oGYG};{SV0(p4fEDY5Fy%l|AM`!cle}2BAs%=j z4r3-L`U=W}Fl>zR0Di<_J&JY%J@BJE=tC?ou!0V>1*8L0IM@mGK^)Q%hAh$;2O08$ z2YDk74*aMG+aJ>5U=zqQU&NXDP#)=KJn{iADg5Y1;DO&PFY`b?gXLg*^mSl@u@DYr zF#9&jinfXSXsn}QJM=w_YiJ9w18fIb*u#`X|G>RB(t*XyIrFO*40oItY97A-t@V!c zZ;s;>i7P1?KYpY$zUUp|$Cdoy&c{xb^vD8Df3B!XmA{8N!{GnZ#xJ*kHcwg6Jf(Db z>G(wRa)kF^`w`fWz}pvrC379;wgY7R_{&F*94+I>NyTcM$rq6&bCMH!Cha3=nZ z$DT!f;uej3wZ@famb+>Wa`_l8mWm!ap~#&(7`LD9N8oLWK{( z=TG^@4Xz)V(c-qmg>#xNN^~)zpENZl{S3yfjkC{k$ED~+9g5bhap~q6UvX(_`!hdu z$LohQ)$3Z;v3JA?!;6ZFWgPQH?jlLtBJK_^%Gr6#aSq1Q=po&%UKV@f$e0@@P3duR z=kL}$?&fPz%8_n*?Kz)5#z#&cwgd9OzeFNg-?KFS@t@xLsH^`6KXm6K%8^1YA_3}O zAQKAf3?Awwert95jt?musmG(ma@XL=k&kkv%at7Ud2+}5WemYd?~kngkO$) zlp`PYF}!|+@*%%5;*IL|exbJCu9#}~Va8DU4)s!w z_Ozf#)_6 zU|yGMp7^qWJS(rNRZ=^uTw3zq{;<{=Ms~=(3obYB+ZNOb(p3(rp1YAg%qhlzGyEXu zxdTSI&T)WO*af}B*ye!-URYTJn+YRWd#U$RpLcB#z2a7P?jxm4e`)GfHCK(feP!T1 ziLH0c<_iMnESt{`M>_cB37Wy6w=uu6*wkHA;`RWAD@cu$_q&{+4cF3dM)3 zT{}9YY7GVv&yL?N8s)%++wnQEq1jigEVZI4ehIeZF zZMq{rJ0`E1-7h=FKjOC|?M6GY+_bL>_o{yAIF%~=2i+eTrc^NHyyu$p4~wNgitR`P z`(y8jVKRcr5RtV%La*C_r4!qil2)<08A*SHMs-D=RQ-|RfugP7RrX8XnV%iUY@6#_ za~E0;^hc~EIF>&yRb+j$=~62gwI;+|#JPua5oI|?W#%%y77CjiAxC?^NBl<~iMdGS zhOsq%j+%>Ful|iY7nR1>_|{hW*5BdEaP;uyv}?6&XE>)&-- z-&CdI+4dRsbK4;k3)SW~R%K{N+do1hmTfNb>9sN?-iYQd&x8@MhPon8=(*_9Vl{?o z%Jlxy_+6^aNAAwA?MM3A_BY-4M|Tco+h^PPQJ!sInxuOzsdt=GX%fk&)cx3*`u;56 z`Y)-kTHUs)si&=DwIlxr^!g?nbU(C?S@o_o?k`DObsr-wL}jIBKF|-J;guzXEhdr#ZyvE7OGL~~E$@{V;jB00jlE3fCR)*D`O z=S=3t^0T}wKhs&Sy`lW?ltRUCROOG{e{W{|PD(uM6%jve!#aRs>{&9mv8SV>z5Al> zp2VuguEdJQ&aRHmL|0E+qPsD%x_eDmqOq+7aowh9pg;0;T@FpjWakZhQN9en_-!7@ zqI>}uw=}No>R8hWj>4`@x?H4`w)1BB$d?Vj#k1;`OsH*~-_U5Z;(nHo<;g`^zKq>P zz^(&y477cB>UKuTa@u*beB{f9-$2?o`3=?nNOP5seA&vkC+y4lGxg*CuAgc;R&{oC zx5?nT(izw}lzRunwh+2$&OhAoi8Q6xPo#zDA}?&m3+*u5`ic35&Yusc^E?AJf3jY= z=1-Q3{fPFD{G`A3pPA@bmFVfZsAOJ8OCtBcO#t(t-)156;I&zjdi_kgOWU8+=Fcb0 zvsvKHWq;-yYX3(D*8Z$lF8i}wgqHSCKGR?O&lR(`qw^2=brTEO56zo?sGiG_CiVK6 zv=Egn1}S9W&)WZW{$ciyJT|cQXT5USpLnn?w14W^{@Q1J(z(tfCP^rJslG?)FEZ~dzKl2Ty8xre!Wap-2K~vl6{_g{4fHgd~vXDkxzTUWAf03@!_9x9(5BLt% z%;qD?T=r+aq4wV~u=Z!Ya@n8dBDA!BIa%gIANeS^PRmiBCs*Sxn<+;=%5Bne)JM5Div4(!k8(y;y)&f#Jv(y zdRgu;dGb?!=>{cFy{x}I4iG=`Q$G0xJ^$-+u>N84pOkwg7|9XjXyR315;{x>^ zJJNAF4sqoCp5rW%85U=-8-`U6#~jx86q1a)-@RJB&!lN;kv`x4+L}jjE~?NA^}%|Q zdU#$ier~|ob*H^X>3_0H(Iaa8;q1BB>y4tL!PdJ$bjjIu(mv+}50Mmht!$V#;yYEW9J?6RvdR97&kO1?MS=P zj;tN+>xQ=-QtNDcmuEMGwH@b4pI#yk*Kzs=eS{7lrlOt6x<6*K<0Z^Cy*Z++QMqRmz<(-urJD_NrU1pm{U?E47c8p$qj{{8z7X z*PYaxFJ(WCYd!3zksy7&pOd)`*8t3$&J@ul^Ja$H?+O(*Z;lr1fS-N6-R4c&jdmm+ zw66-c3iiKzkZJNZqKvl-wj=zyxVOZ~IO%*<94@YRcs_>VCseZaSK0B)GT!2yFUL7p z=FNs-Pr5FAyfyp5seyKU(#mIO2GJk!z61OBck>)?1?YY1ii}vQ&PjJCO6r^Ogt>pk zU*^0^1Tzgr0y2;uF>@ic0Z**3m><>(81vDV;SSa10N>}0@Fd|wI`)Wg@jDBrs-P43 zrP|*|uvmB_2fvm%_YM7#x?g3+V}z40d;AESS0Q1P6Y~$}8_qwGAE^0<^AhiyOZB|N z`$yhSn)&};8qd{I2#lZjHp3gm|0OX+!S`)X?sypYXAw=~zgPEb$zSf?eH-;~+=|>B zr0*;lr*P@{XWK{pVU-yA7xl#D-nT8gT4ZJZAq~85d!zUmK?8SQL36RIO#VP`*!-iU z$vO1z+h{l1G5$Zwjtqtwjt2?2vXA1fD-RTn&lG<{ zT(})ErgC1&ZO7p<>wDJod@RDgOEY%VcB36xBifhYJw9Gixo)!%ZWwzUH-(H^2tX}d_aOR z$U{c_XCocDju&~zNZ5hiTG90tCGU*<*zYP2zu_0#F1-0`m5~3xyMG+p{FU>z4m)Y| zR^i?H=#{^UEjesn>}OXV7n3r?q<$0rGUBMpH61T)kuq%g^k2Vx-x+^9vEma|^#)m>w5sQmpY*Ti1^=^L@tXMO$tAK&t;EwyhvRWafA z$G2?$+Bt6dXI$78yK44~ij&`WkBirh4d>qXtrHWm)5~819+~UJA9uKT-2H>YVpCSO zZ|%D2oUNi`>meuJ7`y%D7c0Ix=^p5)`0Q)f-IuzhxN=AQr7fbv)d?jh+|phpI;t`X zhq&jmyKi;zHLIC#9NLX3SGd17cK72mV+URRzgt$`y=Y74#s9g*#D4x8OS$xLRe$*P z+pBP2V_q1q&aapfE4}xHEw4X%&6eWVUd1Qr`dsL@OJyCw`<)|ozwN_lMR>aGx|USQ z_XsP78KWNN#o&vwq`_Q;#(HIgWRWx6iA2=1khrYpdSm=fp--=Tz^}OYfI|;;Psw}b z878|txbTg|FJFIj1$KN68!xLYiQe6J-+cM+gMqhu{l~R5HIG|9Zc4D5Ev1tu zPiP)DacXl*OJeG{A&5`E8L?89P+^?_=_b(ibYFBu2SZS=4x4>6T0RQC^hsG0dSXulBq0 zniqU-*!AS|2jeaFx456h{jHSV-{QU(&y{eWi|0J-b0*017f!o5@^FB@ZD-0}1}?oXa@+ViUswe~ z|Dv9_-2JU>KT`W5r0$&C>)O`)7Tc(i#|Rp^_P3z-LO~4p*_V=LtpDzsu|t8^Fdv2+2%m_KemVA@Q6;}^A(0?2H>swUvCWWs;lQK!{qr&%83`j zh2Kvj3+P2ZSR0^MNrMZQXjYyf_m_60-DpSlZ`yZHS3GEJLYdGPIi3aC(cc5HFETVQ z+L3mn9a&r2SDx@Z;5e5U{gGkSA7{%;pY`JKZB+KRh5AKM#NlF?>4*wyEczr17zrsqeSHzMJP(v>x{V$Q42Bs;PVJx{CO@z!`tucIzr_H`+0I zsj?&6iGl{}s0i0p5`}g0`9|0PP`vIsSSZ(33{Up6=@8b&_PXjAXNr8G8qcZ1#&N2` z+fT5iefj5OtgG@F-E1v;e>gKAYrAFasQY(dzuW`W3bP~ERr%S`|Ga4rRAbPx%-B)e zjdo;)?3doUs#f&#<)0lGt6|PWnWi~8aWJ1a)sFuY0w*H zM^6JdhwjC773bUi>#D+R&2^R8Hk}0rhOVo)j^etCxpBS4b5}fv#dE>jw<7-^nhS-y&rL`T3=CbzLfnxqV=%%L;pM$?M6GMPFHrMeU%;ezVleG?6^W;w}v44T{OP#;_ z+}20`-8;XOe)t`+BhU2CFWolrgv!Mg{_{(npX_kYFZGW8QpN4ZjET+PaO{2eR6lXY zha>OVa@U=oD}U|R|50&I_58d3ul?wU&PrZUbJHQ;-riUofAB+7kFLG$yeqbM|MXim ziQ($}2+AR4b+6sUWB++9BAJVNn0uVN6Gtt!j-YUF%sxwHp2s@sdvkr~v7kBVJQj1z zMlt@n=dtwt&QLv%6?H+#avlq>iWVPmR3YcFvf;WvZRjJg|2&qn*Pq97UMSkl^H><4 z-ScAuavqD{4@~OcGbsG~f#&Z=3~V2}eK&3_)?KT<(-U9(Gk4v%PSezRDja`Qy-ykc zk^g%*b`4O3-T8hX%fauSZM;sE%g#sbXv_Li=D!k2Bp>B=X*ueny#4(^@=-4NC6yob zQO^E;Ao(a4`FABpeU!7mA4opRwSH5{Q6J^h_XEB9k&kjaZ&Gs9=gE2BgDa6p@=o~+OM?T8!nylogk8;vV+}29_k&kkbn3AJD%3V9s zFGoJgl~yY`>Z6?f{Xp_jE~?u*^-)fJKhVR4e3WB?>%J0zf)XR2fw+G6TpYo9<3Sa7FzIMByJozbKs^zJd z`G(1ppYka!PrWR^-M*MV`6)kUsVYD962CBc@>71PmZx5pJ4~MZluv4T>gD)kw>y@f z{FL9U<*AqW+wG6?8=HyoVjpdbrP+JS9k9dyUeB^DwyZJr`UIt5Dcqe$T~y4#)4`oK@ zu>E561AfmA-zKy#CC%8O|2;d}jdoi6v8|Kji2F~7-jAQodj&bY%Z zu)b%X5@Mb`K1B<%a1orHbgvy-szdv-+_SOqtv_;KYI7(pNQ7OaV!4C{qLoiHrm_$ zoPTIH+A(>kY8SMxs>lBKQubDR(vGwn?a2O3`|j!Thpi)c?k?ok!0 z(~h(o?Z`Z6-~I2U5Rtu;!j5>~H=^g;6Qr2_)kAQ(`OZ*q>fRIkuX^9thgr7wQuI2C z>nc9a=KVeQ)A?M0_xJYxIuOQK^ly?e?(5}4Q1X7)x7;19ps_3YkXl!frbg&>)&E`U zzV}%3_&F;SH)57q)ZbYAUTcHjZW#&!RueH9XTFXe#kM5V|v0@;E?nHJC=$K;ll06vS2(5 zvZH@pHT2(0q1|Xl;zRp7PDz#YxEeWOBeqM`OuT%}@8j`QXWID9|wpl1)SR3c(H_e1`%gFaIXm)(xg8)io(4Ru5N z!u+^Q+Hz*T9hTp^3cro8H(&O8N;fH8Wcw_7-G?!7S~tY$09!{<`;aY>w2-L+P}I$e8GJn^03~&(lq%GwZ4k~ zZTHq$)Wh*0_4fdMd-3<`dId4yXJ2o(br$VLJ4SXXJJP-iAM9UsKB%!$->d80wB5#z zVSb;E<2u8*uj_lMao+x3-8u5Tx^sj-=-z=k_`SOI0eY1*IfwrD>S#CGk^P(YB@%mz zhS`z(R~XNN?C4)-4gK{p?M6G&UbL^bf5rZ&zpJAAqxro$_BVc?j(a2wGaY$k|E@~? zLFkLP!t7{%uP(@ro(837sQ%6DU+MXF|Nd2BmgaX=d{P15tINE1@`zgB6#m}H%tXhk zL{Ha6C0O`%`|{h(z#ReeQNAk2d_bKi-uTyh+;6;8QJ*L0fA55Rl-pc1(k&BAPJ2<+Pv=XyV@CSr$d{3OL$xRBqulkwEji6cxmMl&sLzx0*N=RZWBc8x z^-=Dakq^5!@2nsBC`Uf(W4PlGPY&;KuwU>T_?W+``jMaZu-hH-g*^EwU;386zfs<9 zf0QRbQ`6)l724ZQpzJ)b(N)mV^B&M4tSVPilGUW&Q1To5^4E zQ$BjH%Aa~!?=X4tQ$GH%l4m*C?!)jWKjkBOe5YRGPdzq%ka|3eso2M^ahXdn66AmcW(&dnAj79V2LD`<@%|`%l3R z_}Q0|W~~2ilCeX9(vGwn?Z|dP`>MM7-y@Md`zps-;XXIZ2MhIEK#udJ0K7%secsY5 z-|my&Eh?7ZiI(>dj&n8^!v(i# zU-`ZV#B~nWJ;^8aeuQ5C@P38sZ?2=c9x`)1T95Zh=^HpNbj(QX;slQ^kss*iSenM) zQ0tTU&Y*RQnM<&r^Ck6goK3zSpszAgtF-9zLN^rlyGy7iE_dDY!uLg2s>&hl^ZqP; zkNOz-%_X>CEL>&Khp|==1Ag|Uq!~N(*FCfw?HGAgw-4P;6cRWebmxOaMSdGV!oS|` zg|qv3Ug!b4^C&TQ-DAv`?s=gHi=KBL6#k&KJj7r__Jh>{cJy0r=%3%E-DpSlZ`xNu zeSWohUMQVzl;0IUGVk>(&kLOwfVb!muw$w7fnjjrc2wn3>(|_Nd>fn>(&IAiNPK8t z$GKVh-ObYfKKCHfZoTr_hs4#s@RN^k7guwb^b0&2#4}{tiQ_1rD>JOp)pO+R=Y@_L z`GH|@+3lFEKPqX~X6RDPkIQ7-;=G#@%z}qKKL&gIc_Dvkz2BNp@n}QYFFrNOoE93S z^Fmx#ah(-^O0BcF{<8P?xZlS07Hje4;c9-lQtZdy3+O%YdlGVrg65>i-}E|5)8udU zJo@GZ1${r4`E#8`Jsb~GF9oc#9P9T2oG1P3E-DS7>-7UKcb(;YK&`Vfl;eZ?T||LJ z)>*v=9^<<3@qqY+oy&#>@AA*qUi`lAqaA6tj2(Zi+6C>aYHIyn!0y;Z#UVz_@L;v>zQrd2`W8|;OjrN35~n z!tCfDN&WXdL(z`38|_HD(Y_4tDH>)+&X2HT(0dZS2YxkVbl6ih$uHl?=ll740a`BG z?*)ASs1H`!r3m}IfO7fX|Jm}5|NG>-{*aj^-~PWyzW0BUeB&SC_sQ=7+$7)rKS_P> z-*Lt*m?XanaQDS8UG)II^IInJGeqX`di8q&XNoS!f7|%Ifa67%mhb)eH!rAq>a-`f zJwMB-g8c3BdjW@i^Y*Pz$nOP68MeOb#2aIGR-O?%LVhnm%1}}E+I9CWdaUe4iCx!v?0xN{-kfmy*x%oO`d1R=&wu-} zia+0X>RpE&Q~J<(U%#;?)|1-4!-+q*@wZcIU+lhd`{e1VnqL&ft5F8!P}}|2+XaCS zR7{DL-TT6pHy*ua%Ym=Gx~1f`&r5q$*PB0EKCSmR&z3uPR^0C#d_g&4?cWPP+(#e3 zt)lvc_?D?h@7!`@e9qROc?0vP`+EWUey8x?3qVf(OWswg*n0-OB1e`>k&SK{b1Nvg70 z%zc>F!}WXQgdly_$$mF3{T#96i+T*!VU-yA7xl#D?r&9&6IpqVNb1?nk++?Sg;n;q zt{;Ak>%#A+p$~e)_P3zHyN2$#pRuF18|@f>ud*ZCiHk)qu*bFc*%9|)-w0TI`0Y4S z+Q`tnXh+(Oc8r{=?da>5=SYA2&~^_A3G4kWoZWd!Cxq-@IZtLySK}t02ctiN^+3^h z=`gtL{SkWqLwJJjrX1Y z_&$K{k8++dReb3%xbXgnF(8{Al{88*v@h7PRjSB!(^G<3KI>Ikj=9&ECiVUrsg4dM zqTY8QfA_r|t>?**{5SvhId?rLUC+H*zxW&XeJRLCB!=lvX!%W7d+B&TmSG5^ew`iN zZ9Q!rtDRqd?N;aj4|Vq8k%Nigao-Qn>shXE!HbK}aWn51Snr+jJpsk7&PC%qE!sBL zx0p#54ZGNdK4|QTyr{mHouOrF-b+mnT8}c9aEkii{eXzp!~PqnulI8`N|Rm}?auoF z&bLIDtZy?^^_ecQbspxXiMNXyf{Dr|i(+qL6u+mTi)ZDFq4`lKyt zN*$zp&!aIgUD@%<%)01c8HX1QTUG=YJ`VFe5A=heb&-;035G63f5i8)*}sSC_p+1x zUiNO9a+&ik(I5k-x+EYo!x1wVG6Hzw%o6jPtmg$8aviwO8{f;ux}0HrFB|EYlQ2{8 zJ4B~4yobJ*jkOTE9ly_w^^O@v@rtGF=7n@#nfK~{*x&c+=QLf^v8KlvJ8sG?YTlkD%+15NY2`uIHmyt?4by1-JRos~$LSq{GM zoYdv&TOGU!<-K=KKFV#@a@0rp^&|Xpf$OZnFDknTIF&D7Qn)QJ*L0&yReR zV|$`L$~6?dM_P*a9zXdgM?UIfxS?pc{Dzp4!`Q-h%J)=Tb-N`$?HJYNXFTi(dGb?! zquu^>d$94MJozb~((=^He8c3)Px)P1o_bk+yL~W!@>6~c`>WQ&_HVaK%9Ee+OSL@p zQr@-$<;hR^q?V^%);~<1{FL9U<*AqDj_CT>_9H*#cWQa+CGKJJYK^nOpQm<~`@+gwGs@_xE^3?$+-) zYnrUk`*+p;@s|9l*BVmze!$XC_|K_wFor$d_nfsJu7Bf|LHaJ#_c1%FT>ZVc7r~{& zDiHd2j?UEGIp^=>k@nfA$M5CMEgI#z@bxe8dqvj2z|X#*ffvRP6rr-n+q;iApL6kz zM!)wAa3ZBle`)IOmF|0&JHMxBE7mu!Onnum9)yZ zNWbTNob#OwXQW8mu~OSn)8xzgcd|6qMbDdT+N|uCx+gz7rrwy`FFWpf*s~)VDa(Da zUU%CCj!ZcA_h_%Y7A%~o7T3iY{LFb?Z?|tulDER&F( z3kz?0z~8=EZnp2#A5=XkA9?PxzJBCy-_0GXdlKt<$eahQDOjSf(x1ydCfd#^l0*tF zPCJ>wsIO?Bn5ecN6VSfV?}J=SK z%8SmLQB$%&375<&R9JGr-tiBm-ybh!|Eu^xc@Y=sjF~I)Csm*LpZ)eGLv-%lzWNat z$`Kb^K62?xJ~=-w)Sf>zaLHfD-~=uh4}r%6;wJ?Qae+VIE4nZk7vex%sE>F>uK%YG z7pd3GSq*NJX4#p*=`wekP z7T@K5M~nR{vLIV~Y3xq)tmzEME;Pz$FD3Pb3X4|Ya;t7H$i&2DxW;8R67syF{~e4A zaUd?K;Tji>SEN1=m*$T4_NL_>UGAD9&my>Nz@?_Y!lD7VT%7}#_ZLv0=wE|zAr8bP zK0@I_ydsG}Tt2dU4p-|?ig2DL4#Xw0Q_b_l zD{{n9zWbK?n!0&)n2ws)boX?u!a}CAkQP(piUE?&L|0E+!5^#zE+>WH!ue=EE13t4 z>h(EUi3@QcF7a3NI!L!0@{?w8>26M}PB1oqTHimhOa{PZk;dg*@tgCJJZN^WT1E2u z8-2%b|Ng9Tze-$)193^ds@schH@5N&E^AizYZbCc#0qI&cK+^s^nYqyhxK|8E_Jq0 zmT)xvav(0mfw-i8r`wBeH@3xI>QoM^Jkq4#Xw$y26Ec*;!<8kxy&2tzLt{|~YF@Q_hd_-Jk zX1H^EqK60fBjP|@;=fn85HDME2A8HaEp3I}GPn}mC%z1jV>Sd zX5jduaUd>{pDJ94m#w<4ZgE{*V+Nh>HC-#3nhTh(>kAdI3V`-yHZ=M#Y$=m5@Yu6{>#^M;BrcaJGUqL zskegrk;Z|zB%jy)NVgkXa|V|^c;C1o2QH`Dh0YR=ZVbkSIAn17weCk6FI(lpx_PyA z3yq1|X80F`bIsGE3n)W$#DlK{&C^MZ193_HQQ<?}N75{b2mL}Pc;s?K(~A+Y(v z!u196+j=m*%+T|6gZME|gPPYEGmyg{Eg2CwPZI~?68W>nMdM|wwQ*@$wY)8{x~H+D zxw(B!HxBq`zp4~}$^1O|ZEe8ibd3wrct364H=bq-WeG=%{wEL@;y_&De^Iy)FI%OJ z%kuV)j#V~OmT+}}{I)9K^3EK%oNfzc2}ef;<3b#WOY*M@7vg2Bv~g)kboR71cC2Vz z(U!>PCaD(uB^@hDX5`0j=MP-|lw;gI!xqXCj@BI!xX(Zwh)e2k3K!yKtF&?HUb9@^ z3p92&H}&)+y0Q;8^%?$>`h589{DI3eIdFNOEtDl3ogIt|aUd>{U3z@c?Z#Hw2bX5~ zDcRMH-JNom)Yz3+(JoJ|Wt0hB&eps9CH3GhS(uyO&L6nk8-R;BzMN?bWeG>;2jfB< zh)ewMdVJCC##U+LvZ_O!)@fgp*Kr+ZuFGFioiD$gKXCb44qV3CLRrGmbAxdq4#Xw- zrXF8(yRlW;xTqV)9(np=p@ zh)et}J-+C6ZZ<3^kl)T9xU9&5%Q#yoOE`L0FfPP_xFpkh ze9`U3R%zqX+SHa`2hxga)^x2c_@R+e2;ee12QK&~WWHDQxRCuijRSFs7jJc+!xArB zzm1FhzC=sMh57f1`U3gw{DI5Z9Jriq3uOsMcRdhzA3z+4OJsz?h3&>xY2(tix}~iP zC#TxmR<`zJpQE8`mgX;+lOMmGKX7?>4qPVKLRrGmuHbQ(I1rb3M7I~+Zfun{E-TvF z3t8?uGYaIl^9L?}<8w9f^FF{FcPH9HS;EoJ{P(Lt_l?AXxFp}9a3Nl{N)MOrHrz3; z$amvKE2{68lvfJi^0NS3%=OD8k3FX^dPOiU#DTb^4$|#Kw;Nlrhs(;&#Omg@0*=18 zs%Ca2nz|Du3;H7q1;AxX04`>Gne672-=FB;ZwkC`Bo4$Seuy4lbi1*&d$_ESg>HAx zMeT*`ddnU`zofiU0GAsBa538pzd!6rh5Mpq!SfMuATG&wDqM({tlW&15UG;-LZv9J#$Doq*r0jZ#j@+i|Luw?s-so3@`w{tx zi!En|ZCvC8Z$Z=2K+H!OT%>Tj-H%Fc3G7E~AH*ejhsIa;r*K@ld*qRaot!f~H__A7 z($v$GlQDz=?d1fv7x4$-;(pjTMBa{$j<_Qb7vex%Qr}g$5HDMg*IwkyM?E;E+MMX_ z&VSsMXVdcBzECNz6u_l82QK&!X}(uB3H{ zHY8TbQ|+d%i{yx%yAxbev!ykUZ8v9^#AuE~qb5U{+!dQZ4I7#HF|T&SPzhGEihT$(!8k|_(t^MFKGN!9$tS(vgU0T+(Dc$5cR>_>XT zv&h>?(aVC*OL6`oE|IOOA90?t^#tHj(225vc>m~wy1k%mz(rkxhVDSsjLL&XCxwhJ z8VBMM-=@bGJzv|Z)j8FJ*fMUZa22tzU`&3qwoW94*r#YsQZ9&8DP{ zhZHVsH+BYnaVhL5{6L(8e_Z2&vIUJVBkV$F2}f52-vF()^8^1Y(1!MG3y;*xw=k1x92*!s=! zMb4)tnz{5jou%O3vnPWsYmqqqT7wF*TjWK z;ccF5;ej{@|Fs;r9F(m9R$6p(FfPP_xI})S#~0mhEH%FQsGx<5Rx}XnmrHWsB0p!D z_Z7W07#HF|T;e~}^|TSGUq{~zX?7^MjVJs>M=dO z=yqePCN6SLsx#3jFAL{64^fZYA9W^5;1Z6m(8wWcfE&9f~m;YEw(p?yIu%&!Ev?fnD0@(an!W!mMU@1&Dv8T#oMUM( zqz5TY^ZF^rasZcH=P?f_a~?FhG#D4+KwRQK(c_D5H@0fxq6b~|!i3F~CETC}YxUwp z7QV0~;F9Y+=6k|~1LC6}490~x5SQdn_4uOOjjf8fbjjJV{;cR0_EV1K04_o2G0puK ze8V>1E4nfm7vex%QqSn|MYkJUKXFm_0J)wP+0u?PGtsds(Ibyx`}rUVxa2yId1T*g zLt~=t!MG3y;u6`R#~0mhY=wSY)aRud3urn6aeowa9@A_u{4FTE>_Oq^+F)FW196Ez zr^grFZfsrit7q5MxZi=4PuIyQvL^XrTOp(G{N?!GC_Y`+4`E%HT=z#&yUf(qgCnYr-GV``&o|ihXbUIqcB|6eD_Q@O=Pr zATFt&>+wam8#{{yRq}D^nmOuIZTb^1ow7OA*4$qB;?-83XLy~)1^11>1=PH}uezJD z!T#ux!RMuj196G`LXR)H-PqbVzO3qKX_HrAy9((;&^5Q8a%MSl^&{^K_@-2_Kf3Go zz~>~yfw;tfsmB-HZftG7@db;R#twJHu=xfvoC}u)1!Nwr4<2`k196G`MvpJL-Pl=p zxX75hx*LbSZI-OzhJHzTDlt#5(dRr)kv@cdhCh1AuJ0Tpocxux^9za^Nv=0+Uy5?X zB^4r1eI70?iT0kR#zN7lg;YuZ(E%=31)SeC=V_KT9~!L>e%?qNhzoTQFNR6=`8s*_ z-nKT;g7bCF?pqW2jx+eqY^@S5Sx~636vAvTC{xh$0BJ&bU(tENxUk<4m-vgSy|I7U z8F=lbE79(Ll{jBSl%|FKlJZIcT+YqWUKV=nIepRlL)I@E2jY@^NsljjoUs*qxX6}N zu9xd=VF}B=R6nFVMZl#z2QKvCHaaTUv#_iN~C-qE`@!EjCuy*Iqc&(a9P64@}SYXgK;4a#3l8r z9$$33u~mDx^yjI);|#=e``dHiveYhgmT>gO;O7Cvfw)9o)8mV7H?~R-m;OARmicG^ zzVCf)4qVQ)3!Nn#{c12S#DTcPU)SS{Za22dn)!3)$Og=;`Sa9MYRoCS$ zo`2!EYqOg7)5$;U_OGeU8|@69k0?i6Y&koe9hcnOG5z0pQ6({P2^)9qGG_~io%3M( zuyJ8KvUSRLX5U}GpsL2*_+BMXNoHo(50Q{!2mc*#xZX zQlgi?6ZkPvhV~bKF!=WZ=hoH78yC%KT&qrwHKI)Yy`)-c$ddL~Pc}L1&!c{<59>E( zyQ&}SO&zSCcMh!oRUFKEvAnDw>%;m*^zS{g-sJb*cM&7Xt3PlB-0oA2OIbfsU*Z4- zSU=W>_1mfI$9gln%yTNK9-mJ&c3&hPg;>?yCxSvDbTI41ELlI+hxKDR>&er-+U+Yr!`>8XR z6+1T=8Lpdi*0b*Sf4*JeQsA*!()oMg{QdCwPt@;+^LNGV-yi4ii1T;FnZ+V0z<7DF z1!qq1``1Mh{>AV&+&5n^x+ce3zaRe3osXeB5lvGy>UX~5^MZcw+i}KRG1L7W*7!{q zyEO8!DktlW`r!A&sfWMIo2(1aw{4kT0_xujzv18fVOA=HKCc^v`#)gqg!a!3Pz zKl~TNM+q8u{;6h~zKV%o*zbocX(h+s55Hx&_oO*;+~w+bdB48YwQp3@zBv^Z(|Vt3 zPdo3=^LKeabFJ_9=JL%gneu*@*Zm!MZ8zF6K2zC|_Ema2Y7`v+JKiw9&b1?HA3Hko zJMj72@ki3~gMMGxZ^wh(H4g2Fwj4QD+p+9CWk*f(#W9R;(-vjFG28OA=LeA{Sd+v#qoO)o88ew&Zlceo}Vq#VW#UKNlZMI z{@=--?%Y!hCn+*E1zqTmpBIPm>~Wp1$)}~=s3Q4gaj;BtzUXqgb{wVcc)+>Jj+#dP zrtYIiO`ZApcWV1Z9?Z{IP|K!e1 zal_x=^&quJWIqILXP1G7zS-^-f3LK`-mR1sef(n8c*O(LS~c>K_^Bke{z5`Ws4;XOrzTZX)!BnDxB z3|=?<#GPAEZrBdjEyKT)iHjUPICk8)X_~vP-1*bs`KHyHhsIdzhKTdUBS)`S<;7pj z)m%Tj^RJiW`p_S5kXljhF!7_l$3Aj9`iJlOujhW zzx9HO$RS3Q97dbY?z zMy8Yr!ruF)==!b5j}#fmL+?GJ>oO(Z`|eHY%FC{v`M~*=Cs#rK$?skp+cn{!t+%zm zh%#*X=J#W;osVf$P6#A>G=wpGgDmI->R@4Ko>%23rZc~tDR zrys7UzvR0Us!v-r=^NLM-|~eUuBrPFld0Ro5B#xW`r==2NnT###=Ym}rr4iWexzc=x~I0d z^||u$J7zxd!PswZNV|9;4j1t#esOf{Pgj3x>!+@$*(y4=9(VUwVizqxJa)`QPeDh; zv(Mjq$ITavs66||^cKV!P&1OMCMy6o;-Gnli!`Nk=mQK~<*H};p0og2I7s+YDT zb{w$fzRjQ5g0@6Wf4crl=BH!bXxz7(7sjjeE2hLs?|os*>yKWurTDd1w^%GLJNoTX zS%dI?{z%<#O{@9#~VVMyQ<3QLKA}C90>gm7VD;snaIm4YuM9tl* zKOOY!$+E1xSnnNV@+mGZKH#WB9lV9_m1mg#h>p~${L9xLT~RFcI&8em&aw|xn^@7b zroFK5D`avT0-m>f{l~R5HIG|9Zc4D5Ev1tuPiP)DacXl*OJeG{Bh4zzeO>Z{)(ddlzs2~}P~`33#?SQc-^Tw}?_&(pwDP0w zK1ZrbQByDc8}+_z@)sBS)`PSa@53Tm57+O3`g*UeQTp}1pL4SnwsZG~QBPcI_w+WA zeX`1NNR^$CKFle`R<`W>H583JLciJ?t0&j&lQf}uJ)a2N7{{cq&)4b!fk^6#s`_^xOQCQ?)%LV zEE~jO#(%n4anNpD1u)EXPY-;`j#mmZ?C3ZL4?j>e{-hYr&uNFC7yTgUKFpLBHusuQ zWZZ`xrR})o8n>NCHPx*BCOiL2--qqU&yLA|`%S<0{Wjg^*|AhA$bSA^S*M`B5#8Uz zDv|@*FtLAGeAKzweLg{&x^aVVJnC;jmN~w!f5<0NWaKzv=ECI7%5LZv_znj1o2>D~ zUL@R;x*Xuc`(O-D50pw1mq( z-a>EKc&nsYBDD)vZ;ZE0+1DxUNW0OFk(tVlw6CgXhu?0yV@EzGBkf~H%$xb!G3)xK^*xBRpt?M6GM;>wP+ud3{xdtMf{e~EHoZ!c^g+I(Jy5e@T%`MeDB zL*b$wX*b$2Ia}G0_EmLt*C<=PdVAr)el8SdM~ta(VRlp_DNF1<7edTX?2oh??HHe< z>`416B=+2Mp)fn*c_&h+J8fDKpGTi@MC_A_8k;=N*eJ-Ts_+04Fhu2oxvO&*^_SWY@AAEd%<#ks-w}sDz zK5_H`m5)AqTIRXXrsx+YzP$44(C0#9ztLFnO4++A?)u)VXW#$a%@eu@(r zIr33%otC3M3U?ghmm?qLHfcHPqnzVZVVl@pCzl8%ALVvvIqCy1u8u?ea^$02MB_|- zN=n`Z9C^54Sd__+e3UEIa@6O^RUKf;k&kk;FZFqHi-((XHO%%A*}U#jJ) zmv#!1CqLzrTAq4Y?$VI_$xr#sTAq5DZ8Dej(Ukdab!B=@w`8x$2mUlPw6oEC~wz;xRCEy z`7w+RISTw9iCBb(+~OLBRZAZWe&!PS-v6`rC4hBQ<^I#Og#lV9pimYi1%!a56xz~2 zXl~l3a1mr{g(_$WZAv1cscE_ZDi=k)`ksm#7M?7Y_xHt}O|6J&p%pF&3d&Le0i|eU zS5b=#{eRz_?>BSi+?jjl&Q02qoM~^)oSAPs-|wt*&Ybz8H&2GJaGE^Ne2)qtH)+V} z@!r=GIe0FUKO;(Br_5XMJUt(8ZB`-TDi-&5E|qmYymi#MPmnBnUkhQ;yamrc&8ykh z`$hYLWx;>Pli%2X=D`wzBmC4fxc=rp1CGEAIJ%NAkWW-f`^oRWSs$dD;?5^F1o6^m z`^)V^Bm7ObxS!ONqxpVXCpePcgP{5Tw>fpA_*WXodMXQC4jLllDsEBi>_qbxm3++r zeA|Br9Dy5fgyq23i|58R>+3eQtR36DWy=*C_};Npfz0AcgpOyW-0diFyw7rsTrY)V z_&tc}HFcx-7mwqyT74FUqvBR}4duU#<7P@A>gl2Lp7YMMqITz^e*4;s!tXho*s?#k z-9$Tyb`#?Sw5Mn<(eB3eLs0LZO?k12dfeVRxtixayP}@q=QpeV9m2v{s(s78FRGn0 ztuKzFoI(!DX{5Z|=LW9bbf&9z(+|D5N^fi$tlLQ5ZXQa$WB-}QaBDY#8*qd_fUkLF)fJNQ6;& zn)&r|a7ZMM%suoEE|0uU4&@u`M`4+i#bB$s0WKimSI+ z9?Okue-t-U@nIsZt`3F2oG-ocx8MdG^DPQT;OnI|cO$hwd<+1N&fSzJX#DMmW6DPDWM7e9(FV$yf> zC`ECd5MtamUE;VeQ3T%jTN}60J_Pm7>!bKrx;(O69)FMVn+1q;JPAQets6vqDB=j* zfTO!W;Rt+H+PyNf7JiU59A5lJx_F!1ctkoGt0fK`1HQ;J4@Z7)B5FU0xO$cARJ2P` zIEHJ|p}%erxB*ABx4>6<{=cbSU9dhtf#VCkc#{1j_Lc(hY#=~CGs`1A4;w#XllO}+ zkM$&he{tn8jN{N>HwfH-BODBT5#Lr}TzO=BP#&Y($2}uz+ijJKCzP9$~*PpSLY*;&X!s^UHH|>?#>xdt-4UM0D@v1wXIbc%LS&f_e z$Og|QHUj%Ee5CHHjhF6Um-)w~``@wl@}C|(?R`7;WiI{LjHbJ;YFvByj30d9ZS@=8 z^}nlU|8_-Teb=b$U4Q)3^yY_`uU`LfrZ9Wi=;Hk(s`W>;>EW~uha+k|VA5-lBIwcdUbGHx~34aTtseM0Ud>4#l6sC#25pWAhV zcHN*|H|QAkU+EH$b%Xf_(ykjkvu!bd9gr3d9$Q*f#dm)YRO%J;_R9L6%^m7FXx#_p zd1$8!vyaJs#~Vwp8)OrB-C(5$w_~-$1Us-^ZKK##EHAwN4|L#jB^{6leskR*=)hMm ze2@n|bKM~5z}GH(kOw|<-5}_|w@UaR4}83CkPr9;bl@upALIpm;dP3j1K(!hgFNs# z&T{W5F7$y8e4v9o#P{1J;Nv+38O`x7nVX$sca08A=d8k~j<8_1k2DoutaNM8DG=B%2 z5A3ECw{EZ$j@tYaJ@1}gv*&33#p9^28;rtHaVxuq@?Wl3H&X&#si%j|xLgK)K^F+cpkru&c}@5bsOhW2v0-F#z-Z&#Wa`G~bV~Xx&C-^Zn|zg`X1 zw*}`2?-yU+LKOEO&p|{B!^n~3A+=f~NGNawZom=c8~6qs+vY5)ZemOH`Tp`ahUfdY zO-cqwD{usEz!BPjFRfg>({VmVidj6pn!e5i~>t#_@FOB%r-L zfYNF98KRO7Y@+UMPuH+-}P%+fqoSFRiHwD3(qrL7384&yMK<7x8K0^ ztJeKO^{Wt8*{_Ow9x>edRlp567XBjnL-Gmdt8IBig$^0aKyUinEMep))R*Oi^ma8=XNOy$8dS%b^7w4ina7{|$tz~;mm7cV)qB?*`_cdGOG`9z znGc_O*z{eRZ=K#cbyodH4|sHX-I4c9zy7N?)F1MJed}AN-ZlM%eV>^AtHw3ciLRc{ ze|gb=c{EJ>fdyaj;y*h0q3N$4cK`H8c59n{$Oo?R&Y72KIb_-eqr0Y$ed{w`oatwu z^gWMu=E}?ckk6Ut!>4|8`b+b#_h?z(%#|bR`5x=zd(40P-~Qv>|7!cV`m2xq>GXFx zuTB5j&d*Qh`0SG=k?phU7mdgt`>u|8$36S)yN-LypLc6`EqhYKRkxqmFn8@K4Rt5Z zX{g)#q=pT@YijuA|22ERx1BMk;i)@jHthYyriL4ynccAA-dPP3KibqV=KkXwK73EM zVa%rE8pdBTtKp4L&ThD7LZ+ebz~dYK+B>u1r4bDc@4f1@hBI@E8dl%Dq~WOlyQCra z+9w-cy77vJqaIt{u*d!_4J$UD*g!sQnEQ!68+QBE9u40evsc4ox9!vL-PiVRxcBS> z8(x}!K*Ovr)HOV{=OGQxfAffj=T=W@*y}I#4fFmmwc-484sUqzhJ6}-dF_r3Hy!ea z<9_s|TaTMt-+A1E(Xa3_eS26Bl=Xlu|F-;>%_Np!$a=t*e_Q^CZ05EJE9(JU{%!d$ zn@KEz^?>z&^}vww0Nw#r-vo|--WZ?g+++NtlJ@!IKlD8D@q<3wXn)oRHV@c5VDo^@ z12zxXJYe&H%>y^ac>j#?$hGQP!hk>QmFRJ^--_ROX ze`z9rxPjKEB-!B52oFxY3_pVjwL<3PZO_=9?0W|exfRu zS}*&dxLs;rnR*HHOJ$#?$7P?Urv`VQCfI@ff!f8c;uMAVF#;XEf#2Mx33T8q z2p{Bu&)la8bl}@8e2@n|bDt*Afv@f&e%i^1%1<$S@!1 zz=!e)dElcRaLJ$A_duomf)8|%hxp4Q13um-3*{dB9JPxa(4$17p|IKoUat(d@K6P)WmPzeXx64TGqDH;z<^EXqsYAF~ zy)T;oSJZpl&=MbVe)9II6FGSAt?+u3yzO_Ny3yo2_MdqSw|(k>8*oIva0OrGpNM_x znvUOK`YtYxed=CSOHNEO?>$uW`?i0sd7JZRqL0ecEI{9{GWTqj1#sse8NN6t_=ZDIB%;!o7X!{#-M?rWB6)K6OzzDsH4^=!RUcdi&H# zJ#F`?lkdVyJBfC)An~lUr|5U1{}wk6LAyDFM&rDniu%6oDDN{4QFTn=bs3*XnEj9J zv#=$qohzR&(QZNx%BdSA&wk&wyhFDU1#kpzz!ByEUlot~zU>Fs^S!9=+v0n+*ryKh zKS6jXRL`f)@7q34-?x39=%Vs8v+Ly`YX1hs9a1zTBa9<|-xlS3sD9rzzm>ml3w_5> zAA-juoR|4`rSW}R#JBhF+oHWe`;&iCjoUDOGso>1M~*kf!CZ)5qJApx5BW0vcHEJ| zkxzI&iYlvF@fX5^bEUUGYIc+gSzaXv>Mh7Yy%jC5c9xQj@7cbsIUFyod8zatz3_7G$|I8!2?+nMPn6xp4Z%1+92;6`pOa#7Oyy;TG zZ66ip5I<-3bL>m{@$t9{ivF^{`G~%++8>5`1ofsUr0?5uj^RcFE1|!fm*<`4^Ir51Y6<%W zQlk3FJUWcV)cu$0C;Qw*6cB;T?B%tLYG>QJqv)O;sDCj@T55h(}0Dn4hnlly<` zanErW$IHF=$y6@paV0|szPSh7%ziTND{A~z_0(r*%%}Eq9z)M1=GD}U;9qo}W=`P9 zP6P(j4e_pQ=uO{+>_ob*Ppe_qZ2A`rT$DeyS0lZ^X|x;+;l(xe;IT zQdr+5M*IpR{y8JQ%80Kv;@>giKQ!X&jQD*<{ED3aJq0g+JZ#*5%82(H@xK`He;e@~ zUJj>!vJpSdh&LPYQ;qn1BYwUS?=<4ejd;$8f5wP^*@$0f#CwhSEk^tfBYw9Lf6$0O zZp1ek@t2MGW+PtnO4z?+jQCzgyw->xZp5b=@kS$_HR5L)@pFy%A|t-;l5l>z&xk*4 z#Gf+a{YLyRM*QDKe23us9$x;gHS+u6MtrIfZ#3drBYvh4Ki7yaGU7{&_$5aCbXDK+ zYAMfNiSsx}j~{BpxyJPFS6II?A0LO&PnXZvym*E6z5CtE!|lhN;rcs&UpVgGACBYu zo6w(^b)J6w*I|115hK1a9MAv8h(C1O&-M1L@T+h<`$#yRe>5B~JQj|-zX`{)kB8&= zC&KZq{89Yz66AiK^?s$aPp^X~zy1QNI)%ysuyU6%|Ty^7r$icYL9UCDp_rz>vw~Y65 z&ozhQNK{PtPI;K3o>M0I?!d$y_a$$XdQJ)d#eH``al;@zC*j)A2svMR>x2Y1;8@sI z;Rt+HYI8GHH~=^{aUP)OI0z%3<0QwC+vg)9APM8Ri?{D{1lgPZ5^w}=z%ei7JF;AE zgH%V=O>73&W&E2&=TY;W;SxCXzvl$pfFqy+zFyq>_6nWR{K3~={lx5_o$!n1CCA)8 z^OVKQq<#fgbclL&^Qhwc>U&O?cyegofC*^cVB(IikK$ka^ElM2aX2dOVtqsH3YW)K z^ehPN?Rq*7dPni8#k10AiZT3@ijL?fsL?$3>QME-=>wQB^iR$$2uC%Ko)pKiR0g8@HDMh2yI8@Y zp9fdpoM*rhxB(Ht5V0`Px{_^q;!PC@n^lb{yn9iiG!{aLVN=d-&4YU$dS-n z$F8k^rtf0aJ9m%ZUwpp?GPph)%|!HUbaFoe8rMG?&M(vF|_RA5Rjd$=_^D7TEPPzGkzBSjK;mJ8+MMviI z?>eFJpou^3XI?sGTxPE$e#|yBe)h$y?l`;ekfyU5H}#PXeb0`cbinUXa8f*zpnpIP4=!0 zXHRP0a{Sfn-|^&MX5Tt8OYIHz72(9C@P}e^Cj6?)^9QGA`URb9yT2Kv=jP|0ZM=3` zkecKDs`LoEbHKMdXOax^$?!O?_~G}w{HCWi={1F!&ROYsE^}_<^i2Kj&-A_Y z^Dp;}eDV3dODQiw%GB$Aa@^~`ot^o_LwEFDd*tI@nK4J=rRpol;gHMieCkJF+_RUI zTb(BAe1w0I^QV5)&V1nhQyObX4i0V?qYv;RjHaseYG504j&MdfuDi+;qRNy0Oi7bH za^%R-dyn&WoeAuzktem3rWw~rZ`}PT>Sfhvoc45BdSLRx)&-N#pFFL#ZR*s8 zlNZ(>bIgQngka{q#P<;T~(1EEAq2VCFs`fEJT!t*U~;knmJc^?GNx$s;I?~8z*L+*dR zO5q#|_n-mD%OlV7YNx0+!2Ok)r$<=WUyXb7Z;yH&rE7^k_s7#B2mSYGdE;j*DVVpb z;<*UTHK=*Jfq5=6k$lJgGmr3dk?`o+qJF1fg;y=!rNvfo1(@Xy}^QP#pOONa*~&pmVQf@Pg*55%K!ae%@fA=9Lg*Drau zewmt!X_qj&LdEk>%R8073-5^&r3&BOj=C3jjq`ae-Gm+3yKQ`r(qGIM-qQ|r;L8dh zkYp^Kj^`q7k2 zmp#BF%+{*0LE)h4#t4vuzNLF$l)UYC4=~;{@JzE?}{Y!dB^KDMuDE>v~Y1YQ&pq_qQ4x-+* zRoqO;$I#yc47dSDm2PTR^>XR$0d{17n-^C&>U)6wQASsBdw`X~QJVwz_5iCJHNB=3 zj`|*8Q8+4Yq-N-b+)iw!6E*k0FPy$Z0n`kG|Zn`o~@W&0( z-$A>*GNvDccJpkiQ-VFfp7-pEYB#h0R{b-C`FE)HEqiEGJ69qha*NaBy%R5TP);M| z**(C@J9HaS07u{k9AOUfiHb+<0d~6Ajz;YPcCw7Kv0fK@9sCl)L!o-MX6^y@AnkAP zAkjtTX=c~ULDU)t#T`;KBqNL??`?qcJyiELaCe%o-X&hzR;!*6rGxW4hqg0Fu(tv9 z9V5@LI4|>WoY=vBzfy~D?|Xouy+Qj!rh5n4C5-#b@gv4_pyyD3w~pud_uIvLw{ApK zS#{r{+8;kWOtm}tDc=Y^rM1encWqGT{Fmd`d+{SF zRxda3&ee4i$C_8HUB-R6jldg!e~i`*1#4dGo!3Y4FTNka%q*A3-%)E`6*p7y!E2X; zVX}gw2E)6uX8AtN8kn=kyzl1__hk8bB3}8 zPx*hZ-G+lkg6@6qw-}RqqJbLWi&rJE*PJe778=5A3{eaB6 zGuJfUo!jfy9rpRJAN=;`taU@-D9!1CbraC9(GG9KTIdfiqueFDtJ)!T6*=P1~UV_Zpdqy2c zIygU1rC*M(SG@*Z#;-$j4f+_@WhXgh*PxF}vIc$JQ8nHg^yaojt;;%lJjuiH&u~xw z`K?Pk7PK7YtXMp$ZDqGJEZ3l`x-NLOpvr+)|Cx257r*A}t26w=`g0B;V=(%)vz{BV zU9CaKxlM39J&qGzHwZfLZ4^Gp1HZX$5Om;kSE}?v9{9|4gP;Rnz3@RE z_{?>KpaWmK@IfB<%yomH1K%p)gS>z*ylxP5;426p7Cy)WpT2I8 z`9KH0I>}Fv2R_F+oi_CjzV!<_@XZ%K$OGS3cG=*qmf+_=wR915;L8giZh23%dpa=gd;fGw*PiDS@{h$YbLHHpT{*U7aJ@_{ZKjfmm zGV?F=gC6{KAC~q2b_niq{GbQ_eBp;&qaM4bp-ON6# z+D){lXfM(JyGHv7g=jaEuEWj$NA>RzW{+3xo7))G&Ou9jh;j-!D5sI~>^j_dM{eUg zz!A6sN0^X`)8z4g-w3mMh!6y{ae z{y+}ut^8>b@^Tw!T@fGHYj$LFIId!Ge>t6esBc_8O0sDEW==wHPFc+>2kSS-&^Ipm z7r)Mk<*{7OSL{FYP~5m0UUh`4Lm@=_1KfaP_6*4%l224xZS^GsaO1t7 zZ@MeMkmEJpdTMxxNJ=Ul->iI|2H;Vo6ELm57VZ{3`P*NiF-@6bwSRb67A0_XcW+h7AyLe{YoKU=k z9=Zi+=)8ljV<~3lV6BbT>h%{`XjkK?I`JJWHVr1Ezw;ds^T zYd^Yj!|9jZ*8Ia8E?a-j>DSL5O?Bq3^y8`%IH4Yu>eR1S)qU*s_|Fp@=btC={*607 zwr3N!YmWMA05xg5?sQ-c|4QSCb}0%+#q9|l(to%-o=5c-+S>y8EV|kYyCK*SB7A*& ziRGVD{Rnr=i{AUVV?u`IGWqA^eP9XQYmeM`$Yu2YiG*`$m&>;9Q@a+n&FgM!3o)mP z9Aj{?-+SpA?6^C|@33d|Ta|zvoK`AJ|DO5o)}FTRj@C{?Y~pCO{A@q>6VWfcT?bCF&pPgVN8$H#!@UiamZ9+%I084| zSXiQP1imV@UR$y@NO=(7Oq=#6sRskzqBGUMpnM$k6WQ;|_i_CTNa1o2^*x6$a^e03 zc!xp=9Dy5f%y&yU50y*a=ioDU1?lGae|zzfIVT_popHUxhr0h+D%;Jo90#GJ z_Y?Vh!}Nacn3@y3Uwr?9<+0q~QEwy)N0tyAqbOGp;SfB4BX9$b*&c->@ZHu)FIOIu z*|#(8m^HL<1a80)?Je+4=BL4<8Wt{Rc0JRY^v91a80)LV>TusUE$b#%(yb zUOjjN$Mkyj^HP7V5;Bb2P_N=Xq^MAhED8`#fv&FIMPw-j&vr~Pd?I- zYfJefiT1D_upY1;2t3f$ec{q2tqaNaq3S9IWLY0uD%Nq7&C~ z>9cYpy{G!)sL#L$_aD6ZX?gC4=Z@-b@H`UF7xBCi`wU~A8uXZ7#dAmgj@_<1dCwgq z=YZUO)&9Z=3oB$C`%x7_Zqg9_amYb`Jb!VNym`$^?f}eBpZ7(QMf1}Li=I1=LYitw>giFypewKIAXm>G91I}MTR1dzzsOU zxxg3kZ55U(kBlYb7&Q;D>rRi-oj2d%zLxU)+`?Dt``m4R{A`oyk+|=3|Mev&bIW7j z?ptx+$z0By`wx46=9}-!HvZt6m-;w<)re`+>NZ`N+38PrdwV-Bx%-QKN6%lqwy*6A zcRJKoGXK5A^Tw9UG$PO4M6!B`|4`y#{^cb17Lw&E{@gzQIe%u0`^GxwJ0oW@|Ek@m zWM+P>Z|%o^e)3wfVeRu@xjHlM?H|az^gl1L4UKoUT{`XecYdsC*XQrdx*A8=IjQ`7HW|MgEjF#D!|pE!$cP(QYo`p2(4)Hvnl2m01r zcZO&G2`f4>pMTd0jR#HqvFDG~^WJ;MHzu@Y4xh2f^M~T1wKu=&^8E3`dw0)Fzo2t% z_cza2OET7uov=D{^K;KOUOVl_ETi$WFJ5&=;oBpdHfA^Vkql2J%Q)cMoij-W`DAz; zQQzH8dQHbGowstCv45@4jJ)J;eTVP-*}l=Adbsb>O`rFD|D)d=cwEDec4$2Qu!s6O z{&L+~)=~BMxnIvehh_RFFKk^f`TWV#THB^hT{wB+u>3wZt<4YoD|XE^&3A*LC8D zHg1GQJW!|EO(V9??{jZd>lc?%JyJ=!=bkyQZDr50?zY;~TRRr_43wKZIX|w%5JPjX ze8+SCW%7M42{&IZ@qYO}*z+nh*h5j?^Se@0csy83e6VA=_;sV$MYoJ2{Jmw+fzSP@ zvK#WiY<`~`bl|HOKF9-~`F(ECfv;WoAP;=z_qjm_zE#2pdEn#kbMsm<_yu&}D+nLt z1$;9{>wKUC-)7;1ynyelQ92*!z*i^v0rJ3SexDn3;6r|bJn(gl4&w(p@PQ8U5bqcr zd@q~7Kb;r5@cq~|5(hnSH2uVWWq#0uzhC$vw?4*S;0HbU$LCbOgIwq}{RV!}gFh?$ zkPDpR_(2c;mBJ6Xu;27Q^n)J!y}}Q<@LwE1=)u2H_#qc|$MJ(6{I1kDkc;x`3J$;( z_Jbb$^}-Li?Pc%-J^0&&A9A6;&d68L4|?#g5`M^q{y2WngTEmBkc)Jqe3q#h>jjw+N&pPw=C(=hjR^}O&9#Gg`ej*hIM`|=(%$N4#o zJLl=g_W=!$^!iaM&iRAKZD?=M{uHGBLA!);uQ~q2cu?2ZPA@HRf0f@0 z=I<|ej6Q;%K}Gj*-5b>V3<$HIR_%`a#p>E0$U(hT`0ogLx#wmpyJdY|?RTl4$OqmN zR1-j zxB*Gp^dSHrkfg=3T8C}EX2#;wl_<2dx!=K(k1n7vZr2z*tZJ(tSklDmTZ zOYx=)HgNpc^m|fne2wO8qmCy^-}lDf;qUf7>0CRKf6;Xli{rA0`mFr=yrI9Y3%CJC z)YHIMLBQ)OKe=Aupn&4F*LyhX>nt~q3Mlk5>;n{YKLW>k=k-zii^q}Wvs`YMqHt8) zOvMMUvkZ=KYZ_dCGoGPd1#Z9*X#u_}u6=*GwsxIUdt8%qp0mz5uek~IrNRzrANQ27 z6s>tLZhaopp*%*d&!c&y6xvMf+kc#K^uE6={ii#nA6m|G>W)PoToe~Z-rpJRt zi3kf{QtRs7n{M;p7lQ00A=U>&4%P=}zZ&)a%p0?nOuRqy!{$)DjKZ5_rLOn>4ED7~ zSoGcn?{9rGy*tCdXkV~8_%H7L8O065hW`6AzzsOMSIc`Bl21HO)ZP-tt+omr*S(8m z@q17b7U9VITPMdc?){lCjzjze@g@BdU(A= z_SP>3=N^t98_9ha@4NQ2pUe%;c<&eAKCY&+$iHMbx+Hn5uhH)#`B&b&C+Oz@H{ggA zp5%hBy$Ef$9Zhn)#2jy-~xlg(9mD;EL$BXXaG7~!D_9;)hFZVsaIg!eD zE^`9y>z$>&ylxf`q?|m-5C399|cwg_| zl@H!i`I@WuX&gzP)iU=f_XvjJAMDdU43q99+3r*B_{@83M=)l)6e2^FD3-f^veB;I6kOw|d z6X!SHLk#rbZx?>Z1uo+y9gqut(1U-K@Ix;2ntlU6=)qqQe#nL1IDXKBf3xsIF6=k` z5B;DAf88fkd52v1FODDd;GZx2kPExx_(2c;yzoPAT}-)x{h$Z`8sUdr_#b{W@dG{h z`-LBJq2J7h&<}d>kC*xqa-lztAN1hQ3P0rLCH)&?@*n8IkNO&Nk?uHt(1RcTfn3-f z#n1cQp#(WUMYGlRnB7H~?(g%8^8*!v>X?yFEww4RqF0LYp zgPAVa%jw%p5m(yTp|j6C&#jK~@*>j8;o6Hv(#&7{!T#WW5BfQNzemQ!=ntX4gZ@`s zKOFs@r2EXfr^`Aegg;XKlfs&)eoA~gaEH^w?WHSnP|rrnv-`}$ZQET49Dy5fgrUG! z#qB=x@XPiVGLF2@Jj(e{-DkeAmG_y4zGI~Sfqmv5H1?TCe7oOgUfLV9KLv@SUBYt< z^Z5bB^LoDjnyh2NKJ(X>+GqYj*=JtD{OzjU$=_LB`vWL(y zsEBh;Cm-HA+1#mWeI-I~&QQ%82K&rkOKW8L7rzdO<+0qjb+U?^srU%5?o!u=#$U8Q zzzsOMeUd*UpQzOSWtIwMy>m4`k z_nH6JUFw|wQapF*h9F-04ExN#L~HLN4xVppGWVH(nf94~ndsxzb8%TjeHOJpdAJ0I zM*uu79V!RPBX9$bsHagbReEW?bMDvLb1=Kl{PvO$fFp1Nj<65-s<^h#{0)1qb8eX1 zX%ZedZBHz6X^Y$GG=r z!Z;57_h*0`aLnE(Y^~gH$~Cx%D>^!ENG)xP9hV8}}uOz2$eZ;28Ta2Q_a_&= zQu~uXon6OeCUgw+{^Zz?yVCv1GcCy+$x}FCgY2tl~d4KYym+c$cpZxu=emS&1 z`SN|gQ?x(%lFPehk_|I2rTxjjw0B+RM;-g$k-K-dsYkz@@7v&vYCQUi@tL!JwDt!d z{@^|v{`rYd&3HAx!b5ZgB$I~zIq>_F%Xr7`PhNI^atHg90}mSxPY>Ar$?g8+l=F-FGNnqx zTzWFlL=Rlt)7AduJqh14hRnIM=Pqbl+~)MOUeM;Wb}YvAfe3#>W0<=C-E@Dc{lnAh z$v>^qn~pztwiwMH+{YM~L!9e8?icSXaQfVJ>Ny|oJ#hd1-hTOqox9r%{!N)Or4iqx z;BfbvTIYSc5m*V2Q@aSHDvr55t&117b}y_#1hEEwft;mho;VBV+f%rXjLH3k_k`gi zY&Y+t$gOgz19<<_AYun9Co+X6H-mh^*K_oJxcX64Ch44i;~oCG-23R~IA_q0Y1Ow) z_zLVo$k+6Puj98)^l*HHGfvBnU3+}o>%Se@bJ3C`b#{AhJzzaBY&>uPJ;xn0Y*K3z zYCRC`0sgiTenA@x+FT<&MyF#3`ECu`*C15wc`h^SlsTt1&pESY&YZL6%mKR*s(zet zu|(ANvleh!;zj&e;>WfUq?+_%fHv;w^6>&qxgsW-=K{Q#-;FS*f-7J;dm~y=o{arCsetN z8i%WEVaoWJ`MrZmNoR--+h{rUZYe-lW}u zLtO1z1*cv=VnOW@wX<56w$;w=THMp!y0j;`fD<}8FX~uO?JK^yOny^%-C4EIgR12> zJ>Wi}o)aR>KUw;@;c*Y_nZb{r;jujGOEz*Ire`kB2*HcKD@)H{;t@CPuyN~wA?yKv zyv5_LGU?RX;^?+xFiO?=?(QSJ&IHxFwPYa5Ha(?ny5{Pu>Dm1KGq`*=(T^VCI(&`F zJpH^msYZ%ZT~Iqy@fBuqHPA#qq?dV7Pbj_{=yqWi*Bi`7)D-f$`U#)+U0ug{kVQEx zvzC5Z`iZ_U%Zu004SKHZa2Ro%+Ev@xaY1`e?Sj???QOLki)(w@JC@ci^(J>B=!-8k zHSPS^LB}im9EaCY<%tOMH*A|`m(N~mzgnNDf|G*G7v;Yjo;RXLTcHE?fgbj?|GzLF z+c)c^cc0$fwWO`Pr=x9YNXp7QMzFRhXZX#-8Utld~4g<;eK1`&q}^UnoWNo zKf!;wVOw`g&&5lsP6|m2A2CgkZy)S|ec*=O9Ouyr+2<8m+^;lr51#*6 zskH?MP^;P_sI_xxn@_i}W9gF4){7_6X95>eRYqagik7bPxlL&4TGrF4H1%{ZE5ov&b$Lh6 z#bw1SGB0;{2{>(@X0vI_f@R&yTYHvux3zS4EWDttWl`&b9?v!87I8^D%ktLF&bEuA zc$Rmxt!P==*3(1jT{_8&c^+ES)qN2gg%t~dGfgdChlfc|IA!L%crp)3Kdp05I`za; z=EPGkC38C4TH@h1t?-~?+`3jQE$eti*V3`Lr)}|4h1BFp(~A7)rL1LPM>pZ$(Y2Vw zp5u|>PmmeIUR<`6EGM|yS}tl`vV>Bi8?>Z#LEEIRg@9Jg`c&HNm^HSENxj?+A5DGl!s&FTvA#Nicfb3 z71R(k#qzq_I$PP(OWQk^v~X$j=|2+GyJ+)JuN9;XME%0yK(rkzU-(VQdX2{?{KLWZ z8r!7valJN|GG*Jsz<$^Z``e}MM!L3jy8(M(AJPZAIX)om#>J)EjRUET;2#e5@4?(| zXnaGp-9RnCM^wl;UC4Ijgw;a*+ zy=^+E>G1o+7^k3a>y>c}>KG0OqV4D}Gw$H$RQ$uibsNWZKCatlb$SDc+UB-Jt;;%l z{B*!>qyytFq;Ig>5SAZxa60mI!?%adbz0cXyaUpPe64gFavQZ5{KLWaaopAT*uK(Z zkI9oJPn%pn{g}!1^;4%#o_bXM(NibZCcPMR5@Sa!-pZDsLKC{Oqm^){v$*T7CYJ)a zW;+r+y78-#$hODhNjJQqaoH)&@z%tSZ^+R_J#(&xd4Lu$nIoK1T>gkOP5DbfmWhN+wLyN@IMz8;wN=xnPnkCP=xO!!M^7iqX>3G;o&?td z)5E#5njw*&BSQm*=!Wemm03cRp-~Z9_hJfvP*jG5$3$gFDjgEVi;El)G5JUQwgAtH z(H7vDJ)SAcv+Z|xEo|!?um{MfP)mep3w(QsR&NVnH`}*#+2WQZT}xY*48R0I-S^b9 z$ij}{H7WX7jm?IApojko!p}5(u+3f;TDq*89=Z(tgFH`5@gLX+dthJt_f`5}w{KtT z;?~Z#i!N&2N|P(F5B9)5_v4eicX431Z{Oms?wKuTcJj-R!@Gtrxd+Eo!;At+kt32lTijMjGt%?IAk01?38Mqx`A| zJu$)t;WF%lJ@6k?!EUxs9zxMjvQs_F1JNLcY~PhM0fKkZIw_;E|K=b5fcIRfAYuN? z|GH0qeqR4hb-!1_@e@@%FJWMEF5|s(G-8A^nk38nM1N&Ca?p&FV_&zxR9Vvr5tMz85%n z{RLzrRQFT@xHR*@biwhh)~|7#;c}kX?IiCW=W9;$U2ATc!PlPH?Oytw)WkIUvF7_1 zdigg0H8m$VeT4Efm(zA4M7dl@msy_s!@_B(eZ=w=}xL3~y_tcsDYo)*N zaM%vyXWSpG{M>%EDwnRK+6mLX;T1RYG2+EuKz@e*lH}(+Wf0&zSa@cy5j=Obc!tX^ zu;j4#0G{w)Qan+A3>Kbw!L!)n;dn*IP(LsB1@MIblHlo5`9wRx?ac&DtSjw^`|u@d z+*qsH75Ds?Re$JI33C!QOSoM6Nykb2OyS!k@u@Nn?H9ROxxYxl)v6r3^F_`QiT4Ws zeG-3I!o!8{4!OTh(4{`TBGz8B%fk@ zk-z8D-n&rQjp25U^^lvrAD^4Y;oP}n0y$VO*PD)4#z8c-qO#DeSv%i|0T_5 z$S;0AlY9icF;4=#E8WvT%{RwCk8S_C+Ox1YMZ@umjImipH%$23h z3+48==(YP>FjR8r`0MAmAB2q0!4!r6I4@uv1q|tukGY9$mTqER=(BXr{Tg&J3Q|7Z zJ=DAr-SQ5mQO`Fy%JxNvY#YsHI*{|eH)PEX@oH9P%m{9zeq%E6FyqJsUwv6ZF{W`3A#K{k4=o(d+9=S;1hg z4e5h?=yM-d`e28zFJ%R@hmk(WhrV{v2RnRyDJz&g4SkRgeFf16JD~6Al=TbG5AXqh zLO%4>JtE~n^!oZz)-P{W>U@2W4}E#j2RnRyDeITL41JIfef^>jcKG^I)-QV-`XC?r zvX4r65WT*>l=aJaLm%WrU$5wc9lpMl^~*knKFEhY_c4_|*x~C-S-;Sy6TJiZ6Y`<2 zUG%{YUth}lWj{k7d7GgR@}Vy;`d|n2 zO-Wh5yxq_T`Ow!d`e28zFJ=95fT0iap)dOzDSx8Z*O#(>sWtRLKJ@j9KG@;wOIg26 zF!Vt_^tq2q`4hdqzLfRLfrdWFhrV{v2RnRyDeISm41JIfeFf16JA8d9>la=lzz6CV z$cMhVC#3v|USD6z`sE!;ov#n_p)W7`V27_SW&Lu9p%3z*uV3`R4qso&`sGkVALK({ z_DLy!q8Iw6rmSD;41JIfeZ8U&cKG^I)-Q({`XC?r+}}$16TQB^l=aKuhCaxLzIM?E zJA8d9>z8*L`XC?r3Zf5o`1(@TFB1)YkPm%zPf7U`y}rJb^~({4KFEi@yy$}+zP^<8 z%Opb|w}>c>O--GKFEi@!XK1A*x~Dgp%v;wv4uX!hra$lDt)lS z*9Su@)Q4gVeUJ}*bw}>c>T3{s=!1Odb01Xe)?f$p9h0(t@fIa(>4SXe zYZra6!`GLxewksU5Ava}Ao^g3uPhrTmFrUth}lrP)Xyq}X`oM`BSeCW%IKG@;wOIg40I(z7jveUJ}*b&pB;6TQB^l=aJLhCaxLzP#vz z9ne>wvVJ+;&z8?kKFEi@cF_kre0?eFm-iU@ARqb)q7QcX`cl>}XBqk+ zANuMZm+~iieSInGm$MChkPm%%(FZ$xeJSgg`G!8ohrWK%2RnRyDeIT_8u}m~`m#?* z`4hd+cWlb~<$Z=e$cMgO(FZ$xeJSgga}0fu4}I>FQvO7*uPf z*x~C-S-+g;X$$m0KJ@jAKG@;wOIg3P8u}m~`m#?+`4hdqzLfRL`G!8ohrV9X2RnRy zDeIR7hCaxLKKE%Uf1(%qj+&gVf>~(jgM8>~7k#iJ(3h@)X*2XeKJ*ntAM6P9rK?~T z8Tud}`s$vM@+W!&ed#Kg3k-db4}E#j2Rj0N=_;6ZLm%WrU%%*s9f7`d6-Kh(6fi>r1(Scd?-l@}aNpSt);_H_(@^e(5swK|b{5MIY=4^rfp` zmKgdVANu-5AM6P9rK?{)Waxu@=*w=B@+W!&ed+3#ZbKjBLtn4xgB^jsboI+pLm%Wr zpZlDYKhYcLOIN@282TU|`r1Vw>X#LUKFEi@yy$}+zP^+Tcvl+wARqerMIY=4^rfp`E;jT*KJ;b(DCJM|2Kv&~ zFP9klARqdAMIY=4^rfp`E;aN)KJ>Z$QvO75pf6qh@?k?CFSq{8u}m~`mhfO>(>4S#E@vuzQoT;Z%NXu$*X%Gipid3?o}Qc%0Av-JO1TXAohjy_agVU5uhEDkR*WsGOYawaNA%Ehi^mk(~HF)5H+A^>^L2YQ<;SVI4I$_UDs(@n_E+P) z#ZPyT-rv!Alz-hZs%_TwKU(vsANA@GiXokDj2wPv*2k*$q~_WxKR%e5cgbaD1EAAiw6fk$?PbuN<;nO>`6G@mV?tug;TyQq>>9 zwQ=4l$}hq#TNDN4;(DB1_o-;PfgW|H%biaK!XBQZh_ct@NBqPy=kh0lYiFnbsNN{Z zGQ&G6F~npx;_h|wT@MM3+kUiG{OwyZIOE7|C+y)luc%}K$63^;nolpH z>pI0Z$w3@jFeaM z;)oh9+2(HOS*QABd}PYxu7i ze%%KCHs7}PAM7diPuO2k_xYMVtOu+ItOv?_V1zS#5AYZuj#gM<)hq_D^=jS4&emV!va~Zc^^*gwK=6x?o`XMbu!f8Z0VT)&tf9!_foOoa8bS>F+2RC>6Ia zYMfL@-oZHOiPzttu|O_^urkNRkCRwVlzvSfh+Yw| zZE~C@uU%!CamNI@fgfnl0a4E)Db3%zr;&f`L!7e@qsK{*qQd-{#q(>-n|~oZPC`GV zh1fX#@B!O`bLLZ0i$imq^vssa)=q5Mayy56w{E$;V8=3h0U(`<{kyDJ5;J>(W z(qlI+5p0?=pTBEa>^KRyn>e$&BsiHx8o!Y#3+nWb~G|N#W)H6D>qJJdIk*T zo8RFM@bl`kik<=K*6=(jKi|@iDN}CshmBEGi5G=dW&PaEga{Aueq?wvUG4dc_w@r3`9;)!xUSa{~YVDStxaOHTy ze@XE~{XJNCX1{FltOif`FDaf`X@>_3&)%Us60>8Q%;Rp1l^&0M5u~FBk)AWORygIsBIt&w`9o2Mf=F#Zv>S z^8PLSR}N2qKKj(u^U=%Ox?3;69uk_-Nl#-RMXZf_$dXiQFvq*_WK{FGwbt#jjU$|z*tVN)d+jaL z$zjHEJ#sFEZzh|M_QfPRnLt$dfdPpai1}#942Luyy`$=PVEzXE5cHpcCEJ2?)poEX zZaczZx%p^!m-+U2zj7M=HQQdqeFFc4@!@s5@E`Y|m9Lq^$DuLte6-+h;>^;L;H>gy z{Csr39Vf9X{o6|Xl&EGw4etP3(ykihh3UR{&j z$&Qoa>kTu1#mDV9Dc(29{F^=_TTbf%>w)3s0q!wXJ5F+>zn#=~@#}W^{l@6ES-x!6 z75d@*MsC()*6oJu+X~~P(EE+S9s+DP*6Dib(c;`^E%o!$ubt5Qjk|=$N$7{P5Ec6a zT^&Z5_j*wWw=sMahvmjeSvyWruJirJJ~V$CiJW4b1pie#P6F;G&a4iYN8zi?!P?CD zagw{r&i4v*6qxuT9#G&6<0SYm@i^)H^y8#u-45*oGZiLO8mb|41lOHGMvAyw@g=X$ zDU4C|)z;X@q}W2>#^Ltxej{6jCS5Bp%ov_kkHvTtx>-@!Gf`>hQia{yRI`b*;asU)?J6NuhDlVD1Bx-!(i= zLO;apKZiR*+`jNp9Gc^#qJ3cOI7zwA_aEA7J=93#6yv14_%Cjplyn~$;BMl~>Vm>k zjIT1M{5UCV$4P=52RgR;xke(V7$?DhiN{HusmDoO%N8$e?Z(FsicKnaC0sRV)OQ6L zNxPc*)T?u{(WaA|0P8LoeGW_T?G@mq> z>+bSz4Ud!14{0GI*dP4kgHaCr%54lE#bLQ|k~_w}pQL;T|FI9vUqFE~jFaHMxcQ`{ z<0Rm2;>`Mhc@)0Np7P_Qyd5V2ItopE5!XoM6yqfLFY!2O$xGgQf0ch%fX7L-b9=fw zmMnEreT0pxhR9<>kdY$qS9sB@bFzEeaZ-GKLcS^=+Hq2OAC>lVg}K*~TMt+d3}X*y zS<>>qV-8^cF&SZAPQrY9gU1mF;0U25|5KEscM`wuYK7? z=Z7sx978o##PG8qBNg3Calxx|3j5k|Qha`j%V)*c?Kr8}Czbg%MGm$s)&tf9!_))Z zOsaKvV^k+u>t_Wn*?~^u#z}OG+d%1i2R!j-@#7@s*(aWn?~op@BYmB|UT)T7=98Gu zKRB7?y8r{d?#@&1*{;^znQ?Ou2jAQhC$!(){^4;F`XMdE#c4!38RdakcbB*0Bn=PF zhfzO`L{2eIg8!-=Cjoa8XI2NyrJT?eue^jp)j2M)kHgh=9|!iOI-)R!PeG$XjFVjP zU*d7n73s%GU5neQS$G#aPP#kDNZ~}Li&0r|ob20GeP#C{K>pD~^Bi&Z9G?e2>%YJk z>>b@V#phA?Jtq6ddcbf+;6Av{`yL7R&-go_=!cm7=Wu5Tcom1{e3H43L&1)dw5+GM)%v+cBBvN9 z!GCe%q@?>e0Cy8-Ru`1tVtkc3<>!;?>^Mn~<3Pt&Ki5d)6yqfLFY!3(b5)I#c;Q{w zh3P(`6s{VyB;6BaB<*VIQ?K4GJf!L?J0GIwqsq^%|0?%cxE!a>$ClB0zE-lqvk=l0h8c?8V2 z{mv)R*zkMzH1dyqh;#O#?CVf+ABV!+7bCt~MDt0%4v&-24>9}C+!=yjReQlMV@$%K zIZiV7ad5}l_mh;*;J0wT4tyF=@fpTR@L$|GDe?PBg1d<`>q>&N>Kw<1J;n{ETtO`%~ zFDahr7Y`Pm?*G{SZ2)NH?I-+~6wkbjZw3p`I*VrjXPW-4_%A7*SsAAe7M=x*XH|H@ zf93F;b*AIYrx%aiRaMMK_q1!aR(u-!D58+$VNP;&876g~Q_olId}>^spX|EzUot;c z@~k0wR<@MZ1J(n>%LCj@%6A3I%tx1bzp(1K^ z=AXSZXz`Ns(Ov?J{^T-+Kd63(KYt_rkQSn4f1sH4GLND*-`|UVMmCLw1mF&75CnfV!ysxXt%9hu9z*i}B+me!tOs<1(I|+uP8O#u}b}wmW8=B>h7rlv5d% zMs+vc-wDKqADw#kpaU|P`(1n|aT0Jhab|VEJPKcB4%TMIkCWW5+4)|9j)EwRQFa0{( zOrzeV2c9}ja30j*!L|5&k(7qDGc7{%9C7`=lD#$jR}8<>4V$;U|6otCf5O;A-REoe zupY1;upTJyfzi$wCfe@yfhl3Rv@1Tvu-*rz@KSi3gno$Ge-3ws(Eb*O<~XTn9~e7M z@-tqzEk>ISpK4@uig8jw{1-P)O1cjWa5r>wH|=wiJgdKg5rd>g+g415n3SKi5d) z6yqfLFY!3(hpER&-K{H}Nt083dd)LBTs3G(`gxF%w5zF4y?Q(U%GMhv6`LQ%Zrk_s z*_V3RG|v$SU0}Z*Ck4JxIZ}_C=f(b0Joc~kfc1d&KoSoG<0NO4`jl~T`=aI|;@91A zy;R9jdOj&izb4((^`;poVegk@`@nD?R{v=p@K1A@?4QHqB=kef{xf%m)N@m2242OX zIZonzU?#O}xt+uA)-AWYyV`wVeD_y4&%o>M;J>(WQqpyIz}>`|Z41gzF}}+7^7Bbq zJ5Exr^8T_PqkbBRoMM~=|0NzLt*d67RC_|}g0|YZZ9PkiEh>8@cARv7kdev?NkHJ$ z+wNageP!2;MdhdD*R21N`zmSKO^}BziS>Z>z_9cHHZg&&Ddv;1;=gLgNxx`)U6@Sf+lj41o%)fEj)Lyq9upY1;Fg*~AlS;jxG@97r=aU@ihnceD z;-$w)rM@{p5?Pn|^Azzu+1u|p$up7c#&-nFc)D>?c5`@~gnmd1i64w{Qr?b}JmA!y zxVBm&kyDJ5;J<3eNxsaLvC-)pGV1do8u%-9bF6UGqG*vlX96U zQJ5B=bCeEx5m`9C|lsVC5WJzzcH zdw^QQT;}Z*-M+q49ou|+?X7RU8Z&uOvspLe;7K-40(G)*0+Hbd4x~Wsl|*xBReYz~ zeNXgvsFam68MAL7(R+a_6=R9F`E}=ioR35n|(h?`9}FCx@`_9aE5V` zEB>o?oCMrWoLOHIoK@Zoa5mT7x!2nL?too1#wa@h6`x_81pk#ACow$(hVmW$PBr?1 zVI3R`FfP7_EA&~Wn4>U@cBr3K>lJqBKzcBSR;;^3NMPOhQFlIe$YmsD2Nf1-ROq@A z-${k}T~wGIEBAMk`{Ps?A>O;he&O#LLl5$K<=?3;?WsDO&ov12yr7?JByx&;4*w;| z=Zq)v%V6QzZt>K>(lOM}H4+0)_%A7*DEEVfXWrtefu&=ppKBxrp738%JW+qA$FtZL z{YtOJQ*(!op?VtW!?!QuKW);rVE9H)W45_`~_Du(zsr^82XJ-Ajep z{UrW26&BvE!hEgVKTz%;tinKQ_zd+K^dO%P^n7%$&F7lq^}L{;Yb0`td=CF5$>(1C zB>82q@GMw7HL!FH^>dBHz!UyUiYLnbVBy(s@zlW5G1SjB5(7{8FDag=ztiJcY>R%y zz244`1pd%5)XxJ7oT0vj|B~YAN;^DQc-C1w0TG2dhWfciBB#I;{!5A{`cs32XV&7W zfu&=ppKBxrp738%Jkc*6EIjiTPYo;`L;YMMG4O={lH!?_@y%f2*=zCCz|t|)&ovSQ zPxvn>p012j2Mf=F#Zv=I$521lNDMsTzjAo`^U;5)az1))*P?XO(T;lLR-6>)q2PgC z#NCQ7WtgMz4)uJ+&Zp}6sPc2`zsh|U?gv+#e=URcfc3!e^#HYoc0RgV_$QD6{2&V* zkb!tVI)8Tbe02U$)$j1Oyo$tS>_F5y6Q^tqq zqv1d9KPz7|fsaFD((g9{cN1rp2Fx|NMR=>c89yK0Z^udON;#r1247A0JAz$UPk?dwx*l`22SaJZZG1O8AIK@I!bBBj z4^v@&lEf#g&^=m(g(-4>n%tkRLQ^*4sL!AW`Fz0VqnkF}$M1RDgFT?<1^v9(JILp~ z;=d&MoadvFUj_@${Am`?04*Iu{XC$+8SsSvlH!SSKUjDce*ey&+wuvNbPV-#+z&$F z3I8R<6ZLm`JOdk|&I-?3JOjVz80zN%1w+mlRL* zrv?qrmn@!D;VJ%0iYNNTgN3JC`||y^{RE!2V0sRcc0O9U%=cSVd##bk zDdWTQ(eNMlpR1XV2JR-#tS$-8DsRTmN4MK?61!54D2!2dK%+uD$AJIJjgy$30YmvN zo{x^!6JQ+HugCPcWX2oy5ow#{Bz!-5tS(T_S$DQk)jMvJ3iHRSurO2NvsIX#qeAyY zxu2E$?^0oec<&PGGw4A+AL#k$yv^qt1eND=_%BI5_u41PFN1|=uf?+}JmJ5jc%s}7 z7M=x*XH|H@e@XE~{hc09&D@C7ev7B(mCEZ|_%A7*d1;3S3r}}~o$m?&tsGDIFDahr zPYo8Hbr#P6&NTB~;=iPLqF+2%cxEl0RpAN$CB?HKf z^A^vl@Pz-$;pxvu@1XiCCy~}9&ro38tTRvO=JzzaxJ&?o$Em%`F*jo`bo%B0^J_8TT3Dnt7HTch6_8@MHqf;|ErB zK)!J4i=Mx#`F=EHhQnOOJyrEP{P`Q{hqMqOrxEF7TX3$hV@bd*2+Pe!yW{NhC-$5= z^tM_*$NeB=e0V+@{^S00kjH)hCw@N~xSKe$#w0kaycs_q-D}55>`FOwZ1r>84?@Oy zJVoKZ#N(vN)r^yBXLh%>21ZnNhH9#a>){|H72Qj5!KH5GJ@NV*jm(FzGUvsQlUR;wo=4CTDb*Yo z`Eirnj6>Si9w!aNx?T5u(d%~eXN1Q|=!cm7=Ybk0W$ic#*@(ipwpt^RQ;d_~ziP)x zz}>`|)dl&U?c<|3EH_Rn*m06_o$tRWtThrj#W)H6D>qJJ`v1?~mjFmoRB0!NSl$Y# zD+q$f`F6wIi??t>XGcqf)Dyp)QA7`RwvLiAwUPR>gy*OUHtSlxB z{Tt8ihWDbn>)AtC*7<_#0r#GF-yqr0i6HS%6*cdR6PDCI6>{AV5hLU}axc{5PWweV zEUeXGYn_~*ro-GBI&7aQ*Nbw!q(h_FP?T{|&v{Bc(DPA0x4Yu>+`!$`1v74Bktp;W z_}S>WdXJRoOICd59_RM)0=7&J&3KRlG4KieZ23gL&x+4+$0sPF(B#mJ8(Aa@K7pSt zpBTS~=d-&lW=g^FX~1D}XvU2!5(S^Y&z8@E%)?pnS#f+CWSJbAaU)BFPvB?EC)QJ0 z@!4{G8f2LqnsFmbgiqjS%O}>wS@F5-_%z5eIW*%&mI$A~&z8@Y*f&}6*>-#yWSJbA zaU)BFPvB?EXF=@LtoU4Ud>Uk#9GY<>ON3A0*N;#Cx!q@{@kc-HsB(FsJntQJ(81kJ z>X(w}kN&o~Y16Ni{@3%IB{!}2SDZi9)T6=U4!^-M3)`vv71rf&2si{B0vZ9HCiQc> z`#fGhNf8*Ze0xT(J9xiJ`EO($QWQLZ z0k&1^G9pweEj0(Ya@$9nIHALMuH!& zpEcH;!RNvHxn1xc<(W$Z=SI0*d~4kdc>c}ahwk9xw{qkTbbcMiQh(w&24~2lL+l#^ zKWjVbsG;qoxl*%Po`2erwfSbf)MyTDEMb@m-w2)E5-3vFwILFe4z^~UouvC^l1|yB zJ3Gk^r(~>$&|oLx5O4_WrU>vfnfCjQo~*-cA?$4@na`WWl*o03j@{W#DpbOD64oI_ z0*RM7Sn7<*PHHKXWoiy(3B!k4kc;@dn0zYdz z>G)yor03U5>j$=tjC(U)!)vBe{MJB`B3Fhw$y-Pj{%D2+97Wg0qt}bUuD@TpL*=3V#ytv$m7grLmL7)(-vajpomlL~dti zph%G`L!ByJY;AIOlJ1Xj`edKx>?C`v;_)6zhn&Q8)$slQ>J z4(4Mci$q~30l&0%5_pgD%+=ZOtaUTlPO3ON$slnsp4p!S{QB8RtQSle`ZwMKgUT=2 zzFqAB;T&PWF;cq2M|LNLQuYa*;bbX~af|EtGLnsu(_2kF?i4obuwB<-ZmXPc(_!l+ zIxM_QuAeK{mvm?p8;UY6{2Vdrfu0Zk9+*(ET_-K4=LRN&>pAeV(R1b#`jQo&%Z|@f zd;&jPKGE;9;#3~x9Cv&MbSnQ+9H&MWiNZeu{A~Hex;QI73yx2NtT-+?t@{H$fuAj(Ik9iD;K2z}t{QB|fzXxXhu>R;{=4a^}j%9ikj0y*TgcsW?#{KH( zcX&f(bRRXIwa(M~E6$&qG)CB^JN)c$3iiIE`A4VNt|W(mLts}&fTziO*Y_KP_hZCj z&+~2Q`0IFXSKSM>dnvD<+l`*HZ?M-9hs9F9aDiTT`2HJNhZHG0FLSWeVU|bo9vJ73 zHi(GMy*M|rNR;_e?|~8gc>NscIm_{9$@)Do;62JSmjcdN*Z4dx)QjU}fAq4mlQeWb ze&E&&jVuzyJ_hi!wv*9Qu=JC*2k(($Iw)f=U;2uXJ{j?vJJ(4IX!P z(%_hdaW^#6MI8bT0f#_u1ZXx~%F_d?89%pcHX`}^jhw5`^ek&XzdZjuDi=M6gxzzy z$ZZ!MK-q9W0t=8)Jh$6ABmTMF_N&5n64oI_Y6RauFyOWz9=C4RZSMcvZrj;O8Y=ZS zX|6W1NECJw@Jnkaf%hoST%8Ti{p_T+vy%)G2jiKa+Xa68>?GC;CJg->&+Y2(AD~{N zDH07h?!JZ;{@w$BFWvmCUVWAS9Pr<&jT6+dl&|f(*K>Gmz_`V7W*p^k-G$faaVPgW z9kwpiVf*!R{stWu-lW6aTjcs%<@!JC5M@R~#zj5nDfK|l2YqgLFV!1@{ea8=xM|0! zSAFKXr@Z{y>(*B1cjR96)0>`fZnXB@^*qppel`X3^LT;@__3Zxzh_g}^tim|T`&5E zvON#nLU)Gcc28rZi(_oXjbR2Xz&{!qStQE*@E8XCY{oG4jJ=EjS@D_sTlb7$z*dw; zoCi4&1E0XpmQRf3!}Ez2#E0XKPXie67Y&Up5(S^Y&z8@Y%*k2tS#W$BWJP(zxsfHp zC-Af76Kkui_^dcS4YI&rG&HhA_ym5od}5896`w7~r$JVfN1Pj3B76crTRz)j>tw~} zvg6Yr3;abxBTIx&;AhKcOKjGx_-s2q4YHy<;@rp*;S>1v$Y#SNA2 z2K7&g+g4Fhx7%#&^e-Pd@*F8_*Ly9_w+bB^E_C<}hg-0h1hsUbL%<>65a^2l&4$i5 z-4~@k84jT9IFJkjPqV;zF^GnP8s7R2>j!L8)ECLHSLN&{a` z^tT*y`?~#MjTvx@o3Dc$h%rC>3@`BG^>dnMc)@#=XRgnNXRVt7&(YsQDf0XL87+ZoX-7(g$p1$davJC3L{e*qf zQGX*#uzt1PsmGndWjbuXLx;I{%lYLxY`s^9h4;(#56JZo>X6He`(QjnJ<#*CzUgb8 zv2Mruhuv?-=MMkub*JC4X~$vCH*LUg>Vg?JvPhKqVc#_HV?B@R%2#fBAbnruC(1W{ z$@Wu8Z?%qrTje1kFhu`3sh3(Yg71>ET1RMgp8v;B{ z;{8(k-s7gnUcU>=^5*yP`XiY9z3CgSzA_*GI~;zgJl}>6^8K#itK9B{-#b!sH0R+D z`)uOwQC%GJ&jBQdgQ99b9t#ldn^px=J4XC|sVnrl1N;40hZLzgzDL|Aw`COXmnt~l zv?5afNt&yTED~jY*f$OQc>SElH(e0kqdaqU;GA`h&*MU^o5{ZE+!LK&M`H*4;$?1V0>5th zb=_$5|9||@o^E`?oWxz{H1}}`I0PI5{SnyPdmv}ZA4q@pmW5mQ_^6)+djaL)cgTj{ zePWJPT$IhHx1AJMzfr2pD}D;M$A4#vpGuLWa_(t6>5VVBi|jby6ta_4bM~0CsT8)Hour}j z@e6njI5x6K6m}BuOR|$5`-+Xi%@qAE@#Um9`~gqFyIH_{lxNNj&I38f2Vp-uY24XK z45fVHI0lx;qeIw9z|Y!FddskO(s8Bw#&Uh^h}zstxGA=0;i18hx+72|BX#Jg((Be* zJzhC~NRm$3r91rWa0sWYU*iOPa zB)Wd)wghpJsy~)YW-@RrpKMa89L0JBH=&kuwB$)tE9uiv|KOC^;sQ;OAgK$7xivW zsRw#K=yx6WR=pwE_j&$awH?#5pT2I*?6Eukbim*2$nEF+rUB}M>ACvuw%`{Y&vc1r zTy(?a70)jz{hghCLjEQDKh>CbbpHX*(4%2_?)SaNiW|=Yn$^4?$F-3~qRbDEXTZ;9 zJmY?g@gOTcTaHhItT--p|1vVEDEI_^)_lsiK0Ke%mW0oj9iIjugYyaeZ283eoE4vK z$7d=&fuAj(SZ8I$=ZfPq6`#P*mQSpgv*I&1?$*5lp@WaNz|WS?oY*~C@j34J4CowU zeGB|-`D}~*niZb~$7d=&fnPs9{qH@#Go_#U$V#kjPqV;zF^GnP7|@>3U_UkCJ3m^4=#StQE*sP8?-`gOP*{wz&e`>BQZD9>C9 zIM?k{<)VB)?B}PhI6H}flh0s0E5DB5*UwI3yAsGr*Odq2^_Pko>6VwHZiH|cSwRnuW^PKSjT%XveG?WPV}o8|gexqglgV~STv z7|&2oky2T&2lZ1&e=qisuYdo#iza7xy#Jb0cKqbq_uEl%@8mTofWAdTBa1|tpT|=i z__3aMf75hnGWf0y$_&1f0Noju+vqb0XRMTWy!wzIT(|!_&)u=`t>R}}Zmu$j1OCy_ z$Rbh9RltwAjXtk(($(+upF#Nj_+#?)Jc5i(C_msCW5cjK_j?AR<>o4bMBpC{jVuPw zJXZlfo4JagLBJS4JfGcdF;kWup9UOJ9&v7Dktp|D<`ekY@|lylIx9Zgj!%Ou@D~k@ zED=6|pDmwQb7jTnisREDE6O9zjVuv9fuAj(SUYFMXYNVPXC1Hw{-R-!12K%Zz|WS? zg4jS=@j34J1Vt1^dBnMqMWWyn_}TKA6I(VbJ`0XdgDmhD4UH@jK7n69K7F6{^6)Vb;43L5?<1UdqgH64zYeOXDS*HCGy$9obu2EeY?A+lu7+&3D@(>#AL>vMRf!!2= zed)gOu3o(}88^iY?$-TFI;I;U|Tq4x1z z8rO8@lz$H(c^oJT3lQzIo}xDBL%(w>dfw~(Q}}KmN=CSpZ@o;fJ9xdVe#=ePAw|l< z_lW!Cw%iwDY8}rfOM*)fY7IbrOZl$vRy#j{k7D=S%Qyl{BO67TANEz*MkstZ$XQ6Hph#WU zhDcCjP2pTUUfmP#n(c0*$)9^yZ#O?s{;qF6Iz$2si|K zBjDcE+Z!Lds|Qdv928aW-M|7Q%XjtWULLlSunvi?pV1b5H$0c{r#p<=Nzr%p=Jt1f zK#d*nOPZI1TpWX)1pIjYtg+^+J`a<&@9G8bQJ%T9V1474+r@W3JE`UDB!*HxaU26% zLXfU$>Fi<2Tb?B(l!S;F1 zpVWIzpQLNybmvbB<1sj5=_ANxx~bdi82qhuMOc z>`&qn9@)DX`khHtAJ>UPNpQOp{7In_?fgkg^qUd~KG*ZcrnDa@RD_%?9D&pWD1rlN zSb(rUY2WkD$~P(xo4oSUU#ww&QuLfSi2SArO6e7nKk0(7orHBrk;E7eKKR3J8HGQo z;Or!Yr~Z>PR~uO*3Ofn-CD}=~-+=`0QJ%RvaIV)5oWku4hgvrSzu|B8K6D2kzm;Rz z*-08QAGbKJjVuy{odo=>?W7x1*+~m?+q&CgnSx=eEBlWEMe4dXM1s=6!YiFWN%zO@ zJ{j((&^I8Ba~<9j{Nx%SJYe!cGEyNp_O8KS_9x z^31gc>zi(Vb*q;0{p_T+vy(Jb>Tev!z}Cn{QP@eq&)QD9IhCDMFE_@Hsy4{0G+o|Q zo^OsluU=}D>*2N~oP~!5Bh!xqMKV%{j;b-IeWCLw^_n!49scO|9*hn1W zg9XTN-%mm*y+ZOQy(VlYVI5K=G3F6ma$82>Pii|m$si{*+eui5MAy%wvXgQT*Xz076zwioljiE~`-hzb{LL;1h8P75N z=?PnX3cmas2A$^!F!?J3C33;~>f} z&W$V*g`EWatnH+q4{Il#SgOu9yBlJkl4vLWXP`*-r6uQ7V@}~M&Q40!C+JoG(Ai1- zG3t$TvZA^x4grUNLm-TRX(#C`anoZjJL!_`kIHLXg~u*@5XX3ibPkj4B)<9>{*(OS zI--Zl&FxOGlR~B0*-198G_pt(b`tPQYbSyCD9>CSIM?e0PT}^2L#><1{-lDllQd*LZc&bbsgaGM zu#Epq!G{z5*Jr98sH!0T-%^_iY!&F9zX zpGW1Q=a8_olaSjkJb<#{fCLsG@F(qm#TO>|UXC<#b8iVLyLT+u2DPI`ubct~Rnr6m}BuOKT^A_bAU?oej_Z z?4*jblME6EkzHUx? zymBxH_g33?ujlaCfN_iS?8AQ|AFerfsUCOQ@6=)8?K*5-Cg<;w`7=fP%t67s7EPi$t*>0Q_w9T>ZYE z=u1|7E;~LAvIgf9_}TJ_exDVeZO3OSK7pStpBTS~=hJ9zOmxNZX`nKA{{()vd=_LL z&Wg|6lil|-0zwDp6ZqNkiS<-ge2zOl13HIT4*@@0KCv#&iqC@MGZmk}&z8@Y*f&}6 zS#f-(;uHAU@>vi&H7h<_j?Ywl0>6HI9&wWAt)nky=l1-C+DAQxYVE&+5;X0IlgJf4 zU7hpPpCEmJn7OSI68q^O4GBrcp5!?-_aVK%;{2&eYcjiZho2oz;r$|0CRRsXqC>zT z;1GyIfM!GOA9nueIC$*R4xnr}Ab|zQDE!gw_3{4b_J{Sl!}s6FIt1%yEOodoi0iq7 zTgmfAIPB+-&OO5IKWWT>n>qI)9^^ob`8kMAfFG})HP)QN=V8+JeVO1r$}^W{!?V`S zE(}pqJ=*? z_)c_CI+t7cm>zd>SL(2Jg$~}GM!;5- zN1O*a5JUe2eztsK{2rc9v>-klcYGSafWK&HWRWQN1b()Bwqzd8iqC@M(;zF#BhHO1 z5k7&REuUCVWyNR3@oA6+{-U9gCBi50v*i=(;;i^=IX(@tqCDc<$P(cb_}TK=7W*bE zK9?Pz23g=Q8X8$5d;&jPK3ig^X2oaQ@oA71F=RWqkTlss_zW+wnAw|N1@xW4NRQ~9K z^G7RP(|?lYY9ot8nIHB?13z9rr}0OF_bAU?9XL1q+}u~_gY^Nv1DouRUU7DkhRnw; zj%y=}M6quS{QB8RoSz9p{|@`3)p+KApV_P};MhzJ$2m_gfAoFng%|X!4Cw~$jpd;m zx~$;cbNZbBa=ERm^te;_qz>C3*J19{I&57l*Z)n@Z_;7=D{}p7Iz*|tAFqVo|A6rf z^+3-D_eZ0K_%Qc(&fgUv13id_K@P;A=fKZK&)FXheaVW?amObpqA1T@|lx$aaMe`9iIkS;4c~)St5J_ zKU+Rw-(il$NY;Ch%+gL^`1_~4X(f?($nPXp7p0gIduJ>1*KQ*dLgPlA42E(g+&%s`C zT~3F9LtwW@fab}i{2>HGw*KhwxVC=}*fBlFy(^Z)c)pDusx+3{RsGS0a=bsf{Vl!j zfd2;T5Uihp<*5A8E$5F`x~Bhxbvl@fjVuyne%K!k{CNGG#vcvdqdaqU;9R$dQ@EYs zP%n;?{n6vjPSTM1xW#d8WRWQBB;eQ2PU8Gb82WeAA5Fyycj3AMj>GBZ+25EaG4VKG zGwTWrC$8hGF>;*VzFqvv-_v34HXRneFXundVf%-2z9Qi-B>k5gnEIX+YI3H)sN z#Q2>RpUaNVRD1$ITRw9#4`;<^+wqx-PvB?EC)QJ0@wwvoOvNYgv*j}<>*B2V%stKd zy8=Q7Uk?F4Yd*!k$%@Z$$7ew2Fwa{GezttJ#ZJwN&w}GK6`#PbAD_NIdMuSc`f10N zHq2LNw|NI0bgMl4090Cr32m(A!F69rTzy18tFQ7d5{pj%cYnb+2CC$lw3g%bz2^7oCrsM}9w= zeTC+s3l9HX$`^jC*B$WRU>#DVjC_x{Pi{-_?p>ZY_|qL~A8FvHyt8xej;9nm*K+vC zQs>&X^G9pweEb;0=wW1$DD%VqXyC`|=QRFk@E+xvs{`k8{PJ~9*SZ<-{F}WG-NDCi z<)}D2Nkb)gb#siqV`QT!{B*$2+D@7n+D@u9hI?KY4aYErb3gp=K#}~k6cIJ%9zot@MhpZ*x9&}1j-5O4_WW(e>!sqG}b@dwfoH$C$ENbU(ciQDi9{*(OS z`8Il}+}!R2J1JC}ot?BqHqC+0^}Mku&zn+ne5jDf$pLhZ1DCJ>8O}~ZDZRp_eEWaG zb`sVhMG|8?_}~w>C3sGc=NSHUhyCoN+#{VIP-6%D7{llh*-6Rz1ik7XIy-T0mDb4$KTeI=sZ!G*NY$stI5?w#DofIs4 zm<#@NhyCoNg0qt}bUuDzy$&!nvQZRv67WlFCxQ1U&s?hw&)SAh_9rbnJINq0j$`y4 zBO66wCjq~Hb`s}j!qC5?-*3ER`}U#Vx4SCbw63#Y-^9EG8(QnpP39$uvwpR|{%7@` z@76bUn7dhrg>TFGtvYP))M4v3x&B?beuoZYidRXD3x6LD^+3-@{r$$a({qD@!Sx*Y z+330YexvA1R(!5FK2z}t{A~F|zt4)#ocGp8Jn>xPmUipt;QbT$+470;J1aiN9iN5< z56&m>v*j}<^Ke#t795|c_ym5od}2M76`vKyXDU8{pDmwQ7iYz1%ki0tPvB?EXF=?n ztoU4Ze5T?P_}TKA6FW64KHHAZRD1%zeti1hZ=4*~AAM43ex|mmdQN%Rckb#fH{)&* z{Y9{0hom%No`u`r*ZV8ZpPIDBwo7;T+2N%3z2owxQDrCV5O4_WW(eGC{n7FM5|8KG z=%Fa%X?<7qN4Gb``=eVw(CZH0e&e8I?b}<^0jc@DMlua$5I?`BCrN75sSp z96WCUnWf2FFJBP(sr*GZEUwWd;kx#BD!-2K9_5+ygY&>Q4*4ML=Z{`-c9Mo({bk(Z z4kL?1nP>I`1HXQD66a^a(7&VpXeugJp8}4%+klil-+wTkWdcHvPB`ZG19iIkSgYyaeZ23gL&x+52<1-bXz|WRXjNe)DS#f-(;uHAU z@>!61I4eF|j?Ywl0zX?mv7X9`&t=DFDn5aqEuUByXT@jR@tKNG;AhKcOYEDh_*`*( zrs5O$+45NsJ2fjlb9*}bGaz(udjV3N-@<)UB zD9>CYIM-_gPC@?+!hZhfac3tnaPk?9XZA+}KWjVbq+#u(wbS*|LiuSYmP;EO!~85s z@_VFy6(|ybNE7my?X`aI?4;zidy<}Yr#m~T84SSp2s0Vze{p=*iOPaq)6GBM{qeRJ1Muyy>B;QB5AG;av%mf3Hb5)In8ss;62JS z*9Xq^x`9);o#C*bom6mkl7`I3Eskp=i$w7}Bk;4flg=34PFkE>XdYEBZRu`}Rf<-H zn5@4J6e;HFz)4C6bANPplJ1Xj`edKx>?C`v;_)6>f1Q9sz#*{PA`sX~{oc2mWG4}H zvJSHavA3PnXL{zkLdU($PP%N%@d^(tK=kjDC~PQwDX)LOF?t@gi=yXo*wXKk{3&cF zVI5MW?2IF@Jv_rrcLOm)fs zCQziVYeOWcF{kxsXD7w$QgjUIeeUd}-uU##cnA%4A`StEz;24by~|Ew5+2f<37&7G zhmzoF{oeZ?m?>(rKD3<_J-4xoqQHlKM9cDRrug((VN1yJnpPkfl zc9Mq9$B!|L9!3_4!cGEyY3(HN9_5*<1Ltx4>gM#flUmMB66QFF@{4mLi$q~30Y7Uy z>H2fj?|d9XmVbodR2ThN#LE3C`m5O4@M1T+Gpu#eY?>{cpYeIoeL@I*&Yer*5gwAMz*dsn;F6KI8Y1VI5K=NyY<9ol)6IZD%JLoFvWF zMiz;}P6B>u?IiFX<(aDk=V|PuWoIWDBo4+ik6*yg+D`h?(002m^^yk?GO3l6c@3VDu=J}$IKJNgJ%MQ zw4}WD>8KB3TpRcrf5P=T{7gK$@d@J^M6jkq) zz&*V2C3mec$8F=eJ5`m~O%XfE#=k`Vq2JBgu`kIAhW$MqnDKMD9*+ezOV-cG93nw1oWQg~vYfJ0!nLx87AyzfrmeBAVSAG(xeCyn|& z4v7=DZXVCKp#ydjw>!a~q~>TXp4v`Qb&E-fB7Ga_0G$%DlXx#O`rd}xJisMmI*Rw*6`Y-<8CHLj=4vC0L}4cZza%@!_V?Godz5Fc4xH3@<1kKn*!RJ<$nAgl3)uoo zd4&DZ3y*92_YmkaJ@b4UJydBdmtZG_YP0hvEzy4dfzS24u_^t%qEHcCCkIdp4qU_n zL_f1ZKC~;oFv$mFh&W>y?@vN0I?Pq$f2X?eps<~Ubx4uK7!N-9!)-xa&l{Y|oP@)u zKk3fSxjUXx>|D#?BTJoYTh30>komZU^*X@R$VO4vNx(0yodn*aJaer!JZs%dwv%#u zx!+F;7>wf>eJ9ApG1y7Kub-X7`I#{E@96JTU$T9>+H(olVsae45}fZBL}O#Y_Z7{{ z`nziwBirUBiL-vSAF9Wl*1kH-Jw(Ds=&=1rx&9~}79K6v|Bqb%zdDR5UL`Ru>UWK$ z9_aa~f2Vrf>A69{;Cc@HZ1kM@guZ0OXTkBAicjEY%P0DMR(w_*pQ-o+e%5@-_?;D> zEyrgnK7pStpO}ZU;&a*YnTk)~XUk_x)>B#W*>-%U;uHAU@`-hER(!5FK2z}t{A~Hm ziG7n5pSiuAT^%M@+{LD)B7vVpBkr6_Gu13d#v={cQpSH8tgyV@HWH$Cz@>64z@P4dAd1KRuhjSor|G{vPhKq zQNL3y`0@H#_cqSJaw?p(eQp=LM|tK_z`0Q_%J;*5{^)|UlN2NR4|t7+Miz;}P6B?` zcG9nhwv%eJ&GNi=(81k}u}ev`ll~AWl3hu?b1B`+JzkGj?mZ@cpZEJ@xW7Wz04mOP z=c#rbTbp^{? zw52=jXD3yhoy1VeCyrxaiaa`modo=>?WF%5+D>ZL%kvwWm7%}k7#vYfJ0#SLxASVd*}BX6DDw;Z=;7|ji>cp z_4|#5vlG7G_@uC%gmp-C{mfVf%O0L%_|qLm?WE}U8w<`(($M+%#m(177Ky@60)9z$ zlC?icc#rbT)!Fc@`&RPz8(Yp!GDwW$7=6dcMp4*Fz^|X3#QB*p^zTuAzwzPWrgfd! ze82IFT~b=V+E3BrPV1>U%sp9$g@fe$5FNHx>#%jGTz{rqf0hnoidRXDi~4?})B`;q z_4gZ>ot_&M46f(E&qmMH_ZvlDvf{Jt_)Nto@U!I;{XQ!`R~(8+`*y=+u5G?r(nZwuoB~Q=Q+9kY`wp7Pdsh=3C?XZvEVD>$!T};rnl7 z9fI{UmOA0Z5YHw2=?*u)dH`+e83*MtV zbFJV!j$gjc>HYlCZD%KGs01&KWt3|pi$t-{2>h(=q_L$T?WB{-TaT)jwsbeeHYGeX z7*hWmD3XynbX1Kwg~@x)PU>#H$)B^6dNJwjq+aN_YYqX2!0v@W==+W8RUzH;i|08z zskc@fK$me)H1r;rxZk<&|GOl1?}5oJ?X~j>=jwGhKNp2{NOb+oi=n;zTj;ir^rfYI z)J}>%x7&7hl8<8i+8Njy*(eG-3HT-1Nw&}Jg7+xTTx-yO(U$J8pPjVg>?DIg#xL$L zvPcwm67aLOlO~3?lPcBejq~M3W7sb^CfZ4V4iu^TMh8zJ49TDLay?$T@8`wolYN@Q z&mJq=zB{-|I|+w?Ltr;Sfab}2=l2^ErfHsUqlco3^Y5zPZ)|Oh|9)fZ{IH#bbx4u0 zU_5{!FNP4;^9ChY_>-b`Qtr|2Jur-%{v^%SxE_SClYn1ZI|;l;dFC2zc<@Ryk zLkQR#jOSG(2>kllNvs!482Weg`;Al-k9A$2fa9)9enPL`$mLAEzTe2#xsES!B=X_( z+^h7s(|WZI3$KvywK{BHB~I=n@2HRdy2}m$hrn)&08f)kdH!ui zeB!3Z-p}oNY7T^a|FHM(H>z)3CKtkWg^u0%_ZxHX(CZHPZ?Fz25=hJ=xMY?`@%xPh z=Z_{N@kyGiaXko`AO3zL@Zf|j{!ty~KCZ)<;#CskqMqB8dZ6c{er~tr z^xU9ea6JcpHhRu{LSM4tbJ_8kicjEY%P0DMR(!S{pQ-o+eztsK{LYHc6~|{PK7pSt zp9PtRv*I(CbI*|lgbqG`0zX?m+p?a@iqCP!XF#X&FU4_cWRWQRBf!s=&z7uD-)q31%U!%jqr*zo*S2_Qz4s$zn*uGw_-yqjN zufv$)RT9QC)B`;qwLiM;^xU9ea6JcpHhQl7(V{O|@wwvoOvNYgv*i>0J}W+R_jCTP zfY8DFC-Af76XSPQe2zOl13HKCcL{#Bd=_LL&Wg{1<1-bXz|WRXtf#W#v*P$n#V7Ey zK2z}t{A~GbiG7n5pUaNVRD1$ITRsb7r)I@x+wqx-PvF;&Pv0MX(y;#M z7nSSH^477#H<#N)%%kx?8M!mn{{HaMclU=&Q&kmm}5 zq?_)a^j2=qdLUN3ZS{C;%eQ)4{eMh|s=%6~$>a@=f^&xZYgN!K9DnB4!?1E1@8 zV^f|trRMnHT6gRKO2UDwSZ2_79F^}Lzxm2OeZ;vQKBw@=@PSfvSg6JOquXE5>ki+4 zBkPbNiSa$+KDjN3bDg@>?y%qYqjQgOziXtil}ZU^1s>p&>ejIR*n^CCuwK|pFwzLe>CvxXD7iQjs6|=N2mFIwEAUl<1V7n ze*S3AKN}UIbJnlIm-V=l`-%=*U({jyt8#v`4h!GVVeVUU{o8W=RvpF^uaYpHp&sb@ zsQuBo`#XPEz(L$thB+e0#WChb{eG9=XQSup`|hGIS@AjU_%w(boKN6q%P0DMR(uv5 zpQ-o+eztsK{LYHcisLgCpTN(S&z8)?S@GF&e5T?P_}TJ_^;A}TE;~L`@d^BF`NX<7 zD?Zzf&s2N@KU+TAV&7!N=ZfPq6`#P*md}>hsaf%vdw{b)140M4SAbtXK7D`m87ckI zN6anOg9Z;0!*+0&%$|u?y0Y3NY``BRg0$}ZjEXNOb#{wT}3k3+yA;1IAz z;NI$w4%}+tTj4P-dZ-*Mu&aJQy0sARkIvn$*B!q9M%E!k!h-Pth@6-qN zG*=s0B+C4#-!&5ac>SEl9}V84Jacv6T(1#01?z$!?B|ajcXkp3C!fK1Wt`pi zUNB+k-=p+LKLpKB2yOh)aSsBsezoq<<4)mD9k#!#!`u(${6{)${f7<<|0&mhD%XFe z!-S?Oe<%AdQ4jQd)c)v#({qD@!Sx*Y+2}d*34O_m&x+$S6`#P*mQVEitoUp>K2z}t z{A~He_?;D>%Z|@fd;&jPKHD-6XT@jR@tKNG;AhJx)>B#Wx#IXt#V7Eyp0zX?mb7J3Q#pk%=GoUl}y8zhZFtSk;&(8usTRz)jr)I@x!SQJjHF*C7 ze*O6L{n4{2{n1C&OIwT<4-ifCI`5TuWq{Iyta*;M?$Y}!&Yzm3Q+DYNKRcY9KRW1u zF6Iz$2n>zDz11I`bVEGfMh}&j{Up1pKf3+mcz<-^=X%`%e>B!1SU)o+{27%$y5;=Q z8c_8&X|6W1NEH5P;K%FdH2!Gt9_5*<1LtvmXx*Hpd_RA5#o0+3D)o0Tp4lG_{QB8R z@JFM6kJ29<_uJ3LO?fu{=owQ$;;dioe|Xx?C!9-m&srVkPL%Kz9k$oW_0x1%I76=g zqg*fQFs68wgz*gZK+i|*k8U|VHz*if&w-zfo~!2zL|?MvbJ_8kicjEY%P0DMR(!S{ zpQ-o+e%5@-_?;D>D~``pd;&jPJ~0nx#b@q8&fgUfI{5qv{A~Gb$$Ba)KF1xO0iDD6 zy97U5KCv#&iqC@MGZmk}&z8@e*f&}6S#f-(;uHAU^4S(UH7h<_j?Ywl0>6HI`u^yJ zl>X?G$_sO)>A1)Ajr)j=CVHLsPP`IZPQS!FXK0o5{)+RbCauZr(j9(wI5~fGzi#QS zI|Lj876{y1{m}_OAMNpc8$Hx*?#lk?TqD6BJ+0Rr@ZVq^g7q_elcVxSx1B%Q=u$~@ zwUI@l@J9nbUO%VuM+@&!p1C@3p2i=&?Cd0Aj)TE?W`8vB>t`pyAC3M!N`Lge#vQ~( zZT!)d7(wNap4H<{tD?hPS%-zQ<$O+u?M*st)#Un%<$6PhF~zGSjAw1B2YNnge{|dF zxk16;dJg<-^j!I)MPIVwbH(wQicjEY%P0DMR($3j?EGB;p@a8N;AhJx#_z279Cv&M zbPlnu0DiW7=42kuiqC@MGZmk}&z4WDr?TR+;`mI(C-Af76YJuv_-r{oQ}GG>Z22sR zeUlZR%Z|@fd;&jPK67HHX2oaQ@tKNG;Mb2&-yeNWN`Lg)P36*XFYHeAI^QSpiUEy% zG|ySvO})S3{HaMclU=&Q&km5``3JEiWKN|S;vy7o?O2`uD?=; zexZ>F#xv9dJ&(VqZvEE9;XMG6!j041L!7@WfMaky2Yxns&f^yJB`ZG19iIW6!}z-d zKU+T0@3Z2w;P_0%C-Af76XSPQd{!KvsrUqbwtN<39?pu-mg6%OpTN(SPpqf1;&a*Y znTk)~XUiwn#aZ#$c6_Gd6ZqNk*%JFED?V2opQ-o+eztrT#7@nM&)h?u{TUECg#9V_ z_2bj`M_(|kKl+q%bwi~&mcjeF_sPH?oong+73WV)(kZ)iho2ozdXG6SZ_vA4%pu?q za0v84fZSqB`A1Qvz4z80vcR7eNZy~K<8;i<&gS`@*th@TFOw{XFvyt{3y)R%CuO7b zxcZIkd5T95b(!UM)%SI`7UTWV?F;p~!}s6FIt1%yU^yy(biw(f4OI;5bTB6yStJU7 zH1Ol~a~gj%c#rbT)q!)}9!}wQhC{ssUOE!#zuEiH9en&&j&WxvX=r@h;`gR@qg+?M6&rlEaeANEvg41&Y`8XZN*kNR&DD)io_1g~spU{`A_^dcS z4Wb6;6ZqNkiGH6IpDo8{Dn5aqEuR>_v*L5v@tKNG;AhKcOXlIM_-s2qQ}GG>Z281` zDl0x$9G|K91b()BVqKgSpSg!Qe^)^0;OimaXUk_>?3=9k9Cv&MbPn^prQm1FXG`qV ztoSTAK2z}t{QB{E;<28$lWJ;x;lf8e@m$ZNQ)8dZXhK5t#A8n^&6S(YVP4cNMJ9Tk z@0)lfp)p4C#jpD5P5irQD=)iT-4`ygy*)-Jxc&l)^S(`6@>5hk=9sAM`Z2nKe2}|a z*@$6?ALALQ1F9Ll@>JE!Jxm~zMmxt7SGyszGL zY#xUxhkTH`TI5jP^*i!;9Ht!dL2gClP~KHn9+Jml${`=*R$ZuZL3!_g-xKmUOgZF( zTtVbe-X+@~mB(SqAs^(niX6&&-D@A1$6?ALALN!r4&}Xk$;;y~<&Y0@J4FuVt^DLC zlQ>K{^))`xtMTlHG$eegiyX>hJb&`znfxcNS{;%@ zKFGC24&|}jcW*l_|CxV%PDl>xql> zp1<C5%IE|B zkPmW)i5$vf{lvYQa>xg{ipZfnuJ4v_ear8=s1Nxdcd^K!ysJO`%>4Q1o!2FYe2{C4 z9Ln2q-F1_HynE~9&sJ7KxF8?o?iM+e_j4L^Y5mewAM!zN{KXnil*hQ-^rgR7ecr?c z`5?DW?6_G=EN>0WW zQx5qccd^K!JeK1&M%#&ekZX$^%7dJ4Z_rNUgWTOBhw_l0_1kPG@<9P&Y~AaW@0>t8!T+0#)TkPmWOMGobC z=z|maFMi?qG>?V(Lq5nYiyX@P<|JS|twUgXljss8RgWO>vhw?uAndkC2G5Pbm?h5r=bsG37V<%EMdVQ4o8R=N z$(z6W)yZqFzBfhkwbYrws3t>yC3-=celu)Jhr7TfA_n)>?-7g-1s@t|3seb@JZr+ z@{aGG5yA!eAh%BBP#)VxtfSF&GV(#LC2}b5SHGw!efjbij|uUIe2}|Zuz91juaxazsC-RKpt6up^virS|z91ju4ih<)$N2NUViXtTgIq=AP#)K()-I88 z7x^G}vB;r3UrtB-@e}zV*A_XHr`N09>ucnL+}$FF@*o#oXCWWt#>Fp!@`84T*JsEF zxpg9k@`AN>SPuCh*Ah9D7jPbyLq5n|EpjMNV5A@{hkTG*5jm7cd#y@OP%rch`5=e# zQ6A1A_xzJQZyh;|a(ApK|I!(hA?8tFUo0AV{z*sH=H|-N&1!AlJ2-kZ-FYsBzpNtu zR)p3q=~(9+DkJm6&yAy9r&2r)@7x3R_drfK!t-vv5Ah@Cs|l01{7H>D;fNy_*O$G8 zO1WN6$}?>G{irSD58HGj`z1&H8RQ;EU3ahYa?ktzti@?k%73 zyS}5^y-GrEXK##oJi=k#1=93*WnKy5(QDCj&S|EZ@#r;_8qL!ypUS%=k{r?zO5;mr z8pYLzLe4ixT_WiR>E)T18%25c@YEo<*Db2wcZ9S1P?l&tI7jF=C{-kP-J3$s8>A}C z2`3`J^FoWRVmzgn2gmkL9%oKE{_tX>SznxP7OOK0_1Z!svDm&B+A@A4gg|s`K>Lud zSNo1Q=C~8qpG|9m6RB<`ec}^$-}j5$GoQ9D`|G}M+%H1DCysLnzNs5^eR7}Iwg%*ELN3H6 z-#wj&?+-DfZautvc=(QAz|$~9DOKRquYM609RqkYKNt9`VF zIHVP53>;CpEOhu$0F_Al|d%!_Z3>lEB0AM}rCWoQ?!A4!eo`v`2L zrTi1a=R1t^9h@(6j_c|gU)NkN;e3a2uF@js>N?tm`4o83IB}1BlEx8k7qOC~ z{-JFqd3XIDig!NO8W8;DcM0gd4sDt0d)dR|wKekdc#Av~)fOz3$g;@K*I9;3)}fB` zb&cg7YHyiOFh6mdF_vq7S*H8*!WSJ^TIfz5IA!OV`-Jv-R{dZ78y$Z$a7n`nU|xty zGk;@*3)*)C#r3*%EKhm)pwC&6_*6dkkNe!}d7Nh|KXxwXxt{irrzF2l=Tx0%DL->v3s&f}?i8Mo`{1h^jMl$>HuR*W*8tW-vV?9J3 zPG@<}%Y8xj2OUyX9v=^&gJmH{QI*bR^M}jgIG4fsI6unbH0&vI9+Zi32J2UhGyJZn zd*Xw2Otda;SAi07{cvh9W5gf67tj0IO&sd@o(dDhc|1b=p?>^lH}U(VkbcSu+IP|V zzMh{BBET3E+s`Q{oKmaL&DdriDBlA>=s;3-nd{RhuEF7{eL$95%8!M_FPoxo_Z+U1 z#wc8pzGr6AXjT6Eho2{YTpI- z%d?0$wC57x5$!^~xhegf;@lDO-z`?XXY7Q<=E7nVGJ}LaKkw~_9!VM$;H=9UxL20H zuC_5=Hb~_v@7s>_JU$*sNBf9@#S;X6^xjA3ad4JZ_d89kBN+Fa8F#^TyWpOL@7l%s zY-xIkULx&EE05dT%R7o#+QZAe?kB2WaF1A9o8DM%YUYq{R|$vhkL$MSeH5Q(={MjR z_<(<$zo<61xM_Hry|nUZ$6nslZpAb1d(iOWa{`{vqCSjq6XPh#!}yvzO2*NGgnu6n zk0?!V+)%GA&JVd1nfmj6AG#kg7mTArmYDyB8b{B=4OoY~zPJa*(fuOhsNjnJl{-3q zo}wpIYQz21wFV%qJYd`t{p;1yadfyETD#~w1$Mq9=wH0{$9=wA=1Z)7IplS%Ki&%e zzCNJ8iJpLmwY2t}-_We!e9$nhd{Cc^x7DaV96eVn4ZfsW-bM9c)yu;AfcyLx(FcvE z*f)=F9^>nS@DF_e?$L2V{{jK74j!hJ4{9vv`FBM6(B4J$VckE4^#S)8)(7?jol84F z=br29gUq{8eF*T^u_0$qznHZ0D2UhHorloA$ZoRk#(fVOUVLt#4~LO3*6;5KjSoSo zSg-l(GpxtNF56SGvffNl9Qz~tQk;tH`mk-Jcg(vk#U>oPmTW?*q;=aVYTxCt3GIv( zro>~{9$TF+uWfFdOJOu56#gLGe8Tm?lX+a8niAaddyZ=i`Ft-`Sj6t0dd$(-<3wGY zSIfukVd-2_K1BYi!@^U)qV@|AvL5nc1?LZ?n~l5QwWUo9bJh6`!`}RTl%VosOA)-T zr{{v`?*dhr`?21)`a6o#f9ub2haXjIHpXb#RNFXejeYQl^p&2&BEP*p^j<0J8V>(f zv4^U|K|t_}@FRW87{C1Wf&Yo>Vm-K+#F74FD;}bK2KQuy!F}NV{6=<1Am{A}uCIQY!jrJj5 zulD`_dbX7P9^mWV=l)at9xFO5JXZVB5kfCU72fCJ z;gVLZjrcvJJ=m{nNxLAGJ687RZqVP+Lpnl?O2fK7K5_m(zA(=3fpSq#zi_Og{T?sv zm$B>mJ>>Uz)>&b{hu{kPD|dYSeqCC>MOt~lwY&K}hV73#mje4s`L~2upXcj!KSI9( zzG?jyY30!l=l1{-y~9=KMR*ooeV%2!jP~oJs*Qy?a%65Q&kw$-Nli*CkGtB#yPnoP zdw8vLqx-EdqA#lq?jl&(RrlA<4|wM1%5b0WqBT(5y0L4YP4obI0sM2KFE~HBQk~v7 zUv3Qh?Vz;sXa}u~m0sjVwC|eRH-26V>ig@AU3@{H7wnh8efHXSJ&P0u>np6caQ9dj z<~}d;!}~5%&%@`I!{Leb>il$dVXizgcEsAFj)u5(`1(VSSsn3@HfCmnQf&*m?6KNE z`Z*HV(|@|pMjHOng>0WQnT)Kr1XuLK+>P<;*&|Ag^4M@LNOkjR<$>U+{iEZ%Xg}Qf zif})~eZoH)-IHMZTCK~3e_tQk((go1z{A?b^^G)-9;KB>J80inkIQq>`C9o$k1h>3 zX%}`;eOUFXus+~EF)lwO0F+{ezg+nD_2EmR50P;q;B)Mx(oA)6(D^#8Jet3UH?{XD z*Kd_wR3Fy00)6218}2i_ep}-G?#bYHblXSxc@tt5-Ls{P98f_x0gs(Ff5J@L=$H_^xN@^JH&>m;`JiE1`Jleh>ch$| zst@a47uE;dXJ35~{(XJ;mgs}%33yn$P@Z0#D-Hcy#`qxo`}%N;=!579cmSVcCs&8sC{8Pnc8ppd#&=PD*m+S{A8?-$eGpg;eGvYA zeb_1bAbJ8GPO2?#sHE5*PAiXgj9MQGyQn^_dSh50aGw!<=pG-0e_tPN6MYap0T2En za>yk_T6wf%)cR1_MfG9bo5K2l`;6#=z-o*S!oRN%-xYljJpm5}pJON0nkDrPT3oaU z)5-@`jCMWQ+C}x@;x~u&0r%NgAB2BjAMOx+5Iq48Yb)jQJWhrP)5-@`j#eL*cTs)V z`IfLg;6D56gYfU`!=0iJq9@=%@j2{bk_t&Hk9LfDzG&~F`mpM4VST`TM)aY3{UH4N z`tU>12hkJoaO7OMRG%K^n{~Q`wDM@jsP$oG7uAP#{~Xo_+-F1|1Xg4HApHCK@MF;j z(G&3C^GU0RVJwZb@@U7X^&z+aF1r74aabR4pQb)sbi?oDUAl%o2>-r5{6zFY^aMN% z<+Ok>g=yu3qGbIrqUVvucTs)Vxjn28xKHQ<<9W&UYh=DS=P2KQA^iLLup;^(dIBC! zu9xN;o2rcl|F*>tpS1Epm7`rx7Ism6SoQX>KHxr~4~fq~2>-r5{7m#g^aMPZd=4{Z zq?JcIMm=9tc2Rv;_l~eW;6D56gYfU`!(E~eq9@?tc`3#QE+efx+A;FyA9hiFxcJhr zKD6XM@%#hu)SxjIjua}G4k)h?4tUx?pJ|6sPDnZeTJW- z1gbIbn-M+m_2NCE7osna4E7O*V>qom+A(Uq$US@)-G}&fSTAs&)_Ng&;Ohmx_agcN zK29#pZy53`bE=56@@U7X^Lw+ z`n|crE~*!+ei!HkuPbn$SXThguJ2LG_u!)XfcyxD`cfQ(DNHMmqTKt+fJEmx&Hd=J3Dsl==|%y{%hycpZ;{`V;}oi=l$=0f9LIQe|zUu zuXUOMOzkcb9U;JX{OJDkuIynA?FMOf%`Okk|wT0X9 z$xnW=!zWL2>cE0`XZ>!^5-}+XE&%g1FZ*)d|(?JDGRZVR`A+s18R9KQ0E zuP845{onsx>E+c|U){OliYq#oU3OXL!V53#%+Ag#4A6%C_S>&#zc}>JL#Mdj?|%2Y zp~Gwk+Q3|}ey~2Y+ijnRtFF3A^$Esc%a$#wKOB4P3lt8|dCqfo^ul0nZf=R|zT=KN z{NsDy`(B3+PUp5U7TgBL$>aeTaKHS>M?TWI^wLW^uXx2PI%l1Ama6*&FL;6Cp_eZ5 zeRAF3|Ni$w2d9~BU@ll6zyo8zy2yHP?X}l-KK}8KcP_vD^3LmD|N73xjT;pQTtD;B zOAojXuKUhA@9a7_9c_qW06qA(fBQGpA3yPlPxu@xE-tFR*suO)KJ%GVe4kwR4}S22 z*aK}~9vB1GMb-oK1?J$o>#kGd0r$o2+qZXK`qGznUi6|Db^iYE|GvX*c=ofO9jgOe zKbMcXfB3^6cKG8r2Wq`ObH$vFMC5&gdL- z%rUAB&wAFgtnVN9K1ltngQ%b91nvW;pMHAZ`Wchu<>eiWG49{QpX0#4*ZrII^ZlQH z{`s9#Pd&9$C=}HFKj8^aSc=2ntUuZYKIen6=ROeSKZ-w(gFFT>|4U0tYCc5$y~e;= zt+oUmK%E?N8rRLbhjGXp15Ewn^#SYOhd%TnrT^QuZBzZ9>u3E>x_6|51JrBQjsDO5 z&m4!N{g2lKR8Hs3Z+>%!?nzRoO$M%ouiLF zT5*p$`h~Qn+JU-F+)+2~oyT7jd+vMSp4S09_AutpfBy6P;vQ`i^ME#(xP$lTz4Mxk z*C9Orz4yKERbzjtR8sd&Yr%7)<=dR24d$4Kxz8MTc?}ZPyM=`XHQ!83Obk^w+V_DE zd|(H+gE2@N^Dysy^rIi`aG&Qfm&ZJmkv8P9nbuW1NT+u2n9uV*>m08;c+O+odCq;; zyWXY7o5Kz}EY&^tYA>%%XKac-zr!zJFp!>}omn8RIg2si{B0@))_ z_?dprWaTa$sv7Af*Z1+df6kKMeVz1K^*_e@!C91!`0>*o_nv}w?-H( zVclKdQSbX*^-ucwsOWXa^j2si{B0uBL(fJ49`;1Kw0LxA@Mcs~XE5+~B0u(>b5*IRTQ`x!eaZeH(qzdzlJ za`fDX=~qJU>)gI|lm+`ow@{qhw=DZfkX}1iYmOa^v*AP3hw@Qh?!WZD722WdJ7oBJ zAc^`=KI*GTeQ1ZOZ#ATb4^bb=M}2Ln5A9I(J$?9kAc^`=KI$8neL%EB)psbQh7VC6 z%13=IsSoW?^*v+wdLW7VP(JEgk^0aMRo^oqHGGKrP(JEIiD-waj~}c}`8n$N!wn8 zzQE?v+@ch{`b=-3UY@S1Hx>Bh>kQSIV$gQKi-v%60uV zwkC;ci9@JnDzVxuZz|Tyvt{~*>~y)v#RlnfwdvBFPV3HEC08LKAVuh`I&FfXUMMvy zo?mf8Lr#^dYxLr24Z?(9H37!Co7Hl|o2XQ&!S(6Nwqm_jBM=(&Yfz;P)Ux{Ge6vbT zM!Bgm(*P4cRCsl|HeaMnR8DDbT7u#t-9xRoI6qS>E-W@GNG{D1nMQJheo%>C zSW#SD(!ZZk?N+~-R4cy>eUTg(Zs^GVs)NwjW|(FzREyko2Sz3B8r!ykxYv2gSh2%qQ1g^SbI5~uJE_1s4ozmbfcRVIFZz0 zx~U=?78aYN|BLmq%3M30x|HrI4Oa3Eq+BFbZx(0ktg_^{me_P{u2$#V^vlcTV$=Ug zD-kYkUSIPj)|Z;o6@q=9(A9C(2}$!T@cldbx_x3rI){RdjQ;yhZgyb+*2= zu^gN=W_6yjgzKmEd1;yl3;Nb+ab}S^){7TQO>h1B8nv@g-oU@cMh(#Cb;5)w4H6b= z4dysVkb*)ofI|zD3n0 zb#;PU>rG5os&g|`Bz>>G>@_5u*u+rK#YO6_n-CV8TRojpY*6nhhfa!Hx1GaWNd{`` zd}B_HR7NVbSS1z9i*sd7ZEc#bH>&59Iiz$B7)~A$DF5MGs|`-#===t%lp>pIGgLWg z9m7cZI4e+<(;50lt=h4dHa>JoeRQXKBpkx~8{H)63|M z1kz8M5gQ);u26Mzxv1wyf~+=2qmVaI-KfSn3TZ4WZSqQ+8{YgPp-vYmRK1o6&|zt- z3PpCdT%K7^10PT8o6B=FcWzqX8J@#3)yR#VFV9g#=`#JAiZ{(CgnvWN(+v`>Z=|si zt<$G81gjZKjY>r|LU}q)BNX?_GLIWHq16`aJhao$$+HD@M6baw!>bS~YFgJ9RG$l? zhtM3uL+UYVWY+WeGfB(K8)$@9h&O0BFRPJ@RA^&S$?JSHs&77on!sSv>yt_|4Nncd zb3}rt`Ud|gDyB<|&01rgCY0&YbfsM6elSNXBQEG*o*pK+y%W`inlZv03COf&D6B|9 zcqXD{NO|i*iHB%jx>V<9X`#e3TZ5qS%KT?Njp;MAvQi=G9*rKg^6YGNx~fJ+r8nH& zsgKQVE7t1tl#)kW%~hL=)O>oa1CNfhhNEAlqoso+Xw~A?)FSju-Lp4)us3@MuaiiR znzX!|;YHVa9+{~W9wzi0uA-96%1PYo3vx1{7neNoQ+MLlac@?0lWLJC4VWn}(6~sY zRq2NGI*gUEs6-}c(pKF@CQBNX)G)|+^01|cKGhV)|8(NJI-?k-p@^qQqD(EEgddM) z#SP_VDCWX-U7|PAE4#qJ(A{p4(49%$5e9$WaUITDLbf=>TpV!L^WtwF5%%hY` zA*oyDgL<&K!3Jfe9$h5hXJj>W2u~7vXj9ec^}%XVVO|=k0ZH{%6;s6#1ay;1&vg`w zJhcL#X?RAjiKtw|IFXeT(@MRgrplx{;89P_sY->ti6+gkguwhK`+_ic~PF^^k&) z(r9foPg6^S20F3`*gT-#%`yiuFg#nTM(MSis)XrP5p^HM#ReHJI!fJ|S88-#+FEWD zX>n0iBlmge;}WqRd~;E1lOC64KP&h}DENnor0^o8@7cmh-%tBQ4fq#wFDYR@0Kd zPK!F~V(ZCPy^S=SZH-d3&RY&eeH-emv^8=@B03*kDQ(s=WJ)(`jGbB$ zP_t*IWzck8JH?fhf$7~)_OX`J7 zYLTeNe;V4^7@Y&Z`VuBhb#`{O$qP6YCj>}2f@nyL@R_M?;spz_pz=rx4T5?SR*Aae zxy`i5e4fm>|w8isUkadS~O-dkT+0|#$X(H2O9hHNFznn>M9 z-wag3p-bl*XmI3plNoJr+g05;IGgo7?_}~8QFM}6g`nCa0CrjiJ2-56ExLTxAK~s3`kmMlSw?! zBi`m}lQu>q3Czm5=!%?i6k;WNXYR?o)n|M=-R`4nm@$R zz)Fa0E2;vimuy-fyB>*(0%@tThstbNU|5=-b z@)fI_)-TTT0$-~T?+;OvrL`&tk*7A3WX-}$HX3GNuF?t$N~Km9UTwYBV5RCj7AnP3 zjZj^exe^|Az?)PwrZ#CHA+@9qsw8NKkJdgsV(LD?`d_2ExShQHr=yQ6AjQs^zNua;zQK#e}-CND}zGv?Lmjjd<3 z>Y#-#Z7}HVKW&t$dt_MAEodD^wh~g-v(mA4m1j2a0+7tS(gtk~viV3B94|I##{`9{ zNh6%5S0}n%_03AyBg>vTPK6g#rli`v>Pip;OkI>t#v3fEq=w${s%{LnFI7I?#ik{T zS}plEVV3MCLS4gIrA`{NXv^A^(8Rt^8q!5!d)~Er2{XXk!GuwPE#JFQNQhusi=4#z9BLwIl^F|Kp z1vHg6i@FDqN2N|Gi@CmNpe-95G>A}_sZ)0^N;lucOXg4;cvmNs0-eQ}s+VS}PluDJ zHH})m7*1TAC+$01>oZ1N8d1ps;xCZa&n?!AWIofj83tvQq(&>AvB=ivS&|lDev}7Y z8b?TJ)apb|XUHQ!6CLkMoT+CkH97|wRjZK}$~}Qmh88JJA{mPbe~j_d&5kx*;zb5o z#B>L`XT@BVVT3IyzlVyT8pb?wNO+scdLZ|MZ%?T++F3e>-GL2amdq_Ouf*BFsOX&p zwgOLo`a#d4ZJ5aP%Htu;p^QC6n-%hYu)#|k33N|oGJ1F)je5iun%{~g+V=LyEu}(c zQ0=g)Eg8KFDSMI9!N}MocM{u5Jh)7kXK1lDC+iuSGWjw!dsgjFBU02`g38X4MX73# zERaczjIP==>6ge?rU%;8p8kW%X*UGLqhG{0fgQS0o;D$bH$WWn=K{epuO9=w7K>*ojqwr#dhkD-oL z=WfD|2kIA`NRv^CQ{+@_GvY+GE7)4$?0NdHal3 zqO^@vr@aHc=utM5-sz+(G)(X!NJYr8P^r#Ri7MFUoqBX}rZ&qM&?azgmf-TprN?O= zAM0tmf{jI5xoP=X(iQ4^^)m6GRE(F#8)~GFM^Yi)k(;Z$R^ooDc2a29mPd3Nm=~wn z#vnVNjQTotHDz$q)vZO2tBB5}qbip&e97(0yOEp8I$x+$RJr=qmbh|LaZGNSva6QR zhO{<#C7sWykQq6p=|^ox7TI2;(OAjwA6>r3(b;;HHt_sTA@&^B@UkqxDYaW0vNVkF zfKJPK7H8{}N+7?Bp2!*%YCbLL`N0H<(n^DR9}Np)A1m!srn;`8D7zLIm9Y4sZ7cHH zVimkuZELEzOATE-7Cn>q{{>~g1)FPRxD}_%WY}xv;N{7Q<@(XeH>;P?RF&G>BQP}{ zq+8Ub*p;IvYN<`JCUM2F#DzqhsT-yHrM^S^tTbGZqVe6(&NprPQb3z@v$Hg6l9K8r zXTxtcj}G*Zg}ytjH#GI|j6;LSCWQ&dSxb=4ar2s_D+Ej-ouJCpQ8j+)eHf)=T#(pz zahGUsg3S?TST|2+(!(GZg9iD+W~;bx{{nJ`63yJS8AxiymC*`_;3LkeWF}INoFhGl zruh+H-RLs1^7cAy<|xg=ct>1NqArDY?G^|(HhqmKS(oZb7a@Skqn6-?Xjeag*jP+YU#^3qUA=s54^OMW9k#Avx9 zT}AmhLl0rFo2agafBL(L*K0HhO>g8ecT0tqq8wSjg=*u7Hg7rB+zZ)qXNuVI zSEQX$nxNRZq)zKboSp&k)7Kku$-kBE+}p-~rfYPoe7CiYQXy@=k`qE#uAbp&cw1Jjfd5Py$L^l zh!I~+3b0DiC*f5}nS2MldCPn1+LJ;y8!Z{hsHT;P z#7M=+xe{94&;p`f-O9@lUd^+=ne(5ZT(T2vX0Qj6JdbchdWHqVzH#LxAzam?UFw7$ z&6%U0q9?7SFkBg@Xd{Pu4)tQ$W}>A47F?u#RGF-($!}ks=ZR(OIcs?qKaTZbTM%8p zI7gjW{Z;dNC_Oy*;rKxhkch910-*dhFo2@N^g^GsVuTGbY6TWGbY^+fG!Dc_7& zrd>kqnN)5%T+vV9=*2hBxU_gA8&*GJv$&vg(Y&nJu4=2OR;TSb?N6?5UPr!y&8PC8 z)5s&Vj*e65IE`yRmJL{*mtQz z7|na3xH|297kE9MmzUQqLnazlH${ikcG59=p}m4C69)VH#j<60J@DVhS}<$@`FRZMK&KA!^Vp_;2mXub{o&TO?#eIur5z-#2>85X z?o>Zpj&%(yd)P_7;K%FfPgwZ7jL$0Sx}=s?AG5{lbMXdAu?n`g!l2JWD543c(=uHU z1rO!mg2{=$Eti`8CvoCYUdWw5*;;<#Qy4VU)DMr z47NoqIg~`pLlU-m>p*`Y_4X~~woKZn)Qf*{6SXH+S?Q!fexoL-G(@xq!T|o7$y$r% zlK~G(Mu)SFEMT*?vO{>TBQDiXFI5bs2a!Z4Wb_wyZ{dl?S{Aqb(a5f0WrA4w(Z=Rc zCg@{BX8ptH`*)*$mq_d{X*ia)5A}-rQCm?|ALN(!0{dOi`|*3RelLI+vf&lH&uhM2 z6ngVZGKOeXWCUFMq_AzLu0nA`bQrHh1XlcK|yscksDVa=qHfVL3 z8Ei%c&Y%d9abtsZ-o|bDBc_>7!PixXf>|UTWiq={w!T4DA#12W{kc3Z!!kWs-3A$8 z1H8D;Xf2`s*jp(1N<>6^M~_k=2AZPUQGc@C(WgiZ`@{mWewhR3{`y(ihW%5sW^}OvlCqt;~)5UGrb8@I*cPFNkmJF{1U^C>p~w#EdszacAGZ7QTzb z=hMp;SY#DzT=Y`VmL&~Fpj8ykaN%Hs&5>zS#JzW07OEtY!QlpB!dYia zwwlKL#{E#PAij^ro$i1>Y>bfSsb~^kgV`rHPC&)+*E6t^LX0d` zHwo$TdqbYWT&2?p8WRC)E>(!%nKa|%APK1w&4H?AwT#ta2ao-}Wog3P$;iQJNWDGU zrwY;!%qY*&)}-5cgvowpaxXt6k9Hf9G^l51?@0C;#kF?0Oms`q;khf4Vr^ig*QC#V zzL0p7IzpDQs&7gj*}G{oVD9W_TR#*rh0?JMIx-lV8#sp`ZQRWm)aP+&zM4o{+Og~t zy}$uVn?X;&g0?nd&wqvZGo2-2MC~aH3UD)`R^c_4i#o4gZCQIVV3F{SXF>t!ue93w z)y7p>-L0t)YXC_jW}O8M^MZOKYB{p~AejnH(1~f(EY_|1wV9U^p%>M<&@DiCk|j8y)+jkD5OzjyqBH4}Tm=a#wJ>7G zh2QiZnE7sQFF`WF8DRV-;SbYd@Kz|WL<#R)U~8IPWBSfoepWvg0|tU=s>Y`>g~cNN$XJ2W}`z^Z1xreN{6e{I-|UW;&2uJ zF}Rc|2x&kA^*t<(&9`PNTiue%GWaG%&T1=$+E^6#DS^qaGfA$is!DNjsP|O!Bzz zuvEuSl0y%h%jnrV*xF*X3LY6~O zfZP0l4zq8FNpAY3Csc1ICE zXm)3F7(!9>3#9E{6k1D0aCX}5ClDajpmn?b#^3s4^Ufk#-MMW1n z^tT?b$j)TY=7~$UIK35mzU9+sVqCZ&DS;@#-bTdWxPXLd_hd2_EzWaTi+WT|Q0>%y zber{%lx+&T$;czTz-DVJg(a482#m-s_MuWBvne{maDuMn+T>J}_)cakb#i$d;zFD6 z+5xr8*i_rQ(7zfkJFuqNEk0{7p6HjFIR%JjuWO7S)3L}XTBg=?X((HpOSnipM#0tJ z<5{B@epx+hsLaBvUWUk*#kOAKNQ%mw81elRBYv-OxOsc_f2e4SQDUim?_zQVpqr``N^Z^-9o9}5* z5taA8z%&P>XcYS=BN&zkR%VyJ(u&@4^ab)!R3gcshcnJwpN$QabjMo~qDjK_Un?f|$KXO0CCp<7RHG= z<_gP?H78zHAsw_BC2-JmTtFNvKM*FgM9i6!HLS)~BY6|I+U7bE?E35xbF@1in0@!( z1v~OS2$~fq=2e=kijq9k3P@hkIif;HD5eUmfIjW-BVa^A19O)AL=QE)hnYD+ zCy*{C(fcg3R_Tf6KJtt(s1K z1RZ#t5imw#WfZ!DVhkSvY!b8lEm*Lej`7-%*hti7rdU6(ydtV7%fsmUX(^-ZsxADK zIZh%ACZvO_<}Q|vXK?U5GYGXxmdvC#;@n__QldSc)oKMaO~r$3I=lJ4cCZ);lKN!z zIzN1)VqGiWyT_o)Fd1_oXK{16wVNg5cgTFzVr>$A(J1!4==z4d2NdG&fx-w9W3FOU zW)!QG_B8#vZ6(Sn)q~h$HOGILiu~92ye2&uN7-2H#{gHSt|1+f(xDkbgk}YeU_(S< zd8o7@15L{c2PMGB!Ctx2zAD)-U~XF2-ND8}?|>YN0f|#`BnV;rrKD2Kipc*w92Oso zw|aos(6#)|P$9S)VoYP#5WaxCi6p(WR(0VqK7JL<#zk$@7=1%-=*M{Ywxt<0W0S6` zRfgNGi#*C#7_yVH`tY)og%W0))7{yY8%@L4(kn7UkvG}YR&tXN3$rVHX}NiHdRzN@ zRErbSbdWhMfcy&8Yb1muE&lWTYWsJ6i7Y94j-0hm>pN8Ip#{&IRAf>}<0lin$DcX> znbV*o@13|Qv>xZ!c+Rh;Rs_k6~RnWXEY$+q?}-fh+}tx_$ZmSq4G`b5@CrSNAe2jR4-YRuq0y1F+;XNG$=p}2y% zl61B@0{Q>=7$k)Dq>?sYGd8EzI~ug0n73B zrbYh_`-wjU`X)jvn1~)qY+Tcv7WOgBVTED*W3VP#R6nEo#7b)Z7}|;@)i;GY*-b{@ z(M|{K0#H8wxLU2vihaZt46x&`c%noTXY|^AV}u8@JY-=O(Mi9jfb+BX2XNnu=XhL5gC5O?p}l(YOFR-BcKy*(SBRGEN((pm3|M+woJn@ z+C~CZ(uWvEqv~NsI+8<~gPXl1)(syBVf`M<8K}jMqJsN@P%!(lE2RFDi_IH3Bd^6;4Z@8heB$ zgX~<~+rb)QZ|5k?k}Wh?gXN-PxnQUReK3n4n!F&x&8SwQ*9-Wog>X_5GEb5V<^yB2 zx_yZ)Ffy|xsP%{b5Q{6j%QA;!2it{gfOyl-&NETxUScu=l8VTDp9ma%W;kkW;YJ&Qft#xj{ScuvcGa7fi3Rwt`0;YI(q1eSTIjp z-Q6c*<~q`oEbkue$eT%9f@_Td#=+n_G|8G@vYQ(4D^Y7?Jq2awfPH#Nvq|)UP;n2s zRS-Bl(>7GLBM#9!GO!zL$L2%^_y98-VQOx+h}*nxMJ<`aY{bpm>&0tuvK*438%2E36*ORbW=rf>iKfZlT32vGkM>NEn6RtV;|$%6r#di@v!}vEW_K>Udg7TZEwT z#>>(15fJWZ7HBhEClHAD79#nSw9YcuEf&5c_E2kD*3hut;~JpXPc?w(@V~jT^C(RQk;1KFu#cmH^qU-FQRr48-2 z4%3C^&0LUZ_;J7WjzU?Nv=fdBST=)@$1gQNhSbnUwHrqM_!B~E+&s5_vaeP`^8#` zo?bp!65+m;!B*lCj%J4F8}jz-BWwOu^BOSG6Z$d^AIRPO!flh#os|r(a5X2-&%XAO za4o+V78d)|QlDBjCVmZ}rz-d_UzqeVyFqPzei85|9CY?0chfsl#Ne|@OBl;)UvwCk z4Tz-`gs0HM!-(=7?F60}79t8^T-=&X_Qb`oXm=T86j&nW{3ft8a_TPmkm;n@CRzLJ zJ-Jfsrv4;`RSKBcE$!8j{A;m~a?;WEGF+97a+C$52-P#Oz?4G%lB`86BWtIkPPdo$ z$w*QfCseFep?qY{uNRc|Opy{Q>F^1BV(b2!hP86Vo>s0kQqc)f(n^~RJ!xmo1+0wa z)X6%|uY6`2AHqh?sxT56Nom@09f3koOHSSME?_4Xc0bM-Vqe@)E>7?$&J0-0;o? zWSE&P78ntK37M_@T0~k}ng$=xKK%&REKf%uk$@&h6y?xK38wlql%8bN5@bkR4a38t z?XyXmuF@i|Y&oz7oaGJC#-}`hF5^nIM&_Eksz?#$Y!N3>*TNalbE2rk;oSvd!#%V} z#@cW8)X*8`XJzfB9W1RxQtq7?^n-?@f}$pfkpgkSRvbK*Xo}mKQLY83iYSPzvN|@4 z=?GR26^`V=(xSK;Yd?qz;*2~dTDs~*rd&!IiI-KUctoZ`!uMn`_Sv#b=<{A0!IO1E zY^WIY+WQ9r!T!hn4Xt>@%$1(6NrPGqB*msj`iC0BtF!eY)#pL#<4-39vb~J%&e-1r z)npUB6C7g(NdS)FFVq-+m%tE5ATx`A1(3ZM8WSKW8V(+;TkeS-n{9LhQC&HX^6Sso zWZC8_MS=H^dd#{gAFrrGmb_9$5!6&qW+mbh>v6M;n0 z0k|m0V9xFPNid8IOoa$~KpYt>7SwH+FwJ9WKJ|;&lf41uGpXsWke3#_iF?Pw0LsVv zT>?GJItA-d|FyOYQJg}qK8ln_4OU8h=Yz#ikZoGkY~wF_G@=RCf+AU~2oo~7_4@ly zAU1)^rl!`!$?l2Jmg$0ntsMihP!(Uj=LAx9z92D^)?uNdvfJ)F$+Mlpr7LbYgab=gjwabeROj&TCUz)ggzq&9nR0L=)T@RY(ll-bZC zU+SJUnUUG%sjnp?jjj#J6}Z{LtY%Hs;IpfbuFA-WSIVy@k_=ZuEa*Mp3E>X$HSBHw zkbp>7&h{=&9K&5Dq9hYFU+aiuVnUb?lK9#asY;#hrQjO>CF~(tJi}uoS!7R>+Xs7^ zU9Si%tuPaV_?!wmN4k49IE}&c<^*w-pwwE(h!ljqP|C&qBpo3nO@YIiYa`}+$}%Fg zHDiT?BR9e{84IBes7-kzDh>5Y`mxt>S^g~Ax1kuU@^y)eQM$wEDj;~TjA7Ii$h-HF zB924+P3*4Jn=FfXEwMR~bj@#ovk->@BoqoJSqVftfFuf|&>}H@;krfS6|D!U7j=>S zMzL0BC}bdC?k|zCR#zDW2~|B7AvMPqB9KQ&zSQ*bGNYrR{l{s!N&JrIya;Xv#J5KgLNg zV~XQZaK4H1S)7$w232E~tNWES0XVyIw52A%!bg}!4|kJQ1?;<1!OtMAPf=g6a-Jf#eZb+Bk)wH?3tO_d zkzJQEWnK1u$1xK@*iOI-b@N&%lp7xr&m6qj9-$Aw+qx;gGZn}1e(wpf;oZ0pYN^PA zQ7fY`aLf?MGGk`_E*R!OLjzM9{E8glvCM_ES=sQ?;oCB#AaQKb80lR?La4b}A~B&q z%ug^6IHcKtNX##*;*nH~Jq6y8eZQIajF-ox+#~^a# z6{fa5G5cAEbKBz46yz~jL8BB8$$Y!mP=L)Uf&581$*);HBiuO84yvwnO>y;xZEIE*1n4KjLXZayr(7QUX-@hUg8TWtGQQA0s12jC*#p&DiSV@I5nTC)_;Bpv9AYA(Fp7$WyDi-m;GYRbfCq0lkC!%n*G)UWSS+Ed?4- z_=P=$9y{>S86^lQ^VKzInas)flT#ihR9X!NTM>?W6|cz4W(px($T)~*#$y3}D0W$* z$o$C&Ws0V7sC*p%XRNb28h)0IPQ~-Gqy-yn^kz)R5HoOZ3g<9^HJ+~F6>a^6bPVzr z?Ey&PP1c){EkRLPo%J#)>hybl+t>z1GXff3`kl|o*LR;8Z?8)2SSd?>9~F^g5s|(j zFR4E0$wMxhb=~WA^k8R2O!~3~@sPer3H$19%5afJ5>QfvEW1+U zHdP_)ytMIXRvn#O35Xs(0wQPF1Y5$W^KoSctBJowT)_Mip-b}>_}|znOA^#8Mar!1 zmd1pqYw%2{N}*?*2K9iNuNMflzy{+3G9+l0{@xqYP*ZbG(T}P@;+3Rjnb|(<2wvzn zL4EG`Alvtm@ey}>p?;CTIDe^rUzU3RP=Ah!m~1u}ELqVITIRggc76rfV{8QRZ!@-W zly?tW^~@7)*adVu^O@fIi&Z5PAWbY%%c*6T*AJ+ywKWK8yk6C^{e%*Vsb*yFW?IEk zIG7{Qno5G9O`>8tI0LT5Fefx6f~_3RgqH=)pcZ28Mbn~HMx1)Q+!TrePjXW`l08Hg z3VDp1CfnPdJy@;m*JOlo=?kC?`!vfRYS;=RZSXqKVr2uvE9CQzMrjc@+5*JFJ-*Rk zAU)tOW+@6UC?O=9ei9Kj@L3hnsR|rpm~PF(RgHzNoj&cP=4_!IS|*hW$%2IHR8QbeNwi^e6K|%7@sCJ7+Qxh5}g3^a*J-`F-+Zc8944L{U9FK=RGBQyV?CFb} zORFnjQ7WokC$#IwI$dCJd<*nVt`{9BW{%zSB)e+%%`4!%KC}H)RA?(oSN4`mrvj&Kr>BuXlxcV1`(K1Bc6g> zG!fL}U@1pJcd(-~jgA#RLh1@bmJr)zQ8t0C6CeeowRD6SN(8h6Yk1Rdph3=@>41Em z1r$<4A+bmMfj^jNLtC&0&0)PyyPO`y1QhG8)dkOvTtg`+7t9A>77*&df+9l{y!ffzj-4j8O3v zQpC`w=#f49E#D4;9qzI^L8C3&tO9B~t=Wf6Ba#Yfm6z> zTcFogMKUnv5}!u_>o$;n8F!)+(lLj2b6(_(KNi+XJ7sDRsc{6UzOKk4fXZ>(rjaW? ztJgxJ-eK;P40H^^)+eDM?)&WLKI`gz?s^OVAY`VV$vAmlB#=|r5sZl`3`8kG%o)64 zt#60F9-0fb&bv%P%oy;!yuZ46SidqLQT{2L!LC)BbHmoZwB%;>RFdo%9vP;~4J(~8 zb6;l_EX&L`Y~*cRJMU>m2|v!`H=Vbmg4~H$@3Hb_T+;G$C4^?A6TWHQYCR$F2C!2S zDz2(|duvTy8RsvX2*KUqhJw_%)N*v*tMm=s^3L8pHj4~XWi(PGf2A~t!o$oKR@gH2 zioh8I??O!y{*W2sI8D=v6KK_xR`kL4_DaMm`fzs{0!hT=K@l&W_^5}8@h-2)0yp~5 ze}WaCvevpaY3z#Xa^Ni>R;E=P@yv8p)99>$XdMn@@lcpr6s>;?zTg?bmZAdv?9i#S z>J+Lf^s!Dt>k>^x#fd+j@=@A{dD*%`hwtp>z;xHzLs-_D*;^8MUtq<>#J~gBWO`jG z`kPnw2Coq)!&WEN4h2X$_-GoZ#HZr4@CUrB`C3~5GZ%fbw*m-|wgY~pc~%6qys{?p z32?M;vy5Qdw0UW?R3b7X!hPogRBpu~(s~qag)}TN$h_k3XkR2?rtKvdSsNb+-6VnZkf=hXth{|q-nN=A>^9u~88@L)`E@cvkIL|%h)A@T;+N|h0$K!VNsc;$D>FNL z+vLD9Y@H%zEL?~pPItx%Mw>gb3%6jIn}Uhs4Gt*>pX6;O&gZx%vtB`2We4Fq>@MJA zZ7s0FX0xd!5cUt)t zLxdHsQ>LH+%6gFyk{i z;6|k61&s_xhC6NZ3@sZubcAS=SdxQREuM6!ctjIWC4;qZ$uY&lyOO<2=)}Zlgf?q5 zl=1|&=FxNupo+&oz;wtPVF%mEp+nYN1RVkUuCit%=VSQvqhVsXuH}$-Z%YVp{OgYK z7HmVZqShHu!>(LR&@7A&E|Cg*O!MvAp-h)<{?UB%TH0A=Awe)p&CSWD9Ey~wI);FQ zc#@7zl6*y+y9Ks6VCa&m|fZiX<-y9MS(e! zl}C9Y0-H33-6kh_E$DW6YGuE8*bufn82m+~k~|Wb1rxwy$K{Q|OmWNglTy&lFH5IHbf?3G>(j5^;~ zR5x=P0}nc_W#B&{kd#H>mAI9@2gEOc3s_B6SDw@=u}!sy$tm_pwqzA1reCa}lE&^e zY#bwmSdWQdv<0d*PXsNkAiFjLS6XzTeq$G2UzI$rd2l96j5DH}mPxT@i0%+co+RXF z&Nc?Dw1e{V7Q!<4&afZbbO+q_%jO(7YmpPXgx&mahL5qhWT&leKFsDpe#hk!url zEWcIXSVb#^S7>P{v?0x;D6O~!s+sXJDb}Qt2sk86k|w;t#|mqvXb`Lb=%!G49C-yX zU(|y;mvm_SM91(bx5IyG5WE-m)=}CqWM;_}*3XVSIN1<;WDQn>mKL`DtUBmTDIeRh z*O@|!NP&NW5_pjKH`3Ty*QgGvh0oDGlQn-8`4>zg#R;ZaVKYdJjG1-l?%DumJvWlk z@HmBFy0FNQWjqwowXkXtUd|!usB9LW-;@a@`+`PZiB^PgfY}M-Smt$=b018uDlUTFqFRb-G%Y$wS~tpp!2DHHl}b#xN)m`%}pWiN${3pwaR{_uQKk7DJtQNx^J z%M_d9#*}%(XOe_`VJrr!1*JjTaiMS|AJle%O{6#jb6DPti#3wnt+#P&ETs@~W`tbZG8;O0Uv># z8!(UTouuY$A-%j*kmaQS)|Qv=Np{HZEw)X(^KiZY!s^itEy?TfkVoX3yl&;m6$Jh| zDsDc@Y30d{$R(fLmYo#h^v87*k{Su{m%Y{#X--)VDM3HXex|g}b>Eg3KI;&5p-ZMY zbcv&~QgNapchxeYd4TPscRCHnQjbf-%ZTFA{Y?VBwnm6WqF=MHv4-1)NMmgM0HwLT zrRDT3q#?Q9Bf^b1Oa%61E$@1*bGEX#tO(LgxC1f{!8LC9u)Pq&5Tv4&CC|3F0+l6# zi>Dp+>2X_4>pf>)+5@t zOrB%FO3$$I$cV&x9-+F#*aV?-sJTA_$8@iv>=o3NTETb4z6H9DEHA^dN_mYGng81=9FY0eq`gC+x+&HxWBywxewbqP1+(Te@ zq(2HGBK~4i!o!25`o^N&B>hAa#wVcNxPO06I}Qd+ez~<>xF{_|N$?HP178xmQP!1A zSte+Ah$TjMq(60wqdQ?SIYQKj_&%drk(8RSy9+_HkQj`f{%{0+JCXmVAVrvBzK^X5;L|nM|pd+ zqivW2O;h1*U*z(9y#yqTo=` zoPi18zD^H1ad)sBq)h)92cbF%Xm@JSKul~bKa_krGg@c+YV#QtphH#M6C0^PAW5^q zht#Jq$@xlCvT-bX?^ejn(0YjfjK?SJd4kwIin=(e;WD~z?C_^ji=1L+Us4@PUtF*Zw8+H2b4Z#vgimnHM6FDp2wluZd5HR8Z14b+Qk~K9x6E37 z@LpG3N5V6f&0R@@071>VYHT=5$8Dgt+0&6*mP9izuwF-p3DIA;gbf@!hO!GlvoOdC z6y!$-XVXs~x$FZ)k&&KpdDAr@hkmN zobn+`?s;CGb9)F8wz}(;6w$iZr&uuGC7YeLdrAd>lDm*yB&xmLGQ6JM7Z@`w2!eu$ zMfKiTGN{uI~AJk~C&R~tv4DbGdcVe=GkID8m;o%};Uf(CN- z(1AbZF}URpvh!e@T_22-rrB&KwpvF#;dv14jCGABe!(Y!b@O*sQN-xMxOw(>kx;f*yZbqZEwDaKlwsyaTeN`uM@n8`H-Y2s?H zMG@|i!sag;;%Zeio7_Ey=OhkeIC{QOGk!|UJTI_PsxO!TOJt4_ub0k<5S8qN&Kea~ zGRMfdqpdU`NrqaxCB7_s#h@XLKlUZW)Rt*+pVL!@j0BX!HbK!SHz{lTv`~k9nbb_5 z4l2hHRZ!4|Qi8D>viCUU&85wX42vqL7170IvQo<2$3eKWM0x^wE389ltx&YF4;w~G zh!9`uKA%cMK2omA``dtCqy8$lxAGFQ3#2u_MjrMG&hpHr7+-P_6#jPThnmqlk;JuS zO0Wzqx4iGyQVz+|LrmCHw*&`jc>^CKHcX#*+QJNH!)dw4M1qUNx`$kB5Nyg7y_tF0 zSL#9im&5Gdd(EgzL}O>AoC2@0P-KIQ3Mo-=yEsOOA!F~!;Q4PpX4}u94z}gj#)52~ zY^AO(Ls7jiyHbXzWjsPaL+yIkvEel`6eSYDD})v)v^K9C=0!p95shl!kDLEc#2vYRT8<4)DCSnDijNzri0|q zpkb?#91mb-o1MysQ8j}&8E5D(27KD=nrF5w-#Js>?g-+KF>lSjCyq7iD4anb|IY)T z@0(=+io*uZx?j<0FvzFOnXEa_dCwWR7s(XGP|xoS$KjF1>^(e{4fw1e~(#Qc|dBB>>eY5QiRL3Z5 zF3B%80=ABx0Qn31s8pe_QE{eB266fL1f2Yq+{qXd(=7p^q<64+jR@i6n*V^NbF!m0Tnw-6aH!PO7Ft3O7Zr}GW;|cU zrqm*q#`)|VV@MxfUiRUzKWIryI6x&bPjYGUO5`K3K zkYAXEkpT`vf%iI&rhRA^8#l1t86Ptf4Nl z-`n6(N+CvZ+5$eOrwAEBi9p4GWArwCiu00$Y?~mye;r$~yi$&85=Sx7@M+Az^m$PQ z*q#l0$Z1l~k@-%>(>yG1Dg$3ks+c^MaP&>~O9))8|5o^v8 zpJ|o=O}Pyr&YlBNY7TlPCxo~|LUO-Ed>SM9JUTdEubR|L^clCpAA~HTv$TTHH&tikij0;aYod=flQ)9!dh(|5k5e6fdyzrY-6UL~p|5*u z%D6{{ok)nJN*)%^fs3ETJV2JNexdW6s}-nJn9$^8RjF%{Ep5Te7TUSNK2@!4t*@ zI)MYQJYrKqZf%5oDW$?`D)ujY zjomatm17~ukRhy%rJb1`4x4CVR{L9JnNUrLq{2`$bx_*~qjKPR0&$64!Y)%b;ZRCS zi{J;_@b{ws(w)^W8&_ttX{|*i2!2stux@Oo9R7mBYazAtcFxtC#zm%uc+>{;vObRu z)+J5K_GVRN>y-(jSpw&%7rc!^==54sncvVsZvk*l1P4}gJ=X$%xNQsNdI@f?&4L&1 z8-d7RmyuPFgLA4qR%8y7z-OZLF#`Fm2M~J@rp3qeZMtZg30Ye_B@ckbr2K7MSjs6D zIEN-!VSoS~r4VMy$XhYRA&$+G-mUR4T151eDWtvZt(-o)z58Tw7n{(Hogk^TJM3!R z+EtTfYge|_;>tCaY`4;s-b=4dYPH(f$)!E!NJdVs$B{`vf??88yY!VcgEJXqW75=7$oc)pvP|Z=_*Eb3rWkZG$!*d zVi`D?(g+m3zN)YDt+$cuL$|B`0pk1xKA4W{t{>v(Bu~_7k<#eO6v$b!S`8cqH^X4o zS&|?zjkChOSlq;CA5|(rS-yZdiUUWOX)$LNE{n9@-$PvKBI8>vV@+1HbS5HyY@)Ct zq&*I2E@z_!`}&J1bRzQNa*}AH1sdQpXiG~FX-NjK<@M3opuh-n+9oc82Z9Re?{-;Qw(yJ zL*#e5)3~ATuFZ!BGYv)k3e(^!)W{)QXWO$-;yL;0n1V$mZ+$fDC3E`0Iv60jOUMhk zBZg+Zr)i$#eW>(BEG}V&O_%Mjvmm#m0u!m6z?@=sg`vTmeX(MunOblibNYNTH181#khaSfn- z<)V~@ZqEz5iXx{B3MgJXBB9Si69kceo)`srtASdmw{&-OK#iy{zJCq0Fkq;P_G$e2 z{oVU-(U>eXI>e!nj78H$2g>5HbL^{bg-wFOKCp z7z-sbbO4%NiHsX5W5JPa+g(GmwWfW5)&vMzI}TxJ+HBnnS-U_i-DU4qO4SGy8&SOd z6d0rcI>7`Y8)#di{63J|kQgErL&BOZpkW)13f4dnD1grdF4b+%47C3~SE0 zC2aRtfo&c@RnsP`SS@YA!6*%i+=s1lf7UHW@hd*z{97F)ih#lDf-Fu3(WRd`&4bl-fqyy&BENyGyh_zwCCrZ9GFTPcFYlRO7r+)?o?oTA2Ftu&3W#1i> zaBmU%1LEkLP~Iz#jl>37wHeDc3t_kX=eObiN8igYmo>xerQXhd`i=bk!2w)~jbDUN z%w!m$Kzlb-<%b0)89m`&x%_Z@tvjk;o9jo+Ee1uhcFP16D=pBRt*BE6WRjoz9~)yMw29T+Un+VXK|6pVB*<8W@2{d zzcQ@%rsk33t9*%w3HQzc7me(hvLekO_@M&jXi`QN9tqV@j4wL4 zlQjfI3w1-!9heLEW{&XE*RimD(Z+vNS59k0zi=r2r4l^CvOo$*tzYZ3Qg>}lzpa9d zdz452zM@|uX|#JxDEe{4P*fT1w(2BBM-?=TI5p&>CKz0dR1I#hs%e{1KJ#8Fx!JT| zwhvd9@<9n`i)yM&X9UE0&P`~uRvv8U9@sBm0DF!o5t3J_r(ha4O#%gyy^;J8U7t^Z z4UE5M{Vph6llW^d@#cmuH%U8f%g3Rqx@-fg=rNXd=cDD!3jB)gGokY(tTYAu_B?#IVPzl`wqa4Er9Ly$g&Ozwwr53S;BrVUPcnUb4^uW7a)-uy9L% z*aQx?7TGe0u0(X2I^spi_$iVy#jkbO!ozOiUxt)UylnTF@L5E&=kG=Tz2v_y>+d5B zEA*>dIU~*o0D64=YNNLvfTP!S@}dj~LX;xrIh1*baoN z1Wg4U^MQ_*;)`(R0HzI03}eM5T-k$^d3d3Fc(HqUiS|VyLRtbD(igEZ#M%m2e&y)F zycM7lJ>*h@yj%&6rb!)6kCDHK9_@vw&#()JwWoasXfZz;k5P`G3b{if+&&p-SqNy; zt|Y=dnf)tDkOq|pl}$s~GJik|9ymB5(GjXEQq-yY zo0n+7#-wWbHP~cS8Zfk2U#B&e!D^K}sMTMmn@tRJs;pzA!C>oSUp}zFJ0l9R76qH* zam-me|fXAcfotTwMPKE;HugHAK*i0n$ z2?>9k;X(RkS8+%H{kAf_tE^Dy7 zN}PRjer;Zr|BJIMY8k>dyZC!XsstF04LU z;@Bz;lIqL9+a^lTT;qJm1##uj4xl-Rfdep@LCY=h%gJxCeaG!%>qj;;NSU_LvWGC^lJ$e!Ojd6cwS1wFQ5HFzDuAp@&)aewAmRtI5?(eWq^N!a3%FcNEr|^%6rMVjkcbxhI6y457+`MYR2Yg2Rg2-PQZ-rw0Oc@eP1!J3=r_2f^M#CZf?;|%Raf58FrT`4p$FSaCHsc_AP0bHrzjy<)gB&c$#K>EZ z=GT^A!jCFiuTdArVb#a%!dnFUT{vh}oqODJ%w$KG36bJ5rpK|`g7kM->I%Tbo4Ox4 zHe~0jN20Pa?H-j%mpRJz$a+*eHmd1zf%V{H?Fw|PZFg_lzH1?__Cy;sW`lDpu<{%N z{}ySh&XI!@nF5g0w6Wq-N{TS~qz$I&jnA-JX&?to5D_s3#wK2A;xa5XPOZ82^yxj>v#Lk6ferVH-9t22vO?8r5G&oM08B7P70lj^ z0RvUg+8CZwYuo&-5l2Xy+Mt>Z(Ncv@$Jfu;3Vahw(JjJj(n|@cBr>+j##%K*Es7Rh z9EBAeMu^dMc%MnqghP`4h)L=kM|4xti!2XGf4@MzcWKg;2FEQ*L-O+yTu9%*48&HN z7eUslCI(oE@h7md@1MX#4`8-9z1jPqpFT7gO~|xfG5b?stP7{GCdQvak*nA~x_|nD zBYfldTW67|dgZ{QVORxol>a^FU90HP2PW#p6U~_d&tV_(!tPzbJP3bZozW8 zmJE}>%$RPU57cpR^Ot2|LyDJ2OvkCfl*r?7U$#$7oHb5U%05p5q}8F7-+?dVUi7vH zdrDf~rRZLYhi=&(lGI1_FHDoB80bLC#|ZjlPa|40>2PM?QxczBKLuI-&_1EuS@VnNIDUeC59);E{& zdD1q8D)SmX#5yM-#k$2BPJb+Ub~7jnx$tChlTg*ilEP!mjBuu9{rn{bysorPOOE*t zJcUCF+d>SvhgM;&aVuea6DwQMdx#hn>>qMD?w8f9}@6xA1RUM8ofloXFI zAYV+RRI-WF8`yjmqX#Vrcx~Y$n;T_KctUY|V73qwk)<2Oal8MyRUq_*C}p<9RcRi} zl7hGC<}bf~``+zeyS{Mw#=Yxz7j9j@d)+NyC0M3y<%p;@1dQT^=oANK2B!j9yNAeN zZeeWzwqkTuQf`?NAmR#u*3M97Ji1xBlD?ObiHrKd(70Lti@CNogN0QLRMZDn%eZCo z@=NrxZB^w^N-#q}&0cmR%{eFb)+@2g#(zt(vl0UAR=% zF;Wm(2xaT?mqog$$Fg3A5ef~Zl>#OUxrmxEmnE5)!pjW)ErSoJRog?=G~nlap&<{=5SNF=UxDRFZ?0f5y5rosvuL}>;^Ub4x`8=O?{#imbx z;gT?M-2QC5IApOc*}xo0oLI?|MV1dqERigRbohceZ|E>c&2Xlsd%u>i-C2J4#T+;fg5|ZN*#=sUGrL>lm4`Me=6WgHTmi7m`OM%a0U}(z> zJ!X?OIOTi!d<>5yhoC>eVg@aT&It%ZL=-Bi2fa-g*{8mk5%7}?Q~b+!4CTQ|Xn;MO zmaVBn-QNA$$4%zRx@^nAwB&c%-#s&$X(K-=`IY{(?3CQ{PEBI`(a z!qH9o1;BKW0aSr|6B(uv!R#zs$G`y-69cw6---`*9L(HV5wn^~#vR)a;HWt1h0_!j z;R$u5k8HD*aqaLAHZ3bK86;XeLTcZw@5-(z49fuwy#QOv{cP}jJt+8bPZroR5FYTR z?_Wa{xK2~x(=9Ewqf#eP21=wYa>{eL93-{V81=erS*(FV|4)eGueEWa--Vo!?V|c~+uY3ix_u?fK(eFtToVu9A zI(s#~%(a;#{E&o#w}C-+0YkIu;}eGxH6j{Go418MLfzg&N%ZNqByiS%z};E19)NQP zbaoAHAW#;vCjw#kXJaec|HZ=`tZ2Jw8kJY&0!)(*lgCuSzpf#GoxCq4zi%i7($%UTTSJLGTnz@#oGle!>B1d z6Vi0u-sgp(7&ui`Qjt`24vYZ=b=%lk!bix!#~7p5>`#0>j2VZH>_hA;K)J?|jk3?? z7@Q%C08OTCMnDj9>aky!J>2Xp-RIC_{gqYzq30zzk1@@w`y3_Yzn+qQX!*Kg<<4yB z+A+o|H=rdHNrK~5u*()$-+BLukhZ7%uK#YTZtKfto?}?&zj;SLPD|t!kCKh4D`i#kxvLi2AB{C_qwtQ@2nxr_QESYJQidyjlB|4X#jb1A)hMv+05oOq< zP#{BBC*V>tJH_$e*nFl|;(p zb}HnN)56$2H)$Kt-i|P`W@agaIxQ(X#ZyX(To5S&>4ZyUd;GXSGF9y-Xd^Iu68WSx z1DV(h`TK&=7m=DYs#U*NG%1eDn53XZDfaZk0BcVg^vKN+xH%l`;E#jxO7*Bgt-(1C z^ixgoKxigN#AL8q{gTDkRuA&m@j^|?kcheUIGrcN;}wMhia%cBL7HSa-KZI&8k?1n zU5Lj^vu3u^EnafZ+O%muDU8fmA=Vw82vktBul$I6I2r?#v=U+&fxFcOxq()GAO{Gc zBya>Zo>@a9OnHPwygsob5^4s@Pgpk#3BFOoUK37c*d7sD1k%3I(LI8bPNnA?L z*V6fF@ziT!(g{hgdj3#7Oh;86 zhdmu&!_w%{dsa_H9u+1{usiKRP3%}+%ti+lm$^Uir|4`wwdND!%lFnRKjB$M+rX3IIkY@dg|$3hgZG) zx)`g>aYRS3K4ZBAK1}&`;u_>Mi_jxUNl2XX3(I~NNr*a~0ho2SS^Ur=kS+ckMx0tf zyqHdul=&{wxjh^Lm?`qkWi&|bU=~ee7x86Ybm95JqV=L{9)MDiJ-XNTlHG|5r7$FsUV^u22^`3JTsC7nJN3d{=QbVRl@YN$4?66^w}c_(Arw zB<_lxyfjFWxOvZDT4+;=Ct8z_^$?`%IskKdAKx%^e%qWPl zHMhP)vpDv!3L)ndf*{#2d*v(s3JHu*SVM(@9zG(x+X|=IVA-;%gKUx#9zhzu|rn@F`u`)OlnKP{_PzXi6tI3HfYE(zq6 zW+dgyiS_I`nAbT3WBsyph;hKw=eb%m)qf|Gm$iV0F;^|b^aXnlPHGC3|F?_1^M z%|K29?{aJy$d-bIN-o@0^ve;TtA}@&rG~tNO1wJkcnEJ1AMb86kZo04Tiu&m8%%=N z72)9yjox71`{p@z^wkw*ySYfkZcF&v-JE;#UYN0N=?)~v_SPKB;y%-MoL4o$t`Luf zka!%PYU{ZwT=p8eiQ(u@cTZaOw_wYz+IObPx}|H- zTJu)jQy>zIckSl2f8_3=#{(?oujwG_`!I_aueC?jTXwfGIk<7BsVHw;wVS8_3paDt zHyntwH;8tsCyu~Z?<`!0K;NWa{zR_VAi3+R0xRt$J!eg2r>_;jYtne&n9g~n0lcmN znMuy0c-nzpyC#p9-Fv9ppdXXD&oZy>2hd$V+}WKwdTj&eNQPAhdfu3mt6z6z_31s# zfSEI|Z!T(K?I>~2Ze3rPr!vIt7aVnwInZf3wB_TB-|F_t<(2(=Y(Y{oGklG$x{jL3 zAKjDu9yC)DZ2q@p!m;ETV^}SRVbU8qT?bb{Ja>^zF_DtE$+^&%jgA_`IemNkhV~V2 z0NH->nq#^3z{`vp%VXXK4XuG2j?bo?-%N>lQ&dj1Rd7Y#=~sQMM3$HVH^Z^_YsE8# z6)FokEe8b52$yrOCehx!+4jD^OS(IJ{qFW7Ekn=lE6AL?IdKA+dHZu{U{NEw@Yei& z%7%Q)jBdzhzA88CtUZ5H=Y=X>lV-c?vq@bhG!T>O7LR7QZ|cimHP_3WgOBZd9N?9k z83g}*QyR=W+sIw6%Fd=w8J_yr-nenBg??S8g7D9z(&qO5`uylvU9HyFMKWD?khtyL zw-ij4g~B)4U)T2^9?&C#!aOPsX1J;YFg3`P?|U&X(rkbmFVr~cyYWeDP%GEnVxMt1 zD}t1<)ai%t(j6bYv?8oB?oMBDEy|ly%iMq|-@bV1s>E?VD7c}f5vUub3l}T}oeZ~i zOJ9ITMdq=wJO<7~LTs(x{=yj6*6)`L`E6u)F$T`bMs5tC>qhot7^8avmQiF^7*}K_ol2fux-s@@ifjjU;&Hvp6CB~CPQ9V;x1Tfy$H-A1H^-4?{`@Qj5! z$QSM)wchKlDS+(8vJv{cPa#{Kz^?iPqJGhj>-nYp(jH`y36onJjpBOa=XhfoHJLNG z=N*u$P-u5W!9_u*>>RuM?N{f;c5fj$5;;Dnom4dBg*cEPCUJ~t;lr!LkydA z=+5QW?_Ew^sQLjTYG?v($b4u7v5=WR@ck;#?#2XQ)2bfC!=MeAi5LP66)V4VbMD%5 z*vcJ~Jp$}G*<<|y)F}xm6wXwcI`e8dWoof!4 zD1zHHBOx7EG{j|a@UX&~KBMfosw=2$MdpaDq{tBy@|iFiM!s$`H|MNhcvC@PR|BF2 z%UG+Wu3DIUMiZc?70g@keOk#q9d~nT0Zh^{_rTC9ecEYtufgLSgSS^drO1ulAsW&4?y;L( zato>IX>dp;ADVYs*&7a4b6Ux~4X;isX+*(kWp`wBw6l5YVBTZjJnbHB1*iy5D+)me zqCb59(#uloo>pA*`~!+SZ1epFd0Ne(^d4BpH#ElWwCW~)#U44BFa$iTg($zI<_6aM zuFb3FAym60@2>7KcByv{9NRBow;@Q%dblt&oJ3acU7}J;M`XO+Lq}A&_UA5i`=yl| zawX+iJKMzfzAgRs-A+WRW zbh6<&TDpmdXOwlaCR}b975d&QJ`mb(HZ*t}1c5Ie3b|ti_u()VHDv$jSOGiEmiP-< z?;R`h03U<(-Mk^^+tI6p@@k!A|I>EYP%-riVuaYh3zsFogNkL>8LC{CecA_CF^ZP| z{s&i^K1@`nM&<@F{)%zyyET302h}|J=nty>{yix6?*B&*j@SI)9vrVd?SU3gY%wlf zd%qDsz0S#}o?dVIyvTpv=OvF7o_xZw3e%>qqL15KHBx=wH#x1!$;X`9()3~Xpsmns zyx)UP6rX&^i7L|v^zxSX8LN}!Cm(ULPGcteWioF8Jo26XF(;}ZVMFH|Ec^bo<~J}y zXXYbA*|pe9@88}{SPYmiRbVG*$nV6fTp<*o;>C?7)`>b7uZ8yc zfMzaU>-pOcs8!_EMwD7Z#gh~1D!RfAG}ataqiSrj{P9L$s$PHC)b-Joj6BAS-kWb7 zhm7)0de?AE{+RH%bG;m*AqOwlfX@388+I|k_H;ysE#_Pt1#sUSTLyR0mcX!G{gD8qE(%MOK7 z1PwW=zB1%OTZcGIr{?h_O()$GRdqs3X|L1n>XGm`_q?LtqtB)Hde1lScX#ftF3VUz zDw*p<>_l9Qy@Ui7f?VN4BGZh!Qhh+ncO?~=z+s1UROkd&q}2pwyfA^7^_W1^`3b;m z%LEeUU;@%hYAWqdpjWUA*qlHb(wP9?yw6A~y6psdZFPC$5$xgw7=B>_y2=Pn0Foh0 z0F9NH0L8~l0P{o+T|)9U0b0g;5)#?(t;LO9e;3z^+^Ps{rbW~OlY2e0HAk=9zh%0z zgfinwJ>^|>MDTd2oKlzhLNtlRt?~Wl_L(6Sr&PTERRzse8=29Q+NST3yhK2AYSHa7 zk)ITzj9bdGK?R z`xJ;g>B$80#`5t&G^F$2P{nT%3TSdq@WTC@MrGqg+6wM$9G-dubNx`7wrQu>z$CUC zHzaH`0Wfo*WE3f4I#jPMY9puYwAG=&oZ=8xQ+RE4bAK_fboE%#$zLB4ZR zv48j}-$YtdiWISRI*P{qo7a%+rS}*d=sIco(Tf zb4uT?;YsIRvdafsUCGmqbpV&s2I(iO*uowf#9ZHv*;#=++_|~^-L^Z?<$K%FKD73H zXF#W-#T4D!*6U90>GfQiO6+h=0oG8*NC$tSY^a?{;0l(|TXEQ$D%H}Y^p1mMrh#^c zf147!b+YBP*%lWKR}H&whI(F>e+VKqibqV|1OARLTi( zafip7u;}JQW$i#(_!uP|zoAJcj>8-A)@e*4B2dchTiQgM+h}ZpQMR`{fmP!e-1lDr zp|7WFssd4CvPkLc?2S8ns5TKY_YVj$>8kiS^i5xb${uo8HiZ0k7dI!+%UHl%-rOJ- z_tt~{##;xg^GKii_HC--{zNX-S2WC9m#g$Q^q`usD!97NZoKG5?>*Um`&ai`(sLm> z;hj}Ex(D+kGajW8 z?TTGX6}JOzC~1gG4d84aHhK5aR@$iSc%02q487)&yS__n&i8{4RA z?TuD;=RnvRTiPlXk=N3979S7V@PqVp)%qhsR>t(y@3-VT(DdVn} zSYzmA?O-))a@(8t`FNwd`srDdF|~N9+t=qu)$)20pSt;jtt*_che~w!2!B7w^8MB8 z7*3)_9RR}$9s%2)2=NWXH80iu8@~&RU1*C9sH$HX#^78V5ch=P#8&D61-PSQ> zHssUo&IwERnL@aI-V=E!E*z`k#&E? zr^hyJP}GtbdfzbrL}8{T_nOy?birHixLt6Li$ff-DjX##2(h)F`&ai<=hQL{@%t9D zVj;4jd$BJ%*|EN~e}&0&`{Kycnzn5G4(?xH@06jQR=`X#({}P4xJAkIrlal~*^98W zI@xh}fS|8QJNLFT8Bf-?%y8O%(BN@2+1kqux0xV^lh*Do9$8j#Vhq&NNzF{zQ##b+ z<*V2eql=r|H7^$$*_p2N)h6X$;2%()^^Adx6y($C0?)I$->>pXtJe->ZvhsT_=T-# zdLz3wW})wMt9L%|=7~3vF6!9odh`C9TRtvIqc<=Kw`DIq9?(&du-p5Tjkccl)wDzt zSuo>%dn*`a+JfiWsGu2ijI7>R>iRUQG@c@QHjGQGfsLj*)Wis21vh%r5KO7$o05bVUX%J-#vH||S{U2U8RzaH zFta+`xu!4YwTD5K^(&mLY=Gjk*T&D5O@3m7Xyp59nPZuQWo_HN`M97rck;lSJ6Rqr zm*SSoG)V4#0p}J{XF*yC+1Iyx|6o86KIP`Py3oTh-NykiBIzDDVhgfC>2>>3p>8R_ zQ8;%cNco{vg5-Sw=8^ll|T!z?Le?CvYYJ~TYW3E1i+PW+&1s3y@N16&mlz5~*V=tl? z!#ZJkSDyf<&gF~h)2`+7{Hl{eHFG+TVwg2r6RW#-U%!k~N{kj{{JIa`H;PF0{573( zu))m5B`ct-JW{8ZNB%*XxVZeZ+CZ?MJM~qmSy(Tv8s;Wvd z+h8Dp;K2;eWbMiM9F%7 zHSW|^BcyV&pHqcY`h2%E@6%SL_Q+5%`}FysRGSA#`@qNVMVBJn-vokkM{yjeU*@dn zw>ShE{{(b1SOGfGch@;&_84x6Q%+Xq`TDvoj~qljX&x^r_8aN zU_f@KH%UM+y{nhaW>J_k^YXZ&z@JVrS6lpoewt|ky`dpgP}+=cGjmL zdGfdn50`$P@78jbTg&F+(Ex9Ay)V#H`CyY?khk8|&AR)NSVe=%mL&dM0DH5XfMSac z&u8ZW*ml(mL>Q^wO+c3zOFen?hMm+vttu$2=4UH^>}_R&HtBo>L#{3&d0Jf%;VDF4 z8Kg>EA}PAXej^z^w&F>{qL*uAN%ifrN(kqQ(LXGyZ!ADEZ{jH;#85@@7D?B(cdp>S z87x{X#jgW;xY1KN`pgL-_21ocekG~kTR#kEeN`1 zx6`or1+HH4y0iEl9kHDt@P-FD!5~4jP2}>Y!7NKUO<+F=nWl~O+xDbshGcYF)ud?D zE$z0GvJzBJU>e=MX*GG!Wsui%M%Ltpp>&(oBIl_x*FC)!d!=mmV{ve>(SG0Zp;ksk z1Ww#YR(*-kS}2}Q{}1S)g)vQDp|*ONBms6D~dltPIuU)<2&OKb6@$nIeqUy<(@uZ3m` zg(e7wY$4xc+u21)nUd5^x?zCi`WLDu^pk~W3gz~-V}Q2P9RmxK90P?p9@@9NkPJIY znwavQh;?yZpew%muATS`gT5Wr#gj*G?-nNah`ha9UabA9d-CWlWOCb2;>IPSHF**+ zbD%Og8oWsjrYVC`&h>)O zJY=6|q@P9R8u1V&039vPL1IH!j7o*l%_`FD=oSG$+^_e%F2m%Y$^|LoVhYiCqnbzk-0Tgp)TYqYaM>O0SVbLQRW zI_~Xw#`*4$n&)PAy0>S}c5^f5yRQTJUiTIL>M1X9o#pS@8KpnYzxD3x&%QLH_HT9X zk=yCMf94#&e~?x>`lgbz-1Q3SSApN+@5gCxUG06SoB8U@4o`Xe!>>~N?6dE7pQdl` zb+2_Vyzt_gFMgQYskctQzW3p?-4`kO+B3W#uqQ zzDZBM&1k&Xz0H&LkM|)BpTs}4xlYf%#=E`kXMURB7rSo&`+D~RL-sS|^`<+|blv$G zjoN!>x@XUKXP@~2>926{-xEzTW+Q(%Dmo6mfQJM$?nQpzL{nt4m@e)Ra5g|hZgD6%(oej7iPXoPrk(XP7x1 zX|0BCMr%W5XMFz)bl#>izDeufWuCtTykq3Q%3Hn5+~rB#yVQFH=ok6*)Y1?2 z^k!OZXU}By>u=t9o$=5bxW;&Wns?W~x#w=py#3tHb3X_CEUiC7zh2-vM{dq5Pop-& zy8l}D(z7&l<~z^6`|J;%{e%2_x2{{<@$Q*#QTQtVUgG_p;SJ}`+~P@soH_FgEhUVWvhm-B<8n{hOTE1(jV`>_N->}x$eDZzxC|-8O_hPXI|~T@zHP1=y~UO zhx3f+Ic4;pp>y;|{~gk@M(~?FMg7-o)PFB_ALT91b@#d#&wTY+o;LH+b1zZ%Y>K%@ zPgD(h`V2Fd_I@z)gPE)_zOz;Yb-&3x{5tdPTa`XZ@!Y2hsGyv_5@ zpPf6a`S=ar$sbB~K69)4`ZM2u?p5wR%7(X=;JqL-ahjRwbUE6GxzL!mz4gf zy3u{(S^ZrH{`PZvbB+AFKr{xoK6JkOKIPwg_FKm!?cr)k_xuPj{rfQ24{?2j>xa7^=lQDN@$`?= z52c@>^^TT)gP-{0-6tqH2@PjcTU{qIHU`~=reQvXx@ewyp2sP!AE`_o+KXzMpI zl0U@tNv;>E_nTe!neMkx_h-0%E7xzM?r-NhPixO}eUeLUe}?DIQeSm{mhzwDNze17 z-vRu0^835EUgD`2DAV&V@^pRgOI$B=eU|Iz>CFuA&r##!?)gV(`%|pApYA?S4}UlJ z{et^+hUc8=eh=3#a{Ut5@8tp`b(iVU6`p;S`>xT(b>8X*?cU^VX1MDXZGDuo+q}^) z)7}@jUITWAw|kutRsY|hojIQKD_nQE?yP7FpzMqME^>W}(OaVBWv&%!t}=oj;qG7J zTH|`awa&G{^(FeCv3tn1$@Pe9i;;ewk-p4GZt3D+Ul5wNFRe>~Uk=lT=4eu}U4Cvx8%u0M(UzQXk<^FDtHU++%^_NVdW zKb`B(;QBMUzRLAyasAm`e-785%k}4R{rR;27tr3%lKvXkU&!?ras9l<8uJ=fpB^*3_;Ou=-w z+v(rm!S#1CntvBF?e8Z2_b^sBnQ zpJgUL&-F>J7is^WtACo{_CuSv$XQA>;Gc+Z&3bkQsdv^`nS2%{=egy)cGC%T~^DFvRXdLr9S+7)PIlb z-{<-dm_h#`efW=P^FOBj|HSXmb$^Jm?{fX8T>lx@e@=ThS!rjvwBlamef|q(*ndfT z|COJq_c_!3*Q~;iaeb2OMONeY7{foz{hD__;kKXY{u}Z?#k?r z_c?yQPdoo3*Z;)zhqyk)lRpIff9CpMxc*nJ{|)$0xa^kiIScH=T>m@I_yO1d!HR#5 z)&Ga7^GAXIpIoW)%Rrv#{x7coo9qAK`hUR+&wv%W8Lg8$to_#^Gxc1J`x}1tGc(V3 z&vKpNdT!>K?n7M9vwx_+XAOIvHU2znT=)G7c=c1=hi8N*yY7dm`w`L~<@#aL`aU0{ z{U70aVdgIVy32UoWxO;_zta6E^?r;ib4Kp9G$(czpdZb!Kv42_j-M+`R*rXKGFT;%>C|DGjDdErrsar-k)+i!3n>S_J5k| zW5Cbx`x$3%2U@Vj`%OZ@%>bL2wx`y$V{#5=w`^ETuDHqU}S@U!$@>>J$k zX)y0cxIW3H{X*mX^W6V2+WMTwH+?@x`W3Fv&-@x|?ANIOYi{dzQ~wv-PS^b&et(gB zf64c?`kJ5b@NM7Wo_DyXwfB7YduM)~eOc?}7rIw@@5}V_3Vpsx`Wn~und{w+dKb;J zo3wk2_r5*z`^ae@`t|OYXD))JFVgl!+SZ)A$gKOsAM5NbpyRl?$8F8b8g|#acI?DX z;xIEg%*@cVVP}YJD<;aEREpmN~4i9l18ga znL7EY(u6MqWucr$)-U+ExGoRB!f#LkDnccw3^ghLDwtKF8vOrjKcyYFsp{xmgEVVG zEp({ObseaS?#t141+_gmDnFsBo|aYB=e{+d3>p%qkycwZCTXM--ktGAN9jm^%JoF8CGkX0o0`P+WS9a|VH!v} z(?Qy?888!O!EBfVb73CLhXt?@7Qtdzf(}cyR!DEHmT|otR-luNJhGFAm0Yia)vyNE z!a7(F8_3s2*aVwl3vOG9yN&sq?U*~zcPH$E-LMB_oVS;7`>^ka1K1D3Avnx+IB6ci zeiV+uaokS8NjOCsr{N6lXW<;2hYR>!)Y_^`a2c+^Rk#M%;di(JHwk+Sy&|=C>Necb z+MDD1yTtzkB<*{IxepJxe#o4}Bf`5Gfj!nbFs72{yp?)_tcN_^PqmKf8Sc-uPU?jw z{dZ^HJiDk@#CeU3H}DpH-@$wAm5`~M=~(6R0sBYX|HS+RpWzF9#qAq>2c^sX@KYM5 z4hGo3N9TP7(+~W?4i4O$5P;o<>E@vdgdm6p!MKNDMu!*>3SkfvVnJ*Ohd2-y;z4}k zB!GmF2oggQND9dyIY?bhL3$~%r@~APX&^16!!12#2FQp#6J`WthAfa3vf-W`GY8~^ zTwLddJdhXiL4Mo|U>1Zz*b8G8!7K{Jpg5F(lDLwtP#%7T-=Kot zMpe|?t4f5c%ykvLt*WYbHT!-k_k6^whFKkI=-sHf-FObW@%&o%C7;$EH>ne$swOgO zQC>Di+d6L(wTV+l@8a?AVZJZaB}_fNCv8PfZ12E$5367(M{J?cjy7$adc1Id+GgYyZfVOfAnmvdg}vJAAO+es}EBB@RxQ& z^yrU$1@&FtMF!}D8M{TOfuu7C_rWj(hQcuP86K6!5VOoj;64&Y!Dtwx4<#SoGO+SA z){MjZ2L9t=0!)NSFd3%6RG0?SVTLYa*$6dLAEsuZ&uq$Z4*JXmm)1|s(}$>HyxkP# z?PfmV7r;VT1dCw_EQMvT99Fa8VzrE@57VE5yGF*Wfz* z4maQ?+=58BO}IOxmx23tm+L>^9^A(*E^m9ml+6RKAHpMe3{T)GJcH+^Zn}DboR`Fr zR{ji%fz&}izA^vPqm9>et*uJfq(y1Yq-s}J0xkMJja(zB}1 zy1el#b%`)RW_<`%U-0{?OPed>4cbe>gi}MmlU@?u>gWuW209qVIAo7kHe;+R#v7{i z%|3>o@-?h_>Ss(OCi9-=wbg&x@ppg|0*nc?_Y;&0)6I1t1Q~4^FIvxPG-kYlA;c)F zqC*Vig%TzVVnQs4EwT+6w@fnQ$@^j)+~Yz#hz|)MAtZvtgui7z%QmxpO=3(Yu1zH+ zon(-lFf-^YQedWpRJf(aOoN#gGo3L>rN_(w86guy;FlR4kjV2cx{F<@EVyOGKO1Bx zUpWk?%4tlMQdGH&X{H&6w|5^1gP7*~q18U*HfC^7X5c;pcX=oDz7I0~Ms8m6@tAv^ z4|{%)cZmX|Q_zs-lC~UsVPhsSXCh;!SuctZt|;!sh+ACB%_Fk}Zk15VX3idzRwWG? zV_Wy2lo6^*8xhKiJDc}-vFoagCw^JXa;Dq}W*?O*kE~x!dGrOC74Vn$vRmj>QJX`3 zkodIwxK+fjl1ENu%qrj}Tvhz5L3Igd%%v`S%T#ok$JkS3Fi!-v;JEp0NZ#g0`N=(~ zjXrfCHTI&$0;E{+q#vkh>b&qLH$PR^bX$a*H4h-~^fKQuL0il{^2W7f%B*KmV@Xtc z_0ZLadL!u;MW=@PQtG3`vGQLZw-orxJD&AkZG{#6B+m^Dc{h}}%c68@NSsEdPRoCC zv+7n+V}&PeN!L#`CTtVZY6wk@m5jf<`tlxuUvux9NpBVDOIX?sQjuB9mV|2s zt)UIHg?7*$IzUI#kbDL+Q)K*<&Q5L3U&=|^gHERYYk#VLyn_(G3+`Q^8+3;r&=Yz= zZ;&$SLt1^IAM}R-Fc1d8U>E{JVHgZI)_KyFJTZ1Bjgh9F>&@~Wg_}J8qaiVjfw87P zb5hy{%8ULHw|@^~)h9QzUUL8bJM1PxNSRu?$UEmaPg+u^WX4SH&v??SNS{7|a1&t? z*OM`)fRyi4%!azmp2>JXscGCtsk_s0pTYf_3A2o?+yn9VJ|o+x7e8N1Sh)`pemk*y ztJ%b#W9(3KG3ObTnCs#lhA<02-i;UHzKHgHF)V?Pv{Zk>Qrwrpa>A_unO|DT^(t^P zvnS=UI!cbjQ)&(QUWS{<wfo8BSLlaNh`{ACQn}cu&4x8=ges#oXr;Zv2)G^{%bG4$cQpb^f3EfZNeiBZR_G!{Q182?q!}}BN z=ivfw-h5odehL4}a0MAx;Tl|r-{A%{q+h>Dyf55?TbME~ip0DPci=Ak0r%iOavs1# zcm$6jKKeZ|4yvcfdS)C_&*25UgjbZsYr?#Nx0Ka8c#j;J%l&})kvM z?z8mg{VxU9;d=P&3|9=v_)ueK{Z zyW)3M{YKiNV+G_?gi25uu&L)oqrAm$-B3`gKN?d4+Xk6F!+srphZ|f=9lr^;AQEoleus4L68;aa z?_u7@d;kyedxZHIp1@PCpTTo@L7bO_eTDrsyutr1yo2}f0Y1W?_LLfTCfKUj7U(qur zW-N$}TzP*F$BYAULEh2h5kEd8;5s2Bg2a%-r?X0mnGBLc3P_2ZRFE3dKw3x#=^+DT zgiH_tnIQ{gg>1ylP8vBdb8?*va&w&rGq2A@mCq+s<>$Hp6vV9%6!y7CJ0bP_zAEA) z?bjt$l=#I6QyjAdl!Q`Hn(&d-86WZ^>o{d_D+}e|7bs7hUon4!3WW8xp;sxNij=do z=an!A(3e-ntU~zX`UBp3yy^c)_ZQPovo9cjG|0_+NC{lZ^I^y5S6F)VpqOxVOGx59N-W9q*cjy5qj(omD zhj-}koOjk2syF_9pf9reneue{Gk?{e{0+ce#z!*Kgncj!fuS%Ah7)cC;Ya$s zSEEQLGi5f~=ZzZU^Oo{)sByep2|p9vnnF9`&B9IcH`^zI@iOZj zxXtBy9?U1q0$7OKB6L}deF^SMVHx)2umZnG)<9O`zY4p|RjtN-4XlNAupalTwomB) z1$~@qgHI~85jOdxR-3s8TadREw!wD7N}b<@(AOs`mSIPzQXz zs)Ih?)FGem>adT}WIbG-=Oe^f&bTKMSvMI&(sF7EqQ;rjfBFv@qaG#PF*wdMaRN?a zKLw}Z3~8N(ndtS`JkyW(c*mzY<3{EV(djc|?hAyMd9aJbxrF^PTtTm^K3~YcuGt|B zyz6Z8o*0+5M8-O@{xAEHuK5@mJDjxZq;Z=({EqA!a1&XxLF)f4^oxYsa0jl?N8BaN zKM0qae93-{dxULiYpd@2*fhrKf0O5xWn&#q!dh)pFr#Va^8Oa~uW3I(Za=t3TFi{A zhd#cPyE!+dJ;MDlJb|b1%*Ri2|3#jqmz2HCXFMm2v{6st88TRv(d7L>-YH)A`2P=G zyn55Bkp3%>b$QVxl69r~K6Z`WYX7PKt-r+cQ?Gp_o`bgpi5H>XM3uWYEy*waHM+io zd-%Wiaca^265ggh;3xNH1nsGeeLfQBPxwT7vQMccd76#gx}Q9yrmO(!!q56zVQ!dy z-n|oy1(0K{lw0$fU%6l3aQhA{WJ$%R-51??NAsn9=Guno1HQhl|B<(U)+xiR2X4*J zH}G%u??*Y@L%u&U?ce|>1c1xe%AeFbYwp8Oxp5DKAm1R(->e_ev}lA2h7jBrQcerW z=USedaCUe6wT}LrCOe&x@uOY@o6pf-@0H}|=QvX4AsXx4f4QecX$$`TJX!TvbYLt* zxwY2)R4Dp|!9?n4Oy9ODmT&a`QLnt|$@6I47wfsR_8gQ(&LAzu-^%izdDo=Sf!YQvfVCfn9Kc0!dKA*QJ2TKp{Ga;>asEHX z(N$W~Dvs{yeB)~D@uWNrm7a7nKt}vBK?E{0Ll(&Dn@43skL>v8fShoXJmezn+>i(I zLOxi?z3E5Wke@IGpdb{2!myV#ix8$L6ocaAp#;d7t|b1YpfqWh!7K~q;Ir|K^|*N2 zFTU}$=$`vCo_VkG|Fc}AZZV&ajNgb`0VLP0Id7}_*c-rf>a)!8 zJmvXph>S+)*%$iAF#c4HY31~J){)!a7;v666|glnsBZJ;NmsZ5GnQru*( zEA!^aYJuDadNRT%!!Ma9d~&U&ugvDNABQjvsk5yy+xVuWJxxitl!Qy66~n&;?rotR za@s=&bm~aHI$`hZn+m<0s*7)Gt*dVut($Lal?H7~pi?Q{c<1ZMRd?S|)x$Tr))TWA zaeG4_F!KATGle~ngA->j{-q3&5hp{Po4fma+Hu_TkAmG=mm{QCk?qRNgt; zvTBNNSv8e#-tg0~eVh>_Z&NeSYbMNs5G}nHODlx0lvAjhjjU+I z6IpX$F8ZcscU&N_mzQ*T2dB=3pr5tZi7~91hE2^UKe3qeu=ZOjwE+1GVUh2C*15cM zj~TVa$Xr6$rI^els%5^i#ul!YT6J8MeSy*aq8uDL*q^nVXjP2GLi>rRF%2v0{X_(^uv{ zGgAjMllRQzUD~nC+Aieo_N2WBb1&?J{iK;e%fi$_7Q$yCd{*rMGBQvn5Bg@K-_3@5 zHr!@!mxFlLd#kkZu~bg#dQRMPdfaod z3rPIOn}lIn;jQuvM*cD1+}d&9%-RX^c?5k_z2nl)#Ufo9 zTWlk&ci+Ve{1;MRUgGx(Uc(#0yoGnz-{b!QKEj{y2|nZg1-_bfgfSrY@3<>JKc#{0 z$9EZ+Ht+#o@B@FagTqhShrF88FCTAh-nwsAayYVvZdY3h?xl@ATwkkTvlXc zgY1w4eRHByF2BOmF#2ZF$OCyHpI?#x;U+s-nS;l_02G8me#NNgnkwv9+E=-4FBS!Qv$gq{fcU(h*uhYq>m}%=Tv3=O7dK>e!+8J4)m!-^pc4KY}y(^e$ z%Whh4Tvi|)=k*iW6&Tz9 zoBz-9D|+-}O#<0f{C-ZO(m!;!!ifCJf74yuyfPT$Agh{R6;FIi=1Te%nO$nh6f9r2 z{6qE+|7xB*%X+C5NA68ao9yV7JX!LplSYtljep3o+$D{g|5HcH->YM-pYC_<|8c+T z{6oH#H<4fWCw;8?Q^T*`-()ae^Q-?48CIPUzXr7Pk|)M-W*ur6bzRH6ZWL7(waKrn zA=~H(Z0vrv>V@Sd^Zj*rE{^L>JoSP#BTx8r^a0{05b$#=? zMbx#WU(2X#A5$;caV`0=%A)}~)FbVN&)wWUSBF6Suz55BkFZ7)ba* zejU|dKj}XhYr;?%2E+Z@Qy<&YKDDQP>OfvQVDErk#$BOEWXu8@JJjVH5Np4`i@rKk zjX>^57zIzs(=(912<^!+>lGmT80CA0(Uj2`bRG-i{5q2k{S)?m<{Uy7%2eiyC9X|P zz<;7&CvB2nSME_)^y!K|*0^Iba;A{pRKG5KxgcS>Xw&?&m#V8^pL&Z?_dt{Ct|ul;?DK!!LwxT`<#d0d{}_& zg|Nu4rxpvp#q^)OsY6SUvlNz5<}&`zLdh=2z5=(EunJZaU*=lZU|$RCU_ESrjj##1 zGIy{U`xfk5F;n{XqI|6Wpn!};kg**a>g`l2QnK!eRX(zp@#ng?gZMjP7wiV9i+eEl z!amp!2axq0xd+iz>e3<1ESl668Ar>wgFWiF9f6~8435JI;>oz^Br;B6KMiL<%J3}Z zc8)SWPZ?eC>!n@vyRWiF=_+!)dpNA`b}o_E%Wws*`W;i(;5z&cH;`kEqge;D_113s z_0et-E)s4d_YUb>dqAxHA9wu>QewP^`#rc%xCihMy&l11ki7{{$b;-tc*^xV>fSTV z=YD;)7k>S;mwx@VSAGMu*M2gVAE>?Y8>GGU8?3$a8=}2Orw_>cNcc!?sFso075T#T zPty8?`)Ayx?tDSM>}8bq-LL2@WAH4ro3U6WmNk}de#0@D3-lXdUMqk3YJ%k;Cf#)Z zQRcX$vTZbG03R)nG2We7&W7P5U@fU><;fm7p^0@EdQY z)6{1Ie)O7z8_Iq2$F%!TG@nIzW`I@jb*-=I?#BHJ z`SkATX{b*zbqT~hT=geC+BQ?3#FKGeKQkXS=wE~UhoA*(o~CTt3(R0-i>wgBhVvDQ zl+P#1UGlVpa{ZC7srcdQKaF|1X*}E0c($i&(TVSUzm>GDw%%GNlkYfVP=28h1~DNP z$Ub-3rw|)^xc>~~d7r6J6~{kR#r2o^D(eQ;eU*I!Qg39hQEK#(9?+_PjE#{I9}=K{ zTy#q4KT~7X9{pybpEa(Pd9Orf8UDO>Am6_7-56i6_!IWJ&n1=EKSCuzPEwG4Ao3oS zj512@KiiZk^MWamlM+(FapoIRW2S+$#7T|3bpB42-hU1nicERml=e^NcdYh8!Zgt2 zOPQbj+4F)7sl(iL{O8dIiof+8oOeDuBf7M-$=5Yj+)SjofVyt&-(`m#X*bXo(DqvX znaNKU$O_pgBbjfPxl{ShD?74sKu(ac*9Y8l`7eyhr_ABWGu@JBEVsX=@{pG7LCl4m zyvWOErnQK=Z0VWbl(X0@chNf^WmmvcMg=hoL18EYMWGlJhZ0Z{N+G{AG^B2nA&s&i z^I+w0i_{LNUq~;faTg6Fy*sMB|2_4q{{!_K;beVPz5#5YE#ZAh{Qv7-T61j`kXw$p z717(;`zv#SOErh5>?+}(i9A#$OckgK)u1}=rC6Ux=D*BSR_KZTHF2*6wF#5X)SG!a z+@)WV{-v(}a-LtStm+Z2oX0PXwt_xa+@-ECmLk5)`?AeEDvXu4mDK0|D{m31ew1vh zulTn;GqPVs-dU|ZGqUbT`T5HiSdxZ!{#(kx(o5#Q%lWVNl&@8|UmwS)H10Xjk_|4mwF!gqnLTz7-+ltmA4X`8j4{#$sa_`U@9 z-u|-hVJmJn)d%|eZ{z6{eYR-D_@c~P2j2L|JP%_@WF#V=d!Rpd$@2hH?hfMF)Ielb z(xjEL=3fW-?_$nC}s*{+f;53|pvmkBYIn48Lfp{0;68c_- zD{vLA!F7-)7Y=<4gyL+Yp0tFQQd^FJTePkbkg z+$-6flbWwjE!k4%*rj1-4-y#mi)bNb!pP1}-6gE#???Y~iT;IpLs&ojB}`h{f;1qq z{RwY}V7_Rz+GOTF3G4jNupR#mV}?ND%6EFQx1>Mor$P8dvqz|4 z%n(>bzGQsGn@3dni!M@DG}0hOT$lFqW>ouGj(Rtq zd2VYw$KGJ-wCoL*ciEK48o_m3v;Df|$*1?*1@;b-j*QQ;`*^=&h(v$B)gsN}%!SAp zI1Mt=!V`6y_BK*WhhKWgV87$Jk9W0<+^6xzZ7maJ)_}5`i0%;{8JRJ&fUKv+Lnl6k zF!Qm(_YY55{ajA$`y+k=|9iBx@*VztuB4vk)w0^}Y1z;>J83i|KRN6Vw4C;bQSIg% z^v#8yUn!&9gv$f6*B~!$`GDaG;}U6C9(iP1ZB>4BD}cYWK?N}j*&j#s2{N{lXYU&_ z<@xzpeql4OgLuc2byUWv)Pth-Cp>RT6~kT}r2i^`S~C+W z%evz;tr%Z=%ULl=sTaQyrUF!iO7>S;WqT)1K{k=+7XLMvzu zZHPll%v{fVba{_1^8FqA9dVa&WQM4G=&Bvz+uJ{A9q`LV3hc2^9kF+U&LHoxooQ3L zVDC!Vbc62pk6I7=JFTbvPv#OnX>lP8WM5@3bnQ)8*bo`{r-oSyl4+7bvE_>AnV;>^=(C5`bUMB4e>3*foa1Isct@-nHK6@ES z|C2V<{z)5Vf3FRP5oY?#`PuX0=dD-r-Rd__ex(jEhDYboFoy85jx*Mb$G&&;9FKhh zOthC(lL%ww@4GhH{#Bb|mXFLgDLo^bVr8x(wyBf%Tr%C`Chv3J`)0_iiM-!M`AtO! z>z?}H$2ZY-UtON1*o2evpKkZVJwnZ}`(w7ov}5MMbYNb>bYix{4B(C0dS{wxcj?l8 z$({z8>zswIvtbUT=EMOR%g-g@jpH$L;v3Np{K z8@D}CZef(S)xPb;eV;w1dA%R|0f@n=3vwSyaq_}J(y``_!^xLYhwQQS^t{h{=aUbc zWf%uNn14k6QLc}HeBXcE46D=$uD5A%bs1NjME)r_4f1W)8O*bAj=1OHf<2xo>mv3` za2c-Pe-*C5b@<&LpK|oh9VMVH$n%#FH;sNvQ#b61bY|q#P15a2S>M8pM2?j4ZQ{%R zm^+wv!8#iNe=RZbo$3$T*L(IPx_lFohVqj!hLoecql+v_>^|}y5ceTG0_i6nV?L2| zw4~-edCIkn6{N0xr|)~lwaoQCr#xeELWP`%@B*D)!YksX=EMrQm#+yY^Db{N-{LO! z?j82`@WGyfd%$^9#QBr!Pw*MOz*l=p^yhms;(WKKGRtJ5mKrziq=WIFBaP{Hi_>2<@AK@a3w=B{lH^aWq=1AnlC1Dp^5E^tGjgR?uprDa5Ci9did7nmO;onZV! zFrz~Z!mvV2x)LS=th7S$3nQGAPfSN<^7MBZ5?|tGp$b>!8P5idF6QaJLN_a`NGH>ZYJb+&+M zrg9XdzS1uuCk><}PCCr=kO4Asoe3f!Gh~6RjzXrqRLINbC~VrZW1r_+#C%T0JqJjC zloM0Ng}EF>DFy8OB!YMFp#yLLdciB*PLrc8eVsC`-N-SFU~i1#4F;E6Hufc zg{q>&$q&WQr#L33CF;dE9YyMQ39d^ze&fDq>`l;ADTl@x4)R`H0bRtcBH=8*(vC`| zTNy`XOjhb0RWSJ$#ZlEXoBCA4WG{fDI;ON8HB7U-qoye%7Yk#*I%;{`YMbV7jyk59 z%U;)G)-%JVX3jIMe|^)ff}?@QZ0Io?ndU8W>usYdI+~bnl^jh?v$CU^CrooQOcnCQ z*-Ss#TYCIkdCb-xvyI1W>oMDT%=R9$gU9UXF*})McZ)TPs*V72f5%>GTv)+HRDz@<7uioVQVr{G zT8=(uxYEeI#h2I;uC$|{$Lw$VMaM6OLw4+WWe+sdtL+$sJl^Md-s(bU+Sfkz!T8x! zJ;xC0;vl^~^{4?fghpcOL(RCiIPFE`HAZ$5$8a;hi9GV9e(yC#m^$3z^cP=`dsD(T zgXYkJy6EOq7^zb&9S5|`oE$Zc_N5i>k-RU|LNM zbVIl9&;xoRL)IaCVegG!ALtAHaPN;f00uf_jLlv}+y=uC+=dc<80K&ofqf*%y!ubG&$U^dKwxrChu z^I-ujM3=b8Uxa-zEP82r_J zI`98{7eZVK7nhTa;&2M+EA)R2vV-Iees8hMxbL0AU%hw8S|9Hoj&SwSF-`x|abJCc z&$xeaXxdl!#`Sl{bcS7fmFAqG>rPoykbRZ1CzAJaC-YBE=E%XopCWoV#dQ9g&7}HzU7r~dSz`yP6YDqJ54~I5<(a9Wt~yN z_=7wJ(Saq#JqaX*WRM)>9NZN6r^G&%d$I&lAwM;w!AsgG4rHv})ly~d-=2%AdCKq?k<7>{O<~)tgxUhtIZx_&(%bK^$ zfy+7!&k|!x86TB&E<~o~*OF(Y6nQEQA2@YO&aWxsY|cr~v}x48vg9i+HhC_}anFB& z@=p1xm+w)rPhy|JZ^W$t6`_(DektSSrQ~<1ncv>%9(xDqh_0EqKb^44H@=-QyFgdy z2Hl|t^n?NIBbT!SWbECG>)zn)pZZ|$3;m!!@&~{`7zBf12n>Z`@Z*dF`fJK@IBp|g zB#eU5Fa|y4{DUSi7W+8ljz?EnOZfRLgb9S52$NtkOo6E|4W`2kkTcw5EoCP5k(jeE zXTuzri|l#Gy-GUsu`j^w6X6$PE`r6d1eU@wkiOB|PcG+r1#wmqeZiX){LaM=7IY=yDwM1m-Ks_9SLO;?G3yQ<$gW406x%oSt)DRoOT(It*e`x6V74 z>lb*wdUL|vMf@*0SL>JI3Ta-2YtFUWb?1HcJKP}cn@+cO3scUyElvL_dn%+|9Y`5R zlFn`NA>R$&!IXL|_wz3HKj0qR2RR%40s20KN9Zbj^hNo-f(w#e1#ak8gE-og0}Gl)P=C zP4t$BQ~3mJrj3^|h>W`;ly5*D#cKu{F~<8G&@eRY7Y9N2YAu_$`#3W2C zkoAz*#0iHu5EtS>d`JKZArT~oB#;!6L2^g|DIpc4hBS~C(m{I202v_@L_lW965v!> z1GX}s;8fYLXD8n|ASdL4+>i(ILO#e31<+I8cM1k$ zNAlf>j8kl?3gN4Q^^FPNv|&F_e}0DVN;?dlBY~sI@V9D zv}$o(8|r|YIml4bsf%6aXzF2#J~B5~AA196h>ne*F*-Nlx+ye+<{)J?ns2RIU~dVn z0;Z_e0aI0*fN832z%Keend6kX48Db-Uy|K%fo7g*|B=@o{W=h@BXok!&;`0eH;^;& zx(DpmIjI~uTlF5?m!8BKNZ)SFk@615b#LeceW9NzpFWUwuRm!Fz-=J12H`#!co{Lz zGZ}*WP#6Zoajyq;VFXD2M-pcgexpIw0LO4W7RCjXRpSF>ZiW31T+5!*iKH_LCc_lM zPsN;uoarzFX2L9(P53$Z&4qc`=M#1T?hCPpGfrBB`(jwa^-@>{%V7m!R>CS+jsF^0 z3+rG#Y(UON%uR&d46=h}3+2BR_ie=44#^pBPGC&11N&&qotV1<+N#|Fd#Iaxs5g7e zdef7*d+^%}`;aC1+mD$^lM_q#5^k@j?X<>^;oPH{=9!H9%(3AC;=QMgQ**MZ#xGZV z_CG+K7IVLT5Pc3ID^lyO4wLo~o{ghiAH!Xqq2rh*$j3=Dy?uHyPDOQdI_fE8%6RHD z<{3B(=Lma?^^5ZXth$Z~0|)s=t&>T1AYo)M`7GBZJY zjU4ay?}m1S`C2QT>$v|8Hwb?d9d98w5;^j#C%2J*2fEPy-wlxOJ!K6pLj4hNRF7`z zYUSk~VdOmI`^0^K{UPQfcnnXtw$2{5+UlpcJ%i`)f^w;YdX3u~cndN=EAu0=-ti8d zj24=eo-_ zu1mE0>|NlWv}Z9eLm>t4wQ`PK7~x_Mn3HMp#T&F8Fv)Iy)gD7 zP}Fr!FXlS07k3@hOSlf{C0$4KQp7C{We8W6Fy-JEC=b8FZ%_d$f}D+*0<#iSHuJ=J zL6}vc8gA902KJhmwV*cCfx1u+>O%u)2#ugIG=Zkj44Oj=Xo-wglv8W;Y6ERu7xZ@A zzxLdV4qSI6Oefa?)tNHxLfEcccZ2TG1A0O)*EMtft2g#O(3fy>-}_xSWnGZi7i{2n>Z`t{XfPyq{nn0V81)j7HBf#2E|YAea-C$GdLn*^n&b z+zI$kgh_;*3{zk#OoQpT&w!aQi|g4i2j;>&m=6nJAuJ-yVpxKGDJ;Xj9CHP%gjKK_ z*1%d=2kT)2Y=lj)8MeSy;^t(0w+(YU?7%G-edA8-yI?o$fxYC%#&?MOT!pm#*bhiJ zp8tccNS+wx^i2QTl$A9uI?T0{@g;SecM0z}R=$mq{@{*&#C2O8b%in~DBsA+80fBk zOwwa4bDX#`&X@S|?ZsL1+nhi26Fe&?T{2JgyMD^GTd!!_uAfH6G2S!IxNhrb@jD0S z;R0NQORlWyGV-n<`zm3tQ5UYeWR6MB8NIImPM906v+5??a{U;eM7lQXw_P%K5~}XF z@~FEmIWIa){XzI5&KvqY?(1dWNd3MmlJ@|~U#NP3{D<%eE|c&2JnzykJ*K`rL5BzA zrwYULr`Vstb9ezS;T61wy~aKLjqAStmUP~^9_a5)9UjttJS6pp^sNu|53Wc0N3#yg z{E3XhALIAf^!wBGQ2&JAc={(PKX&NR#{aC_Q{H`eUm-2NO47f$p6g#-FZ6e=m-J6B zk@FHcuk>%O*ZOzDFbGtdn|2xuSi`%}TCidF;l~7gLGpN*`y^*k`?>iwGq;?>{Zuc; zN#6#rp9Pt+H{&gR=v%Jea{Z1pXtR;y0C_%~m;vAdH|Yjq20=8p>`8jB2fII@`v>BG zFy+a6WeDN;+64EHxPLU=qodOl+UL8R7B2mH46Z{V3}S+mOKRTc4Neh{Mf})siPOVl zK^RCGTjlsr4|hM*4)HH(=%!(KR3BceB>$_QB1j3UXZt3PTaMoVdn$9{3jn?>B?8KchJQ zCER|7yyMiSZTYdL{_~o<)B(Ad{)UVbmVlJ-5tr zTVuicZfSQqY7MvtJ!n505~q>dX*7l=&=mJ(aF7$`o1;$){N?vvra?>Wt#E6N+&0h_ z7Bj!p&TXA>Ka%>{9=Bj~ACA0x$(n$ibs_J7GI!42WMp)7JB(tSYU>MOAbY7gk!EMo z??U{pZnxpXsrF%Dy=PkAW`%RgJ-RE_py7nWGn-dzyMXjb4;{Z|DPk zk=GCU!vGlQE~^H)qZ#w57lXMD_6atIxb14FI}n|u9|)mt(Z`}^I_~{&%5sD|I=a%& z;x-CK!x-X@g>mi}hV0!KkJ|*82$Ntkel^%XD0?BMxI-DO(AT05yC2MYI*l;X2_x?n zGq5*;nJ~*8(+ta@0_@v}We`Qpb{|r62s;=5c_8P^&Bt5-3tcn3!@d@(xW- z_ot7>@0L$Ebw8Z)3^(hk)GG-q^=v6}mr?G^-5s?R?l?Sq;RgGIjg`b(<&KLCxo)dg zyW{<2kM9kq)(~!Kl>byg3b0^Oj&7Ydo1_m%pr*TVdNb_hO9GL zvb-|V8i8h5dB0=)z%1O*qFo^M%d?VM1 zev>v>o#wfouRGNlOc_s|r3{MmE_TkHU-_zk`+dQT==^Vftie(zU0Nn1#=nMcJKC@n!zA1!a5H9j>l%ecc^lWaL*YI6akl+5C*hq|deb>Z_R6 z?;di7iu;VZfets3DgEXx%t*M6+Z_ld>|OF%0{b6u55N2FEXdBvb7iIPVvhEKJDVZD zGyLyqD_Yxj^M2XkznF}pY_J{N8&$Yn@H(MZMOYj9h@aG4s?D$!~A86e>2X6NmKRR)5 zPa9qWc>!W~=Obr%4Od`&-Z+ z=fB+(zKbBNy!UpZ?nMvGYs3i5XN01APNR?!M*Nr%3t|TrHo^n%>v14%U=iaxW3qVY z5+4#k!oZ@`sbW$0kSEJX^snj4`7;C9n>AUzcTZA@0_7gaz3|>cxnInS2hzHtpR~!5 zkQ93|NDe6=B}mP-A1_7N(oiO_^nW~Cr3~fKr7U43ALRne&~BBX zPL!ceNIUvf`vpH4hm7J`D3ATuz_RqQQfB4;BhT_|$vU{4uVp>IzY&*H9zD;S+^bMk zAuz925m=H^mC(I1`K$s}&3jvxdm!(>zfecy7ir3)S9!C~twz}R+}rAy@~#| zTk2*-p4)%Zx6*(3Rp!3Q9)7*F3N)efhu14pl8Ezm|d3 zj8=h+e%+dCjoF#~iEYp~oL~CM$S?f_LKw(+xh?*Q7&S@zoP^x9BV2p()PX#91lhCP z39~bF!97x|NqlcVF5`aoq~X^Mx|~2FIYE?7JC@IS#iZ$QzHG2`~}2pU>cs^T#IPHW{YC zRG0?SVFt{ESuh*sz+9LI^I-ujghj9zmcUY22FqautOQx3mo@!W*jK|ESPSc5J#2uD zun9K97T5~gV0&O~%J#21%U<#av~AIh&iJrqLcXFgK-fuMcR@lb++L%$u{$s?d$p|o zO1`1ogS>^b`U5C`DHCg-GHX-jx5w6gl)cE>hl~`IskBY|iE{uB;(iDY!x8-D_W_RL zehiLtebpxC)VEb90xvOQ@YW@nZ}WaTM82s*GVYgeF-{Wi6r6@L#FzQ}v)IqUdAI-< z;SyYiD{vLA!FBi@J#N5FxCN1L8}7heknxqQ^EP7L@CClYH~0=J$WLjYg8?@133|mhdVCLn-4Fc1 z9wgtpiEgj8*boNRyE$tf_&cM*$@iShqY=KL{z`M<5cVyFTw)^~rmEvz>_}I^Y*8NXn?5;leKIhAZoL zV`Gawr~%`BUBw}dxX6!(86OfrLP!LOAqjr>*ngN5`!MuRM%?6(0#f2v5w}#>Q)5p9 zX@eRv2A8zhuaA3r$N(Af%M|oli@=^4dltwl;mJ=n%lec5OXQW)hX|qd` z{z2SInPvV$bMZxOHhW#8H13veqEkbo3_2Fn>KkQokEGs|L+&p@O^oBd&5iOwEyy4H zx{x9D^fzQzfQnEFDnk|gl29&HDX(hSGifc2V18XK46J(B!l;g%8c-8z5w14z>Oftn z2lb%=G=xUb7@C-JTTw==^O5DB;84%~%5;2zwE2k;Oc!DDy=PvIFnhZpb?Ucqa418?CSyoV3)5&ncv z@EN|qSNI0sfrHr;2OuaN46uO@_<|q!gB={;gaB}X8v-E+qCqf(Ky-)!p%4Z!Ar{1j zaEJqOp$cv1fLkdU?_IUpzGg4~b?@MThAL1MszG(A0X3l()P_1x7wW-XZcBa42G9^1L1SnFO`#byhZfKhT0v`Q18t!l zw1*DR5jsI<=mK4#8+3;r&=Yz=Z|DPkp&#^z0Wc5-!C)8yLtz*UhY>ImM!{$p17l%a zw4AJSDm5OvJR=uqBdm9W_GX{a)Te{T?8v)iN7~qqW*gg6Yimr1*3Os+lVCDTfvGSJ zro#-F3A11}%z?Qu59Y%HSO|;IVR5wf#*%0qjHMj#wk%pF+Q&|$)yYh2c{Eug=uCgu z8Mn@++Y0m*JumT#m%b1N()O>!UEZ5kMGIA{qje=tSNyt~erxcP{SlY=bxdE})^feh zlug@&eS;adJ3X4^w=r4|Grok|1e?)q3uat?QIj_w%AU#N%u{XUN6W2wuU=7o z_crR=XU1jQF;^SCd6#GJEcTtS3wFaE*z1XVP4yvt+Bj2}zUJKCe(WOm8o$^n>r@BO z!_GMMAf^*j#u+_*thuQ}xE+qx-v}Z65#k+%V{jZ!z)3g-r{N5og>!HoF2F^&1ef6o zT!mnMA(Xc;@;e|Zzt^G-G-i=*dH5AXhwFs>9d5u)xCN1L8}7he_yg|2eRu#5;SoAN zCjU?1DLjMcxJzI00>78oU%_j518?CSVcz5S0Y1W?@CiOsmR~Tx!Z+;SfdiD4#t$0m zP=oO=g9YYsn57Knw-mvbYro)7v`ihXnX1ghY@Sl0Z^OhOFd}f;cG&mzRC*sc=sXX&^16gY@`i zfQ*m{A|NyIvJfvT{@J*`!kk`q>^UGO?ztd01f+;LfT9W=SZ8dub>GWuYAW0_BnSEB?PBrvg-jN>CZ9Kvj6ffTtQ^W&cTa%o?+)JY^qcs6HTQ;$!Y>hwhQx;a zQUP;p#7zX&nfd8WH~B`VExNXY_Q8i}Kdm{8Qv7PJd{Y!X%gsQ(!8{S?kj< zr^5`8`IDKXJqu=o%*D^aoD1_{KFIH9EI`+Vu!uN|aa#gQVHqsPZ3V0hzRT7e1dhTn>f>?Zp9q#dN9NB*(eGL9+e!RS!D%={xU+B$`+2wk7vU0I zhAVItuEBNq9d5u)xCN1L8}1dn`}jSo)i>^fxj$B4sm<=XWgqs?1@_=|*D5J!FCz zR^F9;kQ+(4tVaMMAP6!B@Z1%-IxV!LoLm;GLt|v8l zOoX}Dn1XEFL4JqEpEAhlGZnqOb6B!JT%LEvd(^!kyZdW~K$aL~O!^p@kwOApu zsF$M0Y$JBaY$H5`GfzX9$AEYc9}?h}5E6y-Rf$8U8A-4wg=CN%QiRMgQbH<7&2^fP z`+C}txkftlN)Ik=o{@nxGa^4V>4bsoMadN6R1vt9G53w!R+$N#CFHis8ZzI=7V<>T z9ulc?pttNT%ZVPjz}g4ISe~#kY<%;BUmo1^LO#e31@J2fg`hALfuc|hS;a#Z7$rg$ z8YQ7r$ReXO`j!FNFH{z@T!`!?;rDgXt$fI0#y^YEcd$pNAZ>3|OqrKX%|5hhAxo$SOOUq&d5ewe$gdHyl>I$Raa)R;j5S%u zK-XN%7uF(fZR~YCvg(E`GwMNobZZc@99heWw>(O>j{Iu4KZJpdVRKQ38iPtQou+cn3_Q+XnWiWfm?7(jmntRYh zehcI#CZ8)AC*5MTxF9F!XXF>h`Bg#ESVbCg4`ps>HGSo3+*X_E#$mR=`u%9u9Z0Jc zw1zg^|F(pe=cOHb%bHhvt~-RtTBkhMYpK_3k+T*#PE`hGuvf1mVLDN7*u7_T4q0V% z30Y%w#q1VxhdtQd=S=2`W!!Cj8`zyTqX+baUXYDvvp42U%3jtOW&XJj*L|TM^oId3 z&{LMr&F{~CoWIU28G9*Z4p+WIm9wvBvgRRe5_=EOkLFDc4vA1hkTDd7;WivbfP5o6 z61P$0S)O&P&0R;Cts}4N%rYAtvYz$9^<1y_lp*h5l-XF~jYFsL$dP&430zMM*+AS4 zgxz3W%Y-$EEwViPhqd1OlcrN72MSQRN-SRR&t{QW=htk}8$ diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 9c58d3db70..13e8096c5c 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -361,6 +361,7 @@ class BIM_PT_tabs(Panel): aprops = context.screen.BIMTabProperties row = self.layout.row() + row.alignment = "CENTER" row.operator( "bim.set_tab", text="", @@ -380,6 +381,7 @@ class BIM_PT_tabs(Panel): # Yes, that's right. row = self.layout.row() + row.alignment = "CENTER" row.scale_y = 0.2 for tab in [ "PROJECT", @@ -391,7 +393,6 @@ class BIM_PT_tabs(Panel): "SCHEDULING", "FM", "QUALITY", - "BLENDER", "SWITCH", ]: if aprops.tab == tab: From 1565575e8b8289f0e9bb582af232eb74f4a13f05 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 5 Jun 2024 15:47:55 +1000 Subject: [PATCH 405/429] Load spatial tree after new / open project --- src/blenderbim/blenderbim/bim/__init__.py | 2 +- src/blenderbim/blenderbim/bim/import_ifc.py | 2 + .../blenderbim/bim/module/project/operator.py | 2 + .../blenderbim/bim/module/spatial/__init__.py | 10 ++-- .../blenderbim/bim/module/spatial/data.py | 6 +-- .../blenderbim/bim/module/spatial/operator.py | 6 +-- .../blenderbim/bim/module/spatial/prop.py | 12 ++--- .../blenderbim/bim/module/spatial/ui.py | 20 +++---- src/blenderbim/blenderbim/bim/ui.py | 6 +-- src/blenderbim/blenderbim/core/spatial.py | 12 ++--- src/blenderbim/blenderbim/core/tool.py | 2 +- src/blenderbim/blenderbim/tool/spatial.py | 52 +++++++++++++++---- 12 files changed, 83 insertions(+), 49 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 6d2ef80a55..da0e078ee0 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -142,7 +142,7 @@ classes = [ ui.BIM_PT_tabs, # Project overview ui.BIM_PT_tab_project_info, - ui.BIM_PT_tab_project_tree, + ui.BIM_PT_tab_spatial_decomposition, ui.BIM_PT_tab_project_setup, ui.BIM_PT_tab_geometry, ui.BIM_PT_tab_stakeholders, diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 90c06e2d51..83658f0b78 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -37,6 +37,7 @@ import ifcopenshell.util.placement import ifcopenshell.util.representation import ifcopenshell.util.shape import blenderbim.tool as tool +import blenderbim.core.spatial import ifcopenshell.ifcopenshell_wrapper as ifcopenshell_wrapper from itertools import chain, accumulate from blenderbim.bim.ifc import IfcStore, IFC_CONNECTED_TYPE @@ -301,6 +302,7 @@ class IfcImporter: self.setup_viewport_camera() self.setup_arrays() self.profile_code("Setup arrays") + blenderbim.core.spatial.import_spatial_decomposition(tool.Spatial) self.update_progress(100) bpy.context.window_manager.progress_end() diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 8f44c76f8f..2e6cd2b164 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -36,6 +36,7 @@ import blenderbim.tool as tool import blenderbim.core.project as core import blenderbim.core.context import blenderbim.core.owner +import blenderbim.core.spatial from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ui import IFCFileSelector from blenderbim.bim import import_ifc @@ -122,6 +123,7 @@ class CreateProject(bpy.types.Operator): for mat in bpy.data.materials: bpy.data.materials.remove(mat) core.create_project(tool.Ifc, tool.Project, schema=props.export_schema, template=template) + blenderbim.core.spatial.import_spatial_decomposition(tool.Spatial) tool.Blender.register_toolbar() def rollback(self, data): diff --git a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py index 3aab40cbfc..033d7349c0 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py @@ -30,7 +30,7 @@ classes = ( operator.EditContainerAttributes, operator.EnableEditingContainer, operator.ExpandContainer, - operator.LoadContainerManager, + operator.ImportSpatialDecomposition, operator.ReferenceStructure, operator.RemoveContainer, operator.SelectContainer, @@ -42,12 +42,12 @@ classes = ( prop.BIMSpatialProperties, prop.BIMObjectSpatialProperties, prop.BIMContainer, - prop.BIMProjectTreeProperties, + prop.BIMSpatialDecompositionProperties, ui.BIM_PT_spatial, ui.BIM_UL_containers, ui.BIM_UL_containers_manager, ui.BIM_UL_elements, - ui.BIM_PT_project_tree, + ui.BIM_PT_spatial_decomposition, workspace.Hotkey, ) @@ -57,7 +57,7 @@ def register(): bpy.utils.register_tool(workspace.SpatialTool, after={"bim.annotation_tool"}, separator=False, group=False) bpy.types.Scene.BIMSpatialProperties = bpy.props.PointerProperty(type=prop.BIMSpatialProperties) bpy.types.Object.BIMObjectSpatialProperties = bpy.props.PointerProperty(type=prop.BIMObjectSpatialProperties) - bpy.types.Scene.BIMProjectTreeProperties = bpy.props.PointerProperty(type=prop.BIMProjectTreeProperties) + bpy.types.Scene.BIMSpatialDecompositionProperties = bpy.props.PointerProperty(type=prop.BIMSpatialDecompositionProperties) def unregister(): @@ -65,4 +65,4 @@ def unregister(): bpy.utils.unregister_tool(workspace.SpatialTool) del bpy.types.Scene.BIMSpatialProperties del bpy.types.Object.BIMObjectSpatialProperties - del bpy.types.Scene.BIMProjectTreeProperties + del bpy.types.Scene.BIMSpatialDecompositionProperties diff --git a/src/blenderbim/blenderbim/bim/module/spatial/data.py b/src/blenderbim/blenderbim/bim/module/spatial/data.py index b31545860d..5b82cdccad 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/data.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/data.py @@ -23,7 +23,7 @@ import ifcopenshell.util.element def refresh(): SpatialData.is_loaded = False - ProjectTreeData.is_loaded = False + SpatialDecompositionData.is_loaded = False class SpatialData: @@ -84,7 +84,7 @@ class SpatialData: return bool(getattr(tool.Ifc.get_entity(bpy.context.active_object), "ContainedInStructure", False)) -class ProjectTreeData: +class SpatialDecompositionData: data = {} is_loaded = False @@ -98,7 +98,7 @@ class ProjectTreeData: @classmethod def subelement_class(cls): results = [] - props = bpy.context.scene.BIMProjectTreeProperties + props = bpy.context.scene.BIMSpatialDecompositionProperties if not (container := props.active_container): return results container_class = tool.Ifc.get().by_id(container.ifc_definition_id).is_a() diff --git a/src/blenderbim/blenderbim/bim/module/spatial/operator.py b/src/blenderbim/blenderbim/bim/module/spatial/operator.py index 1441bbc18a..9d4038c5e2 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/operator.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/operator.py @@ -175,13 +175,13 @@ class SelectProduct(bpy.types.Operator): return {"FINISHED"} -class LoadContainerManager(bpy.types.Operator): - bl_idname = "bim.load_container_manager" +class ImportSpatialDecomposition(bpy.types.Operator): + bl_idname = "bim.import_spatial_decomposition" bl_label = "Load Container Manager" bl_options = {"REGISTER", "UNDO"} def execute(self, context): - core.load_container_manager(tool.Spatial) + core.import_spatial_decomposition(tool.Spatial) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/spatial/prop.py b/src/blenderbim/blenderbim/bim/module/spatial/prop.py index b4586b01a0..b4badb994b 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/prop.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/prop.py @@ -18,7 +18,7 @@ import bpy from blenderbim.bim.prop import StrProperty, Attribute -from blenderbim.bim.module.spatial.data import ProjectTreeData +from blenderbim.bim.module.spatial.data import SpatialDecompositionData from bpy.types import PropertyGroup from bpy.props import ( PointerProperty, @@ -35,9 +35,9 @@ import ifcopenshell def get_subelement_class(self, context): - if not ProjectTreeData.is_loaded: - ProjectTreeData.load() - return ProjectTreeData.data["subelement_class"] + if not SpatialDecompositionData.is_loaded: + SpatialDecompositionData.load() + return SpatialDecompositionData.data["subelement_class"] def update_elevation(self, context): @@ -55,7 +55,7 @@ def update_name(self, context): def update_active_container_index(self, context): - ProjectTreeData.data["subelement_class"] = ProjectTreeData.subelement_class() + SpatialDecompositionData.data["subelement_class"] = SpatialDecompositionData.subelement_class() tool.Spatial.load_contained_elements() @@ -122,7 +122,7 @@ class Element(PropertyGroup): total: IntProperty(name="Total") -class BIMProjectTreeProperties(PropertyGroup): +class BIMSpatialDecompositionProperties(PropertyGroup): containers: CollectionProperty(name="Containers", type=BIMContainer) contracted_containers: StringProperty(name="Contracted containers", default="[]") expanded_containers: StringProperty(name="Expanded containers", default="[]") diff --git a/src/blenderbim/blenderbim/bim/module/spatial/ui.py b/src/blenderbim/blenderbim/bim/module/spatial/ui.py index 9593cbeea1..da7a761af9 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/ui.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/ui.py @@ -17,7 +17,7 @@ # along with BlenderBIM Add-on. If not, see . from bpy.types import Panel, UIList -from blenderbim.bim.module.spatial.data import SpatialData, ProjectTreeData +from blenderbim.bim.module.spatial.data import SpatialData, SpatialDecompositionData import blenderbim.tool as tool @@ -91,13 +91,13 @@ class BIM_UL_containers(UIList): ) -class BIM_PT_project_tree(Panel): - bl_label = "Project Tree" - bl_idname = "BIM_PT_project_tree" +class BIM_PT_spatial_decomposition(Panel): + bl_label = "Spatial Decomposition" + bl_idname = "BIM_PT_spatial_decomposition" bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" bl_context = "scene" - bl_parent_id = "BIM_PT_tab_project_tree" + bl_parent_id = "BIM_PT_tab_spatial_decomposition" bl_options = {"HIDE_HEADER"} @classmethod @@ -105,9 +105,9 @@ class BIM_PT_project_tree(Panel): return tool.Ifc.get() def draw(self, context): - if not ProjectTreeData.is_loaded: - ProjectTreeData.load() - self.props = context.scene.BIMProjectTreeProperties + if not SpatialDecompositionData.is_loaded: + SpatialDecompositionData.load() + self.props = context.scene.BIMSpatialDecompositionProperties if self.props.active_container: row = self.layout.row(align=True) @@ -115,7 +115,7 @@ class BIM_PT_project_tree(Panel): text=f"Active: {self.props.active_container.name}", icon="OUTLINER_COLLECTION", ) - row.operator("bim.load_container_manager", icon="FILE_REFRESH", text="") + row.operator("bim.import_spatial_decomposition", icon="FILE_REFRESH", text="") if self.props.active_container.ifc_class != "IfcProject": row = self.layout.row(align=True) @@ -132,7 +132,7 @@ class BIM_PT_project_tree(Panel): else: row = self.layout.row(align=True) row.label(text="Warning: No Active Container", icon="ERROR") - row.operator("bim.load_container_manager", icon="FILE_REFRESH", text="") + row.operator("bim.import_spatial_decomposition", icon="FILE_REFRESH", text="") self.layout.template_list( "BIM_UL_containers_manager", diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 13e8096c5c..d38a3eea15 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -440,15 +440,15 @@ class BIM_PT_tab_project_info(Panel): pass -class BIM_PT_tab_project_tree(Panel): - bl_label = "Project Tree" +class BIM_PT_tab_spatial_decomposition(Panel): + bl_label = "Spatial Decomposition" bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" bl_context = "scene" @classmethod def poll(cls, context): - return tool.Blender.is_tab(context, "PROJECT") + return tool.Blender.is_tab(context, "PROJECT") and tool.Ifc.get() def draw(self, context): pass diff --git a/src/blenderbim/blenderbim/core/spatial.py b/src/blenderbim/blenderbim/core/spatial.py index 8a45ff8225..bc22396a28 100644 --- a/src/blenderbim/blenderbim/core/spatial.py +++ b/src/blenderbim/blenderbim/core/spatial.py @@ -120,28 +120,28 @@ def select_product(spatial, product): spatial.select_products([product]) -def load_container_manager(spatial): - spatial.load_container_manager() +def import_spatial_decomposition(spatial): + spatial.import_spatial_decomposition() def edit_container_attributes(spatial, entity=None): spatial.edit_container_attributes(entity) - spatial.load_container_manager() + spatial.import_spatial_decomposition() def contract_container(spatial, container=None): spatial.contract_container(container) - spatial.load_container_manager() + spatial.import_spatial_decomposition() def expand_container(spatial, container=None): spatial.expand_container(container) - spatial.load_container_manager() + spatial.import_spatial_decomposition() def delete_container(ifc, spatial, geometry, container=None): geometry.delete_ifc_object(ifc.get_object(container)) - spatial.load_container_manager() + spatial.import_spatial_decomposition() def select_decomposed_elements(spatial): diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index f995b81e49..59cdff7fc4 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -848,7 +848,7 @@ class Spatial: def get_selected_product_types(cls): pass def get_selected_products(cls): pass def import_containers(cls, parent=None): pass - def load_container_manager(cls): pass + def import_spatial_decomposition(cls): pass def run_root_copy_class(cls, obj=None): pass def run_spatial_assign_container(cls, structure_obj=None, element_obj=None): pass def select_object(cls, obj): pass diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index a0fc21364d..5c9fa44ff9 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -208,7 +208,7 @@ class Spatial(blenderbim.core.tool.Spatial): @classmethod def load_contained_elements(cls): - props = bpy.context.scene.BIMProjectTreeProperties + props = bpy.context.scene.BIMSpatialDecompositionProperties props.elements.clear() if not (container := props.active_container): return @@ -241,17 +241,17 @@ class Spatial(blenderbim.core.tool.Spatial): props.total_elements = total_elements @classmethod - def load_container_manager(cls): - props = bpy.context.scene.BIMProjectTreeProperties + def import_spatial_decomposition(cls): + props = bpy.context.scene.BIMSpatialDecompositionProperties previous_container_index = props.active_container_index props.containers.clear() cls.contracted_containers = json.loads(props.contracted_containers) - cls.import_spatial_structure(tool.Ifc.get().by_type("IfcProject")[0], 0) + cls.import_spatial_element(tool.Ifc.get().by_type("IfcProject")[0], 0) props.active_container_index = min(previous_container_index, len(props.containers) - 1) @classmethod - def import_spatial_structure(cls, element, level_index): - props = bpy.context.scene.BIMProjectTreeProperties + def import_spatial_element(cls, element, level_index): + props = bpy.context.scene.BIMSpatialDecompositionProperties new = props.containers.add() new.ifc_class = element.is_a() new.name = element.Name or "Unnamed" @@ -266,14 +266,14 @@ class Spatial(blenderbim.core.tool.Spatial): new.ifc_definition_id = element.id() if new.is_expanded: for child in children or []: - cls.import_spatial_structure(child, level_index + 1) + cls.import_spatial_element(child, level_index + 1) @classmethod def edit_container_attributes(cls, entity): # TODO obj = tool.Ifc.get_object(entity) blenderbim.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj) - name = bpy.context.scene.BIMProjectTreeProperties.container_name + name = bpy.context.scene.BIMSpatialDecompositionProperties.container_name if name != entity.Name: cls.edit_container_name(entity, name) @@ -283,21 +283,21 @@ class Spatial(blenderbim.core.tool.Spatial): @classmethod def get_active_container(cls): - props = bpy.context.scene.BIMProjectTreeProperties + props = bpy.context.scene.BIMSpatialDecompositionProperties if props.active_container_index < len(props.containers): container = tool.Ifc.get().by_id(props.containers[props.active_container_index].ifc_definition_id) return container @classmethod def contract_container(cls, container): - props = bpy.context.scene.BIMProjectTreeProperties + props = bpy.context.scene.BIMSpatialDecompositionProperties contracted_containers = json.loads(props.contracted_containers) contracted_containers.append(container.id()) props.contracted_containers = json.dumps(contracted_containers) @classmethod def expand_container(cls, container): - props = bpy.context.scene.BIMProjectTreeProperties + props = bpy.context.scene.BIMSpatialDecompositionProperties contracted_containers = json.loads(props.contracted_containers) contracted_containers.remove(container.id()) props.contracted_containers = json.dumps(contracted_containers) @@ -322,6 +322,36 @@ class Spatial(blenderbim.core.tool.Spatial): space_polygon = shapely.force_3d(polygon) return space_polygon + @classmethod + def debug_shape(cls, foo): + coords = [(p[0], p[1], 0) for p in foo.exterior.coords] + mesh = bpy.data.meshes.new(name="NewMesh") + bm = bmesh.new() + for coord in coords: + bm.verts.new(coord) + bm.verts.ensure_lookup_table() + bm.faces.new(bm.verts) + bm.to_mesh(mesh) + bm.free() + obj = bpy.data.objects.new("NewObject", mesh) + bpy.context.collection.objects.link(obj) + bpy.context.view_layer.update() + + @classmethod + def debug_line(cls, start, end): + coords = [start, end] + mesh = bpy.data.meshes.new(name="NewMesh") + bm = bmesh.new() + for coord in coords: + bm.verts.new(coord) + bm.verts.ensure_lookup_table() + bm.edges.new(bm.verts) + bm.to_mesh(mesh) + bm.free() + obj = bpy.data.objects.new("NewLine", mesh) + bpy.context.collection.objects.link(obj) + bpy.context.view_layer.update() + @classmethod def get_boundary_lines_from_context_visible_objects(cls): calculation_rl = bpy.context.scene.BIMModelProperties.rl3 From 8b69ea464f1b146758a7ec3bc40374a20f69ea81 Mon Sep 17 00:00:00 2001 From: Gorgious56 Date: Wed, 5 Jun 2024 08:19:29 +0200 Subject: [PATCH 406/429] Fix variable name in code example --- .../docs/ifcopenshell-python/geometry_tree.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_tree.rst b/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_tree.rst index 0069dd341b..78421578f0 100644 --- a/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_tree.rst +++ b/src/ifcopenshell-python/docs/ifcopenshell-python/geometry_tree.rst @@ -335,8 +335,8 @@ multiple times. results = tree.select_ray(origin, direction, length=5.) for result in results: - print(ifc_file.by_id(r.instance.id())) # The element the ray intersects with - print(list(r.position)) # The XYZ intersection point - print(r.distance) # The distance between the ray origin and the intersection - print(list(r.normal)) # The normal of the face being intersected - print(r.dot_product) # The dot product of the face being intersected with the ray + print(ifc_file.by_id(result.instance.id())) # The element the ray intersects with + print(list(result.position)) # The XYZ intersection point + print(result.distance) # The distance between the ray origin and the intersection + print(list(result.normal)) # The normal of the face being intersected + print(result.dot_product) # The dot product of the face being intersected with the ray From b92e78b137a2bf11ec49228c3dcb116b5a5eefa1 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Wed, 5 Jun 2024 07:43:17 -0500 Subject: [PATCH 407/429] added styles search --- src/blenderbim/blenderbim/bim/module/material/ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/ui.py b/src/blenderbim/blenderbim/bim/module/material/ui.py index 1db1c7953d..5861ad398a 100644 --- a/src/blenderbim/blenderbim/bim/module/material/ui.py +++ b/src/blenderbim/blenderbim/bim/module/material/ui.py @@ -110,7 +110,7 @@ class BIM_PT_materials(Panel): elif self.props.editing_material_type == "STYLE": row = self.layout.row(align=True) row.prop(self.props, "contexts", text="") - row.prop(self.props, "styles", text="") + prop_with_search(row, self.props, "styles", text="") row = self.layout.row(align=True) row.operator("bim.edit_material_style", text="Assign Style", icon="CHECKMARK") row.operator("bim.disable_editing_material", text="", icon="CANCEL") From b57a1e5ea898241cd11489a9c044291bbad3d455 Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Wed, 5 Jun 2024 08:12:22 -0500 Subject: [PATCH 408/429] Adding a 'magic_font_scale' https://community.osarch.org/discussion/2202/blenderbim-edit-text-preview-size --- src/blenderbim/blenderbim/bim/module/drawing/decoration.py | 6 ++++-- src/blenderbim/blenderbim/bim/module/drawing/prop.py | 1 + src/blenderbim/blenderbim/bim/ui.py | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/decoration.py b/src/blenderbim/blenderbim/bim/module/drawing/decoration.py index f4da0e15fb..e085198ed4 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/decoration.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/decoration.py @@ -415,12 +415,14 @@ class BaseDecorator: factor = self.camera_zoom_to_factor(context.space_data.region_3d.view_camera_zoom) camera_width_px = factor * context.region.width mm_to_px = camera_width_px / self.get_camera_width_mm() - # 0.004118616 is a magic constant number I visually discovered to get the right number. + # magic_font_scale's default of (0.004118616) is a magic constant number I visually discovered to get the right number. # In particular it works only for the OpenGOST font and produces a 2.5mm font size. # It probably should be dynamically calculated using system.dpi or something. # font_size = 16 <-- this is a good default # TODO: need to synchronize it better with svg - font_size_px = int(0.004118616 * mm_to_px) * font_size_mm / 2.5 + + magic_font_scale = bpy.context.scene.DocProperties.magic_font_scale + font_size_px = int(magic_font_scale * mm_to_px) * font_size_mm / 2.5 pos = pos - line_no * font_size_px * rotation_matrix[1] blf.size(font_id, font_size_px) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/prop.py b/src/blenderbim/blenderbim/bim/module/drawing/prop.py index db0806ae16..86bcb65c4f 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/prop.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/prop.py @@ -370,6 +370,7 @@ class DocProperties(PropertyGroup): ) shadingstyle_default: StringProperty(default="Blender Default", name="Default Shading Style") drawing_font: StringProperty(default="OpenGost Type B TT.ttf", name="Drawing Font") + magic_font_scale: bpy.props.FloatProperty(default=0.004118616, name="Font Scale Factor") class BIMCameraProperties(PropertyGroup): diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index d38a3eea15..0a97b514f2 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -341,6 +341,8 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): row.prop(context.scene.DocProperties, "shadingstyle_default") row = self.layout.row() row.prop(context.scene.DocProperties, "drawing_font") + row = self.layout.row() + row.prop(context.scene.DocProperties, "magic_font_scale") # Scene panel groups From 802e1966fd8dfc2b3a2e86ea81e702e90ec109df Mon Sep 17 00:00:00 2001 From: Ryan Schultz Date: Wed, 5 Jun 2024 08:21:28 -0500 Subject: [PATCH 409/429] small tweak --- src/blenderbim/blenderbim/bim/ui.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 0a97b514f2..58dd962246 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -341,7 +341,6 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): row.prop(context.scene.DocProperties, "shadingstyle_default") row = self.layout.row() row.prop(context.scene.DocProperties, "drawing_font") - row = self.layout.row() row.prop(context.scene.DocProperties, "magic_font_scale") From cfd0ed60cf9e35e32ae25cda0d0f6a36a1c61c5c Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 5 Jun 2024 23:59:47 +1000 Subject: [PATCH 410/429] Reduce (arbitrary) element checking threshold down to 3 for georef guessing. --- src/blenderbim/blenderbim/bim/import_ifc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 83658f0b78..9810d39f82 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -689,7 +689,7 @@ class IfcImporter: def get_offset_point(self) -> Union[npt.NDArray[np.float64], None]: elements_checked = 0 # If more than these elements aren't far away, the file probably isn't absolutely positioned - element_checking_threshold = 10 + element_checking_threshold = 3 for element in self.file.by_type("IfcElement"): if not element.Representation: continue From 98ec3e2301e9d9c9586b99219e5b876462a990b1 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 6 Jun 2024 11:54:07 +1000 Subject: [PATCH 411/429] Fix #4677. Fix #4809. Major improvement to local session offset during project loading (see description) This improves four things: 1. Previously, we either used OBJECT_PLACEMENT or CARTESIAN_POINT, but couldn't handle scenarios where simultaneously both the placement and the coords were rubbish for a single object. Now we offset all far cartesian points, so it consistently works and we keep track of a per-object offset. 2. Previously, we applied the georeferencing conversion on every cartesian point which was very slow. The new method uses a simple XYZ translation which is super fast. 3. We now use numpy which should be much faster too. 4. Previously, objects were selectively offset based on whether they fell outside the distance limit. Now, we uniformly treat all non-geometric elements at 0,0,0 as insignificant positionally. This fixes the issue where half the model is offset and the other half isn't, but maintains the fix for situations where the site (typically) is at 0,0,0 and everything else is map coords. --- src/blenderbim/blenderbim/bim/import_ifc.py | 127 ++++++++------------ 1 file changed, 53 insertions(+), 74 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 9810d39f82..4a31abfe34 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -743,18 +743,29 @@ class IfcImporter: def apply_blender_offset_to_matrix_world(self, obj: bpy.types.Object, matrix: np.ndarray) -> mathutils.Matrix: props = bpy.context.scene.BIMGeoreferenceProperties if props.has_blender_offset: - if obj.data and obj.data.get("has_cartesian_point_offset", None): + if not obj.data and tool.Cad.is_x(matrix[0][3], 0) and tool.Cad.is_x(matrix[1][3], 0) and tool.Cad.is_x(matrix[2][3], 0): + # We assume any non-geometric matrix at 0,0,0 is not + # positionally significant and is left alone. This handles + # scenarios where often spatial elements are left at 0,0,0 and + # everything else is at map coordinates. + return mathutils.Matrix(matrix.tolist()) + elif obj.data and obj.data.get("has_cartesian_point_offset", None): obj.BIMObjectProperties.blender_offset_type = "CARTESIAN_POINT" - elif self.is_point_far_away((matrix[:3, 3])): + if cartesian_point_offset := obj.data.get("cartesian_point_offset", None): + offset_x, offset_y, offset_z = map(float, cartesian_point_offset.split(",")) + matrix[0][3] += offset_x + matrix[1][3] += offset_y + matrix[2][3] += offset_z + else: obj.BIMObjectProperties.blender_offset_type = "OBJECT_PLACEMENT" - matrix = ifcopenshell.util.geolocation.global2local( - matrix, - float(props.blender_eastings) * self.unit_scale, - float(props.blender_northings) * self.unit_scale, - float(props.blender_orthogonal_height) * self.unit_scale, - float(props.blender_x_axis_abscissa), - float(props.blender_x_axis_ordinate), - ) + matrix = ifcopenshell.util.geolocation.global2local( + matrix, + float(props.blender_eastings) * self.unit_scale, + float(props.blender_northings) * self.unit_scale, + float(props.blender_orthogonal_height) * self.unit_scale, + float(props.blender_x_axis_abscissa), + float(props.blender_x_axis_ordinate), + ) return mathutils.Matrix(matrix.tolist()) @@ -1201,7 +1212,6 @@ class IfcImporter: styles.extend(style.Styles) def create_native_faceted_brep(self, element, mesh_name, native_data): - # TODO: georeferencing? # co [x y z x y z x y z ...] # vertex_index [i i i i i ...] # loop_start [0 3 6 9 ...] (for tris) @@ -1226,45 +1236,27 @@ class IfcImporter: mesh = bpy.data.meshes.new("Native") props = bpy.context.scene.BIMGeoreferenceProperties - mat = ifcopenshell.util.placement.get_local_placement(element.ObjectPlacement) if props.has_blender_offset and self.is_point_far_away(self.mesh_data["co"][0:3], is_meters=False): - offset_point = np.linalg.inv(mat) @ np.array( - ( - float(props.blender_eastings), - float(props.blender_northings), - float(props.blender_orthogonal_height), - 0.0, - ) - ) - verts = [None] * len(self.mesh_data["co"]) - for i in range(0, len(self.mesh_data["co"]), 3): - verts[i], verts[i + 1], verts[i + 2], _ = native_data["matrix"] @ mathutils.Vector( - ( - *ifcopenshell.util.geolocation.enh2xyz( - self.mesh_data["co"][i] * self.unit_scale, - self.mesh_data["co"][i + 1] * self.unit_scale, - self.mesh_data["co"][i + 2] * self.unit_scale, - offset_point[0] * self.unit_scale, - offset_point[1] * self.unit_scale, - offset_point[2] * self.unit_scale, - float(props.blender_x_axis_abscissa), - float(props.blender_x_axis_ordinate), - ), - 1, - ) - ) + verts_array = np.array(self.mesh_data["co"]) + verts_array *= self.unit_scale + offset_x, offset_y, offset_z = verts_array[0:3] + offset = np.array([-offset_x, -offset_y, -offset_z]) + offset_verts = verts_array + np.tile(offset, len(verts_array) // 3) + + if np.allclose(native_data["matrix"], np.identity(4), atol=1e-8): + verts = offset_verts.tolist() + else: + verts = self.apply_matrix_to_flat_coords(offset_verts, native_data["matrix"]) + mesh["has_cartesian_point_offset"] = True + mesh["cartesian_point_offset"] = f"{offset_x},{offset_y},{offset_z}" else: - verts = [None] * len(self.mesh_data["co"]) - for i in range(0, len(self.mesh_data["co"]), 3): - verts[i], verts[i + 1], verts[i + 2], _ = native_data["matrix"] @ mathutils.Vector( - ( - self.mesh_data["co"][i] * self.unit_scale, - self.mesh_data["co"][i + 1] * self.unit_scale, - self.mesh_data["co"][i + 2] * self.unit_scale, - 1, - ) - ) + verts_array = np.array(self.mesh_data["co"]) + verts_array *= self.unit_scale + if np.allclose(native_data["matrix"], np.identity(4), atol=1e-8): + verts = verts_array.tolist() + else: + verts = self.apply_matrix_to_flat_coords(verts_array, native_data["matrix"]) mesh["has_cartesian_point_offset"] = False mesh.vertices.add(self.mesh_data["total_verts"]) @@ -1281,6 +1273,13 @@ class IfcImporter: mesh["ios_material_ids"] = self.mesh_data["material_ids"] return mesh + def apply_matrix_to_flat_coords(self, coords, matrix): + coords_array = np.array(coords).reshape(-1, 3) + ones = np.ones((coords_array.shape[0], 1)) + homogeneous_coords = np.hstack([coords_array, ones]) + transformed_coords = homogeneous_coords @ matrix.T + return transformed_coords[:, :3].flatten().tolist() + def convert_representation_item_face_based_surface_model(self, item): mesh = item.get_info_2(recursive=True) for face_set in mesh["FbsmFaces"]: @@ -1924,34 +1923,14 @@ class IfcImporter: and geometry.verts and self.is_point_far_away((geometry.verts[0], geometry.verts[1], geometry.verts[2])) ): - offset_point = np.array( - ( - float(props.blender_eastings), - float(props.blender_northings), - float(props.blender_orthogonal_height), - 0.0, - ) - ) - if geometry != shape: - m = shape.transformation.matrix.data - mat = np.array( - ([m[0], m[3], m[6], m[9]], [m[1], m[4], m[7], m[10]], [m[2], m[5], m[8], m[11]], [0, 0, 0, 1]) - ) - offset_point = np.linalg.inv(mat) @ offset_point - verts = [None] * len(geometry.verts) - for i in range(0, len(geometry.verts), 3): - # Note: this enh2xyz call is crazy slow. - verts[i], verts[i + 1], verts[i + 2] = ifcopenshell.util.geolocation.enh2xyz( - geometry.verts[i], - geometry.verts[i + 1], - geometry.verts[i + 2], - offset_point[0] * self.unit_scale, - offset_point[1] * self.unit_scale, - offset_point[2] * self.unit_scale, - float(props.blender_x_axis_abscissa), - float(props.blender_x_axis_ordinate), - ) + # Shift geometry close to the origin based off that first vert it found + verts_array = np.array(geometry.verts) + offset = np.array([-geometry.verts[0], -geometry.verts[1], -geometry.verts[2]]) + offset_verts = verts_array + np.tile(offset, len(verts_array) // 3) + verts = offset_verts.tolist() + mesh["has_cartesian_point_offset"] = True + mesh["cartesian_point_offset"] = f"{geometry.verts[0]},{geometry.verts[1]},{geometry.verts[2]}" else: verts = geometry.verts mesh["has_cartesian_point_offset"] = False From afe7d526a5530860f3f3cabd597a357e75ac8031 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Sun, 14 Apr 2024 21:18:35 +0200 Subject: [PATCH 412/429] BBIM, bcf, fix if either project or project name is missing in bcf --- .../blenderbim/bim/module/bcf/operator.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/bcf/operator.py b/src/blenderbim/blenderbim/bim/module/bcf/operator.py index dd39130483..8d0e5d3ba4 100644 --- a/src/blenderbim/blenderbim/bim/module/bcf/operator.py +++ b/src/blenderbim/blenderbim/bim/module/bcf/operator.py @@ -59,6 +59,20 @@ class LoadBcfProject(bpy.types.Operator): if self.filepath: bcfstore.BcfStore.set_by_filepath(self.filepath) bcfxml = bcfstore.BcfStore.get_bcfxml() + # a BCFv2.1 does not need to have a project, but BBIM likes to have one + # https://github.com/buildingSMART/BCF-XML/tree/release_2_1/Documentation#bcf-file-structure + nameless = "Unknown" + if bcfxml.project is None: + if bcfxml.version.version_id.startswith("2"): + print("No project, we will create one for BBIM.") + bcfxml.project_info = bcf.v2.model.ProjectExtension( + project=bcf.v2.model.Project( + name=nameless, + project_id=str(uuid.uuid4()) + ), extension_schema="" + ) + if bcfxml.project.name is None: + bcfxml.project.name = nameless context.scene.BCFProperties.name = bcfxml.project.name bpy.ops.bim.load_bcf_topics() return {"FINISHED"} From 84d475cfd3480b4d4038e165a73d8f1c56c5aa60 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Sun, 14 Apr 2024 21:25:29 +0200 Subject: [PATCH 413/429] BBIM, bcf, fix setting the viewpoint components --- .../blenderbim/bim/module/bcf/operator.py | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/bcf/operator.py b/src/blenderbim/blenderbim/bim/module/bcf/operator.py index 8d0e5d3ba4..5e6a111db0 100644 --- a/src/blenderbim/blenderbim/bim/module/bcf/operator.py +++ b/src/blenderbim/blenderbim/bim/module/bcf/operator.py @@ -952,22 +952,42 @@ class ActivateBcfViewpoint(bpy.types.Operator): # Operators with context overrides are used because they are # significantly faster than looping through all objects + self.set_exceptions(viewpoint, context) + self.set_view_setup_hints(viewpoint, context) + # set selection at the end not to conflict with .hide_spaces + self.set_selection(viewpoint) + self.set_colours(viewpoint) + + def set_exceptions(self, viewpoint, context): + if ( + not hasattr(viewpoint.visualization_info.components, "visibility") + or not hasattr(viewpoint.visualization_info.components.visibility.exceptions, "component") + ): + return + exception_global_ids = {v.ifc_guid for v in viewpoint.visualization_info.components.visibility.exceptions.component or []} + # print("default_visibility: {}".format(viewpoint.visualization_info.components.visibility.default_visibility)) if viewpoint.visualization_info.components.visibility.default_visibility: + # default_visibility is True: show all objs, hide the exceptions old = context.area.type context.area.type = "VIEW_3D" bpy.ops.object.hide_view_clear() context.area.type = old for global_id in exception_global_ids: + # print("{}: hide".format(global_id)) obj = IfcStore.get_element(global_id) if obj and bpy.context.view_layer.objects.get(obj.name): + # print(" obj found") obj.hide_set(True) else: + # default_visibility is False: hide all objs, show the exceptions objs = [] for global_id in exception_global_ids: + # print("{}: show".format(global_id)) obj = IfcStore.get_element(global_id) if obj: + # print(" obj found") objs.append(obj) if objs: old = context.area.type @@ -981,6 +1001,7 @@ class ActivateBcfViewpoint(bpy.types.Operator): bpy.data.objects["Viewpoint"].hide_set(False) context.area.type = old + def set_view_setup_hints(self, viewpoint, context): if viewpoint.visualization_info.components.view_setup_hints: if not viewpoint.visualization_info.components.view_setup_hints.spaces_visible: self.hide_spaces(context) @@ -992,10 +1013,6 @@ class ActivateBcfViewpoint(bpy.types.Operator): self.hide_spaces(context) self.set_openings_visibility(False, context) - # set selection at the end not to conflict with .hide_spaces - self.set_selection(viewpoint) - self.set_colours(viewpoint) - def hide_spaces(self, context): old = context.area.type context.area.type = "VIEW_3D" @@ -1013,19 +1030,25 @@ class ActivateBcfViewpoint(bpy.types.Operator): selected_global_ids = [s.ifc_guid for s in viewpoint.visualization_info.components.selection.component or []] bpy.ops.object.select_all(action="DESELECT") for global_id in selected_global_ids: + # print("{}: selected".format(global_id)) obj = IfcStore.get_element(global_id) if obj: + # print(" obj found") obj.select_set(True) obj.hide_set(False) def set_colours(self, viewpoint): + if not viewpoint.visualization_info.components or not viewpoint.visualization_info.components.coloring: + return global_id_colours = {} - for coloring in viewpoint.visualization_info.components.coloring or []: - for component in coloring.components: - global_id_colours.setdefault(component.ifc_guid, coloring.color) + for acoloring in viewpoint.visualization_info.components.coloring.color: + for acomponent in acoloring.component: + global_id_colours.setdefault(acomponent.ifc_guid, acoloring.color) for global_id, color in global_id_colours.items(): + # print("{}: color: {}".format(global_id, self.hex_to_rgb(color))) obj = IfcStore.get_element(global_id) if obj: + # print(" obj found ") obj.color = self.hex_to_rgb(color) def draw_lines(self, viewpoint, context): From 04b641c49cfa5db4e8712bb27602d004d0ff63f9 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Fri, 12 Apr 2024 09:14:47 +0200 Subject: [PATCH 414/429] BBIM, bcf, fix colors for hex with alpha channel --- src/blenderbim/blenderbim/bim/module/bcf/operator.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/bcf/operator.py b/src/blenderbim/blenderbim/bim/module/bcf/operator.py index 5e6a111db0..0eaabe0962 100644 --- a/src/blenderbim/blenderbim/bim/module/bcf/operator.py +++ b/src/blenderbim/blenderbim/bim/module/bcf/operator.py @@ -1045,7 +1045,7 @@ class ActivateBcfViewpoint(bpy.types.Operator): for acomponent in acoloring.component: global_id_colours.setdefault(acomponent.ifc_guid, acoloring.color) for global_id, color in global_id_colours.items(): - # print("{}: color: {}".format(global_id, self.hex_to_rgb(color))) + # print("{}: color: {}: {}".format(global_id, color, self.hex_to_rgb(color))) obj = IfcStore.get_element(global_id) if obj: # print(" obj found ") @@ -1132,8 +1132,14 @@ class ActivateBcfViewpoint(bpy.types.Operator): def hex_to_rgb(self, value): value = value.lstrip("#") lv = len(value) - t = tuple(int(value[i : i + lv // 3], 16) for i in range(0, lv, lv // 3)) - return [t[0] / 255.0, t[1] / 255.0, t[2] / 255.0, 1] + # https://github.com/buildingSMART/BCF-XML/tree/release_3_0/Documentation#coloring + if lv == 8: + t = tuple(int(value[i : i + lv // 4], 16) for i in range(0, lv, lv // 4)) + col = [t[1] / 255.0, t[2] / 255.0, t[3] / 255.0, t[0] / 255.0] + else: + t = tuple(int(value[i : i + lv // 3], 16) for i in range(0, lv, lv // 3)) + col = [t[0] / 255.0, t[1] / 255.0, t[2] / 255.0, 1] + return col class OpenBcfReferenceLink(bpy.types.Operator): From a16c159b7ff5f207c01d7787a5b2f7b332c8d0c7 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Sun, 14 Apr 2024 22:10:53 +0200 Subject: [PATCH 415/429] BBIM, bcf, ignore problematic topics in case of markup --- .../blenderbim/bim/module/bcf/operator.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/bcf/operator.py b/src/blenderbim/blenderbim/bim/module/bcf/operator.py index 0eaabe0962..49ac473a9d 100644 --- a/src/blenderbim/blenderbim/bim/module/bcf/operator.py +++ b/src/blenderbim/blenderbim/bim/module/bcf/operator.py @@ -100,7 +100,19 @@ class LoadBcfTopics(bpy.types.Operator): def execute(self, context): bcfxml = bcfstore.BcfStore.get_bcfxml() context.scene.BCFProperties.topics.clear() - for index, topic_guid in enumerate(bcfxml.topics.keys()): + # workaround, one non standard topic would break reading entire bcf + # ignored these topics ATM + # happens on non standard nodes or on missing nodes in markup + topics2use = [] + for topic_guid in bcfxml.topics.keys(): + # print("topic guid: {}".format(topic_guid)) + try: + topic_titel = bcfxml.topics[topic_guid].topic.title + topics2use.append(topic_guid) + except: + print("Problems on reading topic, thus ignored: {}".format(topic_guid)) + continue + for index, topic_guid in enumerate(topics2use): new = context.scene.BCFProperties.topics.add() bpy.ops.bim.load_bcf_topic(topic_guid=topic_guid, topic_index=index) return {"FINISHED"} From 8f64ef446507b56c9614e1651ad9643aaa1c40c0 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Jun 2024 10:40:23 +1000 Subject: [PATCH 416/429] Fix bug where incorrect units were calculated in the geometry offset UI --- src/blenderbim/blenderbim/bim/import_ifc.py | 1 + .../blenderbim/bim/module/geometry/data.py | 59 +++++++------------ src/blenderbim/blenderbim/bim/prop.py | 1 + 3 files changed, 23 insertions(+), 38 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 4a31abfe34..dc378db190 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -752,6 +752,7 @@ class IfcImporter: elif obj.data and obj.data.get("has_cartesian_point_offset", None): obj.BIMObjectProperties.blender_offset_type = "CARTESIAN_POINT" if cartesian_point_offset := obj.data.get("cartesian_point_offset", None): + obj.BIMObjectProperties.cartesian_point_offset = cartesian_point_offset offset_x, offset_y, offset_z = map(float, cartesian_point_offset.split(",")) matrix[0][3] += offset_x matrix[1][3] += offset_y diff --git a/src/blenderbim/blenderbim/bim/module/geometry/data.py b/src/blenderbim/blenderbim/bim/module/geometry/data.py index baf9f356ae..a65a49283b 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/data.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/data.py @@ -328,12 +328,17 @@ class PlacementData: @classmethod def load(cls): - cls.data = { - "has_placement": cls.has_placement(), - "original_x": cls.original_x(), - "original_y": cls.original_y(), - "original_z": cls.original_z(), - } + cls.data = {"has_placement": cls.has_placement()} + + props = bpy.context.scene.BIMGeoreferenceProperties + obj = bpy.context.active_object + if obj and props.has_blender_offset: + xyz = cls.original_xyz(obj) + cls.data.update({ + "original_x": str(xyz[0]), + "original_y": str(xyz[1]), + "original_z": str(xyz[2]), + }) cls.is_loaded = True @classmethod @@ -344,40 +349,18 @@ class PlacementData: return False @classmethod - def original_x(cls): + def original_xyz(cls, obj): + unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) props = bpy.context.scene.BIMGeoreferenceProperties - obj = bpy.context.active_object - if not obj or not props.has_blender_offset: - return - return str(round(cls.original_xyz(obj.location)[0], 3)) - - @classmethod - def original_y(cls): - props = bpy.context.scene.BIMGeoreferenceProperties - obj = bpy.context.active_object - if not obj or not props.has_blender_offset: - return - return str(round(cls.original_xyz(obj.location)[1], 3)) - - @classmethod - def original_z(cls): - props = bpy.context.scene.BIMGeoreferenceProperties - obj = bpy.context.active_object - if not obj or not props.has_blender_offset: - return - return str(round(cls.original_xyz(obj.location)[2], 3)) - - @classmethod - def original_xyz(cls, location): - props = bpy.context.scene.BIMGeoreferenceProperties - return ifcopenshell.util.geolocation.xyz2enh( - location[0], - location[1], - location[2], - float(props.blender_eastings), - float(props.blender_northings), - float(props.blender_orthogonal_height), + xyz = ifcopenshell.util.geolocation.xyz2enh( + obj.matrix_world[0][3], + obj.matrix_world[1][3], + obj.matrix_world[2][3], + float(props.blender_eastings) * unit_scale, + float(props.blender_northings) * unit_scale, + float(props.blender_orthogonal_height) / unit_scale, float(props.blender_x_axis_abscissa), float(props.blender_x_axis_ordinate), 1.0, ) + return [round(o, 3) / unit_scale for o in xyz] # To nearest mm of precision diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index 386db3b82c..4a777bfd6e 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -445,6 +445,7 @@ class BIMObjectProperties(PropertyGroup): name="Blender Offset", default="NONE", ) + cartesian_point_offset: StringProperty(name="Cartesian Point Offset") is_reassigning_class: BoolProperty(name="Is Reassigning Class") is_renaming: BoolProperty(name="Is Renaming", default=False) location_checksum: StringProperty(name="Location Checksum") From 698c64841359909314f698bd627a8cab7989b720 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Jun 2024 12:47:41 +1000 Subject: [PATCH 417/429] Fix #3757. Adding objects in offset models now correctly stores georeferenced coordinates. --- src/blenderbim/blenderbim/bim/import_ifc.py | 1 + src/blenderbim/blenderbim/bim/prop.py | 2 +- src/blenderbim/blenderbim/core/geometry.py | 1 + src/blenderbim/blenderbim/tool/geometry.py | 10 +++++++++- src/blenderbim/blenderbim/tool/surveyor.py | 2 +- 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index dc378db190..6df397b30f 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -748,6 +748,7 @@ class IfcImporter: # positionally significant and is left alone. This handles # scenarios where often spatial elements are left at 0,0,0 and # everything else is at map coordinates. + obj.BIMObjectProperties.blender_offset_type = "NOT_APPLICABLE" return mathutils.Matrix(matrix.tolist()) elif obj.data and obj.data.get("has_cartesian_point_offset", None): obj.BIMObjectProperties.blender_offset_type = "CARTESIAN_POINT" diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index 4a777bfd6e..e578fde4f1 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -441,7 +441,7 @@ class BIMObjectProperties(PropertyGroup): collection: PointerProperty(type=bpy.types.Collection) ifc_definition_id: IntProperty(name="IFC Definition ID") blender_offset_type: EnumProperty( - items=[(o, o, "") for o in ["NONE", "OBJECT_PLACEMENT", "CARTESIAN_POINT"]], + items=[(o, o, "") for o in ["NONE", "OBJECT_PLACEMENT", "CARTESIAN_POINT", "NOT_APPLICABLE"]], name="Blender Offset", default="NONE", ) diff --git a/src/blenderbim/blenderbim/core/geometry.py b/src/blenderbim/blenderbim/core/geometry.py index e2b27cc35e..70898b7b49 100644 --- a/src/blenderbim/blenderbim/core/geometry.py +++ b/src/blenderbim/blenderbim/core/geometry.py @@ -33,6 +33,7 @@ def edit_object_placement( return geometry.clear_cache(element) geometry.clear_scale(obj) + geometry.get_blender_offset_type(obj) ifc.run("geometry.edit_object_placement", product=element, matrix=surveyor.get_absolute_matrix(obj)) geometry.record_object_position(obj) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 9888176aa9..2a50a5d419 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -40,7 +40,7 @@ import blenderbim.bim.import_ifc from math import radians, pi from mathutils import Vector, Matrix from blenderbim.bim.ifc import IfcStore -from typing import Union, Iterable +from typing import Union, Iterable, Optional class Geometry(blenderbim.core.tool.Geometry): @@ -982,3 +982,11 @@ class Geometry(blenderbim.core.tool.Geometry): def delete_opening_object_placement(cls, placement): model = tool.Ifc.get() ifcopenshell.util.element.remove_deep2(model, placement) + + @classmethod + def get_blender_offset_type(cls, obj: bpy.types.Object) -> Optional[str]: + props = bpy.context.scene.BIMGeoreferenceProperties + if props.has_blender_offset: + if (result := obj.BIMObjectProperties.blender_offset_type) == "NONE": + result = obj.BIMObjectProperties.blender_offset_type = "OBJECT_PLACEMENT" + return result diff --git a/src/blenderbim/blenderbim/tool/surveyor.py b/src/blenderbim/blenderbim/tool/surveyor.py index e1ced18793..1ddeab6618 100644 --- a/src/blenderbim/blenderbim/tool/surveyor.py +++ b/src/blenderbim/blenderbim/tool/surveyor.py @@ -28,7 +28,7 @@ class Surveyor(blenderbim.core.tool.Surveyor): def get_absolute_matrix(cls, obj): matrix = np.array(obj.matrix_world) props = bpy.context.scene.BIMGeoreferenceProperties - if props.has_blender_offset and obj.BIMObjectProperties.blender_offset_type == "OBJECT_PLACEMENT": + if props.has_blender_offset and obj.BIMObjectProperties.blender_offset_type != "NOT_APPLICABLE": unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) matrix = np.array( ifcopenshell.util.geolocation.local2global( From d0058a1bde84666bbbe0c03d021a9304a91cdc39 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Jun 2024 14:32:00 +1000 Subject: [PATCH 418/429] Fix #4802. Fix ability to edit CARTESIAN_POINT offset meshes in offset models. --- src/blenderbim/blenderbim/tool/surveyor.py | 8 ++++++ .../api/geometry/add_representation.py | 25 +++++++++++-------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/blenderbim/blenderbim/tool/surveyor.py b/src/blenderbim/blenderbim/tool/surveyor.py index 1ddeab6618..089c4a83e3 100644 --- a/src/blenderbim/blenderbim/tool/surveyor.py +++ b/src/blenderbim/blenderbim/tool/surveyor.py @@ -30,6 +30,14 @@ class Surveyor(blenderbim.core.tool.Surveyor): props = bpy.context.scene.BIMGeoreferenceProperties if props.has_blender_offset and obj.BIMObjectProperties.blender_offset_type != "NOT_APPLICABLE": unit_scale = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + if ( + obj.BIMObjectProperties.blender_offset_type == "CARTESIAN_POINT" + and obj.BIMObjectProperties.cartesian_point_offset + ): + offset_x, offset_y, offset_z = map(float, obj.BIMObjectProperties.cartesian_point_offset.split(",")) + matrix[0][3] -= offset_x + matrix[1][3] -= offset_y + matrix[2][3] -= offset_z matrix = np.array( ifcopenshell.util.geolocation.local2global( matrix, diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index 5529197ffd..d3b12fa261 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -787,9 +787,7 @@ class Usecase: [uv + 1 for uv in polygon.loop_indices] ) - coordinates = self.file.createIfcCartesianPointList3D( - [self.convert_si_to_unit(v.co) for v in self.settings["geometry"].vertices] - ) + coordinates = self.create_cartesian_point_list_from_vertices(self.settings["geometry"].vertices) if self.settings["should_generate_uvs"]: # Blender supports multiple UV layers. We don't. Too bad. @@ -824,9 +822,7 @@ class Usecase: ifc_raw_items[polygon.material_index % self.settings["total_items"]].append( self.file.createIfcIndexedPolygonalFace([v + 1 for v in polygon.vertices]) ) - coordinates = self.file.createIfcCartesianPointList3D( - [self.convert_si_to_unit(v.co) for v in self.settings["geometry"].vertices] - ) + coordinates = self.create_cartesian_point_list_from_vertices(self.settings["geometry"].vertices) items = [self.file.createIfcPolygonalFaceSet(coordinates, self.is_manifold, i) for i in ifc_raw_items if i] return self.file.createIfcShapeRepresentation( self.settings["context"], @@ -848,7 +844,12 @@ class Usecase: ] ) - def create_cartesian_point(self, x, y, z=None): + def create_cartesian_point(self, x, y, z=None, is_model_coords=True): + if is_model_coords and self.settings["coordinate_offset"]: + x += self.settings["coordinate_offset"][0] + y += self.settings["coordinate_offset"][1] + if z: + z += self.settings["coordinate_offset"][2] x = self.convert_si_to_unit(x) y = self.convert_si_to_unit(y) if z is None: @@ -856,14 +857,18 @@ class Usecase: z = self.convert_si_to_unit(z) return self.file.createIfcCartesianPoint((x, y, z)) - def create_cartesian_point_list_from_vertices(self, vertices: list[bpy.types.MeshVertex], is_2d=False): + def create_cartesian_point_list_from_vertices(self, vertices: list[bpy.types.MeshVertex], is_2d=False, is_model_coords=True): + if is_model_coords and self.settings["coordinate_offset"]: + if is_2d: + xy_offset = Vector((self.settings["coordinate_offset"][0:2])) + return self.file.createIfcCartesianPointList2D([self.convert_si_to_unit(v.co.xy + xy_offset) for v in vertices]) + xyz_offset = Vector((self.settings["coordinate_offset"][0:3])) + return self.file.createIfcCartesianPointList3D([self.convert_si_to_unit(v.co.xyz + xyz_offset) for v in vertices]) if is_2d: return self.file.createIfcCartesianPointList2D([self.convert_si_to_unit(v.co.xy) for v in vertices]) return self.file.createIfcCartesianPointList3D([self.convert_si_to_unit(v.co) for v in vertices]) def convert_si_to_unit(self, co): - if self.settings["coordinate_offset"]: - return (co / self.settings["unit_scale"]) + self.settings["coordinate_offset"] return co / self.settings["unit_scale"] def create_annotation2d_representation(self): From af5838cba6e2902ba3434569aa5de50928bea65c Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Jun 2024 16:30:19 +1000 Subject: [PATCH 419/429] Fix #4821. Bug where empty true norths were still set. --- .../ifcopenshell/api/georeference/edit_georeferencing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py index 08d7361935..12ac54693a 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py +++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/edit_georeferencing.py @@ -109,7 +109,7 @@ class Usecase: self.set_true_north() def set_true_north(self): - if self.settings["true_north"] == None: + if not self.settings["true_north"]: return for context in self.file.by_type("IfcGeometricRepresentationContext", include_subtypes=False): if context.TrueNorth: From f565b4e8f0876b3c5a41f96694510991e8c363cb Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Jun 2024 20:06:57 +1000 Subject: [PATCH 420/429] Minor georeferencing offset fix after recent fixes --- .../bim/module/geometry/operator.py | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 7537a04067..c33bfeaec1 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -374,14 +374,12 @@ class UpdateRepresentation(bpy.types.Operator, Operator): gprop = context.scene.BIMGeoreferenceProperties coordinate_offset = None - if gprop.has_blender_offset and obj.BIMObjectProperties.blender_offset_type == "CARTESIAN_POINT": - coordinate_offset = Vector( - ( - float(gprop.blender_eastings), - float(gprop.blender_northings), - float(gprop.blender_orthogonal_height), - ) - ) + if ( + gprop.has_blender_offset + and obj.BIMObjectProperties.blender_offset_type == "CARTESIAN_POINT" + and obj.BIMObjectProperties.cartesian_point_offset + ): + coordinate_offset = Vector(map(float, obj.BIMObjectProperties.cartesian_point_offset.split(","))) representation_data = { "context": context_of_items, @@ -948,7 +946,7 @@ class OverrideDuplicateMove(bpy.types.Operator): pset = ifcopenshell.util.element.get_pset(new[0], "BBIM_Linked_Aggregate") if pset: pset = tool.Ifc.get().by_id(pset["id"]) - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=new[0],pset=pset) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=new[0], pset=pset) if new[0].is_a("IfcElementAssembly"): linked_aggregate_group = [ @@ -1176,7 +1174,10 @@ class DuplicateLinkedAggregateTo3dCursor(bpy.types.Operator): return OverrideDuplicateMove.execute_duplicate_operator(self, context, linked=False) def _execute(self, context): - return DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context, location_from_3d_cursor=True) + return DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator( + self, context, location_from_3d_cursor=True + ) + class RefreshLinkedAggregate(bpy.types.Operator): bl_idname = "bim.refresh_linked_aggregate" From f0a19cb054961ec9960ffeb8cf20e8b99323bf98 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Jun 2024 20:08:11 +1000 Subject: [PATCH 421/429] Fix #4815. Purge deprecated old selector syntax. --- .../blenderbim/bim/module/group/__init__.py | 1 - .../blenderbim/bim/module/group/operator.py | 31 -- .../blenderbim/bim/module/group/prop.py | 1 - .../blenderbim/bim/module/group/ui.py | 10 +- .../blenderbim/bim/module/search/operator.py | 3 - .../blenderbim/bim/module/search/prop.py | 5 +- src/blenderbim/blenderbim/core/search.py | 8 - src/blenderbim/blenderbim/core/tool.py | 4 +- src/blenderbim/blenderbim/tool/search.py | 7 - .../ifcopenshell/util/selector.py | 490 +++++------------- .../test/util/test_selector.py | 233 --------- 11 files changed, 128 insertions(+), 665 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/group/__init__.py b/src/blenderbim/blenderbim/bim/module/group/__init__.py index 4650cb1833..f89bcaa605 100644 --- a/src/blenderbim/blenderbim/bim/module/group/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/group/__init__.py @@ -31,7 +31,6 @@ classes = ( operator.SelectGroupProducts, operator.ToggleGroup, operator.UnassignGroup, - operator.UpdateGroup, operator.SelectGroupElements, prop.ExpandedGroups, prop.Group, diff --git a/src/blenderbim/blenderbim/bim/module/group/operator.py b/src/blenderbim/blenderbim/bim/module/group/operator.py index ddb5bb8845..528b1b59b8 100644 --- a/src/blenderbim/blenderbim/bim/module/group/operator.py +++ b/src/blenderbim/blenderbim/bim/module/group/operator.py @@ -22,7 +22,6 @@ import ifcopenshell.api import blenderbim.bim.helper import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore -from ifcopenshell.util.selector import Selector import json @@ -48,7 +47,6 @@ class LoadGroups(bpy.types.Operator, tool.Ifc.Operator): new = self.props.groups.add() new.ifc_definition_id = group.id() new.name = group.Name or "Unnamed" - new.selection_query = "" new.tree_depth = tree_depth new.has_children = False new.is_expanded = group.id() in self.expanded_groups @@ -113,7 +111,6 @@ class EditGroup(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.edit_group" bl_label = "Edit Group" bl_options = {"REGISTER", "UNDO"} - copy_from_selector: bpy.props.BoolProperty(name="Copy from Selector", default=False) def _execute(self, context): props = context.scene.BIMGroupProperties @@ -124,9 +121,6 @@ class EditGroup(bpy.types.Operator, tool.Ifc.Operator): else: attributes[attribute.name] = attribute.string_value - if self.copy_from_selector: - attributes["Description"] = context.scene.IFCSelector.selection_query - self.file = IfcStore.get_file() ifcopenshell.api.run( "group.edit_group", self.file, **{"group": self.file.by_id(props.active_group_id), "attributes": attributes} @@ -242,31 +236,6 @@ class SelectGroupProducts(bpy.types.Operator, tool.Ifc.Operator): return {"FINISHED"} -class UpdateGroup(bpy.types.Operator, tool.Ifc.Operator): - bl_idname = "bim.update_group" - bl_label = "Update Group" - bl_options = {"REGISTER", "UNDO"} - query: bpy.props.StringProperty() - group_id: bpy.props.IntProperty() - - def _execute(self, context): - self.file = IfcStore.get_file() - group = self.file.by_id(self.group_id) - query = self.query - - new_products = Selector.parse(self.file, query) - ifcopenshell.api.run( - "group.update_group_products", - self.file, - **{ - "group": group, - "products": new_products, - } - ) - bpy.ops.bim.load_groups() - return {"FINISHED"} - - class SelectGroupElements(bpy.types.Operator): bl_idname = "bim.select_group_elements" bl_label = "Select Group elements" diff --git a/src/blenderbim/blenderbim/bim/module/group/prop.py b/src/blenderbim/blenderbim/bim/module/group/prop.py index bec18bbdae..c4f6133533 100644 --- a/src/blenderbim/blenderbim/bim/module/group/prop.py +++ b/src/blenderbim/blenderbim/bim/module/group/prop.py @@ -44,7 +44,6 @@ class ExpandedGroups(StrProperty): class Group(PropertyGroup): name: StringProperty(name="Name") ifc_definition_id: IntProperty(name="IFC Definition ID") - selection_query: StringProperty(name="Selection Query") is_expanded: BoolProperty(name="Is Expanded", default=False) has_children: BoolProperty(name="Has Children", default=False) tree_depth: IntProperty(name="Tree Depth") diff --git a/src/blenderbim/blenderbim/bim/module/group/ui.py b/src/blenderbim/blenderbim/bim/module/group/ui.py index 5762d8f705..ff0487cc13 100644 --- a/src/blenderbim/blenderbim/bim/module/group/ui.py +++ b/src/blenderbim/blenderbim/bim/module/group/ui.py @@ -131,7 +131,7 @@ class BIM_UL_groups(UIList): else: row.label(text="", icon="BLANK1") - row.label(text=f"*{item.name}") if item.selection_query != "" else row.label(text=item.name) + row.label(text=item.name) group_id = item.ifc_definition_id if context.scene.BIMGroupProperties.active_group_id == group_id: op = row.operator("bim.select_group_products", text="", icon="RESTRICT_SELECT_OFF") @@ -145,10 +145,6 @@ class BIM_UL_groups(UIList): op.group = group_id op = row.operator("bim.remove_group", text="", icon="X") op.group = group_id - if item.selection_query != "": - op = row.operator("bim.update_group", text="", icon="FILE_REFRESH") - op.group_id = item.ifc_definition_id - op.query = item.selection_query else: op = row.operator("bim.select_group_products", text="", icon="RESTRICT_SELECT_OFF") op.group = group_id @@ -158,10 +154,6 @@ class BIM_UL_groups(UIList): op.group = group_id op = row.operator("bim.remove_group", text="", icon="X") op.group = group_id - if item.selection_query != "": - op = row.operator("bim.update_group", text="", icon="FILE_REFRESH") - op.group_id = item.ifc_definition_id - op.query = item.selection_query class BIM_UL_object_groups(UIList): diff --git a/src/blenderbim/blenderbim/bim/module/search/operator.py b/src/blenderbim/blenderbim/bim/module/search/operator.py index b4b56f9f3a..f0516dfdfb 100644 --- a/src/blenderbim/blenderbim/bim/module/search/operator.py +++ b/src/blenderbim/blenderbim/bim/module/search/operator.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . -import re import bpy import json import ifcopenshell @@ -24,10 +23,8 @@ import ifcopenshell.api import ifcopenshell.guid import ifcopenshell.util.element import ifcopenshell.util.selector -from ifcopenshell.util.selector import Selector import blenderbim.tool as tool from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.group import ui import blenderbim.core.search as core from itertools import cycle from bpy.types import PropertyGroup, Operator diff --git a/src/blenderbim/blenderbim/bim/module/search/prop.py b/src/blenderbim/blenderbim/bim/module/search/prop.py index a7f2cc7d25..d2accf9027 100644 --- a/src/blenderbim/blenderbim/bim/module/search/prop.py +++ b/src/blenderbim/blenderbim/bim/module/search/prop.py @@ -19,12 +19,9 @@ import bpy import blenderbim.tool as tool from ifcopenshell import util -from ifcopenshell.util.selector import Selector -from blenderbim.bim.prop import ObjProperty, StrProperty, BIMFilterGroup -from blenderbim.bim.ifc import IfcStore +from blenderbim.bim.prop import ObjProperty, BIMFilterGroup from blenderbim.bim.module.search.data import SearchData, ColourByPropertyData, SelectSimilarData from bpy.types import PropertyGroup -from blenderbim.tool.ifc import Ifc from . import ui, prop, operator from bpy.props import ( PointerProperty, diff --git a/src/blenderbim/blenderbim/core/search.py b/src/blenderbim/blenderbim/core/search.py index 4e390cb828..0fe60fdb65 100644 --- a/src/blenderbim/blenderbim/core/search.py +++ b/src/blenderbim/blenderbim/core/search.py @@ -1,10 +1,2 @@ def show_scene_elements(spatial): spatial.show_scene_objects() - -def search(search, spatial, query, action): - products = search.from_selector_query(query) - spatial.deselect_objects() - try: - spatial.filter_products(products, action) - except: - return "One or More Products could not be found because they are hidden in the ViewLayer" \ No newline at end of file diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 59cdff7fc4..7b66ce782e 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -707,7 +707,7 @@ class Selector: @interface class Search: - def from_selector_query(cls, query): pass + pass @interface class Sequence: @@ -831,7 +831,7 @@ class Spatial: def can_reference(cls, structure, element): pass def contract_container(cls, container): pass def copy_xy(cls, src_obj, destination_obj): pass - def import_spatial_structure(cls, element, level_index): pass + def import_spatial_element(cls, element, level_index): pass def deselect_objects(cls): pass def disable_editing(cls, obj): pass def duplicate_object_and_data(cls, obj): pass diff --git a/src/blenderbim/blenderbim/tool/search.py b/src/blenderbim/blenderbim/tool/search.py index dad303d15b..e018d3aa12 100644 --- a/src/blenderbim/blenderbim/tool/search.py +++ b/src/blenderbim/blenderbim/tool/search.py @@ -2,10 +2,8 @@ import bpy import json import lark import blenderbim.core.tool -import blenderbim.tool as tool import ifcopenshell.guid import ifcopenshell.util.selector -from ifcopenshell.util.selector import Selector from blenderbim.bim.prop import BIMFacet from typing import Union, Literal @@ -115,11 +113,6 @@ class Search(blenderbim.core.tool.Search): return value return '"' + value.replace('"', '\\"') + '"' - @classmethod - def from_selector_query(cls, query: str) -> list[ifcopenshell.entity_instance]: - """Returns a list of products from a selector query""" - return Selector().parse(tool.Ifc.get(), query) - class ImportFilterQueryTransformer(lark.Transformer): def __init__(self, filter_groups): diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 6097b9572c..251668aecc 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -276,7 +276,130 @@ def format(query: str) -> str: def get_element_value(element: ifcopenshell.entity_instance, query: str) -> Any: keys: list[str] = GetElementTransformer().transform(get_element_grammar.parse(query)) - return Selector.get_element_value(element, keys) + return _get_element_value(element, keys) + + +def _get_element_value(element: ifcopenshell.entity_instance, keys: list[str]) -> Any: + value = element + for key in keys: + if value is None: + return + if key == "type": + value = ifcopenshell.util.element.get_type(value) + elif key in ("material", "mat"): + value = ifcopenshell.util.element.get_material(value, should_skip_usage=True) + elif key in ("materials", "mats"): + value = ifcopenshell.util.element.get_materials(value) + elif key == "profiles": + value = ifcopenshell.util.shape.get_profiles(value) + elif key == "styles": + value = ifcopenshell.util.element.get_styles(value) + elif key in ("item", "i"): + if value.is_a("IfcMaterialLayerSet"): + value = value.MaterialLayers + elif value.is_a("IfcMaterialProfileSet"): + value = value.MaterialProfiles + elif value.is_a("IfcMaterialConstituentSet"): + value = value.MaterialConstituents + elif key == "container": + value = ifcopenshell.util.element.get_container(value) + elif key == "space": + value = ifcopenshell.util.element.get_container(value, ifc_class="IfcSpace") + elif key == "storey": + value = ifcopenshell.util.element.get_container(value, ifc_class="IfcBuildingStorey") + elif key == "building": + value = ifcopenshell.util.element.get_container(value, ifc_class="IfcBuilding") + elif key == "site": + value = ifcopenshell.util.element.get_container(value, ifc_class="IfcSite") + elif key == "parent": + value = ifcopenshell.util.element.get_parent(value) + elif key in ("types", "occurrences"): + value = ifcopenshell.util.element.get_types(value) + elif key == "count": + if isinstance(value, set): + value = len(list(value)) + elif isinstance(value, (list, tuple)): + value = len(value) + else: + value = 1 + elif key == "class": + value = value.is_a() + elif key == "predefined_type": + value = ifcopenshell.util.element.get_predefined_type(value) + elif key == "id": + value = value.id() + elif key == "classification": + value = ifcopenshell.util.classification.get_references(value) + elif key in ("x", "y", "z", "easting", "northing", "elevation") and hasattr(value, "ObjectPlacement"): + if getattr(value, "ObjectPlacement", None): + matrix = ifcopenshell.util.placement.get_local_placement(value.ObjectPlacement) + xyz = matrix[:, 3][:3] + if key in ("x", "y", "z"): + value = xyz["xyz".index(key)] + else: + enh = ifcopenshell.util.geolocation.auto_xyz2enh(element.wrapped_data.file, *xyz) + value = enh[("easting", "northing", "elevation").index(key)] + else: + value = None + elif isinstance(value, ifcopenshell.entity_instance): + if key == "Name" and value.is_a("IfcMaterialLayerSet"): + key = "LayerSetName" # This oddity in the IFC spec is annoying so we account for it. + + if isinstance(key, re.Pattern): + attribute = None # Should we support regex attributes? Probably not for now. + else: + attribute = getattr(value, key, None) + + if attribute is not None: + value = attribute + else: + # Try to extract pset + if isinstance(key, re.Pattern): + psets = ifcopenshell.util.element.get_psets(value) + matching_psets = [] + for pset_name, pset in psets.items(): + if key.match(pset_name): + del pset["id"] + matching_psets.append(pset) + result = matching_psets or None + if result and len(result) == 1: + result = result[0] + else: + result = ifcopenshell.util.element.get_pset(value, key) + if result: + del result["id"] + + value = result + elif isinstance(value, dict): # Such as from the result of a prior get_pset + if isinstance(key, re.Pattern): + results = [] + for prop_name, prop_value in value.items(): + if key.match(prop_name): + if isinstance(prop_value, (list, tuple)): + results.extend(prop_value) + else: + results.append(prop_value) + value = results or None + if value and len(value) == 1: + value = value[0] + else: + value = value.get(key, None) + elif isinstance(value, (list, tuple, set)): # If we use regex + if isinstance(key, str) and key.isnumeric(): + try: + value = value[int(key)] + except IndexError: + return + else: + results = [] + for v in value: + subvalue = _get_element_value(v, [key]) + if isinstance(subvalue, list): + results.extend(subvalue) + else: + results.append(subvalue) + value = results + return value def filter_elements( @@ -840,368 +963,3 @@ class FacetTransformer(lark.Transformer): if comparison.startswith("!"): return not result return result - - -class Selector: - @classmethod - def parse( - cls, ifc_file: ifcopenshell.file, query: str, elements: Optional[list[ifcopenshell.entity_instance]] = None - ) -> list[ifcopenshell.entity_instance]: - cls.file = ifc_file - cls.elements = elements - l = lark.Lark( - """start: query (lfunction query)* - query: selector | group - group: "(" query (lfunction query)* ")" - selector: (inverse_relationship)? guid_selector | (inverse_relationship)? class_selector - guid_selector: "#" /[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$]{22}/ - class_selector: "." WORD filter ? - filter: "[" filter_key (comparison filter_value)? "]" - filter_key: WORD | ESCAPED_STRING | keys_regex | keys_quoted | keys_simple - filter_value: filter_regex | ESCAPED_STRING | SIGNED_FLOAT | SIGNED_INT | BOOLEAN | NULL - filter_regex: "r" ESCAPED_STRING - keys_regex: "r" ESCAPED_STRING ("." ESCAPED_STRING)* - keys_quoted: ESCAPED_STRING ("." ESCAPED_STRING)* - keys_simple: /[^\\W][^.=<>!%*\\]]*/ ("." /[^\\W][^.=<>!%*\\]]*/)* - lfunction: and | or - inverse_relationship: types | decomposed_by | bounded_by | grouped_by - types: "*" - decomposed_by: "@" - bounded_by: "@@" - grouped_by: "@@@" - and: "&" - or: "|" - not: "!" - comparison: (not)* (oneof | contains | morethanequalto | lessthanequalto | equal | morethan | lessthan) - oneof: "%=" - contains: "*=" - morethanequalto: ">=" - lessthanequalto: "<=" - equal: "=" - morethan: ">" - lessthan: "<" - BOOLEAN: "TRUE" | "FALSE" | "true" | "false"| "True" | "False" - NULL: "NULL" - - // Embed common.lark for packaging - DIGIT: "0".."9" - HEXDIGIT: "a".."f"|"A".."F"|DIGIT - INT: DIGIT+ - SIGNED_INT: ["+"|"-"] INT - DECIMAL: INT "." INT? | "." INT - _EXP: ("e"|"E") SIGNED_INT - FLOAT: INT _EXP | DECIMAL _EXP? - SIGNED_FLOAT: ["+"|"-"] FLOAT - NUMBER: FLOAT | INT - SIGNED_NUMBER: ["+"|"-"] NUMBER - _STRING_INNER: /.*?/ - _STRING_ESC_INNER: _STRING_INNER /(? 1 and class_selector.children[1].data == "filter": - return cls.filter_elements(elements, class_selector.children[1]) - return elements - - @classmethod - def filter_elements(cls, elements, filter_rule): - results = [] - filter_query = cls.parse_filter_query(filter_rule.children[0].children[0]) - comparison = value = None - if len(filter_rule.children) > 1: - comparison = filter_rule.children[1].children[0].data - if comparison == "not": - comparison += filter_rule.children[1].children[1].data - filter_value = filter_rule.children[2].children[0] - if isinstance(filter_value, lark.Tree): - is_regex = True - token_type = filter_value.data - else: - is_regex = False - token_type = filter_value.type - if token_type == "filter_regex": - value = str(filter_value.children[0][1:-1]) - elif token_type == "ESCAPED_STRING": - value = str(filter_value[1:-1]) - elif token_type == "SIGNED_INT": - value = int(filter_value) - elif token_type == "SIGNED_FLOAT": - value = float(filter_value) - elif token_type == "BOOLEAN": - value = filter_value.lower() == "true" - elif token_type == "NULL": - value = None - for element in elements: - if filter_query["is_regex"]: - filter_query["keys"] = [re.compile(k) for k in filter_query["keys"]] - element_value = cls.get_element_value(element, filter_query["keys"]) - if element_value is None and value is not None and "not" not in comparison: - continue - if comparison and cls.filter_element(element, element_value, comparison, value, is_regex=is_regex): - results.append(element) - elif not comparison and element_value: - results.append(element) - return results - - @classmethod - def parse_filter_query(cls, filter_query): - keys = filter_query - is_regex = False - if isinstance(keys, str): - keys = [keys] - elif keys.data == "keys_regex": - is_regex = True - keys = [k[1:-1].replace('\\"', '"') for k in keys.children] - elif keys.data == "keys_quoted": - keys = [k[1:-1].replace('\\"', '"') for k in keys.children] - elif keys.data == "keys_simple": - keys = keys.children - return {"keys": keys, "is_regex": is_regex} - - @classmethod - def get_element_value(cls, element: ifcopenshell.entity_instance, keys: list[str]) -> Any: - value = element - for key in keys: - if value is None: - return - if key == "type": - value = ifcopenshell.util.element.get_type(value) - elif key in ("material", "mat"): - value = ifcopenshell.util.element.get_material(value, should_skip_usage=True) - elif key in ("materials", "mats"): - value = ifcopenshell.util.element.get_materials(value) - elif key == "profiles": - value = ifcopenshell.util.shape.get_profiles(value) - elif key == "styles": - value = ifcopenshell.util.element.get_styles(value) - elif key in ("item", "i"): - if value.is_a("IfcMaterialLayerSet"): - value = value.MaterialLayers - elif value.is_a("IfcMaterialProfileSet"): - value = value.MaterialProfiles - elif value.is_a("IfcMaterialConstituentSet"): - value = value.MaterialConstituents - elif key == "container": - value = ifcopenshell.util.element.get_container(value) - elif key == "space": - value = ifcopenshell.util.element.get_container(value, ifc_class="IfcSpace") - elif key == "storey": - value = ifcopenshell.util.element.get_container(value, ifc_class="IfcBuildingStorey") - elif key == "building": - value = ifcopenshell.util.element.get_container(value, ifc_class="IfcBuilding") - elif key == "site": - value = ifcopenshell.util.element.get_container(value, ifc_class="IfcSite") - elif key == "parent": - value = ifcopenshell.util.element.get_parent(value) - elif key in ("types", "occurrences"): - value = ifcopenshell.util.element.get_types(value) - elif key == "count": - if isinstance(value, set): - value = len(list(value)) - elif isinstance(value, (list, tuple)): - value = len(value) - else: - value = 1 - elif key == "class": - value = value.is_a() - elif key == "predefined_type": - value = ifcopenshell.util.element.get_predefined_type(value) - elif key == "id": - value = value.id() - elif key == "classification": - value = ifcopenshell.util.classification.get_references(value) - elif key in ("x", "y", "z", "easting", "northing", "elevation") and hasattr(value, "ObjectPlacement"): - if getattr(value, "ObjectPlacement", None): - matrix = ifcopenshell.util.placement.get_local_placement(value.ObjectPlacement) - xyz = matrix[:, 3][:3] - if key in ("x", "y", "z"): - value = xyz["xyz".index(key)] - else: - enh = ifcopenshell.util.geolocation.auto_xyz2enh(element.wrapped_data.file, *xyz) - value = enh[("easting", "northing", "elevation").index(key)] - else: - value = None - elif isinstance(value, ifcopenshell.entity_instance): - if key == "Name" and value.is_a("IfcMaterialLayerSet"): - key = "LayerSetName" # This oddity in the IFC spec is annoying so we account for it. - - if isinstance(key, re.Pattern): - attribute = None # Should we support regex attributes? Probably not for now. - else: - attribute = getattr(value, key, None) - - if attribute is not None: - value = attribute - else: - # Try to extract pset - if isinstance(key, re.Pattern): - psets = ifcopenshell.util.element.get_psets(value) - matching_psets = [] - for pset_name, pset in psets.items(): - if key.match(pset_name): - del pset["id"] - matching_psets.append(pset) - result = matching_psets or None - if result and len(result) == 1: - result = result[0] - else: - result = ifcopenshell.util.element.get_pset(value, key) - if result: - del result["id"] - - value = result - elif isinstance(value, dict): # Such as from the result of a prior get_pset - if isinstance(key, re.Pattern): - results = [] - for prop_name, prop_value in value.items(): - if key.match(prop_name): - if isinstance(prop_value, (list, tuple)): - results.extend(prop_value) - else: - results.append(prop_value) - value = results or None - if value and len(value) == 1: - value = value[0] - else: - value = value.get(key, None) - elif isinstance(value, (list, tuple, set)): # If we use regex - if isinstance(key, str) and key.isnumeric(): - try: - value = value[int(key)] - except IndexError: - return - else: - results = [] - for v in value: - subvalue = cls.get_element_value(v, [key]) - if isinstance(subvalue, list): - results.extend(subvalue) - else: - results.append(subvalue) - value = results - return value - - @classmethod - def filter_element(cls, element, element_value, comparison, value, is_regex=False): - if comparison.startswith("not"): - return not cls.filter_element(element, element_value, comparison[3:], value, is_regex=is_regex) - elif comparison == "equal" and isinstance(element_value, list): - if is_regex: - for element_v in element_value: - if re.match(value, element_v): - return True - return False - return value in element_value - elif comparison == "equal": - if is_regex: - return bool(re.match(value, element_value)) - return element_value == value - elif comparison == "contains" and isinstance(element_value, list): - return bool([ev for ev in element_value if value in str(ev)]) - elif comparison == "contains": - return value in str(element_value) - elif comparison == "morethan": - return element_value > value - elif comparison == "lessthan": - return element_value < value - elif comparison == "morethanequalto": - return element_value >= value - elif comparison == "lessthanequalto": - return element_value <= value - elif comparison == "oneof": - return element_value in value.split(",") - return False - - @classmethod - def get_guid_selector(cls, guid_selector): - return [cls.file.by_id(guid_selector.children[0])] diff --git a/src/ifcopenshell-python/test/util/test_selector.py b/src/ifcopenshell-python/test/util/test_selector.py index 469b8918ef..4dcc177bb7 100644 --- a/src/ifcopenshell-python/test/util/test_selector.py +++ b/src/ifcopenshell-python/test/util/test_selector.py @@ -348,236 +348,3 @@ class TestSetElementValue(test.bootstrap.IFC4): layer.Material = material subject.set_element_value(self.file, layer, "Material.Name", "Foo") assert material.Name == "Foo" - - -class TestSelector(test.bootstrap.IFC4): - def test_selecting_from_specified_elements(self): - elements = [ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") for _ in range(2)] - assert subject.Selector.parse(self.file, ".IfcWall", elements[:1]) == [elements[0]] - - def test_selecting_by_class(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") - assert subject.Selector.parse(self.file, ".IfcWall") == [element] - - def test_selecting_by_globalid(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") - assert subject.Selector.parse(self.file, f"#{element.GlobalId}") == [element] - - def test_selecting_by_attribute_existence(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element.Name = "Foobar" - ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") - assert subject.Selector.parse(self.file, ".IfcElement[Name]") == [element] - assert subject.Selector.parse(self.file, ".IfcElement[Description]") == [] - - def test_selecting_by_attribute(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element.Name = "Foobar" - ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") - assert subject.Selector.parse(self.file, '.IfcElement[Name="Foobar"]') == [element] - assert subject.Selector.parse(self.file, '.IfcElement[Name="Foobaz"]') == [] - - def test_selecting_by_regex(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element.Name = "Foobar" - ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") - assert subject.Selector.parse(self.file, '.IfcElement[Name=r"Foo.*"]') == [element] - - def test_selecting_by_property_existence(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": "Bar"}) - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo]") == [element] - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Fox]") == [] - assert subject.Selector.parse(self.file, '.IfcElement[r"Foo.*ar"."Fo.*"]') == [element] - - def test_selecting_by_string_property(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": "Bar"}) - assert subject.Selector.parse(self.file, '.IfcElement[Foo_Bar.Foo="Bar"]') == [element] - - def test_selecting_by_enumerated_property(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Pset_WallCommon") - template = ifcopenshell.util.pset.get_template("IFC4").get_by_name("Pset_WallCommon") - ifcopenshell.api.run( - "pset.edit_pset", self.file, pset=pset, properties={"Status": ["NEW"]}, pset_template=template - ) - assert subject.Selector.parse(self.file, '.IfcElement[Pset_WallCommon.Status="NEW"]') == [element] - - def test_selecting_by_integer_property(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": 42}) - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo=42]") == [element] - - def test_selecting_by_float_property(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": 4.2}) - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo=4.2]") == [element] - - def test_selecting_by_boolean_property(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": True}) - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo=TRUE]") == [element] - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": False}) - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo=FALSE]") == [element] - - def test_selecting_by_null_property(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": "Bar"}) - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo=NULL]") == [] - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": None}) - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo=NULL]") == [element] - - def test_comparing_by_not_equal(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element.Name = "Foobar" - assert subject.Selector.parse(self.file, '.IfcElement[Name!="Foobaz"]') == [element] - assert subject.Selector.parse(self.file, '.IfcElement[Name!="Foobar"]') == [] - - def test_comparing_by_ranges(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": 4.2}) - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo>2]") == [element] - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo>20]") == [] - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo<2]") == [] - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo<20]") == [element] - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo>=4.2]") == [element] - assert subject.Selector.parse(self.file, ".IfcElement[Foo_Bar.Foo<=4.2]") == [element] - - def test_comparing_if_value_contains_a_wildcard_string(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element.Name = "Foobar" - assert subject.Selector.parse(self.file, '.IfcElement[Name*="Foo"]') == [element] - assert subject.Selector.parse(self.file, '.IfcElement[Name*="oba"]') == [element] - assert subject.Selector.parse(self.file, '.IfcElement[Name*="abc"]') == [] - - def test_selecting_if_value_not_matching(self): - element_1 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element_2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset_1 = ifcopenshell.api.run("pset.add_pset", self.file, product=element_1, name="Foo_Bar") - pset_2 = ifcopenshell.api.run("pset.add_pset", self.file, product=element_2, name="Foo_Bar") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset_1, properties={"Foo": "Bar"}) - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset_2, properties={"Foo": "BOO"}) - assert subject.Selector.parse(self.file, '.IfcElement["Foo_Bar"."Foo" != "Bar"]') == [element_2] - assert subject.Selector.parse(self.file, '.IfcElement["Foo_Bar"."Foo" != "BOO"]') == [element_1] - - def test_selecting_when_attribute_is_none(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - assert subject.Selector.parse(self.file, '.IfcElement[PredefinedType !="non-existent predefined type"]') == [ - element - ] - - def test_selecting_a_property_which_includes_non_standard_characters(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="a !%$§&/()?|*-+,€~#@µ^°a") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"a !%$§&/()?|*-+,€~#@µ^°a": "Bar"}) - assert subject.Selector.parse( - self.file, '.IfcElement["a !%$§&/()?|*-+,€~#@µ^°a"."a !%$§&/()?|*-+,€~#@µ^°a"="Bar"]' - ) == [element] - - def test_selecting_a_property_which_includes_a_dot(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="a.b") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"c.d": "Bar"}) - assert subject.Selector.parse(self.file, '.IfcElement["a.b"."c.d"="Bar"]') == [element] - - def test_selecting_a_property_which_includes_an_escaped_quote(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name='"a.b"') - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={'"c.d"': "Bar"}) - assert subject.Selector.parse(self.file, r'.IfcElement["\"a.b\""."\"c.d\""="Bar"]') == [element] - - def test_comparing_if_value_is_in_a_list(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element.Name = "Foobar" - assert subject.Selector.parse(self.file, '.IfcElement[Name%="Foobar,Foobaz"]') == [element] - element.Name = "Foobaz" - assert subject.Selector.parse(self.file, '.IfcElement[Name%="Foobar,Foobaz"]') == [element] - element.Name = "Foobat" - assert subject.Selector.parse(self.file, '.IfcElement[Name%="Foobar,Foobaz"]') == [] - - def test_getting_occurrences_of_a_filtered_type(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") - ifcopenshell.api.run("type.assign_type", self.file, related_objects=[element], relating_type=element_type) - element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element_type2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") - ifcopenshell.api.run("type.assign_type", self.file, related_objects=[element2], relating_type=element_type2) - assert set(subject.Selector.parse(self.file, "* .IfcWallType")) == {element, element2} - - def test_getting_decomposition_of_a_filtered_type(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcMember") - building = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBuilding") - ifcopenshell.api.run("spatial.assign_container", self.file, products=[element], relating_structure=building) - ifcopenshell.api.run("aggregate.assign_object", self.file, products=[subelement], relating_object=element) - assert set(subject.Selector.parse(self.file, "@ .IfcBuilding")) == {element, subelement} - - def test_selecting_elements_from_a_prefiltered_list(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element2 = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcSlab") - assert subject.Selector.parse(self.file, ".IfcWall", elements=[element]) - assert not subject.Selector.parse(self.file, ".IfcWall", elements=[element2]) - - def test_selecting_a_property_via_a_wildcard_pset_name(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foobar") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": "Bar"}) - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foobaz") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": "Baz"}) - assert subject.Selector.parse(self.file, '.IfcElement[r"Foo.*"."Foo"="Bar"]') == [element] - - def test_selecting_a_property_via_a_wildcard_property_name(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foobar") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": "Bar"}) - pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="Foobaz") - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Foo": "Baz"}) - assert subject.Selector.parse(self.file, '.IfcElement[r"Foo.*"."F.*"="Bar"]') == [element] - - def test_selecting_an_attribute_via_a_type(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - element_type = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWallType") - element_type.Name = "Foo" - ifcopenshell.api.run("type.assign_type", self.file, related_objects=[element], relating_type=element_type) - assert set(subject.Selector.parse(self.file, '.IfcWall[type.Name="Foo"]')) == {element} - - def test_selecting_via_a_material(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - material = ifcopenshell.api.run("material.add_material", self.file, name="CON01") - ifcopenshell.api.run("material.assign_material", self.file, products=[element], material=material) - assert set(subject.Selector.parse(self.file, '.IfcWall[material.Name="CON01"]')) == {element} - - def test_selecting_via_a_material_set(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - material = ifcopenshell.api.run("material.add_material", self.file, name="CON01") - material_set = ifcopenshell.api.run( - "material.add_material_set", self.file, name="FOO", set_type="IfcMaterialLayerSet" - ) - layer = ifcopenshell.api.run("material.add_layer", self.file, layer_set=material_set, material=material) - ifcopenshell.api.run("material.edit_layer", self.file, layer=layer, attributes={"LayerThickness": 13}) - ifcopenshell.api.run("material.assign_material", self.file, products=[element], material=material_set) - assert set(subject.Selector.parse(self.file, '.IfcWall[material.LayerSetName="FOO"]')) == {element} - - def test_selecting_via_a_material_set_item(self): - element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") - material = ifcopenshell.api.run("material.add_material", self.file, name="CON01") - material2 = ifcopenshell.api.run("material.add_material", self.file, name="CON02") - material_set = ifcopenshell.api.run( - "material.add_material_set", self.file, name="FOO", set_type="IfcMaterialLayerSet" - ) - layer = ifcopenshell.api.run("material.add_layer", self.file, layer_set=material_set, material=material) - layer = ifcopenshell.api.run("material.add_layer", self.file, layer_set=material_set, material=material2) - ifcopenshell.api.run("material.assign_material", self.file, products=[element], material=material_set) - assert set(subject.Selector.parse(self.file, '.IfcWall[material.item.Material.Name="CON01"]')) == {element} - assert set(subject.Selector.parse(self.file, '.IfcWall[material.item.Material.Name="CON02"]')) == {element} - assert set(subject.Selector.parse(self.file, '.IfcWall[material.item.Material.Name="CON03"]')) == set() From 03b2afbb31530518220cca9f6935b8766eaaea2d Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Jun 2024 20:08:23 +1000 Subject: [PATCH 422/429] Fix IfcCSV docs to use new selector syntax. --- src/ifcopenshell-python/docs/ifccsv.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifcopenshell-python/docs/ifccsv.rst b/src/ifcopenshell-python/docs/ifccsv.rst index 3c9f93b766..34b114258c 100644 --- a/src/ifcopenshell-python/docs/ifccsv.rst +++ b/src/ifcopenshell-python/docs/ifccsv.rst @@ -115,7 +115,7 @@ Here is a minimal example of how to use IfcCSV as a library: model = ifcopenshell.open("/path/to/model.ifc") # Using the selector is optional. You may specify elements as a list manually if you prefer. # e.g. elements = model.by_type("IfcElement") - elements = ifcopenshell.util.selector.Selector.parse(model, ".IfcElement") + elements = ifcopenshell.util.selector.filter_elements(model, "IfcElement") attributes = ["Name", "Description"] # Export our model's elements and their attributes to a CSV. From c9d724fe18cc506090dc88fd62e01139db6996dd Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Jun 2024 21:53:21 +1000 Subject: [PATCH 423/429] You can now set a default spatial container. This will supersede having an active Blender collection selected. --- .../blenderbim/bim/module/spatial/__init__.py | 1 + .../blenderbim/bim/module/spatial/data.py | 10 +++++++ .../blenderbim/bim/module/spatial/operator.py | 15 ++++++---- .../blenderbim/bim/module/spatial/prop.py | 1 + .../blenderbim/bim/module/spatial/ui.py | 30 +++++++++++-------- src/blenderbim/blenderbim/core/spatial.py | 4 +++ src/blenderbim/blenderbim/core/tool.py | 1 + src/blenderbim/blenderbim/tool/spatial.py | 4 +++ 8 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py index 033d7349c0..a0e41976c0 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py @@ -37,6 +37,7 @@ classes = ( operator.SelectDecomposedElements, operator.SelectProduct, operator.SelectSimilarContainer, + operator.SetDefaultContainer, prop.SpatialElement, prop.Element, prop.BIMSpatialProperties, diff --git a/src/blenderbim/blenderbim/bim/module/spatial/data.py b/src/blenderbim/blenderbim/bim/module/spatial/data.py index 5b82cdccad..63fe167a81 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/data.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/data.py @@ -92,9 +92,19 @@ class SpatialDecompositionData: def load(cls): cls.is_loaded = True cls.data = { + "default_container": cls.default_container(), "subelement_class": cls.subelement_class(), } + @classmethod + def default_container(cls) -> str: + props = bpy.context.scene.BIMSpatialDecompositionProperties + if props.default_container: + try: + return tool.Ifc.get().by_id(props.default_container).Name + except: + pass + @classmethod def subelement_class(cls): results = [] diff --git a/src/blenderbim/blenderbim/bim/module/spatial/operator.py b/src/blenderbim/blenderbim/bim/module/spatial/operator.py index 9d4038c5e2..14bb84f09d 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/operator.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/operator.py @@ -17,16 +17,12 @@ # along with BlenderBIM Add-on. If not, see . import bpy -import ifcopenshell.api -import ifcopenshell.util.element import blenderbim.tool as tool import blenderbim.core.spatial as core import blenderbim.core.geometry import blenderbim.core.aggregate import blenderbim.core.root import blenderbim.bim.handler -from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.spatial.data import SpatialData class ReferenceStructure(bpy.types.Operator, tool.Ifc.Operator): @@ -235,4 +231,13 @@ class SelectDecomposedElements(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): core.select_decomposed_elements(tool.Spatial) - return {"FINISHED"} + + +class SetDefaultContainer(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.set_default_container" + bl_label = "Set Default Container" + bl_options = {"REGISTER", "UNDO"} + container: bpy.props.IntProperty() + + def _execute(self, context): + core.set_default_container(tool.Spatial, container=tool.Ifc.get().by_id(self.container)) diff --git a/src/blenderbim/blenderbim/bim/module/spatial/prop.py b/src/blenderbim/blenderbim/bim/module/spatial/prop.py index b4badb994b..1e1f6916c1 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/prop.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/prop.py @@ -131,6 +131,7 @@ class BIMSpatialDecompositionProperties(PropertyGroup): active_element_index: IntProperty(name="Active Element Index") total_elements: IntProperty(name="Total Elements") subelement_class: bpy.props.EnumProperty(items=get_subelement_class, name="Subelement Class") + default_container: IntProperty(name="Default Container", default=0) @property def active_container(self): diff --git a/src/blenderbim/blenderbim/bim/module/spatial/ui.py b/src/blenderbim/blenderbim/bim/module/spatial/ui.py index da7a761af9..5f9eabf9d7 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/ui.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/ui.py @@ -109,30 +109,34 @@ class BIM_PT_spatial_decomposition(Panel): SpatialDecompositionData.load() self.props = context.scene.BIMSpatialDecompositionProperties - if self.props.active_container: + if SpatialDecompositionData.data['default_container']: row = self.layout.row(align=True) row.label( - text=f"Active: {self.props.active_container.name}", + text=f"Default: {SpatialDecompositionData.data['default_container']}", icon="OUTLINER_COLLECTION", ) row.operator("bim.import_spatial_decomposition", icon="FILE_REFRESH", text="") + else: + row = self.layout.row(align=True) + row.label(text="Warning: No Default Container", icon="ERROR") + row.operator("bim.import_spatial_decomposition", icon="FILE_REFRESH", text="") - if self.props.active_container.ifc_class != "IfcProject": - row = self.layout.row(align=True) - row.operator("bim.select_decomposed_elements", icon="HIDE_OFF", text=f"Isolate {self.props.active_container.ifc_class}") - row.operator("bim.delete_container", icon="X", text="").container = ( - self.props.active_container.ifc_definition_id - ) - + if self.props.active_container: + ifc_definition_id = self.props.active_container.ifc_definition_id if self.props.active_container else 0 row = self.layout.row(align=True) row.prop(self.props, "subelement_class", text="") op = row.operator("bim.add_part_to_object", icon="ADD", text="") - op.element = self.props.active_container.ifc_definition_id + op.element = ifc_definition_id op.part_class = self.props.subelement_class - else: + row = self.layout.row(align=True) - row.label(text="Warning: No Active Container", icon="ERROR") - row.operator("bim.import_spatial_decomposition", icon="FILE_REFRESH", text="") + if self.props.active_container.ifc_class == "IfcProject": + row.enabled = False + op = row.operator("bim.set_default_container", icon="OUTLINER_COLLECTION", text="Set Default") + op.container = ifc_definition_id + row.operator("bim.select_decomposed_elements", icon="HIDE_OFF", text=f"Isolate {self.props.active_container.ifc_class}") + op = row.operator("bim.delete_container", icon="X", text="") + op.container = ifc_definition_id self.layout.template_list( "BIM_UL_containers_manager", diff --git a/src/blenderbim/blenderbim/core/spatial.py b/src/blenderbim/blenderbim/core/spatial.py index bc22396a28..bc275678da 100644 --- a/src/blenderbim/blenderbim/core/spatial.py +++ b/src/blenderbim/blenderbim/core/spatial.py @@ -238,3 +238,7 @@ def toggle_hide_spaces(ifc, spatial): if not spaces: return spatial.toggle_hide_spaces(spaces) + + +def set_default_container(spatial: tool.Spatial, container: ifcopenshell.entity_instance): + spatial.set_default_container(container) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 7b66ce782e..b849b7b1d3 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -855,6 +855,7 @@ class Spatial: def select_products(cls, products, unhide=False): pass def set_active_object(cls, obj): pass def set_relative_object_matrix(cls, target_obj, relative_to_obj, matrix): pass + def set_default_container(cls, container): pass def show_scene_objects(cls): pass #HERE STARTS SPATIAL TOOL def is_bounding_class(cls, visible_element): pass diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index 5c9fa44ff9..f00aa843bd 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -826,3 +826,7 @@ class Spatial(blenderbim.core.tool.Spatial): for space in spaces: obj = tool.Ifc.get_object(space) obj.hide_set(False) + + @classmethod + def set_default_container(cls, container): + bpy.context.scene.BIMSpatialDecompositionProperties.default_container = container.id() From 4078140079bc478efe8fba2a7a47b22cdbf8ac99 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 7 Jun 2024 15:14:30 +0500 Subject: [PATCH 424/429] distance_limit, false_origin tooltips --- src/blenderbim/blenderbim/bim/module/project/prop.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/project/prop.py b/src/blenderbim/blenderbim/bim/module/project/prop.py index 6e34461be4..d56392fe31 100644 --- a/src/blenderbim/blenderbim/bim/module/project/prop.py +++ b/src/blenderbim/blenderbim/bim/module/project/prop.py @@ -172,8 +172,16 @@ class BIMProjectProperties(PropertyGroup): deflection_tolerance: FloatProperty(name="Deflection Tolerance", default=0.001) angular_tolerance: FloatProperty(name="Angular Tolerance", default=0.5) void_limit: IntProperty(name="Void Limit", default=30) - distance_limit: FloatProperty(name="Distance Limit", default=1000) - false_origin: StringProperty(name="False Origin", default="0,0,0") + distance_limit: FloatProperty(name="Distance Limit", default=1000, subtype="DISTANCE") + false_origin: StringProperty( + name="False Origin", + description=( + "False origin that will be used to offset the entire model.\n" + "(0,0,0) value is interpreted as an unset false origin - false origin will be guessed based on Distance Limit.\n" + "False origin is defined in project units" + ), + default="0,0,0", + ) element_offset: IntProperty(name="Element Offset", default=0) element_limit: IntProperty(name="Element Offset", default=30000) should_disable_undo_on_save: BoolProperty( From f8a5ce34a8d5349ff8d300c6b61704ca229c0fc8 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 7 Jun 2024 16:29:52 +0500 Subject: [PATCH 425/429] fix redeclarations in tests --- src/ifcopenshell-python/test/api/context/test_edit_context.py | 2 +- .../test/api/cost/test_remove_cost_schedule.py | 2 +- src/ifcopenshell-python/test/api/test_api.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ifcopenshell-python/test/api/context/test_edit_context.py b/src/ifcopenshell-python/test/api/context/test_edit_context.py index 210f667f7d..87fd8ddbd7 100644 --- a/src/ifcopenshell-python/test/api/context/test_edit_context.py +++ b/src/ifcopenshell-python/test/api/context/test_edit_context.py @@ -60,5 +60,5 @@ class TestEditContext(test.bootstrap.IFC4): assert subcontext.UserDefinedTargetView == "UserDefinedTargetView" -class TestEditContext(test.bootstrap.IFC2X3, TestEditContext): +class TestEditContextIFC2X3(test.bootstrap.IFC2X3, TestEditContext): pass diff --git a/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py b/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py index 7b2d534653..7e86eabe7b 100644 --- a/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py +++ b/src/ifcopenshell-python/test/api/cost/test_remove_cost_schedule.py @@ -37,5 +37,5 @@ class TestRemoveCostSchedule(test.bootstrap.IFC4): assert not self.file.by_type("IfcRelAssignsToControl") -class TestRemoveCostSchedule(test.bootstrap.IFC2X3, TestRemoveCostSchedule): +class TestRemoveCostScheduleIFC2X3(test.bootstrap.IFC2X3, TestRemoveCostSchedule): pass diff --git a/src/ifcopenshell-python/test/api/test_api.py b/src/ifcopenshell-python/test/api/test_api.py index a0a35794c0..9e2e2f31bd 100644 --- a/src/ifcopenshell-python/test/api/test_api.py +++ b/src/ifcopenshell-python/test/api/test_api.py @@ -284,7 +284,7 @@ class TestTemporarySupportForDeprecatedAPIArguments(test.bootstrap.IFC4): assert rel.is_a("IfcRelReferencedInSpatialStructure") @deprecation_check - def test_removing_a_container(self): + def test_removing_a_structure(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcBuilding") subelement = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall") ifcopenshell.api.run( From 5c41baeaf132f3ff9487db6bc804c8d7449033fc Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 7 Jun 2024 17:13:56 +0500 Subject: [PATCH 426/429] remove_work_plan - unassign work schedules #4819 --- .../api/sequence/assign_workplan.py | 1 + .../api/sequence/remove_work_plan.py | 7 ++- .../api/sequence/test_remove_work_plan.py | 46 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py index e2ed6b7c00..de73e98104 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_workplan.py @@ -20,6 +20,7 @@ import ifcopenshell import ifcopenshell.api +# TODO: rename to assign_work_plan for consistency def assign_workplan( file: ifcopenshell.file, work_schedule: ifcopenshell.entity_instance, work_plan: ifcopenshell.entity_instance ) -> ifcopenshell.entity_instance: diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py index b34d6bc6eb..bf027f1581 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_plan.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.api.aggregate import ifcopenshell.util.element @@ -44,13 +45,17 @@ def remove_work_plan(file: ifcopenshell.file, work_plan: ifcopenshell.entity_ins """ settings = {"work_plan": work_plan} - # TODO: do a deep purge ifcopenshell.api.run( "project.unassign_declaration", file, definitions=[settings["work_plan"]], relating_context=file.by_type("IfcContext")[0], ) + + related_objects = [obj for rel in work_plan.IsDecomposedBy for obj in rel.RelatedObjects] + if related_objects: + ifcopenshell.api.aggregate.unassign_object(file, related_objects) + history = settings["work_plan"].OwnerHistory file.remove(settings["work_plan"]) if history: diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py b/src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py new file mode 100644 index 0000000000..f9e7fa186b --- /dev/null +++ b/src/ifcopenshell-python/test/api/sequence/test_remove_work_plan.py @@ -0,0 +1,46 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import pytest +import test.bootstrap +import ifcopenshell.api +import ifcopenshell.api.sequence + + +def declared_objects(ifc_file: ifcopenshell.file) -> set[ifcopenshell.entity_instance]: + project = ifc_file.by_type("IfcProject")[0] + declared = {obj for rel in project.Declares for obj in rel.RelatedDefinitions} + return declared + + +# NOTE: sequence module features relies on entities introduced in IFC4 +# therefore no IFC2X3 tests +class TestRemoveWorkPlan(test.bootstrap.IFC4): + def test_remove_work_plan(self): + self.file.create_entity("IfcProject") + work_plan = ifcopenshell.api.sequence.add_work_plan(self.file) + work_schedule = ifcopenshell.api.sequence.add_work_schedule(self.file) + ifcopenshell.api.sequence.assign_workplan(self.file, work_schedule, work_plan) + ifcopenshell.api.sequence.remove_work_plan(self.file, work_plan=work_plan) + assert len(self.file.by_type("IfcWorkPlan")) == 0 + assert declared_objects(self.file) == set() + assert len(self.file.by_type("IfcRelAggregates")) == 0 + + +class TestRemoveWorkPlanIFC4X3(test.bootstrap.IFC4X3, TestRemoveWorkPlan): + pass From 61c2a2c6c6e3b853981a5a56ccbacdaf6269d34f Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 7 Jun 2024 17:14:03 +0500 Subject: [PATCH 427/429] remove_work_schedule to unassign a work schedule from a work plan #4819 --- .../api/sequence/remove_work_schedule.py | 7 +++ .../api/sequence/test_remove_work_schedule.py | 62 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/ifcopenshell-python/test/api/sequence/test_remove_work_schedule.py diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py index c648cfc576..1a6d8b8e2b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/remove_work_schedule.py @@ -18,6 +18,7 @@ import ifcopenshell import ifcopenshell.api +import ifcopenshell.api.aggregate import ifcopenshell.util.element @@ -54,6 +55,7 @@ def remove_work_schedule(file: ifcopenshell.file, work_schedule: ifcopenshell.en definitions=[settings["work_schedule"]], relating_context=file.by_type("IfcContext")[0], ) + if settings["work_schedule"].Declares: for rel in settings["work_schedule"].Declares: for work_schedule in rel.RelatedObjects: @@ -62,6 +64,11 @@ def remove_work_schedule(file: ifcopenshell.file, work_schedule: ifcopenshell.en file, work_schedule=work_schedule, ) + + # Unassign from work plans. + if settings["work_schedule"].Decomposes: + ifcopenshell.api.aggregate.unassign_object(file, [settings["work_schedule"]]) + for inverse in file.get_inverse(settings["work_schedule"]): if inverse.is_a("IfcRelDefinesByObject"): if inverse.RelatingObject == settings["work_schedule"] or len(inverse.RelatedObjects) == 1: diff --git a/src/ifcopenshell-python/test/api/sequence/test_remove_work_schedule.py b/src/ifcopenshell-python/test/api/sequence/test_remove_work_schedule.py new file mode 100644 index 0000000000..c4a3bd2d25 --- /dev/null +++ b/src/ifcopenshell-python/test/api/sequence/test_remove_work_schedule.py @@ -0,0 +1,62 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + +import pytest +import test.bootstrap +import ifcopenshell.api +import ifcopenshell.api.sequence + + +def declared_objects(ifc_file: ifcopenshell.file) -> set[ifcopenshell.entity_instance]: + project = ifc_file.by_type("IfcProject")[0] + declared = {obj for rel in project.Declares for obj in rel.RelatedDefinitions} + return declared + + +# NOTE: sequence module features relies on entities introduced in IFC4 +# therefore no IFC2X3 tests +class TestRemoveWorkSchedule(test.bootstrap.IFC4): + def test_remove_work_schedule(self): + self.file.create_entity("IfcProject") + work_schedule = ifcopenshell.api.sequence.add_work_schedule(self.file) + + work_plan = ifcopenshell.api.sequence.add_work_plan(self.file) + ifcopenshell.api.sequence.assign_workplan(self.file, work_schedule, work_plan) + + work_schedule1 = ifcopenshell.api.sequence.add_work_schedule(self.file) + rel = self.file.create_entity("IfcRelDefinesByObject") + rel.RelatingObject = work_schedule + rel.RelatedObjects = [work_schedule1] + + ifcopenshell.api.sequence.add_task(self.file, work_schedule=work_schedule) + + ifcopenshell.api.sequence.remove_work_schedule(self.file, work_schedule=work_schedule) + # Remove workschedule and subschedules. + assert len(self.file.by_type("IfcWorkSchedule")) == 0 + assert len(self.file.by_type("IfcRelDefinesByObject")) == 0 + # Unassign from a work plan. + assert len(self.file.by_type("IfcRelAggregates")) == 0 + # Remove related IfcTasks. + assert len(self.file.by_type("IfcTask")) == 0 + assert len(self.file.by_type("IfcRelAssignsToControl")) == 0 + # Unassign from a project. + assert declared_objects(self.file) == {work_plan} + + +class TestRemoveWorkScheduleIFC4X3(test.bootstrap.IFC4X3, TestRemoveWorkSchedule): + pass From db98f1398223bf5be240586dc4582415d0ed8c4d Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 4 Jun 2024 13:50:00 +0500 Subject: [PATCH 428/429] typing --- src/blenderbim/blenderbim/bim/import_ifc.py | 49 +++++++++++-------- src/blenderbim/blenderbim/tool/loader.py | 6 ++- .../ifcopenshell/entity_instance.py | 2 +- .../ifcopenshell/geom/main.py | 8 ++- .../ifcopenshell/util/element.py | 4 +- .../ifcopenshell/util/shape_builder.py | 12 ++--- 6 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 6df397b30f..8c05315643 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -232,19 +232,19 @@ class IfcImporter: self.material_creator = MaterialCreator(ifc_import_settings, self) - def profile_code(self, message): + def profile_code(self, message: str) -> None: if not self.time: self.time = time.time() print("{} :: {:.2f}".format(message, time.time() - self.time)) self.time = time.time() self.update_progress(self.progress + 1) - def update_progress(self, progress): + def update_progress(self, progress: float) -> None: if progress <= 100: self.progress = progress bpy.context.window_manager.progress_update(self.progress) - def execute(self): + def execute(self) -> None: bpy.context.window_manager.progress_begin(0, 100) self.profile_code("Starting import process") self.load_file() @@ -324,7 +324,7 @@ class IfcImporter: coords = getattr(point, "Coordinates", point) return abs(coords[0]) > limit or abs(coords[1]) > limit or abs(coords[2]) > limit - def process_context_filter(self): + def process_context_filter(self) -> None: # Annotation ContextType is to accommodate broken Revit files # See https://github.com/Autodesk/revit-ifc/issues/187 type_priority = ["Model", "Plan", "Annotation"] @@ -412,7 +412,7 @@ class IfcImporter: settings.set_context_ids([context.id()]) self.gross_context_settings.append(settings) - def process_element_filter(self): + def process_element_filter(self) -> None: offset = self.ifc_import_settings.element_offset offset_limit = offset + self.ifc_import_settings.element_limit @@ -479,7 +479,7 @@ class IfcImporter: break return results - def parse_native_elements(self): + def parse_native_elements(self) -> None: if not self.ifc_import_settings.should_load_geometry: return for element in self.elements: @@ -487,13 +487,13 @@ class IfcImporter: self.native_elements.add(element) self.elements -= self.native_elements - def is_native(self, element): + def is_native(self, element: ifcopenshell.entity_instance) -> bool: if ( not element.Representation or not element.Representation.Representations or getattr(element, "HasOpenings", None) ): - return + return False representation = None representation_priority = None @@ -508,7 +508,7 @@ class IfcImporter: context = rep.ContextOfItems if not representation: - return + return False matrix = np.eye(4) representation_id = None @@ -566,8 +566,11 @@ class IfcImporter: "type": "IfcFaceBasedSurfaceModel", } return True + return False - def is_native_swept_disk_solid(self, element, representation): + def is_native_swept_disk_solid( + self, element: ifcopenshell.entity_instance, representation: ifcopenshell.entity_instance + ) -> bool: items = [i["item"] for i in ifcopenshell.util.representation.resolve_items(representation)] if len(items) == 1 and items[0].is_a("IfcSweptDiskSolid"): if tool.Blender.Modifier.is_railing(element): @@ -583,20 +586,20 @@ class IfcImporter: return True return False - def is_native_faceted_brep(self, representation): + def is_native_faceted_brep(self, representation: ifcopenshell.entity_instance) -> bool: # TODO handle mapped items for i in representation.Items: if i.is_a() != "IfcFacetedBrep": return False return True - def is_native_face_based_surface_model(self, representation): + def is_native_face_based_surface_model(self, representation: ifcopenshell.entity_instance) -> bool: for i in representation.Items: if i.is_a() != "IfcFaceBasedSurfaceModel": return False return True - def get_products_from_shape_representation(self, element): + def get_products_from_shape_representation(self, element: ifcopenshell.entity_instance) -> None: products = [pr.ShapeOfProduct[0] for pr in element.OfProductRepresentation] for rep_map in element.RepresentationMap: for usage in rep_map.MapUsage: @@ -605,7 +608,7 @@ class IfcImporter: products.extend(self.get_products_from_shape_representation(inverse_element)) return products - def predict_dense_mesh(self): + def predict_dense_mesh(self) -> None: if self.ifc_import_settings.should_use_native_meshes: return @@ -632,7 +635,7 @@ class IfcImporter: if faces and max(faces) > threshold: self.ifc_import_settings.should_use_native_meshes = True - def calculate_model_offset(self): + def calculate_model_offset(self) -> None: props = bpy.context.scene.BIMGeoreferenceProperties if props.has_blender_offset: return @@ -650,14 +653,14 @@ class IfcImporter: return self.guess_false_origin_and_project_north(building) return self.guess_false_origin() - def set_manual_blender_offset(self): + def set_manual_blender_offset(self) -> None: props = bpy.context.scene.BIMGeoreferenceProperties props.blender_eastings = str(self.ifc_import_settings.false_origin[0]) props.blender_northings = str(self.ifc_import_settings.false_origin[1]) props.blender_orthogonal_height = str(self.ifc_import_settings.false_origin[2]) props.has_blender_offset = True - def guess_false_origin_and_project_north(self, element): + def guess_false_origin_and_project_north(self, element: ifcopenshell.entity_instance) -> None: if not element.ObjectPlacement or not element.ObjectPlacement.is_a("IfcLocalPlacement"): return placement = ifcopenshell.util.placement.get_local_placement(element.ObjectPlacement) @@ -672,7 +675,7 @@ class IfcImporter: props.blender_x_axis_ordinate = str(placement[1][0]) props.has_blender_offset = True - def guess_false_origin(self): + def guess_false_origin(self) -> None: # Civil BIM applications like to work in absolute coordinates, where the # ObjectPlacement is usually 0,0,0 (but not always, so we'll need to # check for the actual transformation) but each individual coordinate of @@ -1909,13 +1912,17 @@ class IfcImporter: polyline.points[-1].co = mathutils.Vector(v2) return curve - def create_mesh(self, element: ifcopenshell.entity_instance, shape) -> bpy.types.Mesh: + def create_mesh( + self, + element: ifcopenshell.entity_instance, + shape: Union[ifcopenshell.geom.ShapeElementType, ifcopenshell.geom.ShapeType], + ) -> bpy.types.Mesh: try: if hasattr(shape, "geometry"): # shape is ifcopenshell_wrapper.TriangulationElement - geometry: ifcopenshell_wrapper.Triangulation = shape.geometry + geometry = shape.geometry else: - geometry: ifcopenshell_wrapper.Triangulation = shape + geometry = shape mesh = bpy.data.meshes.new(tool.Loader.get_mesh_name(geometry)) diff --git a/src/blenderbim/blenderbim/tool/loader.py b/src/blenderbim/blenderbim/tool/loader.py index aac640d4da..b6a507a668 100644 --- a/src/blenderbim/blenderbim/tool/loader.py +++ b/src/blenderbim/blenderbim/tool/loader.py @@ -19,6 +19,7 @@ import re import bpy import bmesh +import ifcopenshell.geom import ifcopenshell.util.element import blenderbim.core.tool import blenderbim.tool as tool @@ -55,9 +56,12 @@ class Loader(blenderbim.core.tool.Loader): return collection @classmethod - def get_mesh_name(cls, geometry) -> str: + def get_mesh_name(cls, geometry: ifcopenshell.geom.ShapeType) -> str: representation_id = geometry.id if "-" in representation_id: + # Example: 2432-openings-2468, where + # 2432 is mapped representation id + # and 2468 is IFCRELVOIDSELEMENT representation_id = int(re.sub(r"\D", "", representation_id.split("-")[0])) else: representation_id = int(re.sub(r"\D", "", representation_id)) diff --git a/src/ifcopenshell-python/ifcopenshell/entity_instance.py b/src/ifcopenshell-python/ifcopenshell/entity_instance.py index 5de590b9f5..8125fa573f 100644 --- a/src/ifcopenshell-python/ifcopenshell/entity_instance.py +++ b/src/ifcopenshell-python/ifcopenshell/entity_instance.py @@ -169,7 +169,7 @@ class entity_instance: return file.from_pointer(self.wrapped_data.file_pointer()) - def __getattr__(self, name): + def __getattr__(self, name: str) -> Any: INVALID, FORWARD, INVERSE = range(3) attr_cat = self.wrapped_data.get_attribute_category(name) if attr_cat == FORWARD: diff --git a/src/ifcopenshell-python/ifcopenshell/geom/main.py b/src/ifcopenshell-python/ifcopenshell/geom/main.py index 3cd1cb3c5c..dad21c9c88 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/main.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/main.py @@ -27,9 +27,13 @@ from ..entity_instance import entity_instance from . import has_occ -from typing import TypeVar, Union, Optional +from typing import TypeVar, Union, Optional, Generator T = TypeVar("T") +ShapeElementType = Union[ + ifcopenshell_wrapper.BRepElement, ifcopenshell_wrapper.TriangulationElement, ifcopenshell_wrapper.SerializedElement +] +ShapeType = Union[ifcopenshell_wrapper.BRep, ifcopenshell_wrapper.Triangulation, ifcopenshell_wrapper.Serialization] def wrap_shape_creation(settings, shape): @@ -122,7 +126,7 @@ class iterator(ifcopenshell_wrapper.Iterator): def get(self): return wrap_shape_creation(self.settings, ifcopenshell_wrapper.Iterator.get(self)) - def __iter__(self): + def __iter__(self) -> Generator[ShapeElementType, None, None]: if self.initialize(): while True: yield self.get() diff --git a/src/ifcopenshell-python/ifcopenshell/util/element.py b/src/ifcopenshell-python/ifcopenshell/util/element.py index e6c1cf750e..3932f4fd95 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/element.py +++ b/src/ifcopenshell-python/ifcopenshell/util/element.py @@ -738,7 +738,7 @@ def get_elements_by_style( def get_elements_by_representation( ifc_file: ifcopenshell.file, representation: ifcopenshell.entity_instance -) -> list[ifcopenshell.entity_instance]: +) -> set[ifcopenshell.entity_instance]: """Gets all elements using a geometric representation :param ifc_file: The IFC file @@ -746,7 +746,7 @@ def get_elements_by_representation( :param representation: The IfcShapeRepresentation representation :type representation: ifcopenshell.entity_instance :return: The elements using the geometric representation - :rtype: list[ifcopenshell.entity_instance] + :rtype: set[ifcopenshell.entity_instance] Example: diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py index 81ec583419..fac2f12bf1 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py @@ -26,7 +26,7 @@ import ifcopenshell.util.element import ifcopenshell.util.representation import ifcopenshell.util.unit from math import cos, sin, pi, tan, radians, degrees, atan, sqrt, ceil -from typing import Union, Optional, Literal, Any +from typing import Union, Optional, Literal, Any, Sequence from itertools import chain from mathutils import Vector, Matrix @@ -304,9 +304,9 @@ class ShapeBuilder: x_axis_radius: float, y_axis_radius: float, position=Vector((0.0, 0.0)).freeze(), - trim_points: list[Vector] = (), + trim_points: Sequence[Vector] = (), ref_x_direction: Vector = Vector((1.0, 0.0)), - trim_points_mask: list[int] = (), + trim_points_mask: Sequence[int] = (), ) -> ifcopenshell.entity_instance: """ Ellipse trimming points should be specified in counter clockwise order. @@ -345,7 +345,7 @@ class ShapeBuilder: self, outer_curve: ifcopenshell.entity_instance, name: Optional[str] = None, - inner_curves: list[ifcopenshell.entity_instance] = (), + inner_curves: Sequence[ifcopenshell.entity_instance] = (), profile_type: str = "AREA", ) -> ifcopenshell.entity_instance: # > inner_curves - list of IfcCurve; @@ -882,8 +882,8 @@ class ShapeBuilder: def get_simple_2dcurve_data( self, coords: list[Vector], - fillets: list[int] = (), - fillet_radius: list[float] = (), + fillets: Sequence[int] = (), + fillet_radius: Sequence[float] = (), closed: bool = True, create_ifc_curve: bool = False, ) -> tuple[list[Vector], list[tuple[int, int], Union[ifcopenshell.entity_instance, None]]]: From e3cb811225d232cd85b83af9e4da08bb9b770f5a Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Jun 2024 22:55:11 +1000 Subject: [PATCH 429/429] WARNING: Remove collection syncing. The outliner no longer is used to change spatial hierarchy. This is a BREAKING change (on purpose). If you want to change containment / aggregation, use the UI panels, not drag and drop on the outliner. --- src/blenderbim/blenderbim/bim/export_ifc.py | 1 - src/blenderbim/blenderbim/bim/import_ifc.py | 4 +- .../bim/module/aggregate/operator.py | 1 - .../blenderbim/bim/module/project/operator.py | 3 +- src/blenderbim/blenderbim/core/project.py | 7 +- src/blenderbim/blenderbim/core/root.py | 8 +- src/blenderbim/blenderbim/core/spatial.py | 1 - src/blenderbim/blenderbim/core/tool.py | 4 + src/blenderbim/blenderbim/tool/collector.py | 75 ------------------- src/blenderbim/blenderbim/tool/root.py | 20 +++++ src/blenderbim/blenderbim/tool/spatial.py | 28 +++++-- src/blenderbim/test/core/test_spatial.py | 2 - 12 files changed, 62 insertions(+), 92 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/export_ifc.py b/src/blenderbim/blenderbim/bim/export_ifc.py index 94d457918d..27be04efc4 100644 --- a/src/blenderbim/blenderbim/bim/export_ifc.py +++ b/src/blenderbim/blenderbim/bim/export_ifc.py @@ -99,7 +99,6 @@ class IfcExporter: continue if obj.library: continue - tool.Collector.sync(obj, skip_unlinking) result = self.sync_object_placement(obj) if result: results.append(result) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index 8c05315643..7bc9e93a72 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -302,7 +302,9 @@ class IfcImporter: self.setup_viewport_camera() self.setup_arrays() self.profile_code("Setup arrays") - blenderbim.core.spatial.import_spatial_decomposition(tool.Spatial) + tool.Spatial.run_spatial_import_spatial_decomposition() + if default_container := tool.Spatial.guess_default_container(): + tool.Spatial.set_default_container(default_container) self.update_progress(100) bpy.context.window_manager.progress_end() diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index a719cea549..be53675341 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -159,7 +159,6 @@ class BIM_OT_add_aggregate(bpy.types.Operator, tool.Ifc.Operator): if not element: continue - tool.Collector.sync(obj) current_aggregate = ifcopenshell.util.element.get_aggregate(element) current_container = ifcopenshell.util.element.get_container(element) if current_aggregate: diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 2e6cd2b164..718da372e8 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -122,8 +122,7 @@ class CreateProject(bpy.types.Operator): bpy.data.meshes.remove(mesh) for mat in bpy.data.materials: bpy.data.materials.remove(mat) - core.create_project(tool.Ifc, tool.Project, schema=props.export_schema, template=template) - blenderbim.core.spatial.import_spatial_decomposition(tool.Spatial) + core.create_project(tool.Ifc, tool.Project, tool.Spatial, schema=props.export_schema, template=template) tool.Blender.register_toolbar() def rollback(self, data): diff --git a/src/blenderbim/blenderbim/core/project.py b/src/blenderbim/blenderbim/core/project.py index 6780843592..7ae3ea0aee 100644 --- a/src/blenderbim/blenderbim/core/project.py +++ b/src/blenderbim/blenderbim/core/project.py @@ -25,7 +25,7 @@ if TYPE_CHECKING: import blenderbim.tool as tool -def create_project(ifc: tool.Ifc, project: tool.Project, schema: str, template: Optional[str] = None) -> None: +def create_project(ifc: tool.Ifc, project: tool.Project, spatial: tool.Spatial, schema: str, template: Optional[str] = None) -> None: if ifc.get(): return @@ -90,7 +90,10 @@ def create_project(ifc: tool.Ifc, project: tool.Project, schema: str, template: project.run_aggregate_assign_object(relating_obj=building, related_obj=storey) project.set_context(body) - project.set_active_spatial_element(storey) + spatial.run_spatial_import_spatial_decomposition() + if default_container := spatial.guess_default_container(): + spatial.set_default_container(default_container) + project.create_project_collections() if template: diff --git a/src/blenderbim/blenderbim/core/root.py b/src/blenderbim/blenderbim/core/root.py index 8941ea4b0e..f00198340d 100644 --- a/src/blenderbim/blenderbim/core/root.py +++ b/src/blenderbim/blenderbim/core/root.py @@ -67,7 +67,7 @@ def assign_class( predefined_type: Optional[str] = None, should_add_representation: bool = True, ifc_representation_class: Optional[str] = None, -) -> ifcopenshell.entity_instance: +) -> Optional[ifcopenshell.entity_instance]: """ Args: context: is not optional if `should_add_representation` is True @@ -86,6 +86,10 @@ def assign_class( obj=obj, context=context, ifc_representation_class=ifc_representation_class, profile_set_usage=None ) - collector.sync(obj) + if default_container := root.get_default_container(): + if root.is_spatial_element(element): + ifc.run("aggregate.assign_object", products=[element], relating_object=default_container) + elif root.is_containable(element): + ifc.run("spatial.assign_container", products=[element], relating_structure=default_container) collector.assign(obj) return element diff --git a/src/blenderbim/blenderbim/core/spatial.py b/src/blenderbim/blenderbim/core/spatial.py index bc275678da..48c24e7ab3 100644 --- a/src/blenderbim/blenderbim/core/spatial.py +++ b/src/blenderbim/blenderbim/core/spatial.py @@ -86,7 +86,6 @@ def copy_to_container(ifc, collector, spatial, obj=None, containers=None): element = ifc.get_entity(obj) if not element: return - collector.sync(obj) from_container = spatial.get_container(element) if from_container: matrix = spatial.get_relative_object_matrix(obj, ifc.get_object(from_container)) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index b849b7b1d3..338500ec64 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -689,12 +689,15 @@ class Root: def copy_representation(cls, source, dest): pass def does_type_have_representations(cls, element): pass def get_decomposition_relationships(cls, objs): pass + def get_default_container(cls): pass def get_element_representation(cls, element, context): pass def get_element_type(cls, element): pass def get_object_name(cls, obj): pass def get_object_representation(cls, obj): pass def get_representation_context(cls, representation): pass + def is_containable(cls, element): pass def is_element_a(cls, element, ifc_class): pass + def is_spatial_element(cls, element): pass def link_object_data(cls, source_obj, destination_obj): pass def recreate_decompositions(cls, relationships, old_to_new): pass def run_geometry_add_representation(cls, obj=None, context=None, ifc_representation_class=None, profile_set_usage=None): pass @@ -851,6 +854,7 @@ class Spatial: def import_spatial_decomposition(cls): pass def run_root_copy_class(cls, obj=None): pass def run_spatial_assign_container(cls, structure_obj=None, element_obj=None): pass + def run_spatial_import_spatial_decomposition(cls): pass def select_object(cls, obj): pass def select_products(cls, products, unhide=False): pass def set_active_object(cls, obj): pass diff --git a/src/blenderbim/blenderbim/tool/collector.py b/src/blenderbim/blenderbim/tool/collector.py index f8d7eaa88c..9491fcccb3 100644 --- a/src/blenderbim/blenderbim/tool/collector.py +++ b/src/blenderbim/blenderbim/tool/collector.py @@ -27,81 +27,6 @@ from typing import Union class Collector(blenderbim.core.tool.Collector): - @classmethod - def sync(cls, obj: bpy.types.Object, skip_unlinking=False) -> None: - """Sync object IFC state (assigned containter / aggregate) with the collection it's currently in. - - Then subsequently run `Collector.assign` (if state has changed) - to link them to collections / unlink from anything unrelated collections. - - If `skip_unlinking` is `True` then method won't try to assign parent object - if it's already assigned in IFC saving some time. - But it has a downside not unlinking object from unrelated collections. - """ - # This is the reverse of assign. It reads the Blender collection and figures out its IFC hierarchy - element = tool.Ifc.get_entity(obj) - - if ( - not element - or element.is_a("IfcProject") - or element.is_a("IfcGridAxis") - or element.is_a("IfcOpeningElement") - ): - return - - if not obj.users_collection: - return - - # create related collections - cls._get_own_collection(element, obj) - cls._get_collection(element, obj) - - parent_collection = None - - for collection in obj.users_collection: - if parent_collection: - break - # skip Types and non-BIM collections - if not collection.BIMCollectionProperties.obj: - continue - # for objects that own collections we search for the first parent collection - if collection.BIMCollectionProperties.obj == obj: - collection_name = collection.name - for bpy_collection in bpy.data.collections: - if bpy_collection.children.get(collection_name) and bpy_collection.BIMCollectionProperties.obj: - parent_collection = bpy_collection - parent_obj = bpy_collection.BIMCollectionProperties.obj - break - else: - parent_collection = collection - parent_obj = collection.BIMCollectionProperties.obj - - if not parent_collection: - return - - parent = tool.Ifc.get_entity(parent_obj) - if skip_unlinking: - previous_parent = ifcopenshell.util.element.get_container( - element, should_get_direct=True - ) or ifcopenshell.util.element.get_aggregate(element) - if parent == previous_parent: - return - - if parent: - # This is lazy, but works. One of these will succeed, the other will fail silently. - blenderbim.core.spatial.assign_container( - tool.Ifc, tool.Collector, tool.Spatial, structure_obj=parent_obj, element_obj=obj - ) - # NOTE: won't allow assigning IfcElements to the IfcProject directly - # and some elements might get missing in other viewers if they're don't support displaying - # elements without hierarchy - try: - blenderbim.core.aggregate.assign_object( - tool.Ifc, tool.Aggregate, tool.Collector, relating_obj=parent_obj, related_obj=obj - ) - except blenderbim.core.aggregate.IncompatibleAggregateError: - pass - @classmethod def assign(cls, obj: bpy.types.Object) -> None: """link object and it's owned collection to the proper collection diff --git a/src/blenderbim/blenderbim/tool/root.py b/src/blenderbim/blenderbim/tool/root.py index 057644e9f5..ef9566691c 100644 --- a/src/blenderbim/blenderbim/tool/root.py +++ b/src/blenderbim/blenderbim/tool/root.py @@ -98,6 +98,16 @@ class Root(blenderbim.core.tool.Root): relationships[element] = {"type": "fill", "element": building} return relationships + @classmethod + def get_default_container(cls) -> Optional[ifcopenshell.entity_instance]: + props = bpy.context.scene.BIMSpatialDecompositionProperties + if container := props.default_container: + try: + return tool.Ifc.get().by_id(container) + except: + props.default_container = 0 + return None + @classmethod def get_connection_relationships( cls, objs: list[bpy.types.Object] @@ -162,10 +172,20 @@ class Root(blenderbim.core.tool.Root): def get_representation_context(cls, representation: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: return representation.ContextOfItems + @classmethod + def is_containable(cls, element: ifcopenshell.entity_instance) -> bool: + return element.is_a("IfcElement") or element.is_a("IfcGrid") + @classmethod def is_element_a(cls, element: ifcopenshell.entity_instance, ifc_class: str) -> bool: return element.is_a(ifc_class) + @classmethod + def is_spatial_element(cls, element: ifcopenshell.entity_instance) -> bool: + if tool.Ifc.get().schema == "IFC2X3": + return element.is_a("IfcSpatialStructureElement") + return element.is_a("IfcSpatialElement") + @classmethod def link_object_data(cls, source_obj: bpy.types.Object, destination_obj: bpy.types.Object) -> None: destination_obj.data = source_obj.data diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index f00aa843bd..d092d8ce76 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -30,8 +30,8 @@ import blenderbim.tool as tool import json from math import pi from mathutils import Vector, Matrix -from shapely import Polygon, MultiPolygon -from typing import Generator +from shapely import Polygon +from typing import Generator, Optional class Spatial(blenderbim.core.tool.Spatial): @@ -134,6 +134,10 @@ class Spatial(blenderbim.core.tool.Spatial): tool.Ifc, tool.Collector, tool.Spatial, structure_obj=structure_obj, element_obj=element_obj ) + @classmethod + def run_spatial_import_spatial_decomposition(cls): + return blenderbim.core.spatial.import_spatial_decomposition(tool.Spatial) + @classmethod def select_object(cls, obj): obj.select_set(True) @@ -445,7 +449,6 @@ class Spatial(blenderbim.core.tool.Spatial): @classmethod def get_x_y_z_h_mat_from_active_obj(cls, active_obj): - element = tool.Ifc.get_entity(active_obj) mat = active_obj.matrix_world local_bbox_center = 0.125 * sum((Vector(b) for b in active_obj.bound_box), Vector()) global_bbox_center = mat @ local_bbox_center @@ -518,14 +521,13 @@ class Spatial(blenderbim.core.tool.Spatial): project_unit = ifcopenshell.util.unit.get_project_unit(model, "LENGTHUNIT") prefix = getattr(project_unit, "Prefix", None) - converted_tolerance = ifcopenshell.util.unit.convert( + return ifcopenshell.util.unit.convert( value=tolerance, from_prefix=None, from_unit="METRE", to_prefix=prefix, to_unit=project_unit.Name, ) - return tolerance @classmethod def get_purged_inner_holes_poly(cls, union_geom, min_area): @@ -830,3 +832,19 @@ class Spatial(blenderbim.core.tool.Spatial): @classmethod def set_default_container(cls, container): bpy.context.scene.BIMSpatialDecompositionProperties.default_container = container.id() + + @classmethod + def guess_default_container(cls) -> Optional[ifcopenshell.entity_instance]: + project = tool.Ifc.get().by_type("IfcProject")[0] + subelement = None + # We try to priorise the first Site > Building > Storey as a convention for vertical projects + for subelement in ifcopenshell.util.element.get_parts(project): + if subelement.is_a("IfcSite"): + for subelement2 in ifcopenshell.util.element.get_parts(subelement): + if subelement2.is_a("IfcBuilding"): + for subelement3 in ifcopenshell.util.element.get_parts(subelement2): + if subelement3.is_a("IfcBuildingStorey"): + return subelement3 + if subelement: + return subelement + return None diff --git a/src/blenderbim/test/core/test_spatial.py b/src/blenderbim/test/core/test_spatial.py index 9e01aefde4..8af6f8dffb 100644 --- a/src/blenderbim/test/core/test_spatial.py +++ b/src/blenderbim/test/core/test_spatial.py @@ -80,7 +80,6 @@ class TestRemoveContainer: class TestCopyToContainer: def test_run(self, ifc, collector, spatial): ifc.get_entity("obj").should_be_called().will_return("element") - collector.sync("obj").should_be_called() spatial.get_container("element").should_be_called().will_return("container") ifc.get_object("container").should_be_called().will_return("container_obj") spatial.get_relative_object_matrix("obj", "container_obj").should_be_called().will_return("matrix") @@ -97,7 +96,6 @@ class TestCopyToContainer: def test_using_an_absolute_matrix_if_there_is_no_from_container(self, ifc, collector, spatial): ifc.get_entity("obj").should_be_called().will_return("element") - collector.sync("obj").should_be_called() spatial.get_container("element").should_be_called().will_return(None) spatial.get_object_matrix("obj").should_be_called().will_return("matrix")