From d33fdbba695ca6f852dac4fc0b67c3982a185753 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 19 Apr 2024 18:46:44 +0500 Subject: [PATCH] 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 e53b9be696..d815105578 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -1621,27 +1621,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 9d778966d2..c4ecf2f130 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/placement.py +++ b/src/ifcopenshell-python/ifcopenshell/util/placement.py @@ -120,10 +120,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):